;
Until <Điều kiện>;
Trong đó:
<Điều kiện> là một biểu thức logic, trả về giá trị TRUE hoặc FALSE
Có thể là một lệnh hoặc một khối lệnh
6.4.2.2 Sự hoạt động
i) Thực hiện công việc Công_việc
ii) Tính giá trị của biểu thức logic điều_kiện,
iii) Nếu sai, quay về bước i),
iv) Nếu đúng, dừng và kết thúc vòng lặp.
6.4.2.3 Lưu đồ thể hiện sự hoạt động
Hình 6.6. Lưu đồ hoạt động của
câu lệnh Repeat
6.4.2.4 Chú ý
đặt giữa 2 từ khoá Repeat và Until có thể là một lệnh hoặc một khối lệnh song không cần phải đặt trong Begin...End;
Trong khi thực hiện phải có một lệnh làm thay đổi giá trị của một biến thuộc biểu thức logic <Điều kiện> để làm cho biểu thức logic tiến đến TRUE nhằm kết thúc vòng lặp.
được thực hiện trước, <Điều kiện> được kiểm tra sau nên ít nhất cũng được thực hiện một lần, ngay cả khi <Điều kiện> đã có giá trị TRUE.
Câu lệnh lặp Repeat ... Until cũng dùng được trong trường hợp đã biết trước số lần lặp.
6.4.2.5 Ví dụ
Ví dụ 6.9: Tính tổng S=1+1/2+1/3+...+1/n . Biết rằng n là một số nguyên dương được đọc vào từ bàn phím.
Program VIDU_6_9;
Uses Crt;
Var i, n: Integer;
s: Real;
BEGIN
ClrScr;
Write('Nhap n= '); ReadLn(n);
s:=0; i:=1;
Repeat
s:=s+1/i;
i:=i+1;
Until i>n;
WriteLn('Tong S= ',s:8:3);
ReadLn;
END.
6.4.2.6 Ứng dụng của câu lệnh lặp Repeat ... Until
a) Mẫu 1: dùng để lặp lại việc nhập dữ liệu cho đến khi dữ liệu nhập là hợp lý.
.....
{ Nhập dữ liệu }
Repeat
ClrScr;
Write('Nhap diem thi mon Tin hoc dai cuong DIEM= ');
ReadLn(DIEM);
If (DIEM<0) or (DIEM>10) then
Begin
WriteLn(#7,'Du lieu sai, moi nhap lai');
ReadLn;
End;
Until (DIEM>=0) or (DIEM<=10);
....
b) Mẫu 2: dùng để quay vòng một đoạn hoặc cả một chương trình theo ý muốn.
...
Var
...
TL: Char;
BEGIN
Repeat
ClrScr;
{ Nhập dữ liệu }
....
{ Xử lý }
...
{ In kết quả }
Write('Co thuc hien chuong trinh lan nua khong (C/K)? ');
ReadLn(TL);
Until (TL='k') or (TL='K');
END.
Ví dụ 6.10: Viết chương trình giải phương trình bậc nhất ax+b=0 với các hệ số a, b nhập từ bàn phím có quay vòng.
Program VIDU_6_10;
Uses Crt;
Var a, b, x: Real;
TL: Char;
BEGIN
Repeat
ClrScr;
Write('Nhap he so a= '); ReadLn(a);
Write('Nhap he so b= '); ReadLn(b);
If a<>0 then
Begin
x:=-b/a;
WriteLn('Phuong trinh co nghiem x= ',x:8:3);
End
Else
If b=0 then WriteLn('Phuong trinh co vo so nghiem')
Else WriteLn('Phuong trinh vo nghiem ');
{hoi de lap lai chuong trinh}
Write(’Co thuc hien chuong trinh lan nua khong (C/K)? ’);
ReadLn(TL);
Until (TL=’k’) or (TL=’K’);
END.
c) Mẫu 3: Để xây dựng chương trình điều khiển bảng chọn
Ví dụ 6.11: viết chương trình nhập vào ba số a, b, c cho đến khi chúng thỏa mãn là độ dài của ba cạnh trong một tam giác. Xây dựng menu chọn công việc thực hiên
Công việc 1: tính chu vi tam giác
Công việc 2: tính diện tích tam giác
Program vidu_6_11;
Var a, b, c, S, CV: real;
ch:char;
Begin
Repeat
Write(‘ Nhap ba so a, b, c : ‘);readln(a,b,c);
Until (a+b>c)and(a+c>b)and(b+c>a)and(a>0)and(b>0)and(c>0);
Repeat
Writeln(‘ Cac lua chon: ‘);
Writeln(‘ 0: Thoat khoi chuong trinh!’);
Writeln(‘ 1: Tinh chu vi tam giac, ’);
Writeln(‘ 2: Tinh dien tich tam giac,’);
Write(‘ Lua chon cua ban la : ’);readln(ch);
Case ch of
‘0’: readln;
‘1’: begin
CV:=a+b+c;
Writeln(‘ Chu vi tam giac la CV = ‘,CV:8:2);
end;
‘2’: begin
p:=(a+b+c)/2;
S:=sqrt(p*(p-a)*(p-b)*(p-c));
Writeln(‘ dien tich tam giac la S =’, S:8:2);
end;
Until (ch:=’0’);
End.
6.4.3 Câu lệnh lặp không xác đinh kiểm tra điều kiện trước WHILE
Câu lệnh WHILE cũng là câu lệnh lặp với số lần lặp không biết trước giống như câu lệnh REPEAT - UNTIL. Điểm khác của câu lệnh WHILE là thực hiện kiểm tra điều kiện trước, nếu thỏa mãn (điều kiện vẫn sai) thì thực hiện công việc và nếu không thỏa mãn (điều kiện đúng) thì dừng và kết thúc vòng lặp.
6.4.3.1 Cú pháp
While <Điều kiện> do ;
Trong đó:
<Điều kiện> là một biểu thức logic, trả về giá trị TRUE hoặc FALSE
Có thể là một lệnh hoặc một khối lệnh, nếu là một khối lệnh thì phải được đặt trong Begin ... End;
6.4.3.2 Sự hoạt động
i) Tính giá trị của biểu thức logic Điều_kiện,
ii) Nếu đúng, thực hiện công việc và quay lại bước i),
iii) Nếu sai, kết thúc câu lệnh While.
6.4.3.3 Lưu đồ thể hiện sự hoạt động
Hình 6.6. Lưu đồ hoạt động của
câu lệnh While.
6.4.3.4. Chú ý
Trong khi thực hiện phải có một lệnh làm thay đổi giá trị của một biến thuộc biểu thức logic <Điều kiện> để làm cho biểu thức logic tiến đến FALSE nhằm kết thúc vòng lặp.
được thực hiện sau khi kiểm tra <Điều kiện> nên có thể không được thực hiện một lần nào vì ngay từ đầu <Điều kiện> đã có giá trị FALSE.
Câu lệnh lặp While ... do cũng dùng được trong trường hợp đã biết trước số lần lặp.
Ví dụ 6.12: Tính tổng S=1+1/2+1/3+...+1/n . Biết rằng n là một số nguyên dương được đọc vào từ bàn phím.
Program VIDU_6_12;
Uses Crt;
Var i, n: Integer;
s: Real;
BEGIN
ClrScr;
Write('Nhap n= '); ReadLn(n);
s:=0; i:=1;
While i<=n do
Begin
s:=s+1/i;
i:=i+1;
End;
WriteLn('Tong S= ',s:8:3);
ReadLn;
END.
6.4.3.5. Xây dựng cấu trúc lặp với câu lệnh không xác định WHILE
Dưới đây giới thiệu một số bài toán thường sử dụng lặp và phương pháp giải.
a) Điều khiển vòng lặp bằng giá trị canh chừng
Ta xét ví dụ sau
Ví dụ 6.13: viết chương trình nhập vào số thực a. Với n lớn nhất bằng bao nhiêu để tổng S = 1++ +…+ nhỏ hơn số a cho trước.
Với ví dụ này ta không biết trước số lần lặp vì giá trị a là giá trị bất kỳ được nhập từ bàn phím. Ta lấy giá trị a là giá trị canh chừng để dừng vòng lặp. Thực hiện như sau:
i) Dữ_liệu_vào := giá _trị_đầu_tiên;
ii) while dữ_liệu_vào <= giá_trị_canh_chừng_a do
begin
….
Dữ_liệu_vào:=giá_trị_tiếp_theo;
end;
Chương trình chi tiết:
Program vidu_6_13;
Var a, S: real;
n, i: integer;
Begin
write(‘ Nhap a = ‘);readln(a);
S:=0; i:=1; {khoi gan gia tri ban đau cho S va i}
while S<=a do {chung nao S con nho hon a thi con}
Begin
S:=S+1/i;
i:=i+1;
End;
n:=i-1; {n=i-1 vì khi kết thúc vòng lặp,
giá trị của i làm S>=a}
writeln(‘ Gia tri n lon nhat thoa man la n = ‘, n);
readln;
End.
b) Điều khiển vòng lặp bằng cờ báo:
Xây dựng cấu trúc lặp mà được điều khiển bằng cờ báo thường áp dụng cho các bài toán tìm kiếm sự tồn tại hay phần tử có tính chất nào đó. Với bài toán này thường sử dụng một biến logic, ta thường khởi tạo cho biến cờ báo này một giá trị là FALSE, lặp lại nhiều lần phép kiểm tra cho đến khi điều kiện được thỏa mãn tức tìm thấy, khi đó ta gán cho biến cờ báo giá trị là TRUE và vòng lặp kết thúc. Cụ thể như sau:
(i) Cờ_báo:=false;
(ii) while not cờ_báo do
begin
…..
if tìm_thấy then cờ_báo:=true;
end;
Ta xét ví dụ sau:
Ví dụ 6.14: Viết chương trình tìm số chính phương chẵn nhỏ nhất lớn hơn m với m nhập từ bàn phím, in kết quả lên màn hình.
Program vidu_6_14;
Var i, m: integer;
Found:boolean;
Begin
i:=m;
found:=false;
while found =false do
if (frac(sqrt(i))=0)) and (i mod 2 =0) then
found:=true;
else i:=i+1;
writeln(‘ So chinh phuong chan nho nhat ma lon
hon ‘,m,’ la ‘, i);
readln;
End.
Chia sẻ với bạn bè của bạn: