Bài giảng Lập trình hướng đối tượng - Chương 1: Các đặc điểm mới của C++

pdf 50 trang phuongnguyen 2811
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Chương 1: Các đặc điểm mới của 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:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_chuong_1_cac_dac_diem_mo.pdf

Nội dung text: Bài giảng Lập trình hướng đối tượng - Chương 1: Các đặc điểm mới của C++

  1. CHƯƠNG 1. CÁC ĐẶC ĐIỂM MỚI CỦA C++ ThS. Trần Anh Dũng
  2. Nội dung 1 Một số lưu ý 2 Ngôn ngữ C++ 3 Tham số mặc nhiên 4 Tái định nghĩa hàm 55 Truyền tham số 6 Hàm nội tuyến 14/09/2014 Lập trình hướng đối tượng 2
  3. Phong cách lập trình Những lưu ý về phong cách lập trình: . Đặt tên (biến, hàm, ) . Tab . Khai báo prototype . {} 14/09/2014 Lập trình hướng đối tượng 3
  4. Bài tập C Nhập bốn số nguyên và xuất các giá trị vừa nhập . Có bao nhiêu cách để giải quyết? 14/09/2014 Lập trình hướng đối tượng 4
  5. Bài tập C – Giải 1. Dùng 4 biến cách dài nhất, cơ bản nhất 2. Dùng mảng khai báo biến gọn hơn, 1 lần thay cho nhiều lần 3. Dùng mảng và vòng lặp do while viết code nhập gọn hơn, viết 1 lần thay cho nhiều lần 4. Dùng mảng và vòng lặp for viết code gọn hơn, for viết gọn hơn vòng while 14/09/2014 Lập trình hướng đối tượng 5
  6. Bài tập C – Giải 5. Dùng mảng, vòng lặp for gộp viết code gọn hơn, nhưng không tách riêng được 2 phần nhập xuất 6. Dùng hàm để tách riêng phần nhập xuất code có thể tái sử dụng nhiều lần 7. Dùng file để nhập xuất từ file thay cho việc nhập bằng bàn phím và xuất ra màn hình 14/09/2014 Lập trình hướng đối tượng 6
  7. Bài tập C – Giải Cách 1: Dùng 4 biến void main(){ int a1, a2, a3, a4; printf("\nNhap a1 = "); scanf("%d", &a1); printf("\nNhap a2 = "); scanf("%d", &a2); printf("\nNhap a3 = "); scanf("%d", &a3); printf("\nNhap a4 = "); scanf("%d", &a4); printf("\nBan vua nhap 4 so: %d %d %d %d\n", a1, a2, a3, a4); } 14/09/2014 Lập trình hướng đối tượng 7
  8. Bài tập C – Giải Cách 2: Dùng mảng void main(){ int a[4]; printf("\nNhap a1 = "); scanf("%d", &a[0]); printf("\nNhap a2 = "); scanf("%d", &a[1]); printf("\nNhap a3 = "); scanf("%d", &a[2]); printf("\nNhap a4 = "); scanf("%d", &a[3]); printf("\nBan nhap 4 so:%d %d %d %d\n", a[0], a[1], a[2], a[3]); } 14/09/2014 Lập trình hướng đối tượng 8
  9. Bài tập C – Giải Cách 3: Dùng void main(){ int a[4], i; mảng và vòng i = 0; do{ lặp while printf("\nNhap a%d = ", i); scanf("%d", &a[i]); i++; }while(i<4); i = 0; printf("\nBan vua nhap 4 so:"); do{ printf("%d ", a[i]); i++; }while(i<4); } 14/09/2014 Lập trình hướng đối tượng 9
  10. Bài tập C – Giải Cách 4: Dùng mảng và vòng lặp for void main() { int a[4], i; for (i=0; i<4; i++){ printf("\nNhap a%d = ", i); scanf("%d", &a[i]); } printf("\nBan vua nhap 4 so:"); for (i=0; i<4; i++){ printf("%d ", a[i]); } } 14/09/2014 Lập trình hướng đối tượng 10
  11. Bài tập C – Giải Cách 5: Dùng mảng và vòng lặp for gộp void main() { int a[4], i; for (i=0; i<4; i++) { printf("\nNhap a%d = ", i); scanf("%d", &a[i]); printf("%d ", a[i]); } } 14/09/2014 Lập trình hướng đối tượng 11
  12. Bài tập C – Giải Cách 6: Dùng hàm 14/09/2014 Lập trình hướng đối tượng 12
  13. Bài tập C – Giải Cách 7: Dùng file 14/09/2014 Lập trình hướng đối tượng 13
  14. Lịch sử ngôn ngữ lập trình 14/09/2014 Lập trình hướng đối tượng 14
  15. Lịch sử của C++ Mở rộng của C Đầu thập niên 1980: Bjarne Stroustrup (Bell Laboratories) Cung cấp khả năng lập trình hướng đối tượng Ngôn ngữ lai 14/09/2014 Lập trình hướng đối tượng 15
  16. Môi trường của C++ Program is created in Editor Disk the editor and stored Biên dịch và thực on disk. Preprocessor Disk Preprocessor program thi chương trình processes the code. Compiler creates C++: Compiler Disk object code and stores it on disk. Linker links the object . Edit Linker Disk code with the libraries, creates a.out and . Preprocess Primary stores it on disk Memory . Compile Loader Loader puts program in memory. Disk . Link . Load Primary Memory CPU . Execute CPU takes each instruction and executes it, possibly storing new data values as the program executes. 14/09/2014 Lập trình hướng đối tượng 16
  17. Khác biệt đối với C Chú thích Các kiểu dữ liệu Kiểm tra kiểu, đổi kiểu Phạm vi và khai báo C Không gian tên Hằng C++ Quản lý bộ nhớ Tham chiếu 14/09/2014 Lập trình hướng đối tượng 17
  18. Khác biệt đối với C Phạm vi và khai báo: . Không giống như C, chúng ta có thể khai báo một biến tại một vị trí bất kỳ trong chương trình. . Một biến chỉ có tầm tác dụng trong khối lệnh nó được khai báo. . Do đó, C++ cung cấp toán tử định phạm vi (::) để xác định rõ biến nào được sử dụng khi xảy ra tình trạng định nghĩa chồng một tên biến trong một khối lệnh con. 14/09/2014 Lập trình hướng đối tượng 18
  19. Toán tử phạm vi Toán tử phạm vi (::) . Thường được dùng để truy cập các biến toàn cục trong trường hợp có biến cục bộ trùng tên . Ví dụ: y = ::x + 3; 14/09/2014 Lập trình hướng đối tượng 19
  20. Toán tử phạm vi 1 // Using the unary scope resolution operator. 2 #include Access the global PI with ::PI 3 #include . Cast the global PI to a 4 using namespace std; float for the local PI. 5 This example will show 6 // define global constant PI the difference between 7 const double PI = 3.14159265358979float; and double. 8 int main() 9 { 10 //define local constant PI 11 const float PI = static_cast ( ::PI ); 14/09/2014 Lập trình hướng đối tượng 20
  21. Toán tử phạm vi 12 // display values of local and global PI constants 13 cout << setprecision( 20 ) 14 << " Local float value of PI = " << PI 15 << "\nGlobal double value of PI = " << ::PI<< endl; 16 return 0; // indicates successful termination 17 } // end main Borland C++ command-line compiler output: Local float value of PI = 3.141592741012573242 Global double value of PI = 3.141592653589790007 Microsoft Visual C++ compiler output: Local float value of PI = 3.1415927410125732 Global double value of PI = 3.14159265358979 14/09/2014 Lập trình hướng đối tượng 21
  22. Nhập xuất với C++ cin Luồng nhập chuẩn cout Luồng xuất chuẩn cerr Luồng thông báo lỗi chuẩn 14/09/2014 Lập trình hướng đối tượng 22
  23. Nhập xuất với C++ cin and cout (and #include ): cout > name; cout<<"Hey "<<name<<", nice name." << endl; cout << endl; 14/09/2014 Lập trình hướng đối tượng 23
  24. Ví dụ 1 1 // Fig. 1.2: fig01_02.cpp Function SinglemainPreprocessor- returnsline comments. an directive to include 2 // A first program in C++. integer value.input/output stream header file 3 Left .brace { begins #include Function main appears exactly function body. 4 using namespace std; once in every C++ program 5 // function main begins program execution Statements end with 6 int main() Corresponding right brace }a semicolon ;. 7 { ends function body.Stream insertion operator. 8 cout << "Welcome to C++!\n"; 9 Name cout belongs to namespace std. 10 return 0; // indicate that programKeyword ended return successfully is one of several means to 11 exit function; value 0 indicates program 12 } // end function main terminated successfully. Welcome to C++! 14/09/2014 Lập trình hướng đối tượng 24
  25. Ví dụ 2 1 #include 2 using namespace std; Declare integer variables. 3 // function main begins program execution 4 int main(){ 5 int integer1; // first number toUse be streaminput by extraction user operator with standard input stream to obtain user input. 6 int integer2; // second number to be input by user 7 int sum; // variable in which sum will be stored 8 cout > integer1; std ::cout // read > integer2; // read an integerStream manipulator std::endl outputs a newline, then “flushes 12 sum = integer1 + integer2; // assign result to sum output buffer.” 13 cout << "Sum is " << sum << endl; // print sum 12 return 0; // indicate that program endedConcatenating, successfully chaining or cascading 15 } // end function main stream insertion operations. 14/09/2014 Lập trình hướng đối tượng 25
  26. Ví dụ 3 #include using namespace std; void main() { int n; double d; char s[100]; cout > n >> d >> s; cout << “n = “ << n << “\n”; cout << “d = “ << d << “\n”; cout << “s = “ << s << “\n”; } 14/09/2014 Lập trình hướng đối tượng 26
  27. Các kiểu dữ liệu của C++ simple structured integral enum floating array struct union class char short int long bool address float double long double pointer reference 14/09/2014 Lập trình hướng đối tượng 27
  28. Tham số mặc nhiên Ví dụ 1: Hàm thể hiện một cửa sổ thông báo trong Visual C++ 14/09/2014 Lập trình hướng đối tượng 28
  29. Tham số mặc nhiên Ví dụ 2: 14/09/2014 Lập trình hướng đối tượng 29
  30. Tham số mặc nhiên Mục đích: . Gán các giá trị mặc nhiên cho các tham số của hàm. Khai báo tham số mặc nhiên: . Tất cả các tham số mặc nhiên đều phải để ở cuối hàm. . Chỉ cần đưa vào khai báo, không cần trong định nghĩa. Gọi hàm có tham số mặc nhiên: . Nếu cung cấp đủ tham số dùng tham số truyền vào. . Nếu không đủ tham số dùng tham số mặc nhiên. 14/09/2014 Lập trình hướng đối tượng 30
  31. Tái định nghĩa hàm Funtions overloading int abs(int i); int abs(int i); long labs(long l); long abs(long l); double fabs(double d); double abs(double d); C++ cho phép định nghĩa các hàm trùng tên. 14/09/2014 Lập trình hướng đối tượng 31
  32. Tái định nghĩa hàm Qui tắc tái định nghĩa: . Các hàm trùng tên phải khác nhau về tham số: Số lượng, thứ tự, kiểu Qui tắc gọi hàm? . Tìm hàm có kiểu tham số phù hợp . Dùng phép ép kiểu tự động . Tìm hàm gần đúng (phù hợp) nhất 14/09/2014 Lập trình hướng đối tượng 32
  33. Tái định nghĩa hàm Ví dụ 1: 14/09/2014 Lập trình hướng đối tượng 33
  34. Tái định nghĩa hàm Ví dụ 2: 14/09/2014 Lập trình hướng đối tượng 34
  35. Toán tử quản lý bộ nhớ động Toán tử cấp phát bộ nhớ động new int *x; x = new int; //x = (int*)malloc(sizeof(int)); char *y; y = new char[100]; //y = (char*)malloc(100); Toán tử giải phóng vùng nhớ động delete delete x; // free(x); delete y; // free(y); 14/09/2014 Lập trình hướng đối tượng 35
  36. Truyền tham số Truyền theo giá trị (tham trị) . Giá trị tham số khi ra khỏi hàm sẽ không thay đổi. Truyền theo địa chỉ (tham chiếu) . Giá trị tham số khi ra khỏi hàm có thể thay đổi. 14/09/2014 Lập trình hướng đối tượng 36
  37. Tham chiếu Tham chiếu là địa chỉ vùng nhớ được cấp phát cho một biến. Ký hiệu & đặt trước biến hoặc hàm để xác định tham chiếu của chúng Ví dụ 1: . int x = 10, *px = &x, &y = x; . *px = 20; . y = 30; 14/09/2014 Lập trình hướng đối tượng 37
  38. Tham chiếu Ví dụ 2: . int arrget(int *a, int i) { return a[i]; } . arrget(a, 1) = 1; // a[1] = 1; . cin >> arrget(a,1); // cin >> a[1]; Ví dụ 3: . void swap1(int x, int y) { int t = x; x = y; y = t; } . void swap2(int *x, int *y) { int *t = x; x = y; y = t; } . void swap3(int &x, int &y) { int t = x; x = y; y = t; } 14/09/2014 Lập trình hướng đối tượng 38
  39. Tham chiếu 1 // Comparing pass-by-value and pass-by-reference 2 // with references. Notice the & operator, 3 #include 4 using namespace std; indicating pass-by- 5 reference. 6 int squareByValue( int ); // function prototype 7 void squareByReference( int & ); // function prototype 8 int main(){ 9 int x = 2, z = 4; 10 // demonstrate squareByValue 11 cout << "x = " << x << " before squareByValue\n"; 12 cout << "Value returned by squareByValue: " 13 << squareByValue( x ) << endl; 14 cout << "x = " << x << " after squareByValue\n" << endl; 14/09/2014 Lập trình hướng đối tượng 39
  40. Tham chiếu 15 // demonstrate squareByReference 16 cout << "z = " << z << " before squareByReference"Changes << numberendl; , but 17 squareByReference( z ); original parameter (x) 18 cout << "z = " << z << " after squareByReference"is not <<modified endl; . 19 return 0; // indicates successful termination 20 } // end main Changes numberRef, 21 // squareByValue multiplies number by itself,an stores alias the for the original 22 // result in number and returns the new valueparameter of number. Thus, z is 23 int squareByValue( int number ) { changed . 24 return number *= number; // caller's argument not modified 25 } // end function squareByValue 26 void squareByReference( int &numberRef ) { 27 numberRef *= numberRef; // caller's argument modified 28 } // end function squareByReference 14/09/2014 Lập trình hướng đối tượng 40
  41. Tham chiếu 1 // References must be initialized. 2 #include 3 using std::cout; 4 using std::endl; y declared as a reference to x. 5 int main(){ 6 int x = 3; 7 8 int &y = x; 9 cout << "x = " << x << endl << "y = " << y << endl; 10 y = 7; 11 cout << "x = " << x << endl << "y = " << y << endl; 12 return 0; // indicates successful termination x = 3 y = 3 13 } // end main x = 7 y = 7 14/09/2014 Lập trình hướng đối tượng 41
  42. Tham chiếu 1 #include 2 using namespace std; Uninitialized reference 3 int main(){ – compiler error. 4 int x = 3; 5 int &y; 6 cout << "x = " << x << endl << "y = " << y << endl; 7 y = 7; 8 cout << "x = " << x << endl << "y = " << y << endl; 9 return 0; // indicates successful termination 10 } Borland C++ command-line compiler error message: Error E2304 Fig03_22.cpp 11: Reference variable 'y' must be initialized in function main() Microsoft Visual C++ compiler error message: D:\cpphtp4_examples\ch03\Fig03_22.cpp(11) : error C2530: 'y' : references must be initialized 14/09/2014 Lập trình hướng đối tượng 42
  43. Hàm Inline Hàm inline hay còn gọi là hàm nội tuyến. Sử dụng từ khóa inline Yêu cầu trình biên dịch copy code vào trong chương trình thay vì thực hiện lời gọi hàm: . Giảm thời gian thực thi chương trình . Tăng kích thước của mã lệnh thực thi Chỉ nên định nghĩa inline khi hàm có kích thước nhỏ 14/09/2014 Lập trình hướng đối tượng 43
  44. Hàm Inline Ví dụ: 14/09/2014 Lập trình hướng đối tượng 44
  45. Bài tập 1 Tìm lỗi sai cho các khai báo prototype hàm dưới đây (các hàm này trong cùng một chương trình): int func1 (int); float func1 (int); int func1 (float); void func1 (int = 0, int); void func2 (int, int = 0); void func2 (int); void func2 (float); Lập trình Hướng đối tượng 45
  46. Bài tập 2 Cho biết kết xuất của chương trình sau: void func (int i, int j = 0 ){ cout << “So nguyen: ” << i << “ ” << j << endl; } void func (float i = 0, float j = 0){ cout << “So thuc:” << i << “ ” << j <<endl; } void main(){ int i = 1, j = 2; float f = 1.5, g = 2.5; func(); func(i); func(f); func(i, j); func(f, g); } Lập trình Hướng đối tượng 46
  47. Bài tập 3 a. Viết chương trình nhập vào một phân số, rút gọn phân số và xuất kết quả. b. Viết chương trình nhập vào hai phân số, tìm phân số lớn nhất và xuất kết quả. c. Viết chương trình nhập vào hai phân số. Tính tổng, hiệu, tích, thương giữa chúng và xuất kết quả. Lập trình Hướng đối tượng 47
  48. Bài tập 4 a. Viết chương trình nhập vào một ngày. Tìm ngày kế tiếp và xuất kết quả. b. Viết chương trình nhập họ tên, điểm toán, điểm văn của một học sinh. Tính điểm trung bình và xuất kết quả. Lập trình Hướng đối tượng 48
  49. Bài tập 5 Cho một danh sách lưu thông tin của các nhân viên trong một công ty, thông tin gồm: - Mã nhân viên (chuỗi, tối đa là 8 ký tự) - Họ và tên (chuỗi, tối đa là 20 ký tự) - Phòng ban (chuỗi, tối đa 10 ký tự) - Lương cơ bản (số nguyên) - Thưởng (số nguyên) - Thực lãnh (số nguyên, trong đó thực lãnh = lương cơ bản + thưởng ) Hãy thực hiện các công việc sau: a.Tính tổng thực lãnh tháng của tất cả nhân viên trong công ty. b.In danh sách những nhân viên có mức lương cơ bản thấp nhất. c.Đếm số lượng nhân viên có mức thưởng >= 1200000. d.In danh sách các nhân viên tăng dần theo phòng ban, nếu phòng ban trùng nhau thì giảm dần theo mã nhân viên. 14/09/2014 Lập trình hướng đối tượng 49