1. Trang chủ
  2. » Công Nghệ Thông Tin

cơ sở kỷ thuật lập trình

156 519 1
Tài liệu đã được kiểm tra trùng lặp

Đ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

lập trình C căn bản.....

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, 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 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 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 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 đó 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 đó 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á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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 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. 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 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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 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, 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 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 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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 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ó giá tr khác 0, ngc li biu thc logic 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 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u trúc Lnh 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 ý ngha ht sc quan trng trong khi xây d ng và kim tra li 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ù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 kiu c bn (Base type) và cu trúc d liu kiu do ngi dùng đnh ngha (User type) hay còn gi là kiu d liu 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 du (signed int), kiu s nguyên không du (unsigned int), kiu s nguyên dài 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 đ 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 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 du:%d”, sizeof(signed long )); printf(“\n Kích c kiu s thc đ chính xác đn:%d”, sizeof(float )); printf(“\n Kích c kiu s th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 giá tr đúng (giá tr đúng ca mt biu thc trong C đc hiu là biu th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 giá tr  sai. !: Phép ph đnh cho giá tr đúng nu biu thc giá tr sai và ngc li cho giá tr sai khi biu th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 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 giá tr 0) ~ : Phép ly phn bù. . 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: 07/09/2013, 11:31

Xem thêm: cơ sở kỷ thuật lập trình

TỪ KHÓA LIÊN QUAN