Trên cơ sở đó, nội dung Chương III – Cấutrúc rẽ nhánh và lặp, cung cấp các cấu trúc điều khiển trong lập trình nói chung và cáccâu lệnh thể hiện cấu trúc điều khiển cụ thể trong pascal n
Trang 1A PHẦN MỞ ĐẦU
I/ Lý do chọn đề tài
Trong thời đại của chúng ta, sự bùng nổ CNTT đã tác động lớn đến công cuộcphát triển kinh tế xã hội người Đảng và Nhà nước đã xác định rõ ý nghĩa và tầm quantrọng của tin học và CNTT, truyền thông cũng như những yêu cầu đẩy mạnh của ứngdụng CNTT, đào tạo nguồn nhân lực đáp ứng yêu cầu CNH, HĐH, mở cửa và hội nhập,hướng tới nền kinh tế tri thức của nước ta nói riêng - thế giới nói chung
Chính vì xác định được tầm quan trọng đó nên Nhà nước ta đã đưa môn tin học vàotrong nhà trường và ngay từ tiểu học học sinh được tiếp xúc với môn tin học để làm quendần với lĩnh vực CNTT, tạo nền móng cơ sở ban đầu để học những phần nâng cao trongcác cấp tiếp theo Nhất là trong năm học 2009 - 2010 này, năm học của ứng dụng CNTT
Chương trình Tin học lớp 11 nhằm trang bị cho học sinh một số khái niệm cơ bản
về lập trình và ngôn ngữ lập trình bậc cao Trên cơ sở đó, nội dung Chương III – Cấutrúc rẽ nhánh và lặp, cung cấp các cấu trúc điều khiển trong lập trình nói chung và cáccâu lệnh thể hiện cấu trúc điều khiển cụ thể trong pascal nói riêng, nhờ đó học sinh cóthể bước đầu giải một số bài toán cơ bản Để giúp học sinh hiểu rõ ý nghĩa và nội dungcủa các cấu trúc điều khiển này, giáo viên nên hướng dẫn, gợi ý và tạo mọi cơ hộicho học sinh tự giải những bài toán đơn giản Từ lý do trên, tôi xin trình bày sáng
kiến kinh nghiệm “CÂU LỆNH LẶP TRONG PASCAL”.
II/ Mục đích của đề tài
- Hướng dẫn HS lập trình giải quyết các bài toán sử dụng cấu trúc lặp
- HS nhận thức sự cần thiết của việc sử dụng cấu trúc lặp để giải các bài toán Từ đókhơi gợi lòng ham thích giải toán bằng lập trình trên máy tính
- Rèn luyện các phẩm chất: cẩn thận, chu đáo, sáng tạo…
III/ Đối tượng nghiên cứu
- Môn Tin học lớp 11
- Học sinh khối lớp 11 Trường THPT Số 2 Lào Cai
IV/ Phương pháp nghiên cứu
- Phỏng vấn học sinh khối 11
- Kiểm tra việc học tập của học sinh (bài cũ, bài mới)
Trang 2- Sử dụng bảng biểu đối chiếu.
- Thăm lớp, dự giờ
- Kiểm tra chất lượng sau giờ học
- Tận dụng tối đa các buổi học thực hành để các em được làm quen và luyện tậpthật tốt các bài học lý thuyết
Trang 3m1, 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épgồm nhiều lệnh đặt trong khối begin và end
Hình 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;
Nế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 khibiế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
Hình 1: Sơ đồ câu lệnh For dạng 1
Trang 4Quá 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 quả lại được gán cho biến S, do đó giá trị củabiến S được tăng thêm một lượng bằng 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 quả 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ìnhnày được diễn đạt bằng lệnh FOR, như sau:
For i:=1 To 10 DO S:=S+ i*i ;
Một cách tổng quát, để tính tổng:S= 12 + 22+ 32+ + N2, trong đó N là một số nguyêndươ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 5Nhận thấy, số hạng thứ i của vế phải có gía trị tuyệt đối bằng i2, mang dấu cộng nếu i
lẻ, mang dấu trừ nếu i chẵn Nói cách khác, ta sẽ cộng dồn i2 vào S nếu i lẻ, và cộng dồn(- i2 ) vào S nếu i chẵn Việc xác định i lẻ hay chẵn dựa vào hàm Odd(i) hay kết quả củaphép toán i Mod 2 Vậy, các lệnh sẽ dùng là:
Nế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 giá trị của biến S nhân với i, rồi lại gán kết quả 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 Ssau bước thứ 10 đúng bằng 1*2*3* *10 =10!
Qúa trình thực hiện từ bước 1 đến bước thứ 10 được mô tả bằng câu lệnh For:
For i:=1 to 10 DO S:=S * i ;
Một cách tổng quát, để tính tích: S= 1*2* *N, trong đó N là một số nguyên dương bất kỳ, ta dùng hai lệnh:
S:=1;
Trang 7Trong 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 PROGRAM VIDU4;
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
Tó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 8For 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ôngthườ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ệcdùng lệnh FOR dạng 2 tỏ ra rất hiệu quả, như ví dụ sau đây:
Ví dụ 6: In các chữ cái theo thứ tự ngược từ Z đến A thành hai dòng:
3 Câu lệnh FOR lồng nhau:
Hình 2: Sơ đồ câu lệnh FOR dạng 2
Trang 9Trong 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:
Ðầu tiên cho biến1:=m1 và làm lệnh ở dòng {2} Vì dòng {2} là lệnh FORnê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 đượclà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 quảlệnhP được làm thêm n2-n1+1 lần nữa
v.v.v
Quá 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àmn2-n1+1 lần LệnhP Vì thế lệnhP được làm cả thảy là (m2-m1+1)*(n2-n1+1) lần
Ví dụ 7: In hình chữ nhật đặc như dưới đây:
Trang 10Thay In dòng i bằng hai lệnh nói trên (đặt trong khối begin end), ta có thuật toán để
Lệnh For rất thông dụng, dễ dùng và giải quyết được nhiều bài toán trong khoa học
kỹ thuật và trong thực tiễn Dưới đây chỉ xin nêu hai ứng dụng
Bước 1: tính U:=U0+U1 và in U Lúc này U=2 chính là U2
Ðể chuẩn bị tính U3, ta cho U0 đóng vai trò của U1 và U1 đóng vai trò của U,tức là gán:
U0:=U1;
U1:=U;
Kết qủa là U0=1 và U1=2
Bước 2: tính U:=U0+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
Trang 11Ví dụ 9: Bài toán tính tiền lãi gửi ngân hàng:
Nhậ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 đượcsau 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:
Trang 12Sotien:= Tienvon + Tienvon*Laisuat;
Writeln(‘Số tiền sau ‘, i, ‘ tháng =‘, Sotien:8:2);
Ý nghĩa: Chừng nào Ðiềukiện còn đúng thì cứ làm LệnhP, cho đến khi Ðiềukiện
sai thì không làm LệnhP nữa mà chuyển sang lệnh kế tiếp ở phía dưới
Cách thức hoạt động của WHILE:
Bước 1: Nếu Ðiềukiện sai thì chuyển ngay sang lệnh kế tiếp sau LệnhP, ngược lại,
nếu Ðiềukiện đúng thì làm LệnhP, rồi quay lại bước 1
Lệnh P được gọi là thân của vòng lặp WHILE
Nếu Ðiềukiện không bao giờ sai thì LệnhP sẽ phải làm hoài, lúc đó ta có vòng lặp vô hạn Trong trường hợp này, để dừng chương trình, hãy gõ đồng thời hai phím Ctrl và Pause ( viết tắt là ^Pause)
Ðể tránh các vòng lặp vô hạn, trong thân của vòng WHILE cần có ít nhất một lệnh cótác dụng làm biến đổi các đại lượng tham gia trong Ðiềukiện để đến một lúc nào đó thì Ðiềukiện sẽ sai và do đó vòng lặp sẽ kết thúc
2 Các ví dụ về lệnh While:
Hình 3: Sơ đồ của lệnh WHILE
Trang 13Trong chương trình trên, nếu không có dòng lệnh {13}: i:=i+1;
thì i luôn luôn bằng 1 nên điều kiện i<=N luôn luôn đúng (vì N ≥ 1), và do đó vòng lặp
sẽ vô hạn
Sự khác nhau của lệnh WHILE so với FOR là ở chỗ: trong lệnh FOR, biến i được tựđộng gán gía trị ban đầu và sau mỗi bước lặp được tự động tăng lên, còn trong WHILEthì không, ta phải viết các lệnh đó
Tất cả các bài toán giải quyết được bằng lệnh FOR thì đều giải quyết được bằng lệnh
WHILE Ðặc điểm chung của các bài toán dạng này là số lần lặp của các vòng lặp đã được biết trước.
Lệnh WHILE đặc biệt thích hợp với các vòng lặp có số lần lặp chưa biết trước, trong
khi lệnh FOR không giải quyết được Ðây chính là điểm mạnh của lệnh WHILE Hãyxem ví dụ sau
Ví dụ 11: Trở lại bài toán tính tiền gửi ngân hàng có tiền lãi hàng tháng gộp vào
vốn (ví dụ 9.9) Câu hỏi bây giờ là: cần gửi tối thiểu là bao nhiêu tháng để có được số tiền? S cho trước.
Trang 14Giả sử tiền vốn là 100, lãi suất hàng tháng là 2%, số tiền cần có là S=108 Ta tính số tiền có được sau mỗi tháng gửi:
Sau 1 tháng gửi: Số tiền=100 + 100*0.02 = 102
Sau 2 tháng gửi: Số tiền=102 + 102*0.02 = 104.04
Sau 3 tháng gửi: Số tiền=104.04 + 104.04*0.02 = 106.1208
Sau 4 tháng gửi: Số tiền=106.1208 + 106.1208*0.02 = 108.2432
Vậy chỉ cần gửi N=4 tháng, số tiền sẽ có là 108.2431
Qúa trình lặp kết thúc khi tới tháng đầu tiên có Số tiền ≥ S
Chương trình như sau:
III Câu lệnh REPEAT
Ý nghĩa: Chừng nào Ðiềukiện còn sai thì cứ làm LệnhP, cho đến khi Ðiềukiện
đúng thì không làm LệnhP nữa mà chuyển sang lệnh kế tiếp ở phía dưới
Trang 15
Cách thức hoạt động của REPEAT:
Bước 1: Làm LệnhP, rồi kiểm tra Ðiềukiện, nếu Ðiềukiện đúng thì chuyển sang lệnh
tiếp theo ở phía dưới, ngược lại, nếu Ðiềukiện sai thì quay lại bước 1
LệnhP cũng được gọi là thân của vòng lặp REPEAT, nếu nó gồm nhiều lệnh thì các lệnh đó không cần phải đặt trong khối begin va end.
Nếu Ðiềukiện không bao giờ đúng thì LệnhP sẽ phải làm hoài, lúc đó ta có vònglặp vô hạn Trong trường hợp này, muốn dừng chương trình, hãy gõ đồng thời hai phímCtrl và Pause (^Pause)
Ðể tránh các vòng lặp vô hạn, trong thân của lệnh REPEAT cần có ít nhất một lệnh
có tác dụng làm biến đổi các đại lượng tham gia trong Ðiềukiện để đến một lúc nào đóthì Ðiềukiện sẽ đúng và do đó vòng lặp sẽ kết thúc
Các vòng lặp có số lần lặp biết trước đều có thể giải được bằng lệnh REPEAT Ðặc biệt, cũng như lệnh WHILE, lệnh REPEAT rất thích hợp với các vòng lặp có số lần lặp không biết trước
2 Các ví dụ về lệnh Repeat:
Ví dụ 12: Ðảm bảo tính hợp lý của dữ liệu nhập từ bàn phím.
Khi giải phương trình bậc hai Ax2+Bx+C=0, ta thường giả thiết A ≠ 0, khi tính S=N!,
ta thường yêu cầu N ≠ 0 Sự hạn chế phạm vi đối với các dữ liệu nhập sẽ đảm bảo tínhhợp lý của chúng và làm giảm bớt các phức tạp khi biện luận
Ðể buộc người sử dụng phải nhập A ≠ 0, nếu nhập A=0 thì bắt nhập lại cho tới khinhập A ≠ 0 mới thôi, ta dùng cấu trúc:
Trang 16Ví dụ 13: Tìm bội số chung nhỏ nhất của hai số nguyên dương M và N.
Bài toán này có những cách giải khác nhau, dưới đây là một cách đơn giản Trước hết, hãy xem cách tìm BSCNN của hai số M=5 và N=9
Vì N>M nên ta sẽ tìm trong tập các bội số của N:{ 9, 18, 27, 36, 45, } số nhỏ nhấtchia hết cho M, đó là số 45
Một cách tổng quát, gọi Max là số lớn nhất của M và N Ðầu tiên ta gán:
Until (BSCNN mod N=0) and (BSCNN mod M=0) ;
Writeln(‘ Bội số chung nhỏ nhất= ‘, BSCNN) ;
Readln;
End
Ví dụ 14: Thiết kế để chạy nhiều lần một chương trình.
Trong Turbo Pascal, mỗi lần muốn chạy chương trình ta phải gõ cặp phím Ctrl và F9 (viết tắt là ^F9), điều này sẽ bất tiện nếu cần chạy chương trình nhiều lần ứng với các bộ
dữ liệu thử khác nhau Cấu trúc sau đây cho phép ta chạy chương trình một số lần theo ýmuốn:
REPEAT
{ Các lệnh của chương trình}
Write(‘ Tiếp tục nữa không (Y/N) ?:’);
Trang 17Readln(Traloi); {5}
UNTIL (Traloi =‘N’) or ( Traloi=‘n’);
Ở đây, Traloi là một biến kiểu ký tự (Char);
Sau khi thực hiện xong {các lệnh của chương trình }, nếu muốn chạy tiếp thì ta gõ phím Y , nếu muốn dừng thì gõ N
Trang 18IV/ So sánh các lệnh For, While và Repeat:
Lệnh For dùng cho các vòng lặp có số lần lặp đã biết trước
Lệnh While hay Repeat tổng quát hơn lệnh For, dùng được cho tất cả các loạivòng lặp, nhưng thường dùng cho các vòng lặp có số lần lặp chưa biết trước
Lệnh While và Repeat khác nhau ở điểm sau: lệnh While kiểm tra điều kiệntrước, nếu đúng mới thực hiện các lệnh ghi trong thân của nó ( lệnhP ), còn lệnhRepeat thực hiện lệnhP rồi mới kiểm tra điều kiện Vì thế, lệnh Repeat sẽ thựchiện các lệnh ghi trong thân của nó ít nhất được một lần
Ngoài ra, lệnh While kết thúc khi điều kiện sai, lệnh Repeat kết thúc khi điều kiện đúng
V/ Một số bài toán
Bài 1
Năm nay con a tuổi, cha b tuổi Dùng WHILE tính xem sau mấy năm nữa hoặctrước đây mấy năm tuổi cha gấp đôi tuổi con
Hướng dẫn Nếu a*2=b thì ở hiện tại
Nếu a*2<b thì ở tương lai Nếu a*2>b thì ở trong quá khứ
Chương trình cụ thể:
VAR a,b,so:integer;{a,b,so kiểu integer}
BEGIN
write('Nhap tuoi con, tuoi cha : ');
readln(a,b);{Nhập tuổi con, tuổi cha}
if a=b*2 then write('Hien tai tuoi cha gap doi con'){Nếu a=b thì ở hiện tại}
else if a*2<b then{Ngược lại nếu a*2<b thì}
Hướng dẫn Chỉnh hợp lặp :
i=1->N j=1->N k=1->N : Xuất i,j,k
Trang 19Chỉnh hợp không lặp : i=1->N j=1->N k=1->N : Nếu i<>j<>k thì xuất
Tổ hợp i=1->N-2 j=i+1->N-1 k=j+1->N : Xuất i,j,k}
Chương trình cụ thể:
VAR i,j,k,n:byte;{i,j,k,n kiểu byte}
BEGIN
write('N = ');readln(n);{Đọc N}
writeln('Cac chinh hop lap :');
for i:=1 to n do{Cho i chạy từ 1 đến N}
for j:=1 to n do{Cho j chạy từ 1 đến N}
for k:=1 to n do{Cho k chạy từ 1 đến N}
write(i,j,k,' ');
readln;
writeln('Cac chinh hop khong lap :');
for i:=1 to n do{Cho i chạy từ 1 đến N}
for j:=1 to n do{Cho j chạy từ 1 đến N}
for k:=1 to n do{Cho k chạy từ 1 đến N}
if(i<>j)and(j<>k)and(i<>k)then write(i,j,k,' ');
readln;
writeln('Cac to hop :');
for i:=1 to n-2 do{Cho i chạy từ 1 đến N-2}
for j:=i+1 to n-1 do{Cho j chạy từ i+1 đến N-1}
for k:=j+1 to n do{Cho k chạy từ j+1 đến N}
Dùng hàm GOTOXY(x,y) để di chuyển tới toạ độ cột x dòng y trên màn hình
Ta chia chiều ngang màn hình thành 5 cột, chiều dọc màn hình thành 2 hàng Từ hàng 2 11 ta in bảng 1,2,3,4,5 Từ hàng 13 22 ta in bảng 6,7,8,9,10
Khi ta tới hàng i x j thì toạ độ bắt đầu sẽ là
for i:=1 to 10 do{Cho i chạy từ 1 đến 10 (i là bảng)}
for j:=1 to 10 do{Cho j chạy từ 1 đến 10}
begin
if i<6 then y:=j+1 else y:=j+12;{Tính y theo CT ở phần thuật toán}
x:=((i-1)mod 5)*16+1;{Tính x theo CT ở phần thuật toán}
gotoxy(x,y);{Nhảy tới vị trí x,y}