BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 1 BÀI TẬP CHƯƠNG 4: CẤU TRÚC DỮ LIỆU MẢNG
Bài 1 :
Giải hệ phương trình tuyến tính hai ẩn dng ma trận :
a
11
x + a
12
y = c
1
a
21
x + a
22
y = c
2
GIẢI
Uses Crt;
Var a: array[1 2, 1 2] of real;
c: array[1 2] of real;
d, dx, dy, x, y: real;
BEGIN
For i := 1 To 10 Do
For j := 2 To 9 Do a[i, j] := i*j ;
Writeln(' Bang cuu chuong : ') ; Writeln ;
For i := 1 To 10 Do
For j := 2 to 9 do Write ( j:4 , 'x' , i:2 , '=' , a[i , j]:2) ;
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 2
(* hết 80 cột tự động xuống hng *)
Readln ;
END .
Bài 3 :
Viết chương trình nhập hai số nguyn dương m , n . Sau đĩ tính trung bình cộng bình phương cc số
nguyn từ m đến n .
Var m , n , k , s : Word ;
tb : real ;
BEGIN
Writeln('Nhap 2 so nguyen duong m, n :') ;
Write (' m = ') ; Readln(m) ;
Write (' n = ') ; Readln(n);
If m > n Then (* đỗi chỗ để m <= n *)
Begin
k := m ; m := n ; n := k ;
End ;
s := 0 ;
For k := m To n do s := s + sqr(k) ;
tb := s / (n - m + 1) ;
Writeln ('Trung bàinh cong bàimh phuong cac so '
a
2
= 1
a
3
= 2
a
4
= 3
. . .
a
n
= a
n-1
+ a
n-2
Viết chương trình tính 20 số Fibonaci đầu tin v đưa ra kết quả vo một mảng 20 phần tử .
Var
a : Array[1 20] Of Byte ;
i : Byte ;
BEGIN
a[1] :=1;
a[2] :=1;
For i:=3 to 20 do a[i]:=a[i-1]+a[i-2] ;
END .
Bài 6 :
Dy số a
n
Bài 7 :
Nhập số tự nhin N v viết chương trình tạo mảng bao gồm N số nguyn tố đầu tin .
var
a:array[1 100,1 100]of byte;
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 4
n,i,j,k,l,ba:byte;
d:boolean;
BEGIN
write(' Nhap kich thuoc cua mang hai chieu NxN. N = ');readln(n);
for i:=1 to n do
for j:=1 to n do
begin
ba:=0;
repeat
d:=FALSE;
if j>1 then for k:=1 to j-1 do
if a[i,k]=ba then d:=true;
if i>1 then for k:=1 to i-1 do
if a[k,j]=ba then d:=true;
ba:=ba+1;
until not d;
a[i,j]:=ba-1;
end;
for i:=1 to n do
for j:=1 to n do write(a[i,j]:8);
readln;
Bài 9 :
a. a.
Viết chương trình nhập dữ liệu từ dy đối xứng vo mảng một chiều .
b. b.
Viết chương trình nhập dữ liệu l ma trận đối xứng vo mảng hai chiều .
a)
Var a: array [1 100] of integer;
n, i: byte;
Begin
Write('Nhap so phan tu cua day doi xung:');
Readln(n);
Writeln('Nhap cac phan tu cua day:');
For i:=1 to (n+1) div 2 do
Begin
Write('a[', i:2, ']='); Readln(a[i]);
a[n-i+1] := a[i];
End;
Readln ;
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 6
END ;
b)
Var a: array [1 100, 1 100] of integer;
n, i, j: integer;
BEGIN
S[i]:= Upcase(S[i]);
A[S[i]]:= A[S[i]]+1;
End;
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 7
End;
For ch:= 'A' to 'Z' do
Writeln('So lan xuat hien cua ',ch,' trong xau la: ', A[ch]:4) ;
Readln ;
END .
Bài 2 :
Cho số tự nhin n v xu cĩ độ di n . Hy bàiến đổi xu đ cho bằng cch thay đổi trong đĩ :
a. a.
Tất cả cc dấu ! bằng dấu chấm .
b. b.
Mỗi một nhĩm cc dấu chấm liền nhau bằng một dấu chấm .
c. c.
Một nhĩm cc dấu chấm đứng liền nhau bằng dấu ba chấm .
a )
Var S: string;
c )
Uses crt;
Var S: string;
i, j: byte;
BEGIN
Clrscr;
Write('Nhap xau S='); Readln(S);
i:=1;
While i<=Length(S) do
Begin
If S[i]='.' then
Begin
j:=i;
While (S[i]='.')and(i<=length(S)) do inc(i);
dec(i);
If (i-j)=1 then insert('.',S,i)
Else
If (i-j)>2 then
Begin
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 9
Delete(S,j+2,i-j-2); i:=j+1;
End;
End ;
Inc(i);
End;
Write('Chuoi sau khi bàien doi la: ',S);
1
, S
2
, … , S
n
. Bàiết rằng trong dy cĩ ít nhất một dấu phẩy . Hy tìm số
tự nhin i sao cho :
a. a.
S
i
l dấu phẩy đầu tin .
b. b.
S
i
l dấu phầy cuối cng .
a )
Var S: string;
i: integer;
BEGIN
Write('Cho mot xau S co dau ",": '); Readln(S);
i:= pos(',', S); (* vị trí của dấu ',' trong S *)
If i<> 0 then Write(' Vi tri thoa man la: ', i);
BÀI TẬP PASCAL CÓ LỜI GIẢI
Write(' Nhap xau St = '); Readln(St);
dx:= True;
i:=1;
len:= Length(St);
While dx and (i<=(len div 2)) do
Begin
dx:=(St[i] = St[len - i+1]);
inc(i);
End;
If dx then Write(' St la xau doi xung ')
Else Write(' St khong phai la xau doi xung ') ;
Readln;
END . Bài 6 :
Cho một xu kí tự S . Hy viết chương trình tính xem trong S cĩ bao nhiu loại kí tự khc nhau ( phn bàiệt
chữ in hoa với chữ in thường ) . Ví dụ với S l “Pascal” ta cĩ đp số l 5 .
Var S: string;
i, j, dem: integer;
t: boolean;
BEGIN
Write('Cho mot xau ki tu S: '); Readln(S);
dem:=0;
For i:=1 to length(S) do
Begin
t:=false;
For j:=1 to i-1 do if (S[j]=S[i]) then t:=true;
i,len: byte;
BEGIN
Clrscr;
Write('Ho ten='); Readln(Hoten);
Len:=length(Hoten);
If Hoten[1] in Chu then Hoten[1]:=Upcase(Hoten[1]);
For i:=2 to len do
If (Hoten[i-1]=#32)and(Hoten[i] in Chu) then
Hoten[i]:=Upcase(Hoten[i]);
Write('Ho ten sau khi dieu chinh la: ', Hoten);
Readln;
END .
Bài 9 :
Viết chương trình nhập xu kí tự từ bn phím , sau đĩ gọt xu lại bằng cch cch xố đi cc kí tự trống ở hai
đầu của xu . Ví dụ nếu nhập xu “ Ha noi “ , thì kết quả sẽ l “Ha Noi” .
ar S: String;
BEGIN
Write('Cho mot xau ky tu: '); Readln(S);
While S[1] = #32 do Delete(S,1,1);
While (S[length(S)] = #32) do Delete(S,length(S),1);
Write('Chuoi sau khi da bàien doi la: ', S);
Readln;
END .
BÀI TẬP CHƯƠNG 6: DỮ LIỆU KIỂU TẬP
For i:=0 to 99 do If i in S then Inc(n);
Card:=n;
End;
BEGIN
Nhap;
Clrscr;
Write('Tap S co ',Card(S),' phan tu.');
Readln;
END.
Bài 2 :
Bạn hy lập chương trình tạo một tập hợp cc số nguyn chẵn kiểu Byte v loại khỏi nĩ cc số chia hết cho 3
. Kết quả thể hiện trn mn hình .
Uses Crt;
Const n=5;
Type
Danhsach=record
holot: string[25];
ten: string[10];
tuoi: 0 99;
lop: string[3];
End ;
Var ds: array [1 20] of Danhsach;
i,j: byte;
f: file of Danhsach;
Procedure Doi(i,j: byte);
Var tg: Danhsach;
END.
Bài 3 :
Xt chương trình sau :
Program B4 ;
Var
Thoat : Set Of Char = [‘e’ , ’E’] ;
BEGIN
Write (‘ Hay go E de ket thuc : ‘) ;
Repeat
Ch := Readkey ;
Until Ch in thoat ;
END .
Hy tìm v sửa lỗi trong chương trình đĩ .
Uses Crt;
Const
thoat: set of char=['e','E'];
Var
Thoat
Lua chon cua ban : _
Sau đĩ đợi g phím . Chương trình phải đợi cho tới khi phím g vo l một trong cc chữ số 1 5 hoặc cc
chữ ci đầu của cc tuỳ chọn thì thơng bo phím g vo hợp lệ v kết thc chương trình . Trong chương trình
phải dng một tập hợp để kiểm tra việc nhập gi trị cho bàiến từ bn phím .
(* Hiển thị menu *)
Uses Crt;
Const
menu: set of char = ['1' '5','X','S','L','N','T'];
Var
ch: char;
BEGIN
Clrscr;
Writeln(' 1. Xem ');
Writeln(' 2. Sua chua ');
Writeln(' 3. Loai bo ');
Writeln(' 4. Nhap them');
Writeln(' 5. Thoat ');
Write('Lua chon cua ban: ');
Repeat
ch:=readkey; ch:=Upcase(ch);
Until ch in menu;
Writeln;
Write('Ban da chon:');
Case ch of
'1','X': Writeln(' 1. Xem ');
'2','S': Writeln(' 2. Sua chua ');
'3','L': Writeln(' 3. Loai bo ');
Readln;
END.
Bài 6 :
Hy lập chương trình nhập vo một xu kí tự từ bn phím . Yu cầu cc kí tự nhập vo phải l cc chữ ci thuộc
bảng chữ ci tiếng Anh , bỏ qua cc phím khc .
(* Nhập một xu tồn cc chữ ci *)
Uses Crt;
Const A:set of char=['a' 'z','A' 'Z'];
Var ch: char;
st: string;
BEGIN
Clrscr;
st:='';
Writeln('Nhap vao mot xau toan cac chu cai:');
Repeat
ch:=Readkey;
If ch in A then
begin
st:=st+ch; write(ch);
End
Else if ch<>#13 then Write(#7);
If ch=#0 then ch:=Readkey;
Until ch = #13;
END .
Bài 7 :
Viết chương trình cĩ chức năng thm phần tử vo tập hợp trực tiếp từ bn phím v loại bớt phần tử khỏi tập
If ch in tap then Write(ch,' ');
Readln;
END .
BÀI TẬP CHƯƠNG 7: KIỂU RECORD
Bài 1 :
Thơng tin về mỗi học sinh gồm :
Họ đệm : một xu 25 kí tự .
Tn : một xu 10 kí tự .
Tuổi : một số nguyn hai chữ số .
Lớp : một xu hai chữ số v một chữ ci viết hoa
Hy lập chương trình nhập từ bn phím danh sch một lớp 15 học sinh vo một mảng bản ghi . Sau đĩ hiển
thị danh sch ln mn hình , mỗi người một dịng .
(* Nhập danh sch học sinh từ bn phím *)
END.
Bài 2 :
Thơng tin về mỗi học sinh l một bản ghi gồm cc trường :
Họđệm : một xu 25 kí tự .
Tn : một xu 10 kí tự .
Tuổi : một số nguyn hai chữ số .
Lớp : một xu hai chữ số v một chữ ci viết hoa
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 17
Một file bản ghi chứa một danh sch một lớp gồm 20 học sinh . Hy lập chương trình hiển thị danh sch ln
mn hình , mỗi người một dịng .
(* Doc tu mot file ban ghi *)
Uses Crt;
Họtn : một xu 35 kí tự .
Tuổi : một số nguyn hai chữ số .
Khối : một số nguyn hai chữ số .
Lớp : một chữ ci viết hoa
(* Doi kieu ban ghi *)
Uses Crt;
Type Danhsach1=record
holot: string[25];
ten: string[10];
tuoi: 0 99;
lop: string[3];
End;
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 18
Danhsach2=record
ds2.lop:=UpCase(lop[3]);
Write(f2,ds2);
End;
End;
Close(f1); Close(f2);
Writeln;
Writeln('Bam Enter de ket thuc!');
Readln;
END . Bài 4 :
Một file bản ghi chứa một danh sch học sinh PTTH , thơng tin về mỗi học sinh ngồi cc trường Họđệm ,
Tn , Tuổi , Lớp giống như cc bài trn cịn cĩ thm trường Điểm chứa điểm trung bình của học sinh trong
năm học . Hy lập chương trình :
a. a.
Hiển thị ln mn hình danh sch những học sinh giỏi nhất của trường l những bạn cĩ điểm trung bình
từ 8.0 trở ln v cao nhất trong khối .
b. b.
Lập danh sch học sinh trong năm học mới , bàiết một học sinh cĩ điểm trung bình từ 5.0 trở ln thì
được ln lớp . Ch ý : lớp 10A ln lớp 11A , lớp 11A ln 12A Kết quả chứa trong file .
(* Khen thuong va len lop *)
Uses Crt;
Type Danhsach=record
Begin
max10:=0; max11:=0; max12:=0;
For i:=1 to n do With ds[i] do
Begin
l:=copy(lop,1,2);
If (l='10')and(diem>max10)and(diem>8.0) then max10:=diem
Else If (l='11')and(diem>max11)and(diem>8.0) then max11:=diem
Else If (l='12')and(diem>max12)and(diem>8.0) then max12:=diem;
End;
Writeln('Hoc sinh gioi nhat khoi 10 : ');
For i:=1 to n do With ds[i] do
If (copy(lop,1,2)='10')and(diem>=max10) then
Writeln(holot:20,ten:10,tuoi:4,lop:5,diem:5:1);
Writeln('Hoc sinh gioi nhat khoi 11 : ');
For i:=1 to n do With ds[i] do
If (copy(lop,1,2)='11')and(diem>=max11) then
Writeln(holot:20,ten:10,tuoi:4,lop:5,diem:5:1);
Writeln('Hoc sinh gioi nhat khoi 12 : ');
For i:=1 to n do With ds[i] do
If (copy(lop,1,2)='12')and(diem>=max12) then
Writeln(holot:20,ten:10,tuoi:4,lop:5,diem:5:1);
End;
Procedure Lenlop;
Var i: integer;
l: string;
f: file of Danhsach;
Begin
For i:=1 to n do With ds[i] do
Begin
Tn sch : một xu 40 kí tự .
Năm xuất bản : một số nguyn 4 chữ số .
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 21
Hăy lập chương trình nhập dữ liệu vo kho sch , sau đĩ tìm ra :
Những cuốn sch của một tc giả cho trước xuất bản vo một năm cho trước .
Những cuốn sch cĩ tn cho trước .
Kết quả hiện trn mn hình.
(* Tim kiem tren ban ghi *)
Uses Crt;
Type Danhsach=record
Tacgia: string[26];
Tensach: string[40];
NamXB: integer;
End;
Var ds: array [1 100] of Danhsach;
n : integer;
f : file of Danhsach;
M: Danhsach;
i:=1;
While (i<=n)and(ds[i].tensach<>ten) do i:=i+1;
If (i>n) then Writeln('Khong tim duoc')
Else Writeln(ds[i].tacgia:28,ds[i].tensach:42,ds[i].namXB:6);
End;
Procedure Timkiem;
Var c:char;
Begin
Writeln('1. Tim kiem theo tac gia va nam xuat ban.');
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 22
Writeln('2. Tim kiem theo ten sach');
Writeln;
Write('Ban chon [1/2] : ');
Repeat
c:=Readkey;
Until pos(c,'12')>0;
Writeln(c);
If c='1' then TheoTG Else TheoTS;
End;
BEGIN
ClrScr;
Nhap;
Timkiem;
Write('Ban Enter de ket thuc ');
Readln;
Procedure Nhap;
Begin
n:=0;
Assign(f,'bai6.dat'); Reset(f);
While not Eof(f) do
Begin
Inc(n); Read(f,ds[n]);
End;
Close(f);
End;
Procedure Tinh_ngay_nghi;
Var i: integer;
Begin
snn:=0;
snnq1:=0; tsq1:=0;
snnq2:=0; tsq2:=0;
snnq3:=0; tsq3:=0;
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 23
snnq4:=0; tsq4:=0;
For i:=1 to n do With ds[i] do
Begin
Inc(snn,songay);
If (thang<3) then
Begin
Inc(snnq1,songay); Inc(tsq1);
End
End;
BEGIN
Clrscr;
Nhap;
Tinh_ngay_nghi;
Inkq;
Write('Ban Enter de ket thuc ');
Readln;
END.
BÀI TẬP CHƯƠNG 8: KIỂU FILE
Bài 1 :
Hy lập chương trình tạo một tệp số nguyn chứa cc số nguyn tố nhỏ hơn 10000 theo thứ tự tăng dần .
(* Tạo file số nguyn tố nhỏ hơn 10000 *)
Uses Crt;
Const N=10000;
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 24
Var i , j : Integer;
f: File of Integer;
a: Array[2 N] of boolean;
BEGIN
For i:=2 to N do a[i]:=true;
i:=2;
Readln(S);
End;
Close(f);
End;
Procedure Doc;
Var f: file of String10; S: String10;
Begin
Clrscr;
Assign(f,INP); Reset(f);
While Not Eof(f) Do
Begin
Read(f,S);
Writeln(S);
If WhereY=25 then
Begin
Write('Press Enter to continue ');
Readln; Clrscr;
End;
End;
BÀI TẬP PASCAL CÓ LỜI GIẢI
Học Lê Trung (0168 995 4843) 25
Close(f);
Readln;
End;
BEGIN
Ghi;
Uses Crt;
Const fi='vanban.txt';
Var f: text;
s: string;
ch: char;
Procedure docfile ( fi : String );
Var f : text ;
Begin
Assign(f,fi); Reset(f);
while not eof(f) do
Begin
Read(f,ch);
Write(ch);
End;
close(f) ;
writeln ;
End ;
BEGIN
Writeln(' Van ban ban dau doc tu file "vanban.txt" :') ;
docfile(fi) ;