Lỗi thuật toán:

Một phần của tài liệu Phát hiện và sửa chữa sai lầm cho học sinh THPT khi lập trình bằng ngôn ngữ turbo pascal (Trang 63)

V- Chạy thử, thay đổi chơng trình:

2.2.3-Lỗi thuật toán:

Một chơng trình cho kết quả đúng, trớc tiên chơng trình đó phải đợc viết trên một thuật toán đúng. Nhng ở các em HS THPT thì vấn đề này không đơn giản chút nào, mặt khác lỗi thuật toán một lỗi không dễ sửa. Chúng tôi đa ra một số ví dụ thể hiện sai về thuật toán mà HS thờng gặp phải.

Bài 3.1: Lập chơng trình đọc từ bàn phím toạ độ của n điểm (xi,yi). Sắp xếp lại n điểm này theo thứ tự xi tăng, đa kết quả ra màn hình.

Chơng trình minh hoạ bằng ngôn ngữ TP: (?): 1)Program Sap_xep;

2)Uses Crt;

3)Var x,y:array[1..100] of real; 4) i,j,n:byte;

5) tg:real; 6)Begin

7) Clrscr;

8) Write(' nhap n='); readln(n); 9) Writeln(' vao day so:'); 10) For i:=1 to n do 11) Begin 12) Write('x[',i,'],y[',i,']='); 13) Readln(x[i],y[i]); 14) End; 15) If x[i]> x[j] then 16) For i:=1 to n do 17) Begin 18) For j:=1 to n do 19) Begin 20) tg:=x[i]; 21) x[i]:=x[j]; 22) x[j]:=tg;

23) tg:=y[i]; 24) y[i]:=y[j]; 25) y[j]:=tg; 26) End; 27) End;

28) Writeln(' day da sap xep la:');

29) For i:=1 to n do Writeln(x[i]:10:2,y[i]:10:2); 30) Readln;

31) End.

(!): Khi dịch chơng trình TP thông báo dịch thành công, lỗi ở đây mà học sinh mắc phải khá “ tinh vi”. Do không nắm vững thuật toán của chơng trình nên kết quả cho ra màn hình không nh mong muốn..

Chạy thử chơng trình là:

Nhập n=4. Với x[1],y[1]= 1 4 x[2],y[2]= 6 3 x[3],y[3]= 3 6 x[4],y[4]= 2 3 Kết quả là: Với: x[1],y[1]=3 6

x[2],y[2]=2 3 x[3],y[3]=1 4 x[4],y[4]=6 3. Lỗi do đâu?

Lỗi ở đây học sinh đã dùng lệnh kiểm tra điều kiện x[i]>x[j] trớc, sau đó cho biến i chạy từ 1 đến n, cho biến j chạy từ 1 đến n. Thực hiện đổi chỗ giữa x[i] với x[j], y[i] với y[j]. Sau đó in ra màn hình dãy đã sắp xếp. Kết quả thu đợc không đáp ứng đợc yêu cầu của bài toán. Để sửa lại lỗi này ta đa ra thuật toán đúng.

Thuật toán của bài toán trên đợc mô tả nh sau:

- Nhập toạ độ của n điểm.

- Viết toạ độ của n điểm

- Duyệt từ phần tử đầu tiên của xi đến n và duyệt từ phần tử thứ i+1 đến phần tử cuối cùng yi.

- Kiểm tra x[i]>x[j] ?

- Thực hiện đổi chỗ x[i] với x[j], y[i] với y[j]

- In dãy (x[i],y[i]) đã sắp xếp ra màn hình.

Do đó, trong chơng trình này ta đa dòng 15 xuống dới dòng 18. Kết quả in ra màn hình nh mong muốn.

Bài 3.2: Dãy số An đợc định nghĩa nh sau: A1= 1

A2=2

An= 2An-1 +An-2 (n>2)

a) Hãy lập chơng trình gán giá trị của dãy vào một biến mảng.

b) Tính giá trị biểu thức sau: 1/A12 +1/A22+...+ 1/An2.

Chơng trình minh hoạ bằng ngôn ngữ TP: (adsbygoogle = window.adsbygoogle || []).push({});

(?): 1) Program Bieu_thuc; 2) Uses Crt;

3) Var a:array[1..100] of real; 4) i,n:byte; 5) s:real; 6) Begin 7) Clrscr; 8) Write(' nhap so n='); 9) Readln(n); 10) a[1]:=1; 11) a[2]:=2; 12) s:=0; 13) While (n>3) do 14) Begin

15) For i:=3 to n do a[i]:= 2*a[i-1]+a[i-2]; 16) For i:=1 to n do 17) Begin 18) s:=s+1/sqr(a[i]); 19) Writeln(' s=',s:12:6); 20) End; 21) end; 22) Readln; 23) End.

(!):Sau khi dịch thành công ta chạy thử chơng trình với n=5. Kết quả thu đợc: Là vòng lặp vô hạn

Lỗi do đâu? Sai lầm của học sinh là dùng lặp không xác định với điều kiện trớc, trong khi n lại là một giá trị đợc xác định trớc. Đó chính là nguyên nhân tại sao vòng lặp lại lặp vô hạn.

Bởi vì n là một số đợc xác định cụ thể nên trong thân while không có dòng lệnh nào có giá trị làm thay đổi biến điều khiển - Điều kiện để vòng lặp dừng. Từ sai lầm đó ta có thể đa ra thuật toán nh sau:

- Nhập n.

- Gán: a[1]:=1; a[2]:=2; s:=0;

- Cho biến i chạy từ 3 đến n, tính giá trị: a[i]:=2*a[i-1]+ a[i-2]

- Cho biến j chạy từ 1 đến n, tính s= s+1/sqr(a[i]);

- In tổng thu đợc ra màn hình.

Vậy để sửa lỗi trên ta bỏ vòng lặp While ở dòng 13, thì kết quả thu đợc nh mong đợi.

Bài 3.3: Lập trình nhập toạ độ n điểm trong không gian (xi,yi,zi) rồi tìm toạ độ các đỉnh của một hình hộp có các cạnh song song với các trục toạ độ và chứa tất cả các điểm trên.

Chơng trình minh hoạ bằng ngôn ngữ TP:

(?): 1) Program Hinh_hop; 2) Uses Crt;

3) Type vt= array[1..100] of real; 4) Var n:byte; 5) x,y,z:vt; 6) xl,yl,zl,xn,yn,zn:real; 7) Procedure Nhap; 8) Var i:byte; 9) Begin 10) Repeat

11) Write(#13#10' tong so diem:'); Readln(n); 12) Until (n>0) and (n<=100);

13) Writeln(' Nhap toa do cac diem:'); 14) For i:=1 to n do

15) Begin

16) Write('x[',i,'],y[',i,'],z[',i,']='); 17) Readln(x[i],y[i],z[i]);

18) End; 19) End;

20) Procedure Minmax(Var w:vt; var v1,v2:real); 21) Var i:byte;

22) Begin

23) v1:=w[1]; 24) v2:=v1;

25) For i:=1 to n do

26) If w[i]< v1 then v1:=w[i]; 27) If w[i]>v2 then v2:=w[i]; 28) End;

29) Begin 30) Clrscr; 31) Nhap;

32) Minmax(x, xn, xl); 33) Minmax(y, yn, yl); 34) Minmax(z, zn,zl);

35) Writeln(' toa do hai dinh hinh hop can tim la:');

36) Writeln(' dinh duoi ben trai: x=', xn:6:2,'y=',yn:6:2,'z=',zn:6:2); 37) Writeln(' dinh tren ben phai: x=', xl:6:2,'y=',yl:6:2,'z=',zl:6:2); 38) Repeat Until keypressed; (adsbygoogle = window.adsbygoogle || []).push({});

39) End.

(!): Khi dịch thành công ta chạy thử chơng trình với n=5; Nhập toạ độ các điểm: X[1],y[1],z[1]= 1 2 3 X[2],y[2],z[2]= 3 5 2 X[3],y[3],z[3]= 6 0 1 X[4],y[4],z[4]= 9 9 4 X[5],y[5],z[5]= 3 8 7 Toạ độ hai đỉnh xác định hình hộp cần tìm là: Đỉnh dới bên trái: x=1.00 y= 0.00 z= 1.00 Đỉnh dới bên phải: x=3.00 y=8.00 z=7.00

Nhng kết quả đúng là: Đỉnh dới bên phải: x=9.00 y=9.00 z=7.00

Vậy lỗi ở đâu? Khi mà lỗi cú pháp đã sửa hết, ở đây các em mắc sai lầm khi viết thuật toán cho chơng trình con :

Procedure Minmax( Var w: vt; var v1,v2:real); Var i:byte;

Begin

v1:=w[1]; v2:=v1;

For i:=1 to n do

If w[i]< v1 then v1:=w[i] Else v2:=w[i];

End;

Sai ở trong câu lệnh rẽ nhánh If .... Then, ở đây là câu lệnh rẽ hai nhánh thì kết quả cho ta không nh mong muốn, bởi vì ở trên ta gán v1:=w[1]; v2:=v1; do đó khi không thoả mãn điều kiện w[i]< v1 thì máy thực hiện câu lệnh v2:=w[i]. Để chơng trình chạy đúng ta thay lại câu lệnh này nh sau: If w[i]<v1 then v1:=w[i]

Else if w[i]>v2 then v2:= w[i]; Kết quả thu đuợc nh mong muốn.

Kết luận:

Qua kết quả thực tiễn dạy học Tin học, chúng tôi thấy rằng HS còn mắc nhiều sai lầm khi giải toán bằng NNLT TP. Các sai phổ biến có thể kể đến:- Sai lầm khi khai báo biến: Thiếu biến, thừa biến, sai biến.

- Các lỗi chính tả khi viết các từ khoá, tên chuẩn, hoặc các hằng văn bản.

- Khai báo sai kiểu dữ liệu, viết sai quy cách câu lệnh. - Các lỗi về trình tự và thuật toán.

Từ những nghiên cứu này, chúng tôi đề xuất một số biện pháp dạy học sau, nhằm phát hiện, phân tích, sửa chữa các sai lầm của HS khi giải toán bằng NNLT TP. Từ đó góp phần nâng cao hiệu quả dạy học môn Tin học ở trờng phổ thông.

Chơng III

Phân tích nguyên nhân dẫn tới các sai lầm của HS THPT khi lập trình bằng ngôn ngữ TURBO PASCAL. Các biện pháp dạy học

nhằm hạn chế và sửa chữa các sai lầm đó.

3.1: Cơ sở lý luận:

Để xây dựng các biện pháp hạn chế và sửa chữa các sai lầm của HS khi lập trình bằng ngôn ngữ TURBO PASCAL. Chúng tôi dựa vào cơ sở lý luận khoa học sau đây.

3.1.1: Lý luận về ph ơng pháp dạy học:

Trớc hết có thể nói rằng: Phơng pháp là con đờng, là cách thức để đạt đợc những mục đích nhất định.

Nh vậy: “ Phơng pháp dạy học là cách thức làm việc của thầy và trò trong sự phối hợp thống nhất và dới sự chỉ đạo của thầy, nhằm làm cho trò tự giác, tích cực, tự lực đạt tới mục đích dạy học”. ([ 18] trang 23).

Phơng pháp dạy học liên hệ khăng khít với quá trình dạy học là một quá trình gồm 2 mặt hoạt động: Hoạt động của thầy và hoạt động của trò, trong đó thầy giữ vai trò chủ đạo, trò giữ vài trò chủ động và tích cực.

Những nghiên cứu của các nhà tâm lý học đã khẳng định: “ Mọi trẻ em bình thờng không có bệnh tật gì, đều có khả năng đạt đợc học vấn toán học phổ thông cơ bản dầu cho chơng trình toán đã hiện đại hoá”. ([12] trang49). Điều đó có thể khẳng định các em có thể học lập trình bằng ngôn ngữ cụ thể. Điều đó cũng khẳng định các sai lầm của HS khi lập trình bằng NNLT TP là có thể khắc phục đợc.

Giáo dục học môn tin học liên hệ khăng khít với 1 số môn khoa học khác: Khoa học Toán học, khoa học duy vật biện chứng và duy vật lịch sử, giáo dục học, tâm lý học, Logic học và điều khiển học.

Chính những sai lầm của học sinh trong lập trình PASCAL sẽ kích thích đợc hoạt động học tập mà HS đợc hớng đích, gợi động cơ để tìm ra sai lầm và đi tới lời giải đúng thấy đợc sai lầm của mình(hoặc của bạn) và tìm thấy cách sửa chữa sai lầm của mình (hoặc của bạn) đều là những khám phá và từ đó HS sẽ chiếm lĩnh kiến thức một cách trọn vẹn hơn. R.A.Axanốp cho rằng: “ Việc tiếp thu tri thức một cách có ý thức đợc kích thích hơn bởi việc HS tự phân tích một cách có suy nghĩ nội dung của từng sai lầm này và t duy, lý luận về bản chất của các sai lầm”. ([17] trang 97).

3.2.1: Những vấn đề cơ bản của tâm lý học dạy học: (adsbygoogle = window.adsbygoogle || []).push({});

Những kết quả nghiên cứu của tâm lý học dạy học cho thấy:

a) Hoạt động dạy là hoạt động của thầy nhằm tổ chức, lĩnh hội nội dung giáo dỡng và giáo dục và chỉ đạo sự lĩnh hội đó cho trò.

b) Hoạt động học là hoạt động của trò nhằm tổ chức các điều kiện đảm bảo cho sự lĩnh hội nội dung giáo dỡng và giáo dục.

Nh vậy, hoạt động dạy và hoạt động học mang tính chất hai chiều, có tác động qua lại của ngời dạy và ngời học. “ chất lợng hoạt động học phụ thuộc vào trình độ điều khiển và tổ chức ( Trình độ nghề nghiệp) của thầy, kết tinh ở trình độ phát triển những hành động học tập tích cực của HS”. ([10] trang 61).

Bản chất và đặc điểm của hoạt động học đã phản ánh rằng:

1.“ Hoạt động học trớc hết là hoạt động mà nhờ nó diễn ra sự thay đổi trong bản thân học sinh. Đó là hoạt động nhằm tự biến đổi mà sản phẩm của nó là những biến đổi diễn ra trong chính bản thân chủ thể trong quá trình thực hiện nó”. (Đ.B.Encônin – [11] trang 198).

2.“ Tri thức và những kỹ năng, kỹ xảo tơng ứng với tri thức ấy là đối tợng của hoạt động học. Việc lĩnh hội tri thức kỹ năng, kỹ xảo của xã hội sẽ không thể hiện đợc nếu ngời học là khách thể bị động của những tác động s phạm” ([17] trang99).

3. Hoạt động học cần làm cho học sinh nắm bắt đợc rằng: Quá trình lĩnh hội tri thức gắn liền với các thao tác phân tích, tổng hợp, so sánh, khái

quát... của t duy. Đồng thời việc lĩnh hội cùng một nội dung nh nhau lại có thể đợc thực hiện bằng nhiều phơng pháp và phơng tiện học tập khác nhau.

Hơn nữa: Các biện pháp sửa chữa sai lầm của HS khi lập trình bằng NN TP phải tác động và nhằm đích vào hoạt động của HS. Trớc hết cần tạo ra động cơ học tập sửa chữa các sai lầm. HS phải thấy đợc việc sửa chữa các sai lầm khi lập trình bằng NNLT TP là một nhu cầu và cần tham gia nh một chủ thể một cách tự nguyện, say mê, hào hứng.

Bởi vì: “ Nếu sự hứng thú đối với học tập không đợc hình thành, thì bản thân sự lĩnh hội sẽ diễn ra thấp hơn nhiều so với cờng độ vốn có của HS” ([11] trang 199). Từ đó nguyên nhân gây ra những sai lầm trong lập trình TP sẽ xuất hiện.

Các biện pháp đề ra phải nhằm giúp HS phát triển các kỹ năng học tập nh: Kỹ năng nhận thức, kỹ năng thực hành, kỹ năng tự kiểm tra, đáng giá.

3.2: Phân tích các nguyên nhân dẫn tới sai lầm của HS THPT khi mới lập trình bằng ngôn ngữ TURBO PASCAL.

Ngoài các nguyên nhân về ý thức và ý chí học tập của HS còn non kém, năng lực và phẩm chất của một số giáo viên còn hạn chế có ảnh hởng xấu tới việc lĩnh hội kiến thức của HS. ở luận văn này chúng tôi chú trọng phân tích một số nguyên nhân cơ bản nhất về kiến thức dẫn tới các sai lầm của HS khi học lập trình.

3.2.1: Nguyên nhân 1:Hiểu không đầy đủ và chính xác các thuộc tính của các khái niệm Tin Học. của các khái niệm Tin Học.

Chúng ta biết rằng: Mỗi khái niệm Toán học đều có nội hàm và Ngoại diên.

Tập hợp các dấu hiệu đặc trng cho bản chất của các đối tợng đợc phản ánh trong khái niệm chỉ là nội hàm của khái niệm đó.

Tập hợp các đối tợng có chứa các dấu hiệu đã nói trên chính là ngoại diên của khái niệm.

Nói một cách khác: Khi ta định nghĩa một khái niệm Toán học thì nội dung ( gồm tất cả các tính chất đặc trng) và phạm vi (bao gồm tất cả các đối tợng thoả mãn định nghĩa) của khái niệm đã đợc xác định. HS không nắm vững nội hàm và ngoại diên của một khái niệm thì không hiểu

đầy đủ hoặc hiểu sai lệch hoàn toàn bản chất của khái niệm và từ đó các sai lầm khi giải toán sẽ xuất hiện. Điều đó cũng có nghĩa là các sai lầm khi lập trình giải các bài toán trên máy tính cũng xuất hiện.

Hơn nữa, nhiều khái niệm trong Tin học (Kể cả trong Toán học nói chung) là sự mở rộng hoặc thu hẹp của một khái niệm trớc đó. Việc HS hiểu không đầy đủ và chính xác khái niệm này sẽ làm cho các em không hiểu và không thể có biểu tợng khái niệm khác. Chẳng hạn: việc không nắm vững khái niệm dãy số sẽ dẫn HS tới việc không hiểu khái niệm mảng số và không thể hiểu mảng nhiều chiều.

Không nắm đợc mối liên kết LOGIC giữa các khái niệm, HS khó khăn trong việc lĩnh hội các khái niệm đó dẫn tới sai lầm khi giải toán nghĩa là sai lầm khi lập trình. HS không nắm vững cấu trúc câu lệnh WHILE và câu lệnh REPEAT nên có HS kết luận: “ Mọi bài toán dùng lệnh WHILE đều có thể dùng câu lệnh REPEAT và ngợc lại”. (?).

Nhiều khi ngời ta hay nói tới sự “ mất gốc” của HS, thì trớc hết cần hiểu rằng: Đó là sự “ mất gốc” về các khái niệm Toán học dẫn HS tới việc lĩnh hội các khái niệm Tin học gặp nhiều khó khăn.

Trong Toán học HS không nắm vững 2 khái niệm số thực và số nguyên nên khi lập trình giải một bài toán có liên quan đến kiểu dữ liệu các em thờng gặp lỗi khai báo biến sai kiểu dữ liệu.

Không nắm vững dấu hiệu đặc trng cho bản chất của các đối tợng đ- ợc phản ánh trong khái niệm nên HS vận dụng các khái niệm để lập trình sẽ phạm phải sai lầm nh là phép gán, cấu trúc rẽ nhánh và cấu trúc lặp... Chẳng hạn ta có chơng trình sau:

PROGRAM CTLOI;

USES Crt;

VAR x,y,z: Real; N: Integer; BEGIN Clrscr; Readln(n); X:= trunc(n); Y:= n div 2; Z:= n mod 2 =0;

Writeln(x,y,z); END.

Khi chạy CT máy sẽ báo lỗi 26: Type mismatch .“ ” Nguyên nhân biến z có kiểu thực (real) còn biểu thức n mod 2 =0 có giá trị true hoặc false (kiểu boolean). Vì vậy không thể áp dụng phép gán z:= n mod 2 =0; Cách giải quyết: Khai báo lại kiểu của biến z nh sau: Var z: boolean; (adsbygoogle = window.adsbygoogle || []).push({});

Không nắm vững tập hợp các đối tợng của khái niệm ( hay phạm vi của khái niệm) nên nhiều HS đã mác sai lầm khi gặp bài toán nhận dạng khái niệm xem 2.2.1.3, bài 3.1, 3.2, 3.3,3.4 trang 38.

Không nắm vững phạm vi của khái niệm ( các đối tợng) nên nhiều HS đã mắc phải sai lầm ở lỗi chính tả của ngôn ngữ lập trình TP. Xem 2.2.1.2 bài 2.1, bài 2.2, bài 2.3, bài 2.4 trang 32.

Đôi khi HS còn nhầm lẫn biến điều khiển trong vòng lặp WHILE, REPEAT với biến điều khiển trong vòng lặp FOR, hoặc trong câu lệnh rẽ nhánh IF...ELSE...THEN với câu lệnh rẽ nhiều nhánh CASE ...ELSE...END; Xem 2.2.1.4, bài 4.1, bài 4.2, bài 4.3, bài 4.4, trang 45.

Một phần của tài liệu Phát hiện và sửa chữa sai lầm cho học sinh THPT khi lập trình bằng ngôn ngữ turbo pascal (Trang 63)