CHƯƠNG TRÌNH CON CHƯƠNG TRÌNH CON I Khái niệm về chương trình con (Sub program) Trong khi lập trình chúng ta thường gặp những đoạn chương trình lặp đi lặp lại nhiều lần ở những chỗ khác nhau Để tránh[.]
CHƯƠNG TRÌNH CON I Khái niệm chương trình (Sub-program) Trong lập trình thường gặp đoạn chương trình lặp lặp lại nhiều lần chỗ khác Để tránh rườm rà đoạn chương trình thay chương trình tương ứng Khi cần, ta cần gọi tên chương trình Lý thứ hai để xây dựng chương trình con: Một vấn đề lớn phức tạp tương ứng với chương trình lớn dài Do việc sửa chữa chương trình khó khăn Ta phân tích thành vấn đề nhỏ hơn, để dễ kiểm tra, sau ghép lại thành chương trình lớn II PROCEDURE FUNCTION (Thủ tục Hàm) Trong Pascal có hal loại CTC : - PROCEDURE (thủ tục) - FUNCTION (hàm) Sự khác hai loại CTC FUNCTION trả lại giá trị kết vô hướng thông qua tên function sử dụng biến, biểu thức Cịn PROCEDURE khơng trả lại kết thông qua tên biểu thức nên procedure viết biểu thức VD : Các PROCEDURE Pascal - Writeln - Readln _ Textcolor Các FUNCTION - Sin(x) : trả giá trị kiểu thực - Chr(i) : trả giá trị kiểu Char III Cấu trúc chương trình {Phần khai báo chương trình chính} VAR CONST {Các chương trình con} PROCEDURE Tên_thủ_tục (Khai báo tham số, cần); {Phần khai báo CTC} BEGIN END; FUNCTION Tên_Hàm (khai báo tham số cần):kiểu liệu; {Phần khai báo CTC} BEGIN END; {Chương trình chính} BEGIN END IV Chuyển tham số cho chương trình Có cách chuyển tham số : - Tham trị (value parameter) - Tham biến (variable parameter) VD : PROCEDURE Thidu(i,j:integer; VAR x,y:real); Tham trị : i,j Tham biến : x,y Sự khác tham trị tham biến : - Tham trị hằng, biến, biểu thức Cịn tham biến biến - Nếu tham trị biến giá trị khơng thay đổi sau CTC thực Còn tham biến thay đổi giá trị CTC có lệnh làm thay đổi giá trị VD : * Hàm SIN (X) Trong X tham trị ta viết - KQ := SIN (1); X=1 - KQ := SIN (Y*2); X=Y*2 - KQ := SIN (X); X=X Và sau thực giá trị X không thay đổi * Hàm DEC (X) Trong X tham biến, ta viết - DEC (X); X biến kiểu nguyên Không thể viết - DEC (5); X - DEC (Y*2); X biểu thức Sau gọi hàm giá trị X thay đổi (giảm 1) V FUNCTION cách lựa chọn Trong FUNCTION bắt buộc phải có lệnh gán giá trị cho tên hàm Tên_hàm := Chúng ta nên dùng FUNCTION đồng thời thoả điều kiện sau : - Nếu ta muốn nhận lại kết - Kết phải kiểu vơ hướng Cịn khơng thoả mãn nên dùng PROCEDURE VD : CTC tính bình phương số FUNCTION Binh_Phuong (X:real):real; BEGIN Binh_Phuong := X*X; END; Nếu dùng procedure PROCEDUR Binh_Phuong (X:Real; VAR kq:real); BEGIN kq := X*X; END; Khi kiểm tra xem tổng bình phương a b có c không : - Nếu FUNCTION ta viết : IF Binh_Phuong(a)+Binh_Phuong(b) = Binh_phuong(c) THEN - Nếu PROCEDURE ta viết Binh_Phuong (a,kqa); Binh_Phuong (b,kqb); Binh_Phuong (c,kqc); IF kqa+kqb=kqc THEN Rõ ràng cách dùng FUNCTION có lợi VI Biến toàn cục biến cục Biến toàn cục Là biến khai báo chương trình Các biến có tác dụng nơi chương trình Biến cục Là biến khai báo chương trình Các biến có tác dụng chương trình Khi chương trình kết thúc, biến tác dụng theo Chú ý Nếu CTC có khai báo biến (hằng) trùng với tên biến (hằng) chương trình chương trình ưu tiên xử lý biến (hằng) chương trình Và khỏi chương trình Giá trị biến chương trình giữ nguyên giá trị trước gọi CTC VD : CONST I=5; PROCEDURE THU; VAR I : INTEGER; BEGIN I := 6;Writeln(I); END; BEGIN Writeln(I);THU;Writeln(I); END Trên hình xuất Giá trị biến toàn cục Giá trị biến địa phương Giá trị biến tồn cục VII Tính đệ quy chương trình Trong PROCEDURE FUNCTION có lời gọi Tính chất gọi đệ quy VD : Tính N! qua định nghĩa N! = 1.2.3 (n-1).n định nghĩa theo đệ quy N! = N=0 = (n-1)!.n N>=1 Khi hàm GIAI_THUA định nghĩa sau FUNCTION GIAI_THUA (n:integer):integer; BEGIN IF n=0 THEN GIAI_THUA := ELSE GIAI_THUA := n*GIAI_THUA(n-1); END;_ Bài tập 1:{ Nhập a,b,c hệ số hàm số bậc Sau ta nhập X liên tục, ứng với giá trị X, ta in giá trị Y tương ứng Chương trình kết thúc ta nhập Hướng dẫn Viết chương trình tính Y tương ứng X} uses crt; var a,b,c,x:real;{a,b,c,x kiểu real} function y(x:real):real; begin y:=a*x*x+b*x+c;{Tính y theo x} end; begin clrscr;{Xố hình} write('A, B, C = ');readln(a,b,c);{Nhập a,b,c} repeat write('X = ');readln(x);{Nhập X} if x0 then writeln('Y = ',y(x):0:2);{Nếu x0 in Y tương ứng} until x=0; end._ Bài tập 2: { Nhập N Sau nhập N toạ độ A,B N đường thẳng In hình đường thẳng có độ dài lớn Hướng dẫn Viết hàm tính độ dài đoạn thẳng với tham số toạ độ} uses crt; var max,xa,ya,xb,yb:real;{max,xa,ya,xb,yb kiểu real} i,n:integer;{i,n kiểu integer} function dodai(xa,ya,xb,yb:real):real; begin dodai:=sqrt(sqr(xa-xb)+sqr(ya-yb));{Gán dodai độ dài đoạn AB} end; begin clrscr;{Xố hình} write('N = ');readln(n);{Nhập N} max:=0;{Gán max 0} for i:=1 to n do{Cho i chạy từ đến N} begin write('XA, YA, XB, YB = ');readln(xa,ya,xb,yb);{Đọc toạ độ A,B} if maxb then a:=a-b else b:=b-a;{Nếu a>b gán a=a-b ngược lại gán b=b-a} ucln:=a;{Gán ucln a} end; function bcnn(a,b:integer):integer; begin bcnn:=a*b div ucln(a,b);{Tính bcnn} end; begin clrscr;{Xố hình} write('N = ');readln(n);{Đọc N} write('So thu : ');readln(a);{Đọc phần tử thứ vào a} u:=a;b:=a;{Gán u,b a} for i:=2 to n do{Cho i chạy từ đến n} begin write('So thu ',i,' : ');readln(a);{Nhập số thứ i vào a} u:=ucln(u,a);{Gán u UCLN u a} b:=bcnn(b,a);{Gán b BCNN u b} end; writeln('UCLN = ',u); writeln('BCNN = ',b); readln; end._ { Nhập N In hình số nguyên tốtừ đến N Hướng dẫn Viết hàm NGUYENTO(N) trả giá trị TRUE N nguyên tố} uses crt; var i,n:integer;{i,n kiểu integer} function nt(n:integer):boolean; var i:integer;{Khai báo i kiểu integer} begin for i:=2 to trunc(sqrt(n))do{Cho i chạy từ đến trunc(sqrt(n))} if n mod i=0 then begin nt:=false;exit;end;{Nếu n chia hết cho i gán nt=false;thốt khỏi CT exit} nt:=true;{Gán nt TRUE} end; begin clrscr;{Xố hình} write('N = ');readln(n);{Đọc N} for i:=2 to n do{Cho i chạy từ đến N} if nt(i)then write(i:5);{Nếu i ntố xuất I} readln; end._ Bài tập 4: { Nhập số N Sau nhập N phần tử In phần tử có số ước lớn Hướng dẫn Viết hàm TINH(N) trả số ước N Lưu ý số có số ước lớn tất số} uses crt;var i,n:integer;{i,n kiểu integer} a,max,luua:integer;{a,max,luua kiểu integer} function tinh(n:integer):integer; var i,souoc:integer;{Khai báo i,souoc kiểu integer} begin if n=0 then tinh:=maxint{Nếu N=0 thì} else{Ngược lại} begin souoc:=0;{Gán souoc 0} for i:=1 to n do{Cho i chạy từ đến N} if n mod i=0 then inc(souoc);{Nếu n chia hết cho i tăng souoc} tinh:=souoc;{Gán tinh souoc} end; end; begin clrscr;{Xố hình} write('N = ');readln(n);{Đọc N} max:=0;{Gán max 0} for i:=1 to n do{Cho i chạy từ đến N} begin write('So thu ',i,' : ');readln(a);{Nhập số thứ i vào a} if max0 Xuất n mod 10; Gọi đệ quy dao(n div 10)} uses crt; var n:integer;{n kiểu integer} procedure dao(n:integer); begin if n>0 then{Nếu n>0 thì} begin write(n mod 10);{In hàng đơn vị n} dao(n div 10);{Gọi thủ tục dao(n div 10)} end; end; begin clrscr;{Xố hình} write('N = ');readln(n);{Đọc N} dao(n); readln; end._ Bài tập 7: { Dãy số Fibonaci dãy số F1,F2 Fn tạo với công thức F1 = F2 = Fn = Fn-1 + Fn-2 (n>2) Hãy nhập số N Tính Fn Hướng dân Viết hàm đệ quy FIBO(N) trả giá trị Fn} uses crt; var n:integer;{n kiểu integer} function fibo(n:longint):longint; begin if n