Câu lệnh này có hai dạng nh sau:
Dạng 1: IF<Biểu thức Boolean> Then <Việc 1>;
Dạng 2: IF<Biểu thức Boolean> Then <Việc 1> Else <Việc 2>;
Hoạt động của dạng 1 nh sau: nếu <Biểu thức Boolean> có giá trị True thì máy sẽ thực hiện <việc 1>, còn nếu không thì kết thúc lệnh if và thực hiện tiếp lệnh sau if.
Hoạt động của dạng 2 nh sau: Nừu <Biểu thức Boolean> có gía tị True thì máy sẽ thực hiện <việc 1>, còn nếu không thì sẽ thực hiện công <việc 2>.
Ví dụ 1:
Để giải phơng trình bậc nhất một ẩn ax+b=0 ta viết:
IF a<>0 Then x:=-b/a Else Writeln(’Phơng trình vô nghiệm’);
Ví dụ 2:
Tìm gía trị Max của hai số a và b
IF a<>b Then Max:=b Else Max:=a;(trớc Else không đợc phép dùng dấu chấm
phẩy).
Nếu sau Then hoặc sau Else có trên một lệnh thì phải dùng Begin..End. Ví dụ: IF a<b Then Begin Max:=b; Min:=a; End Else Begin Max:=a; Min:=b; End;
Nghĩa là nếu a<b, hai lệnh là Max:=b và Min:=a cũng đợc thực hiện. Ví dụ 3: Giải phơng trình bậc hai:
Program PhuongTrinhBacHai; Uses CRT; Var a,b,c,x1,x2,Delta:Real; Begin ChScr; (*Xoá màn hình*)
Write(‘Bạn gõ vào hệ số b=’);Readln(b); Write(‘Bạn gõ vào hệ số c=’);Readln(c); Delta:=b*b-4*a*c; (*Tính Delta*). If Delta=0 Then Begin Writeln(‘Phơng trình có nghiệm kép’); Writeln(‘x=’,-b/(2*a); End; if Delta>0 Then 13. Begin Writeln(‘Hai nghiệm thực:’); x1:=(-b+Sqrt(Delta))/(2*a);(*x1 là nghiệm 1*). x2:= (-b-Sqrt(Delta))/(2*a);(*x2 là nghiệm 1*). Writeln(‘x1=’,x1); Writeln(‘x2=’,x2); End
Else Writeln(‘Phơng trình vô nghiệm’); End.
XXIII.II. Câu lệnh chọn CASE...OF...
Lệnh IF chỉ thực hiện rẽ hai nhánh ứng với hai giá trị của biểu thức Boolean. Việc thử và chọn một trong nhiều nhánh sẽ đợc thực hiện với câu lệnh CASE nh sau:
Dạng 1 Dạng 2
CASE <Biểu thức> OF CASE <Biểu thức> OF Giá trị 1: <việc 1>; Giá trị 1: <việc 1>; Giá trị 2: <việc 2>; Giá trị 2: <việc 2>; ... ... Giá trị N: <việc N>; Giá trị N: <việc N>;
END; ELSE <việc N+1>;
END;
Trong đó <Biểu thức> không chỉ là biểu thức Boolean mà còn có thể là biểu thức có các kiểu vô hớng đếm đợc (không đợc là kiểu Real).
Hoạt động của dạng 1 nh sau:
Nếu <Biểu thức > bằng Giá trị i thì thực hiện <Việc i> và kết thúc chọn.
Nếu <Biểu thức > bằng 1 Giá trị i thì thực hiện <việc i> và kết thúc lệnh chọn nếu không làm <việc N+1> và kết thúc lệnh chọn.
Ví dụ 1:
Write (‘Vào thứ cần hỏi?’); Readln(thu); CASE Thu OF
1. Writeln(‘Chủ nhật nghỉ’);
2. Writeln(‘Thứ 2:Toán, Lý, Sinh’); 3. Writeln(‘Thứ 3: Văn, Sử, Địa’); 4. Writeln(‘Thứ 4: Ngoại Ngữ’); 5. Writeln(‘Thứ 5: Toán, Lý, Sinh’); 6. Writeln(Thứ 6: Văn, Sử, Địa’); 7. Writeln(‘Thứ 7: Ngoại Ngữ’);
End. Ví dụ 2:
Write(‘Bạn hãy gõ vào một ký tự’); Readln(Chr);
Case Chr of
‘0’..’9’:Writeln(‘Bạn vừa gõ một ký tự số!’); ‘A’...’Z’: Writeln(Bạn vừa gõ chữ cái hoa’); ‘a’..’z’:Writeln(‘Bạn vừa gõ chữ cái thờng’)
Else
Writeln(‘Bạn vừa gõ vào một ký tự đặc biệt’);
End; Bài tập:
1. Cho một ví dụ về câu lệnh IF...THEN...
2. Cho một ví dụ về câu lệnh IF...THEN...ELSE... 3. Cho một ví dụ mà sau THEN có lệnh hợp thành. 4. Cho ví dụ mà sau ELSE có lệnh hợp thành. 5. Hai cách viết sau khác nhau ở diểm nào?
If a<b Then Max:=b;
Min:=a; Và cách viết : IF a< b Then Begin Max:=b; Min:=a;
6. Hãy dùng CASE...OF... lập một chơng trình xem thời gian biểu hàng ngày của bạn.
7. Dòng lệnh sau sai ở chỗ nào?
Var R:Real; Begin Readln(R); Case R OF 12.34:Writeln(‘Đây là số thực nhỏ hơn 20’); End; XXIV.III. Vòng lặp có số bớc lặp xác định FOR... Ví dụ:
Giả sử ta phải hiển thị lên màn hình các số từ 1 đến 60, mỗi số chiếm một dòng: 1 2 3 ... 59 60
Việc này có thể thực hiện bằng 60 lệnh writeln nh sau: Writeln(1);
Writeln(2); ... Writeln(60);
Cách viết này rõ ràng là quá dài dòng, để khắc phục tình trạng trên ta có thể thay thế bằng cách dùng lệnh For nh sau:
FOR i:=1 TO 60 DO Writeln(i);
Vòng lặp này có nghĩa là cho i chạy từ 1 (giá trị đầu) tới 60 (giá trị cuối), ứng với mỗi giá trị của i, máy sẽ thực hiện lệnh sau DO. ở đây là hiển thị giá trị i.
Cụ thể hơn, vòng lặp FOR này đợc thực hiện từng bớc nh sau:
1. Đầu tiên i lấy giá trị 1. Vì i còn nhỏ hơn giá trị cuối là 60 nên lệnh Writeln(i) đợc thực hiện và kết quả đợc hiển thị là i.
2. Sau đó i nhận giá trị tiếp theo, tức là i:=Succ(i). Lúc này i=2 và vẫn nhỏ hơn giá trị cuối là 60 nên lệnh writeln(i) vẫn đợc thực hiện và kêt quả 2 đợc hiển thị. 3. Quá trình lại tiếp tục bớc 2 cho đến khi i=61. Lớn hơn giá trị cuối (60) thì dừng lại.
Cách viết tổng quát của lệnh For nh sau:
FOR <Biến điều khiển> :=<Giá trị đầu> TO <Giá trị cuối> DO <Lệnh>.
Trong đó <Biến điều khiển>, <Giá trị đầu> và <Giá trị cuối> là kiểu vô hớng đếm đợc.
Nếu ta muốn hiển thị các số từ 60 đến 1 ta viết nh sau:
FOR i:=60 DOWNTO 1 DO Writeln(i);
Tổng quát nh sau:
FOR <Biến điều khiển>:=<Giá trị đầu> DOWNTO <Giá trị cuối > DO <việc>;
Máy tính sẽ làm theo chiều ngợc lại, tức là theo chiều giảm dần của biến điều khiển. Ví dụ 1: Tính tổng các số nguyên từ 10 đến 100: Program TinhTong; Var Tong,i:Integer; Begin Tong:=0;
For i:=10 To 100 Do Tong:=Tong+1; Writeln(‘Tong=’,Tong);
End.
Ví dụ 2:
Hiển thị các chữ cái hoa ‘A’ đến ‘Z’ ra màn hình. Program LenhFor; Uses Crt; Var Chr:Char; Begin ClrScr;
For Chr:=’A’ To ‘Z’ Do Write(Chr:2);
End.
Kết quả hiện ra màn hình:
A B C D E G H I J M N O P Q R S T U V W X Y Z Ví dụ 3:
Ngày = (ChuNhat, Hai, Ba, Tu, Nam, Sau, Bay); Var
NgayX, Ng:Ngay; Begin
NgayX:=Nam;
For Ng:=Hai To Bay Do
If NgayX=Ng Then Writeln(‘Ngay làm việc’); End.
Nừu sau Do có trên một lệnh hãy đặt trong Begin..End. Ví dụ 4: Các vòng For lồng nhau: For i:=1 To 10 Do For j:=1 To 12 Do Begin K:=i+j; Writeln(k); End;