1. Trang chủ
  2. » Công Nghệ Thông Tin

CÂU LỆNH CASE pot

19 255 2
Tài liệu đã được kiểm tra trùng lặp

Đ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 19
Dung lượng 2,61 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

CÂU LỆNH CASE

8.2.1 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 8.3)

CASE biểuthức OF

hằng1 : LệnhP1;

hằng2 : LệnhP2;

hằngk : LệnhPk;

END;

CASE biểuthức OF

hằng1 : LệnhP1;

hằng2 : LệnhP2;

hằngk : LệnhPk;

ELSE LệnhQ;

END;

Trang 2

Dạng 1 Dạng 2

Hình 8.3 : 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 gía 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

Cách thức thực hiện của lệnh CASE như sau:

Bước 1: Tính toán gía trị của biểuthức

Bước 2: So sánh và lựa chọn:

Trang 3

Nếu gía 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:

Nếu gía 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:

.v.v

Nếu gía 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)

Hình 8.4 và hình 8.5 là các sơ đồ của lệnh CASE vẽ cho trường hợp k=3

Trong hình vẽ , ta ký hiệu:

G là gía trị của biểuthức

H1, H2, H3 là hằng1, hằng2, hằng3

P1, P2, P3, Q là LệnhP1, LệnhP2 , LệnhP3 va?LệnhQ

Trang 4

8.2.2 Các ví dụ :

Ví dụ 8.8: 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:

Trang 5

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 VIDU88;

Var

Ho_ten: String[20];

Namsinh, Namnay, Tuoi : Integer ;

Phanloai : String[14];

Begin

Write(‘ Nhập họ và tên: ‘);

Trang 6

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:= ‘sơ sinh’;

2 9 : Phanloai:= ‘nhi đong’;

10 15 : Phanloai:= ‘thieu niên’;

16 32 : Phanloai:= ‘thanh nien’;

33 50 : Phanloai:= ‘trung nien’;

else Phanloai:= ‘nguoi lon tuoi’;

Trang 7

End; { hết Case }

Writeln(Ho_ten, #32 , Tuoi, #32 , Phanloai);

end;

Readln;

End

Chạy<VD88.EXE>

Chép file nguồn <VD88.PAS>

Trong ví dụ này, lệnh CASE dựa vào Tuổi để xác định lứa tuổi, kết qủa

lưu vào biến Phanloai Ðóng vai trò hằng1 là hai số 0 và 1 viết cách nhau

bởi dấu phẩy, và dòng :

0,1: Phanloai:=‘So sinh’ ;

có nghĩa là khi Tuổi bằng 0 hoặc bằng 1 thì thực hiện lệnh gán:

Phanloai:=‘So sinh’ ;

Ðóng vai trò hằng2 là tất cả các số nguyên trong phạm vi từ 2 đến 9, và

dòng :

Trang 8

2 9 : Phanloai:= ‘nhi đong’;

có nghĩa là khi Tuổi bằng một trong các số nguyên từ 2 đến 9 thì thực hiện lệnh gán: Phanloai:= ‘nhi đong’;

Ví dụ 8.9:

Xây dựng thực đơn cho phép lựa chọn một trong bốn việc : tính tổng , tính hiệu, tính tích hoặc tính thương của hai số x, y nhập từ bàn phím

Màn hình cần hiện ra bốn mục sau cho mọi người lựa chọn :

A TÍNH TỔNG HAI SỐ

B TÍNH HIỆU HAI SỐ

C TÍNH TÍCH HAI SỐ

D TÍNH THƯƠNG HAI SỐ

Muốn chọn mục nào ta gõ chữ cái đầu của mục đó Ví dụ gõ A thì màn hình hiện kết qủa của x+y, gõ B thì hiện kết qủa của x-y, Ðối với mục

D, nếu y khác không thì in kết qủa của x/y, còn y=0 thì in câu " Không xác định"

Trang 9

Nếu người dùng nhập một ký tự khác A, B, C, D, a, b, c, d thì máy hiện lời nhắc : " Không có mục này "

Biến Ch kiểu ký tự được dùng để lưu chữ cái (mục) mà người dùng đã chọn Tùy theo giá trị của Ch mà lệnh CASE sẽ quyết định phải làm gì

Chương trình được viết như sau :

PROGRAM VIDU89;

{ Thực đơn }

Uses Crt;

Var

x, y : Real;

Ch : Char;

Begin

Clrscr;

Write('Nhap x va y:');

Readln(x, y);

Trang 10

Gotoxy(10, 3); Write('A TINH TONG HAI SO');

Gotoxy(10, 5); Write('B TINH HIEU HAI SO');

Gotoxy(10, 7); Write('C TINH TICH HAI SO');

Gotoxy(10, 9); Write('D TINH THUONG HAI SO');

Gotoxy(2,11); Write('-Ban chon muc nao (A, B, C, D) ?:');

Readln(Ch);

CASE Ch of

'A', 'a': Writeln('Tong =', x+y :6:2);

'B', 'b': Writeln(' Hieu =', x-y :6:2);

'C', 'c': Writeln(' Tich =', x*y :6:2);

'D', 'd': If y<>0 then Writeln(' Thuong =', x/y:6:2 )

else Writeln(' Khong xac dinh !');

ELSE

Writeln(' Khong co muc ', Ch);

Trang 11

END;

Readln;

End

Chạy<VD89.EXE>

Chép file nguồn <VD89.PAS>

Trong chương trình có sử dụng thủ tục : GOTOXY ( m, n) thuộc thư viện

CRT, có chức năng đặt con trỏ màn hình vào tọa độ cột thứ m, dòng thứ n trên màn hình Ví dụ lệnh Gotoxy (10, 3); đặt con trỏ màn hình vào tọa độ cột 10, dòng 3

Ví dụ 8.10:

Nhập vào tháng và năm, cho biết tháng đó trong năm đó có bao nhiêu ngày

Theo dương lịch :

Các tháng 4, 6, 9, và 11: có 30 ngày,

Các tháng 1, 3, 5, 7, 8, 10 và 12: có 31 ngày,

Trang 12

Riêng tháng 2 thì bình thường có 28 ngày, nhưng nếu là năm nhuận thì có

29 ngày

Cách xác định một năm là nhuận như sau:

* hoặc là năm chia hết cho 400 (ví dụ năm 1600, năm 2000)

* hoặc là năm không chia hết cho 100 và chia hết cho 4 ( ví dụ các

năm 1988, 1992, 1996 đều là năm nhuận)

Trong chương trình ta dùng một biến lôgic có tên là Nhuan để xác định có

phải là năm nhuận hay không

PROGRAM VIDU810;

{ Xác định số ngày của tháng }

Var

Thang, Nam, Songay : Integer ;

Nhuan : Boolean;

Begin

Write(‘Nhập Thang, Nam : ‘);

Trang 13

Readln(Thang, Nam);

If (Thang<1) or ( Thang>12) then writeln(‘ Nhập sai ’)

else

begin

Case Thang OF

4, 6, 9, 11 : Songay:=30;

1, 3, 5, 7, 8, 10, 12 : Songay:=31;

2 : begin

Nhuan:= (Nam mod 400=0) or

( (Nam mod 100<>0) and (Nam mod 4=0) );

If Nhuan= TRUE then Songay:=29 else Songay:=28;

end;

End; { Hết Case }

Writeln(‘ Số ngày là : ‘ , Songay);

Trang 14

end;

Readln;

End

Chạy<VD810.EXE>

Chép file nguồn <VD810.PAS>

Trong ví dụ này, khi Tháng=2 thì phải làm hai lệnh được đặt trong khối begin và end, đó chính là một lệnh ghép:

begin

Nhuan:= (Nam mod 400=0) or ( (Nam mod 100<>0) and (Nam mod 4=0) );

If Nhuan= TRUE then Songay:=29 else Songay:=28;

end;

8.2.3 Câu lệnh CASE lồng nhau :

Trong cấu trúc CASE, khi một trong các LệnhP1, LệnhP2, , LệnhPk hay LệnhQ lại là một lệnh CASE thì ta có cấu trúc CASE lồng nhau

Trang 15

Ví dụ 8.11: Một xí nghiệp tính tiền thưởng hàng tháng cho công nhân

theo công thức : Tiền thưởng= Hệ số * 200

Trong đó Hệ số được tính dựa vào kết qủa bình chọn phân loại lao động (loại A, B hay C) và nơi làm việc (cơ sở 1 hay cơ sở 2) của mỗi người trong tháng, cụ thể như sau :

Loại

Cơ sở

1

Cơ sở

2

Ví dụ nếu ông X được xếp loại A và làm việc ở cơ sở 1 thì có hệ số

thưởng là 2.0, nên tiền thưởng là =2.0*200=400

Viết chương trình nhập họ tên, phân loại lao động và nơi làm việc của một công nhân, tính tiền thưởng cho người đó

PROGRAM VIDU811;

{ Tính tiền thưởng cho công nhân }

Trang 16

Var

Ho_ten: String[20];

Loai : Char;

Coso : Byte;

Heso, Thuong : Real;

Begin

Write(‘ Nhập họ và tên: ‘);

Readln(Ho_ten);

Write(‘ Nhập cơ sở làm việc (1,2): ‘);

Readln(Coso);

Write(‘ Nhập phân loại lao động (A,B,C) : ‘);

Readln(Loai);

CASE Loai OF

‘A’, ‘a’: Case Coso of

Trang 17

1: Heso:=2.0;

2: Heso:=2.5;

end;

‘B’, ‘b’: Case Coso of

1: Heso:=1.5;

2: Heso:=1.8;

end;

‘C’, ‘c’: Heso:=1.0;

END; { Hết CASE }

Thuong:=Heso*200;

Writeln(‘Họ và tên Tiền thưởng ‘);

Writeln(Ho_ten , Thuong:8:2 );

Readln;

End

Trang 18

Chạy<VD811.EXE>

Chép file nguồn <VD811.PAS>

8.2.4 So sánh lệnh Case với lệnh If :

Lệnh If và lệnh Case đều là các câu lệnh rẽ nhánh, cho phép lựa chọn

một công việc trong nhiều công việc được lựa chọn Nhưng cấu trúc If tổng quát và mạnh hơn cấu trúc Case vì lệnh If không hạn chế gì cả, còn lệnh

Case thì yêu cầu biểu thức và các hằng phải thuộc kiểu dữ liệu đếm được:

nguyên, ký tự, lô gic, liệt kê hay đoạn con, không được là kiểu thực hay chuỗi

Lệnh Case nào cũng có thể thay thế tương đương bằng các lệnh IF Ví

dụ lệnh Case trong chương trình nói trên ( Ví dụ 8.11 ) có thể thay bằng ba lệnh If sau:

If (Loai=‘A’) or (Loai=‘a’) then

if Coso=1 then Heso:=2.0 else Heso:=2.5;

If (Loai=‘B’) or (Loai=‘b’) then

if Coso=1 then Heso:=1.5 else Heso:=1.8;

Trang 19

If (Loai=‘C’) or (Loai=‘c’) then Heso:=1.0;

Tuy nhiên không phải lệnh If nào cũng thay bằng lệnh Case được

Việc sử dụng lệnh Case trong nhiều trường hợp có tác dụng làm rõ ràng

và nổi bật bố cục của một đoạn chương trình, từ đó dễ đọc, dễ hiểu hơn

Thông thường, người ta dùng lệnh Case để thay thế các cấu trúc If lồng nhau khi có nhiều ( ba, bốn, ) tình huống rẽ nhánh và khi điều kiện cho phép

Các bạn hãy viết lại các chương trình trong các ví dụ 8.8, 8.9, 8.10, 8.11 nhưng thay lệnh Case bằng các lệnh IF

Ngày đăng: 19/06/2014, 09:20

TỪ KHÓA LIÊN QUAN

w