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
Var j:Integer;
Begin
For j:=1 To nk Do If Then Begin
;
If k=n Then
Else THU(k+1); {Quay lui} End; End; Ví dụ: Liệt kê các dãy nhị phân có độ dài n. Program DayNhiPhan; Var b:Array[1..20] Of 0..1; {Dãy nhị phân có độ dài tối đa là 20} n:Byte; Procedure InKetQua; Var i:Byte; Begin
For i:=1 To n Do Write(b[i]);
Writeln;
End; Procedure THU(k:Byte); Var j:Byte; 31 Giáo trình bài tập Pascal Begin For j:=0 To 1 Do {Tập giá trị của dãy nhị phân} Begin b[k]:= j; If k=n Then InKetQua Else THU(k+1); {Quay lui} End; End; Begin
Write('n = '); Readln(n);
THU(1);
Readln;
End. V. TẠO THƯ VIỆN (UNIT) 5.1. Cấu trúc của một Unit UNIT ; {phải trùng với tên file} INTERFACE USES........... .;
CONST..........;
TYPE............;
VAR .............; Procedure [(Các tham số)]; Function [(Các tham số)]:; IMPLEMENTATION
Procedure [(Các tham số)];
[Các khai báo]
Begin
............. End; Function [(Các tham số)]:;
[Các khai báo]
Begin
............. End; END. 32 Giáo trình bài tập Pascal Chú ý: •Tên của Unit phải trùng với tên file. •Chỉ có những chương trình con được khai báo ở phần INTERFACE mới sử dụng được ở các chương trình khác. •Các thủ tục và hàm được khai báo ở phần INTERFACE thì bắt buộc phải có trong phần IMPLEMENTATION. 5.2. Ví dụ minh họa Tạo Unit MYTOOL lưu ở file MYTOOL.PAS. UNIT MYTOOL; INTERFACE USES CRT; VAR m:Integer; Procedure WriteXY(x,y:Integer; St:String);
Function UCLN(a,b:Integer):Integer;
Function NGUYENTO(n:Word):Word;
IMPLEMENTATION Procedure WriteXY(x,y:Integer; St:String); Var i:Byte; Begin Gotoxy(x,y); Write(St); End; Function UCLN(a,b:Integer):Integer; Begin While ab Do Begin If a>b Then a:=a-b Else b:=b-a; End; UCLN:=a; End; Function NGUYENTO(n:Word):Boolean; Var d,i:Word; Begin
d:=0;
For i:=2 To n DIV 2 Do
If n MOD i=0 Then d:=d+1; NGUYENTO:=d=0; 33 Giáo trình bài tập Pascal End; END. Bây giờ, ta có thể viết một chương trình có sử dụng Unit MYTOOL. Uses Crt, MyTool; Var a,b:Integer; Begin
CLRSCR;
Write(10,5,'CHUONG TRINH MINH HOA');
Write('Nhap a = '); Readln(a);
Write('Nhap b = '); Readln(b);
Writeln('UCLN cua ',a,' va ',b,' la:',UCLN(a,b));
Write('Nhap m = '); Readln(m);
If NGUYENTO(m) Then Writeln(m,' la so nguyen to!') Else Writeln(m,' khong phai la so nguyen to!') Readln; End. BÀI TẬP MẪU Bài tập 4.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 4.2: Viết hàm LOWCASE( c:char):char; để đổi chữ cái hoa c thành chữ thường. Ý tưởng: 34 Giáo trình bài tập Pascal 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. Uses crt;
Var ch:Char;
Function LOWCASE(c:Char):Char;
Begin
If c IN ['A'..'Z'] Then LOWCASE:=CHR(ORD(c)+32) Else LOWCASE:=c; End; Begin
Write('Nhap ký tu ch='); Readln(ch);
Writeln('Ky tu hoa la: ', LOWCASE(ch));
Readln;
End. Bài tập 4.3: Viết thủ tục để hoán đổi hai gía trị x,y cho nhau. Var a,b:Real; Function Swap(Var x,y:Real); Var Tam:Real; Begin Tam:=x; x:=y; y:=Tam; End; Begin
Write('Nhap a='); Readln(a);
Write('Nhap b='); Readln(b);
Swap(a,b);
Writeln('Cac so sau khi hoan doi: a=', a:0:2,' b=',b:0:2);
Readln;
End. Bài tập 4.4: Viết hàm XMU(x:Real;n:Byte):Real; để tính giá trị xn. Var x:Real; n:Byte;
Function XMU(x:Real;n:Byte):Real;
Var i:Byte; S:Rea;
Begin
35 Giáo trình bài tập Pascal S:=1;
For i:=1 To n Do S:=S*x;
XMU:=S;
End; Begin
Write('Nhap x='); Readln(x);
Write('Nhap n='); Readln(n);
Writeln('x mu n = ', XMU(x,n):0:2);
Readln;
End. Bài tập 4.5: Viết thủ tục KHUNG(x1,y1,x2,y2:Integer); để vẽ một khung hình chữ nhật có đỉnh trên bên trái là (x1,y1) và đỉnh dưới bên phải là (x2,y2). Ý tưởng: Dùng các ký tự mở rộng trong bảng mã ASCII:(#179),(#196),(#218),(#192), (#191), (#217). Uses crt;
Procedure Khung(x1,y1,x2,y2:Integer);
Var i,j:Integer;
Begin
Gotoxy(x1,y1); Write(#218); {Vẽ} Gotoxy(x1,y2); Write(#192); {Vẽ} {Vẽ 2 viền ngang của khung} For i:=x1+1 To x2-1 do Begin
Gotoxy(i,y1); Write(#196);
Gotoxy(i,y2); Write(#196);
End; Gotoxy(x2,y1); Write(#191); {Vẽ} Gotoxy(x2,y2); Write(#217); {Vẽ} {Vẽ 2 viền dọc của khung} For j:=y1+1 To y2-1 do Begin
Gotoxy(x1,j); Write(#179);
Gotoxy(x2,j); Write(#179);
End; End; Begin Clrscr; 36 Giáo trình bài tập Pascal Khung(10,5,40,20); Readln; End. Bài tập 4.6: Viết thủ tục PHANTICH(n:Integer); để phân tích số nguyên n ra thừa số nguyên tố. Uses crt; Var n:Integer; Procedure PHANTICH(n:Integer);
Var i:Integer;
Begin
i:=2; While n1 Do Begin While n MOD i=0 Do Begin
Writeln(n:5,'|',i:2);
n:=n Div i;
End; i:=i+1; End; Writeln(n:5,'|'); End; Begin
Write('Nhap n='); Readln(n);
PHANTICH(n);
Readln;
End. BÀI TẬP TỰ GIẢI Bài tập 4.7: Viết 2 hàm tìm Max , min của 3 số thực. Bài tập 4.8: Viết hàm PERFECT(n:Word):Boolean; để kiểm tra số nguyên n có phải là số hoàn thiện hay không? Bài tập 4.9: Viết thủ tục FILL(x1,y1,x2,y2:Integer; ch:Char); để tô một vùng màn hình hình chữ nhật có đỉnh trên bên trái là (x1,y1) và đỉnh dưới bên phải là (x2,y2) bằng các ký tự ch.
Bài tập 4.10: Viết hàm tìm BSCNN của 2 số nguyên a,b được khai báo như sau: Function BSCNN (a,b:word ):word ; 37 Giáo trình bài tập Pascal Bài tập 4.11: Viết thủ tục để tối giản phân số a/b , với a, b là 2 số nguyên. Bài tập 4.12: Viết các hàm đệ quy để tính:
S1 = 1+2 +3+......+n ;
S2 = 1+1/2 +.....+ 1/n ;
S3 = 1-1/2 +......+ (-1)n+1 1/n
S4 = 1 + sin(x) + sin2(x) +......+ sinn (x)
Bài tập 4.13: Viết hàm đệ quy để tính Ckn biết : Cnn =1 , C0n = 1 , Ckn = Ck-1n-1 + Ckn-1. Bài tập 4.14: Cho m , n nguyên dương . Lập hàm đệ quy tính: A(m,n) = > ∧ > − − = − = + 0 0 , )) 1 , ( , 1 ( 0 , ) 1 , 1 ( 0 , 1 n m n m A m A n m A m n Bài tập 4.15: Lập hàm đệ qui để tính dãy Fibonaci: F(n) = 1 1 2 1 2 2 , ( ) ( ) , n n F n F n n =∨ = − + − > Bài tập 4.16: Viết hàm đệ qui tìm USCLN của 2 số. Bài tập 4.17: Viết thủ tục để in ra màn hình số đảo ngược của một số nguyên cho trước theo 2 cách: đệ qui và không đệ qui. Bài tập 4.18: Viết chương trình in ra màn hình các hoán vị của n số nguyên đầu tiên. Bài tập 4.19: Xây dựng một Unit SOHOC.PAS chứa các thủ tục và hàm thực hiện các chức năng sau:
- Giải phương trình bặc nhất.
- Giải phương trình bặc hai.
- Tìm Max/Min của 2 số a,b.
- Tìm USCLN và BSCNN của 2 số nguyên a,b.
- Kiểm tra số nguyên dương n có phải là số nguyên tố hay không?
- Kiểm tra số nguyên dương n có phải là số hoàn thiện hay không?
- Đổi một số nguyên dương n sang dạng nhị phân.
- In ra màn hình bảng cữu chương từ 2→ 9.
Sau đó, tự viết các chương trình có sử dụng Unit SOHOC vừa được xây dựng ở trên. 38 Giáo trình bài tập Pascal Chương 5 DỮ LIỆU KIỂU MẢNG (ARRAY) I. KHAI BÁO MẢNG Cú pháp: TYPE = ARRAY [chỉ số] OF ; VAR :; hoặc khai báo trực tiếp: VAR : ARRAY [chỉ số] OF ; Ví dụ: TYPE Mangnguyen = Array[1..100] of Integer; Matrix = Array[1..10,1..10] of Integer; MangKytu = Array[Byte] of Char; VAR A: Mangnguyen; M: Matrix; C: MangKytu; hoặc: VAR A: Array[1..100] of Integer; C: Array[Byte] of Char; II. XUẤT NHẬP TRÊN DỮ LIỆU KIỂU MẢNG - Để truy cập đến phần tử thứ k trong mảng một chiều A, ta sử dụng cú pháp: A[k]. - Để truy cập đến phần tử (i,j) trong mảng hai chiều M, ta sử dụng cú pháp: M[i,j]. - Có thể sử dụng các thủ tục READ(LN)/WRITE(LN) đối với các phần tử của biến kiểu mảng. BÀI TẬP MẪU Bài tập 5.1: Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm N phần tử. Ý tưởng: - Cho số lớn nhất là số đầu tiên: Max:=a[1]. - Duyệt qua các phần tử a[i], với i chạy từ 2 tới N: Nếu a[i]>Max thì thay Max:=a[i]; Uses Crt; Type Mang = ARRAY[1..50] Of Integer; 39 Giáo trình bài tập Pascal Var A:Mang; N,i,Max:Integer; Begin
{Nhập mảng}
Write('Nhap N='); Readln(N);
For i:=1 To N Do Begin Write('A[',i,']='); Readln(A[i]); End;
{Tìm phần tử lớn nhất}
Max:=A[1];
For i:=2 To N Do
Bạn đang đọc truyện trên: Truyen2U.Pro