Chơng 10 Lệnh có cấu trúc
10.1.2. Câu lệnh CASE (rẽ nhánh theo giá trị ): 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
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 và khó kiểm tra tính đúng đắn của nó. Câu lệnh CASE sau đây có thể khắc phục đợc nhợc điểm này.
Dạng câu lệnh : Có hai dạng :
Dạng đầy đủ Dạng không đầy đủ
CASE biểu_thức OF tập_hằng_1 : lệnh_1; tập_hằng_2 : lệnh_2; --- CASE biểu_thức OF tập_hằng_1 : lệnh_1; tập_hằng_2 : lệnh_2; ---
trong đó :
• tập_hằng_i(i=1,2,..., n) có thể bao gồm các hằng và các đoạn hằng. Chẳng hạn :
3 : <lệnh_P>; 5, 10 .. 16 : <lệnh_Q>; ‘A’, chr(224) : <lệnh_R>;
• Giá trị của biểu_thức và giá trị trong các tập_hằng_i phải có cùng kiểu và phải là kiểu vô hớng đếm đợc (nguyên, logic, ký tự, liệt kê, khoảng con).
Sự thực hiện của lệnh CASE phụ thuộc vào giá trị của biểu_thức.
- Nếu tập_hằng_i (i=1,2,..., n) là một tập đầu tiên chứa giá trị của biểu_thức thì máy thực hiện lệnh_i, sau đó thoát khỏi lệnh CASE.
- Trong trờng hợp không có tập_hằng_i nào chứa giá trị của biểu_thức thì : nếu không có ELSE, máy thoát ngay ra khỏi lệnh CASE ; nếu có ELSE, máy thực hiện lệnh_0 rồi mới thoát khỏi lệnh CASE.
Sơ đồ câu lệnh :
tập_hằng_1 tập_hằng_2 ... tập_hằng_n ELSE
...
Chú ý : Câu lệnh IF có thể đa về dạng câu lệnh CASE nh sau :
Ví dụ 5 : Viết chơng trình nhập một điểm kiểm tra từ bàn phím và xuất kết quả xếp loại ra màn hình theo quy định :
- Các điểm < 5 : xếp loại yếu. - Các điểm 5, 6 : xếp loại trung bình.
Biểu thức
Lệnh_1 Lệnh_2 Lệnh_n Lệnh_0
IF <biểu thức logic> THEN <lệnh 1>
ELSE
<lệnh 2>;
CASE <biểu thức logic> OF True : <lệnh 1>;
False : <lệnh 2>; END;
- Các điểm 7, 8 : xếp loại khá. - Các điểm 9, 10 : xếp loại giỏi.
Ghi chú : Điểm chỉ nhận các giá trị nguyên từ 0 đến 10.
Program Vidu_5;
Uses Crt;
Var diem : byte;
Begin
ClrScr;
Write(‘Cho biết điểm : ’); Readln(diem);
Case diem of
0..4 : writeln(‘Xếp loại yếu'); 5,6 : writeln(‘Xếp loại trung bình’); 7,8 : writeln(‘Xếp loại khá'); 9,10 : writeln(‘Xếp loại giỏi');
Else writeln('Điểm nhập sai !’);
End;
End.
Ví dụ 6 : Viết chơng trình nhập vào tháng và năm (theo dơng lịch), cho biết tháng đó trong năm đó có bao nhiêu ngày.
Giải thuật :
(1) Nhập tháng vào biến thang và nhập năm vào biến nam. (2) Tìm số ngày tơng ứng đa vào biến so_ngay.
Số ngày đợc tìm dựa vào nhận xét sau :
- Các tháng 1, 3, 5, 7, 8, 10 và 12 : có 31 ngày, - Các tháng 4, 6, 9 và 11 : có 30 ngày,
- Riêng tháng 2 thì bình thờng có 28 ngày, nhng 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ụ năm 1888, 1992, 1996).
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.
(3) Xuất nội dung biến so_ngay.
Program Vidu_6;
Uses Crt;
Var
so_ngay, thang : Byte; nam : Integer;
nhuan : Boolean;
Begin
ClrScr;
If (thang < 1) or (thang > 12) then writeln(‘Nhập sai !’) Else begin Case thang of 4, 6, 9, 11 : so_ngay :=30; 2 : begin
nhuan := (nam mod 400 = 0) or
((nam div 100 <>0) and (nam mod 4 = 0));
if nhuan = true then so_ngay :=29
else so_ngay :=28;
end; else so_ngay := 31;
end; {hết CASE}
Writeln(‘Tháng ‘,thang,’ năm ‘,nam,’ có : ‘,so_ngay,’ ngày.’);
end;
Readln;
End.