Kỹ thuật lập trì nh 1 CHƯƠNG i ĐạI CƯƠNG Về LậP TRìNH I. Khái niệm thuật toán: I.1. Khái niệ m : Thuậ t toá n là tậ p hợp cá c quy tắ c có logic nhằ m giả i một lớp bà i toá n nà o đó để đ! ợc một kế t quả xá c định. I.2. Các tí nh chất đặc tr!ng của thuật toán : I.2.1. Tí nh tổng quát : Thuậ t toá n đ!ợc lậ p không phả i chỉ để giả i một bà i toán cụ thể mà thôi mà còn phả i giả i đ! ợc một lớp cá c bà i toá n có dạ ng t! ơng tự. I.2.2. Tí nh giới hạn : Thuậ t toá n giả i một bà i toá n phả i đ! ợc thực hiệ n qua một số giới hạn các thao tá c để đạ t đế n kế t quả . I.2.3. Tí nh duy nhất : Toà n bộ quá trì nh biế n đổi, cũng nh! trậ t tự thực hiệ n phả i đ!ợc xác định và là duy nhấ t. Nh! vậ y khi dùng thuậ t toá n cùng một dữ liệ u ban đầ u phả i cho cùng một kế t quả . I.3. Phân loại: Theo cấ u trúc, ta có thể phâ n thà nh ba loạ i thuậ t toá n cơ bả n sau : - Thuậ t toá n không phâ n nhá nh. - Thuậ t toá n có phâ n nhá nh. - Thuậ t toá n theo chu trì nh có b! ớc lặ p xá c định và có b! ớc lặ p không xá c định. II. Mô tả thuật toán bằng l!u đồ : II.1. L!u đồ : L! u đồ là một dạ ng đồ thị dùng để mô tả quá trì nh tí nh toá n một cá ch có hệ thống. Ng! ời ta th! ờng thể hiệ n thuậ t toá n bằ ng l! u đồ. II.2. Các ký hiệu trên l!u đồ : Tê n khối Ký hiệ u ý nghĩ a Khối mở đầ u hoặ c kế t thúc Dùng mở đầ u hoặ c kế t thúc ch! ơng trì nh Khối và o ra Đ!a số liệ u và o hoặ c in kế t quả Kỹ thuật lập trì nh 2 Khối tí nh toá n Biể u diễ n cá c công thức tí nh toá n và thay đổi giá trị của cá c biế n Khối điều kiện Dùng để phâ n nhá nh ch! ơng trì nh Ch! ơng trì nh con Dùng để gọi ch! ơng trì nh con Mũi tê n Chỉ h! ớng truyề n thông tin, liê n hệ cá c khối II.3. Một số ví dụ biể u diễ n thuật toán bằng l!u đồ II.3.1. Thuật toán không phân nhánh: Ví dụ 1 : Tí nh A = x 2 + y 2 Begin Nhaọp (x,y) A = x 2 + y 2 Xuaỏt (A) End Ví dụ 2 : Tí nh y x CByAx S 2 2 + ++ = ; biế t A,B,C,x,y Begin Nhaọp (A, B, C, x,y) S = (Ax + By + C) / SQRT (x*x + y*y) Xuaỏt S End Kỹ thuật lập trì nh 3 II.3.2. Thuật toán có phân nhánh: Ví dụ 1 : Tì m giá trị max của ba số thực a,b,c Begin Nhaọp (a, b, c) Max = a Xuaỏt (Max) End a > b Max < c Max = c S S Max = b ẹ ẹ Ví dụ 2 : Giả i ph! ơng trì nh bậ c nhấ t Ax+B =0 với cá c nghiệ m thực. Begin Nhaọp (a, b) Xuaỏt (PTVẹ) End a = 0 S S Xuaỏt (-b/a) b = 0 Xuaỏt (PTVN) ẹ ẹ Kü tht lËp tr× nh 4 VÝ dơ 3 : Gi¶ i ph! ¬ng tr× nh bË c hai Ax 2 +Bx+C =0 víi c¸ c nghiƯ m thùc. Begin Nhập (a, b, c) Xuất (‘X 1 = ’,(-b + SQRT(Delta)) / (2*a)) Xuất (‘X 2 = ’,(-b - SQRT(Delta)) / (2*a)) End a = 0 Đ Đ PTB1 (b, c) Delta < 0 Xuất (‘PTVN’) S S Delta = b*b - 4*a*c Đ Delta = 0 Xuất (-b / (2*a)) S II.3.3. Tht to¸n cã chu tr× nh: Th t to¸ n cã chu tr× nh víi c¸c b!íc lỈ p x¸c ®Þnh th!êng ®! ỵc thĨ hiƯ n b» ng l! u ®å sau : i = giá trò ban đầu Lệnh S; Tăng i i <= n S Đ víi n lµ gi¸ trÞ kÕ t thóc. Kỹ thuật lập trì nh 5 Ví dụ 4: Tí nhS= i i n x = 1 , với cá c x i do ta nhậ p và o. Begin Nhaọp (n) i = 1 S = 0 Nhaọp (x i ) End i = i+1 S = S+x i i <= n Xuaỏt (S) S ẹ III. CáC NGôN NGữ LậP TRìNH & CH!ơNG TRìNH DịCH : III.1. Ngôn ngữ lập trì nh: III.1.1. Giới thiệ u: Con ng!ời muốn giao tiế p với má y tí nh phả i thông qua ngôn ngữ. Con ng!ời muốn má y tí nh thực hiệ n công việ c, phả i viế t cá c yêu cầ u đ! a cho má y bằ ng ngôn ngữ má y hiể u đ! ợc. Việ c viế t cá c yê u cầ u ta gọi là lậ p trì nh (programming). Ngôn ngữ dùng để lậ p trì nh đ!ợc gọi là ngôn ngữ lậ p trì nh. Nế u ngôn ngữ lậ p trì nh gầ n với vấ n đề cầ n giả i quyế t, gầ n với ngôn ngữ tự nhiê n thì việ c lậ p trì nh sẽ đơn giả n hơn nhiề u. Những ngôn ngữ lậ p trì nh có tí nh chấ t nh! trê n đ!ợc gọi là ngôn ngữ cấ p cao. Nh!ng má y tí nh chỉ hiể u đ!ợc ngôn ngữ riê ng của mì nh, đó là cá c chuỗi số 0 với 1 và nh! vậ y rõ rà ng là khó khă n cho lậ p trì nh viê n, vì nó không gầ n gũi với con ng! ời. Hiệ n tạ i, ngôn ngữ lậ p trì nh đ! ợc chia ra là m cá c loạ i sau: III.1.2. Phân loại ngôn ngữ lập trì nh: - Ngôn ngữ má y (machine language) Kü tht lËp tr× nh 6 - Hỵp ng÷ (assembly language) - Ng«n ng÷ cÊ p cao (higher-level language) Do m¸ y tÝ nh chØ hiĨ u ®!ỵc ng«n ng÷ m¸ y, cho nª n mét ch!¬ng tr× nh viÕ t trong ng«n ng÷ cÊ p cao ph¶ i ®! ỵc biª n dÞch sang ng«n ng÷ m¸ y. C«ng cơ thùc hiƯ n viƯ c biª n dÞch ®ã ®! ỵc gäi lµ ch! ¬ng tr× nh dÞch. III.2. Ch!¬ng tr× nh dÞch: Ch! ¬ng tr× nh dÞch ®!ỵc chia ra lµ m 2 lo¹ i : tr× nh biª n dÞch (compiler) vµ tr× nh th«ng dÞch (interpreter) III.2.1. Tr× nh biª n dÞch: lµ viƯ c chu n mét ch! ¬ng tr× nh trong ng«n ng÷ cÊ p cao nµ o ®ã (ch! ¬ng tr× nh ngn) sang ng«n ng÷ m¸y (ch! ¬ng tr× nh ®Ý ch). - Thêi gian chu n mét ch! ¬ng tr× nh ngn sang ch!¬ng tr× nh ®Ý ch ®! ỵc gäi lµ thêi gian dÞch. - Thêi gian mµ ch! ¬ng tr× nh ®Ý ch thùc thi ®! ỵc gäi lµ thêi gian thùc thi. Nh! vË y, ch!¬ng tr× nh ngn vµ d÷ liƯ u ®Ĩ ch!¬ng tr× nh thùc thi ®!ỵc xư lý trong c¸ c thêi ®iĨ m kh¸ c nhau, ®! ỵc gäi lµ thêi gian dÞch (compile time) vµ thêi gian thùc thi (run-time) Chương trình nguồn Trình biên dòch Chương trình đích Máy tính thực hiện Kết quả Dữ liệu H× nh I.1. Ch! ¬ng tr× nh thùc thi theo c¬ chÕ dÞch cđa tr× nh biª n dÞch III.2.2. Tr× nh th«ng dÞch: qu¸ tr× nh dÞch vµ thùc thi x¶ y ra cïng 1 thêi gian, dÞch ®Õ n ®© u thi hµ nh lƯ nh ®Õ n ®ã. Chương trình nguồn Chương trình thông dòch Kết quả Dữ liệu H× nh I.2. Ch! ¬ng tr× nh thùc thi theo c¬ chÕ dÞch cđa tr× nh th«ng dÞch Kỹ thuật lập trì nh 7 CH!ơNG 2 LàM QUEN VớI NGôN NGữ C * Giới thiệu ngôn ngữ C Ngôn ngữ C do Dennis Ritchie là ng!ời đầu tiên đề xuất, đ thiế t kế và cài đặ t C trong môi tr! ờng UNIX. Nó có nguồn gốc từ ngôn ngữ BCPL do Martin Richards đ! a ra và o nă m 1967 và ngôn ngữ B do Ken Thompson phá t triể n từ ngôn ngữ BCPL nă m 1970 khi viế t hệ điề u hà nh Unix. C là ngôn ngữ lậ p trì nh đa dụng, cấ p cao nh! ng lạ i có khả nă ng thực hiệ n cá c thao tá c nh! của ngôn ngữ Assembly. Vì thế ngôn ngữ C nhanh chóng đ!ợc cà i đặt, sử dụng trê n má y vi tí nh và đ trở thà nh một công cụ lậ p trì nh khá mạ nh, hiệ n nay đang có khuynh h!ớng trở thà nh một ngôn ngữ lậ p trì nh chí nh cho má y vi tí nh trê n thế giới. * Đặc điể m ngôn ngữ C Ngôn ngữ C có những đặ c điể m cơ bả n sau : - Tí nh cô đọng (compact) : Ngôn ngữ C chỉ có 32 từ khoá chuẩ n, 40 toán tử chuẩ n mà hầ u hế t đ! ợc biể u diể n bởi cá c d y ký tự ngắ n gọn. - Tí nh cấ u trúc (structured) : Ngôn ngữ C có một tậ p hợp cá c phát biể u lậ p trì nh cấ u trúc nh! phá t biể u quyế t định hoặ c lặ p. Do đó, nó cho phép chúng ta viế t ch! ơng trì nh có tổ chức và dể hiể u. - Tí nh t!ơng thí ch (compactable) : Ngôn ngữ C có bộ lệ nh tiề n xử lý và cá c th! việ n chuẩ n là m cho cá c ch! ơng trì nh viế t bằ ng ngôn ngữ C có thể t!ơng thí ch khi chuyể n từ má y tí nh nà y sang má y tí nh kiể u hoà n toà n khá c. - Tí nh linh động (flexible) : Ngôn ngữ C là một ngôn ngữ rấ t linh động về ngữ phá p, nó có thể chấ p nhậ n rấ t nhiề u cách thể hiệ n mà không có ở ngôn ngữ khá c nh! Pascal, nó giúp cho kí ch th! ớc m lệ nh có thể thu gọn lạ i để ch!ơng trì nh thực thi nhanh chóng hơn. - Biê n dịch : Ngôn ngữ C đ! ợc biê n dịch bằ ng nhiề u b! ớc và cho phép biê n dịch nhiề u tậ p tin ch! ơng trì nh riê ng rẽ thà nh cá c tậ p tin đối t!ợng (object) và nối cá c đối t! ợng đó lạ i với nhau (link) thà nh một ch!ơng trì nh thực thi thống nhấ t. I. CáC KHáI NIệM Cơ BảN I.1. Cấu trúc cơ bản của một ch!ơng trì nh C [tiề n xử lý] [Cá c hà m] main() Kỹ thuật lập trì nh 8 { [khai bá o biế n;] [nhậ p dữ liệ u ;] [xử lý ;] [xuấ t ;] } Ví dụ : Ch! ơng trì nh hiệ n trê n mà n hì nh câ u Chao cac ban void main() { printf(Chao cac ban\n); } Một và i nhậ n xét quan trọng : - Ch! ơng trì nh C bao giờ cũng có một hay nhiề u hà m, trong đó có một hà m chí nh bắ t buộc phả i có là hà m main(). Đâ y chí nh là hà m đ!ợc thực hiệ n đầ u tiê n trong ch! ơng trì nh. - Cặ p dấ u { } để xá c định một khối lệ nh. - Hà m printf( Chao cac ban \n) là hà m chuẩ n của C dùng để xuấ t câ u thông bá o Chao cac ban ra mà n hì nh. Ký tự \n là ký tự đặ c biệ t dùng để xuống dòng. - Dấ u ; để chấ m dứt một lệ nh. - Ch! ơng trì nh C có phâ n biệ t chữ th! ờng với chữ hoa. Đa số cá c từ khoá của C đ! ợc viế t bằ ng chữ th!ờng, còn một số í t đ! ợc viế t bằ ng chữ hoa mà ta phả i tuâ n thủ chặ t chẽ , nế u không thì ch! ơng trì nh dịch sẽ không hiể u. * Một vài ví dụ Ví dụ 1 : In bả ng lũy thừa 2 của cá c số nguyê n từ 10 đế n 50 /* Ch! ơng trì nh in bì nh ph! ơng cá c số từ 10 đế n 50*/ #include <stdio.h> void main() {int n; /*Khai bá o biế n n kiể u nguyê n */ n=10; /*Gá n n=10 */ while (n<=50) /*Lặ p từ 10 đế n 50 bằ ng while */ { printf(%3d \t %5d\n,n,n*n); /*in dạng 5d là dà nh 5 vị trí để in n và n 2 */ n++; /* Tă ng n lê n 1 */ } /*Hế t while*/ } /*Hế t main*/ Kỹ thuật lập trì nh 9 Ví dụ 2 : T! ơng tự nh! ví dụ 1 nh! ng viế t cá ch khá c : #include <stdio.h> #define max 50 /*Tiề n xử lý, định nghĩ a max =50*/ void main() { int n; /*Khai bá o biế n n kiể u nguyê n*/ for (n=10; n<=max; n++) /*Lặ p từ 10 đế n 50 bằ ng for*/ printf(%3d \t %5d\n,n,n*n); /*in n và n 2 dạ ng 5d là nă m chữ số*/ } /*Hế t main*/ Ví dụ 3 : Ch! ơng trì nh in lũy thừa 2, 3, 4, 5; có dùng hà m để tí nh lũy thừa : #include <stdio.h> #define max 50 /*Tiề n xử lý, định nghĩ a max =50*/ float luythua(int n, int m) /*Hà m luythua với 2 thông số*/ { float s=1; /*Khai bá o và khởi tạ o biế n s*/ for ( ;m>0;m ) /*Lặp giả m dầ n từ m tới 1*/ s=s*n; return s; /*Trả kế t quả về */ } void main() { int n,n2,n3,n4,n5; /*Khai bá o biế n kiể u nguyê n*/ for (n=10;n<=50;n++) /*Lặ p từ 10 đế n 50 bằ ng for*/ { n2= luythua(n,2); /*Gọi hà m luythua*/ n3= luythua(n,3); n4= luythua(n,4); n5= luythua(n,5); printf(%3d \t %5.2f \t %5.2f\t %5.2f\t %5.2f\t %5.2f\n, n,n2,n3,n4,n5); /*in n và n m dạ ng 5 chữ số với 2 số lẻ */ } } /*Hế t main*/ * Hàm xuất chuẩn printf() Cú pháp : printf(chuỗi-địnhdạ ng,thamso1,thamso2, ) ý nghĩ a : Hà m printf() sẽ xem xét chuỗi-địnhdạ ng, lấ y giá trị các tham số (nế u cầ n) để đặ t và o theo yê u cầ u của chuỗi-địnhdạ ng và gởi ra thiế t bị chuẩ n. Chuỗi-địnhdạ ng là một chuỗi ký tự, trong đó có những ký tự xuấ t ra nguyê n vẹ n hoặ c xuấ t ở dạ ng đặ c biệ t, và có thể có những chuỗi điề u khiển cầ n lấ y giá trị của cá c tham số để thay và o đó khi in ra. Kỹ thuật lập trì nh 10 - Những ký tự đặc biệ t : Ký tự Tác dụng Mã ASCII \n Xuống hà ng mới 10 \t Tab 9 \b Xóa ký tự bê n trá i 8 \r Con trỏ trở về đầ u hà ng 13 \f Sang trang 12 \a Phá t tiế ng còi 7 \\ Xuấ t dấ u chéo ng! ợc 92 \ Xuấ t dấ u nhá y đơn 39 \ Xuấ t dấ u nhá y kép 34 \xdd Xuấ t ký tự có m ASCII dạ ng Hex là dd \ddd Xuấ t ký tự có m ASCII dạ ng Dec là ddd \0 Ký tự NULL 0 - Chuỗi định dạng : % [ flag][width][.prec][F N h l] type Type : định kiể u của tham số theo sau chuỗi-địnhdạ ng để lấ y giá trị ra Type ý nghĩ a d,i Số nguyê n cơ số 10 u Số nguyê n cơ số 10 không dấ u o Số nguyê n cơ số 8 x Số nguyê n cơ số 16, chữ th! ờng(a,b, ,f) X Số nguyê n cơ số 16, chữ in (A,B, ,F) f Số thực dạ ng [-]dddd.ddd e Số thực dạ ng [-]d.ddd e[+/-]ddd E Số thực dạ ng [-]d.ddd E[+/-]ddd g,G Số thực dạ ng e(E) hay f tùy theo độ chí nh xá c c Ký tự s Chuỗi ký tự tậ n cùng bằ ng \0 % Dấ u % cầ n in