Tài liệu Bài giảng " kỹ thuật lập trình " pdf

156 644 3
Tài liệu Bài giảng " kỹ thuật lập trình " pdf

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

HC VIN CÔNG NGH BU CHÍNH VIN THÔNG BÀI GING K THUT LP TRÌNH Biên son : Ths. NGUYN DUY PHNG Gii thiu môn hc GII THIU MÔN HC I. GII THIU CHUNG S phát trin công ngh thông tin trong nhng nm va qua đã làm thay đi b mt kinh t xã hi toàn cu, trong đó công ngh phn mm tr thành mt ngành công nghip quan trng đy tim nng. Vi s hi t ca công ngh vin thông và công ngh thông rin, t trng v giá tr phn mm chim rt cao trong các h thng vin thông cng nh các thit b đu cu i. Chính vì lý do đó, vic nghiên cu, tìm hiu, tin ti phát trin cng nh làm ch các h thng phn mm ca các k s đin t vin thông là rt cn thit. Tài liu ging dy “K thut lp trình” cho h đào to t xa đc xây dng da trên giáo trình “K thut lp trình” đã đc ging dy ti hc vi n trong nhng nm qua vi mc đích cung cp cho sinh viên nhng kin thc c bn nht, có tính h thng liên quan ti lp trình. Thông qua cun tài liu này, chúng tôi mun gii thiu vi các bn đc v k nng lp trình cu trúc và mt s thut toán quan trng, bao gm: i cng v lp trình cu trúc; Duyt và đ qui; Ngn xp, hàng đi và danh sách móc ni; Cây;  th và cu i cùng là Sp xp và tìm kim. II. MC ÍCH Môn hc cung cp cho sinh viên k nng lp trình trên các cu trúc d liu quan trng nh: stack, queue mlink, tree & graph cùng vi phng pháp phân tích, thit k, đánh giá thut toán. Sau khi hc xong môn hc này, sinh viên có kh nng vit đc chng trình gii quyt nhng bài toán trong thc t. III. PHM VI NGHIÊN CU Nghiên cu các thut toán c bn đc s dng trong thc t nh các thut toán tìm kim, các thut toán liên quan đn đ th. Các gii thut lp trình da trên danh sách, cây… Nghiên cu cách cài đt các thut toán trên máy tính. Tìm hiu các lnh vc ng dng ca các thut toán, phng pháp trong thc t. IV. PHNG PHÁP NGHIÊN CU  hc tt môn hc này, sinh viên cn lu ý nhng vn đ sau: 1. Kin thc cn trc Li nói đu 2 - Sinh viên phi có kin thc c bn v toán hc cao cp. - Thành tho ít nht mt ngôn ng lp trình. c bit trong cun sách này đã s dng ngôn ng lp trình C đ mô t thut toán, vì vy sinh viên phi nm đc ngôn ng lp trình C. 2. Các tài liu cn có: Sách hng dn hc tp K thut lp trình. Ths. Nguyn Duy Phng, Hc vin Công ngh Bu chính Vin thông, 2006. N u cn sinh viên nên tham kho thêm: - Giáo trình K thut lp trình. Ts. Lê Hu Lp, Ths. Nguyn Duy Phng, Hc vin Công ngh Bu chính Vin thông, 2002. - Bài ging đin t môn hc: “K thut lp trình” ca Hc vin Công ngh Bu chính Vin thông. 3. t ra mc tiêu, thi hn cho bn thân t ra các mc tiêu tm thi và thi hn cho bn thân và c gng thc hin chúng Xây d ng mc tiêu trong chng trình nghiên cu. 4 Nghiên cu và nm nhng kin thc ct lõi Sinh viên nên đc qua sách hng dn hc tp trc khi nghiên cu bài ging môn hc và các tài liu tham kho khác. 5. Tham gia đy đ các bui hng dn hc tp Thông qua các bui hng dn hc tp, ging viên s giúp sinh viên nm đc ni dung tng th ca môn hc và gii đáp thc mc, đng th i sinh viên cng có th trao đi, tho lun vi nhng sinh viên khác v ni dung bài hc. 6. Ch đng liên h vi bn hc và ging viên Cách đn gin nht là tham d các din dàn hc tp trên mng Internet, qua đó có th trao đi trc tip các vn đ vng mc vi ging viên hoc các bn hc khác đang online. 7. T ghi chép li nhng ý chính Vic ghi chép li nhng ý chính là mt ho t đng tái hin kin thc, kinh nghim cho thy nó giúp ích rt nhiu cho vic hình thành thói quen t hc và t duy nghiên cu. 8. Hc đi đôi vi hành Hc lý thuyt đn đâu thc hành làm bài tp và thc hành ngay đn đó đ hiu và nm chc lý thuyt. Sinh viên cn cài đt trên máy tính các thut toán trong bài hc bng các ngôn ng lp trình đ t đó có th hiu và nm chc hn t  tng và ni dung ca thut toán. Hà Ni, ngày 20 tháng 02 nm 2006 Ths. Nguyn Duy Phng Chng 1: i cng v k thut lp trình cu trúc 3 CHNG 1: I CNG V K THUT LP TRÌNH CU TRÚC Ni dung chính ca chng này tp chung làm sáng t nhng nguyên lý c bn ca lp trình cu trúc. Nhng nguyên lý này đc coi nh nn tng t tng ca phng pháp lp trình cu trúc đã đc tích hp trong các ngôn ng lp trình. Nm vng các nguyên lý ca lp trình cu trúc không ch giúp ngi hc có cách tip cn ngôn ng lp trình nhanh chóng mà con giúp h cách t duy trong khi xây dng các h thng ng dng. Các nguyên lý c b n đc gii thiu trong chng này bao gm: X Nguyên lý lnh - lnh có cu trúc - cu trúc d liu. X Nguyên lý ti thiu. X Nguyên lý đa phng. X Nguyên lý an toàn. X Nguyên lý nht quán. X Nguyên lý Top-Down . X Nguyên lý Botton-Up. Bn đc có th tìm đc nhng chi tit sâu hn và rng hn trong tài liu [1] & [6]. 1.1. S LC V LCH S LP TRÌNH CU TRÚC Lp trình là mt trong nhng công vic nng nhc nht ca khoa hc máy tính. Có th nói, nng sut xây dng các sn phm phn mm là rt thp so vi các hot đng trí tu khác. Mt sn phm phn mm có th đc thit k và cài đt trong vòng 6 tháng vi 3 lao đng chính. Nhng đ kim tra tìm li và tip tc hoàn thin sn phm đó phi mt thêm chng 3 n m. ây là hin tng ph bin trong tin hc ca nhng nm 1960 khi xây dng các sn phm phn mm bng k thut lp trình tuyn tính.  khc phc tình trng li ca sn phm, ngi ta che chn nó bi mt mành che mang tính cht thng mi đc gi là Version. Thc cht, Version là vic thay th sn phm c bng cách sa đi nó ri công b d i dng mt Version mi, ging nh: MS-DOS 4.0 ch tn ti trong thi gian vài tháng ri thay đi thành MS-DOS 5.0, MS-DOS 5.5, MS-DOS 6.0 . . . ây không phi là mt sn phm mi nh ta tng mà trong nó còn tn ti nhng li không th b qua đc, vì ngay MS-DOS 6.0 cng ch là s khc phc hn ch ca MS-DOS 3.3 ban đu. Trong thi k đu ca tin hc, các lp trình viên xây dng chng trình bng các ngôn ng lp trình bc th p, quá trình np và theo dõi hot đng ca chng trình mt cách trc tip trong ch đ trc tuyn (on-line). Vic tìm và sa li (debbugging) nh ngày nay là không th thc hin đc. Do vy, trc nhng nm 1960, ngi ta coi vic lp trình Chng 1: i cng v k thut lp trình cu trúc 4 ging nh nhng hot đng ngh thut nhum màu sc cá nhân hn là khoa hc. Mt s ngi nm đc mt vài ngôn ng lp trình, cùng mt s mo vt tn dng cu hình vt lý c th ca h thng máy tính, to nên mt s sn phm l ca phn mm đc coi là mt chuyên gia nm bt đc nhng bí  n ca ngh thut lp trình. Các h thng máy tính trong giai đon này có cu hình yu, b nh nh, tc đ các thit b vào ra thp làm chm quá trình np và thc hin chng trình. Chng trình đc xây dng bng k thut lp trình tuyn tính mà ni bt nht là ngôn ng lp trình Assembler và Fortran. Vi phng pháp lp trình tuyn tính, lp trình viên ch đc phép th hin chng trình ca mình trên hai c u trúc lnh, đó là cu trúc lnh tun t (sequential) và nhy không điu kin (goto). H thng th vin vào ra nghèo nàn làm cho vic lp trình tr nên khó khn, chi phí cho các sn phm phn mm quá ln, đ tin cy ca các sn phm phn mm không cao dn ti hàng lot các d án tin hc b tht bi, đc bit là các h thng tin hc có tm c ln. Nm 1973, Hoare khng đnh, nguyên nhân tht bi mà ngi M gp phi khi phóng v tinh nhân to v phía sao V n (Sao Kim) là do li ca chng trình điu khin vit bng Fortran. Thay vì vit: DO 50 I = 12, 523 (Thc hin s 50 vi I là 12, 13, ., 523) Lp trình viên (hoc thao tác viên đc bìa) vit thành: DO 50 I = 12.523 (Du phy đã thay bng du chm) Gp câu lnh này, chng trình dch ca Fortran đã hiu là gán giá tr thc 12.523 cho bin DO 50 I làm cho kt qu chng trình sai.  gii quyt nhng vng mc trong k thut lp trình, các nhà tin hc lý thuyt đã đi sâu vào nghiên cu tìm hiu bn cht ca ngôn ng, thut toán và hot đng lp trình, nâng ni dung ca k thut lp trình lên thành các nguyên lý khoa hc ngày nay. Kt qu ni bt nht trong giai đon này là Knuth xut bn b 3 tp sách mang tên “Ngh thut lp trình” gii thiu ht sc t m c s lý thuyt đm bo toán hc và các thut toán c bn x lý d liu na s, sp xp và tìm kim. Nm 1968, Dijkstra công b lá th “V s nguy hi ca toán t goto”. Trong công trình này, Dijkstra khng đnh, có mt s li do goto gây nên không th xác đnh đc đim bt đu ca li. Dijkstra còn khng đnh thêm: “Tay ngh ca mt lp trình viên t l ngh ch vi s lng toán t goto mà anh ta s dng trong chng trình”, đng thi kêu gi hu b trit đ toán t goto trong mi ngôn ng lp trình ngoi tr ngôn ng lp trình bc thp. Dijkstra còn đa ra khng đnh, đng thái ca chng trình có th đc đánh giá tng minh qua các cu trúc lp, r nhánh, gi đ qui là c s ca lp trình cu trúc ngày nay. Nhng kt qu đc Dijikstra công b đã to nên mt cuc cách mng trong k thut lp trình, Knuth lit kê mt s trng hp có li ca goto nh vòng lp kt thúc gia chng, bt li . . ., Dijkstra, Hoare, Knuth tip tc phát trin t tng coi chng trình máy tính cùng vi lp trình viên là đi tng nghiên cu ca k thut lp trình và phng pháp Chng 1: i cng v k thut lp trình cu trúc 5 làm ch s phc tp ca các hot đng lp trình. Nm 1969, Hoare đã phát biu các tiên đ phc v cho vic chng minh tính đúng đn ca chng trình, phát hin tính bt bin ca vòng lp bng cách coi chng trình va là bn mã hoá thut toán đng thi là bn chng minh tính đúng đn ca chng trình. Sau đó Dahl, Hoare, Dijiksta đã phát trin thành ngôn ng lp trình cu trúc.  trin khai các nguyên lý lp trình c u trúc, L. Wirth đã thit k và cài đt ngôn ng ALGOL W là mt bin th ca ALGOL 60. Sau này, L. Wirth tip tc hoàn thin đ tr thành ngôn ng lp trình Pascal. ây là ngôn ng lp trình gin d, sáng sa v cú pháp, d minh ha nhng vn đ phc tp ca lp trình hin đi và đc coi là mt chun mc trong ging dy lp trình. Nm 1978, Brian Barninghan cùng Denit Ritche thit k ngôn ng lp trình C vi t i thiu các cu trúc lnh và hàm khá phù hp vi t duy và tâm lý ca ca ngi lp trình. ng thi, hai tác gi đã phát hành phiên bn h điu hành UNIX vit ch yu bng ngôn ng C, khng đnh thêm uy th ca C trong lp trình h thng. 1.2. CU TRÚC LNH, LNH CÓ CU TRÚC, CU TRÚC D LIU 1.2.1. Cu trúc lnh (cu trúc điu khin) Mi chng trình máy tính v bn cht là mt bn mã hoá thut toán. Thut toán đc coi là dãy hu hn các thao tác s cp trên tp đi tng vào (Input) nhm thu đc kt qu ra (output). Các thao tác trong mt ngôn ng lp trình c th đc điu khin bi các lnh hay các cu trúc điu khin, còn các đi tng chu thao tác thì đc mô t và biu di n thông qua các cu trúc d liu. Trong các ngôn ng lp trình cu trúc, nhng cu trúc lnh sau đc s dng đ xây dng chng trình. D nhiên, chúng ta s không bàn ti cu trúc nhy không điu kin goto mc dù ngôn ng lp trình cu trúc nào cng trang b cu trúc lnh goto. câu lnh GOTO. Hình 1.1: Cu trúc tun t và cu trúc r nhánh dng đy đ Cu trúc tun t A; B; Sau khi thc hin lnh A thì thc hin lnh B A B Cu trúc r nhánh dng đy đ If (E) A; S Else B;  Nu biu thc E có giá tr đúng (khác 0) thì thchinA;NuEsaithìthchinB; AB Chng 1: i cng v k thut lp trình cu trúc 6 Hình 1.2. Các cu trúc lp A, B : hiu cho các câu lnh đn hoc lnh hp thành. Mi lnh đn l đc gi là mt lnh đn, lnh hp thành là lnh hay cu trúc lnh đc ghép li vi nhau theo qui đnh ca ngôn ng, trong Pascal là tp lnh hay cu trúc lnh đc bao trong thân ca begin . . . end; trong C là tp các lnh hay cu trúc lnh đc bao trong hai hiu { . }. E, E1, E2, E3 là các biu thc s hc hoc logic. Mt s ngôn ng lp trình coi giá tr  ca biu thc logic hoc đúng (TRUE) hoc sai (FALSE), mt s ngôn ng lp trình khác nh C coi giá tr ca biu thc logic là đúng nu nó có giá tr khác 0, ngc li biu thc logic có giá tr sai. Cn lu ý rng, mt chng trình đc th hin bng các cu trúc điu khin lnh : tun t, tuyn chn if else, switch . . case default, lp vi đi u kin trc while , lp vi điu kin sau do . . while, vòng lp for bao gi cng chuyn đc v mt chng trình, ch s dng ti thiu hai cu trúc lnh là tun t và lp vi điu kin trc while. Phng pháp lp trình này còn đc gi là phng pháp lp trình hn ch. Cu trúc lp vi điu kin sau do A; S  while (E); Thc hin A cho ti khi nào E vn còn đúng; Cu trúc lp FOR For (E1; E2;E3) A; S  Cu trúc lp vi điu kin trc While (E) A; S  Trong khi biu thc E còn có giá tr đúng thì thc hin A; E A A E E1 E2 E3 A Chng 1: i cng v k thut lp trình cu trúc 7 1.2.2. Lnh có cu trúc Lnh có cu trúc là lnh cho phép cha các cu trúc điu khin trong nó. Khi tìm hiu mt cu trúc điu khin cn xác đnh rõ v trí đc phép đt mt cu trúc điu khin trong nó, cng nh nó là mt phn ca cu trúc điu khin nào. iu này tng nh rt tm thng nhng có ý ngha ht sc quan trng trong khi xây d ng và kim tra li có th xy ra trong chng trình. Nguyên tc vit chng trình theo cu trúc: Cu trúc con phi đc vit lt trong cu trúc cha, đim vào và đim ra ca mi cu trúc phi nm trên cùng mt hàng dc. Ví d sau s minh ha cho nguyên tc vit chng trình: if (E) while (E1) A; else do B; while(E2); Trong ví d trên, while (E1) A; là cu trúc con nm trong thân ca cu trúc cha là if (E) ; còn do B while(E2); là cu trúc con trong thân ca else. Do vy, câu lnh while(E1); do . . . while(E2) có cùng cp vi nhau nên nó phi nm trên cùng mt ct, tng t nh vy vi A, B và if vi else. 1.2.3. Cu trúc d liu Các ngôn ng lp trình cu trúc nói chung đu ging nhau v cu trúc lnh và cu trúc d liu. im khác nhau duy nht gia các ngôn ng  lp trình cu trúc là phng pháp đt tên, cách khai báo, cú pháp câu lnh và tp các phép toán đc phép thc hin trên các cu trúc d liu c th. Nm bt đc nguyên tc này, chúng ta s d dàng chuyn đi cách th hin chng trình t ngôn ng lp trình này sang ngôn ng lp trình khác mt cánh nhanh chóng mà không tn quá nhiu thi gian cho vic hc tp ngôn ng lp trình. Thông thng, các cu trúc d liu đc phân thành hai loi: cu trúc d li u có kiu c bn (Base type) và cu trúc d liu có kiu do ngi dùng đnh ngha (User type) hay còn gi là kiu d liu có cu trúc. Kiu d liu c bn bao gm: Kiu kí t (char), kiu s nguyên có du (signed int), kiu s nguyên không du (unsigned int), kiu s nguyên dài có du (signed long), kiu s nguyên dài không du (unsigned long ), kiu s thc (float) và kiu s thc có đ chính xác gp đôi (double). Kiu d liu do ngi dùng đnh ngha bao gm kiu xâu kí t (string), kiu mng (array), kiu tp hp (union), kiu cu trúc (struct), kiu file, kiu con tr (pointer) và các kiu d liu đc đnh ngha mi hoàn toàn nh kiu danh sách móc ni (link list), kiu cây (tree) . . . Kích c ca kiu c bn đ ng ngha vi min xác đnh ca kiu vi biu din nh phân ca nó, và ph thuc vào tng h thng máy tính c th.  xác đnh kích c ca kiu nên dùng toán t sizeof( type). Chng trình sau s lit kê kích c ca các kiu c bn. Chng 1: i cng v k thut lp trình cu trúc 8 Ví d 1.1. Kim tra kích c ca kiu. #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <io.h> void main(void) { printf(“\n Kích c kiu kí t:%d”, sizeof(char)); printf(“\n Kích c kiu kí t không du:%d”, sizeof(unsigned char)); printf(“\n Kích c kiu s nguyên không du:%d”, sizeof(unsigned int)); printf(“\n Kích c kiu s nguyên có du:%d”, sizeof(signed int)); printf(“\n Kích c kiu s nguyên dài không du:%d”, sizeof(unsigned long )); printf(“\n Kích c kiu s nguyên dài có du:%d”, sizeof(signed long )); printf(“\n Kích c kiu s thc có đ chính xác đn:%d”, sizeof(float )); printf(“\n Kích c kiu s thc có đ chính xác kép:%d”, sizeof(double )); getch(); } Kích c ca các kiu d liu do ngi dùng đnh ngha là tng kích c ca mi kiu thành viên trong nó. Chúng ta cng vn dùng toán t sizeof(tên kiu) đ xác đnh đ ln tính theo byte ca các kiu d liu này. Mt đim đc bit chú ý trong khi lp trình trên các cu trúc d liu là cu trúc d liu nào thì phi kèm theo phép toán đó, vì mt bin đc gi là thuc kiu d liu nào đó nu nh nó nhn mt giá tr t min xác đnh ca kiu và các phép toán trên kiu d liu đó. 1.3. NGUYÊN LÝ TI THIU Hãy bt đu t mt tp nguyên tc và ti thiu các phng tin là các cu trúc lnh, kiu d liu cùng các phép toán trên nó và thc hin vit chng trình. Sau khi nm chc nhng công c vòng đu mi đt vn đ m rng sang h thng th vin tin ích ca ngôn ng. Khi làm quen vi mt ngôn ng lp trình nào đó, không nht thit phi l thuc quá nhiu vào h  thng th vin hàm ca ngôn ng, mà điu quan trng hn là trc mt bài toán c th, chúng ta s dng ngôn ng đ gii quyt nó th nào, và phng án tt nht là lp trình bng chính h thng th vin hàm ca riêng mình. Do vy, đi vi các ngôn ng lp trình, chúng ta ch cn nm vng mt s các công c ti thiu nh sau: 1.3.1. Tp các phép toán Tp các phép toán s  hc: + (cng); - (tr); * (nhân); % (ly phn d); / (chia). Tp các phép toán s hc m rng: ++a ú a = a +1; // tng giá tr bin nguyên a lên mt đn v; --a ú a = a-1; //gim giá tr bin nguyên a mt đn v; a+= n ú a = a+n; // tng giá tr bin nguyên a lên n đn v; Chng 1: i cng v k thut lp trình cu trúc 9 a-=n ú a = a - n; // gim giá tr bin nguyên a n đn v); a%=n ú a = a%n; // ly giá tr bin a modul vi n; a/=n ú a=a/n;// ly giá tr bin a chia cho n; a*=n ú a = a*n; // ly giá tr bin a nhân vi n; Tp các phép toán so sánh: >, <, >=, <=, ==, != ( ln hn, nh hn, ln hn hoc bng, nh hn hoc bng, đúng bng, khác). Qui tc vit đc th hin nh sau: if ( a>b) { . . } // nu a ln hn b if ( a<b) { . . } // nu a nh  hn b if ( a>=b) { . . } // nu a ln hn hoc bng b if ( a<=b) { . . } // nu a nh hn hoc bng b if ( a==b) { . . } // nu a đúng bng b if ( a!=b) { . . } // nu a khác b Tp các phép toán logic: &&, ||, ! (và, hoc, ph đnh) &&: Phép và logic ch cho giá tr đúng khi hai biu thc tham gia đu có giá tr đúng (giá tr đúng ca mt biu thc trong C đc hiu là biu thc có giá tr khác 0). ||: Phép hoc logic ch cho giá tr sai khi c hai biu thc tham gia đu có giá tr  sai. !: Phép ph đnh cho giá tr đúng nu biu thc có giá tr sai và ngc li cho giá tr sai khi biu thc có giá tr đúng. Ng ngha ca các phép toán đc minh ha thông qua các câu lnh sau: int a =3, b =5; if ( (a !=0) && (b!=0) ) // nu a khác 0 và b khác 0 if ((a!=0) || (b!=0)) // nu a khác 0 hoc b khác 0 if ( !a ) // ph đnh a khác 0 if (a==b) // nu a đúng bng b Các toán t thao tác bít (không s dng cho float và double) & : Phép hi các bít. | : Phép tuyn các bít. ^ : Phép tuyn các bít có loi tr. << : Phép dch trái (dch sang trái n bít giá tr 0) >> : Phép dch ph i (dch sang phi n bít có giá tr 0) ~ : Phép ly phn bù. [...]... printf ("\ n Da thuc %c :", c); for(i=0;i . tin hc, các lp trình viên xây dng chng trình bng các ngôn ng lp trình bc th p, quá trình np và theo dõi hot đng ca chng trình mt cách trc. chng trình. Chng trình đc xây dng bng k thut lp trình tuyn tính mà ni bt nht là ngôn ng lp trình Assembler và Fortran. Vi phng pháp lp trình

Ngày đăng: 24/12/2013, 02:17

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan