Tải bản đầy đủ (.pdf) (135 trang)

Lap trinh pascal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (860.59 KB, 135 trang )



TRƯỜNG ĐẠI HỌC ĐÀ LẠT
F 7 G







GIÁO TRÌNH
KỸ THUẬT LẬP TRÌNH
PASCAL


NGUYỄN DANH HƯNG



2001
Kỹ thuật lập trình Pascal
-
1 -
MỤC LỤC
MỤC LỤC 1 -
LỜI NÓI ĐẦU 4 -
Chương I LÀM QUEN VỚI LẬP TRÌNH 5 -
I-1 CÁC KHÁI NIỆM MỞ ĐẦU: 5 -
I-2 BIẾN VÀ NHẬP DỮ LIỆU 7 -
I-3 XUẤT DỮ LIỆU 9 -


I.4 LỆNH GÁN VÀ BIỂU THỨC - 10 -
I-5 CÁC HÀM CHUẨN 12 -
I-6 CHỐNG LỖI VÀ SỬA LỖI 13 -
Bài đọc thêm Vẻ đẹp của giải thuật 14 -
BÀI TẬP CHƯƠNG I 16 -
Chương II THỦ TỤC và HÀM 18 -
II-1 LẬP TRÌNH VỚI THỦ TỤC 18 -
II.2 BIẾN TOÀN CỤC VÀ BIẾN ĐỊA PHƯƠNG 19 -
II.3 THỦ TỤC CÓ THAM SỐ - 21 -
II.4 HÀM - 22 -
II.5 PHƯƠNG PHÁP LẬP TRÌNH TỪ TRÊN XUỐNG 23 -
II.6 CHỐNG LỖI VÀ SỬA LỖI 24 -
BÀI TẬP CHƯƠNG II 26 -
Chương III CASE VÀ FOR 29 -
III-1 LẬP TRÌNH VỚI CẤU TRÚC CASE 29 -
Khái niệm hành động của chương trình Pascal 30 -
III-2 LẬP TRÌNH VỚI CẤU TRÚC FOR 31 -
III-3 CHỐNG LỖI VÀ SỬA LỖI: 35 -
BÀI TẬP CHƯƠNG III 39 -
Chương IV IF WHILE REPEAT…UNTIL 42 -
IV-1 BIỂU THỨC BOOLEAN 42 -
IV-2 LẬP TRÌNH VỚI CẤU TRÚC IF 42 -
IV-3 CẤU TRÚC VÒNG LẶP KHÔNG XÁC ĐỊNH 46 -
IV-4 ĐỆ QUY 53 -
IV-5 SỬA LỖI VÀ CHỐNG LỖI 55 -
BÀI TẬP CHƯƠNG IV 58 -
Chương V PHƯƠNG PHÁP LẬP TRÌNH - 64 -
V-1 PHÂN TÍCH VÀ ĐẶC TẢ VẤN ĐỀ: 64 -
V-2.CHỌN LỰA CẤU TRÚC DỮ LIỆU VÀ PHÁT TRIỂN THUẬT
TOÁN: 65 -

V-3.MÃ HOÁ CHƯƠNG TRÌNH: 66 -
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
2 -
V-4 THỰC HIỆN VÀ THỬ CHƯƠNG TRÌNH 68 -
V-5 BẢO TRÌ CHƯƠNG TRÌNH: - 68 -
BÀI TẬP CHƯƠNG V - 69 -
Chương VI MỞ RỘNG KIỂU DỮ LIỆU THỨ TỰï - 70 -
VI –1 KIỂU THỨ TỰ DO NGƯỜI DÙNG ĐỊNH NGHĨA 70 -
VI-2 KIỂU MIỀN CON 72 -
BÀI TẬP CHƯƠNG VI 74 -
Chương VII MẢNG và CHUỖI 75 -
VII-1 MẢNG: 75 -
Đònh nghóa và khai báo mảng 75 -
Truy xuất mảng 75 -
Mảng và vòng lặp for 76 -
VII-2 SẮP XẾP - 78 -
VII-3 TÌM KIẾM 82 -
Tìm tuần tự - 82 -
Tìm kiếm nhò phân 83 -
KHI NÀO NÊN DÙNG MẢNG? - 85 -
VII-4 CHUỖI - 86 -
VII-5 SỬA LỖI VÀ CHỐNG LỖI: - 91 -
Từ khoá Pascal mới 93 -
Khái niệm mới 93 -
BÀI TẬP CHƯƠNG VII 94 -
Chương VIII KIỂU RECORD 97 -
VIII-1 RECORD CÓ CẤU TRÚC CỐ ĐỊNH: 97 -
VIII-2 RECORD CÓ CẤU TRÚC THAY ĐỔI: 99 -

Từ khoá Pascal mới 100 -
Khái niệm mới - 100 -
BÀI TẬP CHƯƠNG VIII 101 -
Chương IX KIỂU FILE - 102 -
IX-1. FILE VĂN BẢN - 102 -
IX-2 FILE ĐỊNH KIỂU: 105 -
IX-3 TRUY CẬP NGẪU NHIÊN TRÊN FILE ĐỊNH KIỂU - 107 -
IX-4 TRỘN FILE - 110 -
IX-5 CHỐNG LỖI VÀ SỬA LỖI: - 112 -
Từ khoá Pascal mới 112 -
Khái niệm mới - 113 -
BÀI TẬP CHƯƠNG IX - 114 -
Chương X KIỂU TẬP HP (SET) 115 -
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
3 -
X-1 KIỂU TẬP HP: - 115 -
Ví dụ - 115 -
X-2 LẬP TRÌNH VỚI KIỂU TẬP HP: - 116 -
Từ khoáù Pascal mới - 119 -
Khái niệm mới - 119 -
BÀI TẬP CHƯƠNG X - 120 -
PHỤ LỤC A - 121 -
CÁC THÔNG BÁO LỖI CỦA TURBO PASCAL KHI BIÊN DỊCH
121 -

PHỤ LỤC B - 131 -
CÁC THÔNG BÁO LỖI KHI CHẠY CHƯƠNG TRÌNH - 131 -
TÀI LIỆU THAM KHẢO - 133 -



Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
4 -
LỜI NÓI ĐẦU


Ngày nay cùng với sự phát triển mạnh mẽ của Tin học, lập trình trở nên
một kỹ năng cần thiết cho mọi cán bộ khoa học kỹ thuật. Giáo trình này
nhằm giúp cho sinh viên Vật lý tìm hiểu về kỹ thuật lập trình.

Ngôn ngữ được chọn là Pascal chuẩn, có bổ sung một vài phần mở rộng
của TurboPascal. Mặc dù ngày nay có nhiều ngôn ngữ hiện đại hơn,
Pascal vẫn là ngôn ngữõ thích hợp nhất cho một giáo trình căn bản về
lập trình. Các kỹ thuật lập trình chủ yếu được trình bày tương đối đầy
đủ, ngoại trừ các kỹ thuật dùng con trỏ. Các ví dụ được chọn lọc ở
nhiều mức độ khác nhau, không chỉ dừng ở mức độ minh hoạ ngôn ngữ,
mà còn để cho sinh viên làm quen với những thuật toán thông dụng có
độ phức tạp vừa phải.

Ngoài ra qua thực tế giảng dạy, chúng tôi nhận thấy khi lập trình sinh
viên phạm rất nhiều lỗi cơ bản. Do đó trong giáo trình này một phần
thích đáng được dành cho các kỹ thuật sửa lỗi và chống lỗi. Hy vọng là
phần này sẽ giúp ích nhiều cho các bạn sinh viên.

Giáo trình nay được in lần đầu vào năm 2001. Trong lần tái bản này,
chúng tôi sửa chữa những điểm sai sót và bổ sung môt vài điểm mới.
Đặc biệt là chúng tôi đưa vào một số lượng khá lớn các bài tập. Những

bài tập này được chọn lọc để sinh viên áp dụng kỹ thuật lập trình trong
việc giải quyết các bài toán khoa học kỹ thuật.

Chúng tôi chân thành cảm ơn sự góp ý của các đồng nghiệp cũng như
các bạn sinh viên để làm cho giáo trình ngày càng hoàn thiện.


Đà lạt tháng 5-2004


Nguyễn Danh Hưng Huỳnh Thò Thu Thuỷ

Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
5 -
CHƯƠNG I LÀM QUEN VỚI LẬP TRÌNH

I-1 CÁC KHÁI NIỆM MỞ ĐẦU:
Chúng ta sẽ dùng một vài chương trình rất đơn giản để minh hoạ các
khái niệm của Pascal.
program Dautien; { Đây là chương trình đầu tiên}
begin
writeln(‘Hello ‘)
end.

Từ khoá đầu tiên của mọi chương trình Pascal (dù không bắt buộc) là
program. Trong giáo trình này các từ khoá sẽ được in đậm. Sau từ
khoá program là tên của chương trình. Tên của chương trình phải đặt
theo qui tắc đặt tên.

Tên phải bắt đầøu bằng một chữ cái và có thể chứa một dãy bất kỳ các

chữ cái và chữ số.

Chú ý là trong tên không được phéùp có khoảng trống. Nếu cần tách các
từ có thể dùng dấu nối _. Ký tự chuẩn của Pascal là bảng mã ASCII do
đó các tên tiếng Việt có dấu cũng là không hợp lệ. Tên cũng không
được trùng với các từ khoá của Pascal, do đó các từ này còn được gọi là
từ dành riêng.
Ví dụ: R2D2 So_tien là các tên hợp lệ
2XY So tien Số tiền là các tên không hợp lệ

Các chú thích được đặït trong cặp dấu {} hoặc (* *)
Ví dụ: { Đây là chú thích }
(* Đây cũng là chú thích *)
Dòng đầu tiên của một chương trình gọi là đầu chương trình. Một dấu
chấm phẩy( ; )được dùng để ngăn cách nó với dòng kế tiếp.
Ví dụ : program Dautien;
Chúng ta có sơ đồ cú pháp cho đầu chương trình như sau:
đầu chương trình
program Ỉ tên Ỉ;

Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
6 -
Trong chương trình Dautien, vì không có tính toán gì cả nên chúng ta
không dùng tới biến. Do đó ngay sau phần đầu chương trình, chúng ta
đi ngay đến phần lệnh. Phần này bắt đầu bằng từ dành riêng begin .
Phần lệnh bao gồm dãy các lệnh. Việc in ra một hàng trong Pascal

được thực hiện bởi một thủ tục chuẩn là writeln (đọc là write line).
Ví dụ:
writeln (‘Mọi thứ nằm trong dấu nháy sẽ được in ra ‘)
(Văn bản trong dấu nháy có thể là tiếng Việt, phụ thuộc vào hệ cài đặt)
Chương trình Pascal được kết thúc bằng từ dành riêng end. Chú ý từ
end kết thúc chương trình luôn có dấu chấm đi theo.

program Thu_hai;
{ Minh hoạ cách dùng ;}
begin
writeln(‘Xin chào ‘);
writeln( ‘ Bạn ăn cơm chưa? ‘)
end.
Kềt quả chạy chương trình này là:

Xin chào
Bạn ăn cơm chưa?

Chú ý là sau lệnh writeln đầu tiên có dấu ; . Dấu ; trong Pascal dùng để
ngăn cách giữa hai câu lệnh, không phải là phần bắt buộc của câu lệnh.
(Đây là điểm khác biệt với ngôn ngữ C. )
Để in ra không xuống hàng, ta dùng thủ tục chuẩn write .
program Mot_hang;
{Minh hoạ cách dùng write}
begin
write (‘ Những từ này’);
write ( ‘sẽ được in ra’);
writeln(‘trên cùng một hàng’)
end.
Kết quả chạy chương trình trên là



Những từ này sẽ được in ra trên cùng một hàng.
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
7 -




I-2 BIẾN VÀ NHẬP DỮ LIỆU

Program Nhapso;
{ Nhập và và in ra một số }
var So : integer; { Khai báo một biến}
begin
writeln(‘ Nhập vào một số nguyên ‘);
readln(So);
writeln(‘Số bạn nhập vào là:’ , So);
end .


Nhập vào một số nguyên
15
Số bạn nhập vào là: 15

Kiểu dữ liệu
Biến phải được khai báo thuộc một kiểu dữ liệu nào đó.
Bốn kiểu dữ liệu nguyên thuỷ của Pascal là integer, char, boolean và

real.
Các kiểu integer, char và boolean được gọi là các kiểu thứ tự( hay còn
gọi là kiểu vô hướng đếm được)

Qui tắc: Biến nào trò nấy, tức là kiểu dữ liệu của biến và trò của nó phải
phù hợp với nhau.
Việc khai báo biến đước bắt dầu bằng từ dành riêng var (viết tắt của từ
variable), tiếp đó là danh sách các biến cùng với kiểu dữ liệu tương ứng
(tên biến được phân cách với kiểu dữ liệu bởi dấu :) , các biến khai báo
được phân cách bởi dấu ; .
var sothutu: integer;
diem: real;
xeploai: char;
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
8 -
Chúng ta có thể khai báo nhiều tên biến với cùng một kiểu dữ liệu, lúc
này các tên biến cách nhau bởi dấu , .
var sothutu, vithu , siso : integer;
dtoan, dly, dhoa : real;
xeploai: char;
tongso, diemtb: real;

Chú ý là ngôn ngữ Pascal không phân biệt chữ hoa và chữ thường, do
đó các tên biến như sau là giống nhau.
Diemtb diemtb DIEMTB diemTB

Với khai báo trên, chúng ta có thể viết lại như sau:


var sothutu, vithu , siso : integer; dtoan, dly, dhoa : real;xeploai:
char;
hoặc
var sothutu, vithu, siso : integer; dtoan, dly, dhoa :
real;xeploai: char;
nhưng với cách viết này, chương trình của chúng ta sẽ trông rất lộn xộn,
khó đọc và rất khó sửa lỗi.

Các cách nhập dữ liệu

readln có thể chứa danh sách nhiều biến, ngăn cách bằng dấu phẩy.
readln(so, tuoi, luong)
Khi nhập dữ liệu integer hoặc real các khoảng trống được bỏ qua. Kết
thúc nhập bằng phím Enter
Ví dụ: readln(a,b,c)
Nếu nhập 5 6 7
thì a =5, b=6,c= 7
Khi nhập dữ liệu char, khoảng trống sẽ được tính.
readln(Chu1,Chu2)
Nếu nhập AB thì Chu1 = ‘A’, Chu2= ‘B’ nhưng nếu nhập A B thì
Chu1 = ‘A’, Chu2= ‘ ’.
readln không kèm theo biến tức là có dạng readln; đòi hỏi người nhập
gõ phím Enter.
Một dạng khác của lệnh nhập dữ liệu là read . Lệnh này không đòi hỏi
kết thúc nhập bằng phím Enter (thường dùng khi đọc dữ liệu từ tập tin).
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
9 -


Qui tắc: Phải đảm bảo nhập đủ dữ liệu






I-3 XUẤT DỮ LIỆU

program Tinhtoandongian;
{Minh hoạ việc biểu thức được tính trước khi xuất}
var So1,So2 :real;
begin
readln (So1,So2);
writeln(So1,So2);
writeln(So1+So2, So1-So2);
writeln(So1*So2, So1/So2);
end.

Đònh dạng dữ liệu xuất
Dữ liệu xuất nếu không có chỉ ra đònh dạng sẽ thuận theo đònh dạng
mặc nhiên của Pascal.
program Dinhdangmn;
{Trình bày đònh dạng mặc nhiên của Pascal}
var Chu : char;
Sothuc : real;
Songuyen :integer;
begin
writeln(‘ Nhập vào một chữ cái, một số thực và một số nguyên’);
readln(Chu,Sothuc,Songuyen);

writeln(Chu);
writeln(Sothuc);
writeln(Songuyen)
end.

Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
10 -
Nhập vào một chữ cái, một số thực và một số
nguyên
B 281.5 66 Å|
B
2.8150000000000000E+02
66

Khi xuất dữ liệu, số nguyên và số thực được canh biên phải với một số
khoảng cố đònh gọi là độ rộng trường. Thường độ rộng trường in cho số
thực là 16.
Chúng ta có thể đònh dạng lại bằng cách dùng dạng lệnh có đặït độ rộng
trường in.
Với số nguyên ta viết theo dạng writeln(I:n), trong đó n là độ rộng
trường in. Nếu n nhỏ hơn số chữ số được in ra, Pascal sẽ in đủ trò I(tức
là không có khoảng trống nào).Nếu n lớn hơn số chữ số, số sẽ được in
ra canh biên phải. Ví dụ , nếu I = 123 ta có
writeln(‘Số nguyên = ’,I:1)
Ỉ Số nguyên=123
writeln(‘Số nguyên= ’,I:6)
Ỉ Số nguyên= 123


Với số thực ta viết writeln(R:n:m) trong đó n là độ rộng, m là số chữ số
nằm sau dấu chấm thập phân. Ví dụ nếu R = 123.456 thì
writeln(‘Số thực = ’,R:10:4)
Ỉ Số thực = 123.4560
writeln(‘Số thực = ’,R:10:2)
Ỉ Số thực = 123.46
Chú ý trong ví dụ cuối cùng ta thấy số thực được làm tròn.
Lệnh writeln không có đối số tức là dạng writeln; sẽ xuốâng dòng mới.


I.4 LỆNH GÁN VÀ BIỂU THỨC
Xét chương trình sau:
program Tinhdientich;
{ Minh họa cách dùng lệnh gán }
var dai, rong, dientich : real;
begin
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
11 -
write (‘Nhập vào chiều dài : ‘);
readln(dai);
write (‘Nhập vào chiều rộng : ‘);
readln(rong);
dientich := dai * rong;
writeln (‘ Diện tích hình chữ nhật : ‘, dientich:8:2);
end.
Lệnh gán có cú pháp :
biến := biểu thức ;
Biểu thứùc trong Pascal có thể là một hằng, một biến, một lời gọi hàm

hoặc là môt dãy bao gồm các toán tử và toán hạng.

Các toán tử nguyên và toán tử thực
Toán tử thực

Toán tử Ký hiệu Ví dụ
Phép cộng + gia + thue
Phép trừ - họcphi - hocbong
Phép nhân * dai * rong
Phép chia / x / 2.0

Toán tử nguyên
Toán tử Ký hiệu Ví dụ
Phép cộng + socon + 2
Phép trừ - songay - 1
Phép nhân * 5 * 3
Phép chia nguyên div 10 div 3 (=3)
Phép lấy phần dư mod 10 mod 3 ( = 1)

Nếu biểu thức chứa số nguyên và số thực thì kết quả sẽ là số thực. Kết
quả của phép chia thực (/) là số thực.

Độ ưu tiên toán tử

* / div mod :Các toán tử này có độ ưu tiên cao hơn
+ -

Có thể thay đổi độ ưu tiên toán tử bằng cách dùng dấu ngoặc.
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal

-
12 -

I-5 CÁC HÀM CHUẨN

Các hàm số học
sqr sqrt Hàm bình phương và hàm căn bậc
hai
sin cos arctan Các hàm lượng giác
exp ln Hàm mũ và hàm logarít tự nhiên
abs Hàm lấy giá trò tuyệt đối
round Hàm làm tròn : round(3.5) = 4
trunc Hàm lấy phần nguyên:
trunc(3.5)=3

Các hàm thứ tự
succ Hàm lấy giá trò kế tiếp: succ(‘A’)=’B’
pred Hàm lấy giá trò đứng trước:
pred(‘B’)=’A’
ord Hàm lấy số thứ tự : ord(‘A’) = 65
chr Hàm lấy ký tự ứng với số thứ tự :
chr(65)=’A’
Các hàm boolean
odd Trả về true nếu số nguyên là lẻ
eoln Trả về true nếu hết dòng.
eof Trả về true nếu hết tập tin

Để sử dụng các hàm , chúng ta phải dùng lời gọi hàm gồm tên hàm và
đối đặt trong dấu ngoặc.
Các hàm như round và trunc được gọi là các hàm chuyển kiểu vì chúng

chuyển dữ liệu từ kiểu này sang kiểu khác.

Khai báo hằng
Để thuận tiện trong tính toán, trong chương trình đôi khi cần khai báo
hằng. Xét chương trình sau:
program Tinh chuvi_hinhtron;
const pi = 3.1416
var chuvi, duongkinh : real;
begin
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
13 -
write(‘Nhập vào đường kính: ‘);
readln(duongkinh);
chuvi := pi * duongkinh;
writeln(‘Chu vi của hình tròn là:’,chuvi)
end.
Cú pháp khai báo hằng
const tên hằøng = trò;



I-6 CHỐNG LỖI VÀ SỬA LỖI

Sửa lỗi (debug) là tìm ra lỗi sai trong chương trình.
Chống lỗi (antibug)là viết chương trình sao cho ít gặp lỗi.
Chống lỗi và sửa lỗi là hai việc cực kỳ quan trọng trong kỹ thuật lập
trình. Trong giáo trình này, chúng ta sẽ dành một phần thích đáng cho
các kỹ thuật này.

Các lỗi nói chung chia làm hai loại: lỗi cú pháp và lỗi ngữ nghóa. Các
lỗi cú pháp(syntax error) thường được phát hiện ngay lúc biên dòch. Ví
dụ lỗi thường gặp là thiếu dấu ; để ngăn cách hai lệnh. Lúc biên dòch ,
sẽ có thông báo lỗi:
; expected
Các lỗi này thường dễ sửa. Ngay từ đầu bạn nên rèn luyện thói quen
viết đúng cú pháp.
Các lỗi trầm trọng hơn là lỗi lúc chạy chương trình(run-time error). Ví
dụ thường gặp là lỗi chia cho số 0:
Divided by zero.
Các lỗi này cũng có thể sửa được vì máy tiùnh có báo lỗi. Nguy hiểm
nhất là các lỗi ngữ nghóa(logic). Những lỗi này khó sửa hơn vì chương
trình không sai về mặt cú pháp mà chỉ sai về ý nghóa. Lỗi càng khó
phát hiện vì có thể chỉ gặp khi dùng với một số dữ liệu nào đó. Do đó
thử chương trình với nhiều dữ liệu khác nhau là rất quan trọng.
Quy tắc vàng về sửa lỗi
Đừng sửa cái không hư. Đừng làm những thay đổi ngẫu nhiên.

Một vài lỗi thường gặp trong chương này:
- Khởi tạo khi khai báo biến (như kiểu ngôn ngữ C)
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
14 -
Ví dụ var Trial :=: integer;
Test: char; Test := ‘A’;
- Dùng lệnh gán không hợp lệ
A:=B := C:=D :E := 0;
- Dùng sai đối của hàm, ví dụ dùng đối số âm với hàm sqrt
Tóm tắt:

Trong chương này chúng ta đã biết các khái niệm sau:
• Cấu trúc của một chương trình Pascal gồm có
phần đầu chương trình
phần khai báo hằng
phần khai báo biến
phần lệnh.
- cách đặt tên chương trình, tên hằng, biến
- lệnh gán và biểu thức
- các hàm chuẩn
Từ khoá Pascal mới
program begin var end write writeln
read readln integer char boolean real
:= div mod const
sqr sqrt
sin cos arctan
ln exp
abs round trunc
pred succ ord chr

Khái niệm mới
chương trình hằng biến biểu thức toán tử
nhập xuất giải thuật

Bài đọc thêm Vẻ đẹp của giải thuật

Một chương trình đẹp là điều chúng ta luôn mơ ước. Một chương trình
là đẹp nếu thuật toán của nó đơn giản và gọn gàng, nhưng giải quyết
vấn đề một cách trong sáng và toàn vẹn. Tuy nhiên, một giải thuật đẹp
không chỉ giới hạn trong phạm vi lập trình. Chúng ta xét một vài ví dụ
trong đó có giải thuật đẹp.


Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
15 -
Xét bài toán sau: Một người đạp xe đạp đang ở cách nhà 2km. Người
đó đạp xe về nhà với vận tốc không đổi 20km/h. Tại thời điểm này một
con ruồi đậu trên mũi người đi xe đạp, bay về nhà rồi quay ngay lại
chỗ người đi xe đạp rồi lại quay về nhà và cứ tiếp tục như thế cho đến
khi người đi xe đạp về đến nhà và kẹp chết con ruồi. Giả sử con ruồi
bay với vận tốc không đổi là 40km/h. Hãy tìm quãng đường con ruồi
đã bay?
Trước khi đọc tiếp bạn hãy tự giải bài toán này.

Lời giải là như sau. Vì con ruồi bay với vận tốc không đổi nên ta có
Quãng đường = Vận tốc * Thời gian
Mặt khác từ chuyển động đều của người đi xe đạp ta có:
Thơì gian = 2/ 20 = 0,1h
Vậy quãng đường con ruồi đã bay là:
0,1*40 = 4 km
Rõ ràng đây là một lời giải rất đẹp.

Xét ví dụ khác. Năm 1686, khi Gauss 9 tuổi, thầy giáo của Gauss
muốn cho cả lớp làm việc trọn buổi sáng, đã ra bài tập sau đây.

Cộng tất cả các số từ 1 đến 100.

Không ngờ chỉ một chút sau khi ra bài tập, Gauss đã giải xong bài
toán. Bạn thử nghó xem Gauss đã làm như thế nào?


Cách giải của Gauss là chia các số từ 1 đến 100 thành 50 cặp,mỗi cặp
gồm 2 số cách đều nhau từ 2 biên.Tổng của mỗi cặp là 101 và có tất
cả 50 cặp như vậy. Do đó tổng cần tìm là
50 * 101 = 5050

Bạn có thể nói là: Lời giải đó dễ hiểu, nhưng nghó ra mới khó. Dù sao,
cố gắng thử bước đầu tiên bằng cách tự đặt câu hỏi ‘Có công thức để
giải bài toán này, và những công thức khác tương tự không?” cũng
không phải là quá khó. Dần dần bạn sẽ quen suy nghó và tự tìm ra được
những lời giải đẹp.

Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
16 -
BÀI TẬP CHƯƠNG I
1.Viết chương trình tính năng lượng theo công thức E= mc
2
khi biết
khối lượng.
2. Độ rọi của một nguồn sáng tới một điểm giảm tỉ lệ nghòch với
bình phương khoảng cách. Viết chương trình nhập vào khoảng
cách x,y và độ rọi ở khoảng cách x, chương trình tính ra độ rọi ở
khoảng cách y.
3.Viết chương trình tính quãng đường ra km khi biết số năm ánh
sáng.
4.Thay mỗi cặp lệnh gán dưới đây bằng một lệnh gán
a) l:=a+5;
l:=b-2;
b) m := a+5;

m:=m*2;
c) n:=2*n-2;
n:= n div 2 –3;
5.Viết chương trình nhập vào khoảng thời gian tính bằng giây rồi đổi
ra giờ, phút, giây.
6.Cho tam giác vuông ABC vuông ở A. Các cạnh góc vuông là a và
b được tính theo cạnh huyền c theo các công thức sau.
a = c cosθ
b= c sinθ
Chương trình sau tính các cạnh a và b theo cạnh huyền c và góc θ
nhập vào. Chương trình có chạy không? Có cho kết quả đúng
không? Tại sao?

program tamgiac;
var a,b,c, theta:real;
begin
write (‘Nhập vào chiều dài cạnh huyền’);
readln(c);
write (‘Nhập vào goc theta đo bằng độ’);
readln(theta);
a = c * cos(theta);
b = c * sin(theta);
writeln(‘Chiều dài cạnh a là:’,a);
writeln(‘Chiều dài cạnh b là:’,b);
end.
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
17 -




7.Chu kỳ của con lắc đơn được cho bởi công thức
g
L
T
π
2=

trong đó L là chiều dài và g là gia tốc trọng trường. Viết chương trình
tính chu kỳ T với chiều dài con lắc do người dùng nhập vào.

8.Khoảng cách giữa hai điểm (x1,y1) và (x2,y2ø) trong mặt phẳng
được tính theo công thức:
22
)21()21( yyxxd −+−=
Viết chương trình tính khoảng cách với toạ độ hai diểm được nhập
vào.

9.Các kỹ sư thường đo tỉ số giữa hai công suất bằng decibel. Tỉ số
giữa hai công suất tính theo decibel là
1
2
10
log10
P
P
dB =

trong đó P

2
là mức công suất đang xét và P
1
là mức công suất quy
chiếu. Giả sử P
1
là 1 milliWatt; viết chương trình nhận vào giá trò P
2

tính ra giá trò dB.

10.Tần số cộng hưởng của một mạch thu tín hiệu cho bởi
LC
f
π
2
1
0 =

Viết chương trình tính f
0
theo L và

C nhập vào.

11.Lực hấp dẫn giữa hai vật có khối lượng m
1
và m
2
được cho bởi


2
21
r
mGm
F =

trong đó G là hằng số hấp dẫn (6,672x10
-11
Nm
2
/kg
2
), và r là khoảng
cách giữa hai vật. Viết chương trình tính lực hấp dẫn giữa hai vật khi
biết khối lượng và khoảng cách giữa chúng. Kiểm tra chương trình
bằng cách tính lực tác dụng lên một vệ tinh 800kg ở quỹ đạo cách
trái đất 38000km. (Khối lượng trái đất là 5,98x10
24
kg).
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
18 -
CHƯƠNG II THỦ TỤC VÀ HÀM

II-1 LẬP TRÌNH VỚI THỦ TỤC
Các chương trình trong chương đầu tiên đều đơn giản. Khi viết những
chương trình phức tạp hơn, chúng ta thường phải chia chương trình
thành các phần nhỏ. Một phần nhỏ đó là một thủ tục.


Ví dụ, xét chương trình đổi chỗ 2 số. Chúng ta cần làm ba việc: nhập
hai số, đổi chỗ 2 số, rồi in kết quả ra. Chúng ta viết mỗi việc đó thành
một thủ tục.
program Doicho;
var So1, So2 : integer;
procedure Nhapso;
begin
writeln(‘ Chương trình này đổi chỗ hai số nguyên’ );
write(‘Nhập số thứ nhất’); readln(So1);
write(‘Nhập số thứ hai’); readln(So2);
end; {Nhapso}
procedure Doihaiso;
var Tam : integer;
begin
Tam := So1; So1 := So2; So2 := Tam
end; {Doihaiso}
procedure Inketqua;
begin
write(‘ Hai số sau khi đổi chỗ là ‘)
writeln(So1: 1 , ‘ và ‘, So2:1)
end; {Inketqua}
begin {chương trình chính}
Nhapso;
Doihaiso; {Ba lời gọi thủ tục}
Inketqua
end.
Hầu như mọi chương trình Pascal trong thực tế đều có dùng đến thủ tục.
Như vậy cấu trúc chung của một chương trình Pascal thường là
đầu chương trình

Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
19 -
phần khai báo hằng
phần khai báo biến
phần khai báo các thủ tục
phần lệnh (thân chương trình chính)
II.2 BIẾN TOÀN CỤC VÀ BIẾN ĐỊA PHƯƠNG
Các biến toàn cục là các biến đước khai báo trong chưong trình chính.
Chúng có thể được dùng ở mọi nơi trong chương trình. Các biến đòa
phương là các biến được khai báo trong các chương trình con và chúng
chỉ được sử dụng trong các chương trình con đó thôi. Khi chương trình
con kết thúc thì các biến này cũng mất đi. Phạm vi của một biến là
một phần của chương trình (gọi là khối) sử dụng biến đó. Pascal là
ngôn ngữ có cấu trúc khối :

program A

procedure B
procedure D
begin {D}
:
end; {D}

begin {B}
:
end; {B}
procedure C
procedure E

begin {E}
:
end; {E}
procedure F
begin {F}
:
end; {F}
begin {C}
:
end; {C}
Nguyễn Danh Hưng Khoa Vật Lý
procedure F
procedure E
procedure C
procedure B
procedure D
program A
Kỹ thuật lập trình Pascal
-
20 -
begin {A}
:
end; {A}

Phạm vi của các biến trong chương trình là các khối
program A A, B, C, D, E, F
procedure B B, D
procedure C C, E, F
procedure D D
procedure E E

procedure F F

Chú ý: Nếu biến toàn cục và biến đòa phương trùng tên nhau, thì sự
thay đổi giá trò của biến đòa phương sẽ không ảnh hưởng đến biến toàn
cục. Ta nói là biến đòa phương có độ ưu tiên cao hơn. Chương trình sau
minh hoạ điều này.
program Phamvi;
var x: integer; {x là biến toàn cục}
procedure Diaphuong;
var x :integer; {x là biến đòa phương}
begin
x := 5;
writeln(x : 6);
end; {Diaphuong}
begin
x := 2;
writeln(x : 6);
Diaphuong;
writeln(x : 6)
end. {Phamvi}
Kết quả cho ra:
2 giá trò của x toàn cục
5 giá trò của x đòa phương
2 giá trò của x toàn cục

Chú ý:
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
21 -

• Chúng ta cần khai báo biến trước khi sử dụng chúng trong một
thủ tục .
• Trong cùng một khối, một thủ tục có thể gọi một thủ tục khác đã
được khai báo trước nó .

II.3 THỦ TỤC CÓ THAM SỐ

Chương trình đổi chỗ hai số có thể viết lại như sau bằng cách dùng thủ
tục có tham số.
program Doicho;
var Solon, Sobe : integer;
procedure Doihaiso( var So1,So2:integer);
var Tam : integer;
begin
Tam := So1; So1 := So2; So2 := Tam
end; {Doihaiso}
begin {chương trình chính}
Solon := 10;
Sobe := 5;
writeln( Solon:3, Sobe:3);
Doihaiso(Solon,Sobe);
writeln( Solon:3, Sobe:3)
end.
Ta thấy thủ tục đổi hai số ở đây có thêm danh sách tham số và trong lời
gọi thủ tục cũng có danh sách đối số để truyền cho các tham số này .
Tham số được chia làm hai loại: tham trò và tham biến.

Tham trò là biến điạ phương của chương trình con. Trò đầu của nó được
truyền bởi đối trong lời gọi thủ tục.
Vì tham trò là biến đòa phương, sự thay đổi của nó không ảnh hưởng gì

đến trò của đối truyền cho nó.

Tham biến là biến đòa phương dùng thay cho một biến toàn cục. Nó là
một tên khác (bí danh) của đối số .
Sự thay đổi lên tham biến làm thay đổi trực tiếp lên đối mà nó thay tên.
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
22 -
Sự khác nhau giữa hai loại tham số này được minh họa bởi chương trình
sau:
program Thu_Thamso;
var a,b : integer;
procedure Thamso( x : integer; var y:integer);
begin
x := x+1; y := y + 1; writeln(x:6, y:6);
end;
begin
a := 0; b := 3; Thamso(a, b);writeln(a:6, b:6);
end.
Kết quả cho ra :
1 4
0 4

Trong ví dụ trên, thủ tục tham số có hai loại tham số : tham trò x và
tham biến y. Trước khi gọi thủ tục này với hai tham số thực là a và b
tương ứng thì a = 0 và b = 3. Trong thủ tục ta có hai lệnh làm thay đổi
giá trò của a và b bằng cách tăng thêm 1. Lệnh writeln(x,y) cho ra kết
quả là 1 và 4 tương ứng. Tuy nhiên, sau khi ra khỏi thủ tục lệnh
writeln(a,b) cho thấy chỉ có b biï thay đổi vì b là tham biến còn a vẫn

giữ nguyên giá trò vì nó là tham trò. Vậy khi nào cần thay đổi trò của
tham số trong cả chương trình chính thì ta mới dùng tham biến.
Ta nên nhớ quy tắc sau khi truyền đối cho tham số:
Quy tắc: Đối của tham trò có thể là một hằng, một biến hay một biểu
thức. Đối của tham biến chỉ có thể là biến.

II.4 HÀM

Giống như thủ tục, hàm cũng là một loại chương trình con. Khác biệt
giữa hàm và thủ tục là hàm luôn luôn trả về một giá trò.
Ví dụ: Hàm sau tính quãng đường đi theo thời gian và vận tốc
function QuangDuong(vantoc:real ; thoigian : real):real;
begin
QuangDuong := vantoc * thoigian;
end;
Cấu trúc chung của hàm có dạng như sau:
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
23 -
function tên hàm(danh sách tham số):kiểu dữ liệu trả về ;
Phần khai báo biến
Thân hàm

Khác với thủ tục, hàm trả về giá trò nên lời gọi hàm chỉ được dùng trong
biểu thức.
Ví dụ:

program KiemTraHam;
var So, Cotang :real;

function Tang(gocdo:real ): real;
var goc:real;
function DoiSangRadian(goc : real):real;
const pi = 3.1415926;
begin
DoiSangRadian := goc * pi/180
end; { DoiSangRadian}

begin {Tang}
goc := DoiSangRadian(gocdo);
Tang := sin(goc)/cos(goc);
end; {Tang}

begin {Chương trình chính}
writeln(‘Nhap vao mot goc tinh bang do:’);
readln(So);
writeln(‘Tang cua goc ‘, So ,’ = ‘,Tang(So));
Cotang := 1/Tang(So);
writeln(‘CoTang cua goc ‘, So ,’ = ‘,Cotang)
end. {Chương trình chính}

Ví dụ trên cũng cho thấy các hàm có thể lồng nhau.

II.5 PHƯƠNG PHÁP LẬP TRÌNH TỪ TRÊN XUỐNG

Phương pháp lập trình từ trên xuống gồm các bước sau:
Nguyễn Danh Hưng Khoa Vật Lý
Kỹ thuật lập trình Pascal
-
24 -

1. Chia bài toán vấn đề ra thành những phần nhỏ.
2. Nếu có thể lập trình được ngay cho một phần nhỏ thì viết thủ tục cho
phần này. Nếu một phần vẫn còn quá phứùc tạp thì chuyển sang
bước 3.
3. Chia phần phứùc tạp này thành những phần đơn giản hơn rồi viết thủ
tục cho các phần đơn giản này. Việc làm này gọi là tinh chế từng
bước.
Xét ví dụ về việc lập trình quản lý thư viện.
Đầu tiên , chúng ta phân chia việc quản lý thư viện ra thành những
công việc sau:
• Quản lý sách
• Quản lý thẻ
• Quản lý người đọc
Tiếp đó, chúng ta thực hiện từng công việc trên
a/ Quản lý sách : Công việc này bao gồm
• Làm thư mục sách
• Quản lý số sách hiện có
b/ Quản lý thẻ



II.6 CHỐNG LỖI VÀ SỬA LỖI

Một kỹ thuật chống lỗi quan trọng là lập trình có tính đơn thể
(modular).
Một chương trình là có tính đơn thể nếu các chương trình con của nó là
độc lập tương đối với nhau và đối với chương trình chính. Các chương
trình con có thể được thử riêng bằng các dữ liệu giả trước khi ghép vào
chương trình chính. Nếu chương trình con có lỗi thì lỗi đó có thể được
cô lập và sửa dễ dàng.

Một đặc trưng khác của lập trình đơn thể là hạn chế dùng biến toàn
cục. Nói chung biến toàn cục không nên dùng trong chương trình con.
Sự thay đổi của biến toàn cục trong chương trình con có thể gây ra hiệu
ứng phụ . Hiệu ứng phụ làm cho chương trình khó đọc và khó hiểu.
Thay vì dùng biến toàn cục nên dùng tham số. Nếu một thủ tục chỉ
dùng một trò chúng ta khai báo một tham trò. Nếu thủ tục thay đổi hoặc
trả về một trò chúng ta sử dụng tham biến.
Nguyễn Danh Hưng Khoa Vật Lý

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×