1. Mục đích, yêu cầu
• Biết nhu cầu cần có cấu trúc lặp trong ngôn ngữ lập trình.
• Biết ngôn ngữ lập trình dùng cấu trúc lặp để chỉ dẫn máy tính thực hiện lặp đi lặp lại công việc nào đó một số lần.
• Hiểu hoạt động của câu lệnh lặp với số lần biết trớc for...do trong Pascal.
• Viết đúng đợc lệnh for...do trong một số tình huống đơn giản. • Hiểu lệnh ghép trong Pascal
2. Những điểm cần lu ý và gợi ý dạy học
Giống với cấu trúc rẽ nhánh, cần xuất phát từ những hoạt động trong đời sống thực tiễn có tính chất lặp đi lặp lại để HS hiểu về khái niệm lặp. Ví dụ, tiếng gà trống gáy, tiếng chim hót, tiếng chuông đồng hồ báo thức gọi em dạy mỗi buổi sáng; Các ngày trong tuần các em đều lặp đi lặp lại hoạt động buổi sáng đến trờng và buổi chiều trở về nhà; Hoặc trên lớp, giờ trả bài kiểm tra cô giáo lặp đi lặp lại
việc gọi tên HS và ghi điểm của HS vào sổ điểm, cô giáo sẽ ngừng lại khi đã vào điểm cho tất cả HS trong lớp.
Giả sử cô giáo đề nghị em viết chơng trình Pascal để chào từng bạn của lớp em (hoặc của nhóm em), cụ thể chơng trình cho phép từng bạn nhập tên của mình từ bàn phím và in ra lời chào tơng ứng, ví dụ khi một bạn nhập tên là Mai, thì ch- ơng trình sẽ in ra 'Chao ban Mai', một bạn khác nhập tên là Trung thì sẽ in ra
'Chao ban Trung'. Nh vậy em sẽ cần viết một chơng trình Pascal cho phép lặp đi
lặp lại việc nhập tên và hiển thị ra màn hình lời chào. Làm thế nào để chơng trình Pascal của em có thể thực hiện việc lặp này?
Giả sử lớp của em có 40 bạn, em hoàn toàn có thể viết 40 lần lệnh để nhập tên và lệnh hiển thị dòng chào. Các lệnh này hoàn toàn giống nhau. Tuy nhiên, một chơng trình nh vậy thì vừa dài, vừa nhàm chán, dễ sai sót.
Trong Pascal cung cấp một câu lệnh lặp nh sau:
for <biến đếm> := <giá trị đầu> to <giá trị cuối> do <câu lệnh>;
trong đó:
- biến đếm là biến đơn có kiểu nguyên;
- giá trị đầu và giá trị cuối là các biểu thức có cùng kiểu với biến đếm và giá trị cuối phải lớn hơn giá trị đầu;
- câu lệnh có thể là câu lệnh đơn giản hay câu lệnh ghép.
Hoạt động của câu lệnh lặp này nh sau: Ban đầu biến đếm đợc gán bằng giá
trị đầu, mỗi lần câu lệnh viết sau từ khoá do đợc thực hiện biến đếm đợc tăng lên
một đơn vị, câu lệnh đợc thực hiện cho đến khi biến đếm lớn hơn giá trị cuối. Lu ý:
+ Để tránh phức tạp, gây khó hiểu với HS, mô tả hoạt động của lệnh for...do ở trên là dựa trên mặc định biến đếm, giá trị đầu, giá trị cuối là số nguyên. Một cách tổng quát, biến đếm, giá trị đầu, giá trị cuối có thể là kiểu kí tự, kiểu đoạn con. Tuy nhiên, ở đây không đề cập đến những vấn đề này với mục đích để giản lợc nội dung, giúp HS dễ tiếp thu kiến thức mà vẫn đảm bảo những kiến thức, kĩ năng cần thiết theo yêu cầu.
+ Trong Pascal cấu trúc for...do có hai dạng tiến và lùi: Dạng tiến:
for <biến đếm> := <giá trị đầu> to <giá trị cuối> do <câu lệnh>;
for <biến đếm> := <giá trị cuối> downto <giá trị đầu> do <câu lệnh>;
Trong SGK chỉ giới thiệu dạng tiến. Về cơ bản dạng tiến gần gũi với cách suy nghĩ tự nhiên của HS THCS hơn và chỉ cần dạng tiến là đủ, không yêu cầu phải giới thiệu thêm dạng lùi.
Khi thực hiện câu lệnh lặp for...do các giá trị đầu và giá trị cuối phải đợc xác định trớc. Chính vì thế mà ta biết trớc đợc số lần thực hiện câu lệnh sau từ khóa do (số lần lặp bằng giá trị cuối - giá trị đầu + 1). Chính vì vậy, câu lệnh
for...do còn đợc gọi là câu lệnh lặp với số lần biết trớc.
GV nên sử dụng chơng trình Lap trong SGK, phân tích ví dụ này để cho HS hiểu rõ về hoạt động của câu lệnh lặp, hiểu về biến đếm, giá trị đầu, giá trị cuối và câu lệnh.
program Lap;
var i: Integer;
begin
for i := 1 to 10 do
writeln('Day la lan lap thu ',i);
end.
Có thể hớng dẫn học sinh lập bảng quá trình thực hiện chơng trình trên nh d- ới đây:
Lần lặp thứ i Kết quả viết ra màn hình
1 1 Day la lan lap thu 1
2 2 Day la lan lap thu 2
3 3 Day la lan lap thu 3
4 4 Day la lan lap thu 4
5 5 Day la lan lap thu 5
6 6 Day la lan lap thu 6
7 7 Day la lan lap thu 7
8 8 Day la lan lap thu 8
9 9 Day la lan lap thu 9
Sau khi cùng với HS phân tích chơng trình Lap, GV có thể cùng HS sử dụng câu lệnh for...do để viết đoạn câu lệnh nhập tên và hiển thị ra màn hình dòng chào hỏi. Giả sử lớp có 40 bạn thì đoạn câu lệnh có thể nh sau:
For i:= 1 to 40 do Begin
write('Nhap ten cua ban'); Readln(Ten); write('Chao ban ', Ten);
end;
Lu ý: Cần dành thời để giới thiệu về câu lệnh ghép. Khác với chơng trình Lap, sau từ khoá do chỉ có một câu lệnh cần thực hiện, ở chơng trình Chao_hoi, sau từ khoá do có hai câu lệnh cần thực hiện. Muốn vậy, hai câu lệnh này cần phải đợc "gói" trong từ khoá begin...end. Một cách đơn giản có thể hiểu cấu trúc
begin...end là một câu lệnh của Pascal, câu lệnh này có thể chứa nhiều câu lệnh
khác của Pascal. Lu ý HS trong cấu trúc câu lệnh ghép này sau end là dấu chấm phẩy (;), không phải là dấu chấm (.).
Cần lấy thêm một số ví dụ khác để HS biết và tập làm quen với các tình huống sử dụng câu lệnh for...do và lệnh ghép. Có thể yêu cầu HS đọc hiểu ví dụ có trong SGK (nh chơng trình Tinh_tong, Tinh_giai_thua) hoặc đa ra bài toán đơn giản cần sử dụng đến câu lệnh for...do và hớng dẫn HS viết chơng trình.
GV cần khái quát cho HS cấu trúc lặp với số lần biết trớc có ở mọi ngôn ngữ lập trình, mỗi ngôn ngữ lập trình có câu lệnh riêng để mô tả cấu trúc này. Trên đây các em đã đợc tìm hiểu về câu lệnh lặp với số lần biết trớc trong Pascal (for...do).
Cuối bài này, giao nhiệm vụ cho HS hoàn thiện chơng trình thực hiện chào hỏi các bạn trong lớp (hoặc trong nhóm) để chuẩn bị cho buổi thực hành tới.
Căn cứ vào tình hình tiếp thu của HS, GV cần lựa chọn và giao một số bài tập cho HS luyện tập, không nhất thiết phải làm hết tất cả các bài tập cuối bài này.
3. Hớng dẫn trả lời câu hỏi và bài tập
Bài 1. Có thể nêu rất nhiều vài ví dụ về các hoạt động lặp. Dới đây là một số ví dụ:
a) Hàng ngày em đặt đồng hồ báo thức lúc 6 giờ để dậy sớm tập thể dục. b) Hàng ngày (hoặc hàng tuần) bác lái xe khách lái xe để chuyên chở
hành khách xuất phát từ một địa điểm và thời gian nhất định và đi theo một tuyến đờng đã đợc xác định trớc.
c) Mỗi lần đợc khởi động, máy tính của em sẽ thực hiện cùng các hoạt động tự kiểm tra các thành phần máy tính, sau đó khởi động hệ điều hành theo một trình tự đã đợc quy định trớc.
Bài 2. a) Có thể thấy, để vẽ đợc hình ...a, thao tác chính cần thực hiện là vẽ nửa đ-
ờng tròn có bán kính 1 đơn vị từ một điểm A tới điểm B theo một trong bốn hớng: lên trên, xuống dới, sang trái, sang phải (chẳng hạn, hình...b là nửa đ- ờng tròn đợc vẽ từ điểm A tới điểm B theo hớng lên trên).
a) b)
Hình 1
Có thể mô tả các bớc của thuật toán để vẽ hình ... a) nh sau:
Bớc 1. Xác định điểm bắt đầu vẽ là X.
.
Bớc 2. Vẽ nửa đờng tròn theo hớng lên trên. Bớc 3. Vẽ nửa đờng tròn theo hớng sang trái. Bớc 4. Vẽ nửa đờng tròn theo hớng xuống dới. Bớc 5. Vẽ nửa đờng tròn theo hớng sang phải. Bớc 6. Tô màu và kết thúc thuật toán.
Lu ý đối với giáo viên. Có thể trình bày thuật toán vẽ hình trên dới dạng một
cách hình thức nh sau.
Ta gọi thao tác vẽ nửa đờng tròn theo hớng x là vẽ nửa đờng tròn có bán kính 1 đơn vị bắt đầu từ một điểm xác định, đờng kính nối điểm đầu và điểm cuối của nửa đờng tròn vuông góc với hớng x và nửa đờng tròn "cong về hớng x". Ta chỉ xét
x là một trong bốn hớng: lên trên, xuống dới, sang trái, sang phải.
Với các hớng, ta định nghĩa phép toán sau: lên trên + 1 = sang trái, sang
trái +1 = xuống dới, xuống dới +1 = sang phải, sang phải +1 = lên trên. Khi đó có
Có thể mô tả các bớc của thuật toán để vẽ hình ... a) nh sau:
Bớc 1. Xác định điểm bắt đầu vẽ là X. Bớc 2. Đặt i = 0 và đặt hớng = lên trên. Bớc 3. Vẽ nửa đờng tròn theo hớng đã đặt. Bớc 4. i = i + 1.
Bớc 5. Nếu i > 4, chuyển bớc 6; ngợc lại, đặt hớng = hớng + 1 và quay lại b-
ớc 3.
Bớc 6. Tô màu và kết thúc thuật toán.
b) Thuật toán tơng tự nh trên. Thao tác chính cần lặp lại là vẽ hình vuông.
Tại mỗi bớc, giữ nguyên tâm hình vuông và thay đổi hớng vẽ một góc 30o.
Lu ý đối với giáo viên. Bài này không yêu cầu học sinh mô tả một cách
chính xác các bớc của thuật toán. Điều quan trọng là học sinh nhận biết đợc: muốn vẽ đợc các hình đã cho chỉ cần lặp thao tác vẽ nửa đờng tròn bốn lần hoặc lặp thao tác vẽ hình vuông ba lần.
Bài 3. Câu lệnh lặp có tác dụng chỉ dẫn cho máy tính thực hiện lặp lại một câu lệnh hay nhóm câu lệnh với một số lần nhất định. Câu lệnh lặp làm đơn giản và giảm nhẹ công sức của ngời viết chơng trình.
Bài 4. Chúng ta nói rằng khi thực hiện các hoạt động lặp, chơng trình kiểm tra một điều kiện. Với lệnh lặp
for <biến đếm> := <giá trị đầu> to <giá trị cuối> do <câu lệnh>;
của Pascal, điều kiện cần phải kiểm tra chính là giá trị của biến đếm lớn hơn
giá trị cuối. Nếu điều kiện không đợc thoả mãn, câu lệnh đợc tiếp tục thực
hiện; ngợc lại, chuyển sang câu lệnh tiếp theo trong chơng trình.
Bài 5. Tuy có vòng lặp 1000 lần, nhng chơng trình Pascal nêu trong câu hỏi không thực hiện bất kì một hoạt động nào. Tuy nhiên đây vẫn là câu lệnh hợp lệ.
Bài 6. Thuật toán tính tổng A = ... ( 1 1) 5 . 3 1 4 . 2 1 3 . 1 1 + + + + n n Bớc 1. Gán A ← 0, i ← 1. Bớc 2. A ← i i( 1+2). Bớc 3. i ← i + 1.
Bớc 5. Ghi kết quả A và kết thúc thuật toán.
Bài 7. Trừ d), tất cả các câu lệnh đều không hợp lệ:
a) Giá trị đầu của biến đếm phải nhỏ hơn giá trị cuối của biến đếm; b) Các giá trị đầu và giá trị cuối của biến đếm phải là số nguyên; c) Thiếu dấu hai chấm khi gán giá trị đầu;
d) Thừa dấu chấm phẩy thứ nhất, nếu nh ta muốn lặp lại câu lệnh writeln('A') mời lần, ngợc lại câu lệnh là hợp lệ;
e) Biến x đã đợc khai báo nh là biến có dữ liệu kiểu số thực và vì thế không
thể dùng để xác định giá trị đầu và giá trị cuối trong câu lệnh lặp.
Bài 8. Thuật toán:
Bớc 1. Nhập các số n và x.
Bớc 2. A ← 1, i ← 0 (A là biến lu luỹ thừa bậc n của x). Bớc 3. i←i + 1, A ← A.x.
Bớc 4. Nếu i < n, quay lại bớc 3.
Bớc 5. Thông báo kết quả A là luỹ thừa bậc n của x và kết thúc thuật toán.
Chơng trình Pascal có thể nh sau:
var n,i,x: integer; a: longint;
begin
write('Nhap x='); readln(x); write('Nhap n='); readln(n); A:=1;
for i:=1 to n do A:=A*X;
writeln(x,' mu ',n,' bang ',A);
end.
Bài 9. Thuật toán:
Bớc 1. Nhập số n.
Bớc 2. A← −32768 (gán số nhỏ nhất có thể trong các số kiểu nguyên cho A), i ←1.
Bớc 3. Nhập số thứ i và gán giá trị đó vào biến A. Bớc 4. Nếu Max < A, Max ← A.
Bớc 6. Nếu i ≤ n, quay lại bớc 3.
Bớc 7. Thông báo kết quả Max là số lớn nhất và kết thúc thuật toán.
Chơng trình Pascal có thể nh sau:
uses crt;
var n,i,Max,A: integer;
begin
clrscr;
write('Nhap N='); readln(n); Max:=-32768;
for i:=1 to n do
begin write('Nhap so thu ',i,':'); readln(A); if Max<A then Max:=A end;
writeln('So lon nhat: ',Max);
end.
Lu ý. Trong chơng trình trên chúng ta chỉ sử dụng hai biến A và Max để giải bài toán. Một cách tự nhiên, để nhập n số chúng ta cần tới n biến. Tuy nhiên, ở đây việc xử lí các giá trị trong dãy số có thể thực hiện bằng cách chỉ cần so sánh các giá trị đã đợc nhập vào, do đó chúng ta chỉ cần một biến để lu lần lợt các giá trị nhập vào là đủ. Một cách giải quyết khác là sử dụng biến mảng (xem bài tập 6, bài 9).
Bài 10. Lời giải bài này tơng tự nh lời giải của bài 9 ở trên (xem thuật toán trong lời giải bài tập 5a, bài 5). Chơng trình Pascal có thể nh sau:
uses crt;
var n,i,SoDuong,A: integer;
begin clrscr; write('Nhap N='); readln(n); if n>0 then begin SoDuong:=0; for i:=1 to n do
begin write('Nhap so thu ',i,':'); readln(A);
if A>0 then SoDuong:=SoDuong+1 end;
end
else writeln('n phai > 0!');
end.