Để viết được một chương trình hoàn chỉnh thỏa mãn yêu cầu của bài toán đặt ra trên máy tính thì học sinh phải có tư duy lôgic về thuật toán, khả năng sử dụng máy tính thành thạo, sử dụng
Trang 1MỤC LỤC
1 Mở đầu
1.1 Lý do chọn đề tài ………2
1.2 Mục đích nghiên cứu ……… 2
1.3 Đối tượng nghiên cứu ……….2
1.4 Phương pháp nghiên cứu ………2
2 Nội dung sáng kiến kinh nghiệm ……… 2
2.1 Cơ sở lý luận ……… 2
2.2 Thực trạng dạy học môn Tin học tại trường THPT Nông Cống 1…… 3
2.3 Giải quyết vấn đề ………3
2.3.1 Đối với lý thuyết ……… 3
2.3.2 Đối với thực hành ……….3
2.3.2.1 Khắc phục những lỗi sai cơ bản thường gặp trong chương II: ‘‘Chương trình đơn giản’’ .4
2.3.2.2 Khắc phục những lỗi sai cơ bản trong chương III: ‘‘Cấu trúc rẽ nhánh và lặp’’ ……… 6
2.3.2.3 Khắc phục những lỗi sai cơ bản trong chương IV: ‘‘Kiểu dữ liệu có cấu trúc’’ ……… 9
2.3.2.4 Khắc phục những lỗi sai cơ bản trong chương V: “Tệp và thao tác với tệp” ……… 11
2.3.2.5 Khắc phục những lỗi sai cơ bản trong chương VI: “Chương trình con và lập trình có cấu trúc” ……… 13
2.4 Hiệu quả ……… 14
3 Kết luận, kiến nghị ……… 15 Tài liệu tham khảo
Trang 21 Mở đầu
1.1 Lý do chọn đề tài
Căn cứ vào kế hoạc năm học 2019 – 2020 của trường THPT Nông Cống 1, Tổ Toán – Tin, chuyên đề của trường THPT Nông Cống 1 “Tăng cường vận dụng kiến thức liên môn gắn liền với thực tế, thực tiễn trong giảng dạy, chú trọng phát huy năng lực và tính chủ động, sáng tạo của học sinh”
Chương trình tin học 11 nghiên cứu về NNLT Pascal là chương trình khó, có cấu trúc chặt chẽ Để viết được một chương trình hoàn chỉnh thỏa mãn yêu cầu của bài toán đặt ra trên máy tính thì học sinh phải có tư duy lôgic về thuật toán, khả năng sử dụng máy tính thành thạo, sử dụng các câu lệnh và khai báo kiểu dữ liệu một cách hợp lý Tuy nhiên khi tiến hành viết chương trình trên máy tính học sinh thường gặp một số lỗi cơ bản về mặt cú pháp và ngữ nghĩa
1.2 Mục đích nghiên cứu
Khi thực hiện giảng dạy môn Tin học lớp 11 tại Trường THPT Nông Cống 1, tôi thấy rằng, việc học sinh lập trình giải các bài toán trên máy tính thường gặp không ít khó khăn Phần lớn các em đều gặp một số lỗi cơ bản về mặt cú pháp và ngữ nghĩa Trong khi đó để viết được một chương trình hoàn chỉnh thì học sinh phải
có tư duy logic về thuật toán, biết khai báo kiểu dữ liệu một cách hợp lí, biết sử dụng các câu lệnh đúng cú pháp
Bản thân tôi trong quá trình giảng dạy cũng đã cố gắng hướng dẫn học sinh viết chương trình đúng với yêu cầu trên Nhưng do thời lượng thực hành trên lớp không nhiều nên các em không được thực hành thường xuyên, dẫn đến các em vẫn
mắc phải một số lỗi cơ bản Vì vậy, tôi đã áp dụng một số biện pháp: “Hướng dẫn học sinh lớp 11 phát hiện và sửa lỗi cú pháp khi viết chương trình bằng ngôn ngữ lập trình Pascal”
Trong quá trình áp dụng, bản thân tôi tự thấy đã có những kết quả nhất định, muốn được chia sẻ với các bạn đồng nghiệp Hi vọng sẽ nhận được nhiều ý kiến bổ ích để đề tài của tôi ngày một hoàn thiện hơn
1.3 Đối tượng nghiên cứu
Áp dụng cho học sinh khối 11 trường THPT Nông Cống 1 với mục đích rèn cho học sinh kỹ năng viết chương trình, giúp học sinh tự tìm và sửa chữa lỗi khi viết chương trình bằng ngôn ngữ lập trình Pascal trong chương trình Tin học 11 được thực hiện cả trên lớp và ở phòng thực hành
1.4 Phương pháp nghiên cứu
- Phương pháp nghiên cứu xây dựng cơ sở lý thuyết: giáo viên tạo ra lỗi để học sinh giải quyết vấn đề
- Phương pháp thực hành các bài thực hành sách giáo khoa tin học 11
2 Nội dung sáng kiến kinh nghiệm
2.1 Cơ sở lý luận
- Xuất phát từ thực trạng trên, tôi nhận thấy nếu bản thân không thay đổi cách dạy nhằm giúp học sinh chủ động hơn trong quá trình tìm lỗi và sửa lỗi thì học xong chương trình Tin học 11 có không ít học sinh vẫn chưa viết được một chương trình hoàn chỉnh Dẫn đến học sinh sẽ chán nản, ngày càng xa rời môn Tin học Vì vậy để khắc phục tình trạng trên tôi đã có một số giải pháp hướng dẫn học sinh tự tìm và
Trang 3sửa lỗi cú pháp mà học sinh thường mắc phải ở cả những tiết lí thuyết và tiết bài tập
và thực hành
2.2 Thực trạng dạy học môn Tin học tại trường THPT Nông Cống 1.
- Điều kiện phòng máy nhà trường chưa đáp ứng được 1 học sinh/máy, các em còn phải ngồi chung 2 em/máy dẫn đến hiệu quả của các tiết thực hành chưa cao
Do đó việc nắm bắt nội dung các bài học bị hạn chế
- Khi viết chương trình học sinh thường mắc các lỗi cú pháp Đó là lỗi mà khi viết chương trình học sinh không tuân thủ đúng quy định của ngôn ngữ lập trình như: Đặt sai các tên hằng, biến, tên chương trình …, viết sai các câu lệnh, viết sai các từ khóa …
- Phần lớn khi dạy lập trình cho học sinh giáo viên thường sử dụng hai phương pháp:
+ Phương pháp dùng bảng: Đối với phương pháp này giáo viên thường viết sẵn chương trình cho học sinh hoặc cho học sinh khá giỏi lên viết chương trình và những học sinh còn lại chỉ việc chép vào vở để đảm bảo thời gian của một tiết học Các chương trình viết sẵn này thông thường không có lỗi sai
+ Phương pháp dạy tại phòng thực hành: Giáo viên viết chương trình bằng ngôn ngữ lập trình Pascal rồi chạy chương trình đó cho học sinh Học sinh ghi bài
và gõ lại đúng chương trình đó
- Tuy nhiên khi gặp bài toán tương tự thì học sinh lại lập trình mắc rất nhiều lỗi sai Tại phòng thực hành với số lượng học sinh và số máy tính nhiều nên giáo viên không thể có đủ thời gian để sửa lỗi và hướng dẫn từng máy nên việc học sinh phải biết tự tìm ra lỗi sai và hình thành kỹ năng viết chương trình là vấn đề cần thiết
2.3 Giải quyết vấn đề
2.3.1 Đối với lý thuyết
* Giải pháp 1: Giáo viên tạo tình huống mắc lỗi Thực hiện chia nhóm Yêu
cầu các nhóm tìm ra lỗi có trong chương trình Sau đó đại diện các nhóm lên bảng trình bày Giáo viên nhận xét, tổng kết, nhấn mạnh nguyên nhân gây ra các lỗi có trong chương trình Để khích lệ học sinh, giáo viên tiến hành đánh giá kết quả các nhóm và cho điểm
* Giải pháp 2: Giáo viên nêu bài toán Thực hiện chia nhóm Yêu cầu mỗi
nhóm viết chương trình Chiếu kết quả của một nhóm bất kì Các nhóm khác nhận xét sau đó giáo viên củng cố, chạy thử chương trình cho cả lớp quan sát Từ chương trình hoàn chỉnh đó, các nhóm tự đối chiếu với câu trả lời của nhóm mình để hoàn chỉnh chương trình của nhóm
2.3.2 Đối với thực hành
Học sinh thực hành theo yêu cầu của SGK, giáo viên yêu cầu cả lớp thực hành cùng một nội dung Các em tự sửa lỗi, giáo viên quan sát, bao quát phòng máy, hỗ trợ cho những học sinh yếu Sau đó, giáo viên chiếu chương trình có các lỗi mà các
em chưa khắc phục được và những lỗi đa phần các em mắc phải Giáo viên phân tích nguyên nhân của từng lỗi và yêu cầu các em sửa lại trong chương trình của mình
Trang 4Trong quá trình giảng dạy tôi đã áp dụng kinh nghiệm của mình bắt đầu từ chương II cho đến hết chương trình Tin học lớp 11 Nhưng do điều kiện không cho phép nên ở mỗi chương tôi chỉ đưa ra một số tiết làm ví dụ để minh họa cho đề tài
2.3.2.1 Khắc phục những lỗi sai cơ bản thường gặp trong chương II: ‘‘Chương trình đơn giản’’.
a Những lỗi sai cơ bản:
- Khi viết chương trình học sinh chúng ta thường mắc một số lỗi cơ bản như:
+ Khi kết thúc câu lệnh không có dấu “ ; ”
+ Khi viết từ khóa học sinh hay viết thiếu hoặc thừa từ
Ví dụ: Từ khóa: Program thì học sinh viết là Progam, End thì học sinh viết là And
+ Sau từ khóa End kết thúc chương trình là “.” Nhưng học sinh lại viết “;” + Khi viết chương học sinh thường hay viết thiếu hoặc thừa các dấu: “(”, “)”,
“ ,”, “.”, “:=”, “=”, “ ’ ”, …
+ Khai báo thiếu biến hoặc khai báo quá nhiều biến
+ Khai báo tên biến trùng nhau VD : Var a, A: byte; (Pascal không phân biệt chữ hoa và chữ thường Do đó a và A chỉ là một)
+ Đặt tên biến, tên chương trình, tên tệp không đúng theo quy định của ngôn ngữ lập trình
+ Khi viết từ khóa thường viết sai lỗi chính tả VD: Const thì viết là Cont, end thì viết là and, Real thì viết là Read,…
+ Viết sai câu lệnh gán VD: x := 0; thì viết là: x = 0;
+ Giữa các biến được viết cách nhau bằng dấu “;”
+ Trong một câu lệnh nếu số lệnh >=2 thì phải được đặt trong cặp từ khoá Begin … End;(Câu lệnh ghép)
+ Sử dụng thủ tục clrscr; nhưng không khai báo thư viện chứa thủ tục là CRT; + Học sinh khai báo kiểu dữ liệu một đường nhưng khi viết chương trình thì dùng kiểu dữ liệu khác dẫn đến sai kiểu
…
b Biện pháp sửa lỗi
- Để tránh những lỗi sai cho học sinh khi viết chương trình tôi đưa ra một số ví dụ:
Ví dụ 1: Viết chương trình in ra màn hình dòng chữ: “Xin Chao cac ban den voi chương trinh Pacal”
-Bước 1: Giáo viên chuẩn bị 1 chương trình mẫu bằng pascal như sau:
Program ; 11A;
Begin
Clrscr;
Writeln(’Xin Chao cac hoc sinh 11 ban den voi chương trinh Pacal’) Realn ;
End;
- Bước 2 Chia lớp thành 4 nhóm Yêu cầu mỗi nhóm tìm lỗi sai có trong chương
trình ở trên
Trang 5- Bước 3 Đại diện các nhóm lên bảng trình bày kết quả.
- Bước 4 Giáo viên thực hiện biên dịch chương trình để học sinh thấy được các lỗi
sai và phân tích để học sinh hiểu được nguyên nhân vì sao sai
Các lỗi sai trong chương trình trên là :
+ Câu lệnh Program ; là sai vì sau từ khóa Program không có dấu; (mã lỗi: 2) + Tên chương trình 11A là sai, vì không đúng theo quy tắc đặt tên của ngôn ngữ lập trình Pascal (tên không đượcbắt đầu bằng số)(mã lỗi 2)
+ Sử dụng thủ tục clrscr; mà chưa khai báo thư viện CRT;(mã lỗi 3);
+ Câu lệnh Writeln(’Xin Chao cac ban hoc sinh 11 den voi chương trinh Pacal); có 2 lỗi sai, vì thiếu dấu đóng nháy ở hằng xâu kí tự (mã lỗi:8) và kết thúc câu lệnh không có dấu ; (mã lỗi: 85)
+ Thủ tục Realn sai, phải là Readln (mã lỗi: 3)
- Bước 5 Chạy thử chương trình cho học sinh quan sát.
- Bước 6 Giáo viên đánh giá kết quả và cho điểm các nhóm.
Qua ví dụ trên học sinh sẽ thấy rằng có 2 lỗi sai có cùng mã lỗi là 2 hoặc có 2 lỗi sai
mã lỗi là 3, tuy nhiên mỗi lỗi lại sai ở một tình huống khác nhau Do đó nếu học sinh chỉ thụ động tra cứu bảng thông báo lỗi ở SGK thì khó có thể tự mình sửa được lỗi Cũng qua ví dụ trên học sinh đã được phân tích nguyên nhân vì sao có các lỗi sai và cách sửa lỗi Do đó sau này học sinh sẽ không còn mắc phải các lỗi cơ bản đã nêu
Ví dụ 2: Tiết 8 : Bài tập và thực hành 1.
Thực hành theo yêu cầu của SGK.
- Bước 1 Yêu cầu cả lớp soạn thảo chương trình đã viết sẵn ở SGK trang 34:
Program Giai_PTB2 ;
Var a, b, c, D : Real ;
x1, x2: Real;
Begin
Clrscr;
Write(‘a, b, c: ’);
Readln(a,b,c);
D:= b * b – 4 *a*c;
x1:= (-b – sqrt(D)) / (2*a);
x2:= -b/a –x1;
write(‘x1= ’ , x1:6:2, ‘ x2= ’, x2:6:2);
readln;
end.
- Bước 2 Yêu cầu học sinh thực hiện biên dịch chương trình để phát hiện và sửa
lỗi
Tuy là nhìn chương trình đã viết sẵn trong SGK để soạn thảo nhưng chương trình các em soạn thảo vẫn mắc rất nhiều lỗi Có rất nhiều nguyên nhân, như kỹ năng soạn thảo chưa thành thạo dẫn đến sai lỗi chính tả, hay chưa nắm vững cách viết một biểu thức, cách viết thông báo ra ngoài màn hình,…
Trang 6Để học sinh tự sửa lỗi Giáo viên quan sát, bao quát phòng máy, hỗ trợ cho những học sinh yếu Sau đó, giáo viên chiếu chương trình có các lỗi mà các em chưa khắc phục được và những lỗi đa phần các em mắc phải Giáo viên phân tích nguyên nhân của từng lỗi và yêu cầu các em sửa lại trong chương trình của mình
Giáo viên chiếu lên màn chiếu:
Program Giai_PTB2 ;
Var a, b, c, D : Read ;
x1, x2: Read;
begin
Clrscr;
Write(‘a, b, c: ’);
Readln(a;b;c);
D:= b * b – 4 *a*c;
x1:= (-b – sqrt(D)) / (2a);
x2:= -b/a –x1;
write(‘x1= ’ ; x1:6:2, ’ x2= ’; x2:6:2);
readln;
end;
Giáo viên thực hiện biên dịch, hướng dẫn học sinh sửa lỗi có trong chương trình trên Cụ thể chương trình trên có các lỗi sai:
Sai kiểu dữ liệu, không phải là Read mà là Real (mã lỗi: 26)
Câu lệnh Read(a;b;c); sai vì ngăn cách giữa các biến phải là dấu phẩy, sửa lại
là: Read(a,b,c); (mã lỗi: 89)
Câu lệnh x1:= (-b – sqrt(D)) / (2a); sai vì trong phép nhân phải dùng kí hiệu *, sửa lại là: x1:= (-b – sqrt(D)) / (2*a); (mã lỗi: 89)
Câu lệnh write(‘x1= ’ x1:6:2, ‘ x2= ’, x2:6:2); sai vì ngăn cách giữa các
kết quả ra phải là dấu phẩy Sửa lại là: write(‘x1= ’, x1:6:2, ‘ x2= ’,x2:6:2);
(mã lỗi: 89);
Câu lệnh end; sai vì kết thúc chương trình phải là dấu chấm, sửa lại là: end.
(mã lỗi : 88)
-Bước 3 Khi đã hết lỗi về mặt cú pháp, yêu cầu học sinh chạy chương trình như
yêu cầu của sách giáo khoa
Tuy nhiên vẫn có nhiều em thực hiện chưa đúng, lỗi thường gặp đó là: Khi
thực hiện câu lệnh nhập Read(a,b,c) các em dùng dấu chấm phẩy để ngăn cách giữa
các giá trị VD: Khi nhập giá trị cho a, b, c, thì các em gõ: 3 ; 4; 5 Như vậy các em chưa nắm vững cách nhập giá trị cho nhiều biến Lúc này giáo viên cần làm mẫu cho học sinh quan sát và nhấn mạnh cách nhập giá trị cho nhiều biến: những giá trị này phải được gõ cách nhau bởi ít nhất một dấu cách hoặc một kí tự xuống dòng
(nhấn phím Enter)
2.3.2.2 Khắc phục những lỗi sai cơ bản trong chương III: ‘‘Cấu trúc rẽ nhánh
và lặp’’.
a Các lỗi thường gặp
- Đối với trường hợp này học sinh hay mắc phải các lỗi:
+ Thiếu từ khoá then hoặc do, downto,to,
Trang 7+ Điều kiện trong câu lệnh rẽ nhánh, câu lệnh lặp không phải là biểu thức lôgic hay quan hệ
+ Không sử dụng câu lệnh ghép
+ Trước từ khoá Else có dấu “;”.
+ Giá trị đầu> giá trị cuối trong câu lệnh lặp và không phải là những hằng số + Trong câu lệnh lặp While … do không có lệnh làm thay đổi giá trị biến đếm
+ Không khai báo biến đếm trong chương trình
+ Sau câu lệnh Do có câu lệnh thay đổi giá trị của biến đếm
+ Dùng cùng tên biến điều khiển cho các vòng lặp for lồng nhau
b Biện pháp sửa lỗi
* Với câu lệnh rẽ nhánh
Ví dụ 1: Để tìm số lớn nhất trong 3 số a,b,c được nhập vào từ bàn phím, có học sinh
đã viết chương trình như sau:
Program timmin;
Uses crt;
Var a,b,c:integer;
Begin
Clrscr;
Write(‘nhap vao 3 so:’);
Readln(a,b,c);
If a<b then a:=b
Else
If a<c then a:=c;
Write(‘So lon nhat la:’,a);
Readln;
End
Chương trình trên cho đáp số lúc đúng, lúc sai tuỳ thuộc vào a,b,c
Ta thực hiện chương trình trên với 2 bộ input sau đây:
a=3,b=4,c=5
4 Vậy số lớn nhất là 4 Kết quả sai
a=5,b=4,c=7
7
Trang 8Vậy số lớn nhất là 7 Kết quả đúng
Hãy giải thích tại sao và sửa lại cho đúng ?
Chương trình trên thực hiện lúc đúng lúc sai do chương trình mới chỉ so sánh 2 số a
và b thôi đã đưa ra kết luận Ta có thể sửa lại chương trình như sau:
Program timmin;
Uses crt;
Var a,b,c:integer;
Begin
Clrscr;
Write(‘nhap vao 3 so:’);
Readln(a,b,c);
If a<b then
Begin
If b<c then a:=c else a:=b;
End
Else
If a<c then a:=c;
Write(‘So lon nhat la:’,a);
Readln;
End
* Với câu lệnh lặp:
Ví dụ 2: Tính tổng S=1k!+2k!+….+nk!
Bước 1: Gv chiếu đoạn chương trình giải của bài toán trên
Var i, n, k, T, S :integer;
Begin
Writeln(’ Nhap gia tri cua N va k’);
Readln(n,k);
S:=0;
For i:=1 to n do
Begin
T:=1;
For i:=1 to k do T:=T*i;
S:=S+i*T;
End;
Writeln(’ giá trị của S=’,S);
Readln;
End
Bước 2: yêu cầu học sinh chạy chương trình kiểm tra phát hiện lỗi
Để khắc phục lỗi này, chỉ cần chú ý các vòng lặp lồng nhau phải sử dụng biến điều khiển khác nhau
Trang 92.3.2.3 Khắc phục những lỗi sai cơ bản trong chương IV: ‘‘Kiểu dữ liệu có cấu trúc’’.
a Các lỗi sai thường gặp
- Đối với trường hợp này học sinh hay mắc phải các lỗi:
+ Khi khai báo học sinh viết sai từ khoá.
+ Trong khai báo mảng thì chỉ số đầu và chỉ số cuối là hai chỉ số không xác định
+ Độ rộng tối đa của xâu lớn hơn 255
+ Hằng xâu được đặt trong cặp dấu ’….’
b Biện pháp sửa lỗi
Ví dụ 1: Đề bài: Cho dãy A gồm n số nguyên dương a1,a2, an Tìm giá trị nhỏ nhất của dãy, đưa ra vị trí của số đó.
Bước 1 Sau khi học sinh nêu lại được thuật toán tìm giá trị lớn nhất (đã học ở lớp
10) Giáo viên chiếu chương trình đã chuẩn bị sẵn cho cả lớp quan sát
Chương trình:
Program timmin;
Uses crt;
Const nmax:=50;
Var
A:Aray[1 nmax] 0f Integer;
N,I,csmin:byte;
Min: integer;
Begin
Clrscr;
Write(‘Nhap n:’); readln(n);
For i:= 1 to n do
Begin
Write(‘nhap A[‘I’]’); readln(A[i]);
End;
Min:=A[1];,csmin:=1;
For i:=2 to n do
If A[i]<min then
Begin
Min:=A[i];
Csmin:=I;
End;
Writeln(‘ gia tri nho nhat la:’,min:3,’Tai vi tri:’,csmin:2);
Readln
End
Trang 10Bước 2 Chia lớp thành 4 nhóm Yêu cầu các nhóm tìm lỗi sai có trong chương
trình ở trên
Bước 3 Đại diện các nhóm lên bảng trình bày kết quả.
Bước 4 Giáo viên thực hiện biên dịch chương trình để học sinh thấy được các lỗi
sai và phân tích để học sinh hiểu được nguyên nhân vì sao sai
Các lỗi sai trong chương trình trên là :
+ Khai báo hằng sai: const nmax:=50; phải sửa lại là const nmax=50;
+ Khai báo mảng sai từ khóa khai báo mảng là Array chứ không phải là Aray + Câu lệnh Write(‘nhap A[‘I’]:’); không xuất hiện đúng theo ý tưởng của người viết phải sửa lại là Write(‘nhap A[‘,I,’]:’);
Bước 5 Giáo viên sửa lại chương trình hoàn chỉnh và chạy thử chương trình cho
học sinh quan sát
Bước 6 Giáo viên đánh giá kết quả và cho điểm các nhóm.
Ví dụ 2: Nhập vào một dãy số gồm 7 phần tử và cho biết dãy vừa nhập có tạo
thành cấp số cộng không?
Bước 1: chiếu chương trình cho hs xem:
Var a: array[1 7] of integer;
i,d:integer;kt:boolean;
Begin
Write(‘nhap day so:’);
For i:=1 to 7 do
Begin
Write(‘a[’ ,i, ‘]’);
Readln(a[i]);
End;
d:=a[2]-a[1];kt:=true;i:=1;
while (kt) and (i<=7) do
if (a[i]-a[i-1]<>d) then kt:=false
else i:=i+1;
if kt then writeln(‘Day so tao thanh cap so cong!’)
else writeln(‘Day so khong tao thanh cap so cong!’);
readln
End
Bước 2: chạy chương trình và yêu cầu học sinh quan sát kết quả
Khi thực hiện chương trình trên, chương trình dịch không báo lỗi nhưng kết quả khi thực hiện chương trình sẽ bị sai lệch Khi thực hiện từng bước chương trình ta có thể khắc phục lỗi trên bằng cách gán lại giá trị ban đầu cho biến đếm i=2
2.3.2.4 Khắc phục những lỗi sai cơ bản trong chương V: “Tệp và thao tác với tệp”
a Các lỗi sai thường gặp
Đối với trường hợp này học sinh hay mắc phải các lỗi: