Procedure trong Pascal là gì?
Chương trình con (CTC) là một đoạn chương trình thực hiện trọn vẹn hay một chức năng nào đó. Trong Turbo Pascal, có 2 dạng chương trình con:
2. Cấu trúc chungPROGRAM Tên_chương_trình; USES CRT; CONST …………; TYPE …………; VAR …………; PROCEDURE THUTUC[(Các tham số)]; [Khai báo Const, Type, Var] BEGIN ………….. END; FUNCTION HAM[(Các tham số)]: [Khai báo Const, Type, Var] BEGIN ………….. HAM:= END; BEGIN {Chương trình chính} ………………. THUTUC[(…)]; ………………. A:= HAM[(…)]; ………………. END. Chú ý: Trong quá trình xây dựng CTC, khi nào thì nên dùng thủ tục/hàm? Dùng hàmDùng thủ tục– Kết quả của bài toán trả về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc kiểu con trỏ).– Lời gọi CTC cần nằm trong các biểu thức tính toán. – Lời gọi CTC không nằm trong các biểu thức tính toán. Ví dụ 1: Viết CTC để tính n! = 1.2…n. Ý tưởng: Vì bài toán này trả về 1 giá trị duy nhất nên ta dùng hàm. Function GiaiThua(n:Word):Word; Var P, i:Word; Begin P:=1; For i:=1 To n Do P:=P*i; GiaiThua:=P; End; Ví dụ 2: Viết chương trình con để tìm điểm đối xứng của điểm (x,y) qua gốc tọa độ. Ý tưởng: Vì bài toán này trả về tọa độ điểm đối xứng (xx,yy) gồm 2 giá trị nên ta dùng thủ tục. Procedure DoiXung(x,y:Integer; Var xx,yy:Integer); Begin xx:=-x; yy:=-y; End; CHÚ Ý: Trong 2 ví dụ trên:
3. Biến toàn cục và biến địa phương
Chú ý: Trong một CTC, nếu biến toàn cục trùng tên với biến địa phương thì biến địa phương được ưu tiên hơn. Ví dụ: Program KhaoSatBien; Var a,b: Integer; {biến toàn cục} Procedure ThuBien; Var a: Integer; {biến địa phương} Begin a:=10; Writeln (‘A=’,a,’B=’,b); End; Begin a:=50; b:=200; ThuBien; {A=10 B=200} Writeln(‘A=’,a,’B=’,b); {A=50 B=200} End. 4. Đệ qui4.1. Khái niệm đệ qui Trong một chương trình, một CTC có thể gọi một CTC khác vào làm việc. Nếu như CTC đó gọi lại chính nó thì gọi là sự đệ qui. 4.2. Phương pháp thiết kế giải thuật đệ qui
Ví dụ: Viết hàm đệ qui để tính n! = 1.2…n.
Function Factorial(N:integer): Longint; Begin If N=0 Then Factorial:=1 Else Factorial:=N*factorial(N-1); { lời gọi đệ qui } End; 4.3. Giải thuật quay lui Bài toán: Hãy xây dựng các bộ giá trị gồm n thành phần (x1,…,xn) từ một tập hữu hạn cho trước sao cho các bộ đó thỏa mãn yêu cầu B cho trước nào đó. Phương pháp chung: Giả sử đã xác định được k-1 phần tử đầu tiên của dãy: x1,…,xk-1. Ta cần xác định phần tử thứ k. Phần tử này được xác định theo cách sau: – Giả sử Tk: tập tất cả các giá trị mà phần tử xk có thể nhận được. Vì tập Tk hữu hạn nên ta có thể đặt nk là số phần tử của Tk theo một thứ tự nào đó, tức là ta có thể thành lập một ánh xạ 1-1 từ tập Tk lên tập {1, 2, …, nk}. – Xét jÎ{1, 2, …, nk}. Ta nói rằng “j chấp nhận được” nếu ta có thể bổ sung phần tử thứ j trong Tk với tư cách là phần tử xk vào trong dãy x1,…,xk-1 để được dãy x1,…,xk. – Nếu k=n: Bộ (x1,…,xk) thỏa mãn yêu cầu B, do đó bộ này được thu nhận. – Nếu k Sau đây là thủ tục đệ qui cho giải thuật quay lui: Procedure THU (k:Integer); Var j:Integer; Begin For j:=1 To nk Do If Begin If k=n Then Else THU(k+1); {Quay lui} End; End; BÀI TẬP MẪUBài tập 1: Viết hàm tìm Max của 2 số thực x,y. Var a,b:Real; Function Max(x,y:Real):Real; Begin If x>y Then Max:=x Else Max:=y; End; Begin Write(‘Nhap a=’); Readln(a); Write(‘Nhap b=’); Readln(b); Writeln(‘So lon nhat trong 2 so la: ‘, Max(a,b)); Readln; End. Bài tập 2: Viết hàm LOWCASE( c:char):char; để đổi chữ cái hoa c thành chữ thường. Ý tưởng: Trong bảng mã ASCII, số thứ tự của chữ cái hoa nhỏ hơn số thứ tự của chữ cái thường là 32. Vì vậy ta có thể dùng 2 hàm CHR và ORD để chuyển đổi. |