khi thực hiện giảng dạy môn Tin học lớp 11 tại Trường …………………., 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. Một phần là do thời lượng thực hành trên lớp không nhiều mà phần lớn nhà các em không có máy vi tính hoặc có máy vi tính chăng thì các em cũng sử dụng chưa đúng mục đích do đó 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.
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG THPT ………
SÁNG KIẾN KINH NGHIỆM
Người thực hiện: ………
VẬN DỤNG KIẾN THỨC HƯỚNG DẪN HỌC SINH 11 TÌM VÀ SỬA LỖI TRONG NGÔN NGỮ LẬP TRÌNH PASCAL
Tân Trụ, tháng 1 năm 2019
Trang 3MỤC LỤC
A ĐẶT VẤN ĐỀ 1
I LÝ DO CHỌN ĐỀ TÀI 1
II MỤC ĐÍCH NGHIÊN CỨU 1
III ĐỐI TƯỢNG NGHIÊN CỨU 1
IV PHƯƠNG PHÁP NGHIÊN CỨU 1
B GIẢI QUYẾT VẤN ĐỀ 2
I CƠ SỞ LÝ LUẬN 2
II THỰC TRẠNG CỦA VẤN ĐỀ 2
1 Thuận lợi 2
2 Khó khăn 2
III CÁC BIỆN PHÁP ĐÃ TIẾN HÀNH 3
1 Lỗi cú pháp 3
a Những lỗi sai cơ bản 3
b Những lỗi sai cơ bản trong câu lệnh rẻ nhánh và lặp 4
c Những lỗi sai cơ bản trong kiểu dữ liệu có cấu trúc 8
d Những lỗi sai cơ bản trong tệp và thao tác với tệp, chương trình con .10 2 Lỗi ngữ nghĩa 15
IV HIỆU QUẢ CỦA SKKN 20
C KẾT LUẬN VÀ KIẾN NGHỊ 22
I KẾT LUẬN 22
II KIẾN NGHỊ 22
Trang 4A ĐẶT VẤN ĐỀ
I LÝ DO CHỌN ĐỀ TÀI
Thế kỉ XXI là thế kỉ của Công nghệ thông tin và truyền thông Vì vậyviệc trang bị những kiến thức Tin học là một vấn đề có ý nghĩa và tầm quan trọngrất lớn đối với quá trình đào tạo nhân lực, bỗi dưỡng nhân tài cho đất nước Xácđịnh được tầm quan trọng đó nên môn Tin học đã được bộ Giáo dục - Đào tạo đưavào giảng dạy ở các cấp học, nhằm trang bị cho học sinh những kiến thức cơ bản,phổ thông về ngành khoa học Tin học Đặc biệt là trong chương trình SGK Tin họclớp 11 bậc THPT, các nhà biên soạn sách đã đưa vào các chương bài giúp học sinhtiếp cận được với ngôn ngữ lập trình bậc cao Pascal Qua đó giúp các em hìnhdung được sự ra đời, cấu tạo, hoạt động cũng như ích lợi của các chương trình hoạtđộng trong máy tính Từ đó khơi gợi ở các em niềm đam mê đối với bộ môn Tinhọc, tạo niềm tin để các em có thể dễ dàng tự định hướng, lựa chọn nghề nghiệpsau này Tuy vậy, khi thực hiện giảng dạy môn Tin học lớp 11 tại Trường
………., 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áytí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 Một phần là do thời lượng thực hành trên lớp khôngnhiều mà phần lớn nhà các em không có máy vi tính hoặc có máy vi tính chăng thìcác em cũng sử dụng chưa đúng mục đích do đó các em không được thực hànhthường xuyên, dẫn đến các em vẫn mắc phải một số lỗi cơ bản
Để khắc phục vấn đề này cũng như giúp học sinh chủ động tìm lỗi sai và sửakhi viết chương trình tôi đã áp dụng phương pháp “Vận dụng kiến thức đã họchướng dẫn học sinh tìm và sửa lỗi khi viết chương trình trong ngôn ngữ lập trìnhPascal”
II MỤC ĐÍCH NGHIÊN CỨU
- Giúp học sinh chủ động trong việc tìm và sửa chữa lỗi khi viết chương trìnhbằ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 bục giảng và phòng thực hành
III ĐỐI TƯỢNG NGHIÊN CỨU
- Học sinh lớp 11A1, 11A4 cuối năm học 2017– 2018 đầu năm học 2018-2019
- Sách giáo khoa Tin học 11, sách giáo viên, chương trình Pascal
IV PHƯƠNG PHÁP NGHIÊN CỨU
- Tiến hành thực nghiệm qua tiết dạy
Trang 5B GIẢI QUYẾT VẤN ĐỀ
I CƠ SỞ LÝ LUẬN
Pascal là ngôn ngữ lập trình bậc cao do giáo sư Niklaus Wirth (trường đạihọc kỹ thuật, Zurich, Thụy sĩ) sáng tác và công bố vào đầu những năm 1970, vớitên Pascal để kỷ niệm nhà toán học người Pháp Blaise Pascal thế kỷ 17 Lúc đầu,ngôn ngữ lập trình này được sáng tác ra nhằm giúp cho những người mới học lậptrình có được thói quen viết một chương trình có cấu trúc rõ ràng, dễ hiểu và dễđọc cho mọi người Giáo sư Wirth thấy rằng có thể tránh được rất nhiều lỗi khi lậptrình với một ngôn ngữ có cấu trúc khối và có sự kiểm tra kỹ lưỡng sự tương thíchgiữa các kiểu dữ liệu Mà Pascal là một ngôn ngữ như thế: mọi biến và hằng củamột kiểu dữ liệu không thể tự do đem trộn lẫn với các biến và hằng của một kiểu
dữ liệu khác Ngôn ngữ Pascal có thể tách các thông tin dữ liệu (biến, hằng,…) vàcác lệnh cần dùng cho một nhiệm vụ xác định thành những khối riêng, tách ra khỏiphần còn lại của chương trình để người lập trình có thể giải quyết dần từng phầnmột, từng khối một và thậm chí có thể cho nhiều người tham gia lập trình, mỗingười phụ trách một vài khối Và hiện nay Pascal đã được đưa vào chương trìnhhọc chính thức Tuy nhiên trong quá trình học tập, học sinh ở trường tôi vẫn mắcphải một số lỗi khi lập trình Vì vậy để khắc phục tình trạng mắc lỗi, tôi đã cố gắngtìm ra giải pháp trong quá trình giảng dạy
- Phần lớn thì tâm lí phụ huynh cũng như các em chỉ chú trọng vào các mônthi tốt nghiệp và Đại học nên quan niệm học môn Tin học để cho qua Trong khi
Trang 6đó lập trình Pascal lại sử dụng ngôn ngữ viết bằng Tiếng Anh và cần phải có kiếnthức bổ trợ của môn Toán học, Vật lý,… nên khi viết chương trình học sinhthường hay mắc lỗi mà các lỗi thường gặp như: Đặt sai các tên hằng, biến, khaibáo không đủ biến, sử dụng biến mà không khai báo, khai báo sai tên chươngtrình, viết sai các câu lệnh, viết sai các từ khóa, sai các công thức, không nhớ kiểu
dữ liệu…
III CÁC BIỆN PHÁP ĐÃ TIẾN HÀNH
1 Lỗi cú pháp
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ảnnhư:
+ Khi kết thúc câu lệnh phải 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: “(”,
“)”, “ ,”, “.”, “:=”, “=”, “ ’ ”, …
+ Học sinh viết chương trình mà quên không xuống dòng dẫn đến dòng quádài
+ Khai báo quá ít biến không đủ sử dụng trong chương trình
+ Đặt tên biến, tên chương trình, tên tệp không đúng theo quy định của ngônngữ lập trình
+ 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)
+ 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
Ví dụ: Viết chương trình in ra màn hình dòng chữ: “Lop 11A1 truong THPT”
- Bước 1 Chia lớp thành 4 nhóm
- Bước 2 Giáo viên thu kết quả của các nhóm Soạn thảo và chiếu kết quả của mộtnhóm bất kì cho cả lớp cùng quan sát
Trang 7- Bước 3 Yêu cầu các nhóm còn lại phát hiện lỗi sai Sau đó giáo viên hoàn chỉnh.
- Bước 4: Mỗi học sinh tiến hành gõ trực tiếp trên máy tính, sau khi gõ chươngtrình xong học sinh biên dịch sửa lỗi và thực hiện chương trình
- Bước 5: Giáo viên hoàn chỉnh, nhận xét và giới thiệu học sinh mã lỗi ở trang 136,
137, 138 SGK để học sinh biết cách sửa lỗi:
Từ khoá Progam sai đúng là: Program(mã lỗi: 36)
Tên chương trình vi du1 là sai vì tên chương trình được đặttheo quy tắc đặt tên của ngôn ngữ lập trình nên không được chứa dấucách (mã lỗi: 85)
Sau Uses crt phải có dấu;(mã lỗi 85)
Sau từ khóa Begin không có dấu “;”(mã lỗi: 85)
Thủ tục Realn sai, phải là Readln(mã lỗi: 3)
End; sai phải là End.(End là từ khóa để kết thúc chươngtrình) (mã lỗi: 94)
Qua ví dụ trên học sinh bước đầu biết cách biên dịch sửa lỗi và thực hiện chươngtrình trên máy tính
b Những lỗi sai cơ bản trong câu lệnh rẻ nhánh và lặ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,
+ Điều kiện trong câu lệnh rẻ nhánh là biểu thức lôgic
+ 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)
+ Trước từ khoá Else không có dấu “;”
Trang 8+ Giá trị đầu luôn luôn nhỏ hơn hoặc bằng giá trị cuối trong câu lệnh lặp và
là những hằng số
+ Trong câu lệnh lặp While … do phải có lệnh làm thay đổi giá trị biến đếm.+ Điều kiện trong câu lệnh While … do là một biểu thức Logic
+ Khai báo thiếu biến sử dụng trong chương trình
+ Quên khai báo biến đếm trong chương trình
+ Quên đổi công thức viết trong Toán học theo cú pháp viết trong Pascal
Ví dụ : Cho chương trình như sau:
Bước 1 Giáo viên chiếu chương trình cho các nhóm xem
Trang 9Bước 2 Chia lớp thành 4 nhóm Nhiệm vụ của mỗi nhóm là giải quyết bài toán ởtrên, mỗi nhóm tiến hành gõ trực tiếp trên máy tính, sau khi gõ chương trình xonghọc sinh biên dịch sửa lỗi.
Bước 3: Đại diện nhóm lên trình bày kết quả, cử nhóm nhanh nhất có thể cho điểmcộng ở điểm miệng để khuyến khích tinh thần tìm tòi, tự học của học sinh
Bước 4: Yêu cầu các nhóm còn lại nhận xét sau đó giáo viên hoàn chỉnh bài
Các lỗi sai trong chương trình trên là:
Khai báo thiếu biến delta sử dụng trong chương trình
Không có kiểu dữ liệu nào là Read mà chỉ là Real(mã lỗi: 21)
Câu thông báo trên màn hình được đặt trong dấu ‘’(mã lỗi :8)
x2:=(-b- dela)/2a; sai phải sửa lại là x1:= (-b-sqrt(delta))/2*a;
Các kết quả được viết cách nhau bàng dấu “,”(mã lỗi :26)
Writeln(‘phuong trinh co nghiem kep,’ –b/2a); saiSửa lại là: Writeln(‘phuong trinh co nghiem kep’, –b/2*a);Writeln(‘phương trinh co 2 nghiem,’x1,x2);
Sửa lại là: Writeln(‘phương trinh co 2 nghiem ’,x1,x2);
Trước lệnh Else không có dấu “;”(mã lỗi: 113)
Trong câu lệnh:
If delta>0 then
x1:= (-b+ dela)/2a;
x2:=(-b- dela)/2a;
Writeln(‘phương trinh co 2 nghiem,’x1,x2);
Có nhiều hơn 2 lệnh nên phải sử dụng câu lệnh ghép: Begin End;
Trang 10Bước 5: Mỗi học sinh tiến hành gõ trực tiếp trên máy tính, sau khi gõ chương trìnhxong học sinh biên dịch sửa lỗi và thực hiện chương trình Căn cứ vào mã lỗi đượcthông báo để sữa lỗi.
Trang 11Writeln(‘Phuong trinh vo nghiem’);
End;
ReadlnEnd
Giáo viên chốt lại thường gặp là:
Error 21: Error in type Lỗi kiểu
Error 26: Type mismatch Sai kiểu
Error 40: Boolean expression expected Phải là thể biện của biến logic
Error 50: DO expected Thiếu DO
Error 57: THEN expected Thiếu từ khoá THEN
Error 58: TO or DOWNTO expected Phải là từ khoá TO hoặc DOWNTOError 97: Invalid FOR control variable Biến điều khiển FOR không hợp lệError 98: Integer variable expected Phải là một biến số nguyên
Error 129: ENDIF directive missing Thiếu chỉ dẫn END IF
c Những lỗi sai cơ bản trong kiểu dữ liệu có cấu trúc
- Đố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ố hoàn toàn xác định
+ Độ rộng tối đa của xâu là xác định, nhỏ hơn 255
+ Hằng xâu được đặt trong cặp dấu “ ‘ ….’ ”
Ví dụ: Cho dãy A gồm 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: Giáo viên chiếu chương trình viết sẵn
- Bước 2: Yêu cầu học sinh thảo luận theo nhóm và tìm ra lỗi sai, nhóm nào nhanhnhất, đúng nhất gọi lên trình bày và cho điểm cộng ở cột điểm miệng
Trang 12- Bước 3: Đại diện nhóm lên trình bày kết quả, cử nhóm nhanh nhất có thể chođiểm cộng ở điểm miệng để khuyến khích tinh thần tìm tòi, tự học của học sinh.
- Bước 4: Yêu cầu các nhóm còn lại nhận xét sau đó giáo viên hoàn chỉnh bài
Khai báo hằng sai: const nmax:=50; phải sửa lại là const
cơ bản và biết cách sửa lỗi như thế nào
Program Vidu;
Uses crt;
Const nmax=50;
Var
Trang 13d Những lỗi sai cơ bản trong tệp và thao tác với tệp, chương trình con
- Đối với trường hợp này học sinh hay mắc phải các lỗi:
+ Không khai báo biến tệp
+ Không mở tệp để đọc hay ghi nhưng vẫn thao tác đọc ghi tệp
+ Đường dẫn tới tệp không đúng hoặc chưa có
+ Mở quá nhiều tệp
+ Không gán tên cho tệp
+ Chưa nắm được cách thức thức lấy giá trị vào từ input và xuất kết quả ra output
+ Mở tệp nhưng không đóng tệp lại
+ Không phân biệt được hàm và thủ tục
+ Viết sai từ khoá hàm và thủ tục
+ Trong hàm không có lệnh trả về giá trị cho hàm
Trang 14+ Gán giá trị của biến cho thủ tục.
+ Quên khai báo kiểu dữ liệu cho tên hàm.,…
Ví dụ 1: Cho tệp SN.INP chứa:
Hàng 1: n
Hàng 2 chứa dãy a1,…,an
Cho chương trình đưa ra các số nguyên tố Kết quả lưu vào tệp SN.OUT
10
7 3 9 6 5 14 16 15 11 13
3 7 5 11 13
- Bước 1 Chia lớp thành 4 nhóm Nhiệm vụ của mỗi nhóm là giải quyết bài toán
- Bước 2 Giáo viên thu kết quả của các nhóm Soạn thảo và chiếu kết quả của mộtnhóm bất kì cho cả lớp cùng quan sát Đây là chương trình của nhóm đó:
- Bước 3 Yêu cầu các nhóm còn lại phát hiện lỗi sai Sau đó giáo viên hoàn chỉnh.Đại diện nhóm lên trình bày trước lớp tìm và sửa lỗi tìm được các lỗi sau:
Khai báo hàm Function NT(M:Byte); sai sửa lại là
Function NT(M:Byte): Boolean;
Kết thúc chương trình con là End; không phải là End
Kết thúc chương trình phải đóng tệp lại
- Bước 4: Mỗi học sinh tiến hành gõ trực tiếp trên máy tính, sau khi gõ chươngtrình xong học sinh biên dịch sửa lỗi và thực hiện chương trình Căn cứ vào mã lỗiđược thông báo để sữa lỗi
Var S: Word;
Trang 15S:=0;
NT:=false;
For i:=1 to M div2 do
If M mod i = 0 Then S:=S+I;
If S=0 then NT:= TrueElse
Error 3: Path not found Không tìm thấy đường dẫn
Error 4: Too many open files Mở quá nhiều file
Error 5: File access denied Không truy nhập được file
Error 6: Invalid file handle Số hiệu file không hợp lệ
Error 102: File not assigned File chưa được chỉ định
Error 103: File not open File chưa được mở
Error 13: Too many open files Quá nhiều file được mở
Error 14: Invalid file name Tên file không hợp lệ
Error 15: File not found Không tìm thấy file
Error 16: Disk full Đĩa đầy
Error 18: Too many files Quá nhiều file
Trang 16Error 34: Invalid function result type Kiểu trả về của hàm không hợp lệ
Error 59: Undefined forward Biến hay hàm chưa được định nghĩa trước đóError 60: Too many procedures Quá nhiều chương trình con
Error 63: Invalid file type Kiểu file không hợp lệ
Error 77: File variable expected Phải là biến file
Error 122: Invalid variable reference Tham chiếu biến không hợp lệ
Error 136: Invalid indirect reference Tham chiếu gián tiếp không hợp lệError 142: Procedure or function variable expected Phải là biến chương trình con
Error 143: Invalid procedure or function reference Tham chiếu chương trình con không hợp lệ
Chương trình trên được viết lại đúng là:
For i:=1 to M div2 do
If M mod i = 0 Then S:=S+I;
If S=0 then NT:= TrueElse
NT:=False;
End;
Begin
Clrscr;
Trang 18tuso := tuso div a ;
mauso := mauso div a ;
end ;
writeln(tuso :5, mauso :5) ;
readln;
end
- Bước 2 Chia lớp thành 4 nhóm Yêu cầu các nhóm tìm lỗi sai
- 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áclỗ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à :
+ Từ khóa Funtion sai (mã lỗi : 86) , đúng là : Function
Chưa khai báo kiểu dữ liệu cho tên hàm UCLN (mã lỗi : 86), sửa lại là:
Function
UCLN(x,y :integer) : integer ;
+ Câu lệnh UCLN: = x; sai (mã lỗi: 88) Trình biên dịch thông báo câu lệnh nàythiếu dấu “(” nhưng bản chất câu lệnh này sai vì đặt sai vị trí Câu lệnh gán giá trị cho tên hàm phải nằm trong chương trình con Cụ thể nó phải nằm ở ngay trên câu lênh end; kết thúc chương trình con
- 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
2 Lỗi ngữ nghĩa
- Các lỗi cú pháp thì được chương trình dịch phát hiện và thông báo chongười lập trình biết còn các lỗi về mặt ngữ nghĩa thì rất khó phát hiện chỉ đượcphát hiện khi thực hiện một chương trình cụ thể Qua các tiết dạy khi học sinh viếtchương trình tôi đã phát hiện ra một số lỗi nghữ nghĩa mà học sinh thường gặpphải như sau:
+ Khai báo đúng nhưng tốn nhiều bộ nhớ và không sát với yêu cầu của bàitoán
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ố đó.
Học sinh viết khai báo như sau: