Giáo trình môn Phương pháp lập trình
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:
- giao_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
- 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
- Giáo trình PP lp trình M C L C Ch ng 1: TNG 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 quyt mt 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 mt chng trình C/C++ n gi n 7 5. Các chú thích (comments) 9 6. Cu trúc ca mt 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. Bin (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 vit 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
- 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. Bin con tr (pointer variables) 72 3. Mt 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 mt chng trình vit 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. Mt s hàm th vin thao tác trên chui 97 6. Mt 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
- Giáo trình PP lp trình Chng 1 TNG 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 mt ti u ban chun hóa C #c bit 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à mt 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 Mt chng trình máy tính #c thit k gi i quyt mt bài toán nào ó. Vì vy, nhng b c c(n tìm kim l%i gi i cho mt bài toán c)ng ging nh nhng b c c(n vit mt chng trình. Các b c g*m: - Xác nh yêu c(u ca bài toán. - Ngh+ ra mt phng cách (algorithm) tìm l%i gi i. - Thc hin phng cách ó. - Ki m tra kt 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
- Giáo trình PP lp trình Khi vit mt 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 quyt bài toán (dùng mã gi , lu *, ) 3. Cài t (vit) 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. Mt 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 kt (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
- Giáo trình PP lp trình 3.1. So!n tho mã ngu"n (source code editor) Mã ngu*n là mt 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 vit bng nhng t ging ting 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 mt chng trình #c vit 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 mt 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ó mt 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 mt chui ký t t bàn phím (gets()), tính c$n bc hai (sqrt()), mà chng trình #c vit có th s dng mà không ph i vit li. Tp tin i t#ng #c to ra b"i trình biên dch s kt 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 kt (linking), #c thc hin b"i mt chng trình gi là b liên kt (linker). TT.Công Ngh Thông Tin 6/127
- 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 kt 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. Nu 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 kt 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 mt 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
- 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 bit c(n ph i gp 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 thuc vào v trí ca hàm, ni dung ca nó luôn #c thc hin (u tiên khi chng trình thc thi. Mt chng trình C/C++ u ph i t*n ti mt hàm main(). Hàm main() có th có hoc không có tham s. Ni dung ca hàm main() tip ngay sau ph(n khai báo chính thc #c t trong cp du ngoc { }. cout << "Hello World!"; ây là mt lnh nm trong ph(n thân ca hàm main. cout là mt 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, kt qu là chui "Hello World!" #c xut ra màn hình. Dòng lnh #c kt thúc bng du chm phy (;). getche(); ây là mt hàm th vin dùng ch% nhp mt ký t t bàn phím. return 0; Lnh return kt 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à mt kt thúc bình th%ng ca mt chng trình không có li trong quá trình thc hin. Chng trình trên có th vit li nh sau: int main() { cout << " Hello World! "; getch(); return 0;} c)ng cho cùng mt kt qu . TT.Công Ngh Thông Tin 8/127
- 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; } Kt qu xut ca chng trình là: Hello World! I hate C/C++. TT.Công Ngh Thông Tin 9/127
- Giáo trình PP lp trình 6. C$u trúc ca mt ch ng trình C/C++ Cu trúc mt 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 bin 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
- 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 bin (scanf())/cin), nhn ký t t bàn phím (getc()), in ký t ra màn hình (putc()), nhp mt 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
- 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 bin 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 chim 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 thuc 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 kt 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
- 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 bin, 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à mt 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
- 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 bin, 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) Mt bin là nh danh ca mt vùng trong b nh dùng gi mt giá tr mà có th b thay i b"i chng trình. Tt c bin ph i #c khai báo tr c khi #c s dng. Dng khai báo bin tng quát là: type variableNames; type: ph i là mt trong các ki u d liu h#p l. variableNames: tên ca mt hay nhiu bin 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 bin 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
- 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 biu thc là vô ngha. Bin #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 bin này #c gi l(n l#t là bin cc b, các tham s hình thc, và bin toàn cc. 4.1. Bin c&c b (local variables) Nhng bin #c khai báo bên trong mt hàm gi là bin cc b. Các bin cc b ch, #c tham chiu n ch, b"i nhng lnh nm trong khi (block) có khai báo bin. Mt khi bt (u v i du { và kt thúc v i du }. Bin 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; } Bin nguyên x #c khai báo 2 l(n, mt trong hàm func1() và mt trong hàm func2(). Bin x trong func1() không có quan h gì v i bin 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
- Giáo trình PP lp trình 4.2. Các tham s( hình th*c (formal parameters) Nu mt hàm có nhn các i s truyn vào hàm thì nó ph i khai báo các bin nhn giá tr ca các i s khi hàm #c gi. Nhng bin này gi là các tham s hình thc. Nhng bin này #c i x ging nh các bin 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
- Giáo trình PP lp trình void decrease() { gVar = gVar -1;} Sau khi thc thi chng trình trên, kt 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 bin có th thay i trong sut quá trình thc thi chng trình. giá tr ca bin không b thay i, ta t tr c khai báo bin t khóa const. T khi bin ã 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 bin 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 mt 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à mt hng s thc. Ví d v cách vit 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
- Giáo trình PP lp trình 7. H'ng chu,i ký t# (string constants) C/C++ cung cp mt lai hng khác gi là chui. Mt chui là mt tp các ký t #c bao quanh b"i cp du nháy ôi. Ví d, "This is a string" là mt chui. Lu ý phân bit hng chui và hng ký t. Mt hng ký t là mt 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à mt hng bát phân) \xN Hng thp lc phân (v i N là mt 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
- 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 bin expression: Bi u thc Lu ý, phía bên trái du bng ph i là mt bin 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 bin ca mt ki u kt h#p v i nhng bin ca mt ki u khác thì mt 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 bin bên trái du bng. Ví d: int i=100; double d = 123.456; Nu 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. Nu thc thi lnh TT.Công Ngh Thông Tin 19/127
- 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
- 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
- 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 Kt 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: + (cng), - (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ì kt 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ì kt qu là 1. TT.Công Ngh Thông Tin 22/127
- 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 ++ cng 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; Nu thc hin lnh: n = ++x + 1; // n s có giá tr là 102 (1) Nu 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, nu thc hin lnh: m = x + 1; // n s có giá tr là 100 (3) Nu thc hin lnh: m = x + 1; // n s có giá tr 101 (4) TT.Công Ngh Thông Tin 23/127
- 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 mt 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 kt 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
- 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 Hoc (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 mt 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 mt 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
- Giáo trình PP lp trình Kt qu nh tr bi u thc trên là 1 (true). 13. Toán t ? (? operator) Toán t ? là mt 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. Nu kt qu là true thì Exp2 #c nh tr và giá tr ca nó tr" thành giá tr ca c bi u thc. Nu 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 mt ngôi mà tr v s byte ca ki u d liu chim 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, bin, bi u thc. Ví d sau cho bit 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
- 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º; } Kt qu khi thc hin chng trình trên: 15. Toán t d$u ph1y (comma operator) Toán t comma buc 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
- 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
- Giáo trình PP lp trình 16. Biu th*c (expressions) Mt bi u thc trong C/C++ là s kt h#p ca các thành ph(n nh toán t, hng, bin, và hàm có tr v giá tr. Th t nh tr ca bi u thc tùy thuc vào u tiên ca các toán t. Do ó, vit 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 vit li bi u thc trên rõ ràng d- c và thc hin nh mong mun, ta vit: result = (x * y) – (z % 10) + (w/2); 17. Chuyn /i kiu trong các biu th*c Khi các hng và bin ca nhng ki u khác nhau t*n ti trong mt 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
- 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 mt bi u thc thành mt 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 mt 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 kt 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 vit sau s cho cùng kt qa: TT.Công Ngh Thông Tin 30/127
- 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 mt 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 ó. Kt 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 vit 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 bin operator: Toán t s hc (+, -, *, /, %) expression: Bi u thc có th #c vit 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
- 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 tuyt 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
- 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. Vit 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. Vit 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. Vit 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. Vit chng trình nhp vào mt ký t: In ra mã ASCII ca ký t ó. In ra ký t k tip ca nó. 20. Vit chng trình nhp vào i m ba môn Toán, Lý, Hóa ca mt hc sinh. In ra i m trung bình ca hc sinh ó v i hai s l& thp phân. 21. Vit chng trình o ng#c mt s nguyên dng có úng 3 ký s. TT.Công Ngh Thông Tin 33/127
- 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 vit 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 kt 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): mt bi u thc kt thúc b"i 1 du chm phy gi là 1 lnh. Ví d: int a,b,c; a=10; a++; Khi lnh (block): mt hay nhiu lnh #c bao quanh b"i cp du {} #c gi là mt 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
- 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. Nu kt 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
- Giáo trình PP lp trình Gii thích: − Nu nhp mt 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: Vit chng trình nhp vào mt s nguyên a. In ra màn hình kt qu ki m tra a là s âm hay dng. TT.Công Ngh Thông Tin 36/127
- 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
- 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 vit nó trong cp du {} (coi nh là khi lnh) tránh s kt 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
- Giáo trình PP lp trình 3. CU TRÚC LA CHN switch Cu trúc switch là mt 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 mt 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
- 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
- Giáo trình PP lp trình Gi i thích: − Tr c ht chng trình s nh tr ca expression. − Nu giá tr ca expression bng value1 thì thc hin statement1 r*i thoát. − Nu giá tr ca expression khác value1 thì so sánh v i value2, nu bng value2 thì thc hin statement2 r*i thoát ., so sánh t i valueN. − Nu 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ó kt 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 buc 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 mt s nguyên, chia s nguyên này cho 2 ly ph(n d. Ki m tra nu ph(n d bng 0 thì in ra thông báo “là s ch.n” , nu 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
- Giáo trình PP lp trình Ví d 2: Nhp vào 2 s nguyên và 1 phép toán. − Nu phép toán là ‘+’, ‘-‘, ‘*’ thì in ra kt qua là tng, hiu, tích ca 2 s. − Nu phép toán là ‘/’ thì ki m tra xem s th 2 có khác không hay không? Nu 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
- 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 mt 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 - Nu 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
- 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: Nu kt qu là true thì thc hin statement r*i quay li b c 1. B c 3: Nu kt qu là false thì thoát khi vòng lp while. TT.Công Ngh Thông Tin 44/127
- Giáo trình PP lp trình Ví d 1: Vit 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 kt thúc " mt i m nào ó, vì vy bên trong vòng lp ph i cung cp mt cách thc nào ó buc expression tr" thành false nu không thì s lp vô tn. Trong ví d trên i++; là cách thc t$ng bin i n khi i=11 thì vòng lp kt thúc. TT.Công Ngh Thông Tin 45/127
- 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 mt 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: Nu expression là true thì quay li b c 1 B c 4: Nu expression là false thì thoát khi do while. TT.Công Ngh Thông Tin 46/127
- Giáo trình PP lp trình Ví d 1: Vit 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
- 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 mt 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 mt an lnh nào ó #c bit 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 bin 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: Nu 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
- Giáo trình PP lp trình Ví d 1: Vit 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à mt nh ngh+a bin. 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 mt vòng lp vô tn. for (;;) // vòng lp vô hn statement; TT.Công Ngh Thông Tin 49/127
- 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, nu 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 mt 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 mt 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 lp cout #include TT.Công Ngh Thông Tin 50/127
- 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 tip. Tuy nhiên, nu 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: mt vòng lp thc hin c mt 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
- 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); − Mt bin th ca vòng lp này là c chính xác mt 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
- 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 bit t thuc qúy my trong n$m. 10. Nhp vào tháng t (v i 1<=t<=12). Cho bit 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 ht cho 4 mà không chia ht cho 100, hoc chia ht cho 400). 11. Nhp vào mt 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 mt 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
- Giáo trình PP lp trình 13. Nhp vào mt ngày (ngày, tháng, nm). Cho bit ngày ó là ngày th bao nhiêu trong n$m. 14. Nhp vào mt n$m dng lch. Hãy cho bit n$m âm lch. (vd: n=2007 => inh H#i) 15. Nhp mt s n có ti a 2 ch s. Hãy cho bit cách c ra dng ch. (vd: n=35 => Ba mi l$m, n=5 => n$m). 16. Nhp mt s n có ti a 3 ch s. Hãy cho bit 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 mt s n bt k/. Hãy cho bit cách c ra dng ch. 18. Nhp vào i m Toán, Lý, Hoá. Hãy tính TB và Cho bit sinh viên ó xp loi gì (Xut sc, Gii, Khá, Trung bình, Yu) 19. Ki m tra s nguyên dng n có ph i là s chính phng hay không? 20. Vit chng trình nhp vào mt s nguyên dng n v i 1 =0, b>=0, c>=0. Nu 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. Vit chng trình nhp t bàn phím 2 s a, b và mt ký t ch. Nu: TT.Công Ngh Thông Tin 54/127
- Giáo trình PP lp trình o ch là “ +“ thì thc hin phép tính a+b và in kt qu lên màn hình o ch là “ –“ thì thc hin phép tính a-b và in kt qu lên màn hình. o ch là “ *” thì thc hin phép tính a*b và in kt qu lên màn hình. o ch là “ /” thì thc hin phép tính a/b và in kt qu lên màn hình. 24. Mt s nguyên dng chia ht cho 3 nu tng các ch s ca nó chia ht cho 3. Vit chng trình nhp vào mt s có 3 ch s, ki m tra s ó có chia ht cho 3 dùng tính cht trên.( if ) 25. Vit chng trình nhn vào gi%, phút, giây dng (hh:mm:ss ), t bàn phím. Cng thêm mt s giây vào và in ra kt qu d i dng ( hh:mm:ss ). 26. Ki m tra mt ký t nhp vào thuc 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 vit chng trình cho nhp vào ký t bi u di-n mt ký s ca h thp lc phân và cho bit giá tr thp phân tng ng. Tr%ng h#p ký t nhp vào không thuc 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
- 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
- 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
- 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ó? bit: Va gà va chó TT.Công Ngh Thông Tin 58/127
- Giáo trình PP lp trình bó li cho tròn ba mi sáu con mt tr$m chân ch.n. 89. Hãy tìm s trâu mi loi? bit: Tr$m trâu t$m c Trâu ng $n n$m Trâu nm $n ba Trâu già ba con mt 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. Vit chng trình thc hin trò chi oán s nh sau: Máy ly ra mt 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
- Giáo trình PP lp trình Ng%i nhp vào mt s (S(nhp) + Nu S(nhp l n hn S(máy thì thông báo “ S bn l n hn s máy” . + Nu S(nhp nh hn S(máy thì thông báo “ S bn nh hn s máy” . Trò chi kt 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 vit chng trình mô phng trò chi này sao cho máy có c hi 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 kt qu ca ván chi. TT.Công Ngh Thông Tin 60/127
- Giáo trình PP lp trình Chng 4 MNG (Array) 1. Gi i thi%u Mng M ng là mt tp h#p các bin có cùng ki u d liu nm liên tip nhau trong b nh và #c tham chiu b"i mt tên chung (tên m ng). Mi ph(n t ca m ng #c tham chiu thông qua ch, mc (index). Nu 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 chiu n mt 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 mt m ng mt 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
- Giáo trình PP lp trình arrayName: tên m ng Ging nh nhng bin 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 mt 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 chim 2 bytes) Mi ph(n t m ng là mt bin 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 mt 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
- Giáo trình PP lp trình 2.3. Mt s( ví d& Ví d 1: To mt 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
- 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 mt chiu. Ta có th xem m ng hai chiu là mt ma trn g*m các hàng và các ct. 3.1. Khai báo mng hai chi+u type arrayName[rows][columns]; rows: s hàng columns: s ct Gi s ta khai báo mt m ng num có 3 hàng và 4 ct, 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
- Giáo trình PP lp trình - S ph(n t ca mi hàng ph i bng s ct (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 mt 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 ct. Giá tr ca ph(n t trong m ng #c xác nh bng tích ca ch, mc hàng và ch, mc ct 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 mt 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
- 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
- Giáo trình PP lp trình BÀI TP CHNG 4 1. Vit chng trình nhp vào mt dãy n s thc a[0], a[1], , a[n- 1], sp xp dãy s theo th t gi m d(n. Xut ra dãy s sau khi sp xp. 2. Vit chng trình sp xp mt m ng theo th t t$ng d(n sau khi ã loi b các ph(n t trùng nhau. 3. Vit chng trình nhp vào mt 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. Vit chng trình nhp vào mt dãy các s theo th t t$ng, nu nhp sai quy cách thì yêu c(u nhp li. In dãy s sau khi ã nhp xong. 5. Vit chng trình nhp vào mt ma trn (m ng hai chiu) các s nguyên, g*m m hàng, n ct. In ma trn ó lên màn hình. 6. Vit chng trình chuy n i v trí t dòng thành ct ca mt ma trn (ma trn chuy n v) vuông 4 hàng 4 ct. Sau ó vit 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. Vit chng trình nhp vào mt m ng s t nhiên. Hãy xut ra màn hình: - Dòng 1 : g*m các s l&, tng cng có bao nhiêu s l&. - Dòng 2 : g*m các s ch.n, tng cng 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. Vit chng trình tính tng bình phng ca các s âm trong mt m ng các s nguyên. 9. Vit chng trình thc hin vic o mt m ng mt 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
- Giáo trình PP lp trình 10. Vit 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 kt qu lên màn hình. 11. Vit 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 kt 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 xp các s ch.n trong m ng theo th t t$ng d(n. 13. Vit chng trình nhp vào m ng a a) Vit hàm ki m tra m ng i xng không? Nu 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? Nu có tr v s l(n m ng b xut hin trong m ng a. 14. Vit 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 (nu 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. Vit chng trình thc hin các b c sau: a) Nhp m ng thc. b) Sp xp 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) Xp theo th t t$ng d(n hai m ng a, b. c) Ni hai m ng này li thành mt m ng duy nht sao cho m ng v!n t$ng. 17. Nhp vào mt m ng a. Thc hin sp xp sau: TT.Công Ngh Thông Tin 68/127
- 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 mt s x, hãy tìm s nguyên t trong a bé hn và g(n v i x nht. 18. Vit chng trình nhp vào m ng mt chiu có n s nguyên dng. Hãy cho bit s nào trong m ng có giá tr g(n v i trung bình cng ca toàn m ng. 19. Nhp vào mt 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. Vit chng trình nhp ng!u nhiên mt m ng có n s nguyên dng. Nhp vào mt s nguyên dng k. Hãy tính trung bình cng ca các ph(n t trong m ng có giá tr l n hn hay bng k. 21. Nhp vào mt dãy s nguyên dng ng!u nhiên (random) có n ph(n t. Vit 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). Nu n ph(n t u bng nhau thì thông báo: không t*n ti s c(n tìm. 22. Vit 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 xp 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 mt 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 xp li dãy s trên theo chiu t$ng d(n. Nhp vào mt 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 cng ca các s ch.n xut hin trong dãy. 27. Vit chng trình thc hin các công vic sau: a) Nhp vào mt 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. Vit chng trình thc hin các công vic sau: TT.Công Ngh Thông Tin 69/127
- Giáo trình PP lp trình a) Nhp vào mt 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. Vit chng trình thc hin công vic sau: a) Nhp vào s nguyên dng N. Cp phát ng mt 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. Nu không có ph i có thông báo. 30. Vit 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
- Giáo trình PP lp trình Chng 5 CON TR (Pointers) 1. Gi i thi%u Con tr8 Mt con tr là 1 bin cha mt a ch, b nhó. a ch, này là v trí ca mt i t#ng khác (th%ng là mt bin) trong b nh . Nu mt bin cha a ch, ca mt bin khác, bin th nht #c gi là tr n bin 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
- Giáo trình PP lp trình 2. Bin con tr8 (pointer variables) Nu mt bin s cha a ch, ca mt bin khác thì nó ph i #c khai báo là mt con tr. Khai báo 1 bin là con tr g*m ki u d liu c s", mt du *, và tên bin. Dng tng quát khai báo mt bin con tr là type *pointerVariable; type: xác nh ki u d liu ca bin mà con tr có th tr n. Ví d con tr có ki u int s tr n bin 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 bin count vào con tr m. Lnh trên có th phát bi u: "con tr m nhn a ch, ca bin count.". Gi s bin 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 mt 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 bin q. Nh vy q s có giá tr là 100 (là giá tr ca bin count). TT.Công Ngh Thông Tin 72/127
- 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 mt con tr " bên ph i ca câu lnh gán (=) gán giá tr ca 1 con tr cho mt 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 bin 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à cng và tr. Gi s p1 là mt con tr nguyên v i giá tr hin ti là 2000. C)ng gi s rng s nguyên chim 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à mt con tr nguyên v i giá tr hin ti là 2000. C)ng gi s rng s nguyên chim 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
- Giáo trình PP lp trình Gi s% kiu ký Gi s% kiu 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 cng 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
- 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: Vit chng trình hoán i giá tr ca 2 bin 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 ca a pb = &b; // con tr pb cha a ch ca b temp = *pa; *pa = *pb; *pb = temp; cout << "a = " << a << endl; cout << ªb = º << b; getche(); } // kt 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% ó mt chng trình có th dành #c thêm b nh trong khi ang thc thi. Bin toàn cc (global variables) #c cp phát b nh vào lúc biên dch. Bin cc b (local variables) dùng stack. Tuy nhiên, bin 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
- Giáo trình PP lp trình chng trình. Mt 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: mt cái #c nh ngh+a b"i C và mt 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 bit 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 mt 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. Nu 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 bin 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
- 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() bit 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 mt 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
- Giáo trình PP lp trình 1 ây, p là mt bin 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 bin con tr chính là ki u d liu mà con tr có th tr n. a ch, t vào bin 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 //ca bin kiu int pf = &a; //pf là con tr float do ó ch cha // a ch ca bin kiu float TT.Công Ngh Thông Tin 78/127
- Giáo trình PP lp trình Con tr void là mt 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; Nu 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 thuc 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 bin nguyên a, t$ng giá tr ca bin a lên 10 ta ph i dùng lnh sau: (int*)*p + 10; Nu p ang tr n bin thc f, t$ng giá tr ca bin f lên 10 ta ph i dng lnh sau: (float*)*p + 10; 6. Con tr8 null (Null pointers) Mt con tr hin hành không tr n mt 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 Nu 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
- Giáo trình PP lp trình Kt 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ì bin 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ó mt 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 chiu ph(n t th 3 trong m ng ch, ta dùng mt trong 2 cách sau: ch[2] hoc *(p+2). C hai cách u tham chiu 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 (cng, 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 bin con tr p. TT.Công Ngh Thông Tin 80/127
- 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 bin con tr là mt bin n. Ta có th to m ng ca các con tr. Mi ph(n t ca m ng là mt 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 bin 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 bin b. Trong tr%ng h#p này, lnh tng ng v i b=a; vì hin ti p[0] cha a ch, ca bin a. TT.Công Ngh Thông Tin 81/127
- Giáo trình PP lp trình BÀI TP CHNG 5 1. Vit chng trình nhp vào mt m ng a g*m n ph(n t nguyên. Sp xp 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 mt vòng for nhp vào mt 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. Vit hàm hoán v hai bin thc a, b bng cách s dng con tr (i vào là hai con tr). Vit chng trình chính nhp hai s thc a, b. S dng hàm trên i ch a và b. 4. Vit 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. Vit hàm tính giá tr a thc: n f(x) = a0x + + an-1x + an. v i i vào là bin nguyên n và m ng thc a. 6. Vit hàm cng hai ma trn vuông a và b cp n (s dng con tr). 7. Vit 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 quyt bài toán). TT.Công Ngh Thông Tin 82/127
- Giáo trình PP lp trình Chng 6 HÀM (Functions) 1. Khái ni%m hàm Mt hàm là mt khi lnh #c t tên và có mt 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 mt s lnh thành mt khi và #c t mt 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
- 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. Nu 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
- Giáo trình PP lp trình returnType: Ki u d liu ca giá tr tr v b"i hàm. Nu 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 bin và ki u d liu tng ng ca chúng phân cách nhau b"i du phy. Nu 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 bin 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 mt hp en, bên trong hàm (thân hàm) là không bit 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 tip vào thân hàm. Tóm li, mã và d liu bên trong mt hàm không th tng tác v i mã và d liu nm trong mt hàm khác. Nhng bin #c khai báo bên trong hàm (k c các tham s hình thc) là nhng bin cc b. Nhng bin này #c to ra khi hàm #c gi và bin 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
- 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 bin a, 7 #c sao chép vào bin 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 bin. 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, nu 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à bin thông th%ng (ngh+a là không ph i bin con tr). TT.Công Ngh Thông Tin 86/127
- 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
- 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 bin con tr b ca hàm. Nh vy, con tr b s cha a ch, ca bin 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 bin a trong hàm main. Ví d 2: Hoán i giá tr 2 bin dùng con tr (truyn tham chiu) #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 mt m ng #c dùng nh mt 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 chiu. 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
- Giáo trình PP lp trình Ví d: Vit chng trình thay i giá tr các ph(n t m ng theo yêu c(u: nu 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à mt bin nguyên gi s i s có trong dòng lnh. Tham s argv là mt m ng con tr char. Mi ph(n t ca m ng này tr n mt i s dòng lnh. Tt c i s dòng lnh là chui (string). TT.Công Ngh Thông Tin 89/127
- 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 mt 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 ht 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ó kt thúc ngay lp tc hàm cha nó khin s thc thi chng trình #c tr v cho chng trình gi hàm. Th hai, nó dùng tr v mt giá tr cho chng trình gi. TT.Công Ngh Thông Tin 90/127
- 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 kt thúc s thc thi ca nó và tr iu khi n v chng trình gi nó. Mt 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
- 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 kt 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 Mt hàm có th gi n chính nó. Mt hàm #c gi là qui nu mt 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
- 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 mt 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
- 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 bin 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 : Vit 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
- Giáo trình PP lp trình BÀI TP CHNG 6 Vit li tt c bài tp chng 3 và 4 d i dng hàm. TT.Công Ngh Thông Tin 95/127
- Giáo trình PP lp trình Chng 7 CHUI KÝ T (Strings) 1. Gi i thi%u Chu,i Trong C/C++, mt chui là mt m ng ký t v i ký t null " cui chui. Ký t null (‘\0’ ) là ký t dùng kt thúc chui. Nh vy, mt chui bao g*m các ký t to nên chui và theo sau là ký t null. Khi khai báo mt 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 mt 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à mt 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 mt 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
- 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 bin 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