PHẦN III NGÔN NGỮ LẬP TRÌNH PASCAL -1
Chương 3 MỘT SỐ LỆNH CƠ BẢN CỦA PASCAL
III. Các lệnh chu trình (Cấu trúc lặp)
Ở phần trên ta mới xét đến các dạng bài toán thực hiện đơn lẻ các phép tính hoặc các phép xử lý. Trong nhiều bài toán (đặc biệt khi xử lý dữ liệu mảng), ta phải lặp lại nhiều lần một số lệnh nào đó với dạng tổng quát không thay đổi. Nếu viết lặp lại các công thức này thì dài, nhàm chán và không thể nếu chưa biết số lần lặp. Để thể hiện dạng thuật toán lặp, người ta đưa ra cấu trúc cho một hoặc nhiều vòng lặp lồng nhau.
Với các dạng thuật toán lặp, Pascal xử dụng các lệnh For To Do, While Do, Repeat Until hoặc các lệnh gán kết hợp với IF – Goto để thể hiện cho vòng lặp biết trước số lần
lặp hoặc vòng lặp không xác định.
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal - 1 GVC: Đào Tăng Kiệm
Bộ môn Tin học Xây dựng 25
1. Câu lệnh lặp với số lần lặp xác định FOR ( FOR TO DO)
Khái niệm: Lệnh For To Do dùng cho các bài toán lặp với số lần lặp đã xác định và bước nhẩy (số gia) của biến điều khiển chỉ là +1 hoặc -1.
Cấu trúc lệnh :
FOR Bđk := n1 TO n2 DO Các lệnh lặp ; FOR Bđk := n1 DOWNTO n2 DO Các lệnh lặp ;
Giải thích các đại lượng :
- Bđk là biến điều khiển hay biến đếm của chu trình. n1 và n2 là giá trị đầu và giá trị
cuối của biến điều khiển, chúng phải là các hằng, biến hoặc biểu thức đơn giản có kiểu nguyên hoặc ký tự.
- Miền tác động của lệnh (Các lệnh lặp) có thể là 1 hoặc nhiều lệnh sẽ được thực hiện với số vòng lặp |n1-n2| lần.
Cách thực hiện của lệnh: Khi gặp lệnh, chương trìnhc thực hiện cũng gồm 4 bước như trong phần thuật toán. Có thể hiểu là: Các lệnh lặp sẽ được thực hiện nhiều lần với giá trị của biến điều khiển từ n1 đến n2. Câu lệnh sẽ tự động thực hiện các bước:
gán giá trị đầu, tăng và kiểm tra giá trị cuối của biến điều khiển (mà không thể hiện từng bước này trong câu lệnh).
Các lưu ý:
- Nếu Miền tác động có 1 lệnh thì viết ngay sau Do, nếu có từ 2 lệnh trở lên thì các lệnh này phải đặt trong khối Begin …End;
- Khôngcó dấu ; sau Do
- Các lệnh có thể lồng nhau, tuy nhiên các vòng lặp không được cắt nhau.
- Vòng lặp trong có thể kết thức trước khi đến giá trị cuối của biến điều khiển và
chuyển ra vòng lặp ngoài, tuy nhiên không thể chuyển từ vòng lặp ngoài vào vòng lặp trong.
- Lệnh For to Do là loại lệnh thực hiện trước, kiểm tra sau, do vậy ít nhất sẽ thực hiện
1 lần.
- Trong miền tác động của lệnh không được có lệnh nào làm biến đổi giá trị đầu, cuối của biến điều khiển.
Ví dụ: - Các ví dụ minh hoạ cho câu lệnh.
+ FOR i := 1 TO n DO T:=T + A[i] ; (Tính tổng 1 véc tơ) + FOR i := 1 m DO (Nhập dữ liệu và tính tổng cho mảng A) Begin
Write (’ A[ ’ , I , ’ ] = ’); Readln ( A[i] );
T:=T + A[i] ; End;
- Các bài tập:
+ Bài tập 1: Viết chương trình Tìm giá trị lớn nhất của một vecto (Ví dụ 6 phần thuật toán)
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal - 1 GVC: Đào Tăng Kiệm
Program tim_max_cua_vec_to;
Var i,n: integer;
a: array [1 .. 50] of real;
ln:real;
BEGIN
write('Nhap so phan tu n=');
readln (n);
for i:=1 to n do
Begin
Write ( 'Nhap gia tri cua phan tu thu ', i, ': ' );
Readln (a[i]);
End;
ln:= a [1];
for i:=1 to n do
if a[i]> ln then ln := a[i];
writeln ('Gia tri lon nhat cua day so la ', ln: 10:2);
readln;
END.
+ Bài tập 2: Cho một ma trận B có mxn phần tử. Viết chương trình Pascal tính số lượng
các phần tử > K trong từng hàng và tích các phần tử < K trong cả ma trận.
Program Tim_so_luong_Tich ;
Var i, j, m, n, dem : integer;
B: array [1.. 10, 1.. 10 ] of real;
Sl: array [1.. 10 ] of integer; K, Tich :real ;
BEGIN
Write ( ' Nhap so phan tu cua ma tran m, n= ' );
Readln (m, n);
Write ( ' Nhap gia tri K = ' );
Readln (k);
for i:=1 to m do
for j:=1 to n do
Begin
Write ('Nhap gia tri cua phan tu B [', i, ',' , j , ’ ] ’ );
Readln ( B [ i,j ] );
End;
For i := 1 to m do
Begin
SL [i] := 0 ;
for j := 1 n do If B [ i, j ] > K Then SL [i] := SL [i] +1 ;
End;
Tich := 1 ; dem := 0 ;
For i := 1 to m do
for j := 1 n do If B [ i, j ] < K Then
Begin Tich := Tich * B [I,j] ;
Dem := Dem + 1 ; End;
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal - 1 GVC: Đào Tăng Kiệm
Bộ môn Tin học Xây dựng 27
{ Xuat ket qua }
Wwiteln ( ’ So luong cac phan tu cua tung hang > K ’ );
For i:= 1 to m do Writeln ( ’ Hang ’ , i , ’ : ’ , SL [[i] :5 ) ;
If Dem <> 0 Then Writeln ( ’ Tich cac phan tu < K = ’ , Tich : 8:2 )
Else Writeln ( ’ Khong co phan tu nao < K , Tich = 0 ’ ) .
Readln
END.
2. Câu lệnh lặp kiểm tra điều kiện trước - WHILE (WHILE DO)
Khái niệm: Lệnh While Do dùng cho cả 2 dạng bài toán lặp với số lần lặp đã xác định và không xác định .
Cấu trúc lệnh :
WHILE < Biểu thức điều kiện > DO Các lệnh lặp ;
Giải thích các đại lượng :
- Biểu thức điều kiện là biểu thức so sánh hoặc Logic, kết quả của nó chỉ nhận một trong
2 giá trị đúng hoặc sai.
- Miền tác động của lệnh (Các lệnh lặp) có thể là 1 hoặc nhiều lệnh sẽ được thực hiện khi điều kiện đúng.
Cách thực hiện của lệnh: Khi gặp lệnh, chương trình kiểm tra giá trị của BTĐK, các lệnh lặp sẽ được thực hiện khi giá trị của biểu thức điều kiện vẫn là “đúng” và sẽ dừng thực hiện ngay khi giá trị của BTĐK nhận giá trị “sai” .
Các lưu ý :
- Khi sử dụng lệnh While Do cho các thuật toán chu trình phải chú ý, trong câu lệnh chưa có các bước gán giá trị đầu và tăng biến điều khiển. Do vậy chúng ta phải tự bổ sung nếu cần. Bước nhẩy của biến điều khiển là bất kỳ.
- Nếu Miền tác động có 1 lệnh thì viết ngay sau Do, nếu có từ 2 lệnh trở lên thì các lệnh này phải đặt trong khối Begin …End;
- Khôngcó dấu ; sau Do
- Các lệnh có thể lồng nhau, tuy nhiên các vòng lặp không được cắt nhau.
- Vòng lặp trong có thể kết thức trước khi giá trị của biến điều khiển nhận giá trị “sai”
và chuyển ra vòng lặp ngoài, tuy nhiên không thể chuyển từ vòng lặp ngoài vào vòng lặp trong.
- Lệnh While Do là loại lệnh kiểm tra trước,thực hiện sau, do vậy có thể không có vòng lặp nào được thực hiện.
Ví dụ: - Các ví dụ minh hoạ cho câu lệnh:
+ WHILE i <= n DO T:= T + i / X[i] ;
+ WHILE Hoi = ‘C’ DO
Begin
Write (‘Nhap du lieu ‘);
Readln ( SV [i]. Hoten, SV [i] . Diem);
…
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal - 1 GVC: Đào Tăng Kiệm
Readln (Hoi) ;
End;
+ i:= 1 ;
WHILE i <= n DO
Begin Write (’ A[ ’ , i , ’ ] = ’); Readln ( A[i] );
T:=T + A[i] ; i := i+ 1 End;
3. Câu lệnh lặp với điều kiện kiểm tra sau - REPEAT (REPEAT UNTIL)
Khái niệm: Lệnh Repeat Until dùng cho cả 2 dạng bài toán lặp với số lần lặp đã xác định và không xác định.
Cấu trúc lệnh :
Repeat < Các lệnh lặp> Until < Biểu thức điều kiện>;
Giải thích các đại lượng :
- Biểu thức điều kiện là biểu thức so sánh hoặc Logic, kết quả của nó chỉ nhận một trong
2 giá trị đúng hoặc sai.
- Miền tác động của lệnh (Các lệnh lặp nằm giữa Repeat và Until) có thể là 1 hoặc nhiều lệnh, các lệnh này sẽ được thực hiện khi điều kiện là sai.
Cách thực hiện của lệnh: Khi gặp lệnh, chương trình thực hiện ít nhất một lần các lệnh trong miền tác động (giữa Repeat tới Until), sau đó kiểm tra giá trị của BTĐK, các lệnh sẽ được thực hiện lặp lại khi giá trị của biểu thức điều kiện là “sai” và sẽ dừng thực hiện ngay khi giá trị của BTĐK nhận giá trị “đúng” .
Các lưu ý :
- Khi sử dụng lệnh Repeat .. Until cho các thuật toán chu trình phải chú ý, trong câu lệnh chưa có các bước gán giá trị đầu và tăng biến điều khiển. Do vậy chúng ta phải
tự bổ sung nếu cần. Bước nhẩy của biến điều khiển có thể là bất kỳ.
- Miền tác động của lệnh không phải đặt trong khối Begin …End;
- Các lệnh có thể lồng nhau, tuy nhiên các vòng lặp không được cắt nhau.
- Vòng lặp trong có thể kết thúc trước khi giá trị của biểu thức điều kiện nhận giá trị
“đúng” và chuyển ra vòng lặp ngoài, tuy nhiên không thể chuyển từ vòng lặp ngoài vào vòng lặp trong.
- Lệnh Repeat Until là loại lệnh thực hiện trước, kiểm tra sau, do vậy các lệnh lặp sẽ thực hiện ít nhất 1 lần.
Ví dụ: - Các ví dụ minh hoạ cho câu lệnh:
+ REPEAT
T:= T + i / X[i]
Until i > n ;
+ REPEAT
Write (‘Nhap du lieu, Ho ten ‘);
Readln ( SV[i] . Hoten);
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal - 1 GVC: Đào Tăng Kiệm
Bộ môn Tin học Xây dựng 29
…
Readln (Hoi) ;
Until Hoi = ‘K’;
+ i:= 1 ;
Repeat
Write (’ A[ ’ , i , ’ ] = ’); Readln ( A[i] );
T:=T + A[i] ; i := i+ 1 Until i > n ;
- Ví dụ sử dụng cả 3 lệnh chu trình: Cho một véc tơ A có n phần tử. Viết chương trình tạo ra 2 véc tơ mới từ A là véc tơ B chỉ chứa các phần tử dương và véc tơ C chỉ chứa các phần tử âm.
Program Tach_vec_to;
Var i,j,k, n: integer;
A, B, C : array [1..10] of real;
BEGIN
Write (' Nhap so phan tu n= ');
Readln (n);
i:=1; { Nhap du lieu mang A – su dung Repeat }
Repeat
Write (' Nhap gia tri cua phan tu thu A[ ', i, ' ] : ' );
Readln (a[i]);
i:= i+ 1
Until i >n ;
{ Tach vec to – Su dung While Do }
i:=1; j:= 1 ; k:= 1;
While i<= n Do
Begin
If a[i] > 0 Then
Begin
J:= j + 1;
B [j] := A[i]
End
Else If a[i] <0 Then
Begin
k := k + 1 ;
C [k] := A [i]
End;
i:= i+ 1 ;
End;
{ In ket qua - Su dung For }
If j <> 0 Then
Begin Writeln ( ’ Cac phan tu cua vec to B’ );
For i:= 1 to J Do Write (B [i] :6:1);
Writeln;
End
Else Writeln ( ’ Khong co phan tu duong trong vec to A ’ );
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal - 1 GVC: Đào Tăng Kiệm
If k <> 0 Then
Begin Writeln ( ’ Cac phan tu cua vec to B’ );
For i:= 1 to k Do Write (C [i] :6:1);
Writeln;
End
Else Writeln ( ’ Khong co phan tu am trong vec to A ’ );
Readln
END.