1. Trang chủ
  2. » Giáo án - Bài giảng

■ Bài tập Pascal/ Free Pascal 01 đến 16 ■ Có bài giải (từ đơn giản đến nâng cao)

48 874 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 48
Dung lượng 0,92 MB

Nội dung

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 1

Biê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 2

Biê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 3

Biê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 4

Biê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 5

Biê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 6

Biê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 7

Biê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 8

Biê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 9

Biê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 10

Biê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 11

Biê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 12

Biê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 13

Biê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 14

Biê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 15

Biên soạn: Th.s Nguyễn Anh Việt Trang 15

Trang 16

Biên soạn: Th.s Nguyễn Anh Việt Trang 16

Trang 17

Biê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 18

Biê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 19

Biê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 20

Biê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 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 21

Biê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 22

Biê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 23

Biê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 24

Biê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 25

Biê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 26

Biên soạn: Th.s Nguyễn Anh Việt Trang 26

Trang 27

Biên soạn: Th.s Nguyễn Anh Việt Trang 27

Trang 28

Biê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 29

Biê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 30

Biê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 31

Biê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 32

Biê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 33

Biê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 34

Biê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 35

Biê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 36

Biê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 37

Biê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

Ngày đăng: 13/09/2017, 10:28

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w