Giáo trình Nhập môn Tin học LỜi nóI ĐẦU



tải về 4.67 Mb.
trang50/63
Chuyển đổi dữ liệu20.05.2018
Kích4.67 Mb.
1   ...   46   47   48   49   50   51   52   53   ...   63

6.4. Câu lệnh lặp không xác định WHILE và REPEAT

6.4.1 Ý nghĩa


Rất nhiều trường hợp bài toán cần phải lặp đi lặp lại một hoặc một số công việc song lại không thể xác định được là phải lặp bao nhiêu lần, do vậy không thể dùng lệnh FOR được. Pascal cung cấp 2 lệnh là REPEAT và WHILE để lặp cho những trường hợp không biết trước số lần lặp.

6.4.2 Câu lệnh lặp không xác định kiểm tra điều kiện sau REPEAT


Câu lệnh REPEAT là câu lệnh lặp thực hiện công việc trước, kiểm tra điều kiện sau. Câu lệnh này thường được sử dụng trong những bài toán mà ta chỉ biết một điều kiện kiểm tra, cần lặp đi lặp lại công việc cho đến khi điều kiện này được thỏa mãn. Những trường hợp như tính toán thỏa mãn sai số cho trước, chạy thử một chương trình nhiều lần để kiểm tra mà chỉ cần ấn Ctrl+F9 một lần, chương trình chỉ dừng khi ta chọn K hoặc k cho câu hỏi “Co tiep tuc nua khong? (C/K)” hay nhấn phím ESC cho câu hỏi “Co tiep tuc nua khong? (nhan ESC de dung),… Thực hiện câu lệnh REPEAT - UNTIL như sau:

6.4.2.1 Cú pháp

Repeat

;

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.
1   ...   46   47   48   49   50   51   52   53   ...   63


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương