Trong trường hợp để giải quyết bài toán nào đó mà chúng ta cần phải lặp đi lặp lại một hoặc một số công việc nào đó thì chúng ta sẽ cần đến lệnh lặp. Số bước lặp có thể được xác định trước hoặc không xác định trước. Trong ngôn ngữ lập trình Pascal có ba câu lệnh lặp là For, Repeat, While. Nếu số vòng lặp đã được xác định trước thì chúng ta sử dụng lệnh For. Nếu số vòng lặp chưa xác định được trước thì sử dụng lệnh Repeat hoặc While. Tất cả các loại lệnh lặp phải có điểm dừng, cho dù đó là loại xác định trước số bước lặp hay chưa xác định trước số bước lặp.
97
3.4.1. Vòng lặp có số bước lặp xác định FOR
Vòng lặp For có hai dạng là lặp tiến và lặp lùi. a. Dạng lặp tiến
Cú pháp:
For <biến:= Biểu thức 1> To <Biểu thức 2> Do <Lệnh>
Trong đó, biến phải là biến điều khiển được. Kiểu của biến điều khiển, biểu thức 1, biểu thức 2 phải là kiểu vô hướng đếm được (như kiểu dữ liệu nguyên, logic, ký tự, liệt kê)
Giải thích:
Bước 1: Đầu tiên, biến nhận giá trị của <biểu thức 1>;
Bước 2: Máy kiểm tra biến có nhỏ hơn hoặc bằng <biểu thức 2> hay không. Tức là xét điều kiện Biến <= Biểu thức 2
Bước 3: Nếu điều kiện trên là sai (False) thì máy thoát khỏi vòng lặp For để thực hiện các lệnh kế tiếp sau đó. Nếu điều kiện trên là đúng (True) thì lệnh được thực hiện, sau đó biến sẽ được tăng một giá trị và quay trở lại bước 2. Lệnh sẽ được thực hiện và ((Biểu thức 2- Biểu thức 1)+1) lần.
b. Dạng lặp lùi
Cú pháp: For biến:=biểu thức 1 Downto biểu thức 2 Do <Lệnh>
Giải thích:
Bước 1: Đầu tiên, biến nhận giá trị của biểu thức 1;
Bước 2: Máy kiểm tra biến có lớn hơn hoặc bằng biểu thức 2 hay không. Tức là xét điều kiện (Biến >= Biểu thức 2)
Bước 3: Nếu điều kiện là sai (False) thì máy sẽ thoát khỏi vòng lặp For để thực hiện các lệnh kế tiếp sau vòng lặp For. Nếu điều kiện trên là đúng (True) thì
lệnh được thực hiện. Sau đó, biến được giảm một giá trị và quay trở lại bước 2. Chú ý:
- Không được thay đổi giá trị của biến điều khiển bằng một lệnh bất kỳ trong vòng lặp For. Vì điều này có thể làm cho vòng lặp không có lối thoát và dẫn đến treo máy.
98
- Các biểu thức 1, biểu thức 2 được ước lượng trước khi vào vòng lặp. Do đó, số phòng lặp không bị thay đổi. Chúng ta có thể lợi dụng tính tăng hoặc giảm của biến điều khiển để gán giá trị của nó cho bất kỳ biến nào hoặc thực hiện công việc nào đó có tính chất tăng hoặc giảm.
Ví dụ 1: Lập chương trình in ra các số lẻ trong phạm vi từ 0 đến 10. Program Chuong_trinh_in_so_le; Uses crt; Var i:byte; Begin Clrscr;
Writeln(‘Cac so le trong khoang tu 0 den 10 la:’); For i:=0 to 10 do If i mod 2 = 0 then Write(i,’, ’); Readln End. Ví dụ 2: Lập chương trình in ra các ký tự từ a đến z và từ z đến a sử dụng hai cú pháp khác nhau của lệnh lặp For.
Program Chuong_trinh_dong_chu; Uses crt; Var c:char; Begin Clrscr; For c:=’a’ to ‘z’ do Write(c:3); Writeln;
For c:=’z’ downto ‘a’ do Write(c:3);
Writeln; Readln End.
99
3.4.2. Vòng lặp có số bước lặp không xác định REPEAT và WHILE
a. Vòng lặp Repeat Cú pháp: Repeat <Lệnh 1>; <Lệnh 2>; ... <Lệnh n>;
Until <Biểu thức logic>;
Giải thích:
Đầu tiên, máy tính thực hiện lần lượt các lệnh: <Lệnh 1>, <Lệnh 2>...sau đó kiểm tra <Biểu thức logic>. Nếu <Biểu thức logic> nhận giá trị False thì lại quay lên đầu vòng lặp thực hiện tiếp <Lệnh 1>, <lệnh 2>... Nếu <Biểu thức logic> nhận giá trị True thì máy sẽ thoát khỏi vòng lặp. Như vậy, các lệnh nằm trong thân vòng lặp Repeat..Until sẽ được thực hiện ít nhất một lần.
Chú ý:
- Các lệnh nằm giữa lệnh lặp Repeat và Until không cần phải có từ khóa Begin và End;
- Trong vòng lặp phải có lệnh nào đó làm thay đổi giá trị một biến trong <Biểu thức logic> nhằm làm dừng vòng lặp để tránh trường hợp vòng lặp sẽ chạy mãi mãi, không ngừng dẫn đến treo máy.
- Ngay từ khi mới vào vòng lặp Repeat, lệnh đã được thực hiện ít nhất một lần rồi mới kiểm tra điều kiện, chỉ khi nào <biểu thức logic> trả về giá trị True mới thoát khỏi vòng lặp, chính vì vậy vòng lặp Repeat còn được gọi là vòng lặp kiểm tra điều kiện sau.
Ví dụ: Viết chương trình chỉ cho phép nhập vào một số trong khoảng từ 1 đến 12. Rồi in ra tháng đó có bao nhiêu ngày.
Program Kiem_tra_ngay_trong_thang; Var thang: byte;
100
Begin
Repeat
Write('Nhap vao so (tu 1..12): '); Readln(thang);
Until (thang>=1) and (thang<=12); Case Thang of
4, 6, 9, 11: Writeln('Thang nay co 30 ngay'); 2: Writeln('Thang nay co 28 hoac 29 ngay') Else
Writeln('Thang nay co 31 ngay');
End; Readln End.
b. Vòng lặp While Cú pháp:
While <Biểu thức Logic> do <Lệnh>;
Giải thích:
Gặp lệnh này trước tiên máy kiểm tra <Biểu thức logic>, nếu nó có giá trị True thì thực hiện <Lệnh> và sau đó quay lại kiểm tra <Biểu thức logic> và quá trình cứ tiếp tục như vậy. Nếu <biểu thức logic> nhận giá trị False thì máy thoát khỏi vòng lặp mà không thực hiện một lệnh nào trong thân vòng lặp. Như vậy, lệnh While dùng để lặp đi lặp lại một công việc trong khi điều kiện còn được thỏa mãn.
Nếu ngay từ khi mới vào vòng lặp mà thấy điều kiện không được thỏa mãn (Biểu thức logic trả về giá trị False), máy tự động thoát ngay mà không thực hiện lệnh bên trong vòng lặp, chính vì vậy vòng lặp While còn được gọi là vòng lặp kiểm tra điều kiện trước.
Ví dụ: Viết chương trình tìm ước số chung lớn nhất của hai số nguyên.
101
Var a, b, r : Integer; tl : Char; Begin
Repeat
Write( ‘ Nhap hai so a va b : ‘ ); Readln(a, b); While b <> 0 do Begin r := a mod b; a := b; b := r; End;
Writeln( ‘ Uoc so chung lon nhat la ‘, a ); Write( ‘ Ban tim USCLN nua khong (C/K) ? ); Readln(tl);
Until Upcase(tl) = ‘K’; End.