1. Trang chủ >
  2. Công Nghệ Thông Tin >
  3. Tin học văn phòng >

Kiểu liệt kê và kiểu đoạn con

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 ; {Dạng 1}

hoặc



IF <Ðiềukiện> THEN ELSE ; {Dạng 2}



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Ư



Xem Thêm