Sai Không thực hiện lệnh writeln() Kết thúc vòng lặp

Một phần của tài liệu SGV Tin 8 (Trang 50 - 62)

thúc vòng lặp

Bài 2, cung cấp cho HS một câu lệnh mới là thủ tục đa con trỏ tới một ví trị mong muốn trên màn hình (màn hình soạn thảo văn bản) GotoXY(). Giới thiệu cùng với thủ tục GotoXY là các hàm lấy vị trí cột WhereX, vị trí dòng WhereY hiện thời của con trỏ. Việc giới thiệu thủ tục này nhằm cung cấp cho HS một công cụ để trình bày màn hình. Hơn thế nữa, việc giới thiệu hàm, thủ tục ở đây còn nhằm mục đích hớng dẫn HS tìm hiểu về th viện chơng trình, sử dụng, khai thác hàm, thủ tục có sẵn trong Pascal. Tuy nhiên, đây không phải là yêu cầu bắt buộc trong Chuẩn kiến thức, kĩ năng cho nên GV có thể cho thực hành bài này trên lớp hoặc giao cho học sinh tự nghiên cứu. Không cần đi sâu vào việc sử dụng các thủ tục này để trình bày màn hình.

Bài 3, giới thiệu về việc sử dụng hai vòng for...do lồng nhau. GV có thể sử dụng bài 3 này hoặc lấy một ví dụ khác để giới thiệu về vòng for...do lồng nhau. Có một ví dụ vui, hay đợc sử dụng để minh hoạ cho việc sử dụng vòng lặp for...do lồng nhau đó là bài toán cổ:

Vừa gà vừa chó Bó lại cho tròn

Ba mơi sáu con Một trăm chân chẵn.

Bài toán dân gian này có thể sẽ làm HS hứng thú hơn. Lu ý, HS lớp 8 cha đợc học giải phơng trình bậc nhất hai ẩn số.

Chơng trình giải bài toán này có thể nh sau:

Var ga, cho : byte;

Begin

for ga:=1 to 35 do

for cho:=1 to 35 do

if (ga*2 + cho*4 = 100) and (ga + cho = 36) then

writeln('So ga la: ', ga, '; So cho la: ', cho); Readln;

End.

GV có thể giới thiệu chơng trình trớc rồi yêu cầu HS tìm hiểu, giải thích tại sao chơng trình này cho phép giải bài toán đặt ra.

Thuật toán này rất đơn giản, ý tởng cơ bản là xét tất cả các trờng hợp và kiểm tra xem trờng hợp nào thảo mãn: ga + cho= 36 và ga*2 + cho*4 = 100 thì đó là một đáp số của bài toán.

Qua bài toán này cũng có thể nêu cho HS thấy u điểm nổi bật của máy tính trong việc tính toán nhờ tốc độ xử lý rất cao. Với cách giải nh trên máy tính tìm ra kết quả trong nháy mắt, nhng nếu để con ngời thực hiện thì sẽ lâu hơn rất nhiều.

Nhng nhợc điểm của máy tính lại là chỉ biết làm việc theo sự điều khiển của con ngời mà không hề có t duy sáng tạo. Trong quá trình tính toán tìm ra kết quả, con ngời còn có khả năng phán đoán, dự đoán xu h- ớng để có thể bỏ qua một số công đoạn tính toán nhằm đi đến kết quả nhanh hơn. Do đó, con ngời cần lựa chọn, xây dựng thuật toán sao cho có thể nâng cao hiệu quả làm việc của máy tính.

GV có thể yêu cầu học sinh cải tiến để có chơng trình hiệu quả hơn.

var ga, cho:byte; Begin

For cho:= 1 to 24 do Begin

ga:= 36 - cho;

if (2*ga + 4*cho = 100) then

writeln('Ga: ', ga, ', Cho: ',cho); end;

readln; End.

GV có thể phân tích, hớng dẫn để HS nhận thấy số lợng các phép tính ở chơng trình sau ít hơn với ch- ơng trình ban đầu. Điều đó cũng có nghĩa là thuật toán ở chơng trình sau hiệu quả hơn. Việc xây dựng, lựa chọn thuật toán hiệu quả có vai trò quan trọng trong lập trình, nhất là với những bài toán có khối t- ợng tính toán lớn. Luôn cần có ý thức xây dựng, lựa chọn thuật toán hiệu quả nhất khi giải bài toán trên máy tính.

Việc phân tích về số lợng phép toán có thể gây quá tải đối với HS. Do vậy, GV căn cứ vào mức độ tiếp thu của HS để có thể tiến hành giới thiệu hoặc không giới thiệu nội dung về số lợng phép toán, so sánh tính hiệu quả giữa các thuật toán.

Bài 8. Lặp với số lần cha biết trớc

1. Mục đích, yêu cầu

• Biết nhu cầu cần có cấu trúc lặp với số lần cha biết trớc 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 với số lần cha biết trớc để chỉ dẫn máy tính thực hiện lặp đi lặp lại công việc đến khi một điều kiện nào đó đợc thoả mãn; (adsbygoogle = window.adsbygoogle || []).push({});

• Hiểu hoạt động của câu lệnh lặp với số lần cha biết trớc while...do trong Pascal.

2. Những điểm cần lu ý và gợi ý dạy học

Giống với bài 7, ở phần đầu của bài này GV cần nêu một số ví dụ về hoạt động lặp với số lần cha biết trớc. Ví dụ 1 trong SGK là một hoạt động trong đời sống. Ví dụ 2 trong SGK là một bài toán khoa học.

Trong ví dụ 2, sau khi giới thiệu thuật toán, SGK khái quát, đa ra sơ đồ hoạt động của cấu trúc lặp với số lần cha biết trớc. Sau đó, SGK giới thiệu câu lệnh while...do của Pascal nh một ví dụ minh hoạ. HS đợc làm quen với các ví dụ sử dụng lệnh while...do qua các ví dụ.

Dới đây gợi ý một cách tiến hành khác để GV tham khảo. Cách tiếp cận này đợc thực hiện theo phơng án đi từ câu lệnh lặp cụ thể while...do trong Pascal, sau đó khái quát thành kiến thức chung ở các ngôn ngữ lập trình.

Sau khi đã giới thiệu ví dụ 1 trong SGK, nếu đã giới thiệu ví dụ viết chơng trình chào hỏi ở bài trớc, GV có thể đặt tình huống cha biết trớc số bạn trong nhóm thì phải viết chơng trình nh thế nào? Điểm thuận lợi khi sử dụng ví dụ này là HS đã hiểu yêu cầu của bài toán này từ các tiết học trớc. Do vậy, không phải mất nhiều thời gian vào tìm hiểu ý nghĩa của bài toán. Điều đó tạo điều kiện thuận lợi cho việc làm nổi bật vấn đề, tình huống mới cần giải quyết. Hơn nữa, sử dụng những bài toán gắn liền với thực tế là một cách tốt để HS nhận thức rõ khái niệm bài toán trong Tin học không chỉ là những bài toán trong lĩnh vực toán học.

Nói chung HS cha đa ra đợc phơng án giải quyết cho vấn đề này. GV nên chủ động đa ra một chơng trình Pascal nh sau:

Program Chao_hoi;

uses crt;

var Tieptuc: char; Ten: string;

Begin

Tieptuc:='c';

while tieptuc = 'c' do Begin

write('Nhap ten cua ban'); Readln(Ten); writeln('Chao ban ', Ten);

write('Tiep tuc ? c/k'); readln(Tieptuc);

end; readln;

End.

Dựa trên chơng trình này, GV giới thiệu về cú pháp, sơ đồ hoạt động của câu lệnh while...do. Trong Pascal, cú pháp câu lệnh lặp với số lần cha xác định trớc có dạng:

while <điều kiện> do <câu lệnh>;

trong đó:

- điều kiện thờng là một phép so sánh;

- câu lệnh có thể là câu lệnh đơn giản hay câu lệnh ghép.

1. Kiểm tra điều kiện.

2. Nếu điều kiện SAI, câu lệnh sẽ bị bỏ qua và chuyển sang câu lệnh tiếp theo trong chơng trình. Nếu

điều kiện đúNG, thực hiện câu lệnh và quay lại bớc 1.

Sơ đồ hoạt động của câu lệnh câu lệnh lặp với số lần cha biết trớc

(Xuân sửa lu đồ này nhé)

Việc dịch nghĩa hay diễn giải ý nghĩa của từ tiếng Anh trong câu lệnh while...do có thể là cần thiết đối với HS cha đợc học tiếng Anh và để HS dễ nhớ (Trong khi ... thì).

Đến đây, GV có thể khái quát cho HS biết rằng các ngôn ngữ lập trình đều cung cấp câu lệnh lặp với số lần cha biết trớc, hoạt động của câu lệnh lặp với số lần cha biết trớc ở các ngôn ngữ lập trình là giống nhau. Điểm khác nhau giữa các ngôn ngữ lập trình là cú pháp câu lệnh để thể hiện cấu trúc này mà thôi.

Phần cuối bài GV sử dụng các ví dụ trong SGK hoặc lấy ví dụ khác để HS hiểu đợc hoạt động, viết đúng cú pháp và biết một số trờng hợp sử dụng hiệu quả câu lệnh while...do. (adsbygoogle = window.adsbygoogle || []).push({});

Lu ý:

+ Đối với vòng lặp while...do, trong các câu lệnh của vòng lặp này cần có câu lệnh làm thay đổi biểu thức điều kiện, có nghĩa là phải có câu lệnh để đến lúc nào đó điều kiện không đợc thoả mãn, khi đó vòng lặp kết thúc. Do vậy câu lệnh sau từ khóa do của câu lệnh lặp while...do thờng phải là câu lệnh ghép.

Trong ví dụ trên đây, điều kiện không đợc thoả mãn và vòng lặp kết thúc khi điều kiện tieptuc = 'c' cho kết quả sai, tức là tieptuc <> 'c'. Câu lệnh readln(Tieptuc) để gán giá trị cho biến Tieptuc từ bàn phím, giá trị của biểu thức điều kiện thay đổi phụ thuộc vào câu trả lời của ngời sử dụng. Khi ngời sử dụng nhấn "c" thì vòng lặp tiếp tục, ngợc lại, khi ngời sử dụng nhấn bất kì chữ cái (hoặc chữ số) nào khác thì vòng lặp kết thúc.

+ Trong chơng trình trên, có câu lệnh Tieptuc:='c' ở ngay sau từ khoá Begin. GV đặt câu hỏi để HS tìm hiểu tại sao phải có câu lệnh này. Khi giải thích đợc nguyên nhân phải có câu lệnh này, HS sẽ hiểu rõ thêm về biến, điều kiện thực hiện vòng lặp while...do. Việc cần có câu lệnh Tieptuc:='c' có thể đợc giải thích nh sau: gặp lệnh khai báo biến Tieptuc: char Pascal sẽ dành một ô nhớ và đặt tên ô nhớ này là Tieptuc. Ban đầu ô nhớ này cha đợc gán giá trị nên có thể chứa một giá trị ngẫu nhiên nào đó (có một số ngôn ngữ lập trình khi khai báo biến thì gán luôn cho biến một giá trị mặc định nào đó do ngôn ngữ lập trình quy định). Nếu giá trị ngẫu nhiên này mà khác 'c' thì điều kiện tieptuc = 'c' không đợc thoả mãn ngay từ đầu và vòng lặp while...do sẽ không đợc thực hiện một lần nào cả. Nh vậy, đối với câu lệnh lặp while...do có thể xảy ra tình huống vòng lặp không đợc thực hiện một lần nào cả.

Trong trờng hợp điều kiện luôn đợc thoả mãn, nghĩa là ngời sử dụng luôn luôn gõ phím c, khi đó chơng trình này sẽ tiếp tục lặp đi lặp lại. GV có thể sử dụng chơng trình dới đây (có trong trong SGK) để giải thích về việc lặp vô hạn có thể xảy ra do lỗi của ngời lập trình:

var a:integer;

begin

a:=5;

end.

+ Các câu lệnh của vòng lặp có thể không đợc thực hiện một lần nào cả là một đặc điểm khá quan trọng của câu lệnh while...do. Trong Pascal, để mô tả cấu trúc lặp với số lần cha biết trớc, còn có một câu lệnh khác là Repeat...until. Với câu lệnh Repeat...until có đặc điểm là các câu lệnh trong vòng lặp luôn đợc thực hiện ít nhất một lần. SGK chỉ giới thiệu cho câu lệnh while...do. Ngời ta đã chứng minh đợc rằng chỉ cần câu lệnh while...do là đủ, có nghĩa là mọi tình huống lặp sử dụng câu lệnh Repeat...until, đều có thể sử dụng while...do để thay thế. GV không giới thiệu câu lệnh Repeat...until, không so sánh câu lệnh

Repeat...until với while...do để tránh quá tải với HS.

+ Trong ví dụ trên đây có sử dụng kiểu dữ liệu char mà học sinh cha biết. Do mục đích của ví dụ này là để giới thiệu câu lệnh while...do, nên GV có thể chỉnh sửa chơng trình để sử dụng với một kiểu dữ liệu khác mà các em đã biết (ví dụ nh integer) hoặc sử dụng chơng trình này nhng không giải thích về kiểu char. Tuy nhiên, nếu học sinh tiếp thu tốt, GV nên giới thiệu thêm cho HS về kiểu dữ liệu char trớc khi kết thúc 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 với số lần lặp cha biết trớc. Dới đây là một số ví dụ:

a) Tìm một từ nhất định bị gõ sai chính tả trong văn bản và sửa lại cho đúng. Số từ cần phải sửa cha đợc biết trớc.

b) Khi chuẩn bị tô phở để phục vụ cho khách, cô bán hàng thờng thực hiện các công việc sau đây: Cho một lợng bánh phở vào nồi nớc phở để làm nóng bánh phở, cho bánh phở đã làm nóng vào bát, làm chín một ít thịt và cho vào bát bánh phở đã đợc làm nóng, cho thêm gia vị, thêm nớc phở đang đợc đun sôi vào bát phở,... Các thao tác đó đợc thực hiện lặp lại mỗi khi có khách ăn phở. Trong suốt ca bán hàng số lần thực hiện các thao tác lặp đó là không thể biết trớc.

c) Trong xởng may, mỗi cô công nhân may cùng một chi tiết của chiếc áo, hay chiếc quần với các đờng may đã đợc thiết kế trớc. May xong một sản phẩm, cô công nhân sẽ may sản phẩm tiếp theo cho đến khi hết giờ làm việc.

Bài 2. Sự khác biệt giữa câu lệnh lặp với số lần lặp cho trớc và câu lệnh lặp với số lần lặp cha biết trớc là ở các điểm sau đây:

a) Nh tên gọi của nó, câu lệnh lặp với số lần lặp cho trớc chỉ thị cho máy tính thực hiện một lệnh hoặc một nhóm lệnh với số lần đã đợc xác định từ trớc, còn với câu lệnh lặp với số lần lặp cha biết trớc thì số lần lặp cha đợc xác định trớc. Điều kiện sẽ đợc thay đổi trong mỗi lần lặp và dựa vào điều kiện này chơng trình sẽ quyết định thực hiện tiếp câu lệnh lặp hay không.

b) Trong câu lệnh lặp với số lần cho trớc, điều kiện là giá trị của một biến đếm có giá trị nguyên đã đạt đợc giá trị cuối hay cha, còn trong câu lệnh lặp với số lần lặp cha biết trớc, điều kiện tổng quát hơn nhiều, có thể là kiểm tra một giá trị của một số thực, cũng có thể là một điều kiện tổng quát khác, ví dụ nh một số có chia hết cho 3 hay không,...

c) Trong câu lệnh lặp với số lần cho trớc, câu lệnh đợc thực hiện ít nhất một lần, sau đó kiểm tra điều kiện. Trong câu lệnh lặp với số lần cha xác định trớc, trớc hết điều kiện đợc kiểm tra. Nếu điều kiện đợc thoả mãn, câu lệnh mới đợc thực hiện. Do đó có thể có trờng hợp câu lệnh hoàn toàn không đợc thực hiện.

Bài 3. Mô tả thuật toán:

Bớc 1. Đặt i = R (i là bán kính đờng tròn sẽ vẽ).

Bớc 2. Nếu i > 1.2, vẽ đờng tròn bán kính i; ngợc lại, chuyển đến bớc 4. Bớc 3. i ← i − 1/2 và quay lại bớc 2.

Bài 4. a) Thuật toán 1: 10 vòng lặp đợc thực hiện. Khi kết thúc thuật toán S = 5.0. Đoạn chơng trình Pascal

tơng ứng:

S:=10; x:=0.5;

while S>5.2 do S:=S-x; writeln(S);

b) Thuật toán 2: Không vòng lặp nào đợc thực hiện vì ngay từ đầu điều kiện đã đợc thỏa mãn nên

chuyển tới bớc kết thúc thuật toán; các bớc 2 và 3 bị bỏ qua. S = 10 khi kết thúc thuật toán. Đoạn ch- ơng trình Pascal tơng ứng: (adsbygoogle = window.adsbygoogle || []).push({});

S:=10; n:=0; while S<10 do

begin n:=n+3; S:=S-n end; writeln(S);

Nhận xét: Trong các thuật toán và chơng trình trên, điều kiện đợc kiểm tra trớc khi các bớc lặp đợc

thực hiện. Do đó nếu điều kiện không đợc thỏa mãn ngay từ đầu, các bớc lặp sẽ bị bỏ qua. Điều này đặc biệt đúng đối với câu lệnh lặp while..do.

Bài 5. a) Chơng trình thực hiện 5 vòng lặp. b) Vòng lặp trong chơng trình đợc thực hiện vô tận vì sau câu

lệnh n:=n+1; câu lệnh lặp kết thúc nên điều kiện S=0 luôn luôn đợc thỏa mãn.

Nhận xét: Trong câu lệnh thực hiện, điều kiện cần phải đợc thay đổi để sớm hay muộn chuyển sang

trạng thái không thỏa mãn. Khi đó vòng lặp mới đợc kết thúc sau hữu hạn bớc. Để làm đợc điều này,

câu lệnh trong câu lệnh lặp while..do thờng là câu lệnh ghép.

Bài 6. a) Thừa dấu hai chấm trong điều kiện; b) Thiếu dấu hai chấm trong câu lệnh gán; c) Thiếu các từ

khóa begin end trớc và sau các lệnh n:=n+1; S:=S+n, do đó vòng lặp trở thành vô tận.

Bài 7. Viết thuật toán và chơng trình Pascal có câu lệnh lặp với số lần không xác định để tính luỹ thừa bậc n của x (tức xn), với n là số tự nhiên và x là số thực đợc nhập vào từ bàn phím. Hãy so sánh với thuật toán trong bài tập 8, bài 7.

Thuật toán:

Bớc 1. Đọc các giá trị x và n. Bớc 2. A ← 1, k ← 1.

Bớc 3. Nếu k > n, chuyển xuống bớc 5.

Một phần của tài liệu SGV Tin 8 (Trang 50 - 62)