Báo cáo tự học môn Lập trình nâng cao Chơng : Chơng trình I Lý tách chơng trình thành nhiều chơng trình - Trong lập trình ta thờng gặp nhiều đoạn chơng trình đợc lặp lặp lại chỗ khác Để tránh rờm rà, đoạn chơng trình đợc thay chơng trình tơng ứng cần việc gọi chơng trình (với tham số khác nhau) mà không cần viết lại đoạn chơng trình - Một vấn đề lớn dẫn đến chơng trình phức tạp gây khó khăn việc gỡ rối hiệu chỉnh Ta phân tích vấn đề phức tạp thành vấn đề nhỏ tơng ứng với chơng trình để dễ kiểm tra gỡ rối sau lại ghép thành chơng trình lớn II Các loại chơng trình - Trong Pascal có hai loại chơng trình Procedure ( thủ tục) Function (hàm) - Các chơng trình cần đợc viết bên thân chơng trình đợc sử dụng thân chơng trình khai báo trớc từ khóa Forward (viết sau tên chơng trình con) sử dụng chơng trình trớc xây dựng Thủ tục: Là chơng trình giá trị trả Cú pháp: Procedure Ten-thu-tuc( Khai b¸o tham sè); {C¸c khai b¸o thđ tục} nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao Begin {Các lệnh chơng trình con;} End; Gọi thủ tục: cần gọi tên thủ tục truyền cho nã mét danh s¸ch c¸c tham sè ViƯc g¸n giá trị cho tham số thực theo thứ tự danh sách gọi, hoàn toàn không liên quan đến tên gọi biến Cú pháp: Ten-thu-tuc(Danh sách tham số); Hàm: đoạn chơng trình sau thực xong trả lại chơng trình gọi giá trị kết vô hớng trỏ - Cú pháp: Function Tên-hàm(Danh sách tham số): Kiểu liệu trả về; { Các khai báo} Begin {Các lệnh chơng trình hàm;} Tên hàm := giá trị trả về; End; Gọi hàm: Hàm thờng đợc sư dơng c¸c biĨu thøc kÌm víi lƯnh g¸n giá trị Ví dụ: Biến := tên hàm(danh sách tham số); nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao III BiÕn toµn cơc vµ biÕn cơc bé - Biến toàn cục: biến đợc khai báo chơng trình chính, biến đợc dùng nơi chơng trình - Biến cục bộ: biến đợc khai báo chơng trình có tác dụng chơng trình IV Truyền tham số cho chơng trình - Chơng trình đợc khai báo mà không dùng tham số chơng trình tính toán trực tiếp với biến toàn cục chơng trình không dùng đến biến, - Việc truyền tham số cho chơng trình cấu thay tơng ứng, cho phép trình đợc lặp lặp lại nhiều lần víi c¸c tham sè kh¸c - C¸c tham sè truyền cho chơng trình phải khai báo tiêu đề chơng trình con, danh sách nhóm tham số hình thức khác kiểu đợc đặt cách b»ng dÊu chÊm phÈy(;) c¸c tham sè cïng nhãm kiểu đợc cách dấu phẩy(,) - Danh sách tham số thực phải tơng ứng quán với danh sách tham số hình thức đợc khai báo tiêu đề chơng trình - Có hai cách truyền tham số: nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao + Tham biến (variable parameter): khai báo đặt sau từ khoá Var, tham số thực phải biến Các tham số thực tham biến đợc thay đổi chơng trình khỏi chơng trình giữ nguyên giá trị thay đổi + Tham trị (value parameter): khai báo tham số không cần từ khoá var Các tham số thực biểu thức, biến hay giá trị Các tham trị đợc thay đổi chơng trình nhng không làm thay đổi giá trị tham số thực Các tham số lu kết tính toán chơng trình tham biến Các tham số đóng vai trò cung cấp kiệu đầu vào tham trị III Hoạt động CT Chơng trình câu lệnh kết thúc thực xong câu lệnh cuối chơng trình Khi gặp lời gọi chơng trình máy sÏ: + CÊp ph¸t bé nhí cho c¸c biÕn cơc + Truyền giá trị tham số thực cho đối + Thực lệnh thân chơng trình + Giải phóng biến cục trở nơi gọi +Nếu chơng trình hàm trở mang theo giá trị nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao VI Tính đệ quy CTC ( Thông thờng hàm thủ tục tham trỏ đến hàm thủ tục khác Trong pascal nh số ngôn ngữ lập trình khác, hàm hay mét thđ tơc cã thĨ tham trá tíi chÝnh nó, tợng gọi tính đệ quy chơng trình con) Định nghĩa: Chơng trình đợc gọi đệ quy thân có lời gọi trực tiếp gián tiếp đến thân Thiết kế giả thuật đệ quy Để thiết kế giải thuật đệ quy ta phân tích toán theo bớc: + Xác định rõ, kích thớc toán phụ thuộc vào +Phân tích toán hay vài toán đồng dạng nhng mô hình nhỏ +Tìm trờng hợp suy biến lời giải đơn giản Phơng pháp: - Giả sử toán có kích thớc n ta coi toán có kích thớc n-1 nhỏ giải - Giả thiết toán đà đợc giải quyÕt víi mäi k < n-1; - Víi n = 0, n = -> trêng hỵp suy biÕn - Phân rà toán thành nhiều toán có kích thớc nhỏ n-1; Cấu trúc: nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao If (trờng hợp suy biến) then (lời giải trực tiếp) Else Begin {Phân rà thành nhiều toán nhỏ hơn} {Gọi đệ quy} End; Trong thuật toán đệ quy thờng có hai thành phần: - Thành phần không chứa khái niệm định nghĩa, điều kiện để kết thúc trình đệ quy - Thành phần chứa khái niệm định nghĩa, sau bớc phạm vi thành phần thay đổi thay đổi đợc nữa, điều kiện kết thúc Ví dụ: N! = N*giaithua(N-1) thành phần chứa định nghĩa 0! = điều kiện kết thúc Một số ví dụ chơng trình đệ quy Ví dụ 1: Bài toán tháp Hà Nội Tơng truyền đền lớn Benaves ấn Độ có đế đồng có cọc kim cơng Trên thợng đế đà xếp 64 đĩa cọc với đờng kính giảm dần Các nhà s phải dịch chuyển đĩa sang cọc khác với nguyên tắc: nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao + Mỗi lần dịch chuyển đĩa + Một đĩa đợc chuyển từ cọc sang cọc khác + Không đợc để đĩa lên đĩa có kích thớc nhỏ Kết quả: công việc kết thúc sau 58 tỉ năm! Thuật toán: Đánh số cọc c1, c2, c3 Giả sử có n ®Üa ®ỵc xÕp ë c1 Víi n = Chun ®Üa tõ c1 => c3 ChuyÓn ®Üa tõ c1 => c2 Chun ®Üa tõ c3 => c2 Víi n=3 Chun ®Üa 1,2 tõ c1 => c3 theo cách Chuyển đĩa từ c1 => c2 Chuyển đĩa 1,2 từ c3 => c2 theo cách Tổng quát hoá thuật toán: Chuyen(n đĩa, từ cọc, tới cọc, qua cäc trung gian); N=2 Chuyen(1,c1,c3,c2); Chuyen(1,c1,c2,c3); Chuyen(1,c3,c2,c1); N=3 Chuyen(2,c1,c3,c2); Chuyen(1,c1,c2,c3); Chuyen(1,c3,c2,c1); nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao Tổng quát: Chuyen(n-1,c1,c3,c2); Chuyen(1,c1,c2,c3); Chuyen(n-1,c3,c2,c1); Chơng trình Program Thap_HaNoi; Uses crt; Var n , c1,c2,c3:integer; Procedure chuyen(n,c1,c2,c3:integer); Begin If n=1 then writeln(c1,’ => ‘,c2); Else Begin Chuyen(n-1,c1,c2,c3); Chuyen(1,c1,c2,c3); Chuyen(n-1,c1,c2,c3); End; End; BEGIN {main program} Write(‘ So dia n=’); Readln(n); Chuyen(n,c1,c2,c3) END VÝ dô2: TÝnh N! N! = N * (N-1)! Function giaithua(n : integer) : integer ; Begin If n = then giaithua :=1 Else giaithua := n*giaithua(n-1); End; VÝ dơ 3: T×m UCLN cđa hai sè nguyên x y nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao Cách 1: Cách 2: FunctionUSCLN(x,y:integer):integer; FunctionUSCLN(x,y:integer):integer; Var du : integer; Begin BEGIN Repeat While y < > If x>y then Begin x:=x-y du:=x mod y; else x:=y; y:=y-x; y:=du; until x=y; end; USCLN:=x; USCLN:=x; End; End; Cách 3: (Dùng đệ quy ) Cách 4: (Dùng ®Ö quy) FunctionUSCLN(x,y:integer):integer; Function USCLN(x,y:integer):integer; Begin Begin If y=0 then USCLN:=x If x=y then USCLN:=x Else Else USCLN:=USCLN(x,x mod y); If x>y then USCLN:=USCLN(x-y,y) End; Else USCLN:=USCLN(x,y-x); End; VÝ dô 4: Chơng trình đảo số Nhập số nguyên dơng n từ bàn phím In số hình theo chiều ngợc lại (Ví dụ: nhập số 123, in hình 321) nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao Program daoso; Var n:integer; Procedure dao(n:integer); Begin Write(n mod 10 :1); If n div 10 then dao(n div 10); End; BEGIN Write(‘nhap vao mot so nguyen duong :’); Readln(n); Dao(n); Readln;; END VÝ dô 5: Thủ tục đảo ký tự( Sử dụng đệ quy): (* Hàm đảo ngợc ký tự không đệ quy*) Function f(s:string):string; If length(s)=1 then f:=s Else for i:=1 to length(s) div Begin Tg:=s[i]; S[i]=s[length(s)-i+1]; S[length(s)-i+1]:=tg; End; (* Hµm ®¶o ký tù sư dơng ®Ư quy*) Function F(s:string):string; Begin If length(s)=1 then F:=s Else F:=s[length(s)]+F(copy(s,1,length(s)-1); End; nguyễn văn sơn - Bộ môn Khoa học máy tính 10 ... Khoa học máy tính 14 Báo cáo tự học môn Lập trình nâng cao Writeln ( Nhap toa diem M:); Write(‘Nhap hoanh X= ’); Readln ( M X ); Write(‘Nhap tung Y= ’); Readln ( M Y ); Writeln ( ‘Toa diem vua nhap... Báo cáo tự học môn Lập trình n©ng cao h1 dientich h1 chuvi h1 canh1 h1 canh2 nguyễn văn sơn - Bộ môn Khoa học máy tính 19 Báo cáo tự học môn Lập trình nâng cao chơng 3: Tổ chức tệp liệu A Tệp... hàm(danh sách tham số); nguyễn văn sơn - Bộ môn Khoa học máy tính Báo cáo tự học môn Lập trình nâng cao III BiÕn toµn cơc vµ biÕn cơc bé - BiÕn toµn cục: biến đợc khai báo chơng trình chính, biến