Thuật Toán & Kỹ Thuật Lập Trình Pascal
Trang 12 Các đặc trưng của thuật toán
Tính kết thúc: Một thuật toán phải kết thúc sau một số hữu hạn thao tác.
Tính rõ ràng: Từng thao tác của thuật toán phải rõ ràng theo nghĩa: cùng thao
tác đó nếu nhiều người khác nhau thực hiện thì phải cho cùng một kết quả
Tính phổ dụng: Cùng giải quyết một yêu câu, thuật toán nào sử dụng rộng rãi
hơn, tổng quát hơn thì tính phổ dụng cao hơn
Tính hiệu quả: Cùng giải quyết một yêu cầu, thuật toán nào tốn kém ít hơn về
số lượng thao tác, về bộ nhớ, về thời gian thì tính hiệu quả cao hơn
3 Biểu diễn thuật toán
Để biểu diễn thuật toán người ta thường dùng một trong hai phương pháp sau đây:3.1 Phương pháp liệt kê các bước
Phương pháp này sử dụng một ngôn ngữ nào đấy, mô tả dãy thao tác thật cơbản, rõ ràng theo trình tự từ trên xuống dưới, từ trái qua phải, từ bắt đầu đến kết thúcđúng theo giải thuật, nhằm đạt được yêu cầu đề ra
Các thao tác cơ bản bao gồm:
- Bắt đầu
- Thông báo, yêu cầu
- Nhận giá trị ban đầu
- Gán giá trị (lưu giá trị vào một tên biến nào đấy)
- Thực hiện các phép toán số học, logic
- Kiểm tra điều kiện để khẳng định điều kiện đúng hay sai
- Chuyển không điều kiện, có điều kiện đến thao tác khác
- Lặp lại thao tác nào đấy
Trang 2- Kết thúc
3.2 Phương pháp sơ đồ khối
Dùng các hình để thể hiện các thao tác, ghi thao tác vào giữa hình và dùng cácmũi tên để chỉ hướng thực hiện thao tác tiếp theo, tạo thành sơ đồ biểu diễn thuật toán,thường dùng các hình sau:
4 Một số thuật toán thường gặp
4.1.Hoán vị giá trị của X, Y
Bước 1: Dùng một tên biến trung gian TG và lưu X vào TG (Gán TG = X) Bước 2: Gán X = Y (lưu giá trị Y vào X)
Bước 3: Gán Y = TG (lưu TG tức là X cũ vào Y)
Bước 4: Kết thúc
4.2.Tìm phần tử lớn nhất trong dãy A1, A2, AN
Dùng một biến Max lưu phần tử lớn nhất
Bước 1: Nhập các giá trị N, A1, A2, ., AN
Bước 2: Gán i = 1, gán Max = A1
Bước 3 : Gán i = i + 1 ( tăng giá trị của i lên 1)
Thao tác Hình
Bắt đầu hay kết thúc thuật toánBắt đầu
Thao tác tính toán hoặc một phép gán
i = 1
a < bTrueFalse Rẽ nhán theo điều kiện
Đưa ra S Nhập, xuất dữ liêu cho thuật toán
Trang 3Bước 4: Nếu i > N thì Max là lớn nhất và đến bước 7, trái lại đến bước 5
Bước 5: Nếu Ai > Max thì Max = Ai
Bước 6: Quay lại bước 3
Bước 7: Kết thúc
4.3 Kiểm tra xem A có thuộc dãy X1, X2, ,XN hay không?
(Thuật toán tìm kiếm tuần tự)
Bước 1: Nhận các giá trị N, X1, X2, ., XN
Bước 2: Gán i = 1
Bước 3: Nếu i > N thì sang bước bước 5, trái lại đến bước 4
Bước 4: Nếu A = Xi thì đến bước 5, trái lại tăng i lên 1 và quay lại bước 3 Bước 5: Nếu i > N thì thông báo A không thuộc dãy X1, X2, ,XN, trái lại
thông báo A là phần tử thứ i trong dãy
Bước 4: Nếu i > N thì sang bước 8, trái lại đến bước 5
Bước 5: Thực hiện S = S + Xi (cộng Xi vào S)
Bước 2: Nếu M = N thì sang bước 5, trái lại đến bước 3
Bước 3: Nếu M > N thì M = M - N, trái lại N = N - M
Bước 4: Quay lại bước 2
Bước 5: ƯSCLN của M và N là M
Bước 6: Kết thúc
Trang 4Biều diễn thuật toán ƯSCLN bằng sơ đồ khối
5 Bài tập chương 1
5.1 Hãy biểu diễn các thuật toán trong mục 4.1 đến 4.3 bằng sơ đồ khối
5.2 Hãy trình bày thuật toán tìm phần tử nhỏ nhất trong dãy số A1, A2, Andưới dạng liệt kê và sơ đồ khối
5.3 Hãy trình bày thuật toán tính tổng các số chẵn trong dãy số A1,A2, Andưới dạng liệt kê và sơ đồ
5.4 Hãy đề xuất một thuật toán để kiểm tra một số nguyên dương có phải làmột số nguyên tố hay không?
Gợi ý: N được gọi là số nguyên tố nếu nó chỉ chia hết cho 1 và chính nó Nếu ta
tìm được một số k (2 <= k <= N-1) bất kỳ mà N chia hết cho k thì ta kết luận N khôngphải là số nguyên tố, trái lại N là số nguyên tố
BeginNhập a, b
a == b True
a > bFalse
Trang 55.5 Hãy đề xuất một thuật toán kiểm tra một số nguyên dương có phải là sốchính phương hay không?
Gợi ý: Theo định nghĩa, N đươc gọi là số chính phương nếu căn bậc hai của N
là một số nguyên <=> N = k2 (k là một số nguyên) Như vậy ta đi tìm số k nếu tìmđược k thì N là chính phương, trái lại N không phải là chính phương
5.6 Thiết kế thuật toán kiểm tra một số nguyên dương có phải là số đối xứnghay không?
Gợi ý: Thực hiện đảo ngược số cần kiểm tra, sau đó so sánh số đảo ngược với
số cần kiểm tra, nếu bằng nhau thì kết luật số đó là số đối xứng, trái lại kết luận khôngphải là đối xứng
VD: 2435 số đảo ngược là 5342
5.7 Thiết kế thuật toán tính tổng các chữ số của một số nguyên dương
Gợi ý: Tách từng chữ số của số nguyên, mỗi lần tách được ta cộng số tách được vào
biến tổng TG, xuất phát TG = 0
- Để tách được chữ số cuối cùng của số nguyên ta chia số nguyên đó cho 10 lấy phần dư
- Để loại bỏ chữ số cuối cùng của số nguyên ta chia số nguyên đó 10 lấy phần nguyên.VD: 124 mod 10 = 4, 124 div 10 = 12;
5.8 Cho dãy số A1, A2, , An, Trình bày thuật toán sắp xếp lại dãy này theothứ tự không giảm
Bước 5: Hoán vị giá trị giữa Ai và Ak
Bước 6: i = i+1, quay lại bước 3
Bước 7: Kết thúc
5.9 Trình bày thuật toán kiểm tra số lần xuất hiện của số A trong dãy số X1, X2 Xn
Gợi ý: Nếu A = Xi (i =1 đến N) thì tăng số lần xuất hiện của A lên 1
Trang 6CHƯƠNG 2
CÁC KIỂU DỮ LIỆU CƠ BẢN & CÁC PHÉP TOÁN TRÊN CÁC DỮ LIỆU
TÓM TẮT LÝ THUYẾT
1 Các kiểu dữ liệu cơ bản:
Đó là các kiểu dữ liệu mà trên cơ sở các kiểu này ta xây dựng các kiểu phức tạp hơn.1.1 Kiểu số nguyên:
Gồm các số nguyên nằm trong phạm vi nào đấy tuỳ theo tên kiểu:
Tên kiểu DL trong Pascal Số byte Miền giá trị
Gồm các số thập phân hữu hạn nằm trong phạm vi nào đấy tuỳ theo tên kiểu
Tên kiểu DL trong Pascal Số byte Miền giá trị
Chú ý: Trong Pascal thường dùng kiểu Real: là kiểu số thực 6 byte có giá trị
tuyệt đối nằm trong khoảng từ 2.9E-39 đến 1.7E+38, với phần định trị 11 đến 12 chữ
số có nghĩa
Có hai cách viết số thập phân:
- Viết dạng dấu phẩy tĩnh: viết như thông thường nhưng thay dấu phảy bằng dấu chấm
- Viết dạng dấu phẩy động: viết số thập phân dưới dạng luỹ thừa 10: m 10n, trong đó
m là số thập phân, n là số nguyên Sau đó viết m ở dạng dấu phẩy tĩnh, còn 10n đượcthay bằng En
Ví dụ: số -102,4567 được viết ở dạng dấu phẩy tĩnh là -102.4567, được viết ở dạng
dấu phẩy động là -1.024567E+2 hoặc -1024.567E-1.
Trang 7Trên các toán hạng kiểu số (nguyên hoặc thực) bao gồm 4 phép toán cơ bản như:
Chú ý: -Trong Pascal phép chia (/) trả lại kết quả thuộc kiểu Real.
- Đối với số nguyên, phép toán div chia lấy phần nguyên và phép mod chia lấy phần dư.
Có 4 phép toán Logic trên kiểu dữ liệu Boolean
Trang 8TRUE TRUE FALSE TRUE TRUE FALSE
để ưu tiên tính các biểu thức trong ngoặc trước
Ví dụ:Biểu thức số viết theo toán học (xy)(x2x 2)y(y3)
được viết theo NNLT ((x + y) *((x - 2) + (y +3))) / (2 *x +y)
Biểu thức logic y < x < 100 viết là (y < x) and (100 > x)
f/ ((10- 2 > 7 ) or ( 4 > 5)) and ( TRUE = TRUE) = ?
4.3 Hãy viết các biểu thức sau đây theo qui định của Pascal
y x
x z z
y x
3
)1(
)12(2)(
Trang 91 Từ khoá
Pascal có một số từ vững riêng được gọi là từ khoá (key word) Với những từ
khoá này người dùng phải viết đúng cú pháp, không được dùng nó vào việc khác,không được đặt tên biến trùng với từ khoá
Chú ý: Trong Pascal không phân biệt chữ thường và chữ hoa(In), các từ khoá
có thể viết bằng chữ thường và hoa điều được.
2 Các tên chuẩn
Các tên chuẩn là tên một số đối tượng (biến, hằng, kiểu, hàm, thủ tục) mà ngônngữ lập trình đã định nghĩa trước Khi dùng chúng không cần phải khai báo Các tênchuẩn có thể định nghĩa lại, tuy nhiên nên để chúng như đã được đặt để tránh nhầm lẫn
VD: Integer, Char, Read, Writeln, PI, Cos
3 Tên tự đặt
Các tên tự đặt là các tên mà người dùng đặt cho các đối tượng (hằng, biến, kiểu,chương trình con) trong chương trình của mình Chúng phải được khai báo trước khidùng Các tên tự đặt phải tuân theo các qui tắc sau:
- Chỉ được dùng 3 loại ký tự là chữ cái, chữ số và dấu nối chân
- Ký tự đầu tiên phải là ký tự chữ cái
- Không được trùng với các từ khoá
- Độ dài của tên không vượt quá 127 ký tự
4 Chương trình mẫu
Trong Pascal đã có sẵn một số chương trình con thường gặp được gọi là cácchương trình mẫu Các chương trình mẫu được quản lý trong các thư viện, trước khidụng các chương trình mẫu phải khai báo sử dụng thư viện chứa chúng
Dưới đây là một số chương trình mẫu thường dùng:
Abs(y) Lấy giá trị tuyệt đối của ySqr(y) Tính bình phương của ySqrt(y) Tính căn bậc hai của yChr(n) Trả lại ký tự có mã ASCII bằng n
Ord(ch) Trả lại mã ASCII của ký tự ch
Upcase(c) Trả lại chữ cái in hoa của ký tự c
Trang 10Clrscr Xoá màn hínhGotoXY( x, y) Đưa con trỏ Dos đến toạ độ x, yTextColor (mode ) Thiết lập mầu và chế độ hiển thị ký tựTextBackground ( col ) Thiết lập màu nên của ký tự
Readkey Đọc một ký tự từ bàn phímKeyPressed Kiểm tra bàn phím có nhấn hay khôngDelay(ms) Làm CPU ngừng làm việc trong ms
5 Lời giải thích và dấu chấm phẩy
Các lời giải thích được đưa vào bất kỳ vị trí nào trong chương trình để chochương trình dễ đọc, dễ hiểu hơn mà không ảnh hưởng đến phần khác Lời giải thíchđược đặt giữa hai dấu ngoặc móc { } hoặc giữa hai cụm dấu (* noi dung *)
Dấu chấm phẩy ( ; ) để làm dấu ngăn cách giữa các câu lệnh trong chương trình
6 Cấu trúc chung của chương trình Pascal
Một chương trình Pascal đầy đủ sẽ gồm các phần như sau:
6.1.Tiêu đề của chương trình
Phần này bao giờ cũng bắt đầu bằng từ khoá PROGRAM, tiếp theo sau là tên dongười lập trình đặt sao cho nó có một ý nghĩa nào đó đối với công việc của chươngtrình,cuối cùng kết thúc bằng dấu chấm phẩy;
Uses CRT; { khai báo thư viện }
Const { khai báo hằng }
Type { mô tả kiểu dữ liệu }
Var { khai báo chung }
Procedure { khai báo thủ tục }
Function { khai bào hàm }
Các mục khai báo trên có thể có hoặc không tuỳ thuộc vào từng bài toán cụ thể
Trang 116.3.Phần thân chương trình
Phần này bao giờ nằm gọn trong cặp từ khoá BEGIN END sau từ
khoá End là dấu chấm báo hiệu kết thúc chương trình Khác với các phần khác phần này bắt buộc phải có đối với mọi chương trình
Cấu trúc chung của một chương trình viết bằng Pascal như sau:
Program
Uses
Const
Type .
Var
Procedure
Function
BEGIN
Các câu lệnh
END.
7 Khai báo biến, lệnh gán
a Biến
Biến là đại lượng có thể thay đổi giá trị trong quá trình chương trình chạy Mỗi biến được khai báo với một tên ( tên biến ) và kiểu dữ liệu xác định Các biến được
khai báo trong phần khai báo và sau từ khoá Var
Cú pháp:
Var
Ten_Bien : Kieu_du_lieu ;
- Dấu hai chấm bắt buộc phải có để ngăn cách giữa phần tên biến và phần kiểu
dữ liệu, cuối dòng kết thúc bằng dấu chấm phẩy
- Nếu có nhiều biến cùng kiểu dữ liệu thì có thể khai báo cùng một dòng bằng cách thêm vào dấu phẩy để ngăn cách giữa hai tên biến
VD: Var X1, X2 : Real ; A, B, C : Integer ;
b Lệnh gán
Lệnh gán dùng để gán giá trị của một hằng, một biểu thức cho một biến Phép
gán được ký hiệu :=
Cú pháp: Tên_Biên := Biểu_thức ;
Trang 128.1.Hãy viết 15 từ khoá trong Pascal
8.2.Hãy đưa ra 5 tên chuẩn trong Pascal và ý nghĩa của chúng
8.3.Hãy cho biết trong các tên sau, tên nào không đúng qui tắc trong Pascal vàgiải thích tại sao ?
a Toi_Thu b Ten-bien c Bien1
8.4.Hãy viết chương trình in ra giữa màn hình dòng chữ Well come to Pascal
với màu đỏ và nhấp nháy.
Gợi ý: Sử dụng hàm Gotoxy, TextColor
8.5.Hãy viết chương trình in ra màn hình các hình sau:
8.6.Hãy viết chương trình tính giá trị căn bậc bốn của 21
8.7.Hãy viết chương trình tính biểu thức (23120,534) 1.2
x := 8 / 2 ;end
Trang 138.10.Hãy xác định kết quả hiển thị trên mành hình sau khi thực hiện chươngtrình sau:(không sử dụng máy tính)
8.12.Hãy viết chương trính hoán vị giá trị của hai biến a, b
8.13.Hãy viết chương trình để thực hiện các công việc sau;
- Nhập một số thuộc bảng mã ASCII, in ra ký tự đại diện cho số đó
- Nhập một ký tự từ bàn phím, hiển thị mã ASCII của ký tự đó
Gợi ý: Sử dụng hàm Ord và Chr để chuyển đổi từ ký tự sang số và ngược lại
8.14.Hãy xác định kết quả hiển thị trên màn hình sau khi thực hiện chươngtrình sau:(không sử dụng máy tính)
Readln;
End.
8.15.Hãy viết chương trình tính chu vi và diện tích của đường tròn, hình vuông
Trang 14Dạng 1: If điều_kiện then câu_lệnh_1;
Dạng 2: If điều_kiện then câu_lệnh_1 Else câu_lệnh_2 ;
Trong đó điều kiện là một biểu thức logic còn câu lệnh có thể là câu lệnh đơn
hoặc câu lệnh phức
Máy thực hiện:
Gặp dạng 1 máy kiểm tra giá trị của biểu thức điều_kiện, nếu đúng thì thực hiện
câu_lệnh_1
Gặp dạng 2 máy tính kiểm tra giá trị của biểu thức điều_kiện, nếu đúng thì thực
hiện câu_lệnh_1, sai thực hiện câu_lệnh_2
gtn : cln
end;
Trang 15Dạng 2:
case biến_chọn of
gt1 : cl1;
gt2 : cl2;
gtn : cln
Else cln+1;
end;
Trong đó:
- Case, of, end, else là các từ khoá của cấu trúc
- cl1, cl2, cln+1 là các câu lệnh, nó có thể là các câu lệnh đơn hoặc câu lệnh phức
- Biến chọn là biến có kiểu dữ liệu số nguyên, ký tự, Boolean
- gt1, gt2, , gtn là các danh sách giá trị có thể có của biến chọn, mỗi phần từ của danhsách có thể là biểu thức, hằng, miền
Hoạt động:
Sự thực hiện các câu lệnh cl1, cl2, , cln trong Case-Of phụ thuộc vào giá trị của
biến chọn.
- Nếu gti là danh sách đầu tiên chứa giá trị của biến chọn thì máy sẽ thực hiện câu lệnh
cli sau đó thoát khỏi cấu trúc
- Trong trường hợp không có danh sách nào chứa giá trị của biến chọn thì :
+ Với dạng 1 máy sẽ không thực hiện câu lệnh cli nào và sẽ thoát khỏi cấu trúc.+Với dạng 2 máy sẽ thực hiện câu lệnh cli+1 rồi thoát khỏi cấu trúc
VD:
Case today of
2 4,7: writeln(' hoc Pascal ');
5,6: writeln(' hoc tieng Anh')
else writeln(' di chơi ');
end;
Trang 163.6.Viết chương trình giải và biện luận phương trình Ax2 + Bx +C =0
3.7.Chương trình kiểm tra ba số nguyên dương a, b,c (a, b,c được nhập từbàn phím) có thể tạo thành 3 cạnh của một tam giác hay không? nếu là 3 canhcủa một tam giác chương trình sẽ xác định tam giác đó thuộc tam giác cân,đều, vuông, thường
Trang 17write(' nhap so thu nhat ') ; Readln(a);
write(' nhap so thu hai ') ; Readln(b);
write(' nhap so thu ba ') ; Readln(c);
if (a< b + c) and (b < c+ a) and (c < a+b) then
begin
writeln( ' la 3 canh cua 1 tam giac ');
if (a = b) and (b = c) then writeln( ' la tam giac deu ')
else if( a = b) or (b = c) or (a = c) then
writeln( ' la tam giac can ') Else if (a*a = b*b + c*c) or (b*b = a*a + c*c) or ( c*c = b*b + a*a) then
writeln( ' la tam giac vuong ')
Else writeln(' la tam giac thuong ');
end
else writeln(' khong the la 3 can cua 1 tam giac ');
Readln; { dừng màn hình đến khi nhấn phím enter}
3.9.Viết chương trình nhập một số nguyên từ 0 đến 10 rồi đưa ra tiếng anh của
số đó (VD nhập vào là 1 thì đưa ra One)
3.10.Chương trình nhập một số nguyên n (1<= n <= 7) viết ra màn hình têncủa ngày trong tuần tương ứng với số n ( nếu n = 0 thi in ra chủ nhật)
Trang 181: writeln( ' chu nhat ');
2: begin writeln (' thu hai '); writeln(' chao co '); end ;
3: writeln( ' thu ba ');
4: writeln(' thu tu');
5: writeln( ' thu nam')6: writeln(' thu sau ');
7: begin writeln(' thu bay'); writeln(' cuoi tuan '); end
else writeln( ' nhap so khong thich hop ');
end;
END.
Trang 19Dang 1: For biến_chạy := cận_dưới To cận_trên Do Câu_lệnh ;
Dạng 2: For biến_chạy := cận_trên Downto cận_dưới Do Câu_lệnh ;
Hoạt động:
Dạng 1:
B1: Gán giá trị cận_dưới cho biến_chạyB2: Kiểm tra điều kiện (Biên_chạy > cận_trên ) ?
Nếu đùng sang B4, trái lại đến B3
B3: thực hiện câu_lệnh một lần sau đó tự động tăng giá trị của
biến_chạy lên một đơn vị và quay lại B2
B4: Kết thúc cấu trúc
Dạng 2:
B1: Gán giá trị cận_trên cho biến_chạyB2: Kiểm tra điều kiện (Biên_chạy < cận_dưới ) ?
Nếu đúng sang B4, trái lại đến B3
B3: thực hiện câu_lệnh một lần sau đó tự động giảm giá trị của
biến_chạy đi một đơn vị và quay lại B2B4: Kết thúc cấu trúc