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 (735.23 KB, 141 trang )
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Ph1:=nam;
Ph2:=nu;
M1:=den;
M2:=trang;
Pascal còn cho phép khai báo trực tiếp biến kiểu liệt kê không cần qua giai đoạn định
nghĩa Type bằng cách liệt kê các giá trị mà biến có thể nhận.
Ví dụ: các biến Ph1, Ph2, M1, M2 nói trên có thể khai báo trực tiếp như sau:
Var
Ph1, Ph2: (nam, nu) ;
M1, M2: (den, trang, xanh, vang, tim, nau);
•
Các hàm liên quan đến kiểu liệt kê
o Hàm ORD(tên): Trả về số thứ tự của tên trong kiểu liệt kê. Các giá trị liệt
kê được đánh số thứ tự bắt đầu từ 0. Ví dụ:
Ord(nam)=0,
Ord(xanh)=2
Thông qua hàm Ord, các giá trị liệt kê có thể so sánh với nhau theo quy tắc: giá trị
nào có số thứ tự nhỏ hơn thì nhỏ hơn: den < trang < xanh< vang< tim< nau
o Hàm PRED(tên) và hàm SUCC(tên): trả về giá trị đứng ngay trước và
ngay sau tên trong kiểu liệt kê tương ứng. Ví dụ:
Pred(nu)=nam
Pred(nau)=tim
Succ(den)=trang
o Hàm Tênkiểu(k): trả về giá trị liệt kê có số thứ tự là k trong Tênkiểu, ví dụ:
Phai(0)=nam
Ten_mau(2)= xanh
Hàm này là hàm ngược của hàm Ord.
•
Nhập , xuất kiểu liệt kê
Các giá trị liệt kê không thể nhập, xuất trực tiếp bằng lệnh Readln và Write được. Ðây
là hạn chế của kiểu liệt kê, khiến nó không thông dụng.
Ngôn ngữ lập trình Pascal
41
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Khi muốn nhập hay xuất kiểu liệt kê, ta có thể dùng một biến trung gian St kiểu chuỗi.
Chẳng hạn, muốn nhập màu xanh cho biến M1, ta dùng hai lệnh:
Readln(St);
If St=‘xanh’ then M1:=xanh;
Tương tự, Muốn in màu xanh lên màn hình , ta dùng lệnh:
If M1=xanh then Writeln(‘xanh’);
* Kiểu đoạn con (Subrange type):
Kiểu đoạn con được mô tả bằng cách chỉ ra phạm vi giá trị mà các biến thuộc kiểu đó có
thể nhận:
TYPE
Tênkiểu = hằng1..hằng2;
VAR
Tênbiến: Tênkiểu;
hoặc khai báo trực tiếp:
VAR
Tênbiến: hằng1..hằng2;
Trong đó, hằng1 < hằng2 là hai hằng thuộc cùng một kiểu dữ liệu. Kiểu dữ liệu của
hằng1 và hằng2 chỉ có thể là kiểu nguyên, ký tự, lôgic, hay liệt kê
Ví dụ:
Type
Chu_Hoa =‘A’..’Z’;
Tuoi= 0..200;
Var
Ch: Chu_hoa;
T: Tuoi;
Theo khai báo này thì ch là một biến kiểu đoạn con, có thể nhận các giá trị là các ký tự
từ ‘A’ đến ‘Z’, tương tự, biến T có thể nhận các giá trị là các số nguyên từ 0 đến 200.
Cũng có thể khai báo hai biến Ch và T trực tiếp theo cách sau:
Var
Ch: ‘A’..’Z’;
T: 0..200;
Ngôn ngữ lập trình Pascal
42
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Trong nhiều trường hợp, việc khai báo đoạn con có tác dụng tiết kiệm bộ nhớ. Tùy
theo phạm vi hằng1..hằng2 mà Turbo Pascal sẽ cấp phát cho biến một số byte tối thiểu.
Trong ví dụ trên, mỗi biến Ch hay T sẽ được chứa trong 1 byte.
Kiểu đoạn con còn cho phép kiểm soát được giá trị của biến có vượt ra ngoài phạm vi
của nó hay không. Ví dụ, nếu đối với biến T mà gán: T:=201; thì máy sẽ báo lỗi "const out
of range". Ngoài ra khi chạy chương trình trong mode {$R+}, chương trình sẽ dừng ngay
nếu biến nhận giá trị vượt khỏi phạm vi.
Kiểu liệt kê và kiểu đoạn con thuộc loại đơn giản và đếm được.
Ngôn ngữ lập trình Pascal
43
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
BÀI TẬP
Bài 1: Viết chương trình nhập vào 2 số a và b. Sau đó hoán đổi giá trị của 2 số đó:
a/ Cho phép dùng biến trung gian
b/ Không được phép dùng biến trung gian
Bài 2: Viết chương trình tính diện tích hình thang với đáy dài a, đáy ngắn b, chiều cao h
nhập từ bàn phím
Bài 3: Viết chương trình nhập vào độ dài hai cạnh của tam giác và góc giữa hai cạnh đó,
sau đó tính và in ra màn hình diện tích của tam giác.
Hướng dẫn: Công thức tính diện tích tam giác S =
1
a.b. sin(θ ) với a, b, là độ dài hai cạnh
2
và θ là góc kẹp giữa 2 cạnh a và b
Bài 4:Viết chương trình tính
Hướng dẫn:
n
n
x ,x >0
x =x1/n = e(1/n.lnx)=exp(1/n.lnx)
Bài 5: Viết chương trình tính Sin(x), Cos(x). Trong đó góc x được nhập từ bàn phím và
được đo theo đơn vị Radian ( ta có thể chuyển đổi bằng cách: Cos (x*pi/180)
Bài 6: Một người có số tiền là A đồng, lãi suất tiết kiệm là s phần trăm một tháng. Hỏi sau
t tháng người đó được cả vốn và lãi là bao nhiêu. Chạy chương trình với A = 20 triệu, s =
0,7 đều nhập từ bàn phím. Chú ý: tiền lãi không cộng vào gốc
Bài 7: Viết chương trình tách một số n thành tổng 2 số a, b sao cho tích P = a*b 2 đạt cực
đại với n được nhập từ bàn phím
Bài 8: Nhập họ tên, thu nhập hàng tháng của hai người, sau đó in ra màn hình thu nhập
bình quân của hai người
Bài 9: Viết chương trình nhập chương trình đường thẳng có dạng Ax +By +C = 0 và toạ độ
một điểm P(x, y). Tính và in ra màn hình khoảng cách từ A đến đường thẳng đã cho (lấy 3
số lẻ)
Hướng dẫn:
h= ABS (Ax + By+ C)/SQRT(SQR(A)+SQR(B))
Bài 10: Viết chương trình nhập 3 số nguyên dương a, b, c sau đó in ra màn hình giá trị
trung bình cộng, trung bình nhân của 3 số đó
Ngôn ngữ lập trình Pascal
44
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Bài 11: Cho tam giác ABC với ba đỉnh có toạ đọ là (x1, y1), (x2, y2), (x3,y3). Tính chu vi
và diện tích của tam giác đó
Hướng dẫn: a:= sqrt(sqr(x1- x2) + sqr(y1 –y2));
S:=sqrt(p*(p –a )*(p –b)*(p - c)
Bài 12: Viết chương trình hai số thực bất kỳ từ bàn phím, in ra màn hình tổng, hiệu, tích,
thương của hai số đó
Ngôn ngữ lập trình Pascal
45
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Bài 4: CÁC CÂU LỆNH ĐIỀU KHIỂN
1. Câu lệnh IF
a. Cú pháp, lưu đồ và ý nghĩa:
Cú pháp: IF <Ðiềukiện> THEN
hoặc
IF <Ðiềukiện> THEN
sai
Đkiện
Đkiện
đúng đúng
sai
LệnhQ
LệnhP
LệnhP
Lệnh kế tiếp tiếp
Lệnh kế
Sơ đồ Sơ đồ của lệnh If1
của lệnh If dạng dạng 2
Ðiềukiện là một biểu thức lôgic cho kết qủa TRUE (đúng) hay FALSE (sai). LệnhP,
LệnhQ có thể là một lệnh đơn giản hoặc một lệnh có cấu trúc. Nếu là một lệnh ghép, tức là gồm
nhiều lệnh, thì nhớ là các lệnh này phải được đặt trong khối: begin và end.
Ý nghĩa: Tùy theo Ðiềukiện là đúng hay sai mà quyết định có làm LệnhP hay không. Nếu
Ðiềukiện là đúng thì làm LệnhP rồi chuyển sang lệnh kế tiếp ở phía dưới. Nếu Ðiềukiện là
sai thì không làm LệnhP mà chuyển ngay sang lệnh kế tiếp. Sơ đồ cú pháp của lệnh IF
được vẽ trong hình 3.1.
Ví dụ 1: Nhập vào hai số a và b, tìm và in lên màn hình số lớn nhất của hai số đó.
Ta dùng một biến phụ đặt tên là Max để chứa giá trị lớn nhất phải tìm. Thuật toán gồm
các bước:
Bước 1: Gán số thứ nhất vào Max, tức là:
Max:=a;
Bước 2: Kiểm tra nếu Max nhỏ hơn số thứ hai thì gán số thứ hai vào Max:
If Max < b then Max:=b;
Hoặc thay cả hai bước trên bởi: If a
Bước 3: In giá trị Max lên màn hình.
Ngôn ngữ lập trình Pascal
46
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Giải thích: Sau bước 1, biến Max có giá trị bằng a. Sang bước 2, có thể xảy ra hai tình
huống:
* Hoặc là Max < b , tức b là số lớn nhất, khi đó giá trị lớn nhất b được gởi vào biến Max
* Hoặc là Max >= b, tức giá trị của Max là lớn nhất rồi nên không phải làm gì nữa.
Chương trình cụ thể như sau:
PROGRAM VIDU4_1;
{ Tim Max của hai so }
Var
a, b, max: Real;
Begin
Write(‘ Nhap a va b:’);
Readln(a,b);
Max:=a ;
if Max < b then Max:=b ;
Writeln(‘ So lon nhat la: ‘ , Max:6:2);
Readln
End.
Nhận xét: Có thể mở rộng thuật toán trên để tìm số lớn nhất trong ba số hoặc nhiều hơn.
Ðầu tiên ta tìm số lớn nhất của hai số a và b, ký hiệu là Max, sau đó tìm số lớn nhất của hai
số Max và c, cũng vẫn ký hiệu là Max. Dưới đây là các lệnh chính để tìm số lớn nhất trong
ba số a, b, c:
Max:=a;
If Max < b then Max:=b; { Max là số lớn nhất của a và b }
If Max < c then Max:=c; { Max là số lớn nhất của a, b và c }
•
Chú ý: Trước từ khóa ELSE không có dấu chấm phẩy.
•
Ý nghĩa của lệnh:
o Tùy theo Ðiềukiện là đúng hay sai mà quyết định làm một trong hai lệnh:
LệnhP hoặc LệnhQ .
o Nếu Ðiềukiện là đúng thì làm LệnhP, không làm LệnhQ, mà chuyển ngay
sang thực hiện lệnh kế tiếp ở sau LệnhQ.
Ngôn ngữ lập trình Pascal
47
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
o Ngược lại, nếu Ðiềukiện là sai thì không làm LệnhP mà làm LệnhQ rồi
chuyển sang lệnh kế tiếp ở sau LệnhQ.
b. Câu lệnh IF lồng nhau
Trong câu lệnh IF, nếu LệnhP hoặc LệnhQ, hoặc cả hai, lại là câu lệnh IF thì ta có cấu
trúc IF lồng nhau. Chẳng hạn dưới đây là hai câu lệnh IF... ELSE lồng nhau:
IF Ðiềukiện1 THEN
If Ðiềukiện2 then LệnhP
else
LệnhQ
ELSE
LệnhR;
Ví dụ 2: Nhập số thực x bất kỳ, tính:
Trong Turbo Pascal không có hàm tính căn bậc ba của x. Ðể tính
hàm Exp(x) và Ln(x).
Áp dụng công thức toán học: x = elnx với x>0, ta có:
Vậy:
Chương trình như sau:
PROGRAM VIDU4_2;
{ Tinh can bac ba cua x }
Var
x, y: Real;
Begin
Ngôn ngữ lập trình Pascal
48
ta phải dùng hai
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Write(‘ Nhap x:’);
Readln(x);
{ tinh y }
If x= 0 then y:=0
else
If x> 0 then y:=Exp(1/3*ln(x) )
else
y:= - Exp(1/3*ln(-x) );
Writeln(‘ gia tri y= ‘ , y:8:4);
Readln
End.
Chú ý: Trong câu lệnh IF lồng nhau, cách xác định từ khóa ELSE nào đi với từ khóa IF
nào là như sau: xét ngược từ dưới lên, ELSE luôn đi với IF gần nhất ở phía trên nó mà
chưa có ELSE để bắt cặp.
2. Câu lệnh CASE
a. Cú pháp, lưu đồ và ý nghĩa
Trong một số trường hợp, khi phải lựa chọn một việc trong nhiều việc thì các cấu
trúc IF lồng nhau tỏ ra rắc rối, khó viết, khó kiểm tra tính đúng đắn của nó. Việc dùng cấu
trúc CASE có thể khắc phục được nhược điểm này.
Lệnh CASE có hai dạng, chúng chỉ khác nhau ở một điểm là trong dạng 2 có ELSE
LệnhQ, còn trong dạng 1 thì không (hình 3.2).
CASE biểuthức OF
CASE biểuthức OF
hằng1: LệnhP1;
hằng1: LệnhP1;
hằng2: LệnhP2;
hằng2: LệnhP2;
....
....
hằngk: LệnhPk
hằngk: LệnhPk;
END;
ELSE LệnhQ
END;
Ngôn ngữ lập trình Pascal
49
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Dạng 1
Dạng 2
Cú pháp của lệnh Case
Chú ý là lệnh CASE phải kết thúc bằng END;
Các yêu cầu:
•
Kiểu dữ liệu của biểuthức chỉ có thể là nguyên, ký tự, Lôgic, hoặc kiểu liệt kê hay
kiểu đoạn con. Xin nhấn mạnh rằng: biểuthức không được là kiểu thực hay kiểu
chuỗi, và đây chính là hạn chế của lệnh CASE so với lệnh IF.
•
Các hằng1, hằng2, ..., hằngk phải có kiểu dữ liệu phù hợp với kiểu dữ liệu của
biểuthức.
Ý nghĩa: Tùy theo giá trị của biểuthức bằng hằng nào trong các hằng1, hằng2, ..., hằngk
mà quyết định thực hiện lệnh nào trong các lệnhP1, lệnhP2, ..., LệnhPk.
b.Cách thức thực hiện của lệnh CASE như sau:
•
Bước 1: Tính toán giá trị của biểuthức
•
Bước 2: So sánh và lựa chọn:
o Nếu giá trị của biểuthức = hằng1 thì thực hiện LệnhP1, rồi chuyển sang
lệnh kế tiếp sau End, ngược lại:
o Nếu giá trị của biểuthức = hằng2 thì thực hiện LệnhP2, rồi chuyển sang
lệnh kế tiếp sau End, ngược lại:
o .v.v.
o Nếu giá trị của biểuthức = hằngk thì thực hiện LệnhPk, rồi chuyển sang
lệnh kế tiếp sau End, ngược lại:
a) chuyển ngay sang lệnh kế tiếp sau End(nếu là dạng 1)
b) thực hiện LệnhQ, rồi chuyển sang lệnh kế tiếp sau End (nếu là dạng 2) .
Ví dụ 3: Nhập vào họ tên và năm sinh của một người, cho biết người này thuộc lứa tuổi
nào: sơ sinh, nhi đồng, thiếu niên, thanh niên, trung niên hay người lớn tuổi, biết rằng:
Sơ sinh có tuổi từ 0 đến 1
Nhi đồng: có tuổi từ 2 đến 9
Thiếu niên có tuổi từ 10 đến 15
Thanh niên có tuổi từ 16 đến 32
Trung niên có tuổi từ 33 đến 50
Người lớn tuổi có tuổi trên 50.
Chương trình được viết như sau:
PROGRAM VIDU4_3;
Ngôn ngữ lập trình Pascal
50
BỘ MÔN TIN HỌC
Var
Ho_ten: String[20];
Namsinh, Namnay, Tuoi: Integer ;
Phanloai: String[14];
Begin
Write(‘ Nhập họ và tên: ‘);
Readln(Ho_ten);
Write(‘ Nhập năm sinh và năm nay: ‘);
Readln(Namsinh, Namnay);
Tuoi:=Namnay - Namsinh;
If Tuoi< 0 then writeln(‘Nhập sai ‘)
else
begin
Case Tuoi OF
0 ,1: Phanloai:= ‘so sinh’;
2 ..9: Phanloai:= ‘nhi đong’;
10 ..15: Phanloai:= ‘thieu nien’;
16 ..32: Phanloai:= ‘thanh nien’;
33 ..50: Phanloai:= ‘trung nien’;
else Phanloai:= ‘nguoi lon tuoi’
End; { hết Case }
Writeln(Ho_ten, #32 , Tuoi, #32 , Phanloai)
end;
Readln
End.
3. Câu lệnh lặp biết trước só lần lặp (FOR .. TO .. DO)
a. Câu lệnh FOR dạng 1
Cú pháp , lưu đồ, cách thức hoạt động:
•
Cú pháp:
FOR biến:= m1 TO m2 DO LệnhP;
•
Yêu cầu:
Ngôn ngữ lập trình Pascal
51
TRƯỜNG ĐẠI HỌC HOA LƯ