Bài giảng Giới thiệu lập trình - Lê Nguyên Khôi

pdf 54 trang hoanguyen 2430
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Giới thiệu lập trình - Lê Nguyên Khôi", để 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_gioi_thieu_lap_trinh_le_nguyen_khoi.pdf

Nội dung text: Bài giảng Giới thiệu lập trình - Lê Nguyên Khôi

  1. Nội Dung  Khái ni ệm v ề ch ươ ng trình và l ập trình  Cấu trúc m ột ch ươ ng trình  Biên so ạn, biên dịch ch ươ ng trình  Chạy ch ươ ng trình  Sửa và gỡ lỗi ch ươ ng trình Gi ới Thi ệu Lập Trình  Môi tr ườ ng l ập trình Gi ới Thi ệu TS. Lê Nguyên Khôi Tr ườ ng Đại học Công ngh ệ, ĐHQGHN Gi ới Thi ệu Lập Trình 1 Ch ươ ng Trình Lập Trình  Một dãy các l ệnh (instruction) cho máy tính  Quá trình t ạo ra ch ươ ng trình gi ải quy ết v ấn đề  Máy tính không th ể t ự v ận hành cụ th ể b ằng máy tính, bao gồm:  Cần mệnh lệnh để ho ạt độ ng  Phân tích vấn đề  Máy tính ch ạy các l ệnh c ủa ch ươ ng trình t ại b ộ  Xây dựng gi ải pháp xử lý trung tâm (CPU)  Đánh giá gi ải pháp  Cài đặ t gi ải pháp  Ch ươ ng trình ch ạy sai  Ki ểm th ử  Không ph ải do lỗi máy tính  Gỡ lỗi  Do các lệnh hướ ng dẫn máy tính sai  Tối ưu  Lập trình viên tìm và sửa lỗi Gi ới Thi ệu L ập Trình 2 Gi ới Thi ệu L ập Trình 3 Tại Sao Cần Lập Trình Đánh Giá Ch ươ ng Trình  Tính đúng đắ n (correctness)  Đ ề ể i u khi n máy tính  Kết qu ả tươ ng ứng với thông tin đầ u vào  Gi ải quy ết nhi ều vấn đề hi ện đạ i  Tính ch ịu lỗi (robustness)  Tr ải nghi ệm sáng tạo thú vị  Xử lý: lỗi khi ch ạy, thông tin đầ u vào sai  Tính dễ dùng (usability)  Khai phá ti ềm năng trí tu ệ  Ng ườ i dùng dễ dàng sử dụng  Tính kh ả chuy ển (portatbility)  Thích nghi trong các môi tr ườ ng khác nhau  Tính bảo trì (maintainability)  Dễ dàng sửa đổ i, nâng cấp  Tính hi ệu qu ả (efficiency)  Độ tin cậy, tốc độ xử lý, tài nguyên sử dụng, ít rủi ro Gi ới Thi ệu L ập Trình 4 Gi ới Thi ệu L ập Trình 5 1
  2. Cài Đặt Gi ải Pháp Trình Tự Xây Dựng Ch ươ ng Trình  Sau khi xây dựng gi ải pháp, đánh giá gi ải pháp, lập trình viên ti ến hành gi ải đặ t gi ải pháp  So ạn th ảo (vi ết ch ươ ng trình)  Biên dịch  Sử dụng ngôn ng ữ:  Ch ạy ch ươ ng trình  Ngôn ng ữ máy: tr ực ti ếp điều khi ển bộ vi xử lý  Ki ểm th ử  Ngôn ng ữ tự nhiên: máy không hi ểu  Gỡ lỗi  Ngôn ng ữ bậc cao: C, C++ , Java, C#, Python  Có th ể chuy ển thành ngôn ng ữ máy  Sử dụng công cụ, ch ươ ng trình dịch  Gần với ngôn ng ữ tự nhiên  Dễ đọ c, dễ hi ểu, dễ trao đổ i Gi ới Thi ệu L ập Trình 6 Gi ới Thi ệu L ập Trình 7 Ch ươ ng Trình Trong Ngôn Ng ữ C++ Ch ươ ng Trình Đầu Tiên  Yêu cầu máy tính in ra dòng “Hello, World !!!”  Tải và cài đặ t MinGW32  Biên so ạn ch ươ ng trình sử dụng Notepad #include  Lưu ch ươ ng trình vào với ph ần mở rộng .cpp  Mở ch ươ ng trình Command Prompt , truy cập using namespace std; đế n th ư mục đã lưu tệp int main()  Biên dịch ch ươ ng trình sử dụng g++ đượ c tệp { ầ ở ộ ươ có ph n m r ng .exe (ch ng trình) cout #include tải th ư vi ện using namespace std; using namespace std; tải không gian int main() điểm bắt đầ u int main() tên { ch ươ ng trình { cout << b"Hello,ắt đầ u World !!!" << endl; cout << "Hello, World !!!" << endl; return 0; return 0; kết thúc } } Gi ới Thi ệu L ập Trình 10 Gi ới Thi ệu L ập Trình 11 2
  3. Ch ươ ng Trình Đầu Tiên Ch ươ ng Trình Đầu Tiên  Yêu cầu máy tính in ra dòng “Hello, World !!!”  Yêu cầu máy tính in ra dòng “Hello, World !!!” #include #include Thông báo với hệ điều hành không có lỗi xảy ra. using namespace std;ấ ả ữ using namespace std; mệnh lệnh in In t t c gi a 2 Giá tr ị khác 0, xảy ra lỗi ra màn hình dấu nháy kép “” ố int main() xu ng dòng int main() trong quá trình ch ạy. { { cout #include using namespace std; using namespace std; int main() int main() { { cout 1. Nh ập 2 s ố nguyên a và b using namespace std; không có dấu 2. Tính t ổng & hi ệu c ủa a và b ch ấm ph ẩy 3. Lưu các giá tr ị c ủa t ổng & hi ệu sau khi tính int main() 4. In ra t ổng & hi ệu { cout << "Hello, World !!!" << endl ;  Ki ểm tra gi ải pháp với các cặp số khác nhau cout << "I am a computer" << endl; return 0; } Gi ới Thi ệu L ập Trình 16 Gi ới Thi ệu L ập Trình 17 3
  4. Tổng & Hi ệu 2 S ố Nguyên Trong C++ Tổng & Hi ệu 2 S ố Nguyên Trong C++ ậ /* ch ươ ng trình C++ tính tổng & hi ệu 2 s ố nguyên */ /* ch ươ ng trình C++ tính tổng & hi ệu 2 s ố nguyên */ #include #include using namespace std; using namespace std; int main() int main() { { int soThu1, soThu2; // khai báo int soThu1, soThu2; // khai báo cin >> soThu1; // nh ập d ữ li ệu cin >> soThu1; // nh ập d ữ li ệu cin >> soThu2; // nh ập dữ li ệu cin >> soThu2; // nh ập dữ li ệu int tong, hieu; // khai báo int tong, hieu; // khai báo tong = soThu1 + soThu2; // tính t ổng tong = soThu1 + soThu2; // tính t ổng hieu = soThu1 – soThu2; // tính hi ệu hieu = soThu1 – soThu2; // tính hi ệu cout #include using namespace std ; using namespace std; int main () int main() { { int soThu1, soThu2; // khai báo int soThu1, soThu2; // khai báo cin >> soThu1; // nh ập d ữ li ệu cin >> soThu1; // nh ập d ữ li ệu cin >> soThu2; // nh ập dữ li ệu cin >> soThu2; // nh ập dữ li ệu int tong, hieu; // khai báo int tong, hieu; // khai báo tong = soThu1 + soThu2; // tính t ổng tong = soThu1 + soThu2; // tính t ổng hieu = soThu1 – soThu2; // tính hi ệu hieu = soThu1 – soThu2; // tính hi ệu cout #include using namespace std; using namespace std; int main() int main() { { int soThu1, soThu2; // khai báo int soThu1, soThu2; // khai báo cin >> soThu1; // nh ập d ữ li ệu cin >> soThu1; // nh ập d ữ li ệu cin >> soThu2; // nh ập dữ li ệu cin >> soThu2; // nh ập dữ li ệu int tong, hieu; // khai báo int tong, hieu; // khai báo tong = soThu1 + soThu2; // tính t ổng tong = soThu1 + soThu2; // tính t ổng hieu = soThu1 – soThu2; // tính hi ệu hieu = soThu1 – soThu2; // tính hi ệu cout << "tong: " << tong << endl; // in kết qu ả cout << "tong: " << tong << endl; // in kết qu ả cout << "hieu: " << hieu << endl; // in k ết qu ả cout << "hieu: " << hieu << endl; // in k ết qu ả return 0; return 0; } } Gi ới Thi ệu L ập Trình 22 Gi ới Thi ệu L ập Trình 23 4
  5. Tổng & Hi ệu 2 S ố Nguyên Trong C++ Tổng & Hi ệu 2 S ố Nguyên Trong C++ u ệ ượ ặ ể ự ệ ệ ụ ế ươ ườ ọ ểu /* ch ươ ng trình C++ tính tổng & hi ệu 2 s ố nguyên */ /* ch ươ ng trình C++ tính tổng & hi ệu 2 s ố nguyên */ #include #include using namespace std; using namespace std; int main() int main() { { int soThu1, soThu2; // khai báo int soThu1, soThu2; // khai báo cin >> soThu1; // nh ập d ữ li ệu cin >> soThu1; // nh ập d ữ li ệu cin >> soThu2; // nh ập dữ li ệu cin >> soThu2; // nh ập dữ li ệu int tong, hieu; // khai báo int tong, hieu; // khai báo tong = soThu1 + soThu2; // tính t ổng tong = soThu1 + soThu2; // tính t ổng hieu = soThu1 – soThu2; // tính hi ệu hieu = soThu1 – soThu2; // tính hi ệu cout vào tệp TongHieu.cpp using namespace std; int main()  ở ể đế ư M Command Prompt (cmd ), chuy n n th { mục lưu tệp ucln.cpp in soThu1, soThu2; // khai báo cin >> soThu1; // nh ập d ữ li ệu  ị ươ g++ TongHieu .cpp , sẽ D ch ch ng trình, gõ: cin >> soThu2; // nh ập d ữ li ệu chuy ển mã ngu ồn ngôn ng ữ bậc cao sang ngôn ng ữ máy và lưu vào a.exe  Gõ sai ch ươ ng trình  Gõ g++ TongHieu.cpp –o TongHieu.exe để lưu vào  Dịch mã ngu ồn ngôn ng ữ bậc cao (C++) báo lỗi tệp với tên mong mu ốn (TongHieu.exe ) TongHieu.cpp:7:5: error: “in” was not declared in this scope ạ ươ  Ch y ch ng trình, gõ TongHieu.exe in soThu1, soThu2; ^ Gi ới Thi ệu L ập Trình 26 Gi ới Thi ệu L ập Trình 27 Ki ểm Tra Ch ươ ng Trình Công Cụ Hỗ Tr ợ Lập Trình  Ki ểm tra kết qu ả ch ươ ng trình  CodeBlocks  Dữ li ệu: 3 và 10  So ạn th ảo tệp văn bản ch ươ ng trình  Kết qu ả: Tong: 13 Hieu: -7  Ghi vào file có đuôi .cpp  Luôn luôn ki ểm tra ch ươ ng trình với một bộ dữ  Biên dịch: Build > Compile current file li ệu đượ c lựa ch ọn cẩn th ận để phát hi ện  Ch ạy: Build > Run nh ững lỗi không mong mu ốn (lỗi ch ạy)  Ki ểm tra th ườ ng bị quên Gi ới Thi ệu L ập Trình 28 Gi ới Thi ệu L ập Trình 29 5
  6. Bài Tập  Biên so ạn và ch ạy 02 ch ươ ng trình trên theo các bướ c nh ư trong slide 26  Tìm hi ểu sự phát tri ển các ngôn ng ữ lập trình  Mượ n sách th ư vi ện  Tìm hi ểu codepower.vn  Tìm hi ểu CodeBlocks  Slide bài gi ảng tải từ website môn học ho ặc website bài tập codepower.vn Gi ới Thi ệu L ập Trình 30 6
  7.  Ki u d li u c bn  Phép toán  Bi n s  Hng s  Hàm s toán hc ơ ư Gi i Thi u L p Trình 1  Ki m tra s dng b d li u (5, 15); (33, 110)  S dng cp s nguyên âm, không in kt qu 1 #include  Mnh lnh cout > a; std::cin >> b; 7 while (a != b) 7 while (a != b) 8 { 8 { 9 if (a > b) a = a – b; 9 if (a > b) a = a – b; 10 else b = b – a; 10 else b = b – a; 11 } 11 } 12 std::cout 0)  iu ki n sau (postcondition) khi ch y ch.tr.  Ki u d li u int bi u di n s nguyên  ch.tr. kt thúc và in ra ucln ca a và b t -2.147.483.648 n +2.147.483.647  Có th sa ch.tr. tính ư c ucln ca 2 s nguyên âm  Có nh hư ng gì không?  Cng có th t iu ki n tr ư c khi tính, nu iu ki n tr ư c sai, không tính và in thông báo Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  8. e  S nguyên dư ng  C quan V tr châu Âu phóng tên la y Cơ số 10 (3 ch ữ số) ngày 04/06/1996, tr giá 7 t ô la M  Ariane 5 dùng li mã ca h th ng iu khi n y ca Ariane 4 = ∗ + ∗ + ( ∗ ) Cơ số 2 (3 ch ữ số)  Tc A5 ln hn A4, nh ưng khi thi t k không ki m tra mi n d li u bi u di n  Khi A5 t ti tc nh t nh, xy ra li tràn = ∗ + ∗ + ( ∗ ) b nh , b x lý tt  S nguyên âm: s dng bit trái ngoài cùng bi u di n  A5 b mt iu khi n, sau ó gây n = ∗ − + ∗ + ( ∗ ) = − = ∗− + ∗ +(∗) =− Gi i Thi u L p Trình 6 Gi i Thi u L p Trình 7 char ơ  Trong C++ ki u d li u char là ki u nh nh t Ki ểu Độ Lớn Mi ền Giá Tr ị  S dng 1 byte b nh char 1 byte -128 n  1 byte trong máy tính gm 8 bit +127  Nh ư vy, kho ng bi u di n t -128 n +127 (−2 , +2 − 1) −2 2 2 2 2 2 2 2 short 2 byte -32.768 n −128 64 32 16 8 4 2 1 +32.767 (−2 , +2 − 1)  10000000 = −128 và 01111111 = 127 int 4 byte -2.147.483.648 n  Kho ng bi u di n t −2 n +2 − 1 +2.147.483.647 (−2 , +2 − 1) Gi i Thi u L p Trình 8 Gi i Thi u L p Trình 9 ơ ki ểu của toán hạng, xác định phép toán tươ ng ứng Ki ểu Độ Lớn Mi ền Giá Tr ị Phép Toán Toán Tử Ví Dụ Áp Dụng a + b s nguyên & float 1 + 2 4 byte (−10 , +10 ) Cng + s th c 1.1 + 2.2 a - b 1 – 2 s nguyên & Tr - s th c double 1.1 – 2.2 8 byte (−10 , +10 ) a * b s nguyên & 1 * 2 Nhân * s th c 1.1 * 2.2 a / b s nguyên & long 1 / 2 10 byte (−10 , +10 ) Chia / s th c double 1.1 / 2.2 a % b Ph n dư % 1 % 2 ch s nguyên Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  9.  s dng hi u qu kt qu ca các phép  Chia nguyên: c hai toán hng là s nguyên toán, cn lưu kt qu sau khi tính toán vào các  Chia th c: mt trong hai toán hng là s th c bi n s 1 int main()  2 { Bi n s dùng lưu giá tr thu c mt ki u d 3 int i = 1, j = 2, k; li u nh t nh, ví d: int , double 4 double f = 1.0, g = 2.0, h; 5 k = i / j; // chia nguyên k = 0  Mi bi n s có 03 thu c tính: tên, ki u, giá tr 6 k = j / i; // chia nguyên k = 2  s dng bi n s, ph i t tên hp l bng 7 h = f / g; // chia th ực h = 0.5 8 h = i / g; // chia th ực h = 0.5 cách khai báo bi n s 9 h = f / j; // chia th ực h = 0.5  Ph i khai báo bi n s tr ư c khi s dng 10 return 0; 11 }  Nu không trình biên dch s báo li ch ưa khai báo error: was not declared in this scope Gi i Thi u L p Trình 12 Gi i Thi u L p Trình 13  Cú pháp : ki ểuDL tênBi ến;  Cú pháp : tênBi ến = giáTr ị;  Ý ngh a: to mt bi n s có tên là tênBi n tênBi ến = bi ểuTh ức; lưu d li u ki u ki uDL  Ý ngh a: lưu giáTr ho c kt qu ca bi uTh c vào bi n s có tên là tênBi n  Ví d: int x;  Ví d: x = 24;  Ý ngh a : khai báo bi n s nguyên x ki u int x = (x * 24) / y;  Chú ý: ngay sau khai báo, bi n s ã có giá tr !  Chú ý: bên trái ca phép gán (du =) là giá tr  s dng mnh lnh cout << in ra giá tr bi n trái (gt-T), bên ph i là giá tr ph i (gt-P)  Lưu ý: khi nào s dng bi n s mi khai báo  x có th va là gt-T và gt-P trong cùng mt phép gán Gi i Thi u L p Trình 14 Gi i Thi u L p Trình 15  Cú pháp : ki ểuDL tênBi ến = giáTr ị;  Tên bi n s dùng nh danh ki ểuDL tênBi ến = bi ểuTh ức;  Bt u bng ch cái ho c du gch chân “_”  Ý ngh a: to mt bi n s có tên là tênBi n  Ti p n là ch cái, ch s, du gch chân lưu d li u ki u ki uDL , sau ó lưu giáTr ho c  Không có du cách “ “ trong tên bi n s kt qu ca bi uTh c vào bi n s ó  C++ phân bi t ch hoa và ch th ư ng  Ví d: int x = 24;  Tên bi n s không ư c trùng vi t khóa C++ int x = (x * 24) / y;  Ví d: i, k62 , X, x, soPT , soThu1 , soThu2 ,  Chú ý: ây là phong cách lp trình tt, do khi tong hieu ch khai báo, bi n vn có mt giá tr nào ó , int x; int x;  Chú ý: tên bi n s nên gi ngh a và ng n gn x = x + 1; cout << x; Gi i Thi u L p Trình 16 Gi i Thi u L p Trình 17 3
  10.  Bi n s: giá tr có th thay i trong quá trình  Cú pháp : tênBi ến = giáTr ị; ch y ch ư ng trình tênBi ến = bi ểuTh ức;  Hng s: giá tr không ư c phép thay i nh ư  Ví d: x = 24; bi n s, nu thay i, dch báo li x = (x * 24) / y;  Ví d: s ngày trong mt tu n, s nm trong  Th c hi n xác nh gt-P ca phép gán (tính mt tháng, tc ánh sáng, s pi, s e toán giá tr ca bi uTh c) sau ó gán giá tr ó  Hng s ph i có giá tr ngay khi khai báo và s cho gt-T ca phép gán dng t khóa const  Chú ý: const double PI = 3.14159;  gt-T ca phép gán ph i là mt bi n s const double SOL = 1.079e+9;  Ki u d li u ca gt-P ph i gi ng ki u d li u gt-T Gi i Thi u L p Trình 18 Gi i Thi u L p Trình 19 ơ  Giá tr thu c mt ki u d li u có th ư c Ki ểu Độ Lớn Mi ền Giá Tr ị chuy n sang giá tr thu c mt ki u d li u khác bool 1 byte úng ho c sai  Ví d: 1 → 1.0 ho c 1.0 → 1 (true, false)  2 cách:  T ng bi C++  Các phép toán so sánh và các phép toán lô-gic int x = 1.0; double y = 1.0; double y = 1; int x = y; tr v giá tr ki u lô-gic.  Ch ng bi lp trình viên int x = (int)1.0; double y = 1.0; double y = (double)1; int x = (int)y;  Lưu ý: chuy n i ki u làm thay i chính xác ca giá tr . S dng cn th n Gi i Thi u L p Trình 20 Gi i Thi u L p Trình 21 Phép Toán Toán Tử Ví Dụ Kết qu ả a b Ho c || false Ln hn > false false || false 1 > 2 !a Ln hn a >= b Ph nh ! false >= false !true ho c bng 1 >= 2 a == b Bng == 1 == 2 false Không bng a != b != true (khác) 1 != 2 Gi i Thi u L p Trình 22 Gi i Thi u L p Trình 23 4
  11. ư a b a && b a b a || b  Xác nh th t tính giá tr bi u th c false false false false false false Độ Ưu Tiên Toán Tử false true false false true true Cao nh t ++ , , ! true false false true false true *, /, % true true true true true true +, - , >= == , != int a = 0; bool b; && b = (false) && (1/a); cout  Chuy n sang ngôn ng lp trình, cn có #include  Tên hàm, danh sách bi n s double x = sqrt(9); // x = 3.0  Ki u d li u ca hàm và bi n s double y = pow(3, 2); // y = 9.0  nh ngh a ca hàm da trên danh sách bi n s int z = rand();  S dng câu lnh return tr v giá tr ca hàm sau khi tính Gi i Thi u L p Trình 26 Gi i Thi u L p Trình 27 , = + 2 + + 4  Lp trình viên có th t nh ngh a các hàm  Tên hàm: f hu ích, ph c v mc ích c th da trên yêu  Danh sách bi n s: a, b cu bài toán  Ki u d li u: int  Các hàm t nh ngh a nm :  nh ngh a ca hàm:  Ngoài và tr ư c int main()  S dng câu lnh return tr v giá tr ca 1 #include hàm sau khi tính 2 3 int hieu(int a, int b) int f(int a, int b) 4 { { 5 return a – b; return a^3 + 2*a^2*b + 3*a*b^2 + 4*b^3; 6 } } 7 int main() { } Gi i Thi u L p Trình 28 Gi i Thi u L p Trình 29 5
  12. 1 #include 2  S dng cout > , cerr > a; std::cin >> b;  S nguyên trong các h c s khác (8, 16) 9 while (a != b) 10 {  Các toán t gán ph c hp += , -=, *= , /= , %= 11 if (a > b) a = hieu(a, b) ;  Các toán t tng/gi m mt n v ++ , 12 else b = hieu(b, a) ; 13 }  Các hàm toán hc trong cmath , cstdlib 14 std::cout << "UCLN: " << a << std::endl;  T nh ngh a mt s hàm n gi n 15 return 0; 16 } Gi i Thi u L p Trình 30 Gi i Thi u L p Trình 31  Làm quen vi CodeBlock và các ch c nng h biên so n ca CodeBlock  Làm các bài tp trên codehub.now-ip.org  c sách:  Ch ư ng 2, Lp Trình C Bn C++ Gi i Thi u L p Trình 32 6
  13.  Bi u th c lô-gic  Lu ng iu khi n  Cu trúc la ch n:  if  if else  switch ư Gi i Thi u L p Trình 1 o o  Các phép toán logic Phép Toán Toán Tử Ví Dụ Kết qu ả a b Ln hơn > false  úng (true ), sai (false ) 1 > 2 Ln hơn a >= b  >= false Chuy n i ki u d li u: ho c bng 1 >= 2  Không (0, 0.0 ) là sai (false ) a == b Bng == false  Khác không là úng (true ) 1 == 2 Không bng a != b  Sai (false ) là 0 != true (khác) 1 != 2  úng (true ) là 1 Gi i Thi u L p Trình 2 Gi i Thi u L p Trình 3 o o ư a b a && b a b a || b Phép Toán Toán Tử Ví Dụ Kết qu ả false false false false false false a && b false true false false true true Và && true && true true a || b true false false true false true Ho c || false false || false true true true true true true !a Ph nh ! !true false int a = 0; bool b; b = (false) && (1/a); cout << b; b = (true) || (1/a); cout << b; Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  14. o  Xác nh th t tính giá tr bi u th c  Th t các mnh lnh ch.tr. th c hi n Độ Ưu Tiên Toán Tử  Th t ơ n gi n: tu n t ++ , , ! Cao nh t  Th c hi n theo th t vi t trong mã ngu n *, /, % +, -  Th t mnh lnh ph thu c d li u u vào , >=  Ví d: nh p 2 s nguyên dươ ng thì tính ucln, nu == , != không, không tính, in ra thông báo, và dng ch.tr. &&  Cn la ch n mnh lnh nào th c hi n ||  iu khi n mã ngu n ch y nh ư th nào Th p nh t =, += , -=, *= , /= , %= x + 1 > 2 || x + 1 2) || (( x + 1 ) SO_GIO_LAM_QUY_DINH) // thân if { MệnhL ệnh; int luongTangThem = MUC_LUONG_CO_BAN * 0.5 * (soGioLam - SO_GIO_LAM_QUY_DINH); luong = luong + luongTangThem; } } else { // thân else MệnhL ệnh; } Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  15. if else if else  Cú pháp :  Ví d: if ( Bi ểuTh ứcLôgic ) { bool hocCaiThien; // thân if if (diemSo = 80) xepHang = 'A'; bool hocCaiThien = false; else if (diemSo >= 70) if (diemSo = 60) hocCaiThien = true; xepHang = 'C'; } else if (diemSo >= 50) else xepHang = 'D'; { else if (diemSo >= 40) hocCaiThien = false; xepHang = 'E'; } Gi i Thi u L p Trình 14 Gi i Thi u L p Trình 15 if else if else char xepHang = 'F'; char xepHang = 'F'; if (diemSo >= 80) if (diemSo >= 80) xepHang = 'A'; { else xepHang = 'A'; if (diemSo >= 70) } S dng xepHang = 'B'; else { else { if (diemSo >= 60) if (diemSo >= 70) xepHang = 'C'; { } else xepHang = 'B'; mã ngu n if (diemSo >= 50) } d c, xepHang = 'D'; else d g li else { if (diemSo >= 40) xepHang = 'E'; } } Gi i Thi u L p Trình 16 Gi i Thi u L p Trình 17 3
  16. if else if else char xepHang = 'F'; if (x > 5) if (diemSo >= 80) if (y > 5) xepHang = 'A'; std::cout 5"; soDiemA = soDiemA + 1; else else std::cout = tuoi && tuoi >= 150) Gi i Thi u L p Trình 22 Gi i Thi u L p Trình 23 4
  17. switch switch  Cú pháp :  Cú pháp : switch ( Bi ểuTh ức) switch ( Bi ểuTh ức) { { case HằngS ố1: CụmM ệnhL ệnh1; break; case HằngS ố2: CụmM ệnhL ệnh2; break; } case HằngS ố3: CụmM ệnhL ệnh2; break;  Ý ngh a:  Mnh lnh case ư c xét t trên xu ng default: CụmM ệnhL ệnhM ặcĐị nh; }  Giá tr HằngS ố c a case nào ng v i giá tr c a Bi ểuTh ức, CụmM ệnhL ệnh ca case ó th c hi n  Lưu ý: ki u ca Bi ểuTh ức là ki u s nguyên  Khi gp break , thì thoát kh i cu trúc switch (bool , char , int , short , long )  Th c hi n CụmM ệnhL ệnhM ặcĐị nh nu không có case nào tươ ng ng Gi i Thi u L p Trình 24 Gi i Thi u Lp Trình 25 switch switch  Ví d:  Nu không có break s th c hi n các case ti p theo n khi nào gp break thì thoát kh i switch int ngay; std::cin >> ngay; int ngay; std::cin >> ngay; switch (ngay) switch (ngay) { { case 2: std::cout > thang; std::cin >> nam; switch (comboKFC) switch (thang) { { case 1: std::cout << "ga popcorn 10k"; break; case 2: case 2: std::cout << "2 canh 1 nuoc 50k"; break; soNgay = (nam % 4 == 0 && case 3: std::cout << "2 canh 2 dui 100k"; break; (nam % 100 != 0 || nam % 400 == 0)) ? case 4: std::cout << "A U C E 200k"; break; 29 : 28; break; default: std::cout << "clean the kitchen"; case 4: case 6: case 9: case 11: } soNgay = 30; break; default: soNgay = 31; break; } Gi i Thi u L p Trình 28 Gi i Thi u L p Trình 29 5
  18. o  c sách:  Ch ươ ng 3, Lp Trình Cơ Bn C++ Gi i Thi u L p Trình 30 6
  19. ộ  Cu trúc lp:  for  while  do while ớ ệ ậ ấ ặ ườ ạ ọ ệ Gi i Thi u L p Trình 1 ấ ề ể ặ ấ ặ ớ ạ  Mô hình hành ng lp mt s ln c nh  Xét bài toán in ra 3 du sao  In ra “teacher is so cool” 10 ln std::cout << "*"; std::cout << "*";  Ch y hàm tính im sinh viên 1000 ln std::cout << "*";  Ch y 5 vòng quanh sân vn ng  Xét bài toán in ra 4 du sao  S ln lp có th không bi t std::cout << "*";  Qu y súp cho n khi c std::cout << "*";  Nh p vào mt s nguyên dơ ng std::cout << "*";  Ch n mt s ng u nhiên ti khi trúng th ng std::cout << "*";  Tơ ng ng vi lp gi i hn (trên) và lp không  Xét bài toán in ra N du sao gi i hn (d i) std::cout << "*"; ? Gi i Thi u L p Trình 2 Gi i Thi u L p Trình 3 ấ ặ ớ ạ ấ ặ ớ ạ for  Mô hình hành ng lp:  Cú pháp : for ( MệnhL ệnh1; Bi ểuTh ứcLôgic; MệnhL ệnh2 )  Da trên s ln lp N {  Có th cn mt bi t m bt u t 0 // thân vòng lặp  Tng bi t m thêm 1 sau mi ln lp }  Khi ó lp li hành ng, ví d std::cout << "*";  MệnhL ệnh1 kh i to bi n m (bi n iu khi n)  Ch th c hi n mt ln duy nh t khi bt u lp  Cho n khi bi t m ti giá tr ca N  MệnhL ệnh2 thay i bi n m (bi n iu khi n)  Và dng li  Bi ểuTh ứcLôgic iu khi n quá trình lp (vi iu ki n nào thì ti p tc lp) Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  20. ấ ặ ớ ạ for ấ ặ ớ ạ for  Cú pháp :  Ví d: for ( MệnhL ệnh1; Bi ểuTh ứcLôgic; MệnhL ệnh2 ) // i là bi ến đế m (bi ến điều khi ển) { for (int i = 0; i 0; i = i - 1)  Bi n lu tng kh i to ngoài cu trúc lp {  Bi n iu khi n kh i to trong cu trúc lp tinhDiem(); }  Khi nào thì in ra tng  Kt thúc vòng lp, in ra tng (nh yêu cu) for (int i = 0; i < 5; i = i + 1)  Thân vòng lp {  Cng s nguyên dơ ng ti p theo vào tng ch ạy 5 vòng quanh sân vận độ ng;  } Khi nào thì k t thúc l p  Cng xong N s nguyên dơ ng (bi n iu khi n) Gi i Thi u L p Trình 8 Gi i Thi u L p Trình 9 ấ ặ ớ ạ for ấ ặ ớ ạ for  In ra tng ca N s nguyên dơ ng u tiên  In ra tích ca N s nguyên dơ ng u tiên int tong = 0; int tich = 1; for (int i = 1; i <= N; i = i + 1) for (int i = 1; i <= N; i = i + 1) { { tong = tong + i; tich = tich * i; } } std::cout << tong; std::cout << tich; Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  21. ấ ặ ớ ạ ấ ặ ớ ạ ụ  Nu s nh p vào khác 0, cng vào tng và in  Nu s nh p vào khác 0, cng vào tng và in ra tng hi n ti, ví d ra tng hi n ti Nh p s (0 kt thúc): 5  Khi nào vòng lp bt u Tng = 5  Nh p vào mt s Nh p s (0 kt thúc): -2  Cu i cùng vòng lp làm gì Tng = 3  Nh p vào mt s Nh p s (0 kt thúc): 6  Khi nào k t thúc vòng l p  Khi s nh p vào bng 0 Tng = 9  Mnh lnh c lp Nh p s (0 kt thúc): 0  Cng s va nh p vào tng Khác bi t: không bi t bao nhiêu ln lp  Sau ó in ra tng hi n th i Gi i Thi u L p Trình 12 Gi i Thi u L p Trình 13 ấ ặ ớ ạ while ấ ặ ớ ạ while  Cú pháp :  Cú pháp : // kh ởi tạo bi ến điều khi ển while (Bi ểuTh ứcLôgic ) while ( Bi ểuTh ứcLôgic ) { { // thân vòng lặp // thân vòng lặp } // thay đổ i giá tr ị bi ến điều khi ển  Ý ngh a: } 1. Kh i to bi n iu khi n 2. Nu Bi ểuTh ứcLôgic úng  Bi ểuTh ứcLôgic iu khi n quá trình lp (vi iu 3. Mnh lnh trong thân vòng lp th c hi n ki n nào thì ti p tc lp) 4. Thay i giá tr bi n iu khi n 5. Quay li b c 2 6. Nu không (Bi ểuTh ứcLôgic sai), kt thúc lp Gi i Thi u L p Trình 14 Gi i Thi u L p Trình 15 ấ ặ ớ ạ while ấ ặ ớ ạ while  Nh p s khác 0, tính tng và in ra tng hi n ti  Ch n mt s ng u nhiên ti khi trúng th ng int soLanChoi = 1; int tong = 0; // bi ến tính tổng int kq = taoSoNgauNhien(XO_SO); int duDoan; std::cin >> duDoan; int input; // bi ến điều khi ển bool trungThuong = kq == duDoan; std::cin >> input; while (!trungThuong) while (input != 0) { { soLanChoi = soLanChoi + 1; tong = tong + input; kq = taoSoNgauNhien(XO_SO); std::cout > duDoan; std::cin >> input; trungThuong = kq == duDoan; } } Gi i Thi u L p Trình 16 Gi i Thi u L p Trình 17 3
  22. ấ ặ ớ ạ do while ấ ặ ớ ạ do while  ôi khi cn th c hi n thân vòng lp tr c khi  Cú pháp : ki m tra iu ki n lp // kh ởi tạo bi ến điều khi ển do { do // thân vòng lặp { // thay đổ i giá tr ị bi ến điều khi ển nh t mt lá bài } while ( Bi ểuTh ứcLôgic ); } while ( lá bài không ph i ch t cơ);  Bi ểuTh ứcLôgic iu khi n quá trình lp (vi iu ki n nào thì ti p tc lp)  Lu ý: cu i cùng ca mnh lnh while là du “;” Gi i Thi u L p Trình 18 Gi i Thi u L p Trình 19 ấ ặ ớ ạ do while ấ ặ ớ ạ do while  Cú pháp :  Yêu cu nh p vào mt s nguyên dơ ng do int input; { // thân vòng lặp do } while ( Bi ểuTh ứcLôgic ); { std::cin >> input;  Ý ngh a: } while (input > input;  Th ng dùng khi bi t chính xác s ln lp } while (input > input;  Linh ho t nh t while (input > input; }  do while  Kém linh ho t int input; std::cin >> input; for ( ; input > input; } Gi i Thi u L p Trình 22 Gi i Thi u L p Trình 23 4
  23. ấ ặ ỗ ườ ặ ấ ặ ỗ ườ ặ  Vòng lp vô hn  Vòng lp vô hn  Cu trúc while , có du “;”  Khi N l ho c âm while (input > input; { } std::cout > soND; } while (soND > soND; std::cin >> soND; if (soND <= 0) if (soND <= 0) { { continue; break; } } tong = tong + soND; tong = tong + soND; dem = dem + 1; dem = dem + 1; } } std::cout << tong; std::cout << tong << " " << dem; Gi i Thi u L p Trình 28 Gi i Thi u L p Trình 29 5
  24. ệ ệ break continue ụ ảo  Nh p vào 4 s nguyên dơ ng, và tính tng. Nu nh p vào s âm dng, in s các s  c sách: int soND, tong = 0, dem = 0;  Ch ơ ng 3, Lp Trình Cơ Bn C++ while (dem > soND; if (soND > 0) { tong = tong + soND; dem = dem + 1; } else { // ? } } std::cout << tong << " " << dem; Gi i Thi u L p Trình 30 Gi i Thi u L p Trình 31 6
  25. Ni Dung  Khái ni m chung  nh ngh a hàm  S dng hàm  Truy n tham s  Ph m vi bi n Gi i Thi u Lp Trình Hàm – Cơ Bn TS. Lê Nguyên Khôi Tr ng Đi hc Công ngh , ĐHQGHN Gi i Thi u L p Trình 1 Khái Ni m Chung Khái Ni m Chung  Gi i quy t mt bài toán ph c tp  Chia nh bài toán, ví du:  Chia nh bài toán ban u thành bài toán nh hơn,  Cho dài 3 on th ng, 3 on th ng này to ơ n l, d gi i quy t thành tam giác gì?  X lý tng bài toán nh ln lư t  3 on th ng có to thành tam giác?  Kt hp li gi i bài toán ban u  3 on th ng này có to thành tam giác u?  Ngôn ng lp trình bc cao  3 on th ng này có to thành tam giác cân?  Cung cp công c phân tách và x lý bài toán nh (kh i lp ghép - mô-un hóa ch ươ ng trình)  3 on th ng này có to thành tam vuông?  Li ích   Tái s dng mã, d qu n lý  3 on th ng này có to thành tam giác vuông cân?  Tránh các on mã gi ng nhau lp i lp li  Tìm li, g li d dàng, nhanh chóng Gi i Thi u L p Trình 2 Gi i Thi u L p Trình 3 Khái Ni m Chung Hàm (Ph ơ ng Th c)  Tái s dng mã, ví du:  Hàm (ph ươ ng th c) là mt kh i các câu lênh  Tính ưc chung ln nh t ca 2 s nguyên dươ ng (ph i) ư c t tên, th c hi n thao tác ã  Ki m tra 2 s nguyên t cùng nhau ư c xác nh tr ư c  Ti gi n phân s  Hàm là mt cách hu hi u cu trúc ch ươ ng  Ki m tra 2 s có chia ht cho nhau trình và x lý:  on mã ư c dùng li nhi u ln  Hàm ã s dng  Hàm tính cn bc 2 ( sqrt(x) )  Hàm tính s m (pow(x,y))  Hàm to s ng u nhiên (rand() ) Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  26. Hàm – Đc Đi m Hàm – Tính  Th c hi n mt s thao tác và cung cp kt qu  D li u u vào  Ví d: cn bc 2 ( sqrt(x) )  2 s (int , double , ) t tên x, y  D li u u vào: mt s  D li u tr v  Thao tác: tính cn bc hai  1 s (int , double , ) t tên ketQua  D li u tr v: cn bc hai ca s  Thao tác  Dng chung  Th c hi n phép nhân lp i lp li  Có th cn d li u u vào  Ví d: 2 =16=2∗2∗2∗2  Th c hi n mt s thao tác  Tên hàm  Có th tr v d li u sau x lý  power  thu n ti n, các thao tác ư c t tên, tên hàm Gi i Thi u L p Trình 6 Gi i Thi u L p Trình 7 Đnh Nghĩa Hàm Trong C++ Đnh Nghĩa Hàm Trong C++  Cú pháp : int main() Ki ểuDLTr ảVề TênHàm (DanhSáchDL Đầ uVào ) { { return 0; // danh sách các mệnh lệnh } // thân hàm }  S dng câu lnh return tr v kt qu ca hàm  Ki u ca d li u tr v (Ki ểuDLTr ảVề)  Th c hi n câu lnh return tr v kt qu ca hàm,  int , double , char , kt thúc các thao tác ca hàm  Nu hàm không tr v gì, ki u d li u tr v void  Thông th ư ng return là câu lnh cu i cùng trong  Tên hàm (TênHàm ): ph i có thân hàm ( nh ngh a ca hàm)  Danh sách d li u u vào (DanhSáchDL Đầ uVào )  Ki u d li u tr v khi s dng câu lnh return ph i Ki uDLTr V  Danh sách tham s (tham s cng có ki u) gi ng vi ki u d li u tr v ca hàm ( ể ả ề) Gi i Thi u L p Trình 8 Gi i Thi u L p Trình 9 Hàm – Tính V Trí Đt Đnh Nghĩa Hàm int power(int x, int y)  Hàm ph i ư c nh ngh a tr ư c khi s dng {  Thông th ư ng nh ngh a hàm t tr ư c ( int ketQua = 1; if (y == 0) return 1; trên và ngoài) int main() có th s while (y > 0) dng trong int main() { ketQua = ketQua * x; int power( ) { } y = y – 1; } int main() return ketQua; { } = power( ); return 0;  Ví d: power(2,4) tr v kt qu 16 } Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  27. S Dng Hàm S Dng Hàm int power(int x, int y) { } int A() { B(); } int B() { A(); } int main() { int main() int a, b; cin >> a >> b; { int kq = power(a, b); cout > power(a, b); Gi i Thi u L p Trình 12 Gi i Thi u L p Trình 13 Khai Báo – Đnh Nghĩa Hàm Ch Ký Hàm // khai báo hàm tr ướ c int main() // khai báo hàm tr ướ c int main() int A(); int A() ; int B(); int B() ; int main() { return 0; } int main() { return 0; } // đị nh ngh ĩa hàm sau int main() // đị nh ngh ĩa hàm sau int main() int A() { B(); } int A() { B(); } int B() { A(); } int B() { A(); }  C++ cho phép khai báo hàm tr ư c khi s dng  B i ph n { } ca nh ngh a hàm  Sau khi khai báo hàm, nh ngh a hàm có th t bt  B i ; ca khai báo hàm k âu, tr ư c/sau int main()  Ph n còn li (ki u tr v, tên, danh sách tham s) ca  Nên s dng cách này hàm gi ng ht nhau c nh ngh a và khai báo Gi i Thi u L p Trình 14 Gi i Thi u L p Trình 15 Hàm – Tính Nhân (Tr V int ) Hàm – Tính Nhân (Tr V void ) ỉ ử ụ ộ ỉ ử ụ ộ int multiply(int x, int y) void multiply(int x, int y) { { int ketQua = 0; int ketQua = 0; for (int i = x; i > 0; i ) for (int i = x; i > 0; i ) ketQua = ketQua + y; ketQua = ketQua + y; return ketQua; cout > a >> b; int a, b; cin >> a >> b; cout << "tich 2 so la: " << multiply(a,b); multiply(a,b); return 0; return 0; } } Gi i Thi u L p Trình 16 Gi i Thi u L p Trình 17 3
  28. Hàm – Không Có Tham S Hàm – Có Tham S void square() void square(char c) { { for (int i = 3; i > 0; i ) { for (int i = 3; i > 0; i ) { for (int j = 3; j > 0; j ) for (int j = 3; j > 0; j ) cout > soLuong; int soLuong; cin >> soLuong; char c; cin >> c; for (int i = soLuong; i > 0; i ) square(); for (int i = soLuong; i > 0; i ) square(c); return 0; return 0; } } Gi i Thi u L p Trình 18 Gi i Thi u L p Trình 19 Hàm – Nhi u Tham S Xác Đnh Lo i Tam Giác void square(char c, int n) {  Cho dài 3 on th ng, 3 on th ng này to for (int i = n; i > 0; i ) { thành tam giác gì? for (int j = 3; j > 0; j ) cout > cot; char c; cin >> c; for (int i = hang; i > 0; i ) square(c,cot); return 0; } Gi i Thi u L p Trình 20 Gi i Thi u L p Trình 21 Xác Đnh Lo i Tam Giác Xác Đnh Lo i Tam Giác ạ a ạ a ề bool laTamGiac(double a, double b, double c) bool laTamGiacD(double a, double b, double c) { { return (a < b + c return (a == b && b == c); && b < c + a } && c < a + b); } int main() { int main() { return 0; } return 0; } Gi i Thi u L p Trình 22 Gi i Thi u L p Trình 23 4
  29. Xác Đnh Lo i Tam Giác Xác Đnh Lo i Tam Giác ạ a ạ a bool laTamGiacC(double a, double b, double c) bool laTamGiacV(double a, double b, double c) { { return (a == b double sqrCanhA = a * a; || b == c double sqrCanhB = b * b; || c == a); double sqrCanhC = c * c; } return (sqrCanhA == sqrCanhB + sqrCanhC || sqrCanhB == sqrCanhC + sqrCanhA int main() || sqrCanhC == sqrCanhA + sqrCanhB); { } return 0; int main() } { return 0; } Gi i Thi u L p Trình 24 Gi i Thi u L p Trình 25 Xác Đnh Lo i Tam Giác ạ a Xác Đnh Lo i Tam Giác bool laTamGiacVC(double a, double b, double c) {  Cho dài 3 on th ng, 3 on th ng này to return (laTamGiacV(a, b, c) thành tam giác gì? && laTamGiacC(a, b, c)); }  3 on th ng có to thành tam giác?  3 on th ng này có to thành tam giác u? int main() {  3 on th ng này có to thành tam giác cân?  3 on th ng này có to thành tam vuông? return 0;  3 on th ng này có to thành tam giác vuông cân? }  Suy lu n lô-gic:  Có cn ki m tra là tam giác tr ư c khi xác nh lo i ca tam giác không? Gi i Thi u L p Trình 26 Gi i Thi u L p Trình 27 Nh p 2 S Nguyên Dơ ng Nh p 2 S Nguyên Dơ ng int main() void nhapSoND(int soND) { { int a, b; do { cin >> soND; } while (soND > a; } while (a > b; } while (b <= 0); int main() return 0; { } int a, b; nhapSoND(a); nhapSoND(b); return 0; }  Ch ươ ng trình ch y không úng, giá tr nh p vào không ư c gán cho bi n, các bi n ch ưa ư c nh p d li u  Do cách truy n tham s ch ưa úng Gi i Thi u L p Trình 28 Gi i Thi u L p Trình 29 5
  30. Truy n Tham S Cho Hàm Truy n Tham S Cho Hàm ề ị void nhapSoND(int soND) {  Truy n giá tr : do { cin >> soND; } while (soND > soND; } while (soND 0; i ) return 0; ketQua = ketQua + y; } }  Chính bi n a ư c truy n vào trong hàm nhapSoND int main()  Nh ưng ư c lưu dư i mt tên khác (soND ) trong hàm { nhapSoND int a, b, tich; cin >> a >> b; multiply(a, b, tich);  Thay i giá tr bi n soND trong hàm nhapSoND cout << "tich 2 so la: " << tich;  S làm thay i giá tr bi n a trong hàm main return 0; }  Do th c ch t là mt bi n, vi tên khác nhau, trong hàm main là a, trong hàm nhapSoND là soND Gi i Thi u L p Trình 32 Gi i Thi u L p Trình 33 Mt S Nguyên Tc Quy Tc Ph m Vi  Tt c các hàm trong C++ u ngang cp  Ph m vi ư c xác nh bt u t { n }  Hàm không ư c khai báo lng vi nhau  ư c áp dng hàm ( nh ngh a hàm), các cu trúc  Th t khai báo không quan tr ng iu khi n (thân cu trúc) và các kh i lnh {}  Hàm có th nh n và x lý nhi u tham s ho c  Bi n ư c khai báo trong ph m vi nào ch có không có tham s nào th ư c s dng trong ph m vi ó  Hàm có th tr v mt (ho c không ) giá tr  Kt thúc mt ph m vi ( }), tt c các bi n va  Ph i truy n y s lư ng tham s và úng ư c khai báo trong ph m vi ó s b xóa ki u khi gi hàm, nu không s li dch  Có th khai báo các bi n cùng tên trong các  Bi n khai báo trong hàm nào ch có ph m vi ph m vi khác nhau trong hàm ó, không s dng ư c nh ng  Các bi n này là bi n cc b bi n này trong các hàm khác  Duy trì iu khi n trong ni b ph m vi Gi i Thi u L p Trình 34 Gi i Thi u L p Trình 35 6
  31. Quy Tc Ph m Vi Tham Kh o  Ph m vi toàn cc  c sách:  Bi n ư c khai báo bên ngoài main , và ngoài tt c các hàm  Ch ươ ng 4, Lp Trình Cơ Bn C++  Bi n này s ư c hi u và có th dùng mi nơi trong ch ươ ng trình  Hn ch dùng, d gây li không áng có khi thay i giá tr bi n không cn th n  Th ư ng khai báo hng s có ph m vi toàn cc mi hàm u hi u Gi i Thi u L p Trình 36 Gi i Thi u L p Trình 37 7
  32. Nội Dung  Khái ni m chung  Truy n m ng vào hàm  Lp trình v i m ng Gi ới Thi ệu Lập Trình Cấu Trúc M ảng TS. Lê Nguyên Khôi Tr ườ ng Đại học Công ngh ệ, ĐHQGHN Gi i Thi u L p Trình 1 Đặt V ấn Đ ề Khái Ni ệm Chung  Ki n th c v ki u và bi n không bi u  Mng m t chi u là chu i d li u có cùng ki u di n, x lý nh ng ki u d li u ph c t p, ví d :  t t i các ô nh liên ti p trong b nh  Danh sách im thi c a m t sinh viên  Mi ph n t m ng có m t ch s riêng bi t  Danh sách sinh viên c a l p h c  S d ng ch s nh v & truy c p ph n t  Cn l ưu tr và x lý m t chu i d li u cùng ki u  Ví d : im thi 5 môn c a sinh viên l ưu tr  Sp x p, tìm ki m, tính toán trên chu i d li u trong m ng có 5 ph n t (m ng diemSo )  Ngôn ng l p trình (C++) cung c p các ki u d ỉ ố 0 1 2 3 4 li u có c u trúc x lý các v n trên Ch s Dữ li ệu 45 60 77 72 83  Trong ó m ng là c u trúc d li u thông d ng nh t  Mng trên có 5 ph n t , l ưu d li u ki u int ,  Mng dùng l ưu tr d li u cùng ki ểu ch s b t u t 0 n 4 Gi i Thi u L p Trình 2 Gi i Thi u L p Trình 3 Khái Ni ệm Chung Truy C ập M ảng Ch ỉ số 0 1 2 3 4 Ch ỉ số 0 1 2 3 4 Dữ li ệu 45 60 77 72 83 Dữ li ệu 45 60 77 72 83  Các ph n t c a m ng có th coi là bi n s tên  S d ng tên m ng và ch s ph n t diemSo[0] , diemSo[1] , diemSo[2] , diemSo[3] , diemSo[2] = 74; // 77 -> 74 diemSo[4] , có ki u d li u int // v i i=1, câu l nh sau -> diemSo[3] = 75  Ch s ph n t t trong ngo c vuông ( [] ) diemSo[i+2] = 75; // 72 -> 75  Truy c p ph n t m ng, s d ng : // th c hi n tính toán  Tên m ng ( diemSo ) tb = (diemSo[2] + diemSo[3]) / 2;  Và ch s ph n t là m t giá tr nguyên hay bi u th c giá tr nguyên //in ra 45 và 83 cout << diemSo[0] << " " << diemSo[4]; Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  33. Khai Báo Nh ập D ữ Li ệu  Mng ph i ư c khai báo tr ư c khi s d ng  Mng sau khi khai báo, có th ư c nh p d  Khi khai báo ph i quy nh s ph n t m ng li u, và th c ti n tính toán trên d li u m ng  Cú pháp : const int SO_MON_HOC = 5; int main() Ki ểuDL TênM ảng [SốPh ầnT ử]; {  Ví d : int diemSo[SO_MON_HOC]; double tongDiem = 0.0; int diemSo[5]; for (int i = 0; i > diemSo[i]; ư int tongDiem += diemSo[i]; l u tr giá tr ki u }  Lưu ý : cout > diemSo[i];  Truy c p vào các ch s không h p l , ví d } int main() { diemSo[-1] , diemSo[SO_MON_HOC]: int diemSo[SO_MON_HOC];  Truy c p ra vùng b nh ngoài m ng nhapMang(diemSo); return 0;  Không gây l i cú pháp (l i d ch) }  Có th gây l i khi ch y ch ươ ng trình  Mng ư c truy n theo ki u tham chi u, nh ưng không  Ch ươ ng trình ch y sai s d ng toán t &  Dng t ng t  Lp trình viên có trách nhi m ki m soát giá tr ch s  Hàm thay i giá tr trong m ng, k t thúc hàm, m ng thay i Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  34. Truy ền M ảng Cho Hàm Xâu Ký T ự  Nu không mu n hàm thay i giá tr trong m ng, s  Ki u d li u xâu ký (th ư vi n string ca C++) dng khai báo h ng s trong ch ký hàm i v i m ng  Xâu ký t là m t chu i các ký t , k t thúc '\0'  Thay i giá tr ph n t m ng (gán, nh p) gây l i d ch int main() double dtb( const int diemSo[], int soPT) { { double tong = 0.0; char ten1[20] = {'L','e',' ','B','e','\0'}; for (int i = 0; i > ten1; } cin.getline(ten2, 15, '\n'); int main() { return 0; int diemSo[SO_MON_HOC]; } nhapMang(diemSo); cout > a[i];  Sp x p d li u } void inMang(const int a[], int soPhanTu){  Thêm & lo i d li u for (int i = 0; i = 0 && a[i] != k) i ; while (i >= 0 && a[i] != k) i ; return (i >= 0); return i; } } Gi i Thi u L p Trình 16 Gi i Thi u L p Trình 17 3
  35. Sắp X ếp L ựa Ch ọn Sắp X ếp L ựa Ch ọn  Ln l p 1:  Coi m ng là 2 ph n:  Tìm ph n t nh nh t c a m ng  Ph n u: các ph n t ã ư c s p x p úng ch  i ch v i ph n t u tiên  Ph n sau: các ph n t còn l i c n ư c s p x p  Ln l p 2:  Mt giá tr ch s xác nh im phân cách 2 m ng  Tìm ph n t nh th 2 ca m ng  Lp  i ch v i ph n t th 2  ư  Ln l p 3: Tìm ph n t nh nh t trong m ng ch a s p x p  Tìm ph n t nh th 3 ca m ng  i ch lên u m ng ch ưa s p x p  i ch v i ph n t th 3  Tng giá tr ch s lên 1 Gi i Thi u L p Trình 18 Gi i Thi u L p Trình 19 Sắp X ếp L ựa Ch ọn Thêm & Lo ại D ữ Li ệu void sapXepLuaChon(int a[], int soPT) {  t v n : for (int i = 0; i < soPT – 1; i++) {  Sinh viên ng ký l p môn h c // tìm ch s ph n t có giá tr nh nh t  Sinh viên l n l ư t ng ký (thêm vào danh sách) int minI = i;  Sinh viên rút kh i l p môn h c (lo i kh i danh sách) for (int j = i + 1; j < soPT; j++) ư if (a[j] < a[minI]) minI = j;  Kích th c c a danh sách l p môn h c ban u  S l ư ng sinh viên th c s c a l p môn h c // i ch lên u m ng ch ưa s p x p int tmp = a[i]; a[i] = a[minI]; a[minI] = tmp; } } Gi i Thi u L p Trình 20 Gi i Thi u L p Trình 21 Thêm & Lo ại D ữ Li ệu Thêm Dữ Li ệu  Thêm hay lo i d li u trong m ng làm thay i  Mng ch ưa s p x p ư s ph n t m ng, không thay i kích th c  Thêm vào cu i cùng, sau ph n t cu i cùng  Bi n s qu n lý s ph n t th c s c a m ng  S d ng bi n s qu n lý s ph n t th c s  Bi n s này trong kho ng ch s h p l c a m ng  Nu m ng ch ưa y, thêm ư c, tr v úng  Ch ươ ng trình ph i qu n lý bi n s này bool them(int a[], int & soPT, int k) {  Thêm d li u if (soPT < SO_SINH_VIEN) {  Tng s ph n t m ng a[soPT] = k; soPT++;  Ph i ki m tra m ng có y hay không return true;  Lo i d li u }  Gi m s ph n t m ng else { return false;  Ph i ki m tra ph n t có trong m ng hay không } } Gi i Thi u L p Trình 22 Gi i Thi u L p Trình 23 4
  36. Lo ại D ữ Li ệu Thêm Dữ Li ệu  Mng ch ưa s p x p  Mng ã s p x p  Ph n t b lo i có ch s là i (c n ph i tìm tr ư c)  Sau khi thêm m ng v n ph i ư c s p x p  i ch ph n t này v i ph n t cu i cùng  Tìm v trí thêm khóa k  S d ng bi n s qu n lý s ph n t th c s  Bt u t v trí ó lùi các ph n t ra sau m t ch s bool loai(int a[], int & soPT, int i) { bool them(int a[], int & soPT, int k) { if (soPT = soPT) { if (soPT < SO_SINH_VIEN) { return false; // tìm v trí thêm k (index) } // lùi các ph n t ra sau, sau ó else { dsmssv[index] = k; // o ch a[i] và a[soPT-1] soPT++; soPT ; return true; return false; } } return false; } } Gi i Thi u L p Trình 24 Gi i Thi u L p Trình 25 Lo ại D ữ Li ệu Mảng Nhi ều Chi ều  Mng ã s p x p  Trò ch ơi c ca rô  Sau khi lo i m ng vn ph i ư c s p x p  Xem mã ngu n  Tìm v trí lo i khóa k  Bt u v trí ó ti n các ph n t lên tr ư c mt ch s bool loai(int a[], int & soPT, int k) { if (soPT < 0) return false; // tìm v trí thêm k (index) // ti n các ph n t ra tr ư c soPT ; return true; } Gi i Thi u L p Trình 26 Gi i Thi u L p Trình 27 Tham Kh ảo  c sách:  Ch ươ ng 5, Lp Trình Cơ Bn C++ Gi i Thi u L p Trình 28 5
  37.  Mng ký t (th ư vi n cstring )  Lp string y ư Gi i Thi u L p Trình 1 cstring cstring  Mng d li u ki u char  Khai báo char s[10];  Mi ký t là m t ph n t trong m ng  Dùng s l ưu "hi you" , s trông nh ư sau s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]  Thêm 1 ký t cu i cùng: '\0' (ký t null) 'h' 'i' ' ' 'y' 'o' 'u' '\0' ???  ánh d u k t thúc xâu  Kh i t o char s[10] = "hi you";  Ví d :  s lưu "hi you" , s trông nh ư sau  Xâu "hello" lưu d ư i d ng cstring s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]  Khai báo char s[10]; , s lưu 9 ký t và '\0' 'h' 'i' ' ' 'y' 'o' 'u' '\0' '\0' '\0' '\0'  Lưu xâu s d ng m ng không y:  Kh i t o char s[] = "hi you";  Khai báo m t m ng “ l n” l ưu xâu  s lưu "hi you" , s trông nh ư sau  Ký t null ( '\0' ) ánh d u k t thúc xâu s[0] s[1] s[2] s[3] s[4] s[5] s[6] 'h' 'i' ' ' 'y' 'o' 'u' '\0' Gi i Thi u L p Trình 2 Gi i Thi u L p Trình 3 cstring cstring  Kh i t o char s[6] = "hi you";  Có th dùng cout in ra xâu ký t nh ư các  Mng s có 6 ph n t , dùng l ưu xâu có 6 ký t , bi n thu c ki u d li u c ơ b n thêm ký t k t thúc xâu, 7 ký t  In ra n khi nào g p ký t k t thúc xâu u tiên  Li d ch: m ng s không b nh l ưu xâu  Nu không có ký t k t thúc xâu  Kh i to char s[] = "hi you";  In h t các ph n t c a m ng  s lưu "hi you" , s trông nh ư sau  Ti p t c in ký t các ô nh ti p theo s[0] s[1] s[2] s[3] s[4] s[5] s[6]  n khi nào g p ký t k t thúc xâu (giá tr 0 ki u int ) 'h' 'i' ' ' 'y' 'o' 'u' '\0' cout << s; s[0] s[1] s[2] s[3] s[4] s[5] s[6] 'h' 'i' '\0' 'y' 'o' 'u' '\0'  Nu gán s[6]='!'; , s không có ký t k t thúc xâu  In ra "hi"  Nu gán s[2]='\0'; , s có 2 ký t k t thúc xâu cout << s; s[0] s[1] s[2] s[3] s[4] s[5] s[6]  In ra "hi you? " 'h' 'i' ' ' 'y' 'o' 'u' '?' Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  38. cstring cstring  Có th dùng cin nh p d li u cho xâu ký  Không th s d ng toán t gán ( =) và toán t t, n khi g p d u cách thì d ng so sánh v i xâu ký t ki u m ng (== )  S d ng getline c c ký t d u cách  S d ng hàm sao chép xâu strcpy char s[80]; strcpy(s, "Hello"); cin.getline(s, 80);  S d ng hàm sao so sánh xâu strcmp strcmp(s1, s2)  Ti th ư vi n cstring s d ng các hàm làm vi c v i xâu ký t ki u m ng Gi i Thi u L p Trình 6 Gi i Thi u L p Trình 7 cstring string  Tr v dài c a xâu strlen  Ti th ư viên string strlen("Hello") tr v 5  Các thao tác trên xâu ki u string gi ng nh ư  Ghép xâu strcat trên các ki u d li u c ơ b n strcat(s1, "Hello") thêm "Hello" vào cu i s1 string s1, s2, s3; cin >> s1; cin >> s2; s3 = s1 + s2; cout << s3; s3 = "Hello Mom!" getline(cin, s3); Gi i Thi u L p Trình 8 Gi i Thi u L p Trình 9 string cstring a  Chuy n i ki u d li u  Tìm hi u các hàm thao tác v i xâu ký t ki u  T cstring sang i t ư ng string (h p l ) char ư cstring char aCString[] = "My C-string"; m ng trong th vi n string stringVar;  Tìm hi u các hàm thao tác v i xâu ký t ki u stringVar = aCstring; i t ư ng string trong th ư vi n string  T i tư ng string sang cstring (không h p l) aCstring = stringVar;  Không t ng chuy n sang cstring  Ph i t chuy n s d ng hàm sao chép strcpy strcpy(aCString, stringVar.c_str()); Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  39. Ni Dung  Lu ng Nh p/Xu t  Tp Nh p/Xu t  Ký T Nh p/Xu t  Công c cho Lu ng Nh p/Xu t  S d ng tên t p cho d li u vào Gi i Thi u Lp Trình  nh d ng d li u ra, cài t c Lu ng D Li u & T p  Tp truy c p ng u nhiên TS. Lê Nguyên Khôi Tr ư ng Đi hc Công ngh , ĐHQGHN Gi i Thi u L p Trình 1 Gi i Thi u Lu ng D Li u  Lu ng d li u (stream)  Chu i các ký t  i t ư ng c bi t  Lu ng vào (input stream)  Dùng nh p/xu t d li u c a ch ươ ng trình  Nh p vào ch ươ ng trình  Tp Nh p/Xu t dùng:  T bàn phím   Nh p d li u t t p vào ch ươ ng trình T t p  Lu ng ra (output stream)  Xu t d li u t ch ươ ng trình ra t p  Xu t ra kh i ch ươ ng trình  Ra màn hình  Ra tp Gi i Thi u L p Trình 2 Gi i Thi u L p Trình 3 S Dng Lu ng D Li u Tp Văn B n  Chúng ta ã s d ng lu ng  c t t p  cin  Khi nh p d li u cho ch ươ ng trình  i t ư ng lu ng nh p k t n i v i bàn phím  Ghi vào t p  cout  Khi ch ươ ng trình xu t d li u  i t ư ng lu ng xu t k t n i v i màn hình  Bt u t u n cu i tp  nh ngh a các lu ng khác  Có nhi u cách th c ( c/ghi) khác  nh p/xu t cho t p  Truy c p t p v n b n ơ n gi n  S d ng tươ ng t cin , cout Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  40. Kt N i T p V i Ch ươ ng Trình Th ư Vi n T p Nh p/Xu t  Phi kt n i t p v i i t ư ng lu ng  Cho phép nh p/xu t d li u t /ra t p:  Vi nh p d li u: #include  Tp là i t ư ng ifstream using namespace std;  Vi xu t d li u:  Tp là i t ư ng ofstream ho c  Các l p ifstream và ofstream #include  ư c nh ngh a trong th ư vi n fstream using std::ifstream; using std::ofstream;  Có trong không gian tên std Gi i Thi u L p Trình 6 Gi i Thi u L p Trình 7 Khai Báo Lu ng S Dng Lu ng D Li u  Khai báo lung gi ng nh ư b t c bi n nào:  Sau khi khai báo s d ng nh ư cin ifstream inStream; ifstream inStream; ofstream outStream; inStream.open("infile.txt"); int soThuNhat, soThuHai;  Sau ó k t n i v i tp: inStream >> soThuNhat; inStream.open("infile.txt"); inStream >> soThuHai;  Th c hi n thao tác m t p  Tươ ng t lu ng xu t (gi ng cout )  S d ng hàm thành viên open ofstream outStream; outStream.open("outfile.txt"); ư  Có th ch nh ng d n hoàn ch nh outStream << "soThuNhat = " << soThuNhat; outStream << " soThuHai = " << soThuHai;  Ghi d li u ra t p Gi i Thi u L p Trình 8 Gi i Thi u L p Trình 9 Tên T p Đóng T p  i v i ch ươ ng trình, t p có 2 tên:  Tp nên ư c óng l i  Tên t p ngo i vi  Khi ch ươ ng trình hoàn t t c/ghi d li u  Tên t p trên cng, ôi khi ư c g i tên t p th c  óng k t n i gi a lu ng & t p  S dng m t l n trong ch ươ ng trình (khi m t p)  Ví d:  Ví d : infile.txt , outfile.txt inStream.close();  Tên lu ng outStream.close();  Tên t p trong ch ươ ng trình  Không có tham s  S dng tên này cho t t c các ho t ng c/ghi  Tp t ng óng khi k t thúc ch ươ ng trình  Ví d : inStream , outStream Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  41. Nh p/Xu t D Li u S Dng T p Ghi D Li u Vào T p ifstream inStream;  Th ư ng m t t p ư c m là m t t p r ng ofstream outStream;  Nu t p t n ti, toàn b d li u b xóa inStream.open("infile.txt");  M t p chèn vào cu i t p (s d ng c ): outStream.open("outfile.txt"); ofstream outStream; int so1, so2, so3; outStream.open("outfile.txt", ios::app ); inStream >> so1 >> so2 >> so3;  Nu t p không t n ti, to tp m i outStream > tenTep;  Hàm thành viên precision(x) ifstream inStream;  Ph n th p phân d ư i d ng "x" s sau d u “.” inStream.open(tenTep);  Hàm thành viên setf()  Linh ho t h ơn i v i tên t p là bi n ư c  Cho cài t nhi u nh dng nh p t bàn phím khi ch y ch ươ ng trình  Có th s d ng cho b t c lu ng xu t nào  i v i lu ng cho t p, hàm thành viên gi ng i t ư ng cout Gi i Thi u L p Trình 16 Gi i Thi u L p Trình 17 3
  42. Tham Kh o  c sách:  Ch ươ ng 8, Lp Trình Cơ Bn C++  Tìm hi u th ư vi n iomanip  Các nh d ng xu t d li u  Tìm hi u thao tác v i t p truy c p ng u nhiên  Hi u qu cho c ơ s d li u l n Gi i Thi u L p Trình 18 4
  43. Nội Dung  Con tr  Bi n ki u con tr  Qu n lý vùng nh  Toán t con tr  Mng ng Gi ới Thi ệu Lập Trình  Khai báo & s d ng Con Tr ỏ  Các phép toán v i con tr TS. Lê Nguyên Khôi Tr ườ ng Đại học Công ngh ệ, ĐHQGHN Gi i Thi u L p Trình 1 Gi ới Thi ệu Bi ến Con Tr ỏ  nh ngh a:  Con tr là “ki u d li u”  a ch vùng nh máy tính c a m t bi n  Ki u a ch vùng nh  Vùng nh máy tính  Có th dùng bi n l ưu giá tr ki u con tr  Chia nh thành các byte  Không ph i ki u int , double  ánh s th t l n l ư t (h 16)  a ch c a vùng nh dùng l ưu d li u ki u  a ch ư c s d ng làm tên cho bi n int , double  Con tr ã s d ng  Ví d : double * p;  Truy n tham s theo ki u tham chi u Khai báo p là bi n ki u con tr double  a ch c a tham s ư c truy n Lưu a ch vùng nh ki u double Gi i Thi u L p Trình 2 Gi i Thi u L p Trình 3 Bi ến Con Tr ỏ – Khai Báo Địa Ch ỉ & S ố Nguyên  Khai báo con tr gi ng bi n ki u d li u khác  Con tr là a ch  Thêm * vào tr ư c tên bi n  a ch là s nguyên  Ký hi u * ph i t tr ư c m i bi n con tr  Con tr KHÔNG là s nguyên  Ví d : int *p1, *p2, v1, v2;  C++ ép con tr ph i ư c s d ng nh ư a ch  p1 , p2 bi n ki u con tr int  Không th ư c s d ng nh ư s nguyên  v1 , v2 bi n ki u int  Mc dù ó là s nguyên!!!  S d ng p1 , p2 lưu a ch các bi n ki u int  S d ng p1 , p2 lưu a ch ca v1 , v2 Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  44. Toán T ử & Toán T ử *  Toán t & tr v a ch c a bi n  Toán t * truy xu t giá tr c a vùng nh ư c p v1 1 { qu n lý (l ưu) b i con tr 2 int *p, v1, v2; 0x44ab12 10 p v1 1 { 3 v1 = 10; v2 = 20; 0x44ab12 2 int *p, v1, v2; 0x44ab12 10 4 p = &v1; p v2 3 v1 = 10; p = &v1; 0x44ab12 5 p = &v2; 0x22ff32 4 cout << *p; 6 } 20 p v2 5 v2 = 20; p = &v2; 0x22ff32 0x22ff32 6 cout << *p; 20  Dòng 4: t bi n con tr p ch t i bi n v1 7 } 0x22ff32  p bng a ch c a v1  Dòng 4: in ra 10 (giá tr bi n v1 , mà p ch t i)  Dòng 5: t bi n con tr p ch t i bi n v2  Dòng 6: in ra 20 (giá tr bi n v2 , mà p ch t i)  p ch ti v1 Gi i Thi u L p Trình 6 Gi i Thi u L p Trình 7 Toán T ử = Toán T ử =  Gán giá tr  Gán con tr 0x22ff32 p v1 p v1 1 { 1 { 2 int v1 = 10, v2 = 20; 0x44ab12 10 20 2 int v1 = 10, v2 = 20; 0x44ab12 10 3 int *p = &v1; 0x44ab12 3 int *p = &v1; 0x44ab12 4 int *p = &v2; q v2 4 int *p = &v2; q v2 5 *p = *q; 5 p = q; 0x22ff32 0x22ff32 6 } 20 6 } 20 0x22ff32 0x22ff32  Dòng 3, 4: p ch t i v1 , q ch t i v2  Dòng 3, 4: p ch t i v1 , q ch t i v2  Dòng 5: s d ng toán t * truy c p vùng t i  Dòng 5: gán p bng q nh con tr qu n lý  p không qu n lý v1  *p là v1 , *q là v2 , dòng 5 tươ ng ươ ng v1 = v2;  p và q cùng qu n lý v2 Gi i Thi u L p Trình 8 Gi i Thi u L p Trình 9 Bài T ập Toán T ử new i  S d ng toán t new t o m t vùng nh m i 0x2232 1 { cho con tr , vùng nh này không có tên 2 int i = 10, j = 20, k; j int * p = new int; 3 int *p = &i; 0x7756 4 int *q = &j;  Kh i t o m t vùng nh m i cho con tr p, giá 5 *p += 1; k tr t i vùng nh này không bi t 6 p = &k; 0x9948 7 *p = *q; 8 p = q; p int * p = new int(10); 9 *p = i; 0x16aa 0 }  Kh i t o mt vùng nh m i cho con tr p, giá p tr t i vùng nh này ư c kh i t o là 10 0x64cc Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  45. Bài T ập Toán T ử delete p1 ? p1 ?  S d ng toán t delete gi i phóng vùng p2 ? p2 ? nh ng ư c t o ra b i toán t new 1 { { 2 int *p1, *p2; p1 p1 int * p = new int; 3 p1 = new int; 10 10 p2 ? p2 4 *p1 = 10; delete p; 5 p2 = p1; ? 6 *p2 = 20; p1 p1 } 7 p1 = new int; 20 20 8 *p1 = 30; p2 p2  Lưu ý: ch gi i phóng vùng nh ư c t o ra b i 9 } 30 new , không ph i xóa bi n con tr p p1 p2 20 Gi i Thi u L p Trình 12 Gi i Thi u L p Trình 13 Toán T ử delete Mảng Đ ộng  Vùng nh ng có th ư c tr v b i hàm  Bi n m ng th c ch t là bi n con tr int * f(int * q) {  Mng thông th ư ng ( int a[10] ) int * p = new int;  dài m ng c nh return p;  Không th thay i dài sau khi khai báo }  Có th coi là con tr h ng (con tr t nh)  Vùng nh ng ch ư c gi i phóng khi s  Mng ng ( int * a = new int[10]) dng delete , do ó vùng nh ng t o ra trong hàm không b xóa sau khi k t thúc hàm  dài m ng có th thay i sau khi khai báo  S d ng l i toán t new  Ch các bi n khai báo trong hàm b xóa, trong ó có bi n con tr p int * a = new int[10]; a = new int[50]; Gi i Thi u L p Trình 14 Gi i Thi u L p Trình 15 Mảng Đ ộng – Mảng Tĩnh Nh ắc Lại: cstring & L ớp string int * a = new int[10]; char aCString[]; int * p; string stringVar;  a và p u là bi n con tr , nh ưng a là h ng  Chuy n cstring sang string (h p l )  Có th gán ( ư c phép) stringVar = aCString; p = a;  Chuy n string sang cstring (không h p l) p ch t i a ch mà a ang ch t i aCString = stringVar;  Nh ưng không ư c phép (l i d ch) a = p; a là h ng, không thay i giá tr c a a Gi i Thi u L p Trình 16 Gi i Thi u L p Trình 17 3
  46. Mảng Đ ộng Gi ải Phóng M ảng Động  Hn ch c a m ng thông th ư ng:  Cng ư c th c hi n khi ch y  Ph i khai báo dài tr ư c d = new double[10]; ớ  dài m ng có th không bi t t i khi ch y // thao tác v i d ch ươ ng trình delete [] d;  Ph i ư c l ư ng dài l n nh t  Gi i phóng t t c b nh cho m ng ng  Lãng phí b nh  [] thông báo gi i phóng b nh cho m ng  Mng ng  Vn ch t i vùng nh ó  Có th t ng và gi m khi c n thi t  Nên gán d = NULL; Gi i Thi u L p Trình 18 Gi i Thi u L p Trình 19 Bài T ập Hàm Tr ả Về Mảng  Ki u m ng không ư c phép là ki u tr v int a[10] = {2,3,5,1,4,7,0};  Không h p l int *p = a; int[] someFunction(); cout << a[0] << *p << "\n"; 2 2 p++;  Ph i tr v ki u con tr 3 1 cout << *p << p[2] << "\n"; int * someFunction(); 1 9 p++; a[2] = 0; 1 3 cout << p[1] << *p << "\n"; p -= 2; cout << p[3] << p[1] << "\n"; Gi i Thi u L p Trình 20 Gi i Thi u L p Trình 21 Con Tr ỏ Trong C++  Con tr là kh i ki n th c c bi t quan tr ng trong C++  Ph i n m v ng khái ni m con tr c ng nh ư thao tác v i con tr  Con tr s ư c s d ng trong các ki u d li u ph c t p  INT 2203 C u trúc D li u & Gi i thu t Gi i Thi u L p Trình 22 4
  47. Nội Dung  Cu trúc struct  Ki u d li u nhóm  nh ngh a  Khai báo / Kh i t o  S d ng Gi ới Thi ệu Lập Trình Cấu Trúc struct  Truy n bi n cho hàm TS. Lê Nguyên Khôi Tr ườ ng Đại học Công ngh ệ, ĐHQGHN Gi i Thi u L p Trình 1 Ki ểu D ữ Li ệu Nhóm Ki ểu DL C ấu Trúc struct  Ki u M ng:  Tp h p d li u, có th khác ki u, ư c nhóm  Tp h p d li u cùng ki u  Mi d li u ư c l ưu trong m t bi n (tr ư ng)  Khai báo sau ó s d ng nh ư bi n ơ n l  Mi d li u có ki u d li u c th  Truy n cho hàm: truy n a ch  H tr t ch c d li u ph c t p vào cùng m t  Ki u cu trúc struct : i t ư ng  Tp h p d li u có th khác ki u  H tr làm vi c gi a các d li u trên i t ư ng  Ph i nh ngh a tr ư c khi s d ng  Khai báo sau ó s d ng nh ư bi n ơ n l  Truy n cho hàm: gi ng bi n ơ n l Gi i Thi u L p Trình 2 Gi i Thi u L p Trình 3 Ki ểu DL C ấu Trúc struct – Ví D ụ Ki ểu DL C ấu Trúc struct –Định Nghĩa  nh ngh a b i t khóa struct  nh ngh a toàn c c Tên Tr ườ ng Ki ểu Dữ Li ệu Dữ Li ệu  ư int main() MSSV string 12345678 Ngoài và tr c HoTen string Trach Van Doanh  Tt c các hàm u hi u NgaySinh string 01/01/1999  Không ư c c p phát b nh GioiTinh bool true  Ch có m c ích miêu t c u trúc  Ch c p phát b nh  Khi khai báo bi n ki u c u trúc  Miêu t :  Các thành ph n (tr ư ng) và ki u c a chúng Gi i Thi u L p Trình 4 Gi i Thi u L p Trình 5 1
  48. struct sinhvien –Định Nghĩa struct sinhvien – Khai Báo/Kh ởi T ạo Tên Tr ườ ng Ki ểu Dữ Li ệu Dữ Li ệu struct sinhvien { MSSV string 12345678 string MSSV; string HoTen; HoTen string Trach Van Doanh string NgaySinh; NgaySinh string 01/01/1999 bool GioiTinh; GioiTinh bool true } ; struct sinhvien { int main() { string MSSV; struct sinhvien sv1; string HoTen; struct sinhvien sv2 = { "12345678" , string NgaySinh; "Trach Van Doanh" , "01/01/1999" , bool GioiTinh; true } ; } ; } Gi i Thi u L p Trình 6 Gi i Thi u L p Trình 7 Truy C ập Thành Ph ần struct Truy C ập Thành Ph ần struct – Ví D ụ  S d ng toán t ch m ( .) struct sinhvien { string MSSV; sv1 . MSSV string HoTen; sv1 . HoTen string NgaySinh; sv1 . NgaySinh bool GioiTinh; sv1 . GioiTinh } ; int main() {  Gi tên là “bi n thành ph n” struct sinhvien sv1;  Các thành ph n c a bi n ki u c u trúc sv1.MSSV = "12345678";  Ki u c u trúc struct khác nhau có th có cùng tên sv1.HoTen = "Trach Van Doanh"; bi n thành ph n sv1.NgaySinh = "01/01/1999";  Bi n thành ph n là bi n c c b sv1.GioiTinh = true; } Gi i Thi u L p Trình 8 Gi i Thi u L p Trình 9 struct ngaythangnam Cấu Trúc struct – Phép Gán struct ngaythangnam {  Vi c u trúc struct ngaythangnam int ngay; int thang;  Khai báo 2 bi n c u trúc int nam; struct ngaythangnam homQua, homNay; } ;  C 2 bi n u ki u struct ngaythangnam int main() {  ơ struct ngaythangnam homNay = {1, 4, 2000}; Th c hi n phép gán n gi n h p l struct ngaythangnam ngayMai; homQua = homNay; ngayMai.ngay = homNay.ngay + 1;  Sao chép giá tr bi n thành ph n homNay ca cho ngayMai.thang = homNay.thang; các bi n thành ph n c a homQua , t ươ ng ươ ng ngayMai.nam = homNay.nam; homQua.ngay = homNay.ngay; } homQua.thang = homNay.thang; homQua.nam = homNay.nam; Gi i Thi u L p Trình 10 Gi i Thi u L p Trình 11 2
  49. Cấu Trúc struct – Phép Toán Khác Truy ền Bi ến C ấu Trúc struct Cho Hàm  Các phép toán khác không ư c nh ngh a struct toado { int x, y; cho ki u c u trúc struct } ;  So sánh b ng/khác ( == , != ) (homQua == homNay bi u th c không h p l ) typedef struct toado ToaDo;  So sánh th t ( , ) void _nhapToaDo(ToaDo & td) { (homQua > td.x >> td.y;  Các phép toán } (homQua + homNay bi u th c không h p l ) void _inToaDo(const ToaDo & td) {  Nh p & in cout : _inToaDo ( *tdTrgD2 ) ;  kt hp con tr (*) v i truy c p tr ư ng (.) }  p->a tươ ng ươ ng (*p).a Gi i Thi u L p Trình 16 Gi i Thi u L p Trình 17 3
  50. struct thoigian struct thoigian Gi i Thi u L p Trình 18 Gi i Thi u L p Trình 19 struct sohuuti struct sohuuti Gi i Thi u L p Trình 20 Gi i Thi u L p Trình 21 struct dathuc struct dathuc Gi i Thi u L p Trình 22 Gi i Thi u L p Trình 23 4
  51. ộ  Nh ắc l ại Hàm – Cơ B ản  Nạp ch ồng hàm  Nạp ch ồng toán t ử ớ ệ ậ a ườ ạ ọ ệ Gi ới Thi ệu L ập Trình 1 ơ ả ơ ả ềa ố  Khai báo hàm  Truy ền giá tr ị int bin ( int , int ) ; int bin ( int , int ) ;  Đị ĩ nh ngh a hàm  Tạo và truy ền m ột b ản sao > t ốn chi phí int bin ( int so1 , int so2 ) {  Thay đổ i b ản sao , b ản g ốc ngoài hàm không đổ i // thân hàm miêu tả đị nh ngh ĩa // không khai báo l ại so1 , so2  Xóa b ản sao khi k ết thúc hàm }  Truy ền tham chi ếu  Ch ữ ký hàm int bin ( int , int ) int bin ( int & , int & ) ; ả ố đượ ề đị ỉ ả ố  Lời g ọi hàm  Chính b n g c c truy n ( a ch b n g c) int a = bin ( so1 , so2 ) ;  Thay đổ i trong hàm, b ản g ốc thay đổ i  Sử d ụng tên hàm, tên tham s ố, không có ki ểu  Không xóa b ản g ốc khi k ết thúc hàm Gi ới Thi ệu L ập Trình 2 Gi ới Thi ệu L ập Trình 3 ơ ả ử ụ const ạ ồa  Truy ền tham chi ếu  Các hàm th ực hi ện công vi ệc t ươ ng t ự int bin ( int & , int & ) ;  Trùng tên, nh ưng khác nhau v ề tham s ố đổ ả ố đổ  Thay i trong hàm, b n g c thay i  Số l ượ ng tham s ố  Không mu ốn hàm thay đổ i, s ử d ụng t ừ khóa const  Ki ểu tham s ố  Bảo v ệ d ữ li ệu, không cho thay đổ i, d ữ li ệu “ch ỉ-đọ c” đị đượ ọ int bin ( const int & , const int & ) ;  Xác nh hàm nào c g i:  Sử d ụng thông tin v ề tham s ố  Quy ướ c:  ố ượ ể ố  Luôn truy ền tham chi ếu S l ng & ki u tham s  Dữ li ệu không thay đổ i, dùng const  Ki ểu c ủa hàm  Dữ li ệu thay đổ i, không dùng const Gi ới Thi ệu L ập Trình 4 Gi ới Thi ệu L ập Trình 5 1
  52. ạ ồ ụ ạ ồ void _trungDiem ( const ToaDo & td1 ,  Khác s ố l ượ ng tham s ố const ToaDo & td2 , ToaDo & trungDiem ) {  Hàm tính t ổng các s ố truy ền vào trungDiem.x = ( td1.x + td2.x ) / 2;  Tính tổng 3 s ố nguyên trungDiem.y = ( td1.y + td2.y ) / 2; int _tong ( int , int , int ) ; }  Tính t ổng 2 s ố nguyên ToaDo * _trungDiem ( const ToaDo & td1 , int _tong ( int , int ) ; const ToaDo & td2 ) {  Tính t ổng 1 số nguyên ToaDo * trungDiem = new ToaDo; int _tong ( int ) ; (*trungDiem).x = ( td1.x + td2.x ) / 2; (*trungDiem).y = ( td1.y + td2.y ) / 2;  Dựa trên s ố l ượ ng tham s ố để g ọi hàm t ươ ng ứng return trungDiem; } Gi ới Thi ệu L ập Trình 6 Gi ới Thi ệu L ập Trình 7 ạ ồ ạ ồ  Tham s ố m ặc đị nh  Khác ki ểu tham s ố int _tong(int so1, int so2 = 0, int so3 = 0)  Hàm tính t ổng 2 s ố truy ền vào { int _tong ( int , int ) ; return so1 + so2 + so3; double _tong ( double , double ) ; }  Dựa trên ki ểu tham s ố để g ọi hàm t ươ ng ứng  Có th ể g ọi  Tại sao không s ử d ụng chuy ển đổ i ki ểu t ự độ ng _tong ( 1 , 2 , 3 )  Ki ểu tr ả v ề không đúng _tong ( 1 , 2 )  Nguy hi ểm _tong ( 1 )  _tong(1,2) gọi int _tong(int, int);  Có đị nh ngh ĩa hàm int _tong ( int , int )  _tong(1.0,2.0) gọi double _tong(double, double);  _tong ( 1 , 2 ) gọi hàm nào Gi ới Thi ệu L ập Trình 8 Gi ới Thi ệu L ập Trình 9 ạ ồ ử  Khác ki ểu tham s ố  Toán t ử th ực ch ất là hàm  Hàm tính t ổng 2 s ố truy ền vào  Sử d ụng toán t ử gi ống l ời g ọi hàm double _tong ( int , double ) ;  Viết theo m ột cách khác double _tong ( double , int ) ;  Ví d ụ: so sánh b ằng  Dựa trên ki ểu tham s ố để g ọi hàm t ươ ng ứng  1 == 2 th ực ch ất == ( 1 , 2 )  Sử d ụng chuy ển đổ i ki ểu t ự độ ng _tong ( 3 , 3 ) ho ặc _tong ( 3.5 , 3.5 )  Gọi hàm nào  Thêm đầ y đủ int _tong ( int , int ) ; double _tong ( double , double ) ; Gi ới Thi ệu L ập Trình 10 Gi ới Thi ệu L ập Trình 11 2
  53. ử ạ ồ ử ạ ồ  Gi ống nh ư hàm, toán t ử c ũng có th ể n ạp ch ồng struct PS { int ts , ms ; } ;  Đị nh ngh ĩa toán t ử cho ki ểu d ữ li ệu m ới bool operator == ( const PS & ,  Nạp ch ồng toán t ử so sánh cho ki ểu c ấu trúc const PS & ) ; struct PS { int ts , ms ; } ; bool operator != ( const PS & , bool operator == ( const PS & ps1 , const PS & ) ; const PS & ps2 ) { int main() { return ( ps1.ts * ps2.ms PS ps1 , ps2 ; == ps2.ts * ps1.ms ) ; // nh ập d ữ li ệu } if ( ps1 == ps2 ) bool operator != ( const PS & , if ( ps1 != ps2 ) const PS & ) ; } Gi ới Thi ệu L ập Trình 12 Gi ới Thi ệu L ập Trình 13 ử ạ ồ ử ạ ồ struct PS { int ts , ms ; } ; struct PS { int ts , ms ; } ; PS operator + ( const PS & ps1 , PS operator + ( const PS & ps , const PS & ps2 ) { const int & i ) { PS tongPS; PS tongPS; // c ập nh ật tongPS // c ập nh ật tongPS return tongPS; return tongPS; } } int main() { int main() { PS ps1 , ps2 , tongPS ; PS ps , tongPS ; tongPS = ps1 + ps2 ; tongPS = ps + 1 ; } } Gi ới Thi ệu L ập Trình 14 Gi ới Thi ệu L ập Trình 15 ử ạ ồ a ớ ệ ostream & operator << ( int _getMax(int so1 , int so2) { ostream & outStream , if (so1 < so2) return so2; const PS & ps ) { return so1; outStream << ps.ts << "/" << ps.ms ; } double _getMax(double so1 , double so2) { return outStream; if (so1 < so2) return so2; } return so1; int main() { } PS ps , tongPS ; PS _getMax(PS so1 , PS so2) { tongPS = ps + 1 ; if (so1 < so2) return so2; cout << tongPS; return so1; } } Gi ới Thi ệu L ập Trình 16 Gi ới Thi ệu L ập Trình 17 3
  54. a ớ ệ template T _getMax ( T so1 , T so2 ) { if ( so1 ( ps1 , ps2 ) ; } Gi ới Thi ệu L ập Trình 18 4