Giáo trình môn Phương pháp lập trình

pdf 127 trang phuongnguyen 3011
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình môn Phương pháp lập trình", để 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:

  • pdfgiao_trinh_mon_phuong_phap_lap_trinh.pdf

Nội dung text: Giáo trình môn Phương pháp lập trình

  1. TRNG I HC CÔNG NGHIP TP/HCM TRUNG TÂM CÔNG NGH THÔNG TIN -o0o- Giáo Trình PHNG PHÁP LP TRÌNH THÁNG 8/2008
  2. Giáo trình PP lp trình M C L C Ch ng 1: T NG QUAN V NGÔN NG LP TRÍNH C/C++ 4 1. Lch s ca ngôn ng lp trình C/C++ 4 2. Phng pháp  gi i quy t m t bài toán 4 3. Các b c trong chu trình phát tri n chng trình 5 4. Kh o sát m t chng trình C/C++ n gi n 7 5. Các chú thích (comments) 9 6. Cu trúc ca m t chng trình C/C++ 10 7. Các tp tin th vin thông dng 11 Ch ng 2: BIU THC 12 1. Ki u d liu (data types) 12 2. Các nh danh (Identifier names) 13 3. T khóa (keywords) 14 4. Bi n (variables) 14 5. T khóa const 17 6. Hng (constants) 17 7. Hng chui ký t (string constants) 18 8. Hng ký t c bit (escape sequences) 18 9. Toán t (operators) 19 10. Các toán t s hc (arithmetic operators) 22 11. Toán t ++ và (increment and decrement operators) 23 12. Toán t quan h & lun lý 24 13. Toán t ? (? operator) 26 14. Toán t sizeof 26 15. Toán t du phy (comma operator) 27 16. Bi u thc (expressions) 29 17. Chuy n i ki u trong các bi u thc 29 18. Ép ki u (casting) 30 19. Dng vi t tt ca câu lnh gán (shorthand assignments) 31 Ch ng 3: CÁC CU TRÚC I U KHIN 34 1. Gi i thiu 34 2. Cu trúc la chn if 35 3. Cu trúc la chn switch case 39 4. Các cu trúc lp (Loop structures) 44 5. Các lnh r nhánh và nh y 50 Ch ng 4: MNG 61 1. Gi i thiu M ng 61 2. M ng 1 chiu 61 TT.Công Ngh Thông Tin 2/127
  3. Giáo trình PP lp trình 3. M ng nhiu chiu 64 Ch ng 5: CON TR 71 1. Gi i thiu Con tr 71 2. Bi n con tr (pointer variables) 72 3. M t s ví d v con tr 75 4. Cp phát b nh  ng 75 5. Con tr void (void pointers) 78 6. Con tr null (Null pointers) 79 7. Con tr và m ng 80 8. M ng con tr 81 Ch ng 6: HÀM 83 1. Khái nim hàm 83 2. Dng tng quát ca hàm 84 3. Các qui tc v phm vi ca hàm 85 4. Tham s hình thc và tham s thc 85 5. Truyn m ng vào hàm 88 6. i s ca hàm main 89 7. Lnh return 90 8.  qui 92 9. Nguyên m!u hàm (function prototypes) 93 10. Cu trúc ca m t chng trình vi t d i dng hàm 94 Ch ng 7: CHUI KÝ T 96 1. Gi i thiu Chui 96 2. Khai báo và kh"i to chui 96 3. Nhp chui 97 4. Xut chui 97 5. M t s hàm th vin thao tác trên chui 97 6. M t s ví d v chui 98 7. M ng các chui 99 8. M ng con tr  n các chui 101 Ch ng 8: STRUCTURES – ENUM - typedef 105 1. Structures 105 2. Ki u lit kê (Enumerations, enum) 111 3. typedef 112 Ch ng 9: TP TIN 114 1. Streams và Files 114 2. Streams (dòng nhp xut) 114 3. Files 115 4. Truy xut file ng!u nhiên 124 5. Các stream chun 124 TT.Công Ngh Thông Tin 3/127
  4. Giáo trình PP lp trình Chng 1 T NG QUAN V NGÔN NG LP TRÌNH C/C++ 1. Lch s ca ngôn ng lp trình C/C++ C #c to b"i Dennis Ritchie " Bell Telephone Laboratories vào n$m 1972  cho phép lp trình viên phát tri n các ng dng hiu qu hn các ngôn ng lp trình hin có ti th%i i m ó. i m mnh và mm d&o ca C cho phép các nhà phát tri n " Bell Labs to nên các ng dng phc tp nh h iu hành Unix. Vào n$m 1983, hc vin chun quc gia M' (American National Standards Institute - ANSI) thành lp m t ti u ban  chun hóa C #c bi t  n nh ANSI Standard C. Ngày nay, tt c trình biên dch C/C++ u tuân theo ANSI Standard C. C++ #c xây dng trên nn t ng ca ANSI Standard C. C++ là m t ngôn ng lp trình h ng i t#ng mà bao hàm ngôn ng C " trong nó. Trong giáo trình này cha kh o sát ph(n lp trình h ng i t#ng ca C++. 2. Ph ng pháp  gii quyt mt bài toán M t chng trình máy tính #c thi t k  gi i quy t m t bài toán nào ó. Vì vy, nhng b c c(n  tìm ki m l%i gi i cho m t bài toán c)ng ging nh nhng b c c(n  vi t m t chng trình. Các b c g*m: - Xác nh yêu c(u ca bài toán. - Ngh+ ra m t phng cách (algorithm)  tìm l%i gi i. - Thc hin phng cách ó. - Ki m tra k t qu  xem l%i gi i có úng v i yêu c(u ca bài toán. TT.Công Ngh Thông Tin 4/127
  5. Giáo trình PP lp trình Khi vi t m t chng trình trong C/C++, ây là nhng b c #c  ngh: 1. Xác nh mc ích ca chng trình 2. Ngh+ ra thut toán phù h#p  gi i quy t bài toán (dùng mã gi , lu *, ) 3. Cài t (vi t) thut toán dùng ngôn ng lp trình C/C++ 4. Thc thi chng trình và ki m th (testing). 3. Các b c trong chu trình phát trin ch ng trình Chu trình phát tri n chng trình (program development cycle) có nhng b c sau ây. 1. M t trình son th o v$n b n #c dùng  nhp mã ngu*n (source code). 2. Mã ngu*n #c biên dch (compile)  to nên tp tin i t#ng (object file). 3. Các tp tin i t#ng #c liên k t (link)  to nên tp tin có th thc thi (executable file). 4. Thc hin (run) chng trình  ch, ra chng trình có làm vic úng nh ã nh không. Use (C-free, Borland C/C++ editor) editor Source code (.c; .cpp files) Compile (bc.exe) source file Object code (.h files) (.exe file) Library Link Executable files object file program TT.Công Ngh Thông Tin 5/127
  6. Giáo trình PP lp trình 3.1. So!n tho mã ngu"n (source code editor) Mã ngu*n là m t tp các lnh dùng  ch, d!n máy tính thc hin công vic mong mun. Tp tin mã ngu*n #c lu tr v i ph(n phân loi .c (C) hoc .cpp (C++). 3.2. Biên dch (compile) Tp tin mã ngu*n #c vi t bng nhng t ging ti ng Anh nên d- dàng  c và hi u. Tuy nhiên, máy tính không th hi u nhng t này. Máy tính yêu c(u các ch, d!n nh phân (binary) trong dng thc ca ngôn ng máy (machine language). Tr c khi m t chng trình #c vi t bng ngôn ng cp cao nh C/C++ có th thc thi trên máy tính, nó ph i #c biên dch t mã ngu*n sang mã máy. Vic dch này #c thc hin b"i m t chng trình gi là trình biên dch (compiler). Các ch, d!n ngôn ng máy #c to b"i trình biên dch #c gi là mã i t#ng (object code) và tp tin cha chúng gi là tp tin i t#ng. Tp tin i t#ng có cùng tên nh tp tin mã ngu*n nhng có ph(n phân loi .obj. 3.3. T!o tp tin th#c thi (executable files) C/C++ có m t th vin hàm cha mã i t#ng cho nhng hàm ã #c to s.n. Nhng hàm này thc hin các tác v th%ng dùng nh xóa màn hình (clrscr()), nhp m t chui ký t t bàn phím (gets()), tính c$n bc hai (sqrt()), mà chng trình #c vi t có th s dng mà không ph i vi t li. Tp tin i t#ng #c to ra b"i trình biên dch s k t h#p v i mã i t#ng ca các hàm th vin  to nên tp tin thc thi. Quá trình này #c gi là liên k t (linking), #c thc hin b"i m t chng trình gi là b liên k t (linker). TT.Công Ngh Thông Tin 6/127
  7. Giáo trình PP lp trình 3.4. Th#c thi ch ng trình Khi chng trình ngu*n #c biên dch và liên k t  to nên tp tin thc thi (có ph(n phân loi .exe), nó có th thc thi trên máy tính ti du nhc h thng. N u chng trình hot  ng không úng nh yêu c(u, vn  có th là do li lp trình. Trong tr%ng h#p này, ch,nh sa chng trình ngu*n, biên dch li và liên k t li  to nên phiên b n m i ca tp tin chng trình. Quá trình bn b c này #c lp i lp li cho  n khi tp tin thc thi thc hin úng yêu c(u ca bài toán. 4. Kho sát mt ch ng trình C/C++  n gin Kh o sát m t chng trình n gi n dùng  xut ra màn hình dòng ch Hello World! // my first program in C/C++ #include #include int main() { cout << "Hello World!"; //Output “Hello World!” getche(); return 0; } ây là chng trình n gi n nhng nó ã bao hàm nhng thành ph(n c b n mà mi chng trình C/C++ u có. V i ý ngh+a ca tng dòng nh sau: // my first program in C/C++ ây là dòng chú thích, tt c các dòng bt (u bng hai du // #c coi là các dòng chú thích, nó không nh h"ng  n hot  ng ca chng trình, ch, dùng  gi i thích mã ngu*n ca chng trình. TT.Công Ngh Thông Tin 7/127
  8. Giáo trình PP lp trình #include Các lnh bt (u bng du # #c dùng cho các ch, th tin x lý (preprocessor). Trong ví d này, câu lnh #include báo cho trình biên dch bi t c(n ph i g p th vin iostream.h là tp tin header chun ca C/C++, cha các nh ngh+a v nhp và xut. int main() nh ngh+a hàm main(). Hàm main() là i m mà tt c các chng trình C/C++ bt (u thc hin. Nó không ph thu c vào v trí ca hàm, n i dung ca nó luôn #c thc hin (u tiên khi chng trình thc thi. M t chng trình C/C++ u ph i t*n ti m t hàm main(). Hàm main() có th có hoc không có tham s. N i dung ca hàm main() ti p ngay sau ph(n khai báo chính thc #c t trong cp du ngoc { }. cout << "Hello World!"; ây là m t lnh nm trong ph(n thân ca hàm main. cout là m t dòng (stream) xut chun trong C/C++ #c nh ngh+a trong th vin iostream.h. Khi dòng lnh này #c thc thi, k t qu là chui "Hello World!" #c xut ra màn hình. Dòng lnh #c k t thúc bng du chm phy (;). getche(); ây là m t hàm th vin dùng  ch% nhp m t ký t t bàn phím. return 0; Lnh return k t thúc hàm main và tr v giá tr bi u thc i sau nó, trong tr%ng h#p này là 0. ây là m t k t thúc bình th%ng ca m t chng trình không có li trong quá trình thc hin. Chng trình trên có th vi t li nh sau: int main() { cout << " Hello World! "; getch(); return 0;} c)ng cho cùng m t k t qu . TT.Công Ngh Thông Tin 8/127
  9. Giáo trình PP lp trình 5. Các chú thích (comments) Các chú thích #c các lp trình viên s dng  ghi chú hay mô t trong các ph(n ca chng trình. Trong C/C++ có hai cách  chú thích: Chú thích dòng: dùng cp du //. T v trí //  n cui dòng #c xem là chú thích Chú thích khi (chú thích trên nhiu dòng) dùng cp /* */. Nhng gì nm gia cp du này #c xem là chú thích. Ví d: /* My second program in C/C++ with more comments Author: Novice programmer Date: 01/01/2008 */ #include #include int main() { cout << "Hello World! "; // output Hello World! cout << "I hate C/C++."; // output I hate C/C++. getche(); return 0; } K t qu xut ca chng trình là: Hello World! I hate C/C++. TT.Công Ngh Thông Tin 9/127
  10. Giáo trình PP lp trình 6. C$u trúc ca mt ch ng trình C/C++ Cu trúc m t chng trình C/C++ bao g*m các thành ph(n nh: Các ch, th tin x lý, khai báo bi n toàn cc, chng trình chính (hàm main), Kh o sát chng trình sau: /* fact.c Phn này th ng dùng mô Purpose: prints the factorials of   the numbers from 0 through 10 t m c ính ch ng trình, tác   Author: Mr.Beginner gi , ngày vi t, (Ph n không   Date: 01/01/2008 b t bu c) */ #include Khai báo các tp tin th vin Khai báo prototype ca các int factorial(int n); hàm t to int main() { int i; for(i=0; i<=10; i++) Hàm chính ca chng trình cout<<i<<“!=“<<factorial(i); return 0; } /* This function computes the factorial of its parameter, returning it */ int factorial(int n) { int i, product; product = 1; nh ngha các hàm do ng i for (i=2;i<=n;i++) prod *= i; dùng t xây dng return product; } TT.Công Ngh Thông Tin 10/127
  11. Giáo trình PP lp trình 7. Các tp tin th vi%n thông d&ng ây là các tp tin cha nh ngh+a các hàm thông dng khi lp trình C/C++. Mun s dng các hàm trong các tp tin header này thì ph i khai báo #include " ph(n (u ca chng trình, v i FileName.h là tên tp tin th vin. Các tp tin th vin thông dng g*m: stdio.h(C), iostream.h(C++) Tp tin nh ngh+a các hàm vào/ra chun (standard input/output) g*m các hàm xut d liu (printf())/cout), nhp giá tr cho bi n (scanf())/cin), nhn ký t t bàn phím (getc()), in ký t ra màn hình (putc()), nhp m t chui ký t t bàm phím (gets()), xut chui ký t ra màn hình (puts()), xóa vùng m bàn phím (fflush()), fopen(), fclose(), fread(), fwrite(), getchar(), putchar(), conio.h : Tp tin nh ngh+a các hàm vào ra trong ch  DOS (DOS console) g*m các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(), math.h: Tp tin nh ngh+a các hàm toán hc g*m các hàm abs(), sqrt(), log(), log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(), alloc.h: Tp tin nh ngh+a các hàm liên quan  n vic qu n lý b nh g*m các hàm calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), io.h: Tp tin nh ngh+a các hàm vào ra cp thp g*m các hàm open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(), TT.Công Ngh Thông Tin 11/127
  12. Giáo trình PP lp trình Chng 2 BIU THC (Expressions) Bi u thc #c to thành t nhng thành t nh d liu và toán t. D liu có th cha trong bi n hoc hng. Toán t trong các ngôn ng lp trình có cùng ý ngh+a nh trong toán hc. Có nhiu loi toán t nh toán t gán (=), toán t s hc (+ - * / %), toán t quan h (== >= !=), toán t lun lý (&& || !), 1. Kiu d li%u (data types) C/C++ có n$m ki u d liu c s": ký t (char), s nguyên (int), s thc (float), s thc có  chính xác gp ôi (double), và ki u vô nh (void). Tt c nhng ki u d liu khác u da trên 5 ki u c s" này. Kích th c và phm vi ca nhng ki u d liu này có th thay i tùy theo loi CPU và trình biên dch. Ki u char #c dùng  gi các giá tr ca b mã ASCII (Amercican Standard Code for Information Interchange). Ki u char chi m 1 byte b nh . Kích th c ca ki u int là 16 bits (2 bytes) trên môi tr%ng 16-bit nh DOS, Windows 3.1. Môi tr%ng 32-bit nh Windows 95, kích th c ki u int là 32 bits (4 bytes). Nói chung, tùy thu c môi tr%ng, kích th c ca ki u int có th khác nhau. Chun C ch, ra phm vi ti thi u ca ki u d liu s thc (float, double) là 1E-37  n 1E+37. Ki u void dùng  khai báo hàm không tr v giá tr hoc to nên các con tr tng quát (generic pointers). Ngoi tr ki u void, các ki u d liu c s" có th có các t nh signed, unsigned, long, short i tr c nó. Các t này làm thay i phm vi ti thi u mi ki u c s" có th cha. B ng sau trình bày tt c các k t h#p h#p l ca ki u d liu v i các t trên. TT.Công Ngh Thông Tin 12/127
  13. Giáo trình PP lp trình Kích th c Kiu d li%u Ph!m vi t(i thiu b'ng bits char 8 -127 to 127 unsigned char 8 0 to 255 signed char 8 -127 to 127 int 16 or 32 -32,767 to 32,767 unsigned int 16 or 32 0 to 65,535 signed int 16 or 32 ging nh int short int hoc short 16 -32,767 to 32,767 unsigned short int 16 0 to 65,535 signed short int 16 ging nh short int long int hoc long 32 -2,147,483,647 to 2,147,483,647 signed long int 32 ging nh long int unsigned long int 32 0 to 4,294,967,295 float 32 chính xác là 6 ký s double 64 chính xác là 10 ký s long double 80 chính xác là 10 ký s 2. Các nh danh (Identifier names) Trong C/C++, tên ca các bi n, hng, hàm, #c gi là nh danh. Nhng nh danh này có th là 1 hoc nhiu ký t. Ký t (u tiên ph i là m t ch cái hoc du _ (underscore), nhng ký t theo sau ph i là ch cái, ch s, hoc du _. Sau ây là nhng nh danh úng và sai: úng Sai count 1count test23 hi!there high_balance high balance C/C++ phân bit ký t HOA và th%ng. Vì vy, count, Count, và COUNT là 3 danh nh khác nhau. TT.Công Ngh Thông Tin 13/127
  14. Giáo trình PP lp trình nh danh không #c trùng v i các t khóa (keywords) và không nên có cùng tên nh các hàm th vin ca C/C++. 3. T) khóa (keywords) Là nhng t ã #c dành riêng b"i ngôn ng lp trình cho nhng mc ích riêng ca nó. Không #c dùng t khóa  t tên cho nhng nh danh nh bi n, hng, hàm, Tt c các t khóa trong C/C++ u là ch th%ng (lowercase). Sau ây là danh sách các t khóa ca C/C++: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 4. Bin (variables) M t bi n là nh danh ca m t vùng trong b nh dùng  gi m t giá tr mà có th b thay i b"i chng trình. Tt c bi n ph i #c khai báo tr c khi #c s dng. Dng khai báo bi n tng quát là: type variableNames; type: ph i là m t trong các ki u d liu h#p l. variableNames: tên ca m t hay nhiu bi n phân cách nhau b"i du phy. Ngoài ra, ta có th va khai báo va kh"i to giá tr ban (u cho các bi n dùng cú pháp sau: type varName1=value, , varName_n=value; Ví d: int i, j; // khai báo 2 bin i, j kiu int // khai báo ba bin day, month và year kiu short int short day, month, year; TT.Công Ngh Thông Tin 14/127
  15. Giáo trình PP lp trình char ch; // khai báo bin ch kiu ký t // khai bao 4 bien kieu float, gán average giá tr 0 float mark1, mark2, mark3, average = 0; Lu ý: Khi khai báo bi n n u không cung cp giá tr khi to thì giá tr ca bi n là cha xác nh. Do ó, vic dùng nhng bi n này trong các bi u thc là vô ngha. Bi n #c khai báo ti ba ni: bên trong hàm, trong nh ngh+a tham s ca hàm, và bên ngoài tt c hàm. Nhng bi n này #c gi l(n l#t là bi n cc b , các tham s hình thc, và bi n toàn cc. 4.1. Bin c&c b (local variables) Nhng bi n #c khai báo bên trong m t hàm gi là bi n cc b . Các bi n cc b ch, #c tham chi u  n ch, b"i nhng lnh nm trong khi (block) có khai báo bi n. M t khi bt (u v i du { và k t thúc v i du }. Bi n cc b ch, t*n ti trong khi khi cha nó ang thc thi và b hy khi khi cha nó thc thi xong. Ví d: Xem xét hai hàm sau: void func1(void) { int x; x = 10; } void func2(void) { int x; x = -199; } Bi n nguyên x #c khai báo 2 l(n, m t trong hàm func1() và m t trong hàm func2(). Bi n x trong func1() không có quan h gì v i bi n x trong func2() b"i vì mi x ch, t*n ti trong khi cha nó. TT.Công Ngh Thông Tin 15/127
  16. Giáo trình PP lp trình 4.2. Các tham s( hình th*c (formal parameters) N u m t hàm có nhn các i s truyn vào hàm thì nó ph i khai báo các bi n  nhn giá tr ca các i s khi hàm #c gi. Nhng bi n này gi là các tham s hình thc. Nhng bi n này #c i x ging nh các bi n cc b khác #c khai báo trong hàm. Xem xét ví d sau: int sum(int from, int to) { int total=0; for(int i=from ; i void increase(); void decrease(); int gVar = 100; void main() { cout << “Value of gVar= “ << gVar; increase(); cout << “\nAfter increased, gVar= “ << gVar; decrease(); cout << “\nAfter decreased, gVar= “ << gVar; } void increase() { gVar = gVar + 1;} TT.Công Ngh Thông Tin 16/127
  17. Giáo trình PP lp trình void decrease() { gVar = gVar -1;} Sau khi thc thi chng trình trên, k t qu xut trên màn hình là: Value of gVar= 100 After increased, gVar= 101; After decreased, gVar= 100; 5. T) khóa const Giá tr ca bi n có th thay i trong sut quá trình thc thi chng trình. giá tr ca bi n không b thay i, ta t tr c khai báo bi n t khóa const. T khi bi n ã có giá tr, giá tr này s không bao gi% b thay i b"i bt k/ lnh nào trong chng trình. Thông th%ng ta dùng ch HOA  t tên cho nhng bi n này. Ví d: khai báo hng nguyên MAX có giá tr 100 const int MAX = 200; 6. H'ng (constants) Hng là nhng giá tr c nh (fixed values) mà chng trình không th thay i. Bt k/ ki u d liu nào c)ng có hng tng ng. Hng còn #c gi là literals. Hng ký t #c bao quanh b"i cp du nháy n. Ví d 'a' và '%' là nhng hng ký t. Hng nguyên là nhng s mà không có ph(n thp phân. Ví d 100 và -100 là nhng hng nguyên. Hng s thc yêu c(u m t du chm thp phân phân cách ph(n nguyên v i ph(n thp phân. Ví d 123.45 là m t hng s thc. Ví d v cách vi t các loi hng s: Kiu d li%u Các ví d& v+ h'ng Ghi chú int 1, 123, 21000, 234 long int 35000L, 34l Có ký t l hoc L " cui unsigned int 10000U, 987u, 40000U Có ký t u hoc U " cui float 123.23f, 4.34e-3F Có ký t f hoc F " cui double 123.23, 1.0, 0.9876324 long double 1001.2L Có ký t l hoc L " cui TT.Công Ngh Thông Tin 17/127
  18. Giáo trình PP lp trình 7. H'ng chu,i ký t# (string constants) C/C++ cung cp m t lai hng khác gi là chui. M t chui là m t tp các ký t #c bao quanh b"i cp du nháy ôi. Ví d, "This is a string" là m t chui. Lu ý phân bit hng chui và hng ký t. M t hng ký t là m t ký t bao quanh b"i cp du nháy n. Do ó, 'a' là hng ký t nhng "a" là hng chui. 8. H'ng ký t# -c bi%t (escape sequences) C/C++ có nhng hng ký t c bit mà không th bi u di-n nh nhng hng ký t thông th%ng. Nhng hng này còn gi là escape sequences. Sau ây là danh sách các hng c bit ó: Mã Ý ngh.a \b Lùi sang trái 1 ký t \f V (u dòng \n Sang dòng m i \r Xung dòng \t Tab theo chiu ngang \" Du nháy ôi \' Du nháy n \0 Null \\ Du \ \v Tab theo chiu ng \a C nh báo \? Du hi \N Hng bát phân (v i N là m t hng bát phân) \xN Hng thp lc phân (v i N là m t hng thp lc phân) Xem xét ví d sau: \n #include Enter void main(void) { Items: cout <<"Items:\n"; Item1 cout <<”\tItem1\n”; output cout <<”\tItem2\n”; Item2 cout <<”\tItem3\n”; Item3 } tab \t TT.Công Ngh Thông Tin 18/127
  19. Giáo trình PP lp trình 9. Toán t (operators) C/C++ có bn loi toán t: s hc (arithmetic), quan h (relational), lun lý (logical), và toán t trên bit (bitwise). 9.1. Toán t gán (assignment operator) Dng tng quát ca toán t gán là variableName = expression; variableName: Tên bi n expression: Bi u thc Lu ý, phía bên trái du bng ph i là m t bi n hay con tr và không th là hàm hay hng. Ví d: total = a + b + c + d; 9.2. Chuyn /i kiu trong câu l%nh gán Khi nhng bi n ca m t ki u k t h#p v i nhng bi n ca m t ki u khác thì m t s chuy n i ki u x y ra. i v i câu lnh gán, giá tr ca bi u thc bên ph i du bng #c t  ng chuy n thành ki u d liu ca bi n bên trái du bng. Ví d: int i=100; double d = 123.456; N u thc thi lnh i = d; thì i s có giá tr là 123 vì 123.456 s t  ng chuy n thành s nguyên nên b ct b ph(n thp phân. S chuy n i ki u này gi là chuy n i ki u b mt mát thông tin. N u thc thi lnh TT.Công Ngh Thông Tin 19/127
  20. Giáo trình PP lp trình d = i; thì d s có giá tr là 100.0. S chuy n i ki u này gi là chuy n i ki u không mt mát thông tin. Tóm li, khi chuy n i ki u t ki u d liu có min giá tr nh sang ki u d liu có min giá tr l n hn thì vic chuy n i ki u này là an toàn vì không b mt mát thông tin. Th t t$ng d(n t ki u d liu có min giá tr nh  n ki u d liu có min giá tr l n là char  int  long  float  double. Khi chuy n i ki u d liu có min giá tr l n sang ki u d liu có min giá tr nh hn thì vic chuy n i ki u này là không an toàn vì có th mt mát thông tin. Th t gi m d(n t ki u d liu có min giá tr l n  n ki u d liu có min giá tr nh là double  float  long  int  char. Ví d: int i = 100; long l = 200; float f = 123.456f; double d = 1.23456789; Kh o sát các lnh gán sau: int n; long m; float p; double q; n = i + l + f + d; // (1) m = i + l + f + d; // (2) p = i + l + f + d; // (3) q = i + l + f + d; // (4) TT.Công Ngh Thông Tin 20/127
  21. Giáo trình PP lp trình (1) i l f d 100 200 123.456 1.23456789 double double double double 100.0 200.0 123.456 1.23456789 424.69056789 int n có giá tr là 424 (3) i l f d 100 200 123.456 1.23456789 double double double double 100.0 200.0 123.456 1.23456789 424.69056789 float  p có giá tr là 424.690567 TT.Công Ngh Thông Tin 21/127
  22. Giáo trình PP lp trình i l (4) f d 100 200 123.456 1.23456789 double double double double 100.0 200.0 123.456 1.23456789 424.69056789 q có giá tr là 424.69056789 K t lun: Tr%ng h#p (1) và (3): mt mát thông tin. Tr%ng h#p (4) không mt mát thông tin. 10. Các toán t s( h0c (arithmetic operators) Các toán t s hc g*m: + (c ng), - (tr), * (nhân), / (chia), và % (ly ph(n d ca phép chia nguyên). Khi t s và m!u s ca phép chia là s nguyên thì ó là phép chia nguyên nên ph(n d ca phép chia nguyên b ct b. Ví d, 5/2 thì k t qu là 2. Toán t ly ph(n d % (modulus operator) ch, áp dng v i s nguyên và tr v ph(n d. Ví d, 7%2 thì k t qu là 1. TT.Công Ngh Thông Tin 22/127
  23. Giáo trình PP lp trình 11. Toán t ++ và (increment and decrement operators) C/C++ có hai toán t rt th%ng dùng là ++ và . Toán t ++ c ng 1  n toán hng ca nó và toán t thì tr 1 t toán hng ca nó. Ví d: x++; // tuong duong x = x + 1; x ; // tuong duong x = x - 1; Toán t ++ và có th t phía tr c (prefix) hoc phía sau (postfix) toán hng. S khác nhau ca 2 tr%ng h#p này là khi toán t ++ và ng tr c toán hng, hành  ng t$ng và gi m trên toán hng #c thc hin tr c, sau ó giá tr m i ca toán hng s dùng  tham gia vào vic nh tr ca bi u thc. Ví d: Kh o sát on lnh sau int x = 100; int n,m; N u thc hin lnh: n = ++x + 1; // n s có giá tr là 102 (1) N u thc hin lnh: n = x++ + 1; // n s có giá tr là 101 (2) Sau khi lnh (1) hay (2) #c thc thi xong thì x có giá tr là 101 Tng t, n u thc hin lnh: m = x + 1; // n s có giá tr là 100 (3) N u thc hin lnh: m = x + 1; // n s có giá tr 101 (4) TT.Công Ngh Thông Tin 23/127
  24. Giáo trình PP lp trình Sau khi lnh (3) hay (4) #c thc thi thì x có giá tr là 99 Khi các toán t s hc xut hin trong m t bi u thc, thì  u tiên thc hin nh sau: Cao nht ++ – – – (du âm) * / % Thp nht + – Nhng toán t trên cùng hàng thì có cùng  u tiên. Khi bi u thc có nhiu toán t có cùng  u tiên thì th t nh tr bi u thc là t trái sang ph i. 12. Toán t quan h% & lun lý (relational & logical operators) Toán t quan h liên quan  n s quan h ca hai giá tr. Toán t lun lý liên quan  n s ni k t ca nhng quan h. Các bi u thc mà dùng toán t quan h và toán t lun lý #c nh tr là true (úng) hoc false(sai). Trong C/C++, giá tr 0 (zero) #c xem là false và giá tr khác 0 (non-zero) #c xem là true. Các toán t quan h g*m: Toán t Ý ngh.a > Ln hn >= Ln hn hay bng < Nh hn <= Nh hn hay bng == Bng (có 2 d u =) != Không bng Ví d v toán t quan h: 100 < 200 // true 200 == 300 // false 300 != 400 // true TT.Công Ngh Thông Tin 24/127
  25. Giáo trình PP lp trình 400 >= 500 // false Các toán t lun lý: Operator Action Ý ngh.a && AND Và || OR Ho c (có 2 d u |) ! NOT Ph nh B ng chân tr ca các toán t lun lý p q p && q p || q !p 0 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 C hai toán t quan h và lun lý có  u tiên thp hn toán t s hc. Trong m t bi u thc có th có nhiu loi toán t, th t  nh tr bi u thc da vào  u tiên ca toán t. thay i th t nh tr trong m t bi u thc, dùng cp du ngoc n () nh trong các bi u thc s hc. u tiên ca toán t quan h và lun lý: Cao nh$t ! > >= 9 && 8!=7) || (6 4) #c nh tr nh sau: (10>9 && 8!=7) && (6 4) 1 1 0 1 1 1 1 TT.Công Ngh Thông Tin 25/127
  26. Giáo trình PP lp trình K t qu nh tr bi u thc trên là 1 (true). 13. Toán t ? (? operator) Toán t ? là m t toán t ba ngôi do ó có ba toán hng. Dng tng quát ca toán t ? là: Exp1 ? Exp2 : Exp3; Exp1, Exp2, và Exp3 là các bi u thc. Toán t ? làm vic nh sau: (u tiên Exp1 #c nh tr. N u k t qu là true thì Exp2 #c nh tr và giá tr ca nó tr" thành giá tr ca c bi u thc. N u Exp1 là false thì Exp3 #c nh tr và giá tr ca nó tr" thành giá tr ca c bi u thc. Ví d: x = 10; y = x>9 ? 100*x : 200*x; Vì x>9 là true nên giá tr ca bi u thc s là 100*x. Vy y s có giá tr là 1000 14. Toán t sizeof sizeof là toán t m t ngôi mà tr v s byte ca ki u d liu chi m trong b nh . Mi môi tr%ng (h iu hành, loi CPU, ) dùng s byte khác nhau cho mi ki u d liu. Dng tng quát ca toán t sizeof sizeof(operand) operand: có th là tên ki u d liu, bi n, bi u thc. Ví d sau cho bi t s byte ca mi ki u d liu #include void main(void) { cout <<"Size of data types:\n"; cout <<"Size of char = " << sizeof(char) << ª bytes\nº; cout <<"Size of unsigned char = " << sizeof(unsigned char) << ª bytes\nº; cout <<"Size of signed char = " << sizeof(signed char) << ª bytes\nº; cout <<"Size of int = " << sizeof(int) << ª bytes\nº; cout <<"Size of unsigned int = " << sizeof(unsigned int) << ª bytes\nº; cout <<"Size of signed int = " << sizeof(signed int) << ª bytes\nº; cout <<"Size of short = " << sizeof(short) << ª bytes\nº; TT.Công Ngh Thông Tin 26/127
  27. Giáo trình PP lp trình cout <<"Size of unsigned short = " <<sizeof(unsigned short)<< ª bytes\nº; cout <<"Size of signed short = " << sizeof(signed short) << ª bytes\nº; cout <<"Size of long = " << sizeof(long) << ª bytes\nº; cout <<"Size of unsigned long = " << sizeof(unsigned long) << ª bytes\nº; cout <<"Size of signed long = " << sizeof(signed long) << ª bytes\nº; cout <<"Size of float = " << sizeof(float) << ª bytes\nº; cout <<"Size of double = " << sizeof(double) << ª bytes\nº; cout <<"Size of long double = " << sizeof(long double) << ª bytes\nº; } K t qu khi thc hin chng trình trên: 15. Toán t d$u ph1y (comma operator) Toán t comma bu c các bi u thc cùng v i nhau. Bi u thc bên trái ca toán t comma luôn luôn #c nh tr nh void, bi u thc bên ph i #c nh tr và tr" thành giá tr ca bi u thc. Dng tng quát ca toán t comma: (exp1, exp2, , expN) Các bi u thc #c nh tr t trái sang ph i, bi u thc cui cùng (expN) #c nh tr và tr" thành giá tr ca toàn b bi u thc. Ví d: x = (y=3, y+1); (u tiên y #c gán giá tr 3 và r*i x #c gán giá tri y+1 là 4. TT.Công Ngh Thông Tin 27/127
  28. Giáo trình PP lp trình Bng tóm t2t  u tiên ca các toán t Cao nht () [] -> . ! ~ ++ –– (type) * & sizeof * / % + - > >= == != & ^ | && || ?: = += -= *= /= %= Thp nht , TT.Công Ngh Thông Tin 28/127
  29. Giáo trình PP lp trình 16. Biu th*c (expressions) M t bi u thc trong C/C++ là s k t h#p ca các thành ph(n nh toán t, hng, bi n, và hàm có tr v giá tr. Th t nh tr ca bi u thc tùy thu c vào  u tiên ca các toán t. Do ó,  vi t bi u thc rõ ràng và thc hin vic nh tr úng theo yêu c(u ca lp trình viên ta nên dùng cp du ngoc tròn ()  bao quanh các bi u thc con ca bi u thc. Ví d: nh tr bi u thc sau: result = x * y - z % 10 + w/2; result = x * y - z % 10 + w/2 1 2 3 4 5 6 vi t li bi u thc trên rõ ràng d- c và thc hin nh mong mun, ta vi t: result = (x * y) – (z % 10) + (w/2); 17. Chuyn /i kiu trong các biu th*c Khi các hng và bi n ca nhng ki u khác nhau t*n ti trong m t bi u thc, giá tr ca chúng ph i #c chuy n thành cùng ki u tr c khi các phép toán gia chúng #c thc hin. Trình biên dch s thc hin vic chuy n ki u (convertion) t  ng  n ki u ca toán hng có ki u l n nht. Vic chuy n ki u này gi là th$ng cp ki u (type promotion). Ví d: char ch; TT.Công Ngh Thông Tin 29/127
  30. Giáo trình PP lp trình int i; float f; double d; result = (ch/i) + (f*d) – (f+i); int double float int double float double double double 18. Ép kiu (casting) Casting dùng  ép m t bi u thc thành m t ki u theo ý mun ca lp trình viên. Dng tng quát ca casting là (type)expression hoc type(expression) type: là tên m t ki u d liu h#p l. Ví d: float result; result = 7/2; Do 7/2 là phép chia nguyên nên k t qu không có ph(n thp phân. Sau lnh trên result có giá tr là 3. phép chia trên là phép chia s thc dù rng toán hng có ki u nguyên ta thc hin ép ki u t s hoc m!u s hoc c hai. Các cách vi t sau s cho cùng k t qa: TT.Công Ngh Thông Tin 30/127
  31. Giáo trình PP lp trình result = (float)7/2; result = 7/(float)2; result = (float)7/(float)2; result = float(7)/float(2); Nh vy, trong các lnh trên, ta ã ép m t hoc hai toán hng  n ki u float. Do ó,  nh tr bi u thc, toán hng kia s #c th$ng cp (type promotion) thành ki u float tng ng  thc hin phép chia sau ó. K t qu ca 4 lnh trên là tng ng và result s có giá tr là 3.5 19. D!ng vit t2t ca câu l%nh gán (shorthand assignments) Các dng vi t tt ca câu lnh gán v i các toán t s hc g*m +=, -=, *=, /=, và %=. Nhng lnh có dng: variable = variable operator expression; variable: Tên bi n operator: Toán t s hc (+, -, *, /, %) expression: Bi u thc có th #c vi t d i dng ngn gn hn nh sau: variable operator= expression; Ví d: x = x + 10;  x += 10; x = x – 10;  x -= 10; x = x * 10;  x *= 10; x = x / 10;  x /= 10; x = x % 10;  x %= 10; TT.Công Ngh Thông Tin 31/127
  32. Giáo trình PP lp trình Bài tp Ch ng 2 1. Nhp bán kính %ng tròn r. Tính và xut chu vi, din tích %ng tròn tng ng. HD: cv=2*π*r và dt=π*r2 2. Nhp cnh a. Tính và xut chu vi, din tích hình vuông. HD: cv=4*a và dt=a2 3. Nhp cnh a,b. Tính và xut chu vi, din tích hình ch nht. HD: cv=2*(a+b) và dt=a*b 4. Nhp cnh a,h1,h2. Tính và xut chu vi, din tích hình thoi. HD: cv=4*a và dt=1.0/2*h1*h2 5. Nhp cnh a,b,c,d,h. Tính và xut chu vi, din tích hình thang. HD: cv=(a+b+c+d) và dt=1.0/2*h*(a+b) 6. Nhp cnh a,b,c. Tính và xut chu vi, din tích hình tam giác. HD: cv=a+b+c và dt= p *( p − a) *( p − b) *( p − c) v i p=cv/2 7. Nhp vào hai s nguyên dng a,b. Tính và xut tng, hiu, tích, thng. 8. Nhp 2 s nguyên a,b. Tính và xut ab. HD: dùng hàm pow(x,y)  xy 9. Nhp 1 s n. Tính và xut giá tr tuy t i. HD: dùng hàm abs(a)  |a| 10. Nhp 1 s n. Tính và xut c$n bc hai ca n. HD: dùng hàm sqrt(a)  a 11. Nhp 1 góc x. Tính và xut sinx, cosx, tgx, cotgx. HD: các hàm sin, cos, tan ch, tính theo n v radian nên chúng ta ph i i t  x sang  radian t nh sau: t=x*π/180 => sinx=sin(t), cosx=cos(t), tgx=tan(t), cotgx=1/tgx 12. Nhp to  2 i m A(xA,yA), B(xB,yB). Tính và xut  dài on AB. TT.Công Ngh Thông Tin 32/127
  33. Giáo trình PP lp trình 2 2 HD: |AB|=dAB= (xB − x A ) + (y B − y A ) ) 13. Nhp to  2 i m A(xA,yA), B(xB,yB). Tính h s góc ca %ng th0ng i qua hai i m ó theo công thc: H s góc = (yB - yA) /(xB - xA) 14. Vi t chng trình nhp vào s nguyên n và s thc x. Tính và in ra bi u thc A = (x 2 + x + 1) n + (x 2 − x +1) n 15. Nhp vào s giây bt k/ t. Tính và xut ra dng Gi3:Phút:Giây Ví d: Nhp 3750 thì xut ra 1:2:30 AM 16. Nhp 51100 thì xut ra 2:11:40 PM HD: hour=(t/3600)%24 minute=(t%3600)/60 second=(t%3600)%60 17. Vi t chng trình nhp vào ngày, tháng, n$m. In ra ngày tháng n$m theo dng dd/mm/yy. (dd: ngày, mm: tháng, yy : n$m. Ví d: 20/11/08 ) 18. Vi t chng trình tính logax v i a, x là các s thc nhp vào t bàn phím, và x>0, a>0, a != 1( dùng logax=lnx/lna) 19. Vi t chng trình nhp vào m t ký t: In ra mã ASCII ca ký t ó. In ra ký t k ti p ca nó. 20. Vi t chng trình nhp vào i m ba môn Toán, Lý, Hóa ca m t hc sinh. In ra i m trung bình ca hc sinh ó v i hai s l& thp phân. 21. Vi t chng trình  o ng#c m t s nguyên dng có úng 3 ký s. TT.Công Ngh Thông Tin 33/127
  34. Giáo trình PP lp trình Chng 3 CÁC CU TRÚC I U KHIN (Control structures) 1. GI4I THIU Tt c các chng trình máy tính dù n gi n hay phc tp u #c vi t bng cách s dng các cu trúc iu khi n. Có 3 loi cu trúc iu khi n c b n là cu trúc tu(n t (sequence), cu trúc la chn (selection), và cu trúc lp (repetition or loop). Các cu trúc này iu khi n th t thc thi các lnh ca chng trình. Cu trúc tun t: thc hin các lnh theo th t t trên xung d i. Cu trúc la chn: da vào k t qu ca bi u thc iu kin. Tùy theo s nh tr ca bi u thc này mà nhng lnh tng ng s #c thc hin. Các cu trúc la chn g*m cu trúc if, switch. Cu trúc lp: lp li 1 hay nhiu lnh cho  n khi bi u thc iu kin là sai. Các cu trúc lp g*m for, while, do while. Tuy nhiên, th t thc hin các lnh ca chng trình còn b chi phi b"i các lnh nh y nh continue, break, goto. Lnh (statement): m t bi u thc k t thúc b"i 1 du chm phy gi là 1 lnh. Ví d: int a,b,c; a=10; a++; Khi lnh (block): m t hay nhiu lnh #c bao quanh b"i cp du {} #c gi là m t khi lnh. V mt cú pháp, khi lnh tng ng 1 câu lnh n. Do ó ni âu xut hin 1 lnh thì ni ó có th xut hin 1 khi lnh. Ví d: if (a<b) { temp=a; a=b; b=temp; } TT.Công Ngh Thông Tin 34/127
  35. Giáo trình PP lp trình 2. CU TRÚC LA CHN IF C$u trúc if có các d!ng t/ng quát sau: D ng 1: if (expression) statement; expression: Bi u thc lun lý (có giá tr là true hay false) statement: Câu lnh Lu * cú pháp: false expression true statement Exit Ý ngh+a: (u tiên expression #c nh tr. N u k t qu là true ( #include int main() { int a; cout >a; if(a>=0) cout << a << " is a positive.”; getche(); return 0; } TT.Công Ngh Thông Tin 35/127
  36. Giáo trình PP lp trình Gii thích: − N u nhp m t s a >=0 thì câu lnh cout 0) thì statement1 #c thc thi. Ng#c li, thì statement2 #c thc thi. Ví d 1: Vi t chng trình nhp vào m t s nguyên a. In ra màn hình k t qu ki m tra a là s âm hay dng. TT.Công Ngh Thông Tin 36/127
  37. Giáo trình PP lp trình #include #include int main() { int a; cout > a; if(a>=0) cout #include void main() { int m; cout > m; if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12) cout << "Month “ << m << ” has 31 days."; else if(m==4 || m==6 || m==9 || m==11) cout << "Month “ << m << ” has 30 days."; else if(m==2) cout << "Month “ << m << ” has 28 or 29 days."; else cout << "This is not a valid month: ” << m; getche(); } Lu ý: TT.Công Ngh Thông Tin 37/127
  38. Giáo trình PP lp trình - Ta có th s dng các câu lnh if else l*ng nhau. Trong tr%ng h#p if else l*ng nhau thì else s k t hp vi if gn nht cha có else. - Trong tr%ng h#p câu lnh if “bên trong” không có else thì ph i vi t nó trong cp du {} (coi nh là khi lnh)  tránh s k t h#p else if sai. Ví d: if (ch >= '0' && ch = 'A' && ch = 'a' && ch = '0' && ch = 'A' && ch = 'a' && ch <= 'z') kind = lowerLetter; else kind = specialLetter; TT.Công Ngh Thông Tin 38/127
  39. Giáo trình PP lp trình 3. CU TRÚC LA CHN switch Cu trúc switch là m t cu trúc la chn có nhiu nhánh. Khi có nhiu s la chn thi ây là cu trúc phù h#p thay vì ph i dùng m t chui lnh if else l*ng nhau. Dng tng quát ca cu trúc switch: Cú pháp: switch(expression) { case value1: statement1; [break;] case valueN: statementN; [break;] [default : statement;] } TT.Công Ngh Thông Tin 39/127
  40. Giáo trình PP lp trình Lu : expression true expression statement1 = = value1 ? false true expression statement2 = = value2 ? false true expression statementN = = valueN ? false default: statement Exit TT.Công Ngh Thông Tin 40/127
  41. Giáo trình PP lp trình Gi i thích: − Tr c h t chng trình s nh tr ca expression. − N u giá tr ca expression bng value1 thì thc hin statement1 r*i thoát. − N u giá tr ca expression khác value1 thì so sánh v i value2, n u bng value2 thì thc hin statement2 r*i thoát ., so sánh t i valueN. − N u tt c các phép so sánh trên u sai thì thc hin statement ca tr%ng h#p default. Lu ý: − expression trong switch() ph i có k t qu là giá tr ki u s nguyên (int, char, long). − Các giá tr sau case ph i là hng nguyên. − Không bt bu c ph i có default. − Thông th%ng mi case có 1 câu lnh break. Khi thc hin lnh tng ng ca case có giá tr bng expression, chng trình thc hin lnh break  thoát khi cu trúc switch. Ví d 1: Nhp vào m t s nguyên, chia s nguyên này cho 2 ly ph(n d. Ki m tra n u ph(n d bng 0 thì in ra thông báo “là s ch.n” , n u s d bng 1 thì in thông báo “là s l&” . #include #include void main () { int n, remainder; cout >n; remainder = (n % 2); switch(remainder) { case 0: cout << n << º is an even."; break; case 1: cout << n << º is an odd."; break; } getche(); } TT.Công Ngh Thông Tin 41/127
  42. Giáo trình PP lp trình Ví d 2: Nhp vào 2 s nguyên và 1 phép toán. − N u phép toán là ‘+’, ‘-‘, ‘*’ thì in ra k t qua là tng, hiu, tích ca 2 s. − N u phép toán là ‘/’ thì ki m tra xem s th 2 có khác không hay không? N u khác không thì in ra thng ca chúng, ng#c li thì in ra thông báo “Cannot divide by zero!” . #include #include int main() { int a, b; char operation; cout > a >> b; cout > operation; switch(operation) { case ©+©: cout << a << º + ª << b << º = º << a+b; break; case ©-©: cout << a << º - ª << b << º = º << a-b; break; case ©*©: cout << a << º * ª << b << º = º << a*b; break; case ©/©: if(b!=0) cout << a << º / ª << b << º = º << (float)a/b; else cout << "Cannot divide by zero !"; break; } getche(); } TT.Công Ngh Thông Tin 42/127
  43. Giáo trình PP lp trình Ví d 3: Yêu c(u ng%i thc hin chng trình nhp vào m t s nguyên dng là tháng trong n$m và in ra s ngày ca tháng ó. - Tháng có 31 ngày: 1, 3, 5, 7, 8, 10, 12 - Tháng có 30 ngày: 4, 6, 9, 11 - Tháng có 28 hoc 29 ngày : 2 - N u nhp vào s 12 thì in ra câu thông báo “There is no month like this.“. #include #include void main() { int month; cout > month; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: cout<<"Month º << month << º has 31 days."; break; case 4: case 6: case 9: case 11: cout << "Month º << month << º has 30 days."; break; case 2: cout << "Month ª << month << ª has 28 or 29 days."; break; default : cout<<ºThere is no month like this.º; } getche(); } TT.Công Ngh Thông Tin 43/127
  44. Giáo trình PP lp trình 4. CÁC CU TRÚC L5P (Loop structures) Cu trúc lp cho phép lp li nhiu l(n 1 câu lnh hay 1 khi lnh nào ó cho  n khi bi u thc iu kin còn tha. 4.1. C$u trúc while Cu trúc while cho phép thc hin statement trong khi expression v!n còn úng. Cú pháp: while(expression) statement; Lu cú pháp: false expression true statement Exit B c 1: expression #c nh tr. B c 2: N u k t qu là true thì thc hin statement r*i quay li b c 1. B c 3: N u k t qu là false thì thoát khi vòng lp while. TT.Công Ngh Thông Tin 44/127
  45. Giáo trình PP lp trình Ví d 1: Vi t chng trình tính tng các s nguyên t 1 t i n. #include #include void main () { int i, n, sum; cout > n; i = 1; sum = 0; while(i #include void main() { int i; cout << ºDisplay one to ten: "; i=1; while (i<=10) { cout << ª\tº << i; i++; } getche(); } Lu ý: vòng lp ph i k t thúc " m t i m nào ó, vì vy bên trong vòng lp ph i cung cp m t cách thc nào ó  bu c expression tr" thành false n u không thì s lp vô tn. Trong ví d trên i++; là cách thc t$ng bi n i   n khi i=11 thì vòng lp k t thúc. TT.Công Ngh Thông Tin 45/127
  46. Giáo trình PP lp trình 4.2. C$u trúc l-p do while Cu trúc lp do while ging nh vòng lp while, dùng  lp li m t statement trong khi expression là true. statement luôn luôn #c thc hin ít nht 1 l(n. Cú pháp: do { statement; }while(expression); Lu : statement true expression false Exit B c 1: statement #c thc hin B c 2: expression #c nh tr. B c 3: N u expression là true thì quay li b c 1 B c 4: N u expression là false thì thoát khi do while. TT.Công Ngh Thông Tin 46/127
  47. Giáo trình PP lp trình Ví d 1: Vi t on chng trình in dãy s nguyên t 1  n 10. #include #include void main () { int i; cout #include void main () { unsigned int n,i,sum; cout > n; sum=0; i=1; do { sum += i; i++; } while(i<=n); cout << ºSum of 1 to º << n << º = º << sum; getche(); } TT.Công Ngh Thông Tin 47/127
  48. Giáo trình PP lp trình 4.3. C$u trúc l-p for Chc n$ng chính ca cu trúc lp for là lp li m t an lnh nào ó trong khi Exp2 còn là true. Cu trúc lp for th%ng s dng trong nhng chng trình mà s l(n lp li m t an lnh nào ó #c bi t tr c. Cú pháp: for (Exp1; Exp2; Exp3) statement; Cách hot  ng ca vòng lp for nh sau: Exp1 B c 1: Exp1 là bi u thc kh"i to #c thc hin. Thông th%ng nó gán giá tr kh"i to cho bi n iu khi n cu trúc for. Bi u thc này ch, false Exp2 #c thc hin ch, 1 l(n. B c 2: Exp2 là bi u thc iu kin #c nh true tr.    B c 3: N u giá tr c a statement Exp2 là true thì statement s #c thc thi, Exp3 #c thc thi. Quay li b c 2 Exp3 B c 4: N u giá tr ca Exp2 là false thì thoát khi cu trúc for. Lu cú pháp: Exit TT.Công Ngh Thông Tin 48/127
  49. Giáo trình PP lp trình Ví d 1: Vi t chng trình tính tng ca các s nguyên t 1 t i n. #include #include void main() { int i, n, sum; cout > n; sum = 0; for (i=1 ; i<=n ; i++) sum += i; cout << ºSum of 1 to ª << n << º is: º << sum; getche(); } − C/C++ cho phép bi u thc (u tiên trong vòng lp for là m t nh ngh+a bi n. Ví d trong vòng lp trên thì i có th #c nh ngh+a bên trong vòng lp: for(int i=1; i<=n; ++i) sum += i; − Bt k/ bi u thc nào trong 3 bi u thc ca vòng lp for u có th rng. Ví d, xóa bi u thc (u và bi u thc cui cho chúng ta dng ging nh vòng lp while: for(; i != 0;) statement; //tng ng vi while(i != 0) statement; − Xóa tt c các bi u thc cho chúng ta m t vòng lp vô tn. for (;;) // vòng l p vô hn statement; TT.Công Ngh Thông Tin 49/127
  50. Giáo trình PP lp trình 5. CÁC LNH R6 NHÁNH VÀ LNH NHY 5.1. L%nh break Lnh break th%ng dùng trong ph(n case ca cu trúc switch  thoát khi cu trúc switch sau khi các lnh tng ng ca case ã #c thc hin. Ngoài ra, trong các cu trúc lp, n u mun thoát khi 1 vòng lp tc thì mà không ch% cho  n khi bi u thc iu kin (conditional expression) ca cu trúc #c nh tr là false, ta dùng lnh break. Khi break #c thc hin bên trong 1 cu trúc lp, iu khi n (control flow) t  ng nh y  n lnh (u tiên ngay sau cu trúc lp ó. Lnh break th%ng liên  i v i m t câu lnh if trong nhng tr%ng h#p này. Không s dng lnh break bên ngoài các cu trúc lp nh while, do while, for hay cu trúc switch. Ví d 1: c vào m t mt khu ng%i dùng ti a attempts l(n for (i=0; i > passWord; if (check(passWord)) // kim tra mt khu úng hay sai break; // thoát kh i vòng l p cout #include TT.Công Ngh Thông Tin 50/127
  51. Giáo trình PP lp trình void main() { int num,sum=0; while(1) { cout > num; if (num > num; if (num>=0) sum += num; }while (num>=0); 5.2. L%nh continue Lnh continue ch, #c dùng trong thân các cu trúc lp nh for, while, do while. Trong mi l(n lp ca các cu trúc trên, các lnh trong thân vòng lp #c thc hin r*i iu khi n s quay v (u vòng lp chun b cho l(n lp k ti p. Tuy nhiên, n u mun iu khi n quay v (u vòng lp ngay lp tc mà không thc hin các lnh còn li ca l(n lp hin hành thì ta dùng câu lnh continue. Câu lnh continue th%ng i kèm v i 1 câu lnh if. Ví d: m t vòng lp thc hin c m t s, x lý nó nhng b qua nhng s âm, và dng khi s là 0, có th di-n gi i nh sau: do { cin >> num; if (num < 0) continue; // process num here } while(num != 0); TT.Công Ngh Thông Tin 51/127
  52. Giáo trình PP lp trình iu này tng ng vi: do { cin >> num; if(num >= 0) { // process num here } } while(num != 0); − M t bi n th ca vòng lp này là  c chính xác m t s n l(n có th #c di-n gi i nh sau: for(i=0; i > num; if(num > num; if (num < 0) continue; // jump to i++ // process num here } //etc } TT.Công Ngh Thông Tin 52/127
  53. Giáo trình PP lp trình BÀI TP CHNG 3 1. Nhp 1 s n>=0. Tính và xut c$n bc hai ca n. HD: dùng hàm sqrt(a)= a 2. Nhp vào s giây bt k/ t>=0. Tính và xut ra dng Gi3:Phút:Giây Ví d: Nhp 3750 thì xut ra 1:2:30 AM Nhp 51100 thì xut ra 2:11:40 PM HD: hour=(t/3600)%24 minute=(t%3600)/60 second=(t%3600)%60 3. Nhp 3 s thc a, b, c. Tìm s l n nht. 4. Nhp n. Ki m tra n là s ch.n hay s l&. 5. Nhp 2 s a, b. Ki m tra xem chúng có cùng du hay không. 6. Nhp vào hai s nguyên dng a, b. So sánh giá tr ca chúng (l n hn, nh hn, bng). 7. Gi i và bin lun phng trình bc 1: ax+b=0. 8. Gi i và bin lun phng trình bc 2: ax2+bx+c=0. 9. Nhp vào tháng t (v i 1<=t<=12). Cho bi t t thu c qúy my trong n$m. 10. Nhp vào tháng t (v i 1<=t<=12). Cho bi t tháng t có bao nhiêu ngày. Riêng tháng 2 thì ph i ki m tra n$m nhun (N$m nhun là n$m chia h t cho 4 mà không chia h t cho 100, hoc chia h t cho 400). 11. Nhp vào m t ngày (ngày, tháng, nm). Tìm ngày k sau ngày va nhp (ngày/tháng/nm). 12. Nhp vào m t ngày (ngày, tháng, nm). Tìm ngày k tr c ngày va nhp (ngày/tháng/nm). TT.Công Ngh Thông Tin 53/127
  54. Giáo trình PP lp trình 13. Nhp vào m t ngày (ngày, tháng, nm). Cho bi t ngày ó là ngày th bao nhiêu trong n$m. 14. Nhp vào m t n$m dng lch. Hãy cho bi t n$m âm lch. (vd: n=2007 => inh H#i) 15. Nhp m t s n có ti a 2 ch s. Hãy cho bi t cách c ra dng ch. (vd: n=35 => Ba mi l$m, n=5 => n$m). 16. Nhp m t s n có ti a 3 ch s. Hãy cho bi t cách c ra dng ch. (vd: n=235 => Hai tr$m ba mi l$m, n=305 => Ba tr$m l& n$m) 17. Nhp m t s n bt k/. Hãy cho bi t cách c ra dng ch. 18. Nhp vào i m Toán, Lý, Hoá. Hãy tính TB và Cho bi t sinh viên ó x p loi gì (Xut sc, Gii, Khá, Trung bình, Y u) 19. Ki m tra s nguyên dng n có ph i là s chính phng hay không? 20. Vi t chng trình nhp vào m t s nguyên dng n v i 1 =0, b>=0, c>=0. N u a, b, c to thành tam giác thì hãy tính và xut chu vi, din tích hình tam giác. Ng#c li, thông báo “ Không to thành tam giác” HD: cv=a+b+c, p=cv/2 và dt= p *( p − a) *( p − b) *( p − c) 23. Vi t chng trình nhp t bàn phím 2 s a, b và m t ký t ch. N u: TT.Công Ngh Thông Tin 54/127
  55. Giáo trình PP lp trình o ch là “ +“ thì thc hin phép tính a+b và in k t qu lên màn hình o ch là “ –“ thì thc hin phép tính a-b và in k t qu lên màn hình. o ch là “ *” thì thc hin phép tính a*b và in k t qu lên màn hình. o ch là “ /” thì thc hin phép tính a/b và in k t qu lên màn hình. 24. M t s nguyên dng chia h t cho 3 n u tng các ch s ca nó chia h t cho 3. Vi t chng trình nhp vào m t s có 3 ch s, ki m tra s ó có chia h t cho 3 dùng tính cht trên.( if ) 25. Vi t chng trình nhn vào gi%, phút, giây dng (hh:mm:ss ), t bàn phím. C ng thêm m t s giây vào và in ra k t qu d i dng ( hh:mm:ss ). 26. Ki m tra m t ký t nhp vào thu c tp h#p nào trong các tp ký t sau: − Các ký t ch hoa: 'A' 'Z' − Các ký t ch th%ng: 'a' 'z' − Các ký t ch s : '0' '9' − Các ký t khác. 27. H thp lc phân dùng 16 ký s bao g*m các ký t 0 9 và A, B, C, D, E ,F. Các ký s A, B, C, D, E, F có giá tr tng ng trong h thp phân nh sau: A 10 B 11 C 12 D 13 E 14 F 15 Hãy vi t chng trình cho nhp vào ký t bi u di-n m t ký s ca h thp lc phân và cho bi t giá tr thp phân tng ng. Tr%ng h#p ký t nhp vào không thu c các ký s trên, a ra thông báo li: "H thp lc phân không dùng ký s này" 28. Nhp n>=0. Tính S(n)=1+2+3+ + n. 29. Nhp n>=0. Tính S(n)=2+4+ + n. 30. Nhp n>=0. Tính S(n)=1+3+ + n. 31. Nhp n>=0. Tính S(n)=12+22+32+ + n2. TT.Công Ngh Thông Tin 55/127
  56. Giáo trình PP lp trình 32. Nhp n>=0. Tính S(n)=12+22+32+ + n2. 1 1 1 33. Nhp n>=0. Tính S ( n ) = 1 + + + + 2 3 n 1 1 1 34. Nhp n>=0. Tính S ( n ) = + + + 2 4 2 n 1 1 1 35. Nhp n>=0. Tính S ( n ) = 1 + + + + 3 5 2 n + 1 1 1 1 36. Nhp n>=0. Tính S ( n ) = + + + 1 × 2 2 × 3 n × ( n + 1) 1 2 n 37. Nhp n>=0. Tính S (n ) = + + + 2 3 n + 1 1 3 2 n + 1 38. Nhp n>=0. Tính S (n) = + + + 2 4 2n + 2 39. Nhp n>=0. Tính T(n)=1×2×3× ×n 40. Nhp n>=0. Tính S(n)=1+1×2+1×2×3+ +1×2×3× ×n 41. Nhp x,n. Tính T(x,n)=xn 42. Nhp x,n. Tính S(n) = n x 43. Nhp x,n. Tính S(x,n)=x+x2+x3+ +xn 44. Nhp x,n. Tính S(x,n)=x2+x4+x6+ +x2n 45. Nhp x,n. Tính S(x,n)=x+x3+x5+ +x2n+1 46. Nhp n. Tính 1 1 1 S (n ) = 1 + + + + 1 + 2 1 + 2 + 3 1 + 2 + + n 47. Nhp x,n. Tính x 2 x 3 x n S ( x, n ) = x + + + + 1 + 2 1 + 2 + 3 1 + 2 + + n x 2 x 3 x n 48. Nhp x,n. Tính S ( x , n ) = x + + + + 2 ! 3! n ! x 2 x 4 x 2 n 49. Nhp x,n. Tính S ( x , n ) = x + + + + 2! 4! 2 n ! TT.Công Ngh Thông Tin 56/127
  57. Giáo trình PP lp trình x 3 x 5 x 2 n +1 50. Nhp x,n. Tính S ( x , n ) = x + + + + 3! 5! ( 2 n + 1)! 51. Nhp n. Tính S ( n ) = 2 + 2 + 2 + + 2 , có n du c$n l*ng nhau. 52. Nhp n. Tính S (n ) = n + (n − 1) + (n − 2) + + 2 + 1 , có n du c$n l*ng nhau. 53. Nhp n. Tính S ( n ) = 1 + 2 + 3 + + ( n − 1) + n , có n du c$n l*ng nhau. 54. Lit kê tt c các c s ca s nguyên dng n. 55. Lit kê tt c các c s l ca s nguyên dng n. 56. Lit kê tt c các c s chn ca s nguyên dng n. 57. Tính tng tt c các c s ca s nguyên dng n. 58. Tính tích tt c các c s ca s nguyên dng n. 59. m s l#ng các c s ca s nguyên dng n. 60. Tìm c s ln nht ca s nguyên dng n. 61. Ki m tra n có ph i là s nguyên t hay không? 62. Lit kê các s nguyên t nh hn hay bng s nguyên dng n. 63. Lit kê các ch s là s nguyên t ca s nguyên dng n. 64. Tính t*ng các ch s là s nguyên t ca s nguyên dng n. 65. Tính tích các ch s là s nguyên t ca s nguyên dng n. 66. m s l#ng các ch s chn ca s nguyên dng n. 67. Tính tng các ch s chn ca s nguyên dng n. 68. Tính tích các ch s chn ca s nguyên dng n. 69. m s l#ng các ch s l ca s nguyên dng n. 70. Tính tng các ch s l ca s nguyên dng n. 71. Tính tích các ch s l ca s nguyên dng n. 72. Tìm c s chung ln nht ca 2 s nguyên dng a, b. TT.Công Ngh Thông Tin 57/127
  58. Giáo trình PP lp trình 73. Tìm Bi s chung ln nht ca 2 s nguyên dng a, b. 74. Ki m tra s nguyên dng n có ph i là s i xng hay không? 75. Ki m tra s nguyên dng n có ph i là s hoàn thin (Perfect number) hay không? (S hoàn thin là s có tng các  c s ca nó (không k nó) thì bng chính nó. Vd: 6 có các  c s là 1,2,3 và 6=1+2+3  6 là s hoàn thin) 76. Ki m tra s nguyên dng n có ph i là s thnh vng (Abundant number) hay không? (S thnh v#ng là s có tng các  c s ca nó (không k nó) thì l n hn nó. Vd: 12 có các  c s là 1,2,3,4,6 và 12 1+3  9 là s không trn v2n) 78. Ki m tra s nguyên dng n có các ch s toàn là ch s chn hay không? 79. Ki m tra s nguyên dng n có các ch s toàn là ch s l hay không? 80. Ki m tra s nguyên dng n có các ch s tng dn t! trái qua phi hay không? 81. Ki m tra s nguyên dng n có các ch s gim dn t! trái qua phi hay không? 82. Nhp n>0. Tìm s nguyên dng m l n nht sao cho 1+2+3+ +m 0. Tìm s nguyên dng m nh nht sao cho 1+2+3+ +m>n. 84. Xut s  o ca s nguyên dng n. 85. Xut ra các ký t t A->Z, Z->A, a->z, z->a. 86. Xut ra các s l& nh hn 50 tr các s 11, 25, 37. 87. Nhp n>0. Xut ra b ng cu chng n. 88. Hãy tìm s gà và s chó? bi t: Va gà va chó TT.Công Ngh Thông Tin 58/127
  59. Giáo trình PP lp trình bó li cho tròn ba mi sáu con m t tr$m chân ch.n. 89. Hãy tìm s trâu mi loi? bi t: Tr$m trâu t$m c Trâu ng $n n$m Trâu nm $n ba Trâu già ba con m t bó 90. Xut ra màn hình các hình có chiu cao h>0. ví d h=4 ta có các hình nh sau: 91. Vi t chng trình thc hin trò chi oán s nh sau: Máy ly ra m t s ng!u nhiên n∈[1,100] là s ca máy: S(máy (s dng hàm random). TT.Công Ngh Thông Tin 59/127
  60. Giáo trình PP lp trình Ng%i nhp vào m t s (S(nhp) + N u S(nhp l n hn S(máy thì thông báo “ S bn l n hn s máy” . + N u S(nhp nh hn S(máy thì thông báo “ S bn nh hn s máy” . Trò chi k t thúc khi: + Hoc Bn ã oán trúng: thông báo “ Ha ha bn tài tht” . + Hoc Bn ã oán sai 7 l(n: thông báo “ Bn ã thua r*i” và hi n th S(máy. 92. Trò chi ly bì: “ Có M viên bi, hai ng i chi ln lt ly i các viên bi sao cho s viên bi ly ít nht là 1 và nhi"u nht là 3, ng i nào mà ly c viên bi cui cùng thì ng i ó b thua” - Gi s bn chi v i máy. Hãy vi t chng trình mô phng trò chi này sao cho máy có c h i thng nhiu nht. - Ng%i chi c(n nhp vào s viên bi M và chn l#t ly bi tr c (máy ly trc hay bn ly trc) sau ó c thay phiên nhau ly. Cui cùng thì thông báo k t qu ca ván chi. TT.Công Ngh Thông Tin 60/127
  61. Giáo trình PP lp trình Chng 4 MNG (Array) 1. Gi i thi%u Mng M ng là m t tp h#p các bi n có cùng ki u d liu nm liên ti p nhau trong b nh và #c tham chi u b"i m t tên chung (tên m ng). Mi ph(n t ca m ng #c tham chi u thông qua ch, mc (index). N u m ng có n ph(n t thì ph(n t (u tiên có ch, mc là 0 và ph(n t cui có ch, mc là n-1. tham chi u  n m t ph(n t ta dùng tên m ng và ch, mc ca ph(n t #c t trong cp du []. S l#ng ph(n t trong m ng #c gi là kích th c ca m ng. Kích th c ca m ng là c nh và ph i #c xác nh tr c; nó không th thay i trong sut quá trình thc hin chng trình. Ví d: Khai báo m ng a có 10 ph(n t. Mi ph(n t có ki u int int a[10]; int int int a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] Có 2 loi m ng thông dng là m ng 1 chiu và m ng nhiu chiu. 2. Mng 1 chi+u 2.1. Khai báo mt mng mt chi+u Dng tng quát  khai báo m t m ng m t chiu là: type arrayName[elements]; type: ki u d liu ca mi ph(n t m ng. elements: s ph(n t có trong m ng TT.Công Ngh Thông Tin 61/127
  62. Giáo trình PP lp trình arrayName: tên m ng Ging nh nhng bi n khác, m ng ph i #c khai báo t%ng minh  cho trình biên dch có th cp phát b nh cho nó. Kích th c (tính bng byte) ca m ng #c tính theo công thc: TotalSize = sizeof(type) * elements Ví d,  khai báo m t m ng có 100 ph(n t tên num có ki u int, ta dùng lnh: int num[100]; Vy m ng trên có kích th c là 2bytes * 100 = 200bytes (gi s int chi m 2 bytes) Mi ph(n t m ng là m t bi n thông th%ng. on lnh d i ây minh ha vic s dng các ph(n t m ng. num[0] = 2; //gán phn t có ch mc 0 giá tr 2 num[1] = num[0] + 3 //num[1] có giá tr 5 num[2] = num[0] + num[1]; //num[2] có giá tr 7 cout << num[1]; //In ra giá tr 5 2.2. Khai báo và kh7i t!o mng mt chi+u Ngoài ra, ta còn có th va khai báo va kh"i to các ph(n t ca m ng m t chiu. Dng tng quát nh sau: type arrayName[] = {value1, value2, , valueN}; Lu ý: kích th c m ng không khai báo. S l#ng ph(n t trong m ng là s s giá tr #c cung cp trong cp du ngoc {}. Mi giá tr phân cách nhau dùng du phy. Ví d: Xem xét khai báo sau: int soChan[] = {2,4,6,8,10}; M ng soChan có 5 ph(n t l(n l#t là: soChan[0] có giá tr là 2 soChan[1] có giá tr là 4 soChan[4] có giá tr là 10 TT.Công Ngh Thông Tin 62/127
  63. Giáo trình PP lp trình 2.3. Mt s( ví d& Ví d 1: To m t m ng nguyên a có N ph(n t. Mi ph(n t có giá tr là ch, mc ca nó. In m ng ra màn hình. #include #include #define N 10 void main() { int a[N]; for(int i=0 ; i #include void main() { int n; int remainder; int binary[20],k=0,i; cout > n; do { remainder = n % 2; binary[k]= remainder; k++; n = n/2; } while(n>0); cout =0 ; i ) cout << binary[i]; getche(); } TT.Công Ngh Thông Tin 63/127
  64. Giáo trình PP lp trình 3. Mng nhi+u chi+u C/C++ h tr# m ng nhiu chiu. Dng n gi n nht ca m ng nhiu chiu là m ng hai chiu. M ng hai chiu thc cht là m ng ca nhng m ng m t chiu. Ta có th xem m ng hai chiu là m t ma trn g*m các hàng và các c t. 3.1. Khai báo mng hai chi+u type arrayName[rows][columns]; rows: s hàng columns: s c t Gi s ta khai báo m t m ng num có 3 hàng và 4 c t, ki u int và gán giá tr cho các ph(n t nh hình minh ha. int num[3][4]; num[0][0] = 1; num[0][1] = 2; num[0][2] = 3; num[0][3] = 4; num[1][0] = 5; num[2][3] = 12; 3.2. Khai báo và kh7i t!o mng hai chi+u Dng tng quát khai báo và kh"i to m ng hai chiu: type arrayName[][columns] = { {value1,value2, ,valueN}, {value1,value2, ,valueN}, { }, {value1,value2, ,valueN}}; Lu ý: TT.Công Ngh Thông Tin 64/127
  65. Giáo trình PP lp trình - S ph(n t ca mi hàng ph i bng s c t (columns) - S hàng (rows) ca khai báo m ng hai chiu  trng. - S hàng ca m ng #c xác nh da vào s hàng trong ph(n kh"i to. Giá tr các ph(n t trong mi hàng #c t trong cp {}, các hàng phân cách nhau bng m t du phy. Ví d,  khai báo và kh"i to m ng hai chiu ca hình minh ha trên, ta khai báo nh sau: int num[][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; 3.3. Mt s( ví d& Ví d 1: To 1 m ng hai chiu có ROWS hàng, COLUMNS c t. Giá tr ca ph(n t trong m ng #c xác nh bng tích ca ch, mc hàng và ch, mc c t ca chúng. #include #include #define ROWS 4 0 0 0 #define COLUMNS 3 0 1 2 void main() { 0 2 4 int a[ROWS][COLUMNS]; //Initialization 0 3 6 for(int i=0 ; i<ROWS ; i++) for(int j=0 ; j<COLUMNS ; j++) a[i][j] = i*j; //Display array contents cout << ªContents in array:\nº; for(int i=0 ; i<ROWS ; i++) { for(int j=0 ; j<COLUMNS ; j++) cout << a[i][j] << ª\tº; cout << endl; } } Ví d 2: To m t ma trn vuông 4x4. Tính tng các ph(n t trên %ng chéo chính TT.Công Ngh Thông Tin 65/127
  66. Giáo trình PP lp trình #include #include void main() { int a[][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16}}; int sum=0; //Tinh tong duong cheo chinh for(int i=0 ; i<4 ; i++) for(int j=0 ; j<4 ; j++) if(i==j) sum += a[i][j]; cout << ªTong duong cheo chinh la: º << sum; } TT.Công Ngh Thông Tin 66/127
  67. Giáo trình PP lp trình BÀI TP CHNG 4 1. Vi t chng trình nhp vào m t dãy n s thc a[0], a[1], , a[n- 1], sp x p dãy s theo th t gi m d(n. Xut ra dãy s sau khi sp x p. 2. Vi t chng trình sp x p m t m ng theo th t t$ng d(n sau khi ã loi b các ph(n t trùng nhau. 3. Vi t chng trình nhp vào m t m ng, hãy xut ra màn hình: - Ph(n t l n nht ca m ng. - Ph(n t nh nht ca m ng. - Tính tng ca các ph(n t trong m ng . 4. Vi t chng trình nhp vào m t dãy các s theo th t t$ng, n u nhp sai quy cách thì yêu c(u nhp li. In dãy s sau khi ã nhp xong. 5. Vi t chng trình nhp vào m t ma trn (m ng hai chiu) các s nguyên, g*m m hàng, n c t. In ma trn ó lên màn hình. 6. Vi t chng trình  chuy n i v trí t dòng thành c t ca m t ma trn (ma trn chuy n v) vuông 4 hàng 4 c t. Sau ó vi t cho ma trn tng quát cp m*n. Ví d: 1 2 3 4 1 2 9 1 2 5 5 8 2 5 4 5 9 4 2 0 3 5 2 8 1 5 8 6 4 8 0 6 7. Vi t chng trình nhp vào m t m ng s t nhiên. Hãy xut ra màn hình: - Dòng 1 : g*m các s l&, tng c ng có bao nhiêu s l&. - Dòng 2 : g*m các s ch.n, tng c ng có bao nhiêu s ch.n. - Dòng 3 : g*m các s nguyên t. - Dòng 4 : g*m các s không ph i là s nguyên t. 8. Vi t chng trình tính tng bình phng ca các s âm trong m t m ng các s nguyên. 9. Vi t chng trình thc hin vic  o m t m ng m t chiu. Ví d : 1 2 3 4 5 7 9 10  o thành 10 9 7 5 4 3 2 1 . TT.Công Ngh Thông Tin 67/127
  68. Giáo trình PP lp trình 10. Vi t chng trình nhp vào hai ma trn A và B có cp m, n. In hai ma trn lên màn hình. Tng hai ma trn A và B là ma trn C #c tính b"i công thc: c = a +b ( i=0,1,2, m-1; j=0,1,2 n-1) ij ij ij Tính ma trn tng C và in k t qu lên màn hình. 11. Vi t chng trình nhp vào hai ma trn A có cp m, k và B có cp k, n. In hai ma trn lên màn hình. Tích hai ma trn A và B là ma trn C #c tính b"i công thc: c = a *b + a *b + a *b + + a *b ij i1 1j i2 2j i3 3j ik kj (i=0,1,2, m-1;j=0,1,2 n-1) Tính ma trn tích C và in k t qu lên màn hình. 12. Nhp s ph(n t và các ph(n t nguyên dng ca m ng a. a) In các s nguyên t có trong m ng a. b) Sp x p các s ch.n trong m ng theo th t t$ng d(n. 13. Vi t chng trình nhp vào m ng a a) Vi t hàm ki m tra m ng i xng không? N u có tr v 1 ng#c li tr v 0. b) Nhp m ng b, ki m tra m ng b có ph i là m ng con ca m ng a không? N u có tr v s l(n m ng b xut hin trong m ng a. 14. Vi t chng trình theo dng hàm: nhp vào m ng nguyên a có n ph(n t v i : a) Các s nguyên t (n u có) trong m ng ph i < 100. b) Không có ph(n t trùng nhau trong m ng. c) Tính tng các s nguyên t trong m ng. 15. Vi t chng trình thc hin các b c sau: a) Nhp m ng thc. b) Sp x p m ng thc theo th t t$ng d(n. c) In ph(n t có s l(n xut hin nhiu nht trong m ng. 16. Nhp vào m ng a, b theo ki u cp phát  ng. V i: a) Các ph(n t ca a và b không trùng nhau. b) X p theo th t t$ng d(n hai m ng a, b. c) Ni hai m ng này li thành m t m ng duy nht sao cho m ng v!n t$ng. 17. Nhp vào m t m ng a. Thc hin sp x p sau: TT.Công Ngh Thông Tin 68/127
  69. Giáo trình PP lp trình a) Tt c các s l& nm phía tr c dãy s, các s ch.n nm phía sau dãy s, các s 0 nm gia. b) Nhp vào m t s x, hãy tìm s nguyên t trong a bé hn và g(n v i x nht. 18. Vi t chng trình nhp vào m ng m t chiu có n s nguyên dng. Hãy cho bi t s nào trong m ng có giá tr g(n v i trung bình c ng ca toàn m ng. 19. Nhp vào m t m ng có n s nguyên dng khác nhau. Hãy in ra tt c các ph(n t trong m ng có giá tr nh hn giá tr l n nht và l n hn giá tr nh nht ca m ng. 20. Vi t chng trình nhp ng!u nhiên m t m ng có n s nguyên dng. Nhp vào m t s nguyên dng k. Hãy tính trung bình c ng ca các ph(n t trong m ng có giá tr l n hn hay bng k. 21. Nhp vào m t dãy s nguyên dng ng!u nhiên (random) có n ph(n t. Vi t chng trình in ra s l n hn s nh nht ca dãy và nh hn hay bng v i mi s còn li (ngh+a là tìm s nh th hai trong dãy). N u n ph(n t u bng nhau thì thông báo: không t*n ti s c(n tìm. 22. Vi t chng trình nhp vào m ng s nguyên có n ph(n t. Hãy tìm s ch.n l n nht và s l& nh nht. 23. Hãy nhp dãy n s nguyên dng có giá tr trong kho ng t 1- >100. Sp x p li dãy s trên theo chiu t$ng d(n và loi b các ph(n t trùng nhau (ch, gi li m t giá tr trong s ó) 24. Hãy nhp dãy n s nguyên dng có giá tr trong kho ng t 1- >100. Sp x p li dãy s trên theo chiu t$ng d(n. Nhp vào m t s x nguyên dng. Chèn x vào dãy sao cho th t ca dãy không thay i. 25. Hãy nhp dãy n s nguyên dng có giá tr trong kho ng t 1 - > 100. In ra màn hình các s ch.n xut hin trong dãy theo th t t$ng d(n. 26. Hãy nhp dãy n s nguyên dng có giá tr trong kho ng t 1- >100. In ra giá tr trung bình c ng ca các s ch.n xut hin trong dãy. 27. Vi t chng trình thc hin các công vic sau: a) Nhp vào m t ma trn các giá tr thc kích th c mxn, v i n và m #c nhp t bàn phím. b) Tính tng các s dng có trong m ng. 28. Vi t chng trình thc hin các công vic sau: TT.Công Ngh Thông Tin 69/127
  70. Giáo trình PP lp trình a) Nhp vào m t ma trn các giá tr thc kích th c nxn, v i n #c nhp t bàn phím. b) Tìm tt c các v trí trong ma trn tha yêu c(u sau: giá tr ca ma trn ti v trí ó là giá tr l n nht ca ma trn. 29. Vi t chng trình thc hin công vic sau: a) Nhp vào s nguyên dng N. Cp phát  ng m t m ng nguyên A có N ph(n t. Thc hin vic nhp giá tr cho m ng này. b) Tìm s nguyên t l n nht có trong m ng. N u không có ph i có thông báo. 30. Vi t chng trình nhp vào ma trn vuông A(NxN), v i N nhp vào t bàn phím. a) In ra tng các giá tr trong tam giác vuông trên ca ma trn A (k c các ph(n t trên %ng chéo ca ma trn A) In ma trn tích AxA ra màn hình. TT.Công Ngh Thông Tin 70/127
  71. Giáo trình PP lp trình Chng 5 CON TR (Pointers) 1. Gi i thi%u Con tr8 M t con tr là 1 bi n cha m t a ch, b nhó. a ch, này là v trí ca m t i t#ng khác (th%ng là m t bi n) trong b nh . N u m t bi n cha a ch, ca m t bi n khác, bi n th nht #c gi là tr  n bi n th hai. Ví d: a ch, Bi n trong b nh b nh Mt bi n c cp phát ô nh ti a ch# 1000 có giá tr là a ch# (1003) ca 1 bi n khác. Bi n th nht c gi là con tr$. B nh TT.Công Ngh Thông Tin 71/127
  72. Giáo trình PP lp trình 2. Bin con tr8 (pointer variables) N u m t bi n s cha a ch, ca m t bi n khác thì nó ph i #c khai báo là m t con tr. Khai báo 1 bi n là con tr g*m ki u d liu c s", m t du *, và tên bi n. Dng tng quát  khai báo m t bi n con tr là type *pointerVariable; type: xác nh ki u d liu ca bi n mà con tr có th tr  n. Ví d con tr có ki u int s tr  n bi n có ki u int. Do các phép toán s hc trên con tr (t$ng, gi m) liên quan  n type ca nó nên c(n ph i khai báo type ca con tr úng n. 2.1. Các toán t con tr8 (pointer operators) Có 2 toán t con tr là * và &. Toán t & là toán t 1 ngôi mà tr v a ch, b nh ca toán hng ca nó. (toán t 1 ngôi ch, yêu c(u 1 toán hng). Ví d: int count; int *m; m = &count; Lnh m=&count; t a ch, b nh ca bi n count vào con tr m. Lnh trên có th phát bi u: "con tr m nhn a ch, ca bi n count.". Gi s bi n count #c cp phát ti a ch, b nh 2000  lu tr giá tr ca nó. Gi s rng count có giá tr 100. Nh vy, ti a ch, b nh 2000 có cha giá tr 100. Sau khi lnh m = &count; #c thc hin thì m s có giá tr là 2000. Toán t con tr * là toán t m t ngôi tr v giá tr ti a ch, con tr tr  n. Ví d: q = *m; Ly giá tr ti a ch, mà m tr  n và t vào bi n q. Nh vy q s có giá tr là 100 (là giá tr ca bi n count). TT.Công Ngh Thông Tin 72/127
  73. Giáo trình PP lp trình 2.2. Các thao tác trên con tr8 2.2.1. L%nh gán con tr8 Ta có th dùng m t con tr " bên ph i ca câu lnh gán (=)  gán giá tr ca 1 con tr cho m t con tr khác. Ví d: int x; int *p1, *p2; p1 = &x; p2 = p1; Sau khi an lnh trên #c thc hin, c hai p1 và p2 cùng tr  n bi n x. 2.2.2. Phép toán s( h0c trên con tr8 Ch, có 2 phép toán s hc ta có th dùng trên con tr ó là c ng và tr. Gi s p1 là m t con tr nguyên v i giá tr hin ti là 2000. C)ng gi s rng s nguyên chi m 2 bytes b nh . Nh vy, sau khi thc hin lnh p1++; thì p1 có giá tr là 2002 ch không ph i 2001. Tng t, Gi s p1 là m t con tr nguyên v i giá tr hin ti là 2000. C)ng gi s rng s nguyên chi m 2 bytes b nh . Nh vy, sau khi thc hin lnh p1 ; thì p1 có giá tr là 1998 ch không ph i 1999. Tng quát t 2 ví d trên: Tt c con tr s t$ng hay gi m v i n v là kích th c ca ki u d liu ca nó. TT.Công Ngh Thông Tin 73/127
  74. Giáo trình PP lp trình Gi s% ki u ký Gi s% ki u t  (char) có nguyên (int) kích thc 1 có kích thc 2 byte. bytes. Ngoài toán t t$ng (++) và gi m ( ), ta có th c ng hay tr s nguyên v i con tr. Ví d: theo hình minh ha trên. Con tr char ch cha a ch, 3000, vy lnh ch = ch + 3; ch s cha a ch, 3003 Con tr nguyên i cha a ch, 3000, vy lnh i = i + 2; i s cha a ch, 3004 Lu ý: n v t$ng ca con tr char là 1 byte, con tr int là 2 bytes. Tng t, gi s con tr char ch cha a ch, 3003, vy lnh ch = ch – 3; ch s cha a ch, 3000 TT.Công Ngh Thông Tin 74/127
  75. Giáo trình PP lp trình Gi s con tr nguyên i cha a ch, 3004, vy lnh i = i – 2; i s cha a ch, 3000 3. Mt s( ví d& v+ con tr8 Ví d 1: Vi t chng trình hoán i giá tr ca 2 bi n dùng con tr #include #include void main () { int a = 20, b = 15; int *pa, *pb, temp; pa = &a; // con tr pa cha a ch c a a pb = &b; // con tr pb cha a ch c a b temp = *pa; *pa = *pb; *pb = temp; cout << "a = " << a << endl; cout << ªb = º << b; getche(); } // k t qu xut ra màn hình a = 15 b = 20 4. C$p phát b nh ng Con tr cung cp s h tr# cho cp phát b nh  ng trong C/C++. Cp phát  ng là phng tin nh% ó m t chng trình có th dành #c thêm b nh trong khi ang thc thi. Bi n toàn cc (global variables) #c cp phát b nh vào lúc biên dch. Bi n cc b (local variables) dùng stack. Tuy nhiên, bi n toàn cc hay cc b không th #c to thêm trong khi thc thi TT.Công Ngh Thông Tin 75/127
  76. Giáo trình PP lp trình chng trình. M t s chng trình c(n thêm b nh khi thc thi, gi i pháp cho vn  này là cp phát  ng. C/C++ h tr# hai h thng cp phát  ng: m t cái #c nh ngh+a b"i C và m t cái b"i C++. 4.1. C$p phát ng  9c nh ngh.a b7i C B nh cp phát  ng b"i nhng hàm cp phát  ng ca C là t heap (heap là vùng nh" ri nm gia chng trình ca bn và vùng lu tr th%ng trc và stack). Mc d(u kích th c vùng nh heap là không bi t tr c, nhng nói chung là khá l n. Hai hàm cp phát  ng quan trng nht ca C là malloc() và free(). Nhng hàm này làm vic cùng nhau  dùng vùng nh ri  cp phát và thu h*i b nh . Hàm malloc() dùng  cp phát b nh  ng và hàm free() dùng  thu h*i. Bt k/ chng trình nào dùng nhng hàm này ph i include tp tin header stdlib.h. Hàm malloc() có nguyên m!u (prototype) sau: void *malloc(length) length: là s byte mun cp phát b nh . Hàm malloc() tr v m t con tr có ki u void, do ó có th gán nó cho con tr có ki u bt k/. Sau khi cp phát thành công, hàm malloc() tr v a ch, ca byte (u tiên ca vùng nh #c cp phát t heap. N u không thành công (không có  vùng nh ri yêu c(u), hàm malloc() tr v null. an mã d i ây cp phát 1000 bytes vùng nh liên tc: char *p; p = (char *) malloc(1000); //c p phát 1000 bytes Vì hàm malloc() tr v con tr ki u void, trong tr%ng h#p này ta ph i ép ki u (casting) nó thành con tr char cho phù h#p v i bi n con tr p. on mã d i ây cp phát vùng nh cho 50 s nguyên. int *p; TT.Công Ngh Thông Tin 76/127
  77. Giáo trình PP lp trình p = (int *) malloc(50*sizeof(int)); Lu ý: trong ví d trên ta dùng toán t sizeof  xác nh kích th c ki u d liu int. T ó, do kích th c ca heap thì không xác nh nên khi cp phát b nh ta ph i ki m tra giá tr tr v ca hàm malloc()  bi t là b nh có #c cp phát thành công hay không. on mã d i ây dùng  ki m tra: p = (int *)malloc(100); if(p == NULL) { cout << "Khong du bo nho"; exit(1); } Hàm free() thì ng#c li v i hàm malloc(). free() tr v vùng nh #c cp tr c ó cho h thng. Hàm free() có khuôn m!u sau: void free(void *p); 1 ây, p là con tr  n vùng nh ã #c cp phát tr c ó b"i hàm malloc(). 4.2. C$p phát ng  9c nh ngh.a b7i C++ C++ cung cp hai toán t cp phát b nh  ng: new và delete. Nhng toán t này dùng  cp phát và thu h*i b nh trong khi chng trình thc thi. Toán t new cp phát b nh và tr v m t con tr  n byte (u tiên ca vùng nh #c cp phát. Toán t delete thu h*i vùng nh #c cp phát tr c ó b"i toán t new. Dng tng quát ca new và delete là: p = new type; delete p; TT.Công Ngh Thông Tin 77/127
  78. Giáo trình PP lp trình 1 ây, p là m t bi n con tr mà nhn a ch, ca vùng nh #c cp phát  l n  cha 1 i t#ng có ki u là type. Ví d: #include #include int main() { int *p; p = new int; // allocate space for an int *p = 100; cout << "At " << p << " "; cout << "is the value " << *p << "\n"; delete p; return 0; } 5. Con tr8 void (void pointers) Ki u d liu khi khai báo bi n con tr chính là ki u d liu mà con tr có th tr  n. a ch, t vào bi n con tr ph i cùng ki u v i ki u ca con tr. Xem xét an mã sau: int a; float f; int *pa; float *pf; Nhng lnh sau là h#p l: pa = &a; pf = &f; Nhng lnh sau là không h#p l: pa = &f; //pa là con tr int do ó ch cha a ch //c a bin kiu int pf = &a; //pf là con tr float do ó ch cha // a ch c a bin kiu float TT.Công Ngh Thông Tin 78/127
  79. Giáo trình PP lp trình Con tr void là m t lai con tr c bit mà có th tr  n bt k/ ki u d liu nào. Cú pháp khai báo con tr void nh sau: void *pointerVariable; N u ta khai báo con tr void sau: void *p; thì các lnh sau ây là h#p l p = &a; //sau lnh này p tr n bin nguyên a p = &f; //sau lnh này p tr n bin thc f Tuy nhiên, tùy thu c con tr void ang tr  n ki u d liu nào, ta ph i ép v úng ki u tng ng khi dùng trong các bi u thc. Ví d p ang tr  n bi n nguyên a,  t$ng giá tr ca bi n a lên 10 ta ph i dùng lnh sau: (int*)*p + 10; N u p ang tr  n bi n thc f,  t$ng giá tr ca bi n f lên 10 ta ph i dng lnh sau: (float*)*p + 10; 6. Con tr8 null (Null pointers) M t con tr hin hành không tr  n m t a ch, b nh h#p l thì #c gán giá tr NULL (mà là zero). B"i qui  c, con tr NULL là con tr không tr  n âu c và không nên dùng. NULL #c nh ngh+a trong N u chng trình vô tình dùng con tr null nh d i ây thì s nhn li khi thc thi chng trình (run-time error). #include void main() { int *p; cout << ªGia tri con tro p tro den la: ª << *p; } TT.Công Ngh Thông Tin 79/127
  80. Giáo trình PP lp trình K t qu ca chng trình trên là: NULL POINTER ASSIGNMENT Chng trình trên s gây ra li vào lúc thc thi vì bi n con tr p không #c gán a ch, b nh h#p l. Nó là con tr null, vì vy, truy cp  n a ch, 0 gây ra thông báo li trên. 7. Con tr8 và mng Gia con tr và m ng có m t s quan h g(n. Xem xét an mã d i ây: char ch[10], *p; p = ch; ch p p+1 p+2 p+9 ch[0] ch[1] ch[2] ch[3] ch[4] ch[5] ch[6] ch[7] ch[8] ch[9] 1 ây, p #c gán a ch, ca ph(n t (u tiên ca m ng ch. tham chi u ph(n t th 3 trong m ng ch, ta dùng m t trong 2 cách sau: ch[2] hoc *(p+2). C hai cách u tham chi u  n ph(n t th ba trong m ng ch (lu ý ch, mc ca m ng bt (u là 0). Tng quát: C/C++ cung cp hai phng thc  truy cp các ph(n t m ng: dùng ch, mc thông qua tên m ng và dùng s hc con tr. Tên m ng #c xem là “ con tr hng” ngh+a là nó cha a ch, ca ph(n t (u tiên trong m ng và giá tr này không bao gi% thay i. Do ó ta không th áp dng các phép toán s hc (c ng, tr) cho tên m ng. Nh vy, trong ví d trên ch là tên m ng *ng th%i c)ng là con tr hng và lnh p = ch; sao chép a ch, ca ch vào bi n con tr p. TT.Công Ngh Thông Tin 80/127
  81. Giáo trình PP lp trình Ví d: In ra giá tr các ph(n t ca m ng sau khi ã nhân cho 10 dùng con tr #include void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; int *p; p = a; for(int i=0 ; i<10 ; i++) { *(p+i) *= 10; //tuong duong a[i] = a[i]*10 cout << ªa[ª << i << ª] = ª << *(p+i) << º\nº; } } 8. Mng con tr8 Mi bi n con tr là m t bi n n. Ta có th to m ng ca các con tr. Mi ph(n t ca m ng là m t con tr thông th%ng. Cú pháp  khai báo m ng con tr là: type *pointerArray[elements]; type: ki u d liu mà các con tr ph(n t tr  n. pointerArray: tên m ng con tr. elements: s ph(n t ca m ng con tr. Ví d: int *p[5]; lnh này khai báo m ng con tr p có 5 ph(n t. Các lnh d i ây minh ha cách s dng m ng này: p[0] = &a; //gán a ch, ca bi n nguyên a cho con tr p[0] p[2] = p[0]; //sao chép a ch, có trong p[0] vào p[2] b = *p[0]; //gán giá tr ti a ch, p[0] tr  n vào bi n b. Trong tr%ng h#p này, lnh tng ng v i b=a; vì hin ti p[0] cha a ch, ca bi n a. TT.Công Ngh Thông Tin 81/127
  82. Giáo trình PP lp trình BÀI TP CHNG 5 1. Vi t chng trình nhp vào m t m ng a g*m n ph(n t nguyên. Sp x p m ng theo chiu gi m d(n (lu ý s dng tên m ng nh con tr và s dng con tr). 2. Hãy dùng m t vòng for  nhp vào m t ma trn vuông cp n v i các ph(n t thc và tìm ph(n t Max ca ma trn này. 3. Vi t hàm hoán v hai bi n thc a, b bng cách s dng con tr (i vào là hai con tr). Vi t chng trình chính nhp hai s thc a, b. S dng hàm trên  i ch a và b. 4. Vi t hàm gi i h phng trình bc nht v i sáu i vào là a, b, c, d, e, f và 2 i ra là x và y. 5. Vi t hàm tính giá tr a thc: n f(x) = a0x + + an-1x + an. v i i vào là bi n nguyên n và m ng thc a. 6. Vi t hàm c ng hai ma trn vuông a và b cp n (s dng con tr). 7. Vi t chng trình tính tích phân ca f(x) trên on [a, b] bng công thc hình thang. Theo ó, tích phân ca f(x) trên [a, b] bng: h * s. Trong ó: h là  dài kho ng phân hoch on [a, b] thành n kho ng. s là tng tt c các f(a+i*h) v i i t 1 t i n. S dng hàm trên  tính tích phân trong on [-1, 4] ca: f(x) = (ex-2sin(x2))/ (1+x4). (nghiên cu cách a con tr vào gi i quy t bài toán). TT.Công Ngh Thông Tin 82/127
  83. Giáo trình PP lp trình Chng 6 HÀM (Functions) 1. Khái ni%m hàm M t hàm là m t khi lnh #c t tên và có m t tính cht là nó có th #c thc thi t nhiu i m khác nhau trong chng trình khi #c gi. Hàm nhóm m t s lnh thành m t khi và #c t m t tên. Khi này còn gi là unit hay module. Hàm có th #c gi t nhiu ch khác nhau trong chng trình. Khi hàm #c gi, khi lnh tng ng ca hàm #c thc thi. Sau khi thc hin xong, quyn iu khi n #c tr v cho chng trình gi. Xem hình minh ha dòng thc thi ca chng trình có gi  n nhiu hàm. void main() f1() { { . ; . ; . } f1(); . f2() . { . ; f2(); ; . } . . f3(); f3() . { . ; . ; } } TT.Công Ngh Thông Tin 83/127
  84. Giáo trình PP lp trình Hàm còn #c gi là chng trình con (subroutine). Hàm có th tr v giá tr cho chng trình gi hoc không. N u hàm không tr v giá tr cho chng trình gi thì nó #c gi là th tc (procedure). Hàm có th #c gi t chng trình chính (hàm main) hoc t 1 hàm khác. Hàm có th #c gi nhiu l(n. Có hai lai hàm: hàm th vin và hàm do ng%i dùng nh ngh+a. Hàm th vin là nhng hàm ã #c xây dng s.n. Mun s dng các hàm th vin trong chng trình ta ph i khai báo th vin cha nó trong ph(n khai báo #include. Ví d: Tìm min ca 4 giá tr a,b,c,d #include int min(int a, int b); //prototype void main() { int a=40, b=30, c=10, d=20, min4; min4 = min(a,b); min4 = min(min4,c); min4 = min(min4,d); cout << ªMin = ª << min4; } int min(int a, int b) { if(a<b) return a; else return b; } 2. D!ng t/ng quát ca hàm Hàm có dng tng quát nh sau: returnType functionName(parameterList) { body of the function } TT.Công Ngh Thông Tin 84/127
  85. Giáo trình PP lp trình returnType: Ki u d liu ca giá tr tr v b"i hàm. N u hàm không tr v giá tr thì returnType là void functionName: Tên hàm. parameterList: Danh sách các tham s hình thc #c t trong cp du (). Là danh sách các tên bi n và ki u d liu tng ng ca chúng phân cách nhau b"i du phy. N u hàm không có tham s thì danh sách này là rng. Ví d: xem khai báo hàm sau: int max(int a, int b) { if(a<b) return b; else return a; } Trong ví d trên, max là tên hàm, hàm c(n 2 tham s  hat  ng là 2 bi n nguyên, d liu tr v ca hàm có ki u int. Ph(n mã nm gia {} là thân hàm. 3. Các qui t2c v+ ph!m vi ca hàm Hàm ging nh m t h p en, bên trong hàm (thân hàm) là không bi t i v i nhng lnh nm ngoài hàm. Ph(n thân ca hàm ch, #c thc thi khi hàm #c gi. Do ó, không có lnh nào bên ngoài hàm có th nh y trc ti p vào thân hàm. Tóm li, mã và d liu bên trong m t hàm không th tng tác v i mã và d liu nm trong m t hàm khác. Nhng bi n #c khai báo bên trong hàm (k c các tham s hình thc) là nhng bi n cc b . Nhng bi n này #c to ra khi hàm #c gi và bi n mt sau khi hàm thc thi xong. 4. Tham s( hình th*c và tham s( th#c Khi hàm c(n nhn i s (arguments)  thc thi thì khi khai báo hàm c(n khai báo danh sách các tham s  nhn giá tr t chng trình gi. Các tham s này #c gi là tham s hình thc. Khi gi hàm, ta cung cp các giá tr tht, các giá tr này s #c sao chép vào các tham s hình thc và khi ó ta gi chúng là tham s thc. TT.Công Ngh Thông Tin 85/127
  86. Giáo trình PP lp trình Ví d: Xem xét nh ngh+a hàm sau int min(int a, int b) { if(a<b) return a; else return b; } Trong nh ngh+a hàm min " trên thì a và b là 2 tham s hình thc. Khi gi hàm nh câu lnh sau: minAB = min(15,7); thì 15 #c sao chép vào bi n a, 7 #c sao chép vào bi n b. 15 và 7 #c gi là i s. Khi a và b nhn giá tr do l%i gi hàm thì chúng #c gi là tham s thc. i s (arguments) minAB = min(15,7); sao chép int min(int a, int b) { Tham s hình thc if(a<b) return a; else return b; } Có hai cách truyn i s vào tham s hình thc: Truyn tham tr và truyn tham bi n. 4.1. Truy+n tham tr (call by value) Cách này sao chép giá tr ca i s vào tham s hình thc ca hàm. Trong tr%ng h#p này, nhng thay i ca tham s không nh h"ng  n i s. Nh vy, n u không mun hàm làm thay i giá tr ca i s truyn vào thì ta khai báo tham s ca hàm là bi n thông th%ng (ngh+a là không ph i bi n con tr). TT.Công Ngh Thông Tin 86/127
  87. Giáo trình PP lp trình Ví d: Kh o sát chng trình sau #include void doubleNum(int a); //prototype void main() { int a=40; doubleNum(a); cout void doubleNum(int *b); //prototype void main() { int a=40; doubleNum(&a); cout << ª\nInside main function:º; cout << ªa = ª << a << endl; } void doubleNum(int *b) { *b = *b + *b; cout << ªInside doubleNum function. a = ª << *b; } TT.Công Ngh Thông Tin 87/127
  88. Giáo trình PP lp trình Trong chng trình trên, khi gi hàm doubleNum ta truyn a ch, ca i s a vào bi n con tr b ca hàm. Nh vy, con tr b s cha a ch, ca bi n a ca hàm main. Trong thân hàm doubleNum, lnh làm gp ôi giá tr ca vùng nh do con tr b tr  n thc cht ã làm t$ng gp ôi giá tr ca bi n a trong hàm main. Ví d 2: Hoán i giá tr 2 bi n dùng con tr (truyn tham chi u) #include void swap(int *a, int *b); //prototype void main() { int a = 20, b = 40; int *pa, *pb; pa = &a; pb = &b; swap(pa,pb); cout << ªAfter call swap, Values:º << endl; cout << ªa = ª << a << endl; cout << ªb = ª << b << endl; } void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } 5. Truy+n mng vào hàm Khi m t m ng #c dùng nh m t i s  truyn cho hàm, a ch, ca m ng #c truyn  n hàm vào tham s hình thc. Nh vy, truyn m ng vào hàm mc nh là truyn tham chi u. Do ó, nhng thay i  n giá tr ca các ph(n t m ng trong thân hàm s nh h"ng  n m ng gc. TT.Công Ngh Thông Tin 88/127
  89. Giáo trình PP lp trình Ví d: Vi t chng trình thay i giá tr các ph(n t m ng theo yêu c(u: n u giá tr >=0 thì thay bng 1, ng#c li thay bng 0. #include void change(int a[], int elements); //prototype void main() { int arr[] = {5, -5, -3, 3, 7, -7}; change(arr,6); cout << ªAfter call change, value of array:\nº; for(int i=0 ; i<6 ; i++) cout << ªarr[ª <<i<< ª] = ª << arr[i] << endl; } void change(int a[], int elements) { for(int i=0 ; i<elements ; i++) if(a[i] < 0) a[i]=0; else a[i] = 1; } Nh vy, sau khi gi hàm change, giá tr các ph(n t trong m ng b thay i thành 0 hay 1. 6. (i s( ca hàm main Hàm main là i m bt (u ca mi chng trình C/C++. Th,nh tho ng, ta c(n truyn thông tin vào hàm main khi nó thc thi. Nhng thông tin này ta gi là i s dòng lnh (command line arguments). Hàm main có 2 tham s là argv và argc dùng  nhn các i s dòng lnh. Tham s argc là m t bi n nguyên gi s i s có trong dòng lnh. Tham s argv là m t m ng con tr char. Mi ph(n t ca m ng này tr  n m t i s dòng lnh. Tt c i s dòng lnh là chui (string). TT.Công Ngh Thông Tin 89/127
  90. Giáo trình PP lp trình Khi hàm main có nhn i s dòng lnh, nó #c khai báo nh sau: int main(int argc, char *argv[]) Xem xét chng trình sau: #include int main(int argc, char *argv[]) { if(argc!=2) { count << ªHello, ª << argv[1]; exit(1); } return 0; } Gi s sau khi biên dch chng trình trên, ta #c tp tin thc thi là greeting.exe Ti du nhc h iu hành DOS, ta nhp lnh sau: greeting Mr.IT Thì trên màn hình xut hin: Hello, Mr.IT Lnh geeting Mr.IT g*m 2 i s dòng lnh là getting và Mr.IT, các i s này #c tr  n b"i 2 con tr là argv[0] và argv[1]. Do ó, khi thc thi chng trình trên, chui Mr.IT s #c in ra. Khi m t chng trình không yêu c(u cung cp i s dòng lnh, thông th%ng nó #c khai báo là main() mà không có tham s. ây là m!u #c dùng cho h(u h t các ví d trong tài liu này. 7. L%nh return Lnh return có 2 cách dùng quan trng. Th nht, nó k t thúc ngay lp tc hàm cha nó khi n s thc thi chng trình #c tr v cho chng trình gi hàm. Th hai, nó dùng  tr v m t giá tr cho chng trình gi. TT.Công Ngh Thông Tin 90/127
  91. Giáo trình PP lp trình 7.1. Cách dùng th* nh$t (kt thúc hàm) Có hai cách thc  hàm k t thúc s thc thi ca nó và tr iu khi n v chng trình gi nó. M t là (thông th%ng) là khi lnh cui cùng có trong hàm #c thc thi. Ví d: Xem xét chng trình sau: #include void printMessage(); void main() { cout int main() { int a[] = {3,2,1,0,-1,-2,-3}; for(int i=0 ; i<7 ; i++) { if(a[i] < 0) return 0; cout << a[i] << ª\tº; } } TT.Công Ngh Thông Tin 91/127
  92. Giáo trình PP lp trình Thc hin chng trình trên, khi duyt  n ph(n t a[4] có giá tr là -1 nên bi u thc iu kin ca câu lnh if là true nên lnh return #c thc thi và chng trình k t thúc. 7.2. Cách dùng th* hai (tr v+ mt giá tr) Xem xét ví d sau: Tính tng các ph(n t có trong m ng #include int total(int a[], int size); void main() { int a1[] = {1,2,3}; int a2[] = {1,2,3,4,5,6}; int total1, total2; total1 = total(a1,3); total2 = total(a2,6); cout << ªTong mang 1 la = ª << total1 << endl; cout << ªTong mang 2 la = ª << total2 << endl; } int total(int a[], int size) { int sum=0; for(int i=0 ; i<size ; i++) sum += a[i]; return sum; } Nh vy, mi khi hàm total #c gi, m ng tng ng #c tính tng và lnh return tr v giá tr này cho chng trình gi. 8. % qui M t hàm có th gi  n chính nó. M t hàm #c gi là  qui n u m t lnh trong thân hàm gi  n chính hàm ó. Ví d, xem xét chng trình tính giai tha ca n. n! = 1*2* *n TT.Công Ngh Thông Tin 92/127
  93. Giáo trình PP lp trình #include int giaiThua(int n); void main() { int gt4, gt7; gt4 = giaiThua(4); gt7 = giaiThua(7); cout << ª4! =ª << gt4 << endl; cout << ª7! =ª << gt7 << endl; } int giaiThua(int n) { int gt; if(n==1) return(1); gt = giaiThua(n-1)*n; // goi de qui return gt; } 9. Nguyên m:u hàm (function prototypes) Trong C/C++, tt c các hàm ph i #c khai báo tr c khi chúng #c s dng. Vic này thc hin bng cách khai báo nguyên m!u ca hàm. Nguyên m!u hàm cho phép C/C++ cung cp chc n$ng ki m tra s h#p l ca tham s khi nh ngh+a c)ng nh khi gi hàm. Khi biên dch, trình biên dch s da vào nguyên m!u hàm  ki m tra xem có s không h#p l nào ca các i s khi gi hàm và ki u ca các tham s hình thc trong nh ngh+a hàm. Nó c)ng ki m tra xem s i s cung cp khi gi hàm có phù h#p v i s tham s hình thc ca hàm. Dng tng quát ca m t nguyên m!u hàm: type functionName(type parameter1, type parameter2, ); type: ki u d liu tr v b"i hàm functionName: tên hàm parameter1, parameter2, : danh sách các tham s hình thc và ki u ca chúng. Lu ý: Khai báo nguyên m!u hàm ph i có du chm phy " cui. Nhng khi nh ngh+a hàm thì không có. TT.Công Ngh Thông Tin 93/127
  94. Giáo trình PP lp trình 10. C$u trúc ca mt ch ng trình vit d i d!ng hàm - Ph(n khai báo các th vin - Ph(n khai báo các hng toàn cc (n u có) - Ph(n khai báo các bi n toàn cc (n u có) - Ph;n khai báo các nguyên m:u hàm (prototype) - Ph(n hàm main (s gi các hàm thc hin) - Ph;n nh ngh.a các hàm ã  9c khai báo prototype Ví d : Vi t chng trình nhp vào 2 s nguyên a,b và xut ra màn hình s l n nht trong 2 s (s dng hàm) #include // Khai báo th vin iostream.h #include // Khai báo th vin conio.h int max(int x, int y);// khai báo nguyên mu hàm max void main()//hàm main (s gi các hàm thc hin) { int a, b;// khai báo bin cout >a>>b; cout y) ? x:y; } TT.Công Ngh Thông Tin 94/127
  95. Giáo trình PP lp trình BÀI TP CHNG 6 Vi t li tt c bài tp chng 3 và 4 d i dng hàm. TT.Công Ngh Thông Tin 95/127
  96. Giáo trình PP lp trình Chng 7 CHUI KÝ T (Strings) 1. Gi i thi%u Chu,i Trong C/C++, m t chui là m t m ng ký t v i ký t null " cui chui. Ký t null (‘\0’ ) là ký t dùng  k t thúc chui. Nh vy, m t chui bao g*m các ký t to nên chui và theo sau là ký t null. Khi khai báo m t m ng ký t dùng  cha chui, ta c(n khai báo nó dài hn 1 byte  cha ký t null. Ví d:  khai báo m t m ng str  cha chui có  dài 10 ký t, ta ph i khai báo nh sau: char str[11]; Hng chui là chui #c bao quanh b"i cp du nháy ôi. Ví d: "Hello" là m t hng chui. Ta không c(n thêm ký t null vào sau chui vì trình biên dch s làm iu này t  ng. 2. Khai báo và kh7i t!o chu,i Có 2 cách khai báo và kh"i to chui. Gi s khai báo và kh"i to chui “ Hello” . Cách 1: Dùng m ng m t chiu char str[] = {‘H’ ,’ e’ ,’ l’ ,’ l’ ,’ o’ ,’ \0’ }; Lu ý: trong tr%ng h#p này, ta phái thêm ký t null vào cui. hoc char str[] = “ Hello” ; Lu ý không cung cp ký t null. Chui trên #c lu tr trong b nh nh sau: ký t null ‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’ str[0] str[1] str[2] str[3] str[4] str[5] TT.Công Ngh Thông Tin 96/127
  97. Giáo trình PP lp trình Cách 2: Dùng con tr char *str = “ Hello” ; 3. Nhp chu,i nhp d liu cho bi n chui, ta dùng hàm gets() ca th vin stdio.h. Hàm này có cú pháp sau: char *gets(char *s); Hàm gets() c các ký t t bàn phím (stdin) vào trong m ng tr  n b"i s cho  n khi nhn Enter. Ký t null s #c t sau sau ký t cui cùng ca chui nhp vào trong m ng. Hoc ta có th dùng cin (Console INput). Cú pháp nh sau: cin >> s; 4. Xu$t chu,i xut chui ra màn hình, ta dùng hàm puts() ca th vin stdio.h. Hàm này có cú pháp sau: int puts(const char *s); Hoc ta có th dùng cout (Console OUTput). Cú pháp nh sau: cout strcpy(s1, s2) Sao chép chui s2 vào s1 strcat(s1, s2) Ni chui s2 vào cui chui s1 strlen(s1) Tr v  dài ca chui TT.Công Ngh Thông Tin 97/127