lập trình C căn bản.....
HC VIN CÔNG NGH BU CHÍNH VIN THÔNG BÀI GING K THUT LP TRÌNH Biên son : Ths. NGUYN DUY PHNG Gii thiu môn hc GII THIU MÔN HC I. GII THIU CHUNG S phát trin công ngh thông tin trong nhng nm va qua đã làm thay đi b mt kinh t xã hi toàn cu, trong đó công ngh phn mm tr thành mt ngành công nghip quan trng đy tim nng. Vi s hi t ca công ngh vin thông và công ngh thông rin, t trng v giá tr phn mm chim rt cao trong các h thng vin thông cng nh các thit b đu cu i. Chính vì lý do đó, vic nghiên cu, tìm hiu, tin ti phát trin cng nh làm ch các h thng phn mm ca các k s đin t vin thông là rt cn thit. Tài liu ging dy “K thut lp trình” cho h đào to t xa đc xây dng da trên giáo trình “K thut lp trình” đã đc ging dy ti hc vi n trong nhng nm qua vi mc đích cung cp cho sinh viên nhng kin thc c bn nht, có tính h thng liên quan ti lp trình. Thông qua cun tài liu này, chúng tôi mun gii thiu vi các bn đc v k nng lp trình cu trúc và mt s thut toán quan trng, bao gm: i cng v lp trình cu trúc; Duyt và đ qui; Ngn xp, hàng đi và danh sách móc ni; Cây; th và cu i cùng là Sp xp và tìm kim. II. MC ÍCH Môn hc cung cp cho sinh viên k nng lp trình trên các cu trúc d liu quan trng nh: stack, queue mlink, tree & graph cùng vi phng pháp phân tích, thit k, đánh giá thut toán. Sau khi hc xong môn hc này, sinh viên có kh nng vit đc chng trình gii quyt nhng bài toán trong thc t. III. PHM VI NGHIÊN CU Nghiên cu các thut toán c bn đc s dng trong thc t nh các thut toán tìm kim, các thut toán liên quan đn đ th. Các gii thut lp trình da trên danh sách, cây… Nghiên cu cách cài đt các thut toán trên máy tính. Tìm hiu các lnh vc ng dng ca các thut toán, phng pháp trong thc t. IV. PHNG PHÁP NGHIÊN CU hc tt môn hc này, sinh viên cn lu ý nhng vn đ sau: 1. Kin thc cn trc Li nói đu 2 - Sinh viên phi có kin thc c bn v toán hc cao cp. - Thành tho ít nht mt ngôn ng lp trình. c bit trong cun sách này đã s dng ngôn ng lp trình C đ mô t thut toán, vì vy sinh viên phi nm đc ngôn ng lp trình C. 2. Các tài liu cn có: Sách hng dn hc tp K thut lp trình. Ths. Nguyn Duy Phng, Hc vin Công ngh Bu chính Vin thông, 2006. N u cn sinh viên nên tham kho thêm: - Giáo trình K thut lp trình. Ts. Lê Hu Lp, Ths. Nguyn Duy Phng, Hc vin Công ngh Bu chính Vin thông, 2002. - Bài ging đin t môn hc: “K thut lp trình” ca Hc vin Công ngh Bu chính Vin thông. 3. t ra mc tiêu, thi hn cho bn thân t ra các mc tiêu tm thi và thi hn cho bn thân và c gng thc hin chúng Xây d ng mc tiêu trong chng trình nghiên cu. 4 Nghiên cu và nm nhng kin thc ct lõi Sinh viên nên đc qua sách hng dn hc tp trc khi nghiên cu bài ging môn hc và các tài liu tham kho khác. 5. Tham gia đy đ các bui hng dn hc tp Thông qua các bui hng dn hc tp, ging viên s giúp sinh viên nm đc ni dung tng th ca môn hc và gii đáp thc mc, đng th i sinh viên cng có th trao đi, tho lun vi nhng sinh viên khác v ni dung bài hc. 6. Ch đng liên h vi bn hc và ging viên Cách đn gin nht là tham d các din dàn hc tp trên mng Internet, qua đó có th trao đi trc tip các vn đ vng mc vi ging viên hoc các bn hc khác đang online. 7. T ghi chép li nhng ý chính Vic ghi chép li nhng ý chính là mt ho t đng tái hin kin thc, kinh nghim cho thy nó giúp ích rt nhiu cho vic hình thành thói quen t hc và t duy nghiên cu. 8. Hc đi đôi vi hành Hc lý thuyt đn đâu thc hành làm bài tp và thc hành ngay đn đó đ hiu và nm chc lý thuyt. Sinh viên cn cài đt trên máy tính các thut toán trong bài hc bng các ngôn ng lp trình đ t đó có th hiu và nm chc hn t tng và ni dung ca thut toán. Hà Ni, ngày 20 tháng 02 nm 2006 Ths. Nguyn Duy Phng Chng 1: i cng v k thut lp trình cu trúc 3 CHNG 1: I CNG V K THUT LP TRÌNH CU TRÚC Ni dung chính ca chng này tp chung làm sáng t nhng nguyên lý c bn ca lp trình cu trúc. Nhng nguyên lý này đc coi nh nn tng t tng ca phng pháp lp trình cu trúc đã đc tích hp trong các ngôn ng lp trình. Nm vng các nguyên lý ca lp trình cu trúc không ch giúp ngi hc có cách tip cn ngôn ng lp trình nhanh chóng mà con giúp h cách t duy trong khi xây dng các h thng ng dng. Các nguyên lý c b n đc gii thiu trong chng này bao gm: X Nguyên lý lnh - lnh có cu trúc - cu trúc d liu. X Nguyên lý ti thiu. X Nguyên lý đa phng. X Nguyên lý an toàn. X Nguyên lý nht quán. X Nguyên lý Top-Down . X Nguyên lý Botton-Up. Bn đc có th tìm đc nhng chi tit sâu hn và rng hn trong tài liu [1] & [6]. 1.1. S LC V LCH S LP TRÌNH CU TRÚC Lp trình là mt trong nhng công vic nng nhc nht ca khoa hc máy tính. Có th nói, nng sut xây dng các sn phm phn mm là rt thp so vi các hot đng trí tu khác. Mt sn phm phn mm có th đc thit k và cài đt trong vòng 6 tháng vi 3 lao đng chính. Nhng đ kim tra tìm li và tip tc hoàn thin sn phm đó phi mt thêm chng 3 n m. ây là hin tng ph bin trong tin hc ca nhng nm 1960 khi xây dng các sn phm phn mm bng k thut lp trình tuyn tính. khc phc tình trng li ca sn phm, ngi ta che chn nó bi mt mành che mang tính cht thng mi đc gi là Version. Thc cht, Version là vic thay th sn phm c bng cách sa đi nó ri công b d i dng mt Version mi, ging nh: MS-DOS 4.0 ch tn ti trong thi gian vài tháng ri thay đi thành MS-DOS 5.0, MS-DOS 5.5, MS-DOS 6.0 . . . ây không phi là mt sn phm mi nh ta tng mà trong nó còn tn ti nhng li không th b qua đc, vì ngay MS-DOS 6.0 cng ch là s khc phc hn ch ca MS-DOS 3.3 ban đu. Trong thi k đu ca tin hc, các lp trình viên xây dng chng trình bng các ngôn ng lp trình bc th p, quá trình np và theo dõi hot đng ca chng trình mt cách trc tip trong ch đ trc tuyn (on-line). Vic tìm và sa li (debbugging) nh ngày nay là không th thc hin đc. Do vy, trc nhng nm 1960, ngi ta coi vic lp trình Chng 1: i cng v k thut lp trình cu trúc 4 ging nh nhng hot đng ngh thut nhum màu sc cá nhân hn là khoa hc. Mt s ngi nm đc mt vài ngôn ng lp trình, cùng mt s mo vt tn dng cu hình vt lý c th ca h thng máy tính, to nên mt s sn phm l ca phn mm đc coi là mt chuyên gia nm bt đc nhng bí n ca ngh thut lp trình. Các h thng máy tính trong giai đon này có cu hình yu, b nh nh, tc đ các thit b vào ra thp làm chm quá trình np và thc hin chng trình. Chng trình đc xây dng bng k thut lp trình tuyn tính mà ni bt nht là ngôn ng lp trình Assembler và Fortran. Vi phng pháp lp trình tuyn tính, lp trình viên ch đc phép th hin chng trình ca mình trên hai c u trúc lnh, đó là cu trúc lnh tun t (sequential) và nhy không điu kin (goto). H thng th vin vào ra nghèo nàn làm cho vic lp trình tr nên khó khn, chi phí cho các sn phm phn mm quá ln, đ tin cy ca các sn phm phn mm không cao dn ti hàng lot các d án tin hc b tht bi, đc bit là các h thng tin hc có tm c ln. Nm 1973, Hoare khng đnh, nguyên nhân tht bi mà ngi M gp phi khi phóng v tinh nhân to v phía sao V n (Sao Kim) là do li ca chng trình điu khin vit bng Fortran. Thay vì vit: DO 50 I = 12, 523 (Thc hin s 50 vi I là 12, 13, ., 523) Lp trình viên (hoc thao tác viên đc bìa) vit thành: DO 50 I = 12.523 (Du phy đã thay bng du chm) Gp câu lnh này, chng trình dch ca Fortran đã hiu là gán giá tr thc 12.523 cho bin DO 50 I làm cho kt qu chng trình sai. gii quyt nhng vng mc trong k thut lp trình, các nhà tin hc lý thuyt đã đi sâu vào nghiên cu tìm hiu bn cht ca ngôn ng, thut toán và hot đng lp trình, nâng ni dung ca k thut lp trình lên thành các nguyên lý khoa hc ngày nay. Kt qu ni bt nht trong giai đon này là Knuth xut bn b 3 tp sách mang tên “Ngh thut lp trình” gii thiu ht sc t m c s lý thuyt đm bo toán hc và các thut toán c bn x lý d liu na s, sp xp và tìm kim. Nm 1968, Dijkstra công b lá th “V s nguy hi ca toán t goto”. Trong công trình này, Dijkstra khng đnh, có mt s li do goto gây nên không th xác đnh đc đim bt đu ca li. Dijkstra còn khng đnh thêm: “Tay ngh ca mt lp trình viên t l ngh ch vi s lng toán t goto mà anh ta s dng trong chng trình”, đng thi kêu gi hu b trit đ toán t goto trong mi ngôn ng lp trình ngoi tr ngôn ng lp trình bc thp. Dijkstra còn đa ra khng đnh, đng thái ca chng trình có th đc đánh giá tng minh qua các cu trúc lp, r nhánh, gi đ qui là c s ca lp trình cu trúc ngày nay. Nhng kt qu đc Dijikstra công b đã to nên mt cuc cách mng trong k thut lp trình, Knuth lit kê mt s trng hp có li ca goto nh vòng lp kt thúc gia chng, bt li . . ., Dijkstra, Hoare, Knuth tip tc phát trin t tng coi chng trình máy tính cùng vi lp trình viên là đi tng nghiên cu ca k thut lp trình và phng pháp Chng 1: i cng v k thut lp trình cu trúc 5 làm ch s phc tp ca các hot đng lp trình. Nm 1969, Hoare đã phát biu các tiên đ phc v cho vic chng minh tính đúng đn ca chng trình, phát hin tính bt bin ca vòng lp bng cách coi chng trình va là bn mã hoá thut toán đng thi là bn chng minh tính đúng đn ca chng trình. Sau đó Dahl, Hoare, Dijiksta đã phát trin thành ngôn ng lp trình cu trúc. trin khai các nguyên lý lp trình c u trúc, L. Wirth đã thit k và cài đt ngôn ng ALGOL W là mt bin th ca ALGOL 60. Sau này, L. Wirth tip tc hoàn thin đ tr thành ngôn ng lp trình Pascal. ây là ngôn ng lp trình gin d, sáng sa v cú pháp, d minh ha nhng vn đ phc tp ca lp trình hin đi và đc coi là mt chun mc trong ging dy lp trình. Nm 1978, Brian Barninghan cùng Denit Ritche thit k ngôn ng lp trình C vi t i thiu các cu trúc lnh và hàm khá phù hp vi t duy và tâm lý ca ca ngi lp trình. ng thi, hai tác gi đã phát hành phiên bn h điu hành UNIX vit ch yu bng ngôn ng C, khng đnh thêm uy th ca C trong lp trình h thng. 1.2. CU TRÚC LNH, LNH CÓ CU TRÚC, CU TRÚC D LIU 1.2.1. Cu trúc lnh (cu trúc điu khin) Mi chng trình máy tính v bn cht là mt bn mã hoá thut toán. Thut toán đc coi là dãy hu hn các thao tác s cp trên tp đi tng vào (Input) nhm thu đc kt qu ra (output). Các thao tác trong mt ngôn ng lp trình c th đc điu khin bi các lnh hay các cu trúc điu khin, còn các đi tng chu thao tác thì đc mô t và biu di n thông qua các cu trúc d liu. Trong các ngôn ng lp trình cu trúc, nhng cu trúc lnh sau đc s dng đ xây dng chng trình. D nhiên, chúng ta s không bàn ti cu trúc nhy không điu kin goto mc dù ngôn ng lp trình cu trúc nào cng trang b cu trúc lnh goto. câu lnh GOTO. Hình 1.1: Cu trúc tun t và cu trúc r nhánh dng đy đ Cu trúc tun t A; B; Sau khi thc hin lnh A thì thc hin lnh B A B Cu trúc r nhánh dng đy đ If (E) A; S Else B; Nu biu thc E có giá tr đúng (khác 0) thì thchinA;NuEsaithìthchinB; AB Chng 1: i cng v k thut lp trình cu trúc 6 Hình 1.2. Các cu trúc lp A, B : ký hiu cho các câu lnh đn hoc lnh hp thành. Mi lnh đn l đc gi là mt lnh đn, lnh hp thành là lnh hay cu trúc lnh đc ghép li vi nhau theo qui đnh ca ngôn ng, trong Pascal là tp lnh hay cu trúc lnh đc bao trong thân ca begin . . . end; trong C là tp các lnh hay cu trúc lnh đc bao trong hai ký hiu { . }. E, E1, E2, E3 là các biu thc s hc hoc logic. Mt s ngôn ng lp trình coi giá tr ca biu thc logic hoc đúng (TRUE) hoc sai (FALSE), mt s ngôn ng lp trình khác nh C coi giá tr ca biu thc logic là đúng nu nó có giá tr khác 0, ngc li biu thc logic có giá tr sai. Cn lu ý rng, mt chng trình đc th hin bng các cu trúc điu khin lnh : tun t, tuyn chn if else, switch . . case default, lp vi đi u kin trc while , lp vi điu kin sau do . . while, vòng lp for bao gi cng chuyn đc v mt chng trình, ch s dng ti thiu hai cu trúc lnh là tun t và lp vi điu kin trc while. Phng pháp lp trình này còn đc gi là phng pháp lp trình hn ch. Cu trúc lp vi điu kin sau do A; S while (E); Thc hin A cho ti khi nào E vn còn đúng; Cu trúc lp FOR For (E1; E2;E3) A; S Cu trúc lp vi điu kin trc While (E) A; S Trong khi biu thc E còn có giá tr đúng thì thc hin A; E A A E E1 E2 E3 A Chng 1: i cng v k thut lp trình cu trúc 7 1.2.2. Lnh có cu trúc Lnh có cu trúc là lnh cho phép cha các cu trúc điu khin trong nó. Khi tìm hiu mt cu trúc điu khin cn xác đnh rõ v trí đc phép đt mt cu trúc điu khin trong nó, cng nh nó là mt phn ca cu trúc điu khin nào. iu này tng nh rt tm thng nhng có ý ngha ht sc quan trng trong khi xây d ng và kim tra li có th xy ra trong chng trình. Nguyên tc vit chng trình theo cu trúc: Cu trúc con phi đc vit lt trong cu trúc cha, đim vào và đim ra ca mi cu trúc phi nm trên cùng mt hàng dc. Ví d sau s minh ha cho nguyên tc vit chng trình: if (E) while (E1) A; else do B; while(E2); Trong ví d trên, while (E1) A; là cu trúc con nm trong thân ca cu trúc cha là if (E) ; còn do B while(E2); là cu trúc con trong thân ca else. Do vy, câu lnh while(E1); do . . . while(E2) có cùng cp vi nhau nên nó phi nm trên cùng mt ct, tng t nh vy vi A, B và if vi else. 1.2.3. Cu trúc d liu Các ngôn ng lp trình cu trúc nói chung đu ging nhau v cu trúc lnh và cu trúc d liu. im khác nhau duy nht gia các ngôn ng lp trình cu trúc là phng pháp đt tên, cách khai báo, cú pháp câu lnh và tp các phép toán đc phép thc hin trên các cu trúc d liu c th. Nm bt đc nguyên tc này, chúng ta s d dàng chuyn đi cách th hin chng trình t ngôn ng lp trình này sang ngôn ng lp trình khác mt cánh nhanh chóng mà không tn quá nhiu thi gian cho vic hc tp ngôn ng lp trình. Thông thng, các cu trúc d liu đc phân thành hai loi: cu trúc d li u có kiu c bn (Base type) và cu trúc d liu có kiu do ngi dùng đnh ngha (User type) hay còn gi là kiu d liu có cu trúc. Kiu d liu c bn bao gm: Kiu kí t (char), kiu s nguyên có du (signed int), kiu s nguyên không du (unsigned int), kiu s nguyên dài có du (signed long), kiu s nguyên dài không du (unsigned long ), kiu s thc (float) và kiu s thc có đ chính xác gp đôi (double). Kiu d liu do ngi dùng đnh ngha bao gm kiu xâu kí t (string), kiu mng (array), kiu tp hp (union), kiu cu trúc (struct), kiu file, kiu con tr (pointer) và các kiu d liu đc đnh ngha mi hoàn toàn nh kiu danh sách móc ni (link list), kiu cây (tree) . . . Kích c ca kiu c bn đ ng ngha vi min xác đnh ca kiu vi biu din nh phân ca nó, và ph thuc vào tng h thng máy tính c th. xác đnh kích c ca kiu nên dùng toán t sizeof( type). Chng trình sau s lit kê kích c ca các kiu c bn. Chng 1: i cng v k thut lp trình cu trúc 8 Ví d 1.1. Kim tra kích c ca kiu. #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <io.h> void main(void) { printf(“\n Kích c kiu kí t:%d”, sizeof(char)); printf(“\n Kích c kiu kí t không du:%d”, sizeof(unsigned char)); printf(“\n Kích c kiu s nguyên không du:%d”, sizeof(unsigned int)); printf(“\n Kích c kiu s nguyên có du:%d”, sizeof(signed int)); printf(“\n Kích c kiu s nguyên dài không du:%d”, sizeof(unsigned long )); printf(“\n Kích c kiu s nguyên dài có du:%d”, sizeof(signed long )); printf(“\n Kích c kiu s thc có đ chính xác đn:%d”, sizeof(float )); printf(“\n Kích c kiu s thc có đ chính xác kép:%d”, sizeof(double )); getch(); } Kích c ca các kiu d liu do ngi dùng đnh ngha là tng kích c ca mi kiu thành viên trong nó. Chúng ta cng vn dùng toán t sizeof(tên kiu) đ xác đnh đ ln tính theo byte ca các kiu d liu này. Mt đim đc bit chú ý trong khi lp trình trên các cu trúc d liu là cu trúc d liu nào thì phi kèm theo phép toán đó, vì mt bin đc gi là thuc kiu d liu nào đó nu nh nó nhn mt giá tr t min xác đnh ca kiu và các phép toán trên kiu d liu đó. 1.3. NGUYÊN LÝ TI THIU Hãy bt đu t mt tp nguyên tc và ti thiu các phng tin là các cu trúc lnh, kiu d liu cùng các phép toán trên nó và thc hin vit chng trình. Sau khi nm chc nhng công c vòng đu mi đt vn đ m rng sang h thng th vin tin ích ca ngôn ng. Khi làm quen vi mt ngôn ng lp trình nào đó, không nht thit phi l thuc quá nhiu vào h thng th vin hàm ca ngôn ng, mà điu quan trng hn là trc mt bài toán c th, chúng ta s dng ngôn ng đ gii quyt nó th nào, và phng án tt nht là lp trình bng chính h thng th vin hàm ca riêng mình. Do vy, đi vi các ngôn ng lp trình, chúng ta ch cn nm vng mt s các công c ti thiu nh sau: 1.3.1. Tp các phép toán Tp các phép toán s hc: + (cng); - (tr); * (nhân); % (ly phn d); / (chia). Tp các phép toán s hc m rng: ++a ú a = a +1; // tng giá tr bin nguyên a lên mt đn v; --a ú a = a-1; //gim giá tr bin nguyên a mt đn v; a+= n ú a = a+n; // tng giá tr bin nguyên a lên n đn v; Chng 1: i cng v k thut lp trình cu trúc 9 a-=n ú a = a - n; // gim giá tr bin nguyên a n đn v); a%=n ú a = a%n; // ly giá tr bin a modul vi n; a/=n ú a=a/n;// ly giá tr bin a chia cho n; a*=n ú a = a*n; // ly giá tr bin a nhân vi n; Tp các phép toán so sánh: >, <, >=, <=, ==, != ( ln hn, nh hn, ln hn hoc bng, nh hn hoc bng, đúng bng, khác). Qui tc vit đc th hin nh sau: if ( a>b) { . . } // nu a ln hn b if ( a<b) { . . } // nu a nh hn b if ( a>=b) { . . } // nu a ln hn hoc bng b if ( a<=b) { . . } // nu a nh hn hoc bng b if ( a==b) { . . } // nu a đúng bng b if ( a!=b) { . . } // nu a khác b Tp các phép toán logic: &&, ||, ! (và, hoc, ph đnh) &&: Phép và logic ch cho giá tr đúng khi hai biu thc tham gia đu có giá tr đúng (giá tr đúng ca mt biu thc trong C đc hiu là biu thc có giá tr khác 0). ||: Phép hoc logic ch cho giá tr sai khi c hai biu thc tham gia đu có giá tr sai. !: Phép ph đnh cho giá tr đúng nu biu thc có giá tr sai và ngc li cho giá tr sai khi biu thc có giá tr đúng. Ng ngha ca các phép toán đc minh ha thông qua các câu lnh sau: int a =3, b =5; if ( (a !=0) && (b!=0) ) // nu a khác 0 và b khác 0 if ((a!=0) || (b!=0)) // nu a khác 0 hoc b khác 0 if ( !a ) // ph đnh a khác 0 if (a==b) // nu a đúng bng b Các toán t thao tác bít (không s dng cho float và double) & : Phép hi các bít. | : Phép tuyn các bít. ^ : Phép tuyn các bít có loi tr. << : Phép dch trái (dch sang trái n bít giá tr 0) >> : Phép dch ph i (dch sang phi n bít có giá tr 0) ~ : Phép ly phn bù. . tin hc, các lp trình viên xây dng chng trình bng các ngôn ng lp trình bc th p, quá trình np và theo dõi hot đng ca chng trình mt cách trc. chng trình. Chng trình đc xây dng bng k thut lp trình tuyn tính mà ni bt nht là ngôn ng lp trình Assembler và Fortran. Vi phng pháp lp trình