SKKN Phát hiện, sửa một số lỗi thường gặp của học sinh đội tuyển tin học khi dạy lập trình Pascal

Trên tinh thần đó hàng năm Phòng GD & ĐT Hiệp Hòa tổ chức hội thi Olympic Tin học cho học sinh THCS. Các em dự thi sẽ phải tham gia thi hai vòng: Vòng thứ nhất: Thi trắc nghiệm (thời gian 30 phút) – Kiến thức chung về máy tính, tin học văn phòng, internet và lập trình Pascal. Với những kiến thức này thì các em đã được tiếp thu trên lớp qua các bài học. Đồng thời các em cũng có thể thu thập thêm những kiến thức đó qua sách báo, qua các phương tiện thông tin, qua truy cập Internet.Vì đó chỉ là nhữngkiến thức thôngqua: Đọc, nghe và quan sát… là các em có thể hiểu và ghi nhớ được. Do vậy, ở vòng thi này đa số các em làm được và đạt điểm khá cao.

Còn vòng thi thứ hai: Thi lập trình (thời gian 90 phút) – Viết chương trình bằng ngôn ngữ Pascal (Free Pascal). Với phần thi này các em phải lập trình dể giải các bài toán bằng ngôn ngữ Pascal. Trong khi đó, những kiến thức để các em có thể dự thi phần này lại được học theo chương trình môn tự chọn cho học sinh khối 8. Vậy để học sinh có thể tự tin khi thi phần thực hành là một giáo viên Tin học tôi phải suy nghĩ và trăn trở rất nhiều là làm thế nào cho các em phải nắm chắc cú pháp các câu lệnh, phát huy được tính tích cực, chủ động, tự lực, sáng tạo của học sinh; rèn được kỹ năng thực hành thành thạo, biết vận dụng kiến thức, kỹ năng giải quyết các bài toán thực tiễn và nhất là nâng cao được chất lượng học sinh giỏi tin học cấp Huyện.

Với những lý do trên khiến tôi quyết định chọn giải pháp: “Phát hiện, sửa mộtsố lỗi thường gặp của học sinh đội tuyểntin học khi dạy lập trình Pascal”.

docx 19 trang Chăm Nguyễn 16/03/2025 480
Bạn đang xem tài liệu "SKKN Phát hiện, sửa một số lỗi thường gặp của học sinh đội tuyển tin học khi dạy lập trình Pascal", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

Tóm tắt nội dung tài liệu: SKKN Phát hiện, sửa một số lỗi thường gặp của học sinh đội tuyển tin học khi dạy lập trình Pascal

SKKN Phát hiện, sửa một số lỗi thường gặp của học sinh đội tuyển tin học khi dạy lập trình Pascal
=100); S:=0;
For i:=1 to n do
S := s + i*(i+1)/(i+2)*(i+3);
Write(‘Tong la: ’,s:6:3); Readln;
End.
Program bai1; Uses crt;
Var
N,i:word; S:real;
Begin
Clrscr;
Repeat
Write(‘Nhap n=’); readln(n); Until (n>4) and (n<=100); S:=0;
For i:=1 to n do
S := s + i*(i+1)/((i+2)*(i+3));
Write(‘Tong la: ’,s:6:3); Readln;
End.

Biện pháp 2: Sử dụng dấu “;” sai vị trí.
Trước Else không có dấu chấm phẩy. Đây là lỗi thường gặp với học sinh mới học lập trình Pascal (đội tuyển tin 6). Các em cho rằng đã hết câu nên đặt dấu chấm phẩy. Chương trình sẽ báo lỗi ở vị trí trước Else.
Cách sửa: Xóa dấu “;” trước Else.
Ví dụ 2: Tuổi cha hiện nay là b tuổi, tuổi con là c tuổi (b-c>0, và b, c là các số nguyên dương). Hãy viết chương trình (với b, c được nhập từ bàn phím) để kiểm tra xem tuổi cha có gấp đôi tuổi con hay không? Nếu đúng thì đưa ra màn hình thông báo “hiện nay tuổi cha gấp đôi tuổi con”; trường hợp ngược lại, hãy tính số năm (trước đó hoặc sau đó) tuổi cha gấp đôi tuổi con và đưa ra thông báo “số năm trước đây tuổi cha gấp đôi tuổi con” hay “số năm sau tuổi cha sẽ gấp đôi tuổi con”.
Khi viết chương trình giải bài toán trên học sinh sẽ mắc lỗi với dấu “ ; ” trước Else.
Giáo viên: hướng dẫn học sinh phát hiện lỗi sai sau khi chạy chương trình. Vị trí con trỏ báo lỗi trước “Else” và cách khắc phục xoá dấu “ ; ” trước Else. Chương trình như sau:
Chương trình lỗi
Chương trình đúng
Program so_sanh_tuoi; Uses crt;
Var b,c: Integer; Begin
Clrscr;
Repeat
Write(‘Nhap tuoi cha:’); Readln(b);
Write(‘Nhap tuoi con:’); Readln(c);
If (b-c0) and (b>c) and (b-c>18));
If b=2*c then writeln(‘hien nay tuoi cha gap doi tuoi con’); Else
Program so_sanh_tuoi; Uses crt;
Var b,c: Integer; Begin
Clrscr;
Repeat
Write(‘Nhap tuoi cha:’); Readln(b);
Write(‘Nhap tuoi con:’); Readln(c);
If (b-c0) and (b>c) and (b-c>18));
If b=2*c then writeln(‘hien nay tuoi cha gap doi tuoi con’) Else
If b>2*c then writeln(‘sau’,b-2*c,
‘nam tuoi cha gap doi tuoi con’)

If b>2*c then writeln(‘sau’, b-2*c, ‘nam tuoi cha gap doi tuoi con’);
Else
Writeln(2*c-b,’ nam truoc day tuoi cha gap doi tuoi con’); Readln
End.
Else
Writeln(2*c-b,’ nam truoc day tuoi cha gap doi tuoi con’); Readln
End.

Biện pháp 3: Không phân biệt được hằng xâu và biến.
- Đến đây thì các em học sinh đã không mắc lỗi với dấu “;” trước Else, tuy nhiên trong chương trình học sinh cần phải chú ý hằng xâu đặt trong cặp nháy đơn còn biến thì không cần đặt trong cặp nháy đơn.
Ví dụ 3: Viết chương trình nhập vào họ tên, điểm văn, điểm toán, điểm anh văn của 1 học sinh. Sau đó in ra màn hình: họ tên, điểm trung bình, xếp lọai của học sinh đó (trên 1 dòng). Cho biết:
Điểm trung bình = (điểm văn + điểm toán + điểm anh văn) / 3
Xếp loại:
+ Giỏi, nếu điểm trung bình >= 9.0 và không có điểm dưới 6.5;
+ Khá, nếu 7.0 <= điểm trung bình < 9.0 và không có điểm dưới 5;
+ Trung bình, nếu 5.0 <= điểm trung bình < 7.0 và không có điểm dưới 3.5;
+ Yếu, nếu điểm trung bình < 5.0
Trong chương trình trên học sinh thường không đặt hằng xâu vào trong nháy đơn mà viết như với biến chương trình. Giáo viên cần hướng dẫn học sinh đưa hằng xâu vào trong nháy đơn để chương trình đúng:
Chương trình lỗi
Chương trình đúng
Program Xep_loai_HS; Uses crt;
Var t,v,a,dtb,min: real; Xl:string;
Write(‘moi nhap diem toan:’); Readln(t);
Write(‘moi nhap diem van:’); Readln(v);
Write(‘moi nhap diem anh van:’); Readln(a);
dtb:=(t+v+a)/3;
Program Xep_loai_HS; Uses crt;
Var t,v,a,dtb,min: real; Xl:string;
Write(‘moi nhap diem toan:’); Readln(t);
Write(‘moi nhap diem van:’); Readln(v);
Write(‘moi nhap diem anh van:’) Readln(a);

Min:=t;
If min>v then min:=v; If min>a then min:=a;
if (dtb>=9) and (min>=6.5) then xl:=Gioi
else if (dtb>=7) and (min>=5) then xl:=kha
else if (dtb>=5) and (min>=3.5)
then xl:=Trung binh else
xl:=yeu;
write(‘Ho va ten ’, hoten,' Diem trung binh: ',dtb:0:1,' Xep loai: ',xl);
readln;
end.
dtb:=(t+v+a)/3; Min:=t;
If min>v then min:=v; If min>a then min:=a;
if (dtb>=9) and (min>=6.5) then
xl:='Gioi'
else if (dtb>=7 and (min>=5) then xl:='kha'
else if (dtb>=5) and (min>=3.5) then xl:='Trung binh' else
xl:='yeu';
write(‘Ho va ten ’, hoten,' Diem trung binh: ',dtb:0:1,' Xep loai: ',xl);
readln;
end.

Biện pháp 4: Sử dụng tên hàm làm biến cục bộ.
Do lệnh trả kết quả cho tên hàm rất giống một lệnh gán bình thường nên học sinh thường nhầm tên hàm là biến cục bộ. Vì vậy khi viết chương trình để tiết kiệm biến cục bộ học sinh đã sử dụng tên hàm làm biến cục bộ.
Để tránh lỗi này cần lưu ý với học sinh: để trả kết quả cho hàm, tốt nhất nên tính kết quả hàm vào một biến cục bộ, trước khi kết thúc ta mới gán tên hàm bằng giá trị biến này để trả giá trị cho hàm.
Ví dụ 4: Tính tổng các chữ số của n (n là số nguyên dương nhập từ bàn phím).
Chương trình lỗi
Chương trình đúng
Program Tong_chu_so; Uses crt;
Var n: int64;
Function tong(n:int64):int64;
Begin
repeat
tong:=tong+ n mod 10; n:=n div 10;
Until n=0;
End; Begin
Program Tong_chu_so; Uses crt;
Var n: int64;
Function tong(n:int64):int64;
Var t:int64;
Begin
t:=0;
repeat
t:=t+ n mod 10; n:=n div 10;
Until n=0;

Clrscr;
Repeat
Write('nhap n='); Readln(n); Until n>0;
Writeln('Tong cac chu so cua ',n,' la :',tong(n):5);
Readln;
End.
tong:=t;
End; Begin
Clrscr;
Repeat
Write('nhap n='); Readln(n); Until n>0;
Writeln('Tong cac chu so cua ',n,' la :',tong(n):5);
Readln;
End.

Biện pháp 5: Tràn số do kết quả phép tính vượt quá giới hạn.
Ví dụ 5.1: Tính tổng s = 1! + 2! + 3! ++n!. Với n là số nguyên dương.
Chương trình đòi hỏi biến gt và s phải có miền giá trị rất lớn. Trong chương trình của học sinh thường báo lỗi do miền giá trị của biến tham gia không đủ lớn. Lỗi này do khai báo hàm trả về số nguyên (integer) nên miền giá trị tối đa là 32767. Có hai cách khắc phục là :
* Cách 1: Tăng miền giá trị của các biến tham gia CT (giữ nguyên vòng for):
Chương trình lỗi
Chương trình đúng
Program Tong_giai_thua; Uses crt;
Var i,n,s: integer;
Function gt(n:integer):integer; Var i,t:integer;
Begin
T:=1;
For i:=1 to n do t:=t*i; Gt:=t;
End;
Begin
Clrscr;
Repeat
Write(‘nhap n = '); Readln(n); Until n>0;
S:=0;
For i:=1 to n do s:=s+gt(i); Writeln(‘Tong s=’, s:5); Readln;
End.
Program Tong_giai_thua; Uses crt;
Var s:extended; i,n:longint;
Function gt(n:int64):extended; Var i:longint; t:extended; Begin
T:=1;
For i:=1 to n do t:=t*i; Gt:=t;
End;
Begin
Clrscr;
Repeat
Write(‘nhap n = '); Readln(n); Until n>0;
S:=0;
For i:=1 to n do s:=s+gt(i); Writeln(‘Tong s=’, s:5); Readln;
End.

* Cách 2: Thay vòng for do bằng While.	do đồng thời tăng miền giá trị của
các biến tham gia CT.
Chương trình lỗi
Chương trình đúng
Program Tong_giai_thua; Uses crt;
Var s,n,i: integer;
Function gt(n:integer):integer; Var i,T:integer;
Begin
T:=1;
For i:=1 to n do t:=t*i;
Gt:=T;
End;
Begin
Clrscr;
Repeat
Write(‘nhap n =’); Readln(n); Until n>0;
S:=0;
For i:=1 to n do s:=s+gt(i); Writeln(‘Tong s=’, s:5); Readln;
End.
Program Tong_giai_thua; Uses crt;
Var i, n :int64; S: extended; Function gt(n:int64):extended; Var T:extended; i:int64; Begin
T:=1; i:=1;
While i<=n do
Begin T:=T*i; i:=i+1; end;
gt:=T; End;
Begin
Clrscr;
Repeat
Write(‘nhap n =’); Readln(n); Until n>0;
S:=0; i:=1;
While i<= n do begin
S:= S + GT(i); i:=i+1;
end;
Writeln('Tong S= ', S:2:2); Readln;
End.

Ví dụ 5.2: Viết chương trình tìm bội chung nhỏ nhất của hai số a và b. (a, b là hai số nguyên dương nhập từ bàn phím).
Chương trình của học sinh bị lỗi tràn bộ nhớ (exitcode = 215) khi chương trình tính tích a*b. Khắc phục lỗi này bằng cách dùng dấu ngoặc () ưu tiên phép chia lấy phần nguyên (lấy a hoặc b div ucln(a,)) trước sau đó thực hiện phép nhân.
Chương trình lỗi
Chương trình đúng

Program boi_chung_nn; Uses crt;
Var a,b:word;
Function ucln(a,b:longint):longint; Var r:longint;
Begin
while b0 do begin
r:=a mod b; a:=b;
b:=r; end; ucln:=a;
end;
Function bcnn(a,b:longint):longint;
Begin
bcnn:=a*b div ucln(a,b);
end;
Begin
Clrscr;
Write('nhap a= '); readln(a);
Write('nhap b= '); readln(b);
Write('bcnn cua hai so a va b la:',bcnn(a,b):5);
Readln;
End.
Program boi_chung_nn; Uses crt;
Var a,b:word;
Function ucln(a,b:longint):longint; Var r:longint;
Begin
while b0 do begin
r:=a mod b; a:=b;
b:=r; end; ucln:=a;
end;
Function bcnn(a,b:longint):longint;
Begin
bcnn:=a*(b div ucln(a,b));
end; Begin
Clrscr;
Write('nhap a= '); readln(a);
Write('nhap b= '); readln(b);
Write('bcnn cua hai so a va b la:',bcnn(a,b):5);
Readln;
End.

Biện pháp 6: Khai báo sai miền chỉ số cho dữ liệu mảng.
Ví dụ 6: Nhập vào một mảng n số nguyên gồm các số lớn hơn 100 và nhỏ hơn 500. In mảng vừa nhập.
Học sinh được học thuộc các bài tập về mảng nên sẽ làm bài giống như các dạng đó mà không biết tư duy để giải quyết yêu cầu của bài toán là giá trị của các phần tử phải lớn hơn 100 và nhỏ hơn 500. Chương trình thường dùng For
...do để nhập mảng (biến i không chạy được từ 1) và không can thiệp được vào biến đếm i để nhập lại giá trị của a[i].
Học sinh mắc lỗi khai báo mảng như sau: Var a:array[100..500] of integer;
Học sinh nhập mảng bằng for do như sau:
write('nhap n='); readln(n);
for i:=1 to n do
begin
Write('a[',i,']='); Readln(a[i]);
end;
Để sửa lỗi trên cho học sinh thì giáo viên hướng dẫn các em khai báo lại biến mảng và dùng vòng lặp RepeatUntil để nhập mảng. Chương trình như sau:
Chương trình lỗi
Chương trình đúng
Program nhap_mang; uses crt;
var a:array[100..500] of longint; n,i:longint;
begin
clrscr;
write('nhap n='); readln(n);
for i:=1 to n do
begin
write('a[',i,']='); Readln(a[i]);
end;
Write(‘Cac phan tu cua mang:’);
for i:=1 to n do write(a[i],'	');
Readln
end.
Program nhap_mang; uses crt;
var a:array[1..100] of longint; n,i:longint;
begin clrscr;
write('nhap n='); readln(n);
i:=0;
repeat i:=i+1;
write('a[',i,']='); Readln(a[i]); if (a[i]=500)
then i:=i-1;{khong thoa man nhap lại}
until i=n;
for i:=1 to n do write(a[i],'	');
Readln
end.

Biện pháp 7: Giá trị biến điều khiển vượt quá miền chỉ số của mảng.
Ví dụ 7: Viết chương trình nhập vào mảng gồm n phần tử (n<=100) sắp xếp các phần tử theo thứ tự tăng dần và hiển thị các phần tử sắp xếp đó ra màn hình.
- Chương trình như sau:
Chương trình lỗi
Chương trình đúng
Program Sap_xep; uses crt;
var a: array[ 1.. 100] of longint; var i,j,n,tg: longint;
begin
Clrscr;
Write( 'nhap so phan tu cua mang ');
Readln(n);
Writeln(' moi nhap cac phan tu cua mang ');
for i:=1 to n do begin
write('A', i,']= '); readln(a[i]); end;
{sap xep day}
for i:=0 to n-1 do for j:=i+1 to n do if a[i]>a[j] then Begin
tg:=a[i]; a[i]:=a[j]; a[j]:=tg;
End;
writeln(' day sau khi sap xep la
');
for i:=1 to n do write( a[i]: 4); readln;
End.
Program Sap_xep; uses crt;
var a: array[ 1.. 100] of longint; var i,j,n,tg: longint;
begin
Clrscr;
Write( 'nhap so phan tu cua mang ');
Readln(n);
Writeln(' moi nhap cac phan tu cua mang ');
for i:=1 to n do begin
write('A', i,']= '); readln(a[i]); end;
{sap xep day}
for i:=1 to n-1 do for j:=i+1 to n do if a[i]>a[j] then Begin
tg:=a[i]; a[i]:=a[j]; a[j]:=tg;
End;
writeln(' day sau khi sap xep la
');
for i:=1 to n do write( a[i]: 4); readln;
End.
- Chương trình của học sinh mắc lỗi trong vòng For khi gán i:=0 không nằm trong miền chỉ số của biến mảng ta cần gán lại i:=1.
Biện pháp 8: Không hiển thị kết quả khi chương trình không tìm được giá trị thoả mãn đề bài.
Ví dụ 8: Viết chương trình tìm các số có ba chữ số sao cho số đó bằng n lần
tổng các chữ số của nó (n nguyên dương được nhập từ bàn phím).
Chương trình chỉ in ra kết quả khi tìm được số thoả mãn (với n>10), khi không tìm được số thoả mãn (0<n<11) thì chương trình không có câu trả lời, hoặc câu trả lời nếu đưa vào trong vòng For sẽ bị lặp theo số lần lặp của 3 vòng For.
Cách sửa: dùng biến đếm d để đếm số lượng số thoả mãn. Nếu d>0 thì in ra số tìm được và số lượng, ngược lại (d=0) thông báo không có số thoả mãn..
Chương trình lỗi
Chương trình đúng
Program Tim_so; uses crt;
Var n,a,b,c:word; Begin
Clrscr;
Write(‘nhap n=’); Readln(n); For a:=1 to 9 do
For b:=0 to 9 do For c:=0 to 9 do
If (100*a+10*b+c) = n*(a+b+c) then write(a,b,c);
Readln
End.
Program Tim_so; uses crt;
Var n,a,b,c,d:word; Begin
Clrscr;
Write('nhap n= '); Readln(n); d:=0;
For a:=1 to 9 do For b:=0 to 9 do For c:=0 to 9 do
If (100*a+10*b+c) = n*(a+b+c) then
begin
write(a,b,c,'; '); d:=d+1;
end; writeln;
If d=0 then write('khong co so thoa man') else write('co ',d,' so thoa man');
Readln
End.

HIỆU QUẢ CỦA SÁNG KIẾN KINH NGHIỆM.
Học sinh:
Sau nhiều năm áp dụng giải pháp, chất lượng và số lượng giải học sinh giỏi môn tin học đã đạt được kết quả trong 3 năm gần nhất như sau:
+ Cấp huyện:
Năm học
Số HS
dự thi
Số HS
đạt giải
Giải
Ghi chú
Nhất
Nhì
Ba
KK
2020-2021
9
9
1
3
5


2021-2022
17
17
1
3
6
7

2022-2023
16
15
1
4
7
3

+ Cấp tỉnh:
Năm học
Số HS
dự thi
Số HS
đạt giải
Giải
Ghi chú
Nhất
Nhì
Ba
KK
2020-2021
4
4
1

1
2

2022-2023
5
4

1
1
2


Giáo viên:
* Với thành tích đạt được của các đội tuyển học sinh giỏi kể trên thì bản thân đã đạt được một số thành tích sau:
UBND Huyện tặng danh hiệu chiến sĩ thi đua cơ sở năm học 2020-2021 và năm học 2021-2022.
Năm học 2020-2021 được UBND Huyện tặng giấy khen trong công tác bồi dưỡng học sinh giỏi cấp tỉnh.
Năm 2022 đạt giải nhì hội thi dành cho CBCC-VC chuyên về CNTT tỉnh Bắc Giang.
PHẦN III. KẾT LUẬN, KIẾN NGHỊ.
KẾT LUẬN.
- Trên đây là SKKN : “Phát hiện, sửa một số lỗi thường gặp của học sinh đội tuyển tin học khi dạy lập trình Pascal”.
Tôi đã và đang áp dụng SKKN dạy các đội tuyển tin học của trường THCS Đức Thắng, đội tuyển tin học trẻ của huyện Hiệp Hoà và đạt được những kết quả nêu trên. Vì thời gian tìm hiểu, xây dựng và thực hiện biện pháp đổi mới chưa nhiều, năng lực bản thân có hạn nên không tránh khỏi những hạn chế. Rất mong nhận được những góp ý xây dựng của hội đồng đánh giá sáng kiến kinh nghiệm các cấp để giải pháp của tôi hoàn thiện và mang lại hiệu quả cao hơn nữa.
KIẾN NGHỊ
Để nâng cao chất lượng dạy bồi dưỡng đội tuyển tin học tôi có một số đề xuất như sau:
Các cấp lãnh đạo cần quan tâm hơn nữa đến cơ sở vật chất của các Nhà trường. Nên trang bị đầy đủ các phòng thực hành. Mỗi phòng thực hành có đầy đủ máy tính, tivi, máy chiếu để phục vụ hoạt động dạy học. Các bậc cha mẹ học sinh quan tâm hơn, đầu tư máy tính cho con em học môn tin học.
Tăng cường cho các giáo viên giảng dạy môn Tin học được tiếp thu các chuyên đề, các phần mềm mới phục vụ cho công việc giảng dạy.
Tăng cường cho giáo viên được tham gia học bồi dưỡng các chuyên đề về phương pháp giảng dạy bồi dưỡng học sinh giỏi đội tuyển tin học các cấp.
* Cam kết: Tôi cam đoan những điều trình bầy trên đây là đúng sự thật và không sao chép hoặc vi phạm bản quyền.
THỦ TRƯỞNG ĐƠN VỊ
(ký tên, đóng dấu)
Thị Trấn Thắng, ngày 26/04/2022 Người viết SKKN
Bùi Đức Thịnh

File đính kèm:

  • docxskkn_phat_hien_sua_mot_so_loi_thuong_gap_cua_hoc_sinh_doi_tu.docx
  • pdfSKKN Phát hiện, sửa một số lỗi thường gặp của học sinh đội tuyển tin học khi dạy lập trình Pascal.pdf