29.06.2020 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!