Muốn chọn mụcnào ta gõ chữ cái đầu của mục đó. Ví dụ gõ A thì màn hình hiện kết quả của x+y, gõ B thì hiện kết quả của x-y, ... Ðối với mục D, nếu y khác không thì in kết quả của x/y, còn y=0 thì in câu "Không xácđịnh".
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 VIDU8_6;
{Thực đơn}
Uses Crt;
Var
x, y: Real;
Ch: Char;
Begin Clrscr;
Write('Nhap x va y:');
Readln(x, y);
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('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
122
Writeln(‘Khong xac dinh !');
ELSE
Writeln('Khong co muc', Ch);
END;
Readln;
End.
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_7: 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,
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 VIDU8_7;
{Xácđịnh số ngày của tháng}
Var
Thang, Nam, Songay: Integer;
Nhuan: Boolean;
Begin
Write(‘Nhập Thang, Nam: ‘);
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(‘So ngay la: ‘, Songay);
End;
124
Readln;
End.
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;
* 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.
+ Ví dụ 8_8: 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 quả 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 trongtháng, cụ thể nhưsau:
Loại Cơsở 1 Cơsở 2
A 2.0 2.5
B 1.5 1.8
C 1.0 1.0
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 VIDU8_8;
{Tính tiền thưởng cho công nhân}
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 1: Heso:=2.0;
2: Heso:=2.5;
End;
‘B’, ‘b’:Case Coso of 1: Heso:=1.5;
126
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.
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átvàmạnhhơ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ệnhIf. Ví dụ lệnh Case trong chương trình nói trên (Ví dụ 8.9) 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;
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_5, 8_6, 8_7, 8_8 nhưng thay lệnh Case bằng các lệnh If.
9. CÂU LỆNH LẶP FOR 9.1. Dạng 1
Cú pháp:
FOR biến:= m1 TO m2 DO LệnhP;
+ Yêu cầu
biến phải thuộc kiểu dữ liệu đơn giản đếm được, thường là kiểu nguyên, ký tự hay lôgic, không thể là kiểu thực hay chuỗi.
m1, m2là các biểu thức có cùng kiểu dữ liệu với biến.
LệnhPcó thể là một lệnh đơn giản, lệnh có cấu trúc, hoặc là một lệnh ghép gồm nhiều lệnh đặt trong khối begin và end.
Hình 9.1 là sơ đồ khối của lệnh For với b là viết tắt của biến.
+ Cách thức hoạt động của FOR Bước 1:Gán giá trị biến:= m1;
Bước 2:Nếu biến m2 thì làm LệnhP, rồi sang bước 3;
Nếu biến > m2 thì không làm LệnhP mà chuyển sang lệnh kế tiếp ở phía dưới.
Bước 3:Tăng giá trị của biến: biến:=Succ(biến);
128
Quay lại bước 2.
Tóm lại, LệnhP sẽ được làm đi làm lại, bắt đầu khi biến=m1, và kết thúc khi biến=m2+1, cả thảy là m2-m1+1 lần.
Vì thế, người ta gọi FOR là vòng lặp có số lần lặp đã biết trước.
* Các ví dụ cơbản:
+ Ví dụ 9_1: Bài toán tính tổng:
Hãy tính tổng: S= 12+ 22+ 32+...+ 102 Thuật toán:
Bước 0: gán S:=0; {gán giá trị ban đầu cho S}
Bước 1: gán S:=S+1*1; {được S=12} Bước 2: gán S:=S+2*2; {được S=12+22}
Bước 3: gán S:=S+3*3; {S=12+22+32} .v.v.
Bước 10: gán S:=S+10*10; {được S=12+22+32+...+102} Quá trình từ bước 1 đến bước 10 được gọi là phépcộng dồn vào biến S. Tại bước thứ i, lấy giá trị củabiến S cộng với i2, kết quả lại được gán cho biến S, do đó giá trị của biến S được tăng thêm một lượng bằng i2. Khi i thayđổi từ 1 đến 10 thì các số 12, 22, 32, ..., 102đều được cộng vào S, kết quả là sau bước thứ 10 giá trị của S đúng bằng tổng 12+ 22+ 32+ ... + 102.
Tóm lại, lệnh: S:=S + i*i; được làm cả thảy 10 lần, ứng với i=1, 2, ..., 10. Quá trình này được diễn đạt bằng lệnh FOR, như sau:
For i:=1 To 10 DO S:=S+ i*i;
Một cách tổng quát, để tính tổng: S=12 + 22+ 32+...+ N2, trongđó N là mộtsố nguyên dương bất kỳ, ta dùng hai lệnh:
S:=0;
For i:=1 To N DO S:=S+ i*i;
Dưới đây là chương trình cụ thể:
PROGRAM VIDU9_1;
{Tính tổng bình phương các số tự nhiên <=N}
Var