Bài giảng Kĩ thuật lập trình - Chương 2: Các yếu tố cơ bản của C và C++

pdf 66 trang huongle 5620
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 - Chương 2: Các yếu tố cơ bản của C và 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_ki_thuat_lap_trinh_chuong_2_cac_yeu_to_co_ban_cua.pdf

Nội dung text: Bài giảng Kĩ thuật lập trình - Chương 2: Các yếu tố cơ bản của C và C++

  1. Kỹ thuật lập trình 1 g n Chương 2: Các yếutố cơ bản ươ 010101010101010110000101010101010101011000010101010101010101100001 StateController010101010010101010010101010101001010101001010101010100101010100101 start() 101001100011001001001010100110001100100100101010011000110010010010 Ch củaC vàC++ stop() 110010110010001000001011001011001000100000101100101100100010000010 010101010101010110000101010101010101011000010101010101010101100001 N Ơ 010101010010101010010101010101001010101001010101010100101010100101 101001100011001001001010100110001100100100101010011000110010010010y = A*x + B*u; 110010110010001000001011001011001000100000101100101100100010000010x = C*x + d*u; LQGController010101010101010110000101010101010101011000010101010101010101100001 start() 010101010010101010010101010101001010101001010101010100101010100101 stop() 101001100011001001001010100110001100100100101010011000110010010010 110010110010001000001011001011001000100000101100101100100010000010 8/19/2006 2004, HOÀNG MINH S ©
  2. Nộidung chương 2 2.1 Tổ chứcchương trình C/C++ 2.2 Biếnvàcáckiểudữ liệucơ bản 2.3 Các kiểudữ liệudẫnxuấttrựctiếp 2.4 Định nghĩakiểudữ liệumới 2.5 Điềukhiểnchương trình: phân nhánh 2.6 Điềukhiểnchương trình: vòng lặp 2.7 Mộtsố lệnh ₫iềukhiểnchương trình khác N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 2 Ch ©
  3. 2.1 Tổ chức chương trình C/C++ ƒ Cấutrúcvàcácphầntử cơ bảncủamộtchương trình viếttrênC/C++ ƒ Qui trình tạoramộtchương trình chạy ₫ược: —Vấn ₫ề tạodự án —Qui tắcsoạnthảomãnguồn —Biêndịch từng phầnvàsửacácloạilỗibiêndịch —Liênkếtvàsử dụng thư viện, sửalỗiliênkết —Chạythử và gỡ rối(Debug) ƒ Sơ lượcvề tổ chứcbộ nhớ N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 3 Ch ©
  4. 2.1 Tổ chức chương trình C/C++ # Tiền xử lý Khai báo thư viện và macro Khai báo biến, hàm Khai báo hàm ₫ược sử dụng trong CT chính void main() { Chương trình (CT) Chương trình chính Thân hàm chính N Ơ } Định nghĩa thân hàm ₫ã Định nghĩa hàm (thân hàm) khai báo 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 4 Ch ©
  5. Chương trình tính giai thừa: Phiên bảnC #include #include int factorial(int); void main() { char c = 'N'; int N = 1; int kq; do { printf(“\nEnter a number > 0:"); /* writing on the screen */ scanf("%d",&N); /* reading from keyboard to N */ kq = factorial(N); /* calling function with argument N */ printf(“\nFactorial of %d is %d", N, kq); /*write result on screen */ printf(“\nPress 'Y' to continue or any other key to stop"); c = getch(); /* reading a character from keyboard*/ } while (c=='y' || c=='Y'); /* checking loop condition */ N }Ơ int factorial(int n) { int kq = 1; while (n > 1) kq *= n ; return kq; } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 5 Ch ©
  6. Chương trình tính giai thừa: Phiên bảnC++ #include #include int factorial(int); void main() { char c = 'N'; int N = 1; do { cout 0:“ // writing on the screen cin >> N; // reading from keyboard to N int kq = factorial(N); // calling function with argument cout 1) kq *= n ; return kq; } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 6 Ch ©
  7. Tạodự án 1 3 2 4 N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 7 Ch ©
  8. Bổ sung file mã nguồn 5 và soạnthảo Các công cụ biên dịch và liên kết Cửasổ soạnthảo Cửasổ bàn làm việc/ dự án N Ơ Cửasổ thông báo kếtquả (biên dịch, ) 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 8 Ch ©
  9. Qui tắcsoạnthảomãnguồn 1. Tên biến, tên hàm, tên kiểumới: ƒ Tránh sử dụng các từ khóa và tên kiểucơ sở ƒ Các ký tự dùng ₫ược: ‘A’ ’Z’, ‘a’ ’z’, ‘0’ ’9’, ‘_’ ƒ Phân biệtgiữachữ hoavàchữ thường: n khác N ƒ Ngắnnhưng ₫ủ khả năng phân biệt, gợinhớ₫ểnhậnbiết ƒ Sử dụng tiếng Anh hoặctiếng Việt không dấu(kể cả dòng chú thích) 2. Sau mỗicâulệnh có chấmphảy; 3. Đoạn{ } ₫ược coi là nhóm lệnh, không có dấu chấmphảysau₫ó, trừ trường hợp khai báo kiểu N 4.Ơ Cấutrúcmãnguồntheokiểuphâncấp => dễ₫ọc 5. Bổ sung chú thích ₫ầy ₫ủ, hợp lý (/* */ hoặc //) 6. Chia mộtfile lớn thành nhiềufile nhỏ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 9 Ch ©
  10. Các từ khóa trong C auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 10 Ch ©
  11. Từ khóa trong C++ asm auto bool break case catch char class const const_cast continue default delete else extern do enum false double explicit float dynamic_cast export for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template N thisƠ throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 11 Ch ©
  12. Biên dịch (compile) ƒ Biên dịch từng file nguồnriêngbiệt (*.c: C compiler, *.cpp: C++ compiler), kếtquả => *.obj ƒ Trong Visual C++: Gọi Compile (Ctrl + F7) ₫ể biên dịch riêng rẽ hoặc Build (F7) ₫ể kếthợpbiêndịch và liên kếtchotoànbộ dự án ƒ Các kiểulỗibiêndịch (compile error): —Lỗicúpháp: Sử dụng tên sai qui ₫ịnh hoặcchưa khai báo, thiếu dấuchấmphảy ;, dấu ₫óng } —Lỗikiểu: Các số hạng trong biểuthứckhôngtương thích kiểu, gọi hàm vớithamsố sai kiểu — N ƒƠ Các kiểucảnh báo biên dịch (warning): —Tự₫ộng chuyển ₫ổikiểulàmmất chính xác — Hàm khai báo có kiểutrả về nhưng không trả về —Sử dụng dấu = trong trường hợpnghivấnlàso sánh== — 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 12 Ch ©
  13. Liên kết (link) MyProg.obj MyLib1.obj MyLib2.obj xx.obj yy.lib MyProg.exe ƒ Liên kết là quá trình ghép nhiềufile ₫ích (*.obj, *.lib) ₫ể tạora chương trình chạycuối cùng *.exe ƒ Trong Visual C++: Gọi Build (F7) ƒ Lỗi liên kếtcóthể là do: N —Sử dụng hàm nhưng không có ₫ịnh nghĩahàm Ơ —Biếnhoặchàm₫ược ₫ịnh nghĩa nhiềulần — 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 13 Ch ©
  14. Chạythử và gỡ rối (debug) ƒ Chạythử trong Visual C++: Execute hoặc Ctrl+F5 ƒ Tìm lỗi: —Lỗi khi chạylàlỗithuộcvề phương pháp, tư duy, thuậttoán, không phảivề cú pháp —Lỗi khi chạybìnhthường không ₫ược báo —Lỗi khi chạyrất khó phát hiện, vì thế trong ₫asố trường hợp cầntiếnhànhdebug. ƒ Chạy Debug trong Visual C++: —Chạytớichỗ₫ặt cursor: Ctrl+F10 —Chạytừng dòng lệnh: F10 N Ơ —Chạyvàotronghàm: F11 —Chạytiếpbìnhthường: F5 —Xemkếtquả dướicửasổ Output hoặcgọiQuickWatch 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 14 Ch ©
  15. Tổ chứcbộ nhớ Hệđiều hành Các CT khác Mã chương trình Đỉnh ngănxếp SP Dữ liệu toàn cục n Matran_A Vùng nhớ tự do f Ngănxếp k N Ơ (tham biến, biến i cụcbộ) count a Vùng nhớ tự do 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 15 Ch ©
  16. 2.2 Biếnvàdữ liệu ƒ Biểuthức= dữ liệu + phép toán + ƒ Biểudiễndữ liệu: Thông qua biến hoặc hằng số, kèm theo kiểu ƒ Nội dung trong phầnnày: —Cáckiểudữ liệucơ bản — Các phép toán áp dụng —Tương thích và chuyển ₫ổikiểu — Khai báo biến, phân loạibiến N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 16 Ch ©
  17. 2.2.1 Các kiểudữ liệu cơ bảncủaC/C++ KiểuKíchcỡ thông dụng Phạmvi tốithiểu (tính bằng bit) char 8 −127 to 127 signed char 8 −127 127 unsigned char 8 0 255 int 16/32 −32767 32767 signed int 16/32 -nt- unsigned int 16/32 0 65535 short 16 −32767 32767 signed short 16 nt unsigned short 16 0 65535 long 32 −2147483647 2147483647 signed long 32 - nt- unsignedN long 32 0 4294967295 floatƠ 32 Độ chính xác 6 chữ số double 64 Độ chính xác 15 chữ số long double 80 Độ chính xác 17 chữ số bool (C++) - - wchar_t (C++) 16 −32767 32767 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 17 Ch ©
  18. Các phép toán cơ bản Phép toán Ký hiệuKiểu nguyên Kiểusố thựcKiểu bool Gán = XXX Số học +, -, *, /, XXx +=, -=, *=, /= %, %= Xx ++, Xx So sánh >, =, >, >= Xx Lựachọn ? : XXX Lũythừa? Không có! 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 18 Ch ©
  19. Tương thích và chuyển ₫ổikiểu ƒ Tương thích kiểu=> Tự₫ộng chuyển ₫ổikiểu —Giữacáckiểusố nguyên vớinhau(lưuý phạm vi giá trị) —Giữacáckiểusố thựcvớinhau(lưuý ₫ộ chính xác) —Giữacáckiểusố nguyên và số thực(lưuý phạm vi giá trị và ₫ộ chính xác) —Kiểu bool sang số nguyên, số thực: true => 1, false => 0 —Số nguyên, số thựcsang kiểu bool: ≠ 0 => true, 0 => false ƒ Nếucólỗihoặccảnh báo => khắcphụcbằng cách ép chuyển ₫ổikiểu: —VD: N Ơ i = int(2.2) % 2; j = (int)2.2 + 2; // C++ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 19 Ch ©
  20. Nhìn nhận về chuyển ₫ổikiểu long long double int double short float char bool N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 20 Ch ©
  21. Nhìn nhận về chuyển ₫ổikiểu long long double double int short float N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 21 Ch ©
  22. 2.2.2 Khai báo biến char c = 'N'; Khai báo và khởitạogiátrị bool b = true; int kq; Chỉ khai báo, giá trị bất ₫ịnh double d; long count, i=0; Khai báo kếthợp, chỉ i=0 unsigned vhexa=0x00fa; Đặtgiátrị₫ầu hexa unsigned voctal=082; Đặtgiátrị₫ầu octal -> 66 chứ không phải 82 ƒ C: Toàn bộ biếnphải khai báo ngay ₫ầuthânhàm ƒ C++: Có thể khai báo tạichỗ nào cần, trước khi sử dụng ƒ Phân loạibiến: —Biếntoàncục: Khai báo ngoài hàm, lưugiữ trong vùng nhớ dữ liệu N Ơ chương trình —Biếncụcbộ: Khai báo trong thân hàm, lưugiữ trong ngănxếp —Thambiến: Khai báo trên danh sách tham số củahàm, lưugiữ trong ngănxếp 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 22 Ch ©
  23. Ví dụ khai báo các loạibiến Biếntoàncục int N = 1; void main() { char c = 'N'; do { printf(“\nEnter a number > 0:"); scanf("%d",&N); Biếncụcbộ int kq = factorial(N); // C++ only! } while (c == 'y' || c == 'Y') Hai biếncụcbộ } cùng tên ở hai phạm int factorial(int n) { vi khác nhau, int kq = 1; khôngliênquangì while (n > 1) ₫ếnnN hau! kq *= n ; Ơ return kq; } Tham biến 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 23 Ch ©
  24. Đặctínhlưugiữ ƒ Biến extern: Khai báo sử dụng biếntoàncục ₫ã ₫ược ₫ịnh nghĩavàgángiátrị trong mộttập tin khác /* file1.c */ /* file2.c */ int x, y; extern int x, y; char ch; extern char ch; void main() void func22() { { /* */ x = y / 10; } } void func1(void) void func23() { { x = 123; y = 10; } } N Ơ ƒ Biến static: ₫ượclưutrữ trong bộ nhớ dữ liệuCT —Biếnstatic cụcbộ: hạnchế truy nhậptừ bên ngoài hàm —Biến static toàn cục: hạnchế truy nhậptừ file khác 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 24 Ch ©
  25. 2.2.3 Hằng số (trựckiện) KiểuVídụ int 1 123 21000 −234 0x0A 081 long int 35000L −34l −234L 0x0AL 081L unsigned int 10000U 987u 40000u float 123.23F 4.34e−3f .1f double 123.23 1.0 −0.9876324 .1e−10 long double 1001.2L char ‘A’ ‘B’ ‘ ‘ ‘a’ ‘\n’ ‘\t’ ‘\b’ bool true false N Ơ wchar_t L’A’ L’B’ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 25 Ch ©
  26. 2.3 Các kiểudữ liệu dẫnxuấttrựctiếp ƒ Kiểuliệtkê ƒ Kiểuhằng ƒ Kiểucon trỏ ƒ Kiểumảng ƒ Kiểuthamchiếu (C++) N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 26 Ch ©
  27. 2.3.1 Kiểuliệtkê(enum) ƒ Mục ₫ích sử dụng: — Định nghĩamộtkiểulàtậpcáchằng số nguyên kí hiệu —Sử dụng thuậntiệnbằng tên => hằng số nguyên ƒ Ví dụ enum Color {Red, Green, Blue}; enum WeekDay { Mon = 2, Tue, Wed, Thu, Fri, Sat, Sun = 1 }; enum { DI_MOTOR1_STARTED = 0x01, DI_MOTOR1_RUNNING = 0x02, DI_MOTOR2_STARTED = 0x04, N Ơ DI_MOTOR2_RUNNING = 0x08, DI_PUMP1_STARTED = 0x10, DI_PUMP1_RUNNING = 0x20, DI_OVERLOADED = 0x40, DI_VALVE1_OPENED = 0x80 }; 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 27 Ch ©
  28. Sử dụng kiểuliệtkê /* C version */ void main() { enum Color c = Red; /* c = 0 */ C: enum WeekDay d = Tue; /* d = 3 */ Như mộtkiểusố int i=c, j=d; /* j=0, i=3 */ enum Color c2 = i+1; /* c2 = 1 */ nguyên 8 bit int di1 = 0x01; /* OK, but */ int di2 = DI_MOTOR1_STARTED;/* this is better */ ++c; /* c = 1 */ } // C++ version */ void main() { C++ enum Color c = Red; // c = Red Không còn như WeekDay d = Tue; // OK, d = Tue mộtkiểusố int i=c, j=d; // i=0, j=3 N nguyên! Ơ Color c2 = i+1; // Error! Color c3 = Color(i+1); // OK, c3 = Green int di1 = 0x01; // OK, but int di2 = DI_MOTOR1_STARTED;// this is better ++c; // Error! } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 28 Ch ©
  29. 2.3.2 Kiểuhằng (const) ƒ Cho phép khai báo như biếnsố, nhưng ₫ượcgángiá trị cố₫ịnh bằng mộthằng số và không thể₫ượcthay ₫ổi => khai báo hằng số void main() { const double pi = 3.1412; // initializing is OK! const int ci = 1; // initializing is OK! ci = 2; // error! ci = 1; // error, too! int i = ci; // const int is a subset of int N const Color cc = Red; Ơ cc = Green; // error const double d; // potential error } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 29 Ch ©
  30. 2.3.3 Kiểucon trỏ ƒ Con trỏ thựcchấtlàmộtbiếnchứa ₫ịachỉ củamột ₫ốitượng có thể là mộtbiếnhoặcmộthàm. int v = 2; int* p = &v; // p holds the address of v Con trỏ p Vùng nhớ chứa biến CT 0x000127c3 p: &v v: 2 N Ơ chứa ₫ịa chỉ của biến v 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 30 Ch ©
  31. 2.3.3 Kiểucon trỏ int i = 1; int* p = &i;// p holds the address of i *p = 2; // i = 2 int j; p = &j; // now p holds the address of j *p = 3; // j = 3, i remains 2 N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 31 Ch ©
  32. Ví dụ sử dụng kiểucon trỏ void main() { int i = 0; int* p = &i; // p refers to the addesss of i int j = *p; // j = 0 *p = 2; // now i = 2 p = &j; // now p contains the addess of j *p = 3; // now j = 3, i remains 2 double d = i; // OK, int is compatible to double p = &d; // error, int* isn’t compatible to double* p = (*int)&d; // no compile error, but dangerous, // meaningles type conversion! double* pd=0; // p contains the address 0 *pd = 0; // no compile error, but fatal error pd = &d; // OK N Ơ double* pd2; // p refers to an uncertain address *pd2 = 0; // fatal error pd2 = &d; // OK, pd and pd2 refer to the same addr. } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 32 Ch ©
  33. Tóm tắtsơ bộ về con trỏ ƒ Con trỏ là mộtbiếnchứa ₫ịachỉ byte ₫ầucủamộtbiếndữ liệu, ₫ượcsử dụng ₫ể truy cậpgiántiếpdữ liệu ₫ó ƒ Sau khi khai báo mà không khởitạo, mặc ₫ịnh con trỏ mang một ₫ịachỉ bất ₫ịnh ƒ Địachỉ con trỏ mang có thể thay ₫ổi ₫ược => con trỏ có thể mỗi lúc ₫ạidiệnchomộtbiếndữ liệu khác ƒ Toán tử lấy ₫ịachỉ củamộtbiến(&) trả về con trỏ vào kiểucủa biến=> thường gán cho biếncon trỏ ƒ Toán tử truy nhậpnộidung (*) ápdụng cho con trỏ trả về biến mà con trỏ mang ₫ịachỉ => có thể₫ọchoặcthay₫ổi giá trị của biến ₫ó N ƒƠ Không bao giờ sử dụng toán tử truy nhậpnội dung, nếucon trỏ chưamangmột ₫ịachỉ ô nhớ mà chương trình có quyềnkiểm soát 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 33 Ch ©
  34. 2.3.4 Kiểumảng Chỉ số 012 N-1 ₫ịachỉ₫ầu ₫ịachỉ cuối ₫ịachỉ₫ầu-₫ịachỉ cuối = N * kích cỡ mộtphầntử ƒ Cấutrúcdữ liệuvới: —Số lượng các phầntử cố₫ịnh —Cácphầntử có cùng kiểu N Ơ —Cácphầntử₫ượcsắpxếpkế tiếptrongbộ nhớ —Cóthể truy nhậptừng phầntử mộtcáchtự do theo chỉ số hoặc theo ₫ịachỉ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 34 Ch ©
  35. Khai báo mảng ƒ Số phầntử củamảng phảilàhằng số nguyên (trong C phảilàmộttrựckiện, trong C++ có thể là kiểu const ) ƒ Khai báo không khởitạo: int a[3]; enum {index = 5}; double b[index]; const int N = 2; char c[N]; // C++ only ƒ Khai báo vớisố phầntử và khởitạo giá trị các phầntử N Ơ int d[3]= {1, 2, 3}; double e[5]= {1, 2, 3}; char f[4]= {0}; 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 35 Ch ©
  36. Khai báo mảng (tiếp) ƒ Khai báo và khởitạogiátrị các phần tử, số phầntử₫ượctự₫ộng xác ₫ịnh int a[]= {1, 2, 3, 4, 5}; double b[]= {1, 2, 3}; double c[]= {0}; char s[]= {‘a’}; ƒ Khai báo mảng nhiềuchiều double M[2][3]; int X[2][]={{1,2},{3,4},{5,6}}; short T[2][2]={1,2,3,4,5,6}; N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 36 Ch ©
  37. Ví dụ sử dụng kiểumảng void main() { int a[5]; // a has 5 elements with uncertain values int b[5]= {1,3,5,7,9}; // 5 elements with initial values double c[]; // error, unspecified size double x = 1.0, y = 2.0; double d[]= {x,y,3.0}; // 3 elements with initial values short n = 10; double v[n]; // error, array size must be a constant! const int m=10; // C++ OK double v2[m]; // C++ OK a[0] = 1; int i= 1; a[i] = 2; a[5] = 6; // no compile error, but fatal error int k = a[5]; // no compile error, but fatal error N a = {1,2,3,4,5}; // error Ơ a = b; // error, cannot assign array int M[2][3]; M[0][1] = 0; M[0][2] = 1; } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 37 Ch ©
  38. Mảng ₫ặcbiệt: Chuỗikýtự ƒ Trong C/C++, chuỗikýtự không phảilà kiểucơ bản, mà thựcchấtlàmộtmảng ƒ Phân biệtchuỗikýtự thường và chuỗiký tự kết0 char city1[]= {'H','A','N',' ','O','I‘}; char city2[]= "HA NOI"; wchar_t city3[]= L"HÀ NOI"; city2[] = “HANOI”; // error ƒ Đasố các hàm trong thư việnC làmviệc N Ơ vớichuỗikýtự kết0 ƒ Với C++, chuỗikýtự₫ược ₫ịnh nghĩabằng lớp string trong thư việnchuẩn, không sử dụng byte kết0 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 38 Ch ©
  39. Mảng và con trỏ void main() { int a[5]; // a has 5 elements with // uncertain values int* p; p = a; // p refers to a[0] p = &a[0]; // the same as above *p = 1; // a[0]=1 ++p; // now p points to a[1] *p = 2; // a[1]=2 p++; // now p points to a[2] *p = 3; // a[2]=3 p += 2; // now p points to a[4] *p = 5; // a[4] = 5 N Ơ ++p; // OK, no problem until we dereference it *p = 6; // Now is a BIG BIG problem! a = p; // error, a is like a constant pointer } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 39 Ch ©
  40. Mảng và con trỏ (tiếp) void main() { int a[5]; // a has 5 elements with // uncertain values int* p = a; // p points to a[0] p[0] = 1; // a[0]=1 p[1] = 2; // a[1]=2 p+= 2; // now p points to a[2] p[0] = 3; // a[2]=3 p[1] = 4; // a[3]=4 p[3] = 6; // a[5]=6, Now is a BIG BIG problem! } N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 40 Ch ©
  41. Tóm lượcvề mảng ƒ Mảng là mộttậphợpcácdữ liệu cùng kiểu, sắpxếpliềnkề trong bộ nhớ => các phầntử củamảng ƒ Có thể truy cập các phầntử mảng vớibiếnmảng kèm theo chỉ số hoặcvớibiếncon trỏ (theo ₫ịachỉ củatừng phầntử) ƒ Số phầntử củamảng là cố₫ịnh (khi khai báo phảilàhằng số), không bao giờ thay ₫ổi ₫ược ƒ Biếnmảng (tĩnh) thựcchấtlàmộtcon trỏ hằng, mang ₫ịachỉ củaphầntử₫ầutiên ƒ Có thể₫ặt giá trị₫ầuchocácphầntử củamảng qua danh sách khởitạo, không bao giờ gán ₫ượcmảng cho nhau. Nếucầnsao chép hai mảng thì phảisử dụng hàm ƒ Không bao giờ₫ượcphéptruynhậpvớichỉ số nằm ngoài phạm N vi, nếuN làsố phầntử thì phạm vi cho phép là từ 0 N-1 Ơ ƒ Con trỏ không bao giờ là mộtmảng, nó chỉ có thể mang ₫ịachỉ củamộtmảng và sử dụng ₫ể quảnlýmảng (dù là ₫ộng hay tĩnh) 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 41 Ch ©
  42. 2.3.5 Kiểu tham chiếu (C++) ƒ Một biếnthamchiếulàmột biến ₫ạidiện trực tiếpcho một biến khác (thay cho con trỏ) ƒ Ýnghĩasử dụng chủ yếuvề sau trong truyềnthamsố cho hàm void main() { double d = 2.0; double& r = d; // r represents d double *p1 = &d, *p2 = &r; r = 1.0; // OK, d = 1.0 double& r2; // error, r has to be assigned to a var. N Ơ double& r3 = 0; // error, too double d2 = 0; r = d2; // r = 0, d=0 r = 1.0; // r = d = 1, d2 =0 } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 42 Ch ©
  43. 2.3.6 Typedef ƒ Từ khóa typedef tạoramột tên mớichomộtkiểucó sẵn, không ₫ịnh nghĩamộtkiểumới ƒ Ý nghĩa: ₫ưa tên mớidễ nhớ, phù hợpvới ứng dụng cụ thể, dễ thay ₫ổivề sau typedef float REAL; typedef int AnalogValue; typedef int Vector[10]; typedef AnalogValue AnalogModule[8]; typedef int* IPointer; N AnalogValue av1 = 4500; Ơ Vector x = {1,2,3,4,5,6,7,8,9,10}; AnalogModule am1 = {0}; IPointer p = &av1; 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 43 Ch ©
  44. 2.4 Định nghĩa kiểudữ liệumới ƒ Cấutrúc(struct): Tậphợpnhững dữ liệuhỗnhợp, truy nhập theo tên (biếnthànhviên). Thôngdụng nhất trong C, ý nghĩa ₫ượcmở rộng trong C++ ƒ Hợpnhất(union): Mộttênkiểu chung cho nhiềudữ liệu khác nhau (chiếmcùngchỗ trong bộ nhớ). Ít thông dụng trong cả C và C++ ƒ Lớp(class): Chỉ có trong C++, mở rộng struct cũ thêm những hàm thành viên. N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 44 Ch ©
  45. 2.4.1 Cấutrúc(struct) ƒ Định nghĩacấutrúc(bêntronghoặc ngoài các hàm) struct Time Tên kiểumới { (không trùng lặp) int hour; // gio int minute; // phut int second; // giay }; Các biến thành viên, struct Date { khai báo ₫ộclập int day, month, year; hoặc chung kiểu }; N Các biến thành viên Ơ struct Student { char name[32]; có thể cùng kiểu struct Date birthday; hoặc khác kiểu C++ int id_number; }; 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 45 Ch ©
  46. Khai báo biếncấutrúc void main() { Time classTime = {6,45,0}; Time lunchTime = {12}; Date myBirthday, yourBirthday = {30,4,1975}; Student I = {"Nguyen Van A", {2,9,1975}}; // N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 46 Ch ©
  47. Sử dụng biếncấutrúc / void main() { Time classTime = {6,45,0}; Time lunchTime = {12}; Date myBirthday, yourBirthday = {30,4,1975}; Student I = {"Nguyen Van A", {2,9,1975}}; lunchTime.minute = 15; lunchTime.hour = classTime.hour + 6; Student U = I; // in C++ also possible: Student U(I); U.name[11] = 'B'; // "Nguyen Van B" U.id_number++; // 1 N Ơ U.birthday.day = 30; // 30-9-1975 U.birthday.month = 4; // 30-4-1975 U.birthday = yourBirthday; // structs can be assigned } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 47 Ch ©
  48. Phảnvídụ: khaibáovàsử dụng cấutrúc struct Time { int hour = 0; // error, initialization not allowed int minute, // error, use semicolon (;) instead int second // error, missing semicolon (;) } // error, missing semicolon (;) // void main() { Date d; d = {11,9,2001}; // error, { } is an initialization // list,not a structure Date.hour = 0; // error, Date is a type, not a var. N Ơ struct Date2 { int day, month, year; }; Date2 d2 = d; // error, Date is not compatible to Date2 } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 48 Ch ©
  49. Mảng, con trỏ và cấutrúc ƒ Kếthợpmảng, con trỏ và cấutrúcchophépxâydựng và sử dụng các cấutrúcdữ liệuphứctạpmộtcáchrất linh hoạt void main() { // Date victoryDays[]= {{19,8,1945},{7,5,1954},{30,4,1975}}; Date saigonVictory= victoryDays[2]; Date *p=&saigonVictory; (*p).year += 30; // good p->year -=30; // better Student studentList[45]; for (int i=0; i id_number += 4800; ++pList; } } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 49 Ch ©
  50. Tóm lượcvề cấutrúc(struct) ƒ Cấu trúc (struct) ₫ượcsử dụng ₫ể nhóm các dữ liệuliênquan mô tả một ₫ốitượng, các dữ liệucóthể cùng hoặc khác kiểu ƒ Định nghĩakiểucấutrúcbằng cách khai báo tên các biến thành viên. Định nghĩakiểucấutrúcchưaphảilà₫ịnh nghĩa các biếncụ thể, vì thế không ₫ược ₫ặt giá trị₫ầuchocácbiến ƒ Kích cỡ củacấutrúc>= tổng kích cỡ các thành viên ƒ Truy cậpmộtbiếncấu trúc thông qua tên biến, toán tử (.) và tên biến thành viên ƒ Các kiểucấutrúccóthể lồng vào nhau, trong cấutrúccóthể sử dụng mảng, mộtmảng có thể có các phầntử là cấu trúc, v.v ƒ Các biến có cùng kiểucấutrúccóthể gán cho nhau, có thể sử N dụng ₫ể khởitạo cho nhau (khác hẳnvớimảng) Ơ ƒ Có thể sử dụng con trỏ₫ểtruy nhậpdữ liệucấu trúc thông qua toán tử (*.) và toán tử (->) ƒ Hai kiểucấu trúc có khai báo giốngnhauhoàntoànvẫnlàhai kiểucấu trúc khác nhau 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 50 Ch ©
  51. 2.4.2 Hợpnhất enum SignalType {BINARY_8, BINARY_16, ANALOG_1, ANALOG_2}; union SignalValue { unsigned short word; unsigned char byte; float real; double lreal; }; struct Signal { SignalType type; SignalValue value; }; void main() { SignalValue B,W; B.byte = 0x01; W.word = 0x0101; unsigned char b = W.byte; // OK, the lower byte N float f = W.real; // meaningless Ơ Signal DI1 = {BINARY_8, 0x11}; Signal AI1 = {ANALOG_1,{0}}; Signal AI2; AI2.type = ANALOG_2; AI2.value.lreal = 145.67; } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 51 Ch ©
  52. Tóm lượcvề hợpnhất ƒ Hợpnhất (union) là mộttậphợp (không có cấutrúcchặtchẽ) chứa các biếnsử dụng chung ô nhớ, ở mỗingữ cảnh chỉ sử dụng mộtbiếnriêngbiệt ƒ Union thường ₫ượcsử dụng khi dữ liệu ₫ầuvàocóthể có kiểu khác nhau ƒ Các thành viên củamột union không liên quan ₫ến nhau, không cùng nhau tạothànhmộtthựcthể thống nhất ƒ Kích cỡ củaunion bằng kích cỡ củabiếnlớnnhất ƒ Khai báo kiểuunion tương tự như khai báo struct, nhưng ý nghĩa khác hẳn ƒ Truy nhậpbiến thành viên cũng tương tự như struct, có thể qua N Ơ biếntrựctiếphoặcqua biếncon trỏ. ƒ Union có thể chứa struct, struct có thể chứa union, union có thể chứamảng, các phầntử củamảng có thể là union. 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 52 Ch ©
  53. 2.5 ĐiềukhiểnCT: phân nhánh ƒ Các kiểu phân nhánh – if else: Phân nhánh lựachọnmộthoặchaitrường hợp – switch case: Phân nhánh lựachọnnhiềutrường hợp – break: Lệnh nhảykết thúc (sớm) mộtphạmvi – return: Lệnh nhảyvàkếtthúc(sớm) mộthàm – goto: Lệnh nhảytớimột nhãn (không nên dùng!) N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 53 Ch ©
  54. 2.5.1 Cấutrúcif else ƒ Lựachọnmộttrường hợp: sử dụng if if (npoints >= 60) cout = 80 && npoints = 90) cout = 80) cout = 70) N cout = 60) cout << ‘D’; else cout << ‘F’; 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 54 Ch ©
  55. Ví dụ: Hàm max() int max1(int a, int b) { int max4(int a, int b) { int c; if (a > b) if (a > b) return a; c = a; else else return b; c = b; } return c; int max5(int a, int b) { } if (a > b) int max2(int a, int b) { return a; int c = a; return b; if (a b)? a: b; } } intN max3(int a, int b) { Ơ if (a < b) a = b; return a; } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 55 Ch ©
  56. 2.5.2 Cấutrúcswitch case Signal input; int i = 0; while (i++ < 8) { input = readInput(i); // read from input module i switch (input.type) { case BINARY_8: cout << input.value.byte; break; case BINARY_16: cout << input.value.word; break; case ANALOG_1: cout << input.value.real; break; case ANALOG_2: N cout << input.value.lreal; break; Ơ default: cout << "Unknown signal type"; } } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 56 Ch ©
  57. 2.6 ĐiềukhiểnCT: vòng lặp ƒ Các kiểuvònglặp trong C/C++ – while (condition) { } – do { } while (condition) – for (init;condition;post_action) { } ƒ Vòng lặpcóthể thựchiệnvới if else + goto, song không bao giờ nên như vậy ƒ Ứng dụng vòng lặpchủ yếutronglàmviệcvớimảng và các cấutrúcdữ liệutổng quát khác => truy nhập qua biếnmảng + chỉ số, qua con trỏ hoặcqua N Ơ iterator (sẽ₫ềcậpsaunày) 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 57 Ch ©
  58. 2.6.1 Cấutrúcwhile #include void main() { char input[32]; cout > i; } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 58 Ch ©
  59. Cấutrúcwhile: Biểuthức ₫iềukiện #include void main() { char input[32], family_name[16]={0}; cout > i; }N Ơ 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 59 Ch ©
  60. 2.6.2 Cấutrúcdo while #include void main() { char input[32], family_name[16]={0}; short i; do { cout > i; } while (i == ‘Y’ || i == ‘N’) } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 60 Ch ©
  61. 2.6.3 Cấutrúcfor short i =0; for (short i=0;input[i]!=0; ++i) while (input[i]!= 0) { { if (input[i] == ' ') if (input[i]==' ') ++nSpaces; ++nSpaces; else else ++nLetters; ++nLetters; } ++i; } short i=0; short i=0; for (;input[i]!= 0;) for (;input[i]!=0; ++i) { { if (input[i]==' ') if (input[i] == ' ') N Ơ ++nSpaces; ++nSpaces; else else ++nLetters; ++nLetters; ++i; } } 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 61 Ch ©
  62. Tóm lượccáccấutrúcvònglặp ƒ Các cấutrúcvònglặp while và for tương tự như nhau, thựcratachỉ cầnmộttronghai ƒ Cấutrúcdo while tuy có ý nghĩakhácmột chút, song cũng có thể chuyểnvề cấutrúcwhile hoặc for ƒ Các cấutrúccóthể lồng vào nhau tương ₫ốitự do, tuy nhiên tránh lồng quá nhiều ₫ể còn dễ bao quát, khi cầncóthể phân hoạch lại thành hàm ƒ Điềukhiểnvònglặpcóthể nằmtrựctiếptrên₫iều kiện, hoặccóthể kếthợp bên trong vòng lặpvớicác N Ơ lệnh if else và break, return ƒ Thậntrọng trong kiểmtra₫iềukiệnvònglặp(chỉ số mảng, con trỏ, ) 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 62 Ch ©
  63. Luyệntập ở nhà theo sườn bài giảng ƒ Tậptạodự án mớivớiVisual C++ ƒ Tậpviếtmộtchương trình bằng C (₫ặt ₫uôi *.c): —tập khai báo các loạibiến, sử dụng các kiểudữ liệucơ bản —tậpsử dụng các phép toán ₫ãhọc —sử dụng toán tử sizeof ₫ể tìm kích cỡ các kiểudữ liệu, in kết quả ra màn hình —biêndịch, chạythử và tìm lỗi —tậpsử dụng công cụ debugger — ₫ổi ₫uôi file thành *.cpp và thử lại ƒ Tậpviếtmộtchương trình bằng C/C++ khác ₫ể tìm N Ơ hiểu: — Cách khai báo và sử dụng kiểuhằng, kiểuliệtkê, kiểucon trỏ, kiểumảng, kiểu tham chiếu(C++), kiểucấutrúc —bảnchấtcủacon trỏ và quan hệ vớikiểumảng 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 63 Ch ©
  64. Bài tậpvề nhà cho chương 2 1. Viếtmộtchương trình bằng C, thựchiệnlầnlượtcácchứcnăng sau ₫ây: —yêucầungườisử dụng nhậpmộtsố nguyên lớnhơn0 — phântíchsố nguyên ₫ó thành hàng ₫ơnvị, hàng chục, hàm trăm, v.v và in kếtquả lầnlượt ra màn hình. —hỏingườisử dụng có yêu cầutiếptục hay không, nếucóyêu cầuthìlặplại 2. Chuyểnchương trình thành C++ và ₫ơngiảnhóacáccâulệnh vào-ra bằng cách sử dụng thư viện 3. Dựavàokiểu Date trong bài giảng, viếtmộtchương trình cho phép ngườisử dụng nhậpsố liệuchomột ngày, và sau ₫ó: a) Kiểm tra các số liệungày, thángvànămcóhợplệ hay không N Ơ b) Kiểm tra xem ngày ₫ócóphảilàmộtngàylễ trong nămhay không c) Xác ₫ịnh ngày tiếptheolàngàynào d) In các kếtquả thông báo ra màn hình 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 64 Ch ©
  65. Bài tậplớn1 (tuần1-6: Lậptrìnhcấutrúc) 1. Xây dựng mộtchương trình có chứcnăng tạotínhiệutheoyêu cầungườisử dụng về dạng tín hiệu(bậc thang, tín hiệudốc, xung vuông, hình sin hoặc ồntrắng), tham số củatínhiệu(tùy theo dạng tín hiệuchọnnhư biên ₫ộ, tầnsố, ₫ộ dốc, ₫ộ rộng xung, ). Yêu cầungườisử dụng nhập khoảng thời gian cầntạo giá trị tín hiệu cùng thời gian trích mẫu, sau ₫ó ghi các giá trị gián ₫oạncủatínhiệuramột file vớitêndo ngườisử dụng nhập. Gợiý: sử dụng thư viện choviệcthaotácvớifile. 2. Xây dựng mộtchương trình ₫ể tính tích phân củatínhiệu(hay tính diệntíchdưới ₫ường cong) bằng phương pháp xấpxỉ hình N thang vớicácgiátrị gián ₫oạncủatínhiệu ₫ưavàotừ file tạo Ơ ra theo chương trình 1. 3. Suy nghĩ phân hoạch chương trình 1 và 2 thành các hàm ₫ưa vào thư viện. Viếtlạicácchương trình ₫ótheothiếtkế mới. 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 65 Ch ©
  66. Chỉ dẫnvề thựchiệnbàitậplớn ƒ Bài tậplớncóthể thựchiện riêng hoặc theo nhóm tự chọn(tối ₫a3 người/nhóm) ƒ Bài tậplớn1 nộpvàocuốituần7, baogồm: —Môtả theo mẫutrênítnhất1 tranggiấyvề các tư tưởng phân tích, thiếtkế và thựcthi. —Toànbộ thư mụcdự án (file dự án, mã nguồnvàchương trình chạy) cầnnénlạidướidạng *.zip và gửivề₫ịachỉ email của giáo viên: luuhongviet@gmail.com. Qui ₫ịnh tên file zip: bắt ₫ầubằng “P1_”, tiếptheolàtên₫ầy ₫ủ của người ₫ạidiện nhóm, ví dụ “P1_NguyenVanA.zip”. Lưuý trước khi nén cầnxóatấtcả các file phụ trong thư mục N “Debug”, chỉ trừ file *.exe. Ơ ƒ Hoàn thành bài tậplớn không những là ₫iềukiệndự thi họckỳ, mà ₫iểm bài tậplớncòn₫ượctínhvào₫iểmcuốihọckỳ theo một hệ số thích hợp 2004, HOÀNG MINH S ương 2: Các yếutố cơ bảncủaC vàC++ 66 Ch ©