HomeHọc sinh giỏi môn tin

Seri 100 bài tập Pascal nâng cao – CHƯƠNG IV : CẤU TRÚC LẶP KHÔNG XÁC ĐỊNH

Like Tweet Pin it Share Share Email
Like và share giúp mình phát triển website nhé.
  •  
  •  

CHƯƠNG IV : CẤU TRÚC LẶP KHÔNG XÁC ĐỊNH

  1. LÝ THUYẾT

 

Dạng REPEAT Dạng WHILE
Repeat

S;

Until B;

While B Do S;

Ý nghĩa:

  • Dạng REPEAT: Lặp lại công việc S cho đến khi biểu thức B=TRUE thì dừng. Trước Repeat có thể B chưa được xác định nhưng khi thực hiện S thì B xác định.
  • Dạng WHILE: Trong khi biểu thức B=TRUE thì tiếp tục thực hiện công việc S. Trước While cần có các lệnh để B được xác định.
  • Yêu cầu quan trọng: Trong S phải có một lệnh làm thay đổi dữ liệu liên quan đến điều kiện B.

 

  1. BÀI TẬP

Bài tập 4.1:

Viết chương trình in ra các số lẻ nhỏ hơn hoặc bằng số nguyên dương n ( Với n được nhập). Yêu cầu nhập lại nếu n <=0

  1. Hướng dẫn:

– Sử dụng kiến thức số lẻ đầu tiên bằng 1. Số lẻ sau bằng số trước cộng với 2.

–  Cho biến i có giá trị ban đầu bằng 1.

–  Dùng vòng lặp while do với điều kiện i < n và công việc bên trong là in i và tăng i lên 2.

  1. Mã chương trình:
Program In_So_Le;

uses crt;

var i,n:integer;

begin

clrscr;

Repeat

write(‘Nhap so n: ‘);readln(n);

until n>0;

i:=1;

while i<=n do

begin

write(i:3,’, ‘);

i:=i+2;

end;

readln

end.

 

Nhận xét:

– Mọi vòng lặp For … to … do đều có thể thay thế bằng vòng lặp while … do.

– Đoạn mã:

Repeat

write(‘Nhap so n: ‘);readln(n);

until n>0;

Dùng để kiểm tra, khống chế điều kiện của dữ liệu vào.

– Trong vòng lặp while nhất thiết phải có một câu lệnh làm thay đổi điều kiện lặp. Ở đây là i:=i+2. Nếu không có sẽ dẫn đến trường hợp lặp vô hạn. Chương trình chạy mãi mà không có lối ra (Không thoát ra khỏi vòng lặp được).

 

Bài tập 4.2:

            Viết chương trình tính n! với n! được định nghĩa như sau:

– n! = 1 với n = 0

– n! = 1.2.3…n (Tích của n số từ 1 đến n).

Yêu cầu: Sử dụng vòng lặp với số lần chưa biết trước:

  1. Hướng dẫn:

– Có thể viết lại: n! = n.(n-1)… 3.2.1.

– Lặp gt = gt*n; n = n-1 với điều kiện n>0.

  1. Mã chương trình:
Program Giai_Thua_while;

uses crt;

var n, gt:longint;

begin

clrscr;

Repeat

write(‘Nhap so n: ‘);readln(n);

until n>0;

gt:=1;

while n>0 do

begin

gt:=gt*n;

n:=n-1;

end;

writeln(‘Giai thua cua n la: ‘,gt);

readln

end.

  1. Nhận xét: Tiết kiệm được một biến i để chạy nhưng làm thay đổi n nên khi xuất ra chỉ có thể xuất một câu chung chung “Giai thua cua n la:”

 

Bài tập 4.3:

            Viết chương trình tính n!! (giai thừa kép) với n!! được định nghĩa như sau:

– n!! = 1 với n = 0

– n!! = 1.3.5..n với n lẻ.

– n!! = 2.4.6..n với n chẵn.

Yêu cầu: Sử dụng vòng lặp với số lần chưa biết trước:

  1. Hướng dẫn:

– Hai số chẵn liên tiếp hơn kém nhau 2. Hai số lẻ liên tiếp cũng vậy.

– Thực hiện tính như giai thừa đơn nhưng với bước nhảy là 2.

  1. Mã chương trình:
Program  Giai_thua_kep;

uses crt;

var n,gt:longint;

begin

Repeat

write(‘Nhap so n: ‘);readln(n);

until n>0;

gt:=1;

while n>0 do

begin

gt:=gt*n;

n:=n-2;

end;

write(‘Giai thua la: ‘,gt);

readln

end.

  1. Nhận xét:

– Với thuật toán trên ta không cần xét n là chẵn hay lẻ.

 

Bài tập 4.4:

            Viết chương trình cho phép tính tổng của nhiều số (Chưa biết bao nhiêu số). Nhập số 0 để kết thúc quá trình nhập.

  1. Hướng dẫn:
  2. Mã chương trình:
Program Tong_Repeat;

uses crt;

var i: byte;

so, tong: real;

begin

write(‘NHAP CAC SO – NHAP 0 DE NGUNG ‘);

readln;

repeat

clrscr;

write(‘Nhap so thu ‘,i,’: ‘);

readln(so); tong:=tong+so; i:=i+1;

until so=0;

write(‘Tong la: ‘,tong:6:1);

readln

end.

 

Bài tập 4.5

Viết chương trình tìm ước chung lớn nhất (UCLN) của hai số với yêu cầu sử dụng thuật toán Euclid.

Thuật toán Euclid:  Nếu a chia hết cho b (a chia b dư 0) thì UCLN(a,b) bằng b

Nếu a chia b dư r thì UCLN(a,b) = UCLN(b,r)

a.Hướng dẫn:

– Nhập a, b và gán r = a mod b.

– Lặp với điều kiện r <> 0: b = r, a = b, r = a mod b.

b.Mã chương trình:

Program UCLN;

uses crt;

var a,b,r:byte;

begin

clrscr;

writeln(‘CHUONG TRINH TIM UCLN CUA HAI SO’);

write(‘Nhap a: ‘);readln(a);

write(‘Nhap b: ‘);readln(b);

r:=a mod b;

while r<> 0 do

begin

b:=r;

a:=b;

r:=a mod b;

end;

write(‘UCLN cua hai so la: ‘,b);

readln

end.

 

Bài tập 4.6

Dãy Fibonacy có hai phần tử đầu là 1, 1. Các phần tử sau bằng tổng hai phần tử đứng ngay trước nó: 1, 1, 2, 3, 5, 8, 13, 21, …

Viết chương trình in ra dãy Fibonacy có phần tử lớn nhất nhỏ hơn n?

a.Hướng dẫn:

– Cần hai biến F_1 và F có giá trị đầu là 1, 1.

– Thực hiện lặp cho đến khi F >= n.

– Do yêu cầu chỉ in các số bé hơn n nên khi in cần thêm một lệnh kiểm tra.

b.Mã chương trình:

Program Fi_Bo_na_xi;

Var n, F_2,F_1, F: Longint;

Begin

Write(‘Nhap n: ‘);Readln(n);

F_1:=1; F_2:=1;

Write(F_2,’;’,F_1,’;’);

Repeat

F:=F_2+F_1;

if F< n then Write(F,’;’);

F_2:=F_1; F_1:=F;

Until F>n;

Readln;

End.

Nhận xét: Giữa Repeat … until có thể chứa nhiều lệnh mà không cần ghép.

Hãy phát triển bài tập theo hướng chỉ in một phần tử trong dãy lớn nhất nhưng bé hơn n hoặc theo hướng phần tử thứ k của dãy.

 

 

Comments (0)

Trả lời

Your email address will not be published. Required fields are marked *