Bài giảng Kỹ thuật lập trình - Phần 2, Chương 2: Chương 2: Giới thiệu về ngôn ngữ lập trình C++

ppt 49 trang phuongnguyen 1050
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Phần 2, Chương 2: Chương 2: Giới thiệu về ngôn ngữ lập trình C++", để 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:

  • pptbai_giang_ky_thuat_lap_trinh_phan_2_chuong_2_chuong_2_gioi_t.ppt

Nội dung text: Bài giảng Kỹ thuật lập trình - Phần 2, Chương 2: Chương 2: Giới thiệu về ngôn ngữ lập trình C++

  1. Phần 2: Ngôn ngữ C++ Chương 2: Giới thiệu về ngôn ngữ lập trình C++ Kỹ thuật lập trình 1
  2. Các nội dung chính 1. Các đặc điểm mới của C++ so với C 2. Các khái niệm cơ bản của lập trình hướng đối tượng 3. Một số mở rộng của C++ 4. Cấu trúc của một chương trình C++ Kỹ thuật lập trình 2/49
  3. 1. Các đặc điểm mới của C++ so với C n C++ bổ sung khả năng lập trình hướng đối tượng (HĐT) với các khái niệm và các thành phần mới như: lớp, đối tượng, sự che dấu thông tin, sự kế thừa, sự đa hình, Điều đó tạo cho C++ khả năng tổ chức chương trình theo cả phương pháp lập trình hướng chức năng và hướng đối tượng-một ngôn ngữ lập trình lai. n Cho phép định nghĩa chồng các hàm, tức là các hàm có thể trùng tên với nhau trong cùng phạm vi định nghĩa và sử dụng. n Cho phép các hàm có các tham số nhận giá trị mặc định n Bổ sung loại hàm con inline nhằm tăng tốc độ thực hiện các hàm con. n Bổ sung các lớp nhập/xuất mới nhằm đơn giản hoá các thao tác nhập/ xuất, tăng tính mở của các thao tác này khi phải nhập/xuất dữ liệu với các kiểu dữ liệu hay các đối tượng mới. n Bổ sung các hàm cấp phát và giải phóng vùng nhớ động mới là new và delete. n Bổ sung đối tượng, tham số kiểu tham chiếu giúp cho việc sử dụng các tham số của các hàm con được dễ dàng và hiệu quả hơn. n Bổ sung loại chú thích mới-chú thích trên một dòng: // n Cho phép đan xen giữa khai báo các đối tượng dữ liệu và các lệnh xử lý. Kỹ thuật lập trình 3/49
  4. Chương trình C++ đầu tiên n Program 2.1: In ra màn hình dòng “Welcome to C++!” #include #include //tệp thư viện nhập/xuất chính trong C++ //#include using namespace std; //Khai báo không gian tên mặc định int main() { cout<<"Welcome to C++!"<<endl; system("PAUSE"); return EXIT_SUCCESS; } Kỹ thuật lập trình 4/49
  5. Kết quả chạy Program 2.1 Kỹ thuật lập trình 5/49
  6. Chú thích về Program 2.1 n namespace (không gian tên): là công cụ cho phép quản lý sự xung đột về tên của các thành phần của chương trình như tên biến, tên lớp, tên hàm,v.v n Đối tượng cout và toán tử << nằm trong thư viện iostream, được dùng để xuất dữ liệu ra màn hình n endl = ‘\n’: kí tự xuống dòng Kỹ thuật lập trình 6/49
  7. 2. Các khái niệm cơ bản của lập trình hướng đối tượng (object-oriented programming) n Đối tượng và lớp (object and class) n Thông báo và truyền thông báo (message) n Sự che dấu các thành phần của lớp (còn gọi là sự đóng gói, encapsulation) n Sự kế thừa (inheritance) n Sự đa hình (polymorphism) Kỹ thuật lập trình 7/49
  8. Đối tượng và lớp n Đối tượng: q Là thành phần cơ bản nhất một chương trình theo kiểu hướng đối tượng, biểu diễn cho một đối tượng của bài toán q Là sự kết hợp gắn kết của các đối tượng dữ liệu và các thao tác xử lý cần thiết trên các đối tượng dữ liệu đó. Thao tác xử lý còn được gọi là phương thức (method), hay hàm thành viên Hình tròn A Hình chữ nhật C Một PT bậc 2 a = 3 Chiều rộng a = 2 Bán kính r = 2 b = 4 Chiều dài b = 3 c = 1 TínhChuVi() TínhChuVi() TínhDelta() TínhDiệnTích() TínhDiệnTích() TínhNghiem() Kỹ thuật lập trình 8/49
  9. Đối tượng và lớp n Lớp q Là sự khái quát hóa các đối tượng cùng loại q Có ý nghĩa đối với đối tượng tương tự như ý nghĩa của kiểu dữ liệu đối với các đối tượng dữ liệu, là cho phép dễ dàng tạo ra nhiều đối tượng cùng một kiểu (chung các kiểu dữ liệu và các phương thức) Hình tròn Hình chữ nhật PT bậc 2 a; Chiều rộng a; Bán kính r b; Chiều dài b; c; TínhChuVi() TínhChuVi() TínhDelta() TínhDiệnTích() TínhDiệnTích() TínhNghiem() Kỹ thuật lập trình 9/49
  10. Quan hệ giữa đối tượng và lớp n Đối tượng còn được gọi là thể hiện (instance) của một lớp Hình chữ nhật Chiều rộng a; Chiều dài b; TínhChuVi() TínhDiệnTích() Hình chữ nhật A Hình chữ nhật B Chiều rộng a=1; Chiều rộng a=2; Chiều dài b=2; Chiều dài b=3; TínhChuVi() TínhChuVi() TínhDiệnTích() TínhDiệnTích() Kỹ thuật lập trình 10/49
  11. Chương trình mẫu tiếp theo n Program 2.2: chương trình này sẽ có 1 đối tượng thuộc một lớp Circle, dùng để nhập vào giá trị bán kính và tính ra diện tích hình tròn này. n Lưu ý: Phần khai báo các tệp thư viện và không gian tên của Program 2.2 giống như của Program 2.1. Kỹ thuật lập trình 11/49
  12. Program 2.2 class Circle { private: static const float PI=3.1415; //Hằng số tĩnh, hằng số của lớp float r; //Bán kính, thành phần dữ liệu của từng đối tượng public: void setRadius(float re){ r=re; } float getRadius(){ return r; } float area(){ return PI*r*r; } }; Kỹ thuật lập trình 12/49
  13. Program 2.2: (tiếp và hết) int main() { Circle c; c.setRadius(10); cout<< “Area of circle with r = ” <<c.getRadius()<< " is “ <<c.area()<<endl; system("PAUSE"); return EXIT_SUCCESS; } Kỹ thuật lập trình 13/49
  14. Kết quả chạy chương trình Kỹ thuật lập trình 14/49
  15. Thông báo và truyền thông báo n Khái niệm: Trong lập trình HĐT, khi một đối tượng a gọi một thao tác m của một đối tượng b, ta nói rằng a truyền thông báo m đến b. Thông báo thể hiện a muốn yêu cầu b thực hiện một công việc nào đó. Thao tác m() mà b cài đặt chính là để thực hiện yêu cầu đó :a Thông báo :b m m() Kỹ thuật lập trình 15/49
  16. Sự che dấu các thành phần của lớp n Khái niệm về sự che dấu: là khả năng hạn chế sự truy nhập trực tiếp vào thành phần nào đó của chương trình, mà thường là phần dữ liệu. n Trong lập trình có cấu trúc thì thường là sự che dấu các thành phần dữ liệu cục bộ trong các hàm. Tuy nhiên khả năng che dấu của LTCT khá hạn chế, do đặc điểm là không có sự gắn kết chặt chẽ giữa dữ liệu và các thao tác xử lý. Nhờ đặc thù kết hợp dữ liệu và các thao tác xử lý vào trong đối tượng, đã cho phép lập trình HĐT tăng cường khả năng này. Kỹ thuật lập trình 16/49
  17. Sự che dấu các thành phần của lớp n Tại sao cần che dấu một thành phần? q Việc che dấu một thành phần khỏi các truy nhập không cần thiết sẽ tăng cường khả năng kiểm soát thành phần đó. Điều này giúp giảm thiểu những lỗi tiềm tàng, tăng mức an toàn của chương trình, giảm thời gian và chi phí bảo trì và nâng cấp hệ thống sau này. Kỹ thuật lập trình 17/49
  18. Sự che dấu các thành phần của lớp n Các mức độ che dấu trong C++ q private: là mức cao nhất. Thành phần ở mức này hoàn toàn không thể truy nhập được từ bên ngoài lớp q public: là mức thấp nhất. Thành phần ở mức này có thể được truy nhập từ bên ngoài lớp. q protected (sẽ học sau): là mức trung bình giữa hai mức trên. Thành phần ở mức này của một lớp A sẽ không thể truy nhập được từ các đối tượng không thuộc lớp A, ngoại trừ từ những đối tượng là thuộc các lớp con của A Kỹ thuật lập trình 18/49
  19. Ví dụ class Circle { void main() { private: Circle c; static const float PI=3.1415; c.setRadius(15.5); //OK float r; c.r = 10; //Error with private member cout<<“Ban binh r=”<<c.getRadius(); public: }; void setRadius(float re){ r=re; } float getRadius(){ return r; } float area(){ return PI*r*r; } }; Kỹ thuật lập trình 19/49
  20. So sánh giữa class và struct n Trong C++, struct cũng được mở rộng để cho phép bổ sung các hàm thành viên để thực hiện các xử lý trên các trường dữ liệu. n Ngoài ra, khả năng kế thừa của class cũng được đưa vào trong struct, làm cho chức năng của struct cũng không kém gì của class. n Tuy nhiên, để duy trì tính tương thích với C, các thành phần trong struct có mức độ che dấu mặc định là public. Kỹ thuật lập trình 20/49
  21. Chương trình minh họa n Program 2.3: về chức năng tương tự như Program 2.2, nhưng sử dụng struct thay cho class. struct Circle { float r; static const float PI=3.14; float area(){ return PI*r*r; } }; Kỹ thuật lập trình 21/49
  22. Program 2.3 (tiếp và hết) int main(){ Circle c; c.r = 20; //Truy nhập trực tiếp vào trường dữ liệu cout<<“Area of the circle with r=”<<c.r<<“ is ” <<c.area()<<endl; system("PAUSE"); return EXIT_SUCCESS; } Kỹ thuật lập trình 22/49
  23. Sự kế thừa n Khái niệm: kế thừa là một Lớp cha/ Lớp A cách tái sử dụng mới trong lớp cơ sở C++ và các ngôn ngữ lập trình HĐT khác. Khi một lớp B Lớp con/ lớp dẫn kế thừa lớp A, tức là B sẽ tái Lớp B xuất sử dụng toàn bộ các thành phần trong lớp A, bao gồm cả phần dữ liệu và các phương thức Kỹ thuật lập trình 23/49
  24. Kế thừa n Phân loại kế thừa q Theo số lượng lớp cơ sở n Kế thừa đơn: một lớp dẫn xuất kế thừa chỉ một lớp cơ sở n Kế thừa bội: một lớp dẫn xuất kế thừa từ 2 lớp cơ sở trở lên q Theo mức độ che dấu n private n protected n public: kiểu kế thừa thông dụng nhất Kỹ thuật lập trình 24/49
  25. Sự đa hình n Khái niệm: đa hình xuất hiện cùng với sự kế thừa, khi trong lớp cơ sở và lớp dẫn xuất Person của nó có các hàm thành viên có khuôn mẫu Name giống nhau. Giả sử ta có một đối tượng Obj Age mà chưa biết rõ nó thuộc lớp nào, và muốn Show() Show nội dung của Obj. Nếu Obj thuộc lớp Person thì nội dung của một Person sẽ được in ra. Còn nếu Obj thuộc lớp Student thì nội dung của một Student sẽ được in ra. Việc Student Obj thuộc lớp nào chỉ có thể xác định vào lúc Name chạy chương trình (run time), chứ không xác Age định được vào lúc viết và dịch chương trình Roll_ID School (compile time). Khả năng mà một đối tượng có thể liên kết với các hàm khác nhau của Show() các lớp khác nhau gọi là sự đa hình. Kỹ thuật lập trình 25/49
  26. Sự đa hình n Sự khó khăn của đa hình: chính là việc xác định hàm Show() của lớp nào phải được xác định vào lúc chạy, chứ không phải lúc dịch. n Giải pháp trong C++: q Hàm ảo (virtual function) q Cơ chế liên kết muộn (late binding) Kỹ thuật lập trình 26/49
  27. 3. Một số mở rộng của C++ n Khả năng nhập/xuất mới n Tham chiếu (reference) n Tham số ngầm định trong hàm n Các toán tử mới quản lý bộ nhớ động new và delete n Tiện ích khai báo mọi nơi và chú thích cuối dòng n Định nghĩa chồng hàm (overloading functions) Kỹ thuật lập trình 27/49
  28. Khả năng nhập/xuất mới n Nhập dữ liệu: q sử dụng đối tượng cin của lớp istream và phép toán >> n Xuất dữ liệu: q Sử dụng đối tượng cout của lớp ostream và phép toán (hoặc ) Kỹ thuật lập trình 28/49
  29. Tham chiếu n Khái niệm: tham chiếu là một tên gọi mới của một vùng nhớ được cấp phát cho một đối tượng. int n=10; int &m = n; //m là biến tham chiếu đến n m = 20; //tương đương n=20 Kỹ thuật lập trình 29/49
  30. Tham chiếu n Vai trò: thường void exchange(int &a, int &b){ được sử dụng int c=a; a=b; trong tham số của b=c; hàm để thực hiện } int main(){ truyền tham biến int x=10, y=20; (trong C chỉ cho cout<<"Before swap x="<<x<<",y="<<y<<endl; phép truyền tham exchange(x,y); cout<<"After swap x="<<x<<",y="<<y<<endl; trị). (Xem system("PAUSE"); return EXIT_SUCCESS; Program 2.4) } Kỹ thuật lập trình 30/49
  31. Kết quả chạy Program 2.4 Kỹ thuật lập trình 31/49
  32. Hàm với tham số nhận giá trị mặc định n Là mở rộng trong C++ cho phép khi gọi một hàm con, ta có thể bỏ qua một số tham số của nó, khi đó các tham số này sẽ nhận các giá trị mặc định mà đã được quy định trước đó khi khai báo hàm con này. Kỹ thuật lập trình 32/49
  33. Chương trình minh họa (program 2.6) //Khai báo hàm với giá trị ngầm định //Định nghĩa hàm với giá trị ngầm định void HamND(int a = 10, int b = 20); void HamND(int a, int b) { int main() cout<<"Gia tri tham so a="<<a<<endl; { cout<<"Gia tri tham so b="<<b<<endl; cout<<"Goi ham khong co tham so:"<<endl; cout<<endl; HamND(); //Gọi hàm với giá trị ngầm định } cout<<"Goi ham co 1 tham so:"<<endl; HamND(30); cout<<"Goi ham co 2 tham so:"<<endl; HamND(30,40); system("PAUSE"); return EXIT_SUCCESS; } Kỹ thuật lập trình 33/49
  34. Kết quả chạy chương trình Kỹ thuật lập trình 34/49
  35. Định nghĩa chồng hàm n Là khả năng cho phép định nghĩa lại một hàm nhiều lần với cùng một tên hàm, nhưng với các tham số khác nhau (có thể khác nhau về số lượng tham số và/hoặc kiểu dữ liệu của tham số) Kỹ thuật lập trình 35/49
  36. Chương trình ví dụ (program 2.7) int main() //Định nghĩa chồng hàm swap { void swap(int &a, int &b){ int i=10, j=20; int c=a; float x=100.55, y=150.66; a=b; swap(i,j); //Gọi hàm swap(int, int) b=c; cout<<"i="<<i<<", j="<<j<<endl; } swap(x,y); //Gọi hàm swap(float, float) void swap(float &a, float &b){ cout<<"x="<<x<<", y="<<y<<endl; float c=a; a=b; system("PAUSE"); b=c; return EXIT_SUCCESS; } } Kỹ thuật lập trình 36/49
  37. Kết quả chạy chương trình Kỹ thuật lập trình 37/49
  38. 4. Cấu trúc của một chương trình C++ n Phần chính của một chương trình C++ (theo kiểu HĐT nói chung) bao gồm 2 phần: q Tập các đối tượng q Tập các thông báo từ hàm main() đến các đối tượng và được truyền giữa các đối tượng :a m2 :c m1 main() :b :d m3 m4 Kỹ thuật lập trình 38/49
  39. Chương trình minh họa n Program 2.5: viết chương trình giải phương trình bậc 2 theo phương pháp HĐT q Đầu vào: 3 hệ số của 1 phương trình bậc 2 q Đầu ra: PT có mấy nghiệm và giá trị từng nghiệm nếu có n Phân tích: coi mỗi PT bậc 2 là một đối tượng của một lớp PT bậc 2. Khi đó cấu trúc của một chương trình sẽ như sau: Kỹ thuật lập trình 39/49
  40. Cấu trúc Program 2.5 :pt b2 a,b,c Nhập các hệ số main() :pt b2 Tính delta a,b,c Tính các :pt b2 nghiệm (khi a,b,c delta 0) Kỹ thuật lập trình 40/49
  41. Program 2.5 (phần đầu) #include #include #include using namespace std; Kỹ thuật lập trình 41/49
  42. Program 2.5 (phần lớp PTB2) class PTB2 { float a, b, c; //Mức độ che dấu mặc định là private public: void NhapHS (float xa, float xb, float xc) { a = xa; b = xb; c = xc; } float TinhDelta() { return (b*b - 4*a*c); } int TinhNghiem(float & x1, float & x2); //Hàm trả về số nghiệm }; Kỹ thuật lập trình 42/49
  43. Program 2.5 (tiếp) //Đ/n hàm trả về số nghiệm int PTB2::TinhNghiem(float & x1, float & x2) { float delta = TinhDelta(); if (delta < 0) return 0; else if (delta == 0) { x1 = -b/(2*a); return 1; } else { x1 = (-b-sqrt(delta))/(2*a); x2 = (-b+sqrt(delta))/(2*a); return 2; } } Kỹ thuật lập trình 43/49
  44. Program 2.5 (phần hàm main) int main() { PTB2 pt[3]; pt[0].NhapHS(3,4,1); pt[1].NhapHS(4,4,1); pt[2].NhapHS(5,4,1); float x1,x2; int n; //tiếp trang sau } Kỹ thuật lập trình 44/49
  45. Program 2.5 (hàm main, phần cuối) int main() { for (int i=0;i<3;i++){ n = pt[i].TinhNghiem(x1,x2); if (n==0) cout<<"PT Vo nghiem"<<endl; else if (n==1){ cout<<"PT co 1 nghiem kep x="<<x1<<endl; }else cout<<"PT co 2 nghiem x1="<<x1<<", x2="<<x2<<endl; } return system("PAUSE"), EXIT_SUCCESS; } Kỹ thuật lập trình 45/49
  46. Kết quả chạy Program 2.5 Kỹ thuật lập trình 46/49
  47. Câu hỏi tóm tắt n Các đặc điểm mới của C++ là gì? n Các khái niệm cơ bản của lập trình HĐT là gì? n Cấu trúc của một chương trình C++ như thế nào? Kỹ thuật lập trình 47/49
  48. Bài tập n Bài 1: Viết chương trình tính điện trở tương đương của 2 điện trở mắc song song theo phương pháp hướng đối tượng. Giá trị của các điện trở được nhập từ bàn phím. (Gợi ý: coi mỗi điện trở như một đối tượng) n Bài 2: Mở rộng bài 1 cho việc tính điện trở của N điện trở mắc song song. Hơn nữa, khi nhập dữ liệu cho các điện trở cần kiểm tra tính hợp lệ của dữ liệu nhập vào. n Bài 3: Viết chương trình trong đó có hai hàm swap chồng nhau, một hàm cho phép hoán đổi giá trị của hai kí tự, còn hàm kia cho phép hoán đổi giá trị của hai chuỗi kí tự. Chương trình sẽ thực hiện việc hoán đổi 1 cặp kí tự và 1 cặp chuỗi có giá trị nhập từ bàn phím. Kỹ thuật lập trình 48/49
  49. Xin cảm ơn! Kỹ thuật lập trình 49/49