Cho chương trình sai và yêu cầu sửa lại cho đúng

Sáng kiến kinh nghiệm trong dạy học tin học 11
A. MỞ ĐẦU
I. Lý do chọn đề tài:
Tin học là một môn học mới và tương đối khó đối với học sinh THPT trong đó
môn lập trình Pascal trong chương trình lớp 11 lại càng khó. Để 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 hay viết chương trình trên giấy 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.
Trong quá trình giảng dạy và hướng dẫn học sinh viết chương trình hầu giáo
viên thường để học sinh tự tìm và sữa chữa lỗi sai. Các lỗi sai được SGK Tin học
11 đưa ra tuy nhiên nếu làm theo cách mà các giáo viên thường dùng sẻ tạo cho
học sinh tính thụ động. Chỉ khi nào lên thực hành trên máy tính thì học sinh mới
tìm ra lỗi sai và sữa. Hiện nay các trường THPT trên địa bàn Nghệ An trường nào
có điều kiện thì củng chỉ xây dựng được 3 phòng máy để học sinh thực hành như
vậy học sinh sẻ không được thực hành viết chương trình trên máy tính thường
xuyên dẫn đến các lỗi sai cơ bản học sinh vẫn mắc phải. Để 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ửa khi viết chương trình tôi dã
mạnh dạn áp dụng phương pháp “ Giúp học sinh tự tìm và sử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”.
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 1
Sáng kiến kinh nghiệm trong dạy học tin học 11
II. Mục đích nghiên cứu:
- Việc 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 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, 11G năm học 2010 – 2011
- 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
V. Điểm mới trong kết quả nghiên cứu:
- Tỷ lệ học sinh viết chương trình hoàn chỉnh nhiều hơn, chất lượng tốt hơn
- Các em hiểu được tính chặt chẻ khi viết chương trình bằng ngôn nghữ
Pascal.

Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 2
Sáng kiến kinh nghiệm trong dạy học tin học 11
B. NỘI DUNG
I. Cơ sở lý luận:
1. Thuận lợi:
- Trước yêu cầu ngày càng cao của việc dạy và học Tin học của giáo viên và
học sinh Trường THPT Phan Thúc Trực đã trang bị 1 phòng máy chiếu và 1 phòng
thực hành để học sinh học tốt hơn
- Đội ngũ giáo viên dạy môn Tin học còn trẻ, nhiệt tình, năng động luôn tìm
tòi những phương pháp giảng dạy tốt nhất để mang lại cho học sinh những tiết học
thú vị và bổ ích.
2. Khó khăn
- Học sinh của trường THPT Phan Thúc Trực đa phần là con em nhà nông
nên hoàn cảnh kinh tế còn khó khăn. Việc tiếp xúc với máy tình còn khá xa lạ nên
các thao tác khi các em thực hành trên máy tính còn chậm.
- Lập trình bằng ngôn ngữ lập trình Pascal là môn học yêu cầu học sinh phải
tư duy lôgic cao, tính chặt chẻ nên rất khó cho học sinh ở vùng nông thôn.
II. Cơ sở thực tiển
- Khi viết chương trình học sinh thường mắc các lỗi sau:
+ 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 về cấu trúc của ngôn ngữ lập trình như: thiếu dấu, sai câu lệnh, đặt tên
biến, tên chương trình sai,… Đối với lỗi này khi thực hiện chương trình ta ấn tổ
hợp phím Alt + F9 là chương trình dịch báo lỗi và căn cứ vào bảng mã lỗi trong
sách giáo khoa là ta có thể sữa được.

+ Lỗi Ngữ nghĩa: Là khi chương trình không còn xảy ra lỗi cú pháp. Nhưng
khi thực hiện chương trình thi kết quả không đúng hoặc không giới hạn hết các
trường hợp xẩy ra theo yêu cầu của bài toán
- 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ở. 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.
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 3
Sáng kiến kinh nghiệm trong dạy học tin học 11
* Dự báo
Nếu Giáo viê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 học sinh
vẫn chưa viết được một chương trình hoàn chỉnh.
III. Các biện pháp đã tiến hành:
Trong quá trình giảng dạy tôi dùng cả hai phương pháp dạy học là dạy bảng
và dạy tại phòng thực 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ản như:
+ 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á nhiều biến.
+ Đặ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.
+ Giữa các biến đực viết cách nhay 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.
….
- Để tránh những lỗi sai cho học sinh khi viết chương trình tôi dùng phương pháp
sau:
Ví dụ 1:
Đề bài: Viết chương trình in ra màn hình dòng chữ: “Lop 11A1 truong
THPT Phan Thuc truc”
- Chương trình sau Giáo viên chiếu lên bảng:
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 4
Sáng kiến kinh nghiệm trong dạy học tin học 11
Progam vi du1;
Uses crt
Begin;
Clrscr;
Writeln( lop 11A1 truong THPT Phan Thuc Truc’);
Realn
End;
- Nếu dạy trên bục giảng:
+ Chia lớp học thành các nhóm(mỗi bàn học sinh ngồi là một nhóm) để thảo

luận
+ Đưa ví dụ lên bảng yêu cầu học sinh viết chương trình. Khi học sinh viết
xong yêu cầu các nhóm kiểm tra và sữa các lỗi của nhóm vừa lên bảng thực hiện.
+ Giáo viên đưa chương trình viết lên bảng qua bảng phụ, chương trình này
nên viết sai các lỗi cú pháp, sau đó yêu cầu các nhóm thảo luận và sữa chữa rồi cho
điểm nhóm nào sữa chữa đúng nhất để tạo hứng thú cho học sinh trong quá trình
học.
+ Giáo viên đưa chương trình đúng lên bảng để các nhóm xem và ghi bài.
- Giáo viên Yêu cầu học sinh thảo luận theo nhóm tìm ra lỗi trong chương
trình trên
Các lỗi sai trong chương trình trên là:
• 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 đặt theo
quy tắc đặt tên của ngôn ngữ lập trình nên không được chứa dấu
cá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ương trình)
(mã lỗi: 94).
Qua ví dụ trên học sinh sẻ không mắc vào các lỗi cơ bản đã nêu và biết cách sửa
lại chương trình trên lại cho đúng là:
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 5
Sáng kiến kinh nghiệm trong dạy học tin học 11
Program vidu1;
Uses crt;
Begin
Clrscr;
Writeln(‘ lop 11A1 truong THPT Phan Thuc Truc’);
Readln

End.
- Nếu dạy trên phòng máy:
+ Giáo viên chép bài tập 1,2 lên bảng, yêu cầu học sinh thực hiện 2 bài tập
đó trên máy.
+ Sau khi học sinh thực hiện xong ấn phím F9 để kiểm tra lỗi, căn cứ vào mã
lỗi báo dưới dạng: Error mã lỗi: Lỗi mắc phải đối chiếu vào bảng lỗi ở
trang 136,137,138 SGK để sửa.
+ Các lỗi hay mắc phải trong trường hợp này là:
Error 21: Duplicate identifier Trùng tên
Error 21: Error in type Lỗi kiểu
Error 26: Type mismatch Sai kiểu
Error 36: BEGIN expected Phải là BEGIN
Error 37: END expected Phải là END
Error 85: ";" expected Phải là dấu ";"
Error 86: ":" expected Phải là dấu ":"
Error 87” "," expected Phải là dấu ","
Error 88: "(" expected Phải là dấu "("
Error 89: ")" expected Phải là dấu ")"
Error 90: "=" expected Phải là dấu "="
Error 91: ":=" expected Phải là dấu ":="
Error 92: "[" or "(." Expected Phải là dấu "[" hoặc "(."
Error 93: "]" or ".)" expected Phải là dấu "]" hoặc ".)"
Error 94: "." expected Phải là dấu "."
Error 113: Error in statement Lỗi trong câu lệ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).

Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 6
Sáng kiến kinh nghiệm trong dạy học tin học 11
+ Trước từ khoá Else không có dấu “;”.
+ Giá trị đầu luôn luôn mhỏ 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 Whlie … do là một biểu thức Logic.
+ Phải khai báo biến đếm trong chương trình.
Ví dụ 2:
Đề bài: Viết chương trình giải và biện luận số nghiệm của phương trình
ax
2
+ bx + c =0 (a#0).
- Nếu dạy trên bục giảng:
- Giáo viên yêu cầu học sinh thảo luận theo nhóm và sau đó gọi một nhóm lên
thực hiện. đây là chương trình mà một nhóm viết lên bảng:
Program vidu2;
Uses crt;
Var
a,b,c: real;
delta,x1,x2:read;
Begin
Clrscr;
Write(‘ nhap a,b,c); readln(a,b,c);
Delta:=b
2
-4ac;
If delta=0 then
Writeln(‘phuong trinh co nghiem kep,’ –b/2a);
Else

If delta>0 then
x1:= (-b+
dela
)/2a;
x2:=(-b-
dela
)/2a;
Writeln(‘phương trinh co 2 nghiem,’x1,x2);
If delta<0 then
Writeln(‘Phuong trinh vo nghiem’);
Readln
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 7
Sáng kiến kinh nghiệm trong dạy học tin học 11
End.
- Sau khi nhóm trên viết xong giáo viên yêu cầu các nhóm còn lại phát hiện lỗi
sai và sửa chương trình trên cho đúng.
Các lỗi sai trong chương trình trên là:
• 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).
Cụ thể:
Write(‘ nhap a,b,c); sửa lại là Write(‘ nhap a,b,c’);
• Biểu thức toán học
Delta:=b
2
-4ac; sai phải viết lại là: Delta:=b*b-4*a*c; (mã lỗi :26).
b/2a sai phải sửa lại là b/2*a
x1:= (-b+
dela
)/2a; sai phải sửa lại là x1:= (-b+sqrt(delta))/2*a;
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); sai
Sử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 được đặt trong cụm từ khóa Begin
End;
Else
If delta>0 then
x1:= (-b+
dela
)/2a;
x2:=(-b-
dela
)/2a;
Writeln(‘phương trinh co 2 nghiem,’x1,x2);
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 8
Sáng kiến kinh nghiệm trong dạy học tin học 11

If delta<0 then
Writeln(‘Phuong trinh vo nghiem’);
Có nhiều hơn 2 lệnh nên phải được đặt trong cụm từ khóa Begin End;
- Giáo viên chỉnh sửa lại chương trình trên thành chương trình hoàn chỉnh là:
Program vidu2;
Uses crt;
Var
a,b,c: real;
delta,x1,x2:real;
Begin
Clrscr;
Write(‘ nhap a,b,c’); readln(a,b,c);
Delta:=b*b-4*a*c;
If delta=0 then
Writeln(‘phuong trinh co nghiem kep’, –b/2*a)
Else
Begin
If delta>0 then
Begin
x1:= (-b+Sqrt(delta))/2*a;
x2:=(-b-sqrt(delta))/2*a;
Writeln(‘phương trinh co 2 nghiem’,x1,x2);
End;
If delta<0 then
Writeln(‘Phuong trinh vo nghiem’);
End;
Readln
End.
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 9
Sáng kiến kinh nghiệm trong dạy học tin học 11

- Nếu dạy trên phòng phực hành:
Sau khi gõ chương trình xong học sinh 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.
Các lỗi thường gặp là:
Error 8: String constant exceeds line Hằng xâu vượt quá một dòng
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 DOWNTO
Error 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 trongKiể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ụ 3:
Đề 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ố đó.
- Nếu dạy trên bục giảng:
Giáo viên đưa chương trình đã chuản bị lên bảng phụ sau khi các nhóm đã thảo
luận và yêu cầu học sinh thực hiện chỉnh sửa lại chương trình cho đúng.
Chương trình:

Program Vidu3;
Uses crt;
Const nmax:=50;
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 10
Sáng kiến kinh nghiệm trong dạy học tin học 11
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]Begin
Min:=A[i];
Csmin:=I;
End;
Writeln(‘ gia tri nho nhat la:’,min:3,’Tai vi tri:’,csmin:2);
Readln
End.
- Đối với bài toán này học sinh dễ dàng phát hiện ra các lỗi sau:
• 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,’]:’);
Chương trình được sửa lại là:
Program Vidu3;
Uses crt;
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 11
Sáng kiến kinh nghiệm trong dạy học tin học 11
Const nmax=50;
Var
A:Array[1 nmax] 0f Word;
N,I,csmin:byte;
Min: Word;
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]Begin
Min:=A[i];
Csmin:=i;
End;
Writeln(‘ gia tri nho nhat la:’,min:3,’Tai vi tri:’,csmin:2);
Readln
End.


Với phương pháp dạy giáo viên vừa kết hợp bài giảng vừa kết hợp cả thao tác kiểm
tra lỗi và học sinh tự nhận biết lỗi khi viết chương trình. Sau mỗi tiết học học sinh
sẻ biết được những lỗi mà mình mắc phải khi viết chương trình để rút kinh nghiệm
cho lần sau.
- Nếu dạy trên phòng máy:
Sau khi gõ chương trình xong học sinh 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.
Các lỗi thường gặp là:
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 12
Sáng kiến kinh nghiệm trong dạy học tin học 11
Error 22: Structure too large Cấu trúc quá lớn
Error 23: Set base type out of range Kiểu cơ bản bị tràn
Error 25: Invalid string length Độ dài xâu không hợp lệ
Error 66: String variable expected Phải là biến xâu
Error 74: Constant and case types don't match Hằng và các kiểu không hợp
Error 75: Record variable expected Phải là biến record
Error 92: "[" or "(." Expected Phải là dấu "[" hoặc "(."
Error 93: "]" or ".)" expected Phải là dấu "]" hoặc ".)"
Error 100: String length mismatch Độ dài xâu không hợp
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:
- Đố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.
+ 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.
+ Gán giá trị của biến cho thủ tục.

Ví dụ 4:
Cho tệp SN.INP chứa:
Hàng 1: n
Hàng 2 chứa dãy a1,…,an
Viết chương trình đưa ra các số nguyên tố. Kết quả lưu vào tệp SN.OUT
SN.INP SN.OUT
10
7 3 9 6 5 14 16 15 11 13
3 7 5 11 13
-
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 13
Sáng kiến kinh nghiệm trong dạy học tin học 11
- Nếu dạy trên bục giảng:
Giáo viên yêu cầu học sinh thảo luận theo nhóm làm bài tập trên. Sau đó gọi một
nhóm lên bảng thực hiện.
Chương trình mà nhóm đó thực hiện như sau:
Program Vidu4;
Uses crt;
Const INP=’SN.INP’;
OUT=’SN.OUT’;
Var
A: Array[1 100 ] of Byte;
n,i: Byte;
f1,f2:text;
Function NT(M:byte);
Var S: Word;
Begin

S:=0;
NT:=false;
For i:=1 to M div2 do
If M mod i = 0 Then S:=S+I;
If S=0 then NT:= True
Else
NT:=False;
End.
Begin
Clrscr;
Assign(f1,INP); Reset(f1);
Assign(f2,OUT); Rewrite(f2);
Readln(f1,n);
For i:= 1 to n do
Begin
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 14
Sáng kiến kinh nghiệm trong dạy học tin học 11
Read(f2,A[i]);
If NT(A[i]) then Write(f2,A[i] );
End;
End.
- Sau khi học sinh viết xong chương trình lên bảng Giáo viên yêu cầu các nhóm
kiểm tra và sửa lại chương trình trên. Các lỗi sai là:
• 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.
Chương trình trên được viết lại đúng là:
Program Vidu4;
Uses crt;

Const INP=’SN.INP’;
OUT=’SN.OUT’;
Var
A: Array[1 100 ] of Byte;
n,i: Byte;
f1,f2:text;
Function NT(M:byte): Boolean;
Var S: Word;
Begin
S:=0;
NT:=false;
For i:=1 to M div2 do
If M mod i = 0 Then S:=S+I;
If S=0 then NT:= True
Else
NT:=False;
End;
Begin
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 15
Sáng kiến kinh nghiệm trong dạy học tin học 11
Clrscr;
Assign(f1,INP); Reset(f1);
Assign(f2,OUT); Rewrite(f2);
Readln(f1,n);
For i:= 1 to n do
Begin
Read(f2,A[i]);
If NT(A[i]) then Write(f2,A[i] );
End;
Close(f1); Close(f2);

End.
- Nếu dạy trên phòng máy:
Sau khi gõ chương trình xong học sinh 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.
Các lỗi thường gặp là:
Error 2: File not found Không tìm thấy file
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
Error 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
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 16
Sáng kiến kinh nghiệm trong dạy học tin học 11
Error 143: Invalid procedure or function reference Tham chiếu chương trình
con không hợp lệ

2. Lỗi ngữ nghĩa:
- Trong quá trình dạy học sinh viết chươ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ặp phải như sau:
+ Khai báo kiểu dữ liệu không chuẩn( 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ài toán).
Ví dụ:
Đề 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:
Const nmax=50;
Var
A:Array[1 nmax] 0f Integer;
N,i,min,csmin:integer;
• Bài toán cho ta là dãy số nguyên dương nhưng học sinh khai báo là
Integer có nghĩa là khi nhập giá trị cho phần tử mảng vẫn thõa mãn
điều này sai với yêu cầu của bài toán.
• N,i, csmin <=nmax nên ta khai báo kiểu dữ liệu là Byte.
Sửa lại là:
Const nmax=50;
Var
A:Array[1 nmax] 0f word;
N,i,csmin:byte;
Min: word;
Vậy để khai báo biến cho đúng với yêu cầu của bài toán thì yêu cầu học sinh phải
nắm được các kiểu dữ liệu chuẩn, phạm vi giá trị, bộ nhớ, để áp dụng vào từng bài
toán cho hợp lý.
Bảng các kiểu dữ liệu chuẩn:
TT Kiểu Tên kiẻu Phạm vi giá trị Bộ nhớ
1 Kiểu thực
Real 2.9*10

-39
1.7*10
38
6 Byte
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 17
Sáng kiến kinh nghiệm trong dạy học tin học 11
Extended 1.9*10
-4951
1.1*10
4932
10 Byte
2 Kiểu nguyên
Byte 0 255 1 Byte
Word 0 65535 2 Byte
Integer -32768 32767 2 Byte
Logint -2147483648 2147483647 4 Byte
3 Kiểu ký tự Char 255ký tự trong bảng mã
ASCII
1 Byte
4 Kiểu Logic Boolean True hoặc False 1 Byte
+ Học sinh không biết sử dụng câu lệnh ghép. Nếu số lệnh lớn hơn hoặc
bằng 2 trong một câu lệnh thì phải dùng câu lệnh ghép.
+ Học sinh không phân biệt được trong trường hợp nào thì dùng lặp For
Do trường hợp nào dùng câu lệnh While … Do
Nều trong bài toán xác định được số lần lặp thì dùng For … Do.
Nêud trong bài toán mà số lần lặp phải dựa vào điều kiện thì dùng
While … Do. Khuyến khích học sinh dùng câu lệnh While … do .
+ Học sinh không phân biệt được hàm và thủ tục khác nhau như thế nào,
cách sử dụng ra sao.
Ví dụ:

Yêu cầu In ra xâu st sau khi đã xoá 3 ký tự tại vị trí số 5 của xâu st.
Học sinh viết:
ST1:= delete(st,5,3);
….
Đối với trường hợp này giáo viên nhắc lại các chú ý sau:
• Hàm Trả về giá trị qua tên của nó. Thủ tục không trả về giá trị.
• Trong quá trình viết chương trình con phải có một lệnh trả về giá trị
cho hàm qua tên của nó.
• Để học sinh hiểu rỏ hơn giáo viên dùng bảng các hàm và thủ tục xử
lý trong xâu giải thích cho học sinh.
+ Học sinh không phân biệt được tham biến và tham trị, biến toàn cục và
biến cục bộ trong chương trình con.
• Nếu một CTC có danh sách tham số thì các tham số phải được khai
báo ở phần đầu sau tên CTC, trong cặp dấu ngoặc tròn. Khai báo một
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 18
Sáng kiến kinh nghiệm trong dạy học tin học 11
tham số có nghĩa là chỉ ra nó thuộc loại tham số nào ( tham số biến
hay tham số trị ) và nó có kiểu dữ liệu là gì?
Ví dụ: Procedure Delta(Var x: integer ; y: real);
Function Beta( a, b: real): real;
Danh sách tham số là x, y, a, b. Với x có kiểu dữ liệu Integer y, a, b, có kiểu số
thực. Vậy trong danh sách tham số x, y, a, b đâu là tham biến, đâu là tham trị?
Bằng trực quan ta dễ dàng nhận thấy x là tham biến vì x có từ khoá Var đứng
trước; y, a, b là tham trị vì không có từ khoá Var đứng trước. Để thấy rõ hơn về
bản chất sự khác nhau giữa tham biến và tham trị ta xét ví dụ sau:
Ví dụ1:
Progam Vidu1;
Procedure Tong_hieu(a, b: Integer; Var c, d: Integer );
Begin
c:= a – b ;

d:= a + b ;
a:= a*b ;
End;
Begin clrscr;
a:= 10; b:= 3; c:= 5; d:= 6;
Tong_hieu(a,b,c,d);
Write(a,b,c,d);
Readln;
End.
Mới nhìn vào chương trình nhiều học sinh có thể chủ quan đưa ra các giá trị 30,
3, 7, 13 tương ứng với các tham số a, b, c, d. Nhưng kết qủa nhận được sau khi
chạy chương trình lại là 10, 3, 7, 13 tương ứng với các tham số a, b, c, d. Vậy tại
sao lại có kết quả này?
Thật vậy, do a, b được truyền theo trị nên khi có lời gọi Tong_hieu(a,b,c,d) thì
giá trị của a, b vẫn được giữ nguyên như ban đầu a = 10, b = 3 còn c, d được
truyền theo biến nên khi có lời gọi Tong_hieu(a,b,c,d) thì các giá trị của c, d thay
đổi c = 7, d = 13
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 19
Sáng kiến kinh nghiệm trong dạy học tin học 11
Giáo viên Qua ví dụ1, sau khi chạy chương trình thì tham biến có kết quả thay
đổi còn tham trị kết quả không thay đổi, đó chính là sự khác nhau cơ bản giữa
tham biến và tham trị, ta xét ví dụ sau.
Ví dụ 2:
Program VD2;
Var x,y: Integer ;
Procedure Thamso(Var Z: Integer ; W: Integer);
Begin
Z:= 1; W:=1;
End;
Begin {chuong trinh chinh}

x:= 0; y:= 0;
Writeln(x:5,y:5);
Thamso(x,y);
Writeln(x:5,y:5);
Readln;
End.
Kết quả nào sẽ xuất hiện trên màn hình khi chương trình được thực hiện:
0 0 0 0 0 0 0 0
1 0 1 1 0 1 0 0
Bước vào thân chương trình chính ban đầu x và y đều có giá trị là 0 (do các
lệnh x:= 0, y:= 0). Khi gọi thủ tục Thamso(x,y), tham số biến được thay bởi biến x.
Điêù này có nghĩa là mọi thao tác đối với z trong thủ tục sẽ xẩy ra đối với x; cụ thể
là lệnh gán z:= 1 bây giờ sẽ là x:= 1, tức gán giá trị 1 cho biến x. Còn khi gọi thủ
tục Thamso(x,y) tham số w được thay bởi biến y; giá trị của biến y được sao chép
sang cho biến w. Tức là w có giá trị 0. Khi bước vào thân thủ tục không có một
liên quan nào nữa giữa biến y với w, vì vậy lệnh gán w:= 1 không ảnh hưởng gì
đến giá trị của y. Như vậy, giá trị của x được in ra là 1, còn y là 0.
Với thủ tục Procedure Thamso(Var z: Integer ; w: Integer ) thì các lời gọi sau
đây có hợp lý không? Thamso(x + 1, y) hay Thamso(2, y). Khi thay lời gọi
Thamso(x,y) bằng 2 lời gọi trên thì máy sẽ báo lỗi. Bởi trong lời gọi CTC các tham
số biến chỉ được phép thay bởi các biến cùng kiểu, không được là hằng(2) hay biểu
thức(x+1), còn các tham số giá trị được phép thay thế bởi hằng, biểu thức hoặc
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 20
Sáng kiến kinh nghiệm trong dạy học tin học 11
biến đơn. Sự thay thế phải theo đúng trật tự các tham số đã khai báo trong đầu của
CTC. Ngoài lời gọi Thamso(x,y) thì các lời gọi Thamso(x,y+1); Thamso(x,3); đều
không hợp lý. Đây chính là một sự khác nhau nữa giữa tham biến và tham trị.
Khi đã nhận biết được sự khác nhau giữa tham biến và tham trị thì một CTC có
tham số lúc nào cần đến tham biến, lúc nào cần đến tham trị?
Ví dụ 3:

Program VD3;
Var x,y: Integer;
Procedure Hoandoi(x,y:Integer);
Var t:Integer;
Begin
t:= x; x:= y; y:= t;
End;
Begin
x:=1; y:= 2;
Hoandoi(x,y);
Writeln(‘Hai so chua hoandoi:’,x:2,y:2);
Write('x=',x:2,' y=',y:2);
Readln;
End.
Thủ tục Hoandoi(x,y) trong ví dụ này dùng để đổi giá trị giữa 2 biến nguyên x
và y. Tuy nhiên khi chạy chương trình, điều này không xẩy ra. Giá trị của 2 biến
nguyên x và y trước khi gọi thủ tục x có giá trị bằng 1, y có giá trị bằng 2 và sau
khi gọi thủ tục Hoandoi(x,y) giá trị của x, y có giá trị vẫn không đổi: x=1, y=2.
Vậy lỗi xẩy ra do thủ tục Hoandoi(x,y) tổ chức truyền theo trị nên các giá trị
của các biến x và y không bị ảnh hưởng bởi các lệnh đổi giá trị trong thủ tục này.
Nếu sữa lại việc khai báo các tham số trong thủ tục tráo đổi là truyền theo biến
(thêm từ khoá Var trước x, y trong phần đầu của thủ tục) thì chương trình sẽ cho
kết quả như mong muốn: x=2, y=1.
Ví dụ 4:
Program VD4;
Var tu,mau,d:word;
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 21
Sáng kiến kinh nghiệm trong dạy học tin học 11
Function UCLN(Var a,b:Word):Word;
Begin

While a<>b Do
If a>b Then a:= a-b
Else b:= b-a;
UCLN:= a;
End;
Begin
Write('nhap tu so:'); Readln(tu);
Write('nhap mau so:'); Readln(Mau);
d:= UCLN(tu,mau); writeln('d =:',d);
If d>1 Then
Begin
Tu:= tu Div d;
mau:= mau Div d;
End;
Writeln('phan so duoc toi gian la:',tu,'/',mau);
Readln;
End.
Chương trình trên sử dụng hàm UCLN(a, b) để tối giản một phân số khi nhập
từ bàn phím các giá trị tử số và mẩu số của nó.
Nhìn vào chương trình ta không phải bàn đến tính đúng đắn của công thức. Vì
ta thấy chương trình trên trả về UCLN của hai số nguyên dương a và b và dùng
hàm này để tính d là UCLN của tử và mẫu. Phân số tối giản nhận được bằng cách
cùng chia tử và mẫu cho d. Tuy nhiên khi chạy chương trình, ta luôn nhận được kết
quả không mong muốn là 1/1 cho mọi phân số. Vậy lỗi do đâu?
Lỗi logic này xẩy ra do hàm UCLN được tổ chức truyền theo tham biến, nên
sau lời gọi d:= UCLN(tu,mau) , ta được đồng thời các giá trị d, tu, mau bằng nhau
và bằng d. Để chương trình cho kết quả đúng ta phải sửa lại việc khai báo các tham
số trong hàm UCLN là truyền theo tham trị ( bỏ từ khoá Var trước a, b).
Việc tổ chức truyền theo trị hay truyền theo biến cho một tham số là không thể tuỳ
tiện vì nó có thể dẫn đến những kết quả sai với yêu cầu của bài toán. Qua hai ví dụ

Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 22
Sáng kiến kinh nghiệm trong dạy học tin học 11
trên đã minh hoạ các tình huống có thể xảy ra. Ví dụ 3 cho một kết quả sai khi
truyền theo trị trong khi nếu sửa lại việc khai báo các tham số trong thủ tục
Hoandoi là truyền theo tham biến thì chương trình sẽ cho kết quả đúng với yêu
cầu của bài toán. Còn ở ví dụ 4 cho thấy một kết quả sai khi truyền theo tham biến.
Ví dụ 5:
Program VD5;
Var a: Byte;
Function F(Var x:Byte):Byte;
Begin
x:=x+1; F:=x;
End;
Begin
a:=5; Writeln(F(a)+F(a));
Readln;
End.
Chương trình đơn giản trên đưa ra màn hình giá trị F(a)+F(a) với a = 5. Bằng
suy luận thông thường, kết quả đúng phải là 12 vì tại a = 5, F (a) cho giá trị 6. Tuy
nhiên khi chạy chương trình ta sẽ nhận được kết quả 13. Có thể sửa biểu thức F(a)
+F(a) thành biểu thức 2*F(a) lúc này ta sẽ nhận được kết quả là 12. Chương trình
vẫn thực hiện đúng những lệnh mà ta viết, chỉ có điều ở đây xuất hiện hiệu ứng
phụ do hàm F được tổ chức truyền theo biến đối với tham biến x của nó. Lệnh x:=
x + 1 trong hàm F sẽ làm biến a tăng lên một đơn vị mỗi khi gọi F(a) khi thực hịên
biểu thức F(a)+F(a), giá trị F(a) được gọi hai lần. Tại lần thứ nhất a = 5, do đó F(a)
= 6 , tại lần gọi thứ hai lúc đó a = 6 do đó F(a) = 7 và ta nhận được kết quả 13.
Trong khi đó biểu thức 2*F(a) chỉ gọi giá trị F(a) một lần vì thế mà ta nhận được
kết quả là 12. Nếu sửa lại việc truyền cho tham biến x của hàm F là theo trị thì
không còn sự khác nhau như vậy nữa.
Như vậy, khi truyền một tham số cho CTC, nếu ta muốn bảo vệ giá trị của tham số

đó khỏi bị CTC “ vô tình phá” thì tham số đó phải được dùng như là tham trị. Khi
đó cho phép giá trị đầu vào tương ứng có thể là hằng, biểu thức hoặc biến nguyên.
Còn một tham số nếu muốn dùng để lấy kết quả (những biến đổi) do chương trình
con đem lại thì tham số đó phải là tham biến và giá trị đầu vào tương ứng chỉ có
thể là biến.
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 23
Sáng kiến kinh nghiệm trong dạy học tin học 11
• Biến cục bộ là biến được khai báo ở chương trình con, chỉ có tác dụng
khi có lệnh gọi chương trình con đó. Biến toàn cục là biến được khai
báo ở chương trình chính, có tác dụng trong cả chương trình con lẫn
chương trình chính.
+ Đặc biệt khi lập trình học sinh hay mắc phải lỗi Error 200
Lỗi này xậy ra khi:
+ Học sinh thực hiện phép chia với 0
+ Pascal mà học sinh dùng không có thư viện Crt Graph.TPU,
Cách khắc phục:
+ Học sinh không được thực hiện phép chia nào với 0
+ Xoá lệnh Uses Crt và clrscr;
IV: Kết quả đạt được.
Sau khi áp dụng phương pháp trên vào bài giảng tôi thất chất lượng giờ học được
nâng lên rỏ rệt. Học sinh tự tìm ra lỗi và sửa chữa lỗi một cách chủ động không
phụ thuộc vào giáo viên dạy nữa.
Giáo viên: Ngô Xuân Lan – Tổ: Toán Tin - Trường THPT Phan Thúc Trực Trang 24
Sỏng kin kinh nghim trong dy hc tin hc 11
C. KT LUN V KIN NGH
1. Kt lun:
Tin hc l mt mụn hc mi v tng i khú i vi hc sinh THPT . Trong
ú mụn lp trỡnh Pascal trong chng trỡnh lp 11 li cng khú. vit c mt
chng trỡnh hon chnh tha món yờu cu ca bi toỏn t ra trờn mỏy tớnh thỡ hc
sinh phi cú t duy lụgic v thut toỏn, kh nng s dng mỏy tớnh thnh tho, s

dng cỏc cõu lnh v khai bỏo kiu d liu mt cỏch hp lý. Tuy nhiờn khi tin
hnh vit chng trỡnh trờn mỏy tớnh hay vit chng trỡnh trờn giy hc sinh
thng gp mt s li c bn v mt cỳ phỏp v ng ngha.
Vic ỏp dng phng phỏp Giỳp hc sinh t tỡm v sa cha li khi vit
chng trỡnh bng nụn ng lp trỡnh Pascal trong chng trỡnh Tin hc 11 vo tit
dy s mang li hiu qu hn cho hc sinh khi thc hin lp trỡnh.
2. Kin ngh:
Ban giỏm hiu, t, nhúm:
- Cn phi b trớ c ti thiu 2 phũng mỏy hc sinh cú iu kin thc hnh
trờn mỏy tớnh. Lm cho tit hc tr nờn hiu qu hn.
- T chc cỏc cuc thi lp trỡnh trờn mỏy tớnh dnh riờng cho hc sinh lp 11.
- To iu kin cho giỏo viờn hc taaqpj nõng cao trỡnh ỏp ng vi nhu cu
phỏt trin CNTT trong thi i nay.
Qua sáng kiến kinh nghiệm này mong đợc sự góp ý của ban giám hiệu và các đồng
nghiệp để tôi viết thiết thực hơn, sâu sắc hơn.
Yên Thành, Ngày 16 tháng 5 năm 2011
Ngời viết sáng kiến
Ngô Xuân Lan
Giỏo viờn: Ngụ Xuõn Lan T: Toỏn Tin - Trng THPT Phan Thỳc Trc Trang 25