kien thuc lap trinh pascal 2

Màu nền
Font chữ
Font size
Chiều cao dòng

6.4. Các hàm và thủ tục thường dùng trong nhập xuất dữ liệu •HàmKEYPRESSED: Hàm trả về giá trị TRUE nếu như có một phím bất kỳ được nhấn, nếu không hàm cho giá trị là FALSE. •HàmREADKEY: Hàm có chức năng đọc một ký tự từ bộ đệm bàn phím.

•Thủ tụcGOTO XY( X,Y:Integer): Di chuyển con trỏ đến cột X dòng Y.

•Thủ tụcCLRSCR: Xoá màn hình và đưa con trỏ về góc trên bên trái màn hình.

•Thủ tụcCLREOL: Xóa các ký tự từ vị trí con trỏ đến hết dòng.

•Thủ tụcDELLI NE: Xoá dòng tại vị trí con trỏ và dồn các dòng ở phía dưới lên.

•Thủ tụcTE XTCOLOR(color:Byte): Thiết lập màu cho các ký tự. Trong đó

color∈ [0,15]. •Thủ tụcTE XTBACKGROUND(color:Byte): Thiết lập màu nền cho màn hình. BÀI TẬP MẪU Bài tập 2.1: Viết chương trình nhập vào độ dài hai cạnh của tam giác và góc giữa hai cạnh đó, sau đó tính và in ra màn hình diện tích của tam giác. Ý tưởng: Công thức tính diện tích tam giác: S = ) sin( . . 2 1 θ b a với a,b là độ dài 2 cạnh vàθ là góc kẹp giữa 2 cạnh a và b. Program Tinh_dien_tich_tam_giac;

Var a,b,goc,dientich: Real;

Begin

Write('Nhap vao do dai canh thu nhat: '); Readln(a); Write('Nhap vao do dai canh thu hai: '); Readln(b); Write('Nhap vao goc giua hai canh: '); Readln(goc);

Dientich:=a*b*sin(goc)/2;

Writeln('Dien tich cua tam giac la: ',Dientich:0:2);

Readln;

End. Bài tập 2.2: Viết chương trình tínhnx , x>0. Ý tưởng: Ta có: 1 1lnx n n n xx e   Program Tinh_can_bac_n_cua_x; Var x,S: Real; n: Word; Begin 12

Giáo trình bài tập Pascal Write('Nhap vao n= '); Readln(n);

Write('Nhap vao x= '); Readln(x);

S:=EXP(1/n*LN(x));

Writeln('S = ',S:0:2);

Readln;

End. Bài tập 2.3: Viết chương trình nhập vào 2 số a, b. Sau đó hoán đổi giá trị của 2 số đó: a/ Cho phép dùng biến trung gian. Program Swap; Var a,b,tam: Integer; Begin

Write('Nhap vao a= '); Readln(a);

Write('Nhap vao b= '); Readln(b);

tam:=a; {tam lấy giá trị của a} a:=b; {a lấy giá trị của b} b:=tam; {b lấy lại giá trị của tam} Writeln('a = ',a,' b = ',b); Readln; End. b/ Không được phép dùng biến trung gian. Program Swap; Var a,b: Integer; Begin

Write('Nhap vao a= '); Readln(a);

Write('Nhap vao b= '); Readln(b);

a:=a+b; {a lấy tổng giá trị của a+b} b:=a-b; {b lấy giá trị của a} a:=a-b; {a lấy lại giá trị của b} Writeln('a = ',a,' b = ',b); Readln; End. BÀI TẬP TỰ GIẢI Bài tập 2.4: Viết chương trình nhập vào các số nguyên: a, b, x, y, ... sau đó in ra màn hình kết quả của các biểu thức sau: a/ x y xy + + 2 b/ ( )( ) ( ) a b c rh a + − + − − 4 2 3 29 1 c/ xy , x>0 d/ e| sin() | a x x + − 2 13

Giáo trình bài tập Pascal Bài tập 2. 5 : Viết chương trình tính siện tích tam giác theo công thức sau: S= pp a p b p c ( )( )( ) − − −với p =12(a+b+c) Bài tập 2.6: Viết chương trình tính khoảng cách từ một điểm I(xi,yi) đến đường thẳng có phương trình D: Ax + By + C = 0. Gợi ý: Công thức tính khoảng cách: h = 2 2 . . B A C y B x A i i + + + Bài tập 2.7: Viết chương trình tách một số n thành 2 số a, b sao cho tích P=a*b2 đạt cực đại với n được nhập vào từ bàn phím. Gợi ý: Gọi x là số thứ hai thì số thứ nhất là: (n-x). Theo đề ta có: P(x) = x2.(n-x). Hàm P đạt cực đại khi P'(x) = -3x2 + 2nx = 0 x = 2n/3. Bài tập 2.8: Màn hình đồ họa của một máy tính có độ phân giải: 640x480. Biết rằng, mỗi điểm trên màn hình chiếm 1 byte. Hỏi cần bao nhiêu byte để lưu trữ toàn bộ màn hình đồ họa đó?

Có 2 sinh viên viết chương trình tính số byte lưu trữ màn hình đồ họa: Program Sinhvien1; Var a,b:integer; s:Word; Begin

a:=640; b:=480;

s:=a*b;

writeln(s); readln; End. Program Sinhvien2; Var a,b:Word; s: LongInt; Begin

a:=640; b:=480;

s:=a*b;

writeln(s); readln; End. Hãy cho biết 2 chương trình trên cho kết quả đúng hay sai? Tại sao? Bài tập 2.9: Màn hình đồ họa của một máy tính có độ phân giải: 640x480. Biết rằng, mỗi điểm trên màn hình chiếm 1 byte. Hỏi cần bao nhiêu byte để lưu trữ một vùng có kích thước bằng 1/10 màn hình đồ họa đó?

Có 2 sinh viên viết chương trình giải bài toán này như sau: 14

Giáo trình bài tập Pascal Program Sinhvien1; Var a,b:Word; s: LongInt; Begin

a:=640; b:=480;

s:=a;

s:=s*b;

s:=s DIV 10;

writeln(s); readln; End. Program Sinhvien2; Var a,b:Word; s: LongInt; Begin

a:=640; b:=480;

s:=a*b DIV 10;

writeln(s); readln; End. Hãy cho biết 2 chương trình trên cho kết quả đúng hay sai? Tại sao? 15

Chương 3 CÁC CÂU LỆNH CÓ CẤU TRÚC I. CÂU LỆNH RẼ NHÁNH 1.1. Lệnh IF Cú pháp: (1) IF B THEN S; (2) IF B THEN S1 ELSE S2;

Giáo trình bài tập Pascal Chương 3 CÁC CÂU LỆNH CÓ CẤU TRÚC I. CÂU LỆNH RẼ NHÁNH 1.1. Lệnh IF Cú pháp: (1) IF B THEN S; (2) IF B THEN S1 ELSE S2; Sơ đồ thực hiện: Chú ý: Khi sử dụng câu lệnh IF thì đứng trước từ khoá ELSE không được có dấu chấm phẩy (;). 1.2. Lệnh CASE Cú pháp: Dạng 1 Dạng 2 CASE B OF Const 1: S1;

Const 2: S2;

...

Const n: Sn;

END; CASE B OF Const 1: S1;

Const 2: S2;

...

Const n: Sn;

ELSE Sn+1; END; Trong đó: B: Biểu thức kiểu vô hướng đếm được như kiểu nguyên, kiểu logic, kiểu ký tự, kiểu liệt kê. 16 (2) B + - S1 S2 ... (1) B + - S ...

Const i: Hằng thứ i, có thể là một giá trị hằng, các giá trị hằng (phân cách nhau bởi dấu phẩy) hoặc các đoạn hằng (dùng hai dấu chấm để phân cách giữa giá trị đầu và giá trị cuối).

Giá trị của biểu thức và giá trị của tập hằng i (i=1¸n) phải có cùng kiểu. Khi gặp lệnh CASE, chương trình sẽ kiểm tra: - Nếu giá trị của biểu thức B nằm trong tập hằng const i thì máy sẽ thực hiện lệnh Si tương ứng. - Ngược lại:

+ Đối với dạng 1: Không làm gì cả.

+ Đối với dạng 2: thực hiện lệnh Sn+1.

II. CÂU LỆNH LẶP 2.1. Vòng lặp xác định Có hai dạng sau: Dạng tiến FOR := TO DO S; Dạng lùi FOR := DOWNTO DO S; Sơ đồ thực hiện vòng lặp FOR: Chú ý: Khi sử dụng câu lệnh lặp FOR cần chú ý các điểm sau: Không nên tuỳ tiện thay đổi giá trị của biến đếm bên trong vòng lặp FOR vì làm như vậy có thể sẽ không kiểm soát được biến đếm. 17 Dạng tiến Biến đếm:=Min Biến đếm=Max + - Thoát S; DEC(Biến đếm);

Giá trị Max và Min trong câu lệnh FOR sẽ được xác định ngay khi vào đầu vòng lặp. Do đó cho dù trong vòng lặp ta có thay đổi giá trị của nó thì số lần lặp cũng không thay đổi. 5.3.2. Vòng lặp không xác định Dạng REPEAT Dạng WHILE Repeat

S;

Until B;

While B Do S; Ý nghĩa: •Dạng REPEAT: Lặp lại công việc S cho đến khi biểu thức B=TRUE thì dừng. •Dạng WHILE: Trong khi biểu thức B=TRUE thì tiếp tục thực hiện công việc S

BÀI TẬP MẪU Bài tập 3.1: Viết chương trình nhập vào một số nguyên và kiểm tra xem số vừa nhập

là số chẵn hay số lẻ. Uses crt; Var x:integer; Begin

Write('Nhap vao mot so nguyen : '); Readln(x);

If x MOD 2=0 Then

Writeln('So vua nhap vao la so chan') Else Writeln('So vua nhap vao la so le');

Readln; End. Bài tập 3.2: Viết chương trình giải phương trình bậc nhất ax+b=0 Uses Crt;

Var a,b,x : real;

Begin

Write('a = '); Readln(a); Write('b = '); Readln(b); If a = 0 Then { Nếu a bằng 0 } If b = 0 Then{ Trường hợp a = 0 và b = 0 } Writeln('Phuong trinh co vo so nghiem') Else { Trường hợp a=0 và b≠ 0 } Writeln('Phuong trinh vo nghiem') Else{ Trường hợp a≠ 0 } Begin

x:= -b/a;

Writeln('Phuong trinh co nghiem la :',x:0:2);

End; Readln; End. Bài tập 3.3: Viết chương trình nhập vào tuổi của một người và cho biết người đó là thiếu niên, thanh niên, trung niên hay lão niên. Biết rằng: nếu tuổi nhỏ hơn 18 là thiếu niên, từ 18 đến 39 là thanh niên, từ 40 đến 60 là trung niên và lớn hơn 60 là lão niên.

Uses crt;

Var tuoi:Byte;

Begin

Write(Nhap vao tuoi cua mot nguoi:'); Readln(tuoi); Case tuoi Of

1..17: Writeln(Nguoi nay la thieu nien');

18..39:Writeln(Nguoi nay la thanh nien');

40..60:Writeln(Nguoi nay la trung nien');

Else

Writeln(Nguoi nay la lao nien');

End;

Readln;

19

End. Bài tập 3.4: Viết chương trình tính tổng S = 1+2+...+N Cách 1: Dùng vòng lặp FOR. Program TinhTong;

Uses crt;

Var N,i,S:integer;

Begin

Clrscr;

Write('Nhap vao gia tri cua N :'); Readln(N);

S:=0;

For i:=1 to N do S:=S+i;

Writeln('Ket qua la :',S);

Readln;

End. Cách 2: Dùng vòng lặp REPEAT. Program TinhTong;

Uses crt;

Var N,i,S:integer;

Begin

Clrscr;

Write('Nhap vao gia tri cua N :'); Readln(N);

S:=0; i:=1;

Repeat

S:=S+i; i:=i+1;

Until i>N;

Writeln('Ket qua la :',S);

Readln;

End. Cách 3: Dùng vòng lặp WHILE. Program TinhTong;

Uses crt;

Var N,i,S:integer;

Begin

20 Giáo trình bài tập Pascal Clrscr;

Write('Nhap vao gia tri cua N :'); Readln(N);

S:=0; i:=1;

While i

Begin

S:=S+i;

i:=i+1;

End;

Writeln('Ket qua la :',S);

Readln;

End. Bài tập 3.5: Viết chương trình nhập vào N số nguyên từ bàn phím. Hãy tính và in ra màn hình tổng của các số vừa được nhập vào. Ý tưởng: Dùng phương pháp cộng dồn. Cho vòng lặp FOR chạy từ 1 tới N, ứng với lần lặp thứ i, ta nhập vào số nguyên X và đồng thời cộng dồn X vào biến S. Program Tong; Uses crt;

Var N,S,i,X : Integer;

Begin

Clrscr; S:=0; For i:=1 To n Do Begin

Write('Nhap so nguyen X= '); Readln(X);

S:=S+X;

End;

Writeln('Tong cac so duoc nhap vao la: ',S);

Readln;

End. Bài tập 3.6: Viết chương trình nhập vào các số nguyên cho đến khi nào gặp số 0 thì kết thúc. Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào. Ý tưởng: Bài toán này không biết chính xác số lần lặp nên ta không thể dùng vòng lặp FOR. Vì phải nhập vào số nguyên N trước, sau đó mới kiểm tra xem N=0? Do đó ta nên dùng vòng lặp REPEAT.

21 Giáo trình bài tập Pascal Program Nhapso; Uses crt;

Var N,dem : Integer;

Begin

Clrscr; dem:=0; Repeat Write('Nhap vao mot so nguyen N= '); Readln(N); If N MOD 2 = 0 Then dem:=dem+1;

Until N=0;

Writeln('Cac so chan duoc nhap vao la: ',dem);

Readln;

End. Bài tập 3.7: Viết chương trình tính số Pi với độ chính xác Epsilon, biết: Pi/4 = 1-1/3+1/5-1/7+... Ý tưởng: Ta thấy rằng, mẫu số là các số lẻ có qui luật: 2*i+1 với i=1,...,n. Do đó ta dùng i làm biến chạy. Vì tính số Pi với độ chính xácEpsil on nên không biết trước được cụ thể số lần lặp, do đó ta phải dùng vòng lặp WHILE hoặc REPEAT. Có nghĩa là phải lặp cho tới khi t=4/(2*i+1)≤ Epsilon thì dừng.

Uses Crt;

Const Epsilon=1E-4;

Var Pi,t:real;

i,s:Integer; Begin Pi:=4; i:=1; s:=-1; t:=4/(2*i+1); While t>Epsilon Do Begin

Pi:=Pi+s*t;

s:=-s; i:=i+1;

t:=4/(2*i+1);

End;

Writeln('So Pi = ',Pi:0:4);

Readln;

End. 22 Giáo trình bài tập Pascal Bài tập 3.8: Viết chương trình nhập vào số nguyên N. In ra màn hình tất cả các ước số của N. Ý tưởng: Cho biến i chạy từ 1 tới N. Nếu N MOD i=0 thì viết i ra màn hình. Uses Crt; Var N,i : Integer; Begin

Clrscr;

Write('Nhap so nguyen N= '); Readln(N);

For i:=1 To N Do

If N MOD i=0 Then Write(i:5); Readln; End. Bài tập 3.9: Viết chương trình tìm USCLN và BSCNN của 2 số a, b được nhập vào từ bàn phím. Ý tưởng: - Tìm USCLN: Lấy số lớn trừ số nhỏ cho đến khi a=b thì dừng. Lúc đó: USCLN=a. - BSCNN(a,b) = a*b DIV USCLN(a,b). Uses crt; Var a,b,aa,bb:integer; Begin

Write('Nhap a : '); Readln(a);

Write('Nhap b : '); Readln(b);

aa:=a; bb:=b;

While aabb Do

Begin If aa>bb Then aa:=aa-bb Else bb:=bb-aa; End;

Writeln('USCLN= ',aa);

Writeln('BSCNN= ',a*b DIV aa);

Readln;

End. Bài tập 3.10: Viết chương trình tìm các số có 3 chữ sốabc sao cho:abc = a3 + b3 + c3. Ý tưởng: 23 Giáo trình bài tập Pascal Dùng phương pháp vét cạn. Ta biết rằng: a có thể có giá trị từ 1→9 (vì a là số hàng trăm), b,c có thể có giá trị từ 0→9. Ta sẽ dùng 3 vòng lặp FOR lồng nhau để duyệt qua tất cả các trường hợp của a,b,c.

Ứng với mỗi bộ abc, ta sẽ kiểm tra: Nếu 100.a + 10.b + c = a3 + b3 + c3 thì in ra bộ abc đó. Uses crt; Var a,b,c : Word; Begin For a:=1 To 9 Do For b:=0 To 9 Do For c:=0 To 9 Do If (100*a + 10*b + c)=(a*a*a + b*b*b + c*c*c) Then Writeln(a,b,c); Readln; End. Bài tập 3.11: Viết chương trình nhập vào số tự nhiên N rồi thông báo lên màn hình số đó có phải là số nguyên tố hay không. Ý tưởng: N là số nguyên tố nếu N không có ước số nào từ 2→ N div 2. Từ định nghĩa này ta đưa ra giải thuật:

- Đếm số ước số của N từ 2→ N div 2 lưu vào biến d.

- Nếu d=0 thì N là số nguyên tố.

Uses crt; Var N,i,d : Word; Begin

If N

Else

Begin

{Đếm số ước số}

d:=0;

For i:=2 To N div 2 Do

If N MOD i=0 Then d:=d+1;

{Kiểm tra}

If d=0 Then Writeln(N,' la so nguyen to')

Else Writeln(N,' khong phai la so nguyen to');

End; 24

Giáo trình bài tập Pascal Readln; End. BÀI TẬP TỰ GIẢI Bài tập 3.12: Viết chương trình giải phương trình bậc hai: ax2 + bx + c = 0, a≠0. Gợi ý: - Tính Delta=b*b-4*a*c. - Biện luận:

Delta

Delta=0: Phương trình có nghiệm kép: x = -b/(2*a).

Delta>0: Phương trình có 2 nghiệm phân biệt: x1,2 = (-b±SQRT(Delta))/(2*a).

Bài tập 3.13: Viết chương trình nhập vào từ bàn phím: giờ, phút, giây. Cọng thêm một số giây cũng được nhập từ bàn phím. Hãy in ra kết quả sau khi cọng xong. Gợi ý: - Gọi số giây được cộng thêm là: ss. Gán giây:=giây+ss.

- Nếu giây≥60 thì: phút:=phút + giây DIV 60 và giây:=giây MOD 60.

- Nếu phút≥60 thì: giờ:=giờ + phút DIV 60 và phút:=phút MOD 60.

Bài tập 3.14: Viết chương trình tìm Max, Min của 4 số: a, b, c, d. Bài tập 3.15: Viết chương trình nhập vào ngày, tháng, năm. Máy sẽ hiện lên ngày, tháng, năm hôm sau. Gợi ý: Biện luận theo tháng. Gom tháng thành 3 nhóm: tháng có 31 ngày (1,3,5,7,8,10,12), tháng có 30 ngày (4,6,9,11) và tháng 2 (có 28 hoặc 29 ngày tùy theo năm nhuận).

Dùng lệnh lựa chọn:

CASE thang OF

1,3,5,7,8,10,12:..........

4,6,9,11:.....................

2:................................

END;

Bài tập 3.16: Viết chương trình in ra màn hình các giá trị của bảng mã ASCII từ 0→ 255. Gợi ý: Cho biến i chạy từ 0→ 255. In ra màn hình i và CHR(i). 25 Giáo trình bài tập Pascal Bài tập 3.17: Viết chương trình in ra màn hình các số nguyên từ 1 đến 100 sao cho cứ 10 số thì xuống dòng. Gợi ý: Cho biến i chạy từ 1→ 100. In ra màn hình i và kiểm tra: nếu i MOD 10=0 thì WRITELN. Bài tập 3.18: Viết chương trình in ra màn hình bảng cữu chương. Gợi ý: Dùng 2 vòng lặp FOR lồng nhau: i là số bảng cữu chương (2...9), j là số thứ tự trong từng bảng cữu chương (1...10). For i:=2 To 9 Do For j:=1 To 10 Do Writeln(i,'x',j,'=',i*j); Bài tập 3.19: Viết chương trình tính các tổng sau: S0 = n! = 1*2*...*n {n giai thừa}

S1 = 1 + 1/2 + ... + 1/n

S2 = 1 + 1/2! + ... + 1/n!

S3 = 1 + x + x2/2! + x3/3! + ... + xn/n!

S4 = 1 - x + x2/2! - x3/3! + ... + (-1)nxn/n!

S5 = 1 + sin(x) + sin2(x) + ... + sinn(x).

Bài tập 3.20: Viết chương trình để tìm lời giải cho bài toán sau: Trong giỏ vừa thỏ vừa gà, Một trăm cái cẳng bốn ba cái đầu. Hỏi có mấy gà mấy thỏ? Bài tập 3.21: Viết chương trình để tìm lời giải cho bài toán sau:

Trăm trâu trăm bó cỏ

Bó lại cho tròn

Trâu đứng ăn năm

Trâu nằm ăn ba

Năm trâu nghé ăn một.

Hỏi có bao nhiêu trâu đứng, trâu nằm, trâu nghé?

Bài tập 3.22: Viết chương trình nhập vào các số nguyên từ bàn phím cho đến khi nào gặp số nguyên tố thì kết thúc nhập. Tính tổng các số chẵn và trung bình cọng các số lẻ. Gợi ý: 26 Giáo trình bài tập Pascal Dùng vòng lặp REPEAT ... UNTIL NTo; để nhập. Trong đó, NTo là biến kiểu Boolean để kiểm tra số được nhập vào có phải là số nguyên tố hay không. Bài tập 3.23: Viết chương trình nhập vào một số nguyên dương. Hãy thông báo lên màn hình số đó có bao nhiêu chữ số và tổng các chữ số của số đó. Gợi ý: Dùng vòng lặp WHILE. Trong khi N>0 thì: lấy ra chữ số cuối cùng của N để tính bằng phép toán MOD 10, sau đó bỏ bớt đi chữ số cuối cùng của N bằng phép toán DIV 10.

Bài tập 3.24: Viết chương trình in ra màn hình tất cả các số nguyên tố từ 2 đến N. Với N được nhập từ bàn phím. Bài tập 3.25: Viết chương trình phân tích một số ra thừa số nguyên tố. Ví dụ: N=100 sẽ in ra màn hình: 100 | 2 50 | 2 25 | 5

5 | 5 1 | Bài tập 3.26: Số hoàn thiện là số tự nhiên có tổng các ước của nó (không kể chính nó) bằng chính nó. Viết chương trình kiểm tra xem một số được nhập vào từ bàn phím có phải là số hoàn thiện hay không? Ví dụ: 6, 28 là các số hoàn thiện.

Gợi ý: - Tính tổng các ước số của N: từ 1→ N div 2 lưu vào biến S. - Nếu S=N thì N là số hoàn thiện. Bài tập 3.27: Viết chương trình in ra các số nguyên từ 1 đến N2 theo hình xoắn ốc với N được nhập vào từ bàn phím. Ví dụ, với N=5 ta có: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9

27 Giáo trình bài tập Pascal Chương 4 CHƯƠNG TRÌNH CON: THỦ TỤC VÀ HÀM I. KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON 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 CTC: •Thủ tục (PROCEDURE): Dùng để thực hiện một hay nhiều nhiệm vụ nào đó. •Hàm (FUNCTION): Trả về một giá trị nào đó (có kiểu vô hướng, kiểu string hoặc kiểu con trỏ). Hàm có thể sử dụng trong các biểu thức. Ngoài ra, trong Pascal còn cho phép các CTC lồng vào nhau. II. CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CÓ SỬ DỤNG CTC PROGRAM Tên_chương_trình; USES CRT; CONST............; TYPE............; VA R............;

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. 28 Giáo trình bài tập Pascal 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àm Dù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. - Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trịhoặc trả về kiểu dữ liệu có cấu trúc (Array, Record, File).

- 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: •n, x, y được gọi là tham trị(không có từ khóa var đứng trước) vì sau khi ra khỏi CTC giá trị của nó không bị thay đổi. •xx, yy được gọi là tham biến(có từ khóa var đứng trước) vì sau khi ra khỏi CTC giá trị của nó bị thay đổi. III. BIẾN TOÀN CỤC VÀ BIẾN ĐỊA PHƯƠNG •Biến toàn cục: là các biến được khai báo trong chương trình chính. Các biến này có tác dụng ở mọi nơi trong toàn bộ chương trình. •Biến địa phương: là các biến được khai báo trong các CTC. Các biến này chỉ có tác dụng trong phạm vi CTC đó mà thôi. 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. 29 Giáo trình bài tập Pascal 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. IV. ĐỆ QUI 4.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 •Tham số hóa bài toán

•Tìm trường hợp suy biến.

•Phân tích các trường hợp chung (đưa về các bài toán cùng loại nhưng nhỏ hơn).

Ví dụ: Viết hàm đệ qui để tính n! = 1.2...n. •Tham số hóa: n! = Factorial(n); •Factorial(0) = 1 (trường hợp suy biến) •Factorial(n) = n*Factorial(n-1) (trường hợp chung) 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 đó. 30

Bạn đang đọc truyện trên: Truyen2U.Pro

#anhgien