Bài 01 (Phần cơ bản)Bài 02 (Procedure và Function)Bài 03 (Đệ quy)Bài 04 (Phần Mảng (Array))Bài 05 (Phần Mảng 2 chiều)Bài 06 (Phần biến chuổi ký tự String)Bài 07 (Nâng cao Phần 1)Bài 08 (Nâng cao Phần 2)Bài 09 (Biến có cấu trúc (Record))Bài 10 (Nâng cao Phần 3)Bài 11 (Nâng cao Phần 4)Bài 12 (Ôn tập phần 1)Bài 13 (Ôn tập phần 2)Bài 14 (Ôn tập phần 3)Bài 15 (Ôn tập phần 4)Bài 16 (Ôn tập phần 5)
Trang 1Biên soạn: Th.s Nguyễn Anh Việt Trang 1
Bài 1.01 – Xin chào
(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
Trang 2Biên soạn: Th.s Nguyễn Anh Việt Trang 2
WriteLn('Hay nhap so thu hai');
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 an
Trang 3Biên soạn: Th.s Nguyễn Anh Việt Trang 3
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 L n 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
Trang 4Biên soạn: Th.s Nguyễn Anh Việt Trang 4
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 ;
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 đó
Trang 5Biên soạn: Th.s Nguyễn Anh Việt Trang 5
{In ra giá trị giai thừa}
For i := 1 to n do
Write(GiaiThua(A[i]):6);
ReadLn;
End
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 đó
Trang 6Biên soạn: Th.s Nguyễn Anh Việt Trang 6
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 đó
Trang 7Biên soạn: Th.s Nguyễn Anh Việt Trang 7
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, …
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
Trang 8Biên soạn: Th.s Nguyễn Anh Việt Trang 8
Đệ 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 đó
Trang 9Biên soạn: Th.s Nguyễn Anh Việt Trang 9
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 đó
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)
Trang 10Biên soạn: Th.s Nguyễn Anh Việt Trang 10
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)
Trang 11Biên soạn: Th.s Nguyễn Anh Việt Trang 11
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
Trang 12Biên soạn: Th.s Nguyễn Anh Việt Trang 12
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 đó
For i:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
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];
Trang 13Biên soạn: Th.s Nguyễn Anh Việt Trang 13
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)
Trang 14Biên soạn: Th.s Nguyễn Anh Việt Trang 14
{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');
Trang 15Biên soạn: Th.s Nguyễn Anh Việt Trang 15
Trang 16Biên soạn: Th.s Nguyễn Anh Việt Trang 16
Trang 17Biên soạn: Th.s Nguyễn Anh Việt Trang 17
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;
Trang 18Biên soạn: Th.s Nguyễn Anh Việt Trang 18
{Tìm các số trên đường chéo chính}
WriteLn('Cac so tren duong cheo chinh la:');
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ụ
Trang 19Biên soạn: Th.s Nguyễn Anh Việt Trang 19
{Tìm các số trên đường chéo phụ}
WriteLn('Cac so tren duong cheo phu la:');
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
Trang 20Biên soạn: Th.s Nguyễn Anh Việt Trang 20
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'
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 đó
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
Trang 21Biên soạn: Th.s Nguyễn Anh Việt Trang 21
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à:
{Đế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
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
Trang 22Biên soạn: Th.s Nguyễn Anh Việt Trang 22
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, …)
{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 T rường
Trang 23Biên soạn: Th.s Nguyễn Anh Việt Trang 23
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
Trang 24Biên soạn: Th.s Nguyễn Anh Việt Trang 24
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 đó
Trang 25Biên soạn: Th.s Nguyễn Anh Việt Trang 25
{In ma trận vuông kết quả}
For i:=1 to n do begin
Trang 26Biên soạn: Th.s Nguyễn Anh Việt Trang 26
Trang 27Biên soạn: Th.s Nguyễn Anh Việt Trang 27
Trang 28Biên soạn: Th.s Nguyễn Anh Việt Trang 28
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:
- 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:
If Ch[i] = MaHoa[j] then begin
Ch[i] := MaHoa[(j + 5) mod 26];
Trang 29Biên soạn: Th.s Nguyễn Anh Việt Trang 29
Chương trình giải mã 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');
If Ch[i] = MaHoa[j] then begin
Ch[i] := MaHoa[(j - 5) mod 26];
Trang 30Biên soạn: Th.s Nguyễn Anh Việt Trang 30
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 đó
Trang 31Biên soạn: Th.s Nguyễn Anh Việt Trang 31
{Nhập dãy số}
For i:=1 to n do begin
WriteLn('Hay nhap phan tu thu ', i);
Trang 32Biên soạn: Th.s Nguyễn Anh Việt Trang 32
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: 𝐴𝐵
̅̅̅̅ = √(𝑥𝐴 − 𝑥𝐵)2+ (𝑦𝐴− 𝑦𝐵)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}
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 = (𝑥𝐴+𝑥𝐵)
2 và yI = (𝑦𝐴+𝑦𝐵)
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
Trang 33Biên soạn: Th.s Nguyễn Anh Việt Trang 33
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;
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);
Trang 34Biên soạn: Th.s Nguyễn Anh Việt Trang 34
WriteLn;
End;
{In DS}
WriteLn('DS Hoc sinh');
For i:=1 to n do begin
If HS[i].DiemTB > HS[j].DiemTB then begin
t2 := HS[i].Ho; {Hoan chuyen Ho}
{In DS da sap thu tu}
WriteLn('DS Hoc sinh da sap thu tu');
For i:=1 to n do begin
WriteLn('DS Hoc sinh co diem TB >= 5');
For i:=1 to n do begin
If HS[i].DiemTB < 5 then Continue;
Trang 35Biên soạn: Th.s Nguyễn Anh Việt Trang 35
{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');
Trang 36Biên soạn: Th.s Nguyễn Anh Việt Trang 36
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ư
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
Trang 37Biên soạn: Th.s Nguyễn Anh Việt Trang 37
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