m1, m2 là các biểu thức có cùng kiểu dữ liệu với biến, LệnhP có thể là một lệnh đơn giản, lệnh có cấu trúc, hoặc là một lệnh ghép gồm nhiều lệnh đặt trong khối begin và end.. Nếu biến
Trang 1biến phải thuộc kiểu dữ liệu đơn giản đếm được, thường là kiểu nguyên, ký
tự hay lô gic, không thể là kiểu thực hay chuỗi
m1, m2 là các biểu thức có cùng kiểu dữ liệu với biến,
LệnhP có thể là một lệnh đơn giản, lệnh có cấu trúc, hoặc là một lệnh ghép
gồm nhiều lệnh đặt trong khối begin và end
Hình 9.1 là sơ đồ khối của lệnh For với b là viết tắt của biến
Cách thức hoạt động của FOR:
Bước 1: Gán giá trị biến := m1;
Bước 2: Nếu biến m2 thì làm LệnhP, rồi sang bước 3;
Trang 2Nếu biến >m2 thì không làm LệnhP mà chuyển sang lệnh kế tiếp ở phía dưới
Bước 3 : Tăng gía trị của biến : biến:=Succ(biến);
Quay lại bước 2
Tóm lại, LệnhP sẽ được làm đi làm lại, bắt đầu khi biến=m1, và kết thúc khi biến =m2+1, cả thảy là m2-m1+1 lần Vì thế, người ta gọi FOR là vòng lặp có số lần lặp đã biết trước
9.1.1.2 Các ví dụ cơ bản :
Ví dụ 9.1: Bài toán tính tổng :
Trang 3Qúa trình từ bước 1 đến bước 10 được gọi là phép cộng dồn vào biến S
Tại bước thứ i, lấy gía trị của biến S cộng với i2, kết qủa lại được gán cho biến S, do đó gía trị của biến S được tăng thêm một lượng bằ?g i2 Khi i thay đổi từ 1 đến 10 thì các số 12, 22, 32, , 102 đều được cộng vào S, kết qủa là sau bước thứ 10 gía trị của S đúng bằng tổng 12 + 22 + 32 + + 102
Tóm lại, lệnh: S:=S + i*i; được làm cả thảy 10 lầ?, ứng với i=1, 2, , 10 Qúa trình này được diễn đạt bằ?g lệ?h FOR, như sau:
For i:=1 To 10 DO S:=S+ i*i ;
Trang 4Một cách tổng quát, để tính tổng :S= 12 + 22+ 32+ + N2 , trong đó N là một số nguyên dương bất kỳ, ta dùng hai lệnh:
S:=0;
For i:=1 To N DO S:=S+ i*i ;
Dưới đây là chương trình cụ thể :
Trang 5Writeln(‘S= ‘, S);
Readln;
End
Chạy<VD91.EXE>
Chép file nguồn <VD91.PAS>
Mở rộng bài toán tính tổng: Tính tổng đan dấu :
sẽ dùng là :
S:=0;
Trang 6For i:=1 To N DO
if i mod 2 <> 0 then S:=S+ i*i else S:= S- i*i ;
Các bạn hãy viết chương trình để tính tổng đan dấu này
Trang 7Nếu trong ví dụ 1, ta phải cộng dồn vào biến S thì trong ví dụ này ta phải nhân dồn vào biến S Tại bước thứ i, lấy gía trị của biến S nhân với i, rồi lại
gán kết qủa cho biến S Khi i thay đổi từ 1 đến 10 thì S sẽ tích lũy đủ các thừa số 1, 2, 3, ,10, và gía trị của S sau bước thứ 10 đúng bằng
Trang 8Chép file nguồn <VD92.PAS>
Ví dụ 9.3: Bài toán tính lũy thừa:
Nhập số tự nhiên N và một số thực x bất kỳ, tính S= xN
Trang 9
Tương tự như tính N!: đầu tiên ta gán S:=1, sau đó tại mỗi bước lặp, ta nhân dồn x vào S bằng lệnh S:=S*x Sau N bước như vậy, S sẽ được nhân với x đúng N lần Vậy hai lệnh cần dùng là:
Trang 10Chép file nguồn <VD93.PAS>
Ví dụ 9.4: In bảng các chữ cái từ A đến Z thành bốn cột như sau:
Trang 11Trong chương trình ta dùng biến Dem để đếm số dòng đã in, mỗi khi in xong một dòng thì biến Dem được cộng thêm 1 Khi Dem = 15, 30, 45, (tức Dem mod 15=0) thì phải làm lệnh Readln; lệnh này sẽ dừng màn hình
cho đến khi ta gõ Enter mới in tiếp
Trang 13Chép file nguồn <VD94.PAS>
Chương trình trên là một ví dụ về cách dùng biến chạy kiểu ký tự (ch) trong lệnh FOR, ngoài ra, đóng vai trò LệnhP là một lệnh ghép, gồm nhiều lệnh đặt trong khối begin và end
9.1.2 Câu lệnh FOR dạng 2:
Cú pháp:
FOR biến := m2 DOWNTO m1 DO LệnhP;
Cách thức hoạt động của FOR dạng 2:
Bước 1: gán gía trị biến := m2;
Bước 2: Nếu biến m1 thì làm LệnhP, rồi sang bước 3
Nếu biến<m1 thì không làm LệnhP mà chuyển sang lệnh kế tiếp ở
phía dưới
Bước 3 : Giảm gía trị của biến : biến:=Pred(biến);
Quay lại bước 2
Trang 14Tóm lại, LệnhP sẽ được làm đi làm lại, bắt đầu khi biến=m2, và kết thúc
khi biến = m1-1, cả thảy là m2-m1+1 lần
Trang 15S:=1;
For i:=N downto 1 do S:=S* x;
Như vậy, lệnh FOR dạng 2 về bản chất chỉ là một cách viết khác của dạng
1 Thông thường người ta hay dùng lệnh FOR dạng 1, tuy nhiên có khá nhiều tình huống mà việc dùng lệnh FOR dạng 2 tỏ ra rất hiệu qủa, như ví
Trang 16For ch:=‘Z’ downto ‘A’ do write(ch:3 );
Chép file nguồn <VD96.PAS>
9.1.3 Câu lệnh FOR lồng nhau :
Trong cấu trúc FOR, khi LệnhP cũng là một lệnh FOR thì ta có cấu trúc FOR lồng nhau:
FOR biến1:= m1 TO m2 DO {1}
FOR biến2:=n1 TO n2 DO LệnhP; {2}
Cách thức hoạt động của lệnh này như sau:
Trang 17Ðầu tiên cho biến1:=m1 và làm lệnh ở dòng {2} Vì dòng {2} là lệnh FOR nên với mỗi gía trị của biến2=n1, , n2, đều phải làm LệnhP, kết qủa
là LệnhP được làm n2-n1+1 lần
Bây giờ tăng: biến1:=Succ(biến1), rồi lại làm lệnh FOR ở dòng {2}, kết qủa lệnhP được làm thêm n2-n1+1 lần nữa
.v.v
Qúa trình trên cứ tiếp tục cho đến khi biến1=m2+1 thì dừng
Lệnh FOR {1} làm m2-m1+1 lần lệnh FOR {2}, còn chính lệnh FOR {2} lại làm n2-n1+1 lần LệnhP Vì thế lệnhP được làm cả thảy là (m2-
Trang 18For j:=1 to m do write(‘A’);
Lệnh Write in m chữ A trên một dòng In xong, con trỏ vẫn nằm ở cuối dòng đó, vì thế trước khi in dòng tiếp theo, cần phải đưa con trỏ xuống dòng dưới bằng lệnh:
Trang 19U0=1, U1=1 , Uk=Uk-1 + Uk-2 với mọi k= 2, 3, 4,
Gọi U là số hạng thứ k, Uo và U1 lần lượt là hai số hạng đứng ngay trước U Ðầu tiên ta gán:
Uo:=1;
U1:=1;
Trang 20Bước 1: tính U:=Uo+U1 và in U Lúc này U=2 chính là U2
Ðể chuẩn bị tính U3, ta cho Uo đóng vai trò của U1 và U1 đóng vai trò của U, tức là gán:
Uo:=U1;
U1:=U;
Kết qủa là Uo=1 và U1=2
Bước 2: tính U:=Uo+U1 và in U Lúc này U=3 chính là U3
Ðể chuẩn bị tính U4, ta lại cho Uo đóng vai trò của U1 và U1 đóng vai trò của U, tức là gán:
Trang 22Chép file nguồn <VD98.PAS>
Ví dụ 9.9: Bài toán tính tiền lãi gửi ngân hàng:
Trang 23Nhập tiền vốn ban đầu, số tháng gửi N và lãi suất hàng tháng Tính số tiền nhận được sau mỗi tháng gửi biết rằng tiền lãi hàng tháng được gộp vào tiền vốn
Ví dụ, tiền vốn là100, lãi suất tháng là 2% Sau 1 tháng gửi sẽ có số tiền là:
Số tiền=100 + 100*0.02 = 102
Sau 2 tháng gửi sẽ có số tiền là:
Số tiền=102 + 102*0.02 = 104.04
Công thức tính tiền thu được sau mỗi tháng gửi là:
Số tiền := Tiền vốn + Tiền vốn * Lãi suất
Số tiền này lại trở thành tiền vốn của tháng sau, tức là:
Tiền vốn := Số tiền;
Qúa trình cứ lặp đi lặp lại từ tháng 1 đến tháng N
Chương trình cụ thể như sau:
PROGRAM VIDU99;
Trang 24{ Tính tiền gửi ngân hàng sau N tháng}
Sotien:= Tienvon + Tienvon*Laisuat;
Writeln(‘Số tiền sau ‘, i , ‘ tháng =‘ , Sotien:8:2);
Tienvon:=Sotien;
end;
Readln;
Trang 25End
Chạy<VD99.EXE>
Chép file nguồn <VD99.PAS>