chương trình chương trình Bởi: Thu Nguyen CHƯƠNG TRÌNH CON- THỦ TỤC VÀ HÀM Khái niệm chương trình con: Chương trình chương trình nằm bên chương trình khác Chương trình có loại: Thủ tục (Procedure) hàm (Function): • Thủ tục (PROCEDURE): Dùng để thực hay nhiều nhiệm vụ • Hàm (FUNCTION): Trả giá trị (có kiểu vô hướng, kiểu string kiểu trỏ) Hàm sử dụng biểu thức Chương trình dùng rộng rãi xây dựng chương trình lớn nhằm làm cho chương trình dễ theo dõi, dễ sửa chữa, phân mảnh chương trình cho nhiều người làm Một đặc điểm bật chương trình có tính đệ quy nhờ mà nhiều toán giải dễ dàng CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CÓ SỬ DỤNG CHƯƠNG TRÌNH CON: PROGRAM Tên_chương_trình; USES CRT; CONST ; TYPE ; VAR ; PROCEDURE THUTUC[(Các tham số)]; [Khai báo Const, Type, Var] 1/10 chương trình 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 trình xây dựng CHƯƠNG TRÌNH CON, nên dùng thủ tục/ hàm? Dùng hàm Dùng thủ tục - Kết toán trả giá trị (kiểu vô hướng, kiểu string kiểu trỏ).- Lời gọi - Kết toán không trả giá trị trả nhiều giá trị trả kiểu liệu có cấu trúc (Array, Record, File).- Lời gọi 2/10 chương trình CHƯƠNG TRÌNH CON cần nằm biểu thức tính toán CHƯƠNG TRÌNH CON không nằm biểu thức tính toán ( ví dụ n!, tìm điểm đối xứng) Ví dụ 1.1: Viết CHƯƠNG TRÌNH CON để tính n! = 1.2 n Function GiaiThua(n:integer):integer; Var P, i:integer; Begin P:=1; For i:=1 To n Do P:=P*i; GiaiThua:=P; End; Ví dụ 1.2: Viết chương trình để tìm điểm đối xứng điểm (x,y) qua gốc tọa độ Procedure DoiXung(x,y:Integer; Var xx,yy:Integer); Begin xx:=-x; yy:=-y; End; CHÚ Ý: Trong ví dụ trên: ? n, x, y gọi tham trị (không có từ khóa var đứng trước) sau khỏi chương trình giá trị không bị thay đổi ? xx, yy gọi tham biến (có từ khóa var đứng trước) sau khỏi chương trình giá trị bị thay đổi Tham số chương trình con: 3/10 chương trình Các chương trình không cần tham số mà có biến riêng (biến cục bộ) Trong trường hợp cần nhận giá trị mà chương trình mẹ truyền cho chương trình cần phải có tham số Tham số thực giá trị lưu trữ biến toàn cục chương trình mẹ, truyền cho thủ tục hàm thông qua lời gọi tên chúng Tham số khai báo sau tên chương trình gọi tham số hình thức Tham số hình thức gồm: • Tham biến: Tham biến giá trị mà chương trình nhận từ chương trình mẹ, giá trị biến đổi chương trình chương trình kết thúc giá trị trả cho tham số thực Cách khai báo tham biến: Tên chương trình (Var tên tham biến: kiểu liệu); • Tham trị: Tham trị tham số truyền vào cho chương trình xử lý quay chương trình mẹ phải giữ nguyên giá trị ban đầu Tên chương trình (tên tham trị: kiểu liệu); Truyền tham số cho chương trình con: Khi tham số hình thức chương trình tham biến tham số thực chương trình mẹ phải biến Trong trường hợp hai tham số thực tham số hình thức phải kiểu liệu…(các tham biến khỏi chương trình giá trị thay đổi) Khi tham số hình thức tham trị tham số thực phải giá trị Biến toàn cục biến địa phương: • Biến toàn cục: biến khai báo chương trình Các biến có tác dụng nơi toàn chương trình • Biến địa phương: biến khai báo chương trình Các biến có tác dụng phạm vi chương trình mà Chú ý: Trong chương trình con, biến toàn cục trùng tên với biến địa phương biến địa phương ưu tiên 4/10 chương trình Ví dụ 1.3: 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; Writeln(‘A=’,a,’B=’,b); {A=10 B=200} {A=50 B=200} End Tính đệ quy chương trình con: Thông thường lời gọi chương trình thực chương trình thiết kế hoàn chỉnh Tuy nhiên, Pascal cho phép chương trình trình xây dựng lại gọi tới nó, tính chất gọi “Đệ quy chương trình con” Lời gọi chương trình con: 5/10 chương trình Một chương trình mẹ có nhiều chương trình trực thuộc, bên chương trình lại có chương trình riêng Khi thiết kế, chương trình phải khối riêng biệt có lệnh nhảy Goto từ chương trình tới chương trình khác • Gọi chương trình từ chương trình mẹ: Lời gọi chương trình đặt chỗ chương trình mẹ Nếu chương trình thủ tục lời gọi chương trình tạo nên câu lệnh, ví dụ: Readln; Nếu chương trình hàm tên hàm tạo nên câu lệnh, tên hàm phải nằm biểu thức hay thủ tục Ví dụ, ta viết: Sqrt(9); gọi hàm sau hợp lệ: a:=sqrt(9)+5; • Gọi chương trình từ chương trình khác: Các chương trình cấp gọi tới truyền tham số cho Nguyên tắc gọi là: chương trình xây dựng sau gọi tới chương trình xây dựng trước nó, đồng thời chương trình cấp gọi tới chương trình cấp chúng gốc Các chương trình xây dựng trước muốn gọi tới chương trình xây dựng sau phải có báo forward Xét số ví dụ sau: Ví dụ 1.4 Program Goi_CTC; Type dayso=array[1 60] of byte; S1:=string[30]; Var a:s1; b:dayso; i,j,n:byte; Procedure nhapso(m:byte; var c:dayso); Begin 6/10 chương trình For i:=1 to m begin Write(‘c[‘,i.’]=’); readln(c[i]); End; End; Function tinhtong(m:byte; var d:dayso):real; Var tong:real; Begin tong:=0; For i:=1 to m tong:=tong+d[i]; Tinhtong:=tong; End; Procedure Inkq(k:byte; e: dayso); Begin Write(‘tong cac ptu =’,tinhtong(k,e):8:0); {chương trình gọi chương trình cấp} Readln; End; BEGIN Write(‘nhap so ptu n’); readln(n); Nhapso(n,b); Inkq(n,b); End 7/10 chương trình Nếu hàm tinhtong xây dựng sau thủ tục Inkq, phải có báo forward Thêm dòng: Function tinhtong(m:byte; var d:dayso):real; forward; trước xây dựng chương trình Ví dụ 1.5 Program Goi_CTC; Type dayso=array[1 60] of byte; S1:=string[30]; Var a:s1; b:dayso; i,j,n:byte; Procedure nhapso(m:byte; var c:dayso); Begin … End; Function tinhtong(m:byte; var d:dayso):real; Var tong:real; Begin … End; Procedure xuly(j:byte;ds:dayso); Procedure Inkq(k:byte;e:dayso); Var i:byte; Begin Writeln(‘tong cac phan tu mang=’,tinhtong(k,e):8:0; Writeln (‘day so sap xep giam dan’); 8/10 chương trình For i:=1 to k write(e[i],’ ‘); Readln; End; {ket thuc thu tuc Inkq} Procedure sapxep(m:byte;ds:dayso); Var p,q:byte; tg:byte; Begin For p:=1 to m-1 For q:=p+1 to m If(d[p]