Bài giảng Công nghệ phần mềm - Bài 2: Ngôn ngữ C++ và Các mở rộng so với C - Phạm Thị Bích Vân

pptx 54 trang huongle 11050
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Công nghệ phần mềm - Bài 2: Ngôn ngữ C++ và Các mở rộng so với C - Phạm Thị Bích Vân", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptxbai_giang_cong_nghe_phan_mem_bai_2_ngon_ngu_c_va_cac_mo_rong.pptx

Nội dung text: Bài giảng Công nghệ phần mềm - Bài 2: Ngôn ngữ C++ và Các mở rộng so với C - Phạm Thị Bích Vân

  1. 1 Bài 2: Ngôn ngữ C++ Các mở rộng so với C
  2. 2 Lịch sử phát triển của C++ • Được xây dựng trên nền của C. • Phiên bản đầu tiên của C++ ra đời năm 1980 với tên là “C with classes”. Đến năm 1983 . • Năm 1990, ANSI/ISO 9899 đã định nghĩa một chuẩn cho C. • Năm 1998, ISO/IEC 14882 đã cụ thể hóa chuẩn cho C++
  3. 3 C++ và C • C là tập con của C++. • Tất cả các thư viện trong C đều có thể sử dụng trong C++. • C++ cũng có cùng những yếu điểm như C (về con trỏ ) • Một số mở rộng của C++ so với C: ▫ Từ khóa mới ▫ Dữ liệu, khai báo biến ▫ Chuyển kiểu, tham chiếu, cấp phát bộ nhớ
  4. 4 C++ và Java • Java là ngôn ngữ hoàn toàn hướng đối tượng. Tất cả các mã lệnh đều đóng gói trong các lớp. • C++ là ngôn ngữ lai ghép. Nó hỗ trợ cả lập trình hướng chức năng và lập trình hướng đối tượng. • Do vậy C++ mạnh hơn nhưng cũng khó kiểm soát hơn.
  5. 5 Nội dung • Phân tích một ví dụ chương trình C++. • Các kiểu dữ liệu, các toán tử, các hàm, vào ra (I/O). • Các cấu trúc điều khiển. • Các mảng, chuỗi, con trỏ. • Một số mở rộng của C++ so với C.
  6. 6 Một chương trình cụ thể trên C++ // Title: The program doing something #include void doSomething(int p); int main() { int p = 7; doSomething(p); cout << “I have something done.” << endl; return 0; } void doSomething(int p) { for( int i = 0; i < p; i++ ) { cout << “*” << endl; } }
  7. 7 Các kiểu dữ liệu cơ bản của C++ • Một số kiểu dữ liệu cơ bản: • char characters: ’a’, ’b’, ’\n’, ’\0’, ’7’ • int integers: 3, 6883, -5, 0 • double floating point numbers: 3.14, 7e9 • bool true or false. • Ngoài ra: float, long, unsigned long, short, unsigned char, wchar_t
  8. 8 Các kiểu dữ liệu cơ bản của C++ • Khai báo biến trong chương trình ▫ char a; ▫ int b; ▫ double c; • Phép gán: ▫ b = 4; a = 'w’; c = -3.777; ▫ int x = 78; • Chú ý: ▫ C++ cho phép khai báo biến tại bất cứ đâu trước khi sử dụng.
  9. 9 Các kiểu dữ liệu cơ bản của C++ • Hằng số: ▫ const double PI=3.1415926; ▫ const int MAXBUFFER=20; • Ép kiểu: ▫ Khi gán giá trị vào biến kiểu khác. ▫ Ví dụ  myInt=(int)myFloat; Theo cách của C  myInt=int(myFloat); Theo cách của C++
  10. 10 Các toán tử cơ bản trong C++ • Arithmetic operators: • Bitwise: ▫ +, -, *, /, % ▫ &, |, ~,^ • Comparison: • Shortcuts: ▫ ==, !=, , >=, >, ? :, ->, ., , • Assignment: ▫ =
  11. 11 Các toán tử trong C++ • Toán tử ++ and : ▫ ++ increment by 1 ▫ decrement by 1 • Chú ý rằng i++ và ++i được thực thi khác nhau.
  12. 12 Hàm (function) Name int someFunction(double f, char c) { // Body } Parameter List Return Type
  13. 13 Hàm (function) • Chú ý rằng các hàm được phân biệt bởi tên và danh sách các tham số. Các hàm sau là khác nhau. ▫ int exampleFunction(int i, char c); ▫ int exampleFunction(double f); ▫ int exampleFunction(); ▫ int exampleFunction(char c, int i); • Ngoài ra có sự khác nhau giữa biến truyền kiểu tham chiếu và biến truyền kiểu giá trị (giới thiệu phần sau)
  14. 14 Kiểu vào ra cơ bản • Để xuất ra màn hình dùng hàm cout. ▫ cout > x; • Khai báo thư viện ▫ #include
  15. 15 Cấu trúc điều khiển – Rẽ nhánh • The if statement: if ( x > 0 ) { cout << “positive”; } else { cout << “negative or zero”; }
  16. 16 Cấu trúc điều khiển – Lựa chọn • Ví dụ switch : int x; cout > x; switch(x) { case 1: doThis(); break; case 2: doThat(); break; case 3: doSomethingElse(); break; default: cout << "Sorry, invalid Input"; }
  17. 17 Cấu trúc điều khiển – Lặp • The for loop: Start condition Terminating condition for(k = 0; k < 10; k++ ) { cout << “The square of “ << k << “ is “ << k * k << endl; } Action taking place at the end of each iteration
  18. 18 Cấu trúc điều khiển – Lặp • Cấu trúc lặp while : while ( condition ) { // do something } Equivalent to: for( ; condition ; ) { // do something }
  19. 19 Cấu trúc điều khiển - Lặp do while • Cú pháp: Equivalent to: do { // something while( condition) { // something // something } while( condition); } • Các lệnh nhảy: break, continue, goto
  20. 20 Địa chỉ ô nhớ • Mỗi vị trí mà một đơn vị dữ liệu được lưu trữ gọi là địa chỉ ô nhớ. • Khi khai báo một biến: Ví dụ int myAge. • Máy tính sẽ chọn một vị trí ô nhớ sẵn có. • Gán cho tên myAge địa chỉ của ô nhớ đó.
  21. 21 Mảng • Mảng dùng để lưu trữ các phần tử có cùng kiểu dữ liệu. • int someNumbers[7];
  22. 22 Lưu trữ các giá trị trong mảng int rent[4]; rent[0] = 250; rent[1] = 375; rent[2] = 460; rent[3] = 600; int rent[4] = {250, 375, 460, 600}; int rent[] = {250, 375, 460, 600}; rent[2] and int rent[4] = {250, 375}; rent[3] are set to 0 int rent[3] = {250, 375, 460, 600}; Syntax error int rent[4] = {0}; Sets all array elements to 0 22
  23. 23 Lưu trữ các giá trị trong mảng int rent[4]; rent[0] = 250; rent[1] = 375; rent[2] = 460; rent[3] = 600; int rent[4] = {250, 375, 460, 600}; int rent[] = {250, 375, 460, 600}; int rent[4] = {250, 375}; rent[2] and int rent[3] = {250, 375, 460, 600};rent[3] are set to 0 int rent[4] = {0}; Syntax error Sets all array elements to 0 23
  24. 24 Một số lỗi thường gặp khi làm việc với mảng Quên là mảng được đánh chỉ số từ 0
  25. 25 Một số lỗi thường gặp khi làm việc với mảng • Truy cập đến ngoài phạm vi của mảng Element is out of bounds
  26. 26 Mảng lưu trữ các đối tượng cấu trúc
  27. 27 Bài tập • Nhập vào tọa độ 3 điểm. Kiểm tra xem 3 điểm có tạo thành một tam giác ? (Sử dụng cấu trúc điểm)
  28. 28 Tạo một chuỗi bằng mảng các ký tự char firstName[] = “Mary”; Null character. You could char firstName[] = {“Mary”}; also use the constant char firstName[5] = “Mary”; NULL, defined in iostream char firstName[5] = {“Mary”}; char firstName[5] = {'M', 'a', 'r', 'y', '\0'}; cout<<firstName; // displays Mary cout<<&firstName[1]; // displays ary
  29. 29 Một số vấn đề khi sử dụng mảng ký tự • Khi nhập mảng có chứa ký tự trống. • Gán một chuỗi cho chuỗi khác sử dụng toán tử gán. • So sánh các chuỗi sử dụng toán tử so sánh. • Vượt quá giới hạn của mảng.
  30. 30 • Ví dụ: “hello” • Có thể tạo biến string theo hai cách. ▫ Tạo một mảng các ký tự để lưu trữ một chuỗi. ▫ Sử dụng lớp string trong thư viện của C++.
  31. 31 Vấn đề khi nhập một chuỗi có ký tự trống
  32. 32 Khắc phục
  33. 33 Gán một chuỗi bằng chuỗi khác char clubPresident[10] = {“Eric”}; clubVicePresident[10] = {“Danielle”}; • Alternative 1 (does not work as expected): clubPresident = clubVicePresident; • Alternative 2 (tedious): clubPresident[0] = clubVicePresident[0]; clubPresident[1] = clubVicePresident[1]; clubPresident[2] = clubVicePresident[2]; • Alternative 3 (must include string.h): giải pháp strcpy(clubPresident, clubVicePresident);
  34. 34 So sánh hai chuỗi • Alternative 1 (does not work as expected): if(clubPresident == clubVicePresident) cout<<”They are the same”<<endl; • Alternative 2 (tedious): if(clubPresident[0] == clubVicePresident[0] && clubPresident[1] == clubVicePresident[1]. . . • Alternative 3 (must include string.h): Giải pháp strcmp(firstName, secName); A return value of 0 indicates they are equal
  35. 36 Vượt quá giới hạn của mảng
  36. Sử dụng lớp string trong thư viện37 của C++
  37. 38 Con trỏ (Pointers) • Pointers: Các biến chứa địa chỉ ô nhớ. • Kiểu của con trỏ là kiểu của biến mà ô nhớ đó chứa. • Ví dụ int *aPointer; int myValue; aPointer = &myValue; cout<<myValue; //outputs contents of myValue cout<<*aPointer; //outputs contents of myValue cout<<&myValue; //outputs address of myValue cout<<aPointer; //outputs address of myValue
  38. 39 Con trỏ (Pointers) • Pointers: Các biến chứa địa chỉ ô nhớ. • Kiểu của con trỏ là kiểu của biến mà ô nhớ đó chứa. • Ví dụ int *aPointer; int myValue; aPointer = &myValue; cout<<myValue; //outputs contents of myValue cout<<*aPointer; //outputs contents of myValue cout<<&myValue; //outputs address of myValue cout<<aPointer; //outputs address of myValue
  39. 40 Con trỏ (Pointers) • & (address operator) ▫ Returns memory address of its operand ▫ Example  int y = 5;  int *yPtr;  yPtr = &y; // yPtr gets address of y - yPtr “points to” y  *yPtr=9;
  40. 41 Con trỏ và mảng • In C++ pointer and arrays are strongly related (“array = pointer + memory”). ▫ int primes[] = {2, 3, 5, 7, 11 }; ▫ int *aPr = primes; pointer arithmetic ▫ aPr++; ▫ cout << “The third prime is “ << *(aPr + 2); The * operator accesses the data on the memory address
  41. 42 Con trỏ hằng • Con trỏ hằng trỏ tới một địa chỉ ô nhớ cố định. • Ví dụ int main() { int x, y; // ptr is a constant pointer to an integer that can // be modified through ptr, but ptr always points to the // same memory location. int * const ptr = &x; //but if int const *ptr=&x then red line is error //and magenta line is not error *ptr = 7; // allowed: *ptr is not const ptr = &y; // error: ptr is const; cannot assign new address return 0; // indicates successful termination } // end main
  42. 43 Con trỏ hằng int main() { int x = 5, y; // ptr is a constant pointer to a constant integer. // ptr always points to the same location; the integer // at that location cannot be modified. const int *const ptr = &x; cout << *ptr << endl; *ptr = 7; // error: *ptr is const; cannot assign new value ptr = &y; // error: ptr is const; cannot assign new address return 0; // indicates successful termination } // end main
  43. 44 C++ _Một số mở rộng so với C • Các từ khóa mới. • Cách ghi chú (/* */ và //) • Dòng nhập xuất (cin, cout) • Cách chuyển đổi dữ liệu. • Khai báo biến • Cho phép khai báo biến tại vị trí bất kỳ không nhất thiết phải đầu chương trình. • Biến có hiệu lực từ vị trí được khai báo. • Hằng const.
  44. 45 Biến tham chiếu. • Hai loại biến dùng trong C. ▫ Biến giá trị ▫ Biến con trỏ  Double x, *px;  X=3.14;  Px=&x; • Biến tham chiếu ▫ Không được cấp phát bộ nhớ; Không có địa chỉ riêng. ▫ Dùng làm bí danh cho một biến (kiểu giá trị) nào đó và sử dụng vùng nhớ của biến này. ▫ Vd: float u,v,&r=u; ▫ Ý nghĩa:  r dùng chung vùng nhớ của u;  Trong mọi câu lênh, viết u hay viết r là như nhau.
  45. 46 Biến tham chiếu. • Ví dụ: int u, v, &r = u; r = 10 ; // u=10 cout << u ; // in ra số 10 r++ ; // u = 11 ++ u ; // r = 12 cout << r ; // in ra số 12 v = r ; // v=12 & r ; // Cho địa chỉ của u • Công dụng: ▫ Thường sử dụng làm đối của hàm. • Chú ý: ▫ Trong khai báo phải chỉ rõ tham chiếu đến biến nào. ▫ Có thể tham chiếu đến một phần tử của mảng hoặc hằng. ▫ Không khai báo mảng tham chiếu. • Hằng tham chiếu ▫ int n = 10 ; ▫ const int &r = n; Không cho phép thay đổi giá trị của hằng.
  46. 47 Truyền giá trị cho hàm theo tham chiếu • Trong C: Chỉ cho phép truyền dữ liệu cho hàm theo giá trị. • Truyền giá trị cho hàm theo tham chiếu • Dùng đối là biến tham chiếu hoặc hằng tham chiếu. • Ưu điểm: • Không cần tạo ra bản sao của tham số ->Tiết kiệm bộ nhớ. • Hàm sẽ thao tác trực tiếp trên vùng nhớ của tham số -> Dễ dàng thay đổi giá trị của tham số khi cần. • Ví dụ: void HoanVi( double &x, double &y) { double tg=x;x=y;y=tg; } void main() { double a,b; cin>>a>>b; HoanVi(a,b); cout<<b<<a; }
  47. 48 Hàm trả về các tham chiếu • Hàm có thể có kiểu tham chiếu và trả về giá trị tham chiếu • Ví dụ: int z ; int &f() // Hàm trả về một bí danh của biến toàn cục z { return z; } void main(void) { f()=50; // z = 50 cout <<"\nz= " << z; getch(); }
  48. 49 C++ _Một số mở rộng so với C • Struct và union • Trong C++ tên của struct và union được xem luôn là tên kiểu giống như khai báo bằng lệnh typedef Trong C, chúng ta có thể có đoạn Trong C++, vấn đề trở nên đơn mã sau : giản hơn: struct Complex struct Complex { { float Real; float Real; float Imaginary; float Imaginary; }; }; struct Complex C Complex C; • Quy định này cũng áp dụng cho cả union và enum. Tuy nhiên để tương thích với C, C++ vẫn chấp nhận cú pháp cũ
  49. 50 C++ _Một số mở rộng so với C • Toán tử định phạm vi • Toán tử định phạm vi ký hiệu là ::, nó được dùng truy xuất một phần tử bị che bởi phạm vi hiện thời • Hàm inline • Nhược điểm của hàm: Làm chương trình chậm hơn do phải thực hiện một số thao tác khi gọi hàm như: cấp phát vùng nhớ cho biến cục bộ, giải phóng vùng nhớ khi thoát khỏi hàm. • Dùng hàm inline để khắc phục nhược điểm trên • Cú pháp: inline data_type function_name ( parameters ) { } • Chú ý khai báo hàm inline phải trước lời gọi hàm. • Nguyên tắc thực hiện: Thay lời gọi hàm bằng đoạn chương trình thực hiện chức năng của hàm.
  50. 51 C++ _Một số mở rộng so với C Toán tử new và delete • Trong C tất cả các cấp phát bộ nhớ đều thông qua các hàm calloc(), malloc(), free(). Trong C++ việc cấp phát động bộ nhớ được thực hiện thông qua hai toán tử new và delete. • Vd: int *p; p = new int • Nếu toán tử new cấp phát không thành công nó sẽ trả về giá trị null. • Vừa cấp phát vừa khởi tạo giá trị ô nhớ. int *p; p = new int(100); // *p=100; • Toán tử delete thay cho hàm free() của C delete p; • Cấp phát một mảng int *P; P = new int[10]; delete []p;
  51. 52 C++ _Một số mở rộng so với C • Các giá trị tham số mặc định ▫ Một trong các đặc tính nổi bật nhất của C++ là khả năng định nghĩa các giá trị tham số mặc định cho các hàm. ▫ Xét ví dụ void MyDelay(long Loops); //prototype ▫ Chẳng hạn muốn gán giá trị mặc định cho tham số Loops là 1000. void MyDelay(long Loops = 1000); //prototype ▫ Mỗi khi gọi hàm MyDelay() mà không gởi một tham số tương ứng thì trình biên dịch sẽ tự động gán cho tham số Loops giá trị 1000
  52. 53 C++ _Một số mở rộng so với C Phép nạp chồng • Nạp chồng hàm • Dùng cùng một tên để định nghĩa các hàm khác nhau. • Dùng nạp chồng hàm khi nào? • Thực hiện công việc như nhau trên các đối tượrg có kiểu khác nhau. • Ví dụ: • int TinhMax( int a, int b); • int TinhMax( int a[], int n); • Nạp chồng toán tử
  53. 54 Bài tập 1. Viết chương trình tính: 2. Nhập ma trận thực cấp mxn: - Tìm phần tử lớn nhất - Sắp xếp tăng dần - In ma trận sau khi đã sắp xếp. 3. Xây dựng chương trình thao tác với phân số: nhập, in, tối giản, cộng, tích hai phân số 4. Xây dựng chương trình thao tác với vec tơ: - Nhập 2 vec tơ - In - Tính tổng, tích hai vectơ