Bài tập Pascal Free Pascal 01 đến 16 Có bài giải (từ đơn giản đến nâng cao) BY Nguyễn Anh Việt
https://app.box.com/s/mtg0fzik6bet3tes96tu4bmt8wsxaahw
https://app.box.com/s/mtg0fzik6bet3tes96tu4bmt8wsxaahw
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
B À I T Ậ P P A S C A L T Ừ Đ Ơ N
G I Ả N Đ Ế N N Â N G C A O
vectorstock.com/10212105
Ths Nguyễn Thanh Tú
eBook Collection
DẠY KÈM QUY NHƠN OLYMPIAD
PHÁT TRIỂN NỘI DUNG
Bài tập Pascal Free Pascal 01 đến 16 Có bài
giải (từ đơn giản đến nâng cao) BY
Nguyễn Anh Việt
WORD VERSION | 2021 EDITION
ORDER NOW / CHUYỂN GIAO QUA EMAIL
TAILIEUCHUANTHAMKHAO@GMAIL.COM
Tài liệu chuẩn tham khảo
Phát triển kênh bởi
Ths Nguyễn Thanh Tú
Đơn vị tài trợ / phát hành / chia sẻ học thuật :
Nguyen Thanh Tu Group
Hỗ trợ trực tuyến
Fb www.facebook.com/DayKemQuyNhon
Mobi/Zalo 0905779594
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 1.01 – Xin chào
(Các lệnh WriteLn và ReadLn)
Bạn hãy nhập họ tên của một người và in ra màn hình câu chúc mừng người đó.
Var
HoTen: String;
Begin
WriteLn('Hay nhap ho va ten');
ReadLn(HoTen);
WriteLn('Xin chuc mung ban ', HoTen);
ReadLn;
End.
Để xoá màn hình kết quả của các lần chạy chương trình trước đó (bấm Ctrl-F9), ta cần đưa thêm lệnh
xoá màn hình ClrScr và dùng thư viện Crt chứa lệnh này
Uses Crt;
Var
HoTen: String;
Begin
ClrScr;
WriteLn('Hay nhap ho va ten');
ReadLn(HoTen);
WriteLn('Xin chuc mung ban ', HoTen);
ReadLn;
End.
Bài 1.02 – Các phép toán
(Lệnh If điều_kiện then thực_hiện_lệnh)
Bạn hãy nhập vào hai số nguyên (Integer) và một phép toán (Char) rồi in ra màn hình kết quả của phép
toán.
Uses Crt;
Var
a, b: Integer;
pt: Char;
Begin
ClrScr;
WriteLn('Hay nhap so thu nhat');
ReadLn(a);
Biên soạn: Th.s Nguyễn Anh Việt Trang 1
Bài tập Pascal – Từ cơ bản đến nâng cao
WriteLn('Hay nhap so thu hai');
ReadLn(b);
WriteLn('Hay nhap phep toan (+ – * /)');
ReadLn(pt);
If pt = '+' then
WriteLn(a, pt, b, ' = ', a+b) {Chú ý: Trước Else phải bỏ dấu ;}
Else If pt = '-' then
WriteLn(a, pt, b, ' = ', a-b)
Else If pt = '*' then
WriteLn(a, pt, b, ' = ', a*b)
Else If pt = '/' then
WriteLn(a, pt, b, ' = ', a/b :5:2); {In kết quả có dạng xxxxx.xx}
ReadLn;
End.
Bài 1.03 – Tính Luỹ thừa
(Vòng lệnh For Tên_biến := 1 to n do thực_hiện_lệnh)
Bạn hãy nhập vào cơ số a và số mũ n (Integer) rồi in ra màn hình kết quả của phép toán a n .
Uses Crt;
Var
a, n, i: Integer; {Số nguyên nhỏ}
lt: LongInt; {Số nguyên lớn}
Begin
ClrScr;
WriteLn('Hay nhap co so');
ReadLn(a);
WriteLn('Hay nhap so mu');
ReadLn(n);
lt := 1;
For i:=1 to n do
lt := lt * a;
WriteLn(a, ' luy thua ', n, ' = ', lt);
ReadLn;
End.
Bài 1.04 – Tính Giai thừa
(TD : 5! = 1 . 2 . 3 . 4 . 5 = 120)
Bạn hãy nhập vào số n (Integer) rồi in ra màn hình kết quả của phép toán giai thừa n!
Biên soạn: Th.s Nguyễn Anh Việt Trang 2
Uses Crt;
Var
n, i: Integer;
gt: LongInt;
Begin
ClrScr;
WriteLn('Hay nhap so n');
ReadLn(n);
gt := 1;
For i := 2 to n do
gt := gt * i;
WriteLn(n, ' giai thua = ', gt);
ReadLn;
End.
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 1.05 – Tính Tổng Sn từ 1 đến n
(TD : S5 = 1+2+ 3+ 4+ 5 = 15)
Bạn hãy nhập vào số n (Integer) rồi in ra màn hình kết quả của phép toán Cộng từ 1 đến n
Bài 1.06 – Tính Tổng Cn từ 1 đến n
(TD : C5 =2+ 4 = 6)
Bạn hãy nhập vào số n (Integer) rồi in ra màn hình kết quả của phép toán Cộng các số chẵn từ 1 đến n
Chú ý: a là số chẵn nếu a mod 2 = 0, trong đó mod là phép toán chia lấy số dư. TD: 5 mod 3=2
Bài 1.07 – Tính Tổng Ln từ 1 đến n
(TD : L5 =1+ 3+5 = 9)
Bạn hãy nhập vào số n (Integer) rồi in ra màn hình kết quả của phép toán Cộng các số lẻ từ 1 đến n
Chú ý: a là số lẻ nếu a mod 2 = 1
Biên soạn: Th.s Nguyễn Anh Việt Trang 3
Bài tập Pascal – Từ cơ bản đến nâng cao
Function là hàm do người lập trình tự tạo để thực hiện một chức năng nào đó, TD:
Function GiaiThua(k: Integer): LongInt;
là hàm dùng để tính giai thừa của một số k và trả về giá trị giai thừa của K
Function GiaiThua(k: Integer): LongInt;
Var
GTGT: LongInt;
Begin
GTGT := 1;
For i := 1 to k do
GTGT := GTGT * i;
GiaiThua := GTGT;
End;
Bài 2.01 – In ra giá trị giai thừa của mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và tính giai thừa của từng số trong dãy đó.
(Dãy 1, 4, 7, 5, 2 => In ra 1, 24, 5040, 120, 2)
Var
A: Array [1..10] of Integer;
i, n: Integer;
Function GiaiThua(k: Integer): LongInt;
Var
GTGT: LongInt;
Begin
GTGT := 1;
For i := 1 to k do
GTGT := GTGT * i;
GiaiThua := GTGT;
End;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i := 1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
Biên soạn: Th.s Nguyễn Anh Việt Trang 4
{In ra giá trị giai thừa}
For i := 1 to n do
Write(GiaiThua(A[i]):6);
ReadLn;
End.
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 2.02 – In ra giá trị luỹ thừa 2 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và tính luỹ thừa 2 của từng số trong dãy đó.
(Dãy 1, 4, 7, 5, 2 => In ra 1, 16, 49, 25, 4)
Var
A: Array [1..10] of Integer;
i, n: Integer;
Function LuyThua(a, k: Integer): LongInt;
Var
GTLT: LongInt;
Begin
GTLT := 1;
For i := 1 to k do
GTLT := GTLT * a;
LuyThua := GTLT;
End;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i := 1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{In ra giá trị luỹ thừa 2}
For i := 1 to n do
Write(LuyThua(A[i], 2):6);
ReadLn;
End.
Procedure cũng tương tự như Function, có thể có đối số, nhưng không giá trị trả về. TD:
Procedure NhanDoiMang;
Biên soạn: Th.s Nguyễn Anh Việt Trang 5
Procedure NhanDoiMang;
Begin
For i := 1 to n do
A[i] := A[i] * 2;
End;
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 2.03 – In ra giá trị nhân đôi của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và nhân đôi từng số trong dãy đó.
(Dãy 1, 4, 7, 5, 2 => In ra 2, 8, 14, 10, 4)
Var
A: Array [1..10] of Integer;
i, n: Integer;
Procedure NhanDoiMang;
Begin
For i := 1 to n do
A[i] := A[i] * 2;
End;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i := 1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{Nhân đôi các phần tử của mảng}
NhanDoiMang;
{In dãy số}
For i := 1 to n do
Write(A[i]:4);
End;
WriteLn;
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 6
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 2.04 – In ra giá trị nhân 4 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và nhân 4 từng số trong dãy đó. Chỉ được sử dụng Procedure
NhanDoiMang như trong Bài 03.
(Dãy 1, 4, 7, 5, 2 => In ra 4, 16, 28, 20, 8)
Bài 2.05 – In ra số nguyên tố trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và in ra các số nguyên tố trong dãy đó. Số nguyên tố là các số chỉ chia
hết cho 1 và chính nó như 2, 3, 5, 7, 11, 13, …
(Dãy 1, 4, 7, 5, 23 => In ra 7, 5, 23)
Var
A: Array [1..10] of Integer;
i, n, Dem: Integer;
Function NguyenTo(k: Integer): Boolean; {Boolean: Chỉ có True và False}
Var
j: Integer;
Begin
If (k <= 0) or (k = 1) then begin NguyenTo := False; Exit; End;
For j := 2 to Trunc(Sqrt(k)) do
If k mod j = 0 then begin NguyenTo:= False; Exit; End;
NguyenTo := True;
End;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i := 1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{In ra các số nguyên tố }
For i := 1 to n do
If NguyenTo(A[i]) then Begin Write(A[i]:3); Dem := Dem + 1; End;
If Dem = 0 then WriteLn('Khong co so nguyen to nao');
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 7
Bài tập Pascal – Từ cơ bản đến nâng cao
Đệ quy là các Function hay Procedure gọi lại chính nó trong bản thân của hàm hay thủ tục, TD:
Function GiaiThua(k: Integer): LongInt;
là hàm đệ quy dùng để tính giai thừa của một số k và trả về giá trị giai thừa của K
Function GiaiThua(k: Integer): LongInt;
Begin
If k = 1 then GiaiThua := 1
Else GiaiThua := GiaiThua(k-1) * k;
End;
Bài 3.01 – In ra giá trị giai thừa của mảng 1 chiều bằng đệ quy
Bạn hãy nhập một dãy số nguyên và tính giai thừa của từng số trong dãy đó.
(Dãy 1, 4, 7, 5, 2 => In ra 1, 24, 5040, 120, 2)
Var
A: Array [1..10] of Integer;
i, n: Integer;
Function GiaiThua(k: Integer): LongInt;
Begin
If k = 1 then GiaiThua := 1
Else GiaiThua := GiaiThua(k-1) * k;
End;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i := 1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{In ra giá trị giai thừa}
For i := 1 to n do
Write(GiaiThua(A[i]):6);
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 8
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 3.02 – In ra giá trị luỹ thừa 2 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và tính luỹ thừa 2 bằng đệ quy của từng số trong dãy đó.
(Dãy 1, 4, 7, 5, 2 => In ra 1, 16, 49, 25, 4)
Var
A: Array [1..10] of Integer;
i, n: Integer;
Function LuyThua(a, k: Integer): LongInt;
Begin
If k = 1 then LuyThua := a
Else LuyThua := LuyThua(a, k-1) * a;
End;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i := 1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{In ra giá trị luỹ thừa 2}
For i := 1 to n do
Write(LuyThua(2, A[i]):6);
ReadLn;
End.
Procedure cũng tương tự như Function, có thể có đối số nhưng không có giá trị trả về. TD:
Procedure NhanMang(k: Integer);
Procedure NhanMang(k: Integer);
Begin
For i := 1 to n do
A[i] := A[i] * k;
End;
Bài 3.03 – In ra giá trị nhân 3 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và nhân đôi từng số trong dãy đó.
(Dãy 1, 4, 7, 5, 2 => In ra 3, 12, 21, 15, 6)
Biên soạn: Th.s Nguyễn Anh Việt Trang 9
Bài tập Pascal – Từ cơ bản đến nâng cao
Var
A: Array [1..10] of Integer;
i, n: Integer;
Procedure NhanMang(k: Integer);
Begin
For i := 1 to n do
A[i] := A[i] * k;
End;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i := 1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{Nhân 3 các phần tử của mảng}
NhanMang(3);
{In dãy số}
For i := 1 to n do
Write(A[i]:4);
End;
WriteLn;
ReadLn;
End.
Bài 3.04 – In ra giá trị nhân 7 của các phần tử trong mảng 1 chiều
Bạn hãy nhập một dãy số nguyên và nhân 7 từng số trong dãy đó.
(Dãy 1, 4, 7, 5, 2 => In ra 7, 28, 49, 35, 14)
Bài 3.05 – In ra số siêu nguyên tố có 4 chữ số
Bạn hãy tìm các số siêu nguyên tố có 4 chữ số. Số siêu nguyên tố là các số nguyên tố và khi bỏ đi các
chữ số bên phải thì nó cũng là số nguyên tố như 3137 (3137, 313, 31, 3 đều là số nguyên tố)
(In ra 2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797 5939 7193 7331 7333 7393)
Biên soạn: Th.s Nguyễn Anh Việt Trang 10
Var
A: Array [1..10] of Integer;
i, n, Dem: Integer;
Bài tập Pascal – Từ cơ bản đến nâng cao
Function NguyenTo(k: Integer): Boolean; {Boolean: Chỉ có True và False}
Var
j: Integer;
Begin
If (k <= 0) or (k = 1) then begin NguyenTo := False; Exit; End;
For j := 2 to Trunc(Sqrt(k)) do
If k mod j = 0 then begin NguyenTo:= False; Exit; End;
NguyenTo := True;
End;
Function SieuNguyenTo(k: Integer): Boolean;
Begin
SieuNguyenTo: = True;
While k > 0 do begin
If not NguyenTo(k) then begin
SieuNguyenTo:= False;
Exit;
End;
k := k div 10;
End;
End;
Begin
{In ra các số Siêu nguyên tố có 4 chữ số}
For i := 1000 to 9999 do
If SieuNguyenTo(i) then Begin Write(i:5); Dem := Dem + 1; End;
If Dem = 0 then WriteLn('Khong co Sieu so nguyen to nao');
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 11
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 4.01 – Mảng 1 chiều
(Mảng A: Array [1..10] of Integer là dãy chứa 10 Số nguyên từ A[1] đến A[10] )
Bạn hãy nhập một dãy số nguyên và tính Tổng các số trong dãy đó.
Var
A: Array [1..10] of Integer;
I, n, Tong: Integer;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{Tính tổng dãy số}
Tong := 0;
For i:=1 to n do
Tong := Tong + A[i];
{In ra Tổng dãy số}
WriteLn('Tong cua day so la ', Tong);
ReadLn;
End.
Bài 4.02 – Max : Số lớn nhất của dãy số
(Dãy 1, 4, 7, 5, 2 có Số lớn nhất là 7, nằm ở vị trí 3)
Bạn hãy nhập một dãy số nguyên và tìm Số lớn nhất cùng với vị trí của nó trong dãy đó.
Var
A: Array [1..10] of Integer;
i, n, ViTri, Max: Integer;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
{Nhập dãy số}
For i:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{Tìm số lớn nhất và vị trí}
Max := A[1];
Biên soạn: Th.s Nguyễn Anh Việt Trang 12
Bài tập Pascal – Từ cơ bản đến nâng cao
ViTri := 1;
For i:=2 to n do
If Max < A[i] then begin
Max := A[i];
ViTri := i;
End;
{In ra Số lớn nhất và vị trí}
WriteLn('So lon nhat cua day so la ', Max, ', tai vi tri ', ViTri);
ReadLn;
End.
Bài 4.03 – Min : Số nhỏ nhất của dãy số
(Dãy 1, 4, 7, 5, 2 có Số nhỏ nhất là 1, nằm ở vị trí 1)
Bạn hãy nhập một dãy số nguyên và tìm Số nhỏ nhất cùng với vị trí của nó trong dãy đó.
Bài 4.04 – Max chẵn: Số chẵn lớn nhất của dãy số
(Dãy 1, 4, 7, 5, 2 có Số chẵn lớn nhất là 4, nằm ở vị trí 2)
Bạn hãy nhập một dãy số nguyên và tìm Số chẵn lớn nhất cùng với vị trí của nó trong dãy đó.
Bài 4.05 – Max lẻ: Số lẻ lớn nhất của dãy số
(Dãy 1, 4, 7, 5, 2 có Số lẻ lớn nhất là 7, nằm ở vị trí 3)
Bạn hãy nhập một dãy số nguyên và tìm Số lẻ lớn nhất cùng với vị trí của nó trong dãy đó.
Bài 4.06 – Tổng các số chẵn
(Dãy 1, 4, 7, 5, 2 có tổng các số chẵn là 6)
Bạn hãy nhập một dãy số nguyên và tìm Tổng các số chẵn trong dãy đó.
Bài 4.07 – Tìm các số chính phương (là bình phương của một số)
(Dãy 1, 4, 7, 5, 9 có các số chính phương là 1, 4, 9)
Bạn hãy nhập một dãy số nguyên và in ra các số chính phương trong dãy đó.
Chú ý: Số k là số chính phương khi TRUNC(SQRT(k)) = SQRT(k)
Trunc là hàm dùng để cắt bỏ số lẻ, TD: Trunc(3.1) = 3
Sqrt là hàm lấy căn bậc 2, TD: Sqrt(4) = 2
Var
A: Array [1..10] of Integer;
i, n, Dem: Integer;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
Biên soạn: Th.s Nguyễn Anh Việt Trang 13
Bài tập Pascal – Từ cơ bản đến nâng cao
{Nhập dãy số}
For i:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{Tìm số chính phương}
For i:=1 to n do
If TRUNC(SQRT(A[i])) = SQRT(A[i]) then begin
WriteLn(A[i], ' la so chinh phuong');
Dem := Dem+1;
End;
ReadLn;
If Dem = 0 then
WriteLn('Khong co so chinh phuong nao trong day');
End.
Bài 4.08 – Tìm các số chính phương chẵn
(Dãy 1, 4, 7, 16, 9 có các số chính phương chẵn là 4, 16)
Bạn hãy nhập một dãy số nguyên và in ra các số chính phương chẵn trong dãy đó.
Biên soạn: Th.s Nguyễn Anh Việt Trang 14
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 5.01 – Mảng 2 chiều
(Mảng 2 chiều A: Array [1..10, 1..10] of Integer là mảng chứa tối đa 10 dòng, mỗi dòng có tối đa 10 số
nguyên từ A[1,1] đến A[10,10] )
Bạn hãy nhập một mảng số nguyên và tính Tổng các số trong mảng đó.
Var
A: Array [1..10] of Integer;
i, j, m, n, Tong: Integer;
Begin
WriteLn('Hay nhap so dong cua mang');
ReadLn(m);
WriteLn('Hay nhap so cot cua mang');
ReadLn(n);
{Nhập mảng 2 chiều}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
ReadLn(A[i, j]);
End;
{In ra mảng 2 chiều}
For i:=1 to m do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
{Tính tổng các phần tử của mảng}
Tong := 0;
For i:=1 to n do
For j:=1 to m do
Tong := Tong + A[I, j];
{In ra Tổng các số trong mảng}
WriteLn('Tong cac so cua mang la ', Tong);
ReadLn;
End.
Bài 5.02 – Max : Số lớn nhất của mảng
(Mảng 1 4 7
5 2 9
8 1 3
có Số lớn nhất là 9, nằm ở vị trí dòng 2 cột 3)
Bạn hãy nhập một mảng số nguyên và tìm Số lớn nhất cùng với vị trí của nó trong mảng đó.
Biên soạn: Th.s Nguyễn Anh Việt Trang 15
Bài tập Pascal – Từ cơ bản đến nâng cao
Var
A: Array [1..10] of Integer;
i, j, m, n, Max, VT_dong, VT_cot: Integer;
Begin
WriteLn('Hay nhap so dong cua mang');
ReadLn(m);
WriteLn('Hay nhap so cot cua mang');
ReadLn(n);
{Nhập mảng 2 chiều}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
ReadLn(A[i, j]);
End;
{In ra mảng 2 chiều}
For i:=1 to m do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
{Tìm Số lớn nhất của mảng}
Max := A[1,1];
For i:=1 to n do
For j:=1 to m do
If Max < A[i,j] then begin
Max := A[i,j];
VT_dong := i;
VT_cot := j;
End;
{In ra Số lớn nhất và vị trí}
WriteLn('So lon nhat = ', Max, ', o dong ', VT_dong, ' cot ', vt_cot);
ReadLn;
End.
Bài 5.03 – Max : Số lớn nhất trong mỗi dòng của mảng
(Mảng 1 4 7
5 2 9
8 1 3
có các Số lớn nhất dòng 7, 9 và 8)
Bạn hãy nhập một mảng số nguyên và tìm Số lớn nhất cùng với vị trí của nó trong mảng đó.
Biên soạn: Th.s Nguyễn Anh Việt Trang 16
Bài tập Pascal – Từ cơ bản đến nâng cao
Var
A: Array [1..10] of Integer;
i, j, m, n, Max, VT_dong, VT_cot: Integer;
Begin
WriteLn('Hay nhap so dong cua mang');
ReadLn(m);
WriteLn('Hay nhap so cot cua mang');
ReadLn(n);
{Nhập mảng 2 chiều}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
ReadLn(A[i, j]);
End;
{In ra mảng 2 chiều}
For i:=1 to m do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
{Tìm Số lớn nhất từng dòng của mảng}
For i:=1 to n do begin
Max := A[i,1];
For j:=1 to m do
If Max < A[i,j] then begin
Max := A[i,j];
VT_dong := i;
VT_cot := j;
End;
WriteLn('So lon nhat = ', Max, ', o dong ', VT_dong, ' cot ', vt_cot);
End;
ReadLn;
End.
Bài 5.04 – Đường chéo chính của Ma trận vuông
(Mảng 1 4 7
5 2 9
8 1 3
có các số trên đường chéo chính là 1, 2 và 3)
Bạn hãy nhập một ma trận vuông và tìm các số trên đường chéo chính.
Var
A: Array [1..10] of Integer;
i, j, m, n: Integer;
Biên soạn: Th.s Nguyễn Anh Việt Trang 17
Bài tập Pascal – Từ cơ bản đến nâng cao
Begin
WriteLn('Hay nhap so dong, cot cua ma tran vuong');
ReadLn(n);
{Nhập ma trận vuông}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
ReadLn(A[i, j]);
End;
{In ra ma trận vuông}
For i:=1 to n do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
{Tìm các số trên đường chéo chính}
WriteLn('Cac so tren duong cheo chinh la:');
For i:=1 to n do
For j:=1 to n do
If i = j then
Write(A[i,j]:3);
WriteLn;
ReadLn;
End.
Bài 5.05 – Đường chéo phụ của Ma trận vuông
(Mảng 1 4 7
5 2 9
8 1 3
có các số trên đường chéo phụ là 7, 2 và 8)
Bạn hãy nhập một ma trận vuông và tìm các số trên đường chéo phụ.
Var
A: Array [1..10] of Integer;
i, j, m, n: Integer;
Begin
WriteLn('Hay nhap so dong, cot cua ma tran vuong');
ReadLn(n);
{Nhập ma trận vuông}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
Biên soạn: Th.s Nguyễn Anh Việt Trang 18
Bài tập Pascal – Từ cơ bản đến nâng cao
ReadLn(A[i, j]);
End;
{In ra ma trận vuông}
For i:=1 to n do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
{Tìm các số trên đường chéo phụ}
WriteLn('Cac so tren duong cheo phu la:');
For i:=1 to n do
For j:=1 to n do
If i+j = n+1 then
Write(A[i,j]:3);
WriteLn;
ReadLn;
End.
Bài 5.06 – Số lớn nhất trên đường chéo phụ của ma trận vuông
(Mảng 1 4 7
5 2 9
8 1 3
có số lớn nhất trên đường chéo phụ là 8)
Bạn hãy nhập một ma trận vuông và tìm số lớn nhất trên đường chéo phụ.
Bài 5.07 – Số nhỏ nhất trên đường chéo chính của ma trận vuông
(Mảng 2 4 7
5 1 9
8 1 3
có số nhỏ nhất trên đường chéo chính là 1)
Bạn hãy nhập một ma trận vuông và tìm số nhỏ nhất trên đường chéo chính.
Bài 5.08 – Tìm Số lớn nhất trên mỗi dòng của ma trận vuông và đổi vị trí ra đầu dòng
(Mảng 2 4 7 7 4 2
5 1 9 => 9 1 5
8 1 3 8 1 3
)
Bạn hãy nhập một ma trận vuông và đổi các số lớn nhất ra đầu dòng.
Biên soạn: Th.s Nguyễn Anh Việt Trang 19
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 6.01 – String (Chuổi)
(Ch: String là mảng ngầm chứa các Ký tự, TD: Ch=’abc’ thì Ch[1]=’a’, Ch[2]=’b’, Ch[3]=’c’ )
Bạn hãy nhập một chuổi và in ra chuổi đảo ngược của chuổi đó. TD: 'abcd' => 'dcba'
Var
Ch: String;
i: Integer;
Begin
WriteLn('Hay nhap chuoi');
ReadLn(Ch);
{In chuổi đã nhập}
WriteLn('Chuoi da nhap la:');
For i:=1 to Length(Ch) do Write(Ch[i]); {Length('abc') = 3}
WriteLn;
{In chuổi đảo ngược}
WriteLn('Chuoi dao nguoc la:');
For i:= Length(Ch) downto 1 do Write(Ch[i]);
WriteLn;
ReadLn;
End.
Bài 6.02 – Đếm số từ của Chuổi
(Chuổi Nguyen Van An có 3 từ)
Bạn hãy nhập một Chuổi và đếm số từ trong chuổi đó.
Var
Ch: String;
i: Integer;
Begin
WriteLn('Hay nhap chuoi');
ReadLn(Ch);
{In chuổi đã nhập}
WriteLn('Chuoi da nhap la ', Ch);
{Đếm số từ trong chuổi = Số ký tự trống '_' + 1}
For i:= 1 to Length(Ch) do
If Ch[i] = ' ' then Inc(SoTu); {Inc: Ham tang gia tri của bien len 1}
WriteLn('So tu trong chuoi la ', SoTu + 1);
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 20
Bài tập Pascal – Từ cơ bản đến nâng cao
Nhưng nếu nhập vào các chuổi sai như _Nguyen_Van_An, Nguyen_Van_An_ hay Nguyen_ _Van_An
thì chương trình sẽ chạy sai. Chương trình đúng xử lý được các trường hợp nhập sai như trên là:
Var
Ch: String;
i, BD, SoTu: Integer;
Begin
WriteLn('Hay nhap chuoi');
ReadLn(Ch);
{In chuổi đã nhập}
WriteLn('Chuoi da nhap la ', Ch);
{Tìm vị trí ký tự hợp lệ đầu tiên ở đầu chuổi, TD: '_ _abc' => BD = 3}
BD := 1;
While Ch[BD] = ' ' do Inc(BD);
{Đếm số từ trống trong chuổi từ vị trí bắt đầu BD}
For i:= BD to Length(Ch) do begin
If (Ch[i]= ' ') and (Ch[i+1]= ' ') then Continue;
If (Ch[i] = ' ') and (i < Length(Ch)) then Inc(SoTu);
End;
WriteLn('So tu trong chuoi la ', SoTu + 1);
ReadLn;
End.
Bài 6.03 – Chuổi đối xứng
(Các chuổi abccba hay abcba đều là chuổi đối xứng)
Bạn hãy nhập một chuổi và kiềm tra xem chuổi đó có đối xứng hay không.
TD: abcba => Chuoi doi xung, abcbd => Chuoi khong doi xung
Var
Ch: String;
i: Integer;
DoiXung: Boolean;
Begin
WriteLn('Hay nhap chuoi');
ReadLn(Ch);
{Xác định chuổi đối xứng hay không}
DoiXung := True;
For i:=1 to Length(Ch) div 2 do {Số lần so sánh=độ dài chuổi/2 bỏ số lẻ}
If Ch[i] <> Ch[n+1-i] then begin DoiXung := False; Break; End;
If DoiXung = True then
WriteLn('Chuoi ', Ch, ' doi xung') Else WriteLn('Chuoi ', Ch, ' khong
doi xung');
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 21
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 6.04 – Chuổi chữ thường abc thành chuổi chữ in hoa ABC
Víết chương trình nhập một chuổi chữ thường, in thành chuổi chữ in hoa.
Chú ý:
- Dùng hàm Ord() để lấy thứ tự của ký tự (Ord(‘a’) = 97, Ord(‘b’) = 98, …)
- Trừ cho 32 để biến thành chữ in hoa (97 – 32 = 65 => A, 98 – 32 = 66 => B, …)
- Dùng hàm Chr() để trả về ký tự (Chr(65)= ‘A’, Chr(66) = ‘B’, …)
Var
Ch: String;
i: Integer;
Begin
WriteLn('Hay nhap chuoi');
ReadLn(Ch);
{In ra chuổi chữ in hoa}
For i:=1 to Length(Ch) do
Ch[i] = Chr(Ord(Ch[i]) – 32);
WriteLn('Chuoi doi thanh chu in hoa la ', Ch);
ReadLn;
End.
Bài 6.05 – Chuổi chữ in hoa ABC thành chữ thường abc
Víết chương trình nhập một chuổi chữ in hoa, in thành chuổi chữ thường.
Chú ý:
- Dùng hàm Ord() để lấy thứ tự của ký tự (Ord(‘A’) = 65, Ord(‘B’) = 66, …)
- Cộng với 32 để biến thành chữ thường (65 + 32 = 97 => a, 66 + 32 = 98 => b, …)
- Dùng hàm Chr() để trả về ký tự (Chr(97)= ‘a’, Chr(98) = ‘b’, …)
Bài 6.06 – Chuổi chữ thường abc thành chữ in hoa đảo ngược CBA
Víết chương trình nhập một chuổi chữ thường, TD : Nhập chuổi 'abcd', in thành chuổi chữ hoa đảo ngược
'DCBA'.
Bài 6.07 – Số lần xuất hiện của Ký tự trong chuổi (ký tự T xuất hiện 5 lần trong chuổi Trường
PTTH chuyên Lý Tự Trọng)
Viết chương trình đếm số lần xuất hiện của một ký tự trong chuổi, TD : Nhập ký tự 'T' và chuổi 'Truong
PTTH chuyen Ly Tu Trong' sẽ in ra 'Ky tu T xuat hien trong chuoi Truong PTTH chuyen Ly Tu Trong
5 lan'.
Var
Ch: String; KT: Char;
I, Dem: Integer;
Begin
WriteLn('Hay nhap chuoi');
ReadLn(Ch);
Biên soạn: Th.s Nguyễn Anh Việt Trang 22
Bài tập Pascal – Từ cơ bản đến nâng cao
WriteLn('Nhap Ky tu can tim');
ReadLn(KT);
{Đếm số lần xuất hiện}
For i:=1 to Length(Ch) do
If Ch[i] = KT then Inc(Dem);;
WriteLn('Ky tu ', KT, ' xuat hien trong chuoi ', Ch, ' ', Dem, ' lan');
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 23
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 7.01 – Đổi chỗ số lớn nhất đường chéo chính và số nhỏ nhất đường chéo phụ
(Mảng 1 4 7 1 4 7
5 2 9 => 5 3 9
8 1 3 8 1 2
có Số lớn nhất đường chéo chính là 3, số nhỏ nhất đường chéo phụ là 2)
Bạn hãy nhập một ma trận vuông, tìm và đổi chỗ số lớn nhất trên đường chéo chính và số nhỏ nhất trên
đường chéo phụ trong ma trận đó.
Var
A: Array [1..10] of Integer;
i, j, n, t: Integer;
Max, Min, SLN_VT_dong, SLN_VT_cot, SNN_VT_dong, SNN_VT_cot: Integer;
Begin
WriteLn('Hay nhap so dong/ cot cua mang');
ReadLn(n);
{Nhập ma trận vuông}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
ReadLn(A[i, j]);
End;
{In ma trận vuông}
For i:=1 to n do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
{Tìm Số lớn nhất trên đường chéo chính và vị trí}
Max := A[1,1];
For i:=1 to n do
For j:=1 to n do
If (i = j) and (Max < A[i,j]) then begin
Max := A[i,j];
SLN_VT_dong := i;
SLN_VT_cot := j;
End;
{Tìm Số nhỏ nhất trên đường chéo phụ và vị trí}
Max := A[1,n];
For i:=1 to n do
For j:=1 to n do
If (i + j = n + 1) and (Min > A[i,j]) then begin
Min := A[i,j];
Biên soạn: Th.s Nguyễn Anh Việt Trang 24
Bài tập Pascal – Từ cơ bản đến nâng cao
SNN_VT_dong := i;
SNN_VT_cot := j;
End;
{Đổi vị trí}
T := A[SLN_VT_Dong, SLN_VT_Cot];
A[SLN_VT_Dong, SLN_VT_Cot] := A[SNN_VT_Dong, SNN_VT_Cot];
A[SNN_VT_Dong, SNN_VT_Cot] := t;
{In ma trận vuông kết quả}
For i:=1 to n do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
ReadLn;
End.
Bài 7.02 – Tìm số lớn nhất trên vòng ngoài cùng của ma trận
(Mảng 1 4 7
5 2 9 => 9 là số lớn nhất trên vòng ngoài cùng
8 1 3
Bạn hãy nhập một ma trận vuông, tìm số lớn nhất trên vòng ngoài cùng trong ma trận đó.
Var
A: Array [1..10] of Integer;
i, j, n, t, Max : Integer;
Begin
WriteLn('Hay nhap so dong/ cot cua mang');
ReadLn(n);
{Nhập ma trận vuông}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
ReadLn(A[i, j]);
End;
{In ma trận vuông}
For i:=1 to n do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
{Tìm Số lớn nhất trên vòng ngoài cùng}
Max := A[1,1];
For i:=1 to n do
Biên soạn: Th.s Nguyễn Anh Việt Trang 25
Bài tập Pascal – Từ cơ bản đến nâng cao
For j:=1 to n do
If ((i=1) or (i=1) or (j=1) or (j=n)) and (Max < A[i,j]) then
Max := A[i,j];
{In kết quả}
Write('So lon nhat tren vòng ngoai cung cua ma tran la ', Max);
ReadLn;
End.
Bài 7.03 – Tìm số lớn nhất trên khối trong của ma trận
(Mảng 1 4 7 3
5 2 7 6 => 7 là số lớn nhất trên khối trong
8 1 3 9
5 4 9 4
Bạn hãy nhập một ma trận vuông, tìm số lớn nhất trên khối trong của ma trận đó.
Var
A: Array [1..10] of Integer;
i, j, n, t, Max : Integer;
Begin
WriteLn('Hay nhap so dong/ cot cua mang');
ReadLn(n);
{Nhập ma trận vuông}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
ReadLn(A[i, j]);
End;
{In ma trận vuông}
For i:=1 to n do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
{Tìm Số lớn nhất trên khối trong}
Max := A[1,1];
For i:=1 to n do
For j:=1 to n do
If not (((i=1) or (i=1) or (j=1) or (j=n)) and (Max < A[i,j])) then
Max := A[i,j];
Biên soạn: Th.s Nguyễn Anh Việt Trang 26
Bài tập Pascal – Từ cơ bản đến nâng cao
{In kết quả}
Write('So lon nhat tren khoi trong cua ma tran la ', Max);
ReadLn;
End.
Bài 7.04 – Tổng k chữ số tận cùng của một số
(Số 365 có tổng 2 chữ số tận cùng là 11)
Lập chương trình nhập vào 1 số tự nhiên n (n<>0) và nhập vào m, sau đó tính tổng m các số tận cùng
của n.
Ví dụ: n = 365, m =2 tổng 2 chữ số tận cùng = 5+6 = 11.
Var
Tong, n, i: Integer;
Begin
WriteLn('Hay nhap so');
ReadLn(n);
WriteLn('Muon tính tong bao nhieu chu so tan cung');
ReadLn(k);
{Tính tổng k chữ số tận cùng}
i := 1;
While i <= k do Begin
Tong := Tong + n mod 10;
n := n div 10;
Inc(i);
End;
{In kết quả}
WriteLn('Tong ', k, ' chu so tan cung trong so ', n, ' la ', Tong);
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 27
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 8.01 – Mã hoá và Giải mã chuổi
Bài toán sau mô tả một thuật toán mã hoá đơn giản:
Tập hợp các chữ cái tiếng Anh bao gồm 26 chữ cái được đánh sô thứ tự từ 0 đến 25 như sau:
0 1 2 3 4 5 6 7 8 9 1
0
1
1
1
2
1
3
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Quy tắc mã hoá một ký tự như sau (lấy ví dụ ký tự X):
- Tìm số thứ tự tương ứng của ký tự ta được 23
- Tăng giá trị số này lên 5 ta được 28
- Tìm số dư trong phép chia số này cho 26 ta được 2
- Tra ngược bảng chữ cái ta thu được C.
a. Sử dụng quy tắc trên để mã hoá các dòng chữ sau:
PEACE
I LOVE SPRING
b. Hãy tìm ra quy tắc giải mã các dòng chữ sau:
N FR F XYZIJSY
MFSTN SFYNTSFQ ZSNBJVXNYD
Chương trình mã hoá như sau:
Const
MaHoa: Array [0..25] of Char =
('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','
S','T','U','V','W','X','Y','Z');
Var
Ch: String;
i, j: Integer;
Begin
WriteLn('Ban hay nhap chuoi can ma hoa');
ReadLn(Ch);
For i:=1 to Length(Ch) do
For j:=0 to 25 do
If Ch[i] = MaHoa[j] then begin
Ch[i] := MaHoa[(j + 5) mod 26];
Break;
End;
WriteLn('Chuoi da ma hoa la ',Ch);
ReadLn;
End.
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
Biên soạn: Th.s Nguyễn Anh Việt Trang 28
Chương trình giải mã như sau:
Bài tập Pascal – Từ cơ bản đến nâng cao
Const
MaHoa: Array [0..25] of Char =
('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','
S','T','U','V','W','X','Y','Z');
Var
Ch: String;
i, j: Integer;
Begin
WriteLn('Ban hay nhap chuoi can giai ma');
ReadLn(Ch);
For i:=1 to Length(Ch) do
For j:=0 to 25 do
If Ch[i] = MaHoa[j] then begin
Ch[i] := MaHoa[(j - 5) mod 26];
Break;
End;
WriteLn('Chuoi da giai ma la ',Ch);
ReadLn;
End.
Bài 8.02 – Tìm số lớn nhất trong nửa ma trận dưới của một ma trận
(Mảng 1 4 7
5 2 9 => 8 là số lớn nhất trong nửa ma trận dưới
8 1 3
Bạn hãy nhập một ma trận vuông, tìm số lớn nhất trong nửa ma trận dưới của ma trận đó.
Var
A: Array [1..10] of Integer;
i, j, n, t, Max : Integer;
Begin
WriteLn('Hay nhap so dong/ cot cua ma tran');
ReadLn(n);
{Nhập ma trận vuông}
For i:=1 to n do
For j:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i, j);
ReadLn(A[i, j]);
End;
Biên soạn: Th.s Nguyễn Anh Việt Trang 29
{In ma trận vuông}
For i:=1 to n do begin
For j:=1 to n do
Write(A[i, j]:3);
WriteLn;
End;
Bài tập Pascal – Từ cơ bản đến nâng cao
{Tìm Số lớn nhất trong nửa ma trận dưới}
Max := A[1,1];
For i:=1 to n do
For j:=1 to n do
If (i > j) and (Max < A[i,j]) then
Max := A[i,j];
{In kết quả}
Write('So lon nhat trong nua ma tran duoi la ', Max);
ReadLn;
End.
Bài 8.03 – Tìm số nhỏ nhất trong nửa ma trận trên của một ma trận
(Mảng 1 4 7
5 2 9 => 1 là số nhỏ nhất trong nửa ma trận trên
8 1 3
Bạn hãy nhập một ma trận vuông, tìm số lớn nhất trong nửa ma trận dưới của ma trận đó.
Bài 8.04 – Ma trận chuyển vị của một ma trận
(Ma trận 1 4 1 5 8
5 2 => 4 2 1
8 1
A [i,j] => B [j,i] trong ma trận chuyển vị)
Viết chương trình nhập vào một ma trận và tìm ma trận chuyển vị của ma trận đó.
Bài 8.05 – Thứ tự: Sắp thứ tự dãy số
(Dãy 9, 4, 7, 2, 5 => 2, 4, 5, 7, 9)
Bạn hãy nhập một dãy số nguyên và Sắp thứ tự các số trong dãy đó.
Var
A: Array [1..10] of Integer;
i, j, n, t: Integer;
Begin
WriteLn('Hay nhap so phan tu cua day so');
ReadLn(n);
Biên soạn: Th.s Nguyễn Anh Việt Trang 30
Bài tập Pascal – Từ cơ bản đến nâng cao
{Nhập dãy số}
For i:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
ReadLn(A[i]);
End;
{In dãy số}
For i:=1 to n do begin
Write(A[i]:3);
End;
WriteLn;
{Sắp thứ tự}
For i:=1 to n do
For j:= i+1 to n do
If A[i] > A[j] then begin
t := A[i];
A[i] := A[j];
A[j] := t;
End;
{In dãy số}
For i:=1 to n do begin
Write(A[i]:3);
End;
WriteLn;
ReadLn;
End.
Bài 8.06 – Tìm số lớn nhất và nhỏ nhất của dãy số sau khi sắp thứ tự
(Dãy 9, 4, 7, 2, 5 => 2, 4, 5, 7, 9 => Số lớn nhất là 9, nhỏ nhất là 2)
Bạn hãy nhập một dãy số nguyên và Sắp thứ tự các số trong dãy đó rồi tìm số lớn nhất và nhỏ nhất của
dãy số đó.
Bài 8.07 – Thứ tự: Sắp thứ tự dãy số giảm dần
(Dãy 9, 4, 7, 2, 5 => 9, 7, 5, 4, 2)
Bạn hãy nhập một dãy số nguyên và Sắp thứ tự giảm dần các số trong dãy đó.
Biên soạn: Th.s Nguyễn Anh Việt Trang 31
Bài tập Pascal – Từ cơ bản đến nâng cao
Biến có cấu trúc - Records
TD: Mỗi điểm trong hình học 2 chiều có toạ độ (x, y)
Khai báo biến trong Pascal như sau:
Type Diem = Record
x, y: Integer;
End;
Var
A, B: Diem;
Bài tập 9.01 – Tìm độ dài của một đoạn thẳng AB:
Độ dài của đoạn thẳng AB với điểm A có toạ độ xA, yA và điểm B có toạ độ xB, yB được tính như sau:
AB ̅̅̅̅ = √(x A − x B ) 2 + (y A − y B ) 2
Chương trình tìm độ dài của đoạn thẳng AB được viết như sau:
Type Diem = Record
x, y: Integer; {Nếu các toạ độ chỉ là số nguyên}
End;
Var
A, B: Diem;
DoDai: Real;
Begin
WriteLn('Ban hay nhap toa do cua diem thu nhat');
ReadLn(A.x, A.y);
WriteLn('Ban hay nhap toa do cua diem thu hai');
ReadLn(B.x, B.y);
DoDai := SQRT(SQR(A.x - B.x) + SQR(A.y - B.y));
{SQRT = Căn bậc 2, SQR = Bình phương}
WriteLn('Do dai doan thang AB la ', DoDai:5:2);
ReadLn;
End.
Bài tập 9.02 – Tìm toạ độ trung điểm của một đoạn thẳng AB:
Toạ độ trung điểm I của đoạn thẳng AB là xI, yI được tính như sau:
xI = (x A+x B )
2
và yI = (y A+y B )
2
Type Diem = Record
x, y: Real; {Toạ độ trung điểm là kết quả phép /2 nên có thể là số thực}
End;
Var
Biên soạn: Th.s Nguyễn Anh Việt Trang 32
Bài tập Pascal – Từ cơ bản đến nâng cao
A, B, I: Diem;
Begin
WriteLn('Ban hay nhap toa do cua diem thu nhat');
ReadLn(A.x, A.y);
WriteLn('Ban hay nhap toa do cua diem thu hai');
ReadLn(B.x, B.y);
I.x := (A.x + B.x) / 2;
I.y := (A.y + B.y) / 2;
WriteLn('Toa do trung diem doan AB la (', I.x:5:2, ', ', I.y:5:2, ')');
ReadLn;
End.
Bài tập 9.03 – Danh sách học sinh:
Nhập vào danh sách học sinh gồm có Họ, Tên, Điểm TB.
* Sắp thứ tự danh sách theo điểm TB của học sinh
* In ra danh sách các học sinh có Điểm TB >= 5
* In ra danh sách các học sinh có Điểm TB < 5 (tự làm bài)
* In ra danh sách các học sinh có điểm TB cao nhất
* In ra danh sách các học sinh có điểm TB thấp nhất (tự làm bài)
Type HocSinh = Record
Ho, Ten: String;
DiemTB: Real;
End;
Var
n, i, j: Integer;
HS: Array [1..10] of HocSinh;
t1, Max: Real;
t2: String;
Begin
WriteLn('Danh sach co bao nhieu hoc sinh');
ReadLn(n);
{Nhap DS}
For i:=1 to n do begin
WriteLn('Hoc sinh thu ', i);
Write('Ho : '); ReadLn(HS[i].Ho);
Write('Ten : '); ReadLn(HS[i].Ten);
Write('Diem TB: '); ReadLn(HS[i].DiemTB);
Biên soạn: Th.s Nguyễn Anh Việt Trang 33
Bài tập Pascal – Từ cơ bản đến nâng cao
WriteLn;
End;
{In DS}
WriteLn('DS Hoc sinh');
For i:=1 to n do begin
Write(HS[i].Ho, ' ');
Write(HS[i].Ten, ' ');
Write(HS[i].DiemTB:3:2);
WriteLn;
End;
{Sap thu tu}
For i:=1 to n-1 do
For j:=i+1 to n do
If HS[i].DiemTB > HS[j].DiemTB then begin
t2 := HS[i].Ho;
{Hoan chuyen Ho}
HS[i].Ho := HS[j].Ho;
HS[j].Ho := t2;
t2 := HS[i].Ten;
HS[i].Ten := HS[j].Ten;
HS[j].Ten := t2;
{Hoan chuyen Ten}
t1 := HS[i].DiemTB; {Hoan chuyen Diem TB}
HS[i].DiemTB := HS[j].DiemTB;
HS[j].DiemTB := t1;
End;
{In DS da sap thu tu}
WriteLn('DS Hoc sinh da sap thu tu');
For i:=1 to n do begin
Write(HS[i].Ho, ' ');
Write(HS[i].Ten, ' ');
Write(HS[i].DiemTB:3:2);
WriteLn;
End;
{In DS HS co diem TB >= 5}
WriteLn('DS Hoc sinh co diem TB >= 5');
For i:=1 to n do begin
If HS[i].DiemTB < 5 then Continue;
Write(HS[i].Ho, ' ');
Write(HS[i].Ten, ' ');
Write(HS[i].DiemTB:3:2);
WriteLn;
End;
Biên soạn: Th.s Nguyễn Anh Việt Trang 34
Bài tập Pascal – Từ cơ bản đến nâng cao
{Tim diem TB cao nhat}
Max := HS[1].DiemTB;
For i:=2 to n do
If Max < HS[i].DiemTB then Max := HS[i].DiemTB;
{In DS HS co diem TB cao nhat}
WriteLn('DS Hoc sinh co diem TB cao nhat');
For i:=1 to n do
If HS[i].DiemTB = Max then begin
Write(HS[i].Ho, ' ');
Write(HS[i].Ten, ' ');
Write(HS[i].DiemTB:3:2);
WriteLn;
End;
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 35
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài tập 10.01 – Đổi số thập phân thành số nhị phân:
Để đổi số thập phân thành số nhị phân ta thực hiện như sau:
TD: Đổi số 137 => Đem chia cho 2 đến khi kết quả phép chia bằng 0 rồi lấy ngược các số dư
137 2
1 68 2
0 34 2
0 17 2
1 8 2
0 4 2
0 2 2
0 1 2
1 0
Kết quả là 137 10 = 10001001 2
Var
n, k: Integer;
CNP: String;
Begin
WriteLn('Hay nhap so can doi tu he 10 sang he 2');
ReadLn(n);
k := n;
While k>0 do Begin
If k mod 2 = 0 then CNP:='0' + CNP
Else CNP := '1' + CNP;
k := k div 2;
End;
WriteLn('So ', n, ' trong he 10 doi sang he 2 la ', CNP);
ReadLn;
End.
Bài tập 10.02 – Đổi số thập phân thành số thập lục phân (hệ 16):
Để đổi số thập phân thành số hệ 16 ta thực hiện như sau:
TD: Đổi số 249 => Đem chia cho 16 đến khi kết quả phép chia bằng 0 rồi lấy ngược các số dư.
Chú ý các số dư từ 10 đến 15 được chuyển đổi thành A đến F
Biên soạn: Th.s Nguyễn Anh Việt Trang 36
Bài tập Pascal – Từ cơ bản đến nâng cao
249 16
9 15 16
9 15 0
F
Kết quả là 249 10 = F9 16
Var
n, k: Integer;
CTLP: String;
Begin
WriteLn('Hay nhap so can doi tu he 10 sang he 16');
ReadLn(n);
k := n;
While k>0 do Begin
If k mod 16 = 0 then CTLP:='0'+CTLP
Else If k mod 16 = 1 then CTLP:='1'+CTLP
Else If k mod 16 = 2 then CTLP:='2'+CTLP
Else If k mod 16 = 3 then CTLP:='3'+CTLP
Else If k mod 16 = 4 then CTLP:='4'+CTLP
Else If k mod 16 = 5 then CTLP:='5'+CTLP
Else If k mod 16 = 6 then CTLP:='6'+CTLP
Else If k mod 16 = 7 then CTLP:='7'+CTLP
Else If k mod 16 = 8 then CTLP:='8'+CTLP
Else If k mod 16 = 9 then CTLP:='9'+CTLP
Else If k mod 16 = 10 then CTLP:='A'+CTLP
Else If k mod 16 = 11 then CTLP:='B'+CTLP
Else If k mod 16 = 12 then CTLP:='C'+CTLP
Else If k mod 16 = 13 then CTLP:='D'+CTLP
Else If k mod 16 = 14 then CTLP:='E'+CTLP
Else CTLP:='F' + CTLP;
k := k div 16;
End;
WriteLn('So ', n, ' trong he 10 doi sang he 16 la ', CTLP);
ReadLn;
End.
Bài tập 10.03 – Đổi số thập phân thành số theo hệ m (m từ 2 đến 16):
Var
m, n, k: Integer;
Ch: String;
Begin
WriteLn('Hay nhap so can doi tu he 10 sang he 16');
ReadLn(n);
Biên soạn: Th.s Nguyễn Anh Việt Trang 37
Bài tập Pascal – Từ cơ bản đến nâng cao
WriteLn('Hay nhap he can doi (tu 2 den 16)');
ReadLn(m);
k := n;
While k>0 do Begin
If k mod m = 0 then Ch:='0'+Ch
Else If k mod m = 1 then Ch:='1'+Ch
Else If k mod m = 2 then Ch:='2'+Ch
Else If k mod m = 3 then Ch:='3'+Ch
Else If k mod m = 4 then Ch:='4'+Ch
Else If k mod m = 5 then Ch:='5'+Ch
Else If k mod m = 6 then Ch:='6'+Ch
Else If k mod m = 7 then Ch:='7'+Ch
Else If k mod m = 8 then Ch:='8'+Ch
Else If k mod m = 9 then Ch:='9'+Ch
Else If k mod m = 10 then Ch:='A'+Ch
Else If k mod m = 11 then Ch:='B'+Ch
Else If k mod m = 12 then Ch:='C'+Ch
Else If k mod m = 13 then Ch:='D'+Ch
Else If k mod m = 14 then Ch:='E'+Ch
Else Ch:='F' + Ch;
k := k div m;
End;
WriteLn('So ', n, ' trong he 10 doi sang he ‘, m, ‘ la ', Ch);
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 38
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài tập 11.01 – Đổi số nhị phân thành số thập phân:
Để đổi số nhị phân thành số thập phân ta thực hiện như sau:
TD: Đổi số 10001001
Tính các luỹ thừa của 2 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0
= 128 64 32 16 8 4 2 1
1 0 0 0 1 0 0 1
Nhân tương ứng với các giá trị luỹ thừa 128 0 0 0 8 0 0 1
Cộng các giá trị lại 128 + 8 + 1 = 137
Kết quả là 10001001 2 = 137 10
Var
So: Integer;
LT, STP: LongInt;
CNP: String;
Begin
WriteLn('Hay nhap chuoi can doi tu he 2 sang he 10');
ReadLn(CNP);
LT := 1;
For i:=Length(CNP) downto 1 do Begin
If CNP[i] = '0' then So :=0
Else So := 1;
STP := STP + So;
LT := LT * 2;
End;
WriteLn('Chuoi ', CNP, ' trong he 2 doi sang he 10 la ', STP);
ReadLn;
End.
Bài tập 11.02 – Đổi số thập lục phân (hệ 16) thành số thập phân:
Để đổi số thập phân thành số hệ 16 ta thực hiện như sau:
Tính các luỹ thừa của 16 16 1 16 0
= 16 1
F 9
Các giá trị A, B, …, F => 10, 11, … , 15 15 9
Nhân tương ứng với các giá trị luỹ thừa 240 9
Cộng các giá trị lại 240 + 9 = 249
Kết quả là F9 16 = 249 10
Biên soạn: Th.s Nguyễn Anh Việt Trang 39
Bài tập Pascal – Từ cơ bản đến nâng cao
Var
So, LT, STP: LongInt;
CTLP: String;
Begin
WriteLn('Hay nhap chuoi so can doi tu he 16 sang he 10');
ReadLn(CTLP);
LT:=1;
For i:= Length(CTLP) downto 1 do Begin
If CTLP[i] = '0' then So := 0
Else If CTLP[i] = '1' then So:= 1
Else If CTLP[i] = '2' then So:= 2
Else If CTLP[i] = '3' then So:= 3
Else If CTLP[i] = '4' then So:= 4
Else If CTLP[i] = '5' then So:= 5
Else If CTLP[i] = '6' then So:= 6
Else If CTLP[i] = '7' then So:= 7
Else If CTLP[i] = '8' then So:= 8
Else If CTLP[i] = '9' then So:= 9
Else If CTLP[i] = 'A' then So:= 10
Else If CTLP[i] = 'B' then So:= 11
Else If CTLP[i] = 'C' then So:= 12
Else If CTLP[i] = 'D' then So:= 13
Else If CTLP[i] = 'E' then So:= 14
Else If CTLP[i] = 'F' then So:= 15 ;
STP := STP + So * LT;
LT := LT * 16;
End;
WriteLn('Chuoi ', CTLP, ' trong he 16 doi sang he 10 la ', STP);
ReadLn;
End.
Bài tập 11.03 – Đổi chuổi số theo hệ m (m từ 2 đến 16) thành số thập phân:
Var
m: Integer;
So, LT, STP: LongInt;
Ch: String;
Begin
WriteLn('Hay nhap chuoi so can doi tu he m sang he thap phan');
ReadLn(Ch);
WriteLn('Hay nhap he m (2 den 16)');
ReadLn(m);
LT:=1;
For i:= Length(Ch) downto 1 do Begin
If CH[i] = '0' then So := 0
Biên soạn: Th.s Nguyễn Anh Việt Trang 40
Bài tập Pascal – Từ cơ bản đến nâng cao
Else If Ch[i] = '1' then So:= 1
Else If Ch[i] = '2' then So:= 2
Else If Ch[i] = '3' then So:= 3
Else If Ch[i] = '4' then So:= 4
Else If Ch[i] = '5' then So:= 5
Else If Ch[i] = '6' then So:= 6
Else If Ch[i] = '7' then So:= 7
Else If Ch[i] = '8' then So:= 8
Else If Ch[i] = '9' then So:= 9
Else If Ch[i] = 'A' then So:= 10
Else If Ch[i] = 'B' then So:= 11
Else If Ch[i] = 'C' then So:= 12
Else If Ch[i] = 'D' then So:= 13
Else If Ch[i] = 'E' then So:= 14
Else If Ch[i] = 'F' then So:= 15 ;
STP := STP + So * LT;
LT := LT * m;
End;
WriteLn('Chuoi ', Ch, ' trong he ', m, ' doi sang he 10 la ', STP);
ReadLn;
End.
Biên soạn: Th.s Nguyễn Anh Việt Trang 41
Bài tập Pascal – Từ cơ bản đến nâng cao
Các bài toán cổ
Bài tập 12.01.
Trăm trâu trăm cỏ
Trâu đứng ăn năm
Trâu nằm ăn ba
Lụ khụ trâu già
Ba con một bó
Hỏi số trâu và số cỏ ?
Bài tập 12.02.
Em đi chợ phiên
Anh gửi trăm tiền
Mua cam cùng quýt
Với lại thanh yên
Không ít thì nhiều
Mua lấy một trăm
Cam ba đồng một
Quýt một đồng năm
Thanh yên tươi tốt
Năm đồng một trái
Hỏi mỗi thứ mua được mấy trái ?
Biên soạn: Th.s Nguyễn Anh Việt Trang 42
Các bài ôn tập – Phần 2
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài tập 13.01. Nhập số n, tìm số nguyên tố lớn nhất <= n. TD: n = 10, số nguyên tố lớn nhất <= 10 là 7
Bài tập 13.02. Nhập số n, tìm số nguyên tố nhỏ nhất >= n. TD: n = 10, số nguyên tố nhỏ nhất >= 10 là 11
Bài tập 13.03. Nhập số n và số k, tìm k số nguyên tố nhỏ nhất >= n. TD: n = 10 và k = 3, 3 số nguyên tố nhỏ
nhất >= 10 là 11, 13 và 17
Bài tập 13.04. Nhập số n và số k, tìm k số nguyên tố lớn nhất <= n. TD:
* n = 23 và k = 5, 5 số nguyên tố lớn nhất <= 23 là 11, 13, 17, 19 và 23
* n = 10 và k = 5, chỉ có 4 số nguyên tố lớn nhất <= 10 là 2, 3, 5 và 7
Bài tập 13.05. Nhập số dòng/ cột n của ma trận vuông. Điền các số nguyên tố theo chiều kim đồng hồ vào ma
trận. TD: n = 4:
2 3 5 7
37 41 43 11
31 51 47 13
29 23 19 17
Bài tập 13.06. Nhập ma trận vuông, tìm các số nguyên tố trong nửa ma trận trên và tính tổng của chúng. TD:
n = 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Các số nguyên tố trong nửa ma trận trên là : 2, 3, 7, 11 có tổng là 23
Bài tập 13.07. Nhập ma trận có m dòng và n cột. In ra ma trận chuyển vị của ma trận trên. TD:
m = 4, n = 3
1 2 3 1 4 7 10
4 5 6 2 5 8 11
7 8 9 3 6 9 12
10 11 12
Bài tập 13.08. Nhập vào độ dài của 3 cạnh. Nếu chúng tạo thành một tam giác thì tính diện tích tam giác đó.
Ngược lại thì thông báo chúng không tạo thành một tam giác. TD:
* Nhập 3, 4, 5 => Diện tích của tam giác là 6
* Nhập 3, 4, 7 => 3 cạnh trên không tạo thành một tam giác.
Bài tập 13.09. Nhập vào độ dài của 3 cạnh. Nếu chúng tạo thành một tam giác xem có tính chất gì không (cân,
vuông, đều). Ngược lại thì thông báo chúng không tạo thành một tam giác. TD:
* Nhập 3, 4, 5 => Tam giác vuông
* Nhập 3, 4, 7 => 3 cạnh trên không tạo thành một tam giác.
* Nhập 4, 4, 5 => Tam giác cân
* Nhập 4, 4, 4 => Tam giác đều
* Nhập 3, 4, 6 => Tam giác thường
Bài tập 13.10. Nhập vào toạ độ của 3 điểm và xét xem chúng có tạo thành một tam giác hay không, nếu có thì
xem tam giác đó có tích chất gì không (cân, đều, vuông cân). TD:
* (-2, 1), (0, 5), (4, 3) => Tam giác vuông cân
* (3, 1), (0, 1), (0, 4) => Tam giác vuông
Biên soạn: Th.s Nguyễn Anh Việt Trang 43
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài tập 13.11. Nhập vào toạ độ của 3 điểm và xét xem chúng có tạo thành một tam giác hay không, nếu có thì
tính diện tích của tam giác đó. TD:
* (-2, 1), (0, 5), (4, 3) => Diện tích là 10
* (3, 1), (0, 1), (0, 4) => Diện tích là 4,5
Biên soạn: Th.s Nguyễn Anh Việt Trang 44
Các bài ôn tập – Phần 3
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài tập 14.01. Cho ma trận nguyên Anxn . Hãy xây dựng ma trận B từ ma trận A bằng cách loại bỏ đường chéo
chính.
TD :
1 2 3 2 3
4 5 6 -> 4 6
7 8 9 7 8
Bài tập 14.02. Nhập mảng từ file MT.inp và in ra màn hình
MT1.inp
3
1 2 3
4 5 6
7 8 9
Bài tập 14.03. Nhập vào ma trận vuông và tìm số lớn nhất, số nhò nhất của ma trận
MT2.inp
3
9 8 7
6 5 4
3 2 1
MT2.out
9
1
Bài tập 14.04. Nhập vào ma trận vuông (n>=3), xoá dòng 2 của ma trận
MT3.inp
3
9 8 7
6 5 4
3 2 1
MT3.out
9 8 7
3 2 1
Bài tập 14.05. Nhập vào ma trận vuông (n>=3), xoá cột 1 của ma trận
MT4.inp
3
1 2 3
4 5 6
7 8 9
MT4.out
2 3
5 6
8 9
Bài tập 14.06. Nhập vào ma trận vuông (n>=3) và số k (k<=n), xoá cột k của ma trận
MT5.inp
3
2
1 2 3
4 5 6
7 8 9
MT5.out
1 3
4 6
7 9
Biên soạn: Th.s Nguyễn Anh Việt Trang 45
Các bài ôn tập – Phần 4
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài tập 15.01. Viết chương trình thao tác trên ma trận vuông với các yêu cầu:
a. Nhập xuất ma trận vuông.
b. Tính tổng các phần tử trên đường chéo chính.
c. Kiểm tra tính đối xứng của ma trận vuông qua đường chéo chính.
TD :
MT011.Inp MT011.Out
3
1 2 3
2 4 7
3 7 9
Ma tran doi
xung
MT012.Inp MT012.Out
3 Ma tran
1 2 3 khong doi
2 4 8 xung
3 7 9
Bài tập 15.02. Ma trận xoắn ốc được tạo thành bằng cách điền số 1 vào hàng 1 cột 1, sau đó điền số tăng dần
theo chiều kim đồng hồ
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
Hãy viết chương trình cho biết giá trị tại ô (x, y) của 1 ma trận xoáy ốc vuông kích thước n x n
MT02.Inp MT02.Out
3 18
2 15
2 3
3 1
Bài tập 15.03. Cho ma trận thực m x n, viết chương trình in ra tổng các phần tử A[i,j] mà i+j chia hết cho 3.
MT03.Inp MT03.Out
3 3 2
1 2 3 4
4 5 6 9
7 8 9
Bài tập 15.04. Cho ma trận thực m x n , viết chương trình tính tổng bình phương của các phần tử nằm trên cột
có giá trị chẵn và trên hàng có giá trị lẻ.
MT03.Inp MT03.Out
3 3 233
1 2 3
Biên soạn: Th.s Nguyễn Anh Việt Trang 46
Bài tập Pascal – Từ cơ bản đến nâng cao
4 5 6
7 8 9
Bài tập 15.05. Số tự nhiên được gọi là số hoàn thiện nếu nó bằng tổng tất cả các ước số của nó (nhỏ hơn nó) kể
cả số 1. Lập chương trình in tất cả số hoàn thiện nhỏ hơn số N cho trước.
Ví dụ: Số 6 là số hoàn thiện vì 6 = 1 + 2 + 3
Hướng dẫn: Duyệt tất cả các số từ 1 đến N, trong mỗi phép duyệt: tìm các ước của số đó, kiểm tra xem
có thỏa mãn điều kiện bài toán không, nếu có thì in ra số đó.
Bài tập 15.06. Lập chương trình cộng 2 phân số cho kết quả phân số tối giản (tử số và mẫu số đều là số nguyên).
Biên soạn: Th.s Nguyễn Anh Việt Trang 47
Các bài ôn tập – Phần 5
Bài tập Pascal – Từ cơ bản đến nâng cao
Bài 16.01: Xâu số
Một xâu chữ cái được gọi là xâu số nếu khi xóa 1 vài kí tự ta thu được một trong các xâu sau: ONE, TWO,
THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE. Các xâu: ONE, TWO, THREE, FOUR, FIVE, SIX,
SEVEN, EIGHT, NINE được gọi là các chữ số (tương ứng với các số nguyên: 1, 2, 3, 4, 5, 6, 7, 8, 9)
VD
BOUNCE và ANNOUNCE là hai xâu số vì hai xâu có chứa từ ONE
ENCODE không phải là xâu số vì dù có chứa O, N, E nhưng vị trí của chúng theo thứ tự là N, O, E
Yêu cầu:
Viết chương trình nhập vào 1 xâu. kiểm tra xâu đó có phải xâu số không. Nếu là xâu số thì in ra màn hình
số nguyên tương ứng với từ số chứa trong xâu này. Nếu xâu được nhập không phải là xâu số thì xuất ra màn hình
"KHONG'.
VD
BOUNCE thì in ra 1
ENCODE thì in ra KHONG
Biên soạn: Th.s Nguyễn Anh Việt Trang 48