Tải bản đầy đủ (.doc) (21 trang)

Một số kinh nghiệm khắc phục khó khăn của học sinh khi học lập trình pascal – môn tin học 11

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (141.37 KB, 21 trang )

MỤC LỤC
2.3.2.3. Đối với chương V: Tệp và thao tác với tệp và chương VI: Chương trình con và
lập trình có cấu trúc...........................................................................................................15
2.3.3. Kinh nghiệm giúp học sinh lập trình giải bài toán trong toán học hoặc trong thực tế
...............................................................................................................................................16
2.4. Hiệu quả của sáng kiến kinh nghiệm:.........................................................................19
3. Kết luận...............................................................................................................................19

1


1. Mở đầu
1.1. Lý do chọn đề tài
Chúng ta đang sống ở thế kỉ XXI là thế kỉ của Công nghệ thông tin
và truyền thông. Sự phát triển mạnh mẽ như vũ bão của tin học đã làm cho
xã hội có nhiều nhận thức mới về cách tổ chức các hoạt động. Vì vậy việ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ọng rấ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 từ năm 2006 môn Tin học đã được
bộ Giáo dục-Đào tạo đưa và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 sách giáo khoa (SGK) Tin học lớp11 bậc trung học
phổ thông (THPT), các nhà biên soạn sách đã đưa vào các chương bài giúp học
sinh tiếp cận được với ngôn ngữ lập trình bậc cao. Qua đó giúp các em
hình dung đượ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 Tin học, tạo niềm tin để các em có thể dễ dàng tự định hướng,
lựa chọn nghề nghiệp sau này.
Tuy nhiên, Tin học là một môn học mới ở các trường phổ thông nên
học sinh còn nhiều bỡ ngỡ khi tiếp cận với môn học này. Nội dung tin học
lập trình lớp 11 là một nội dung mới lạ đối với đa số học sinh, với học sinh


miền núi như trường chúng tôi việc học Toán, Ngoại ngữ đã khó nay học
lập
trình thì điều đó lại càng khó khăn hơn bởi nhiều khái niệm, thuật ngữ,
cấu
trúc dữ liệu, cú pháp câu lệnh học sinh mới được tiếp xúc lần đầu.
Chính vì
vậy mà học sinh dễ mắc sai lầm khi lập trình giải quyết các bài toán. Khi thực
hiện giảng dạy môn Tin học lớp 11 tại Trường THPT Lê Lai, tôi thấy rằng, việc
học sinh lập trình bằng ngôn ngữ lập trình Turbo Pascal để giải các bài toán trên
máy tính thường gặp rất nhiều khó khăn trong việc sử dụng các câu lệnh để
diễn tả các bước của thuật toán, phát hiện và sửa lỗi về cú pháp,
ngữ
nghĩa...vv. 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. Từ những điều trăn trở đó mà
qua một số năm giảng dạy, tôi đã có một số kinh nghiệm để khắc phục những
khó khăn cho học sinh lớp 11 khi học Tin học. Đó cũng là vấn đề
trong đề
tài: "Một số kinh nghiệm khắc phục khó khăn của học sinh
khi học
lập trình Pascal – môn Tin học 11"
1.2. Mục đích nghiên cứu
Giúp học sinh (đặc biệt là học sinh miền núi như trường THPT Lê Lai)
tự tin có niềm đam mê hứng thú khi học lập trình Pascal – Tin học 11; từ chỗ các
em ngại phải giải một bài toán Tin học vì găp phải nhiều rào cản: tìm thuật toán,
phát hiện lỗi và sửa lỗi...vv. Giờ đây (sau khi áp dụng SKKN) các em đã có
niềm tin và yêu thích học lập trình Pascal nói riêng và bộ môn Tin học 11 nói
chung.


2


1.3. Đối tượng nghiên cứu
Khắc phục những khó khăn khi học lập trình Pascal - Tin học 11 của
học sinh các lớp 11A1, 11A2 trường THPT Lê Lai năm học 2015- 2016.
1.4. Phương pháp nghiên cứu
Trong đề tài này tôi sử dụng một số phương pháp nghiên cứu chính:
+ Phương pháp nghiên cứu tài liệu.
+ Phương pháp quan sát.
+ Phương pháp phỏng vấn.

2. Nội dung
2.1. 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 đại họ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ới tê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ập trình có được thói quen viết một chương trình có cấu
trúc sáng sủa, 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ập trì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ích giữ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ủa mộ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ỏi phầ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ần mộ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ỗi người
phụ trách một vài khối.

Từ tính ưu việt đó của ngôn ngữ lập trình Pascal mà ngôn ngữ này đã
được sử dụng rộng dãi. Pascal rất thích hợp dùng để giảng dạy trong các nhà
trường và cho những người mới bắt đầu học lập trình. Do đó trường THPT
Lê Lai đã chọn ngôn ngữ lập trình này để dạy học sinh giải bài toán trên
máy tính. Mặc dù mục tiêu của chương trình giáo dục Tin học của Bộ GD & ĐT
không quy định phải dạy học sinh trên một ngôn ngữ lập trình cụ thể nào.
Tuy nhiên trong quá trình học tập, học sinh ở trường chúng tôi găp phải
những khó khăn nhất định: mắc lỗi cú pháp, lỗi ngữ nghĩa chưa biết cách sửa;
việc giải một bài toán trong toán học hoặc bài toán thực tế còn lúng túng, nhiều
vướng mắc. Vì vậy để khắc phục những hạn tồn tại đó, tôi đã cố gắng tìm ra giải
pháp trong quá trình giảng dạy.
2.2. Thực trạng vấn đề
Qua thực tế giảng dạy ở trường THPT Lê Lai các năm qua, tôi nhận thấy
khi học đến chương trình tin học lớp 11 đa số học sinh đều nhận xét ngại học bộ
môn này vì rất khó khăn khi viết hoàn chỉnh một chương trình chạy được trên
máy tính đó là các em khó xác định bài toán, thuât toán; khi chạy chương trình
thì gặp khá nhiều lỗi: lỗi về cú pháp và lỗi về ngữ nghĩa không biết sửa
3


chương trình trong ngôn ngữ lập trình Pascal. Những khó khăn ấy, tôi đưa
về 3 trường hợp cụ thể sau:
Trường hợp 1: Khó khăn về phát hiện và sửa lỗi sai cú pháp thường
gặp của học sinh trong lập trình Pascal.
1.Đặt sai tên: Tên hằng, biến, tên chương trình , đăt tên biến trùng
nhau,....v v.
Tên chứa dấu cách, chứa kí tự đặc biêt, bắt đầu bằng chữ số, tên biến là
a và A;
2. Sai tên kiểu dữ liệu;
Vd: Kiểu thực thì viết là Read; Kiểu nguyên thì viết interger

3. Thiếu dấu kết thúc câu {;} và dấu kết thúc chương trình;
4. Viết sai tên các từ khóa;
5. Không phân biệt được hằng xâu và biến: 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;
6. Sử dụng dấu ; sai vị trí.Trước Else không có dấu chấm phẩy.
Sử dụng dấu chấm phẩy sau từ khoá do trong các câu lệnh lặp câu lệnh lặp rỗng
không làm việc gì cả.
Trường hợp 2: Khó khăn khi phát hiện lỗi sai về ngữ nghĩa thường
gặp của học sinh trong lập trình Pascal. Lỗi về ngữ nghĩa là lỗi trình biên
dịch sẽ bỏ qua mà khi chạy chương trình mới phát hiện được lỗi.
1.Chưa hiểu thứ tự ưu tiên phép toán, chuyển từ biểu thức toán học sang
biểu thức trong pascal bị sai;
2. Khai báo sai miền chỉ số cho dữ liệu kiểu mảng; sai kiểu dữ liệu
cho biến
Ví dụ 1: Nhập vào một mảng số nguyên gồm các số lớn hơn 3 và nhỏ hơn
100. In mảng vừa nhập.
Học sinh khai báo mảng như sau: Var a: array[3..100] of integer;
3. Giá trị biến điều khiển vượt quá miền chỉ số của mảng;
4. Dùng cùng tên biến điều khiển cho các vòng lặp for lồng nhau;
5. Tràn số do kết quả tính toán vượt quá giới hạn;
6. Sử dụng tên hàm làm biến cục bộ.
Trường hợp 3: Khó khăn khi xác định bài toán và liên hệ phương
pháp giải một bài toán trong toán học hoặc trong thực tế với thuật giải
trong tin học.
- Đối với bài tập 9 –SGK Tr36: Yêu cầu viết chương trình tính diện tích
phần gạch chéo
- Các bài tập ở cuối chương III:
+ Bài toán cổ: Vừa gà vừa chó....
+ Bài toán tuổi cha, tuổi con

+ Bài toán gửi tiền tiết kiệm không kì hạn
- ....

4


2.3. Một số kinh nghiệm khắc phục khó khăn của học sinh khi học
lập trình Pascal – Tin học 11
2.3.1. Kinh nghiệm khắc phục những lỗi sai cú pháp cơ bản
2.3.1.1 Đối với chương II:‘‘Chương trình đơn giản’’
a) Ở các tiết lí thuyết khi dạy giáo viên sẻ lưu ý cho học sinh các lỗi cú
pháp thường gặp
- Lỗi đặt tên hằng, 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).
- Lỗi đặt tên hằng, tên biến, tên chương trình,...không đúng qui định của
ngôn ngữ lập trình.
- Ngăn cách giữa các biến phải là dấu phẩy thì các em thường dùng dấu
chấm phẩy. Khi kết thúc câu lệnh không có dấu chấm phẩy.
- 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;
- Khi viết hằng xâu thường quên không đặt hằng xâu vào giữa cặp
dấu nháy đơn.
- Khi viết thông báo ra ngoài màn hình thì các biểu thức lại cùng đặt trong
cặp dấu nháy đơn với hằng xâu kí tự.
- Khai báo biến thuộc kiểu dữ liệu này nhưng trong phần thân chương
trình lại dùng biến đó với kiểu dữ liệu khác dẫn đến sai kiểu. VD : Khai báo biến
a thuộc kiểu nguyên, nhưng trong phần thân chương trình lại có câu lệnh
a := a/2 ; (biểu thức a/2 là một số thực, biến a thuộc kiểu nguyên nên không thể
lưu trữ được giá trị thực)...vv

b) Biện pháp khắc phục:
*) Đối với các tiết bài tập trong chương giáo viên cho học sinh làm các
bài tập dạng phát hiện lỗi, qua đó giúp học sinh khi thực hành có thể dễ dàng
phát hiện lỗi và sửa lỗi hơn.
*) Đối với bài tập thực hành của chương II : Bài tập và thực hành 1.
Thực hành theo yêu cầu của SGK.
Cách thực hiện:
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:
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. Mặc dù là nhìn chương trình đã viết sẵn trong sách giáo khoa để soạn
thảo nhưng chương trình các em soạn thảo vẫn còn 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,…
Bước 3: Để 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 kém. Sau đó, giáo viên chiếu chương trình đang
còn 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. Dưới đây là chương trình giáo viên chiếu lên màn chiếu:
5


Program
Giai_PTB2 ;
Uses
Crt ;
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;
Bước 4: 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 5 : Sau 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.1.2. Khắc phục những lỗi sai cơ bản thường gặp trong chương III:
‘‘Cấu trúc rẽ nhánh và lặp’’.
a) Ở các tiết lí thuyết khi dạy giáo viên lưu ý các lỗi thường gặp.
- Viết thiếu các từ khóa như: then, do, downto, to…
- Điều kiện trong câu lệnh rẽ nhánh haycâu lệnh lặp không phải là biểu
thức logic.
- Câu lệnh trước từ khóa else có dấu chấm phẩy.
- Trong câu lệnh For…to …do thì giá trị đầu lại lớn hơn giá trị cuối hay
trong câu lệnh For… downto … do thì giá trị đầu lại nhỏ hơn giá trị cuối.

6


- Trong câu lệnh lặp While … Do không có câu lệnh làm thay đổi điều
kiện lặp. Do đó vòng lặp không thể dừng lại được.
b) Biện pháp sửa lỗi.
Với Tiết 11 – Bài ‘‘Cấu trúc rẽ nhánh’’. Cho học sinh phát hiện những
lỗi trong chương trình
Ví dụ 1: Viết chương trình tìm nghiệm thực của phương trình bậc hai :
ax2 + bx + c = 0 (a # 0).
Giáo viên chiếu chương trình đã chuẩn bị sẵn cho cả lớp quan sát.
Program Vidu ;
Uses
Crt ;
Var
a, b, c, d :Real ; x1, x2 : Real;
begin
clrscr;
write(‘Moi nhap a, b, c: ’); Readln(a,b,c);
d := b * b – 4 * a*c;

if d < 0 then
writeln(‘Phuong trinh vo nghiem’);
else
if d > 0 then
Begin
x1 : = (-b – sqrt(d))/(2*a);
x2 :=(-b + sqrt(d))/(2*a);
writeln(‘Phuong trinh co hai nghiem, ’x1,x2);
End;
if d=0 then
writeln(‘Phuong trinh co nghiem kep,’-b/2a);
Readln
End.
Cách thực hiện:
Bước1: GV 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.
Bước 2: Các nhóm suy nghĩ rồi cử đại diện các nhóm lên bảng trình bày
kết quả.
Bước 3: 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 writeln(‘Phuong trinh vo nghiem’); sai (mã lỗi: 113), vì câu
lệnh này đứng trước từ khóa else nên không có dấu chấm phẩy.
+ Câu lệnh writeln(‘Phuong trinh co hai nghiem, ’x1,x2); sai (mã lỗi: 89).
Danh sách kết quả ra ngoài màn hình trong câu lệnh này gồm có 1 hằng xâu kí
tự và 2 biến. Các kết quả ra phải được ngăn cách nhau bởi 1 dấu phẩy, hằng xâu
kí tự phải được đặt trong cặp dấu nháy đơn.
Sửa lại là: writeln(‘Phuong trinh co hai nghiem ’,x1:6:2,x2:6:2);
7



+ Câu lệnh writeln(‘Phuong trinh co nghiem kep,’-b/2a); sai
Câu lệnh này có 2 lỗi sai: Thứ nhất, sai cách viết danh sách kết quả ra ngoài
màn hình (mã lỗi 26). Thứ hai, viết biểu thức chưa đúng với quy định của
Pascal (mã lỗi: 89).
Sửa lại là: writeln(‘Phuong trinh co nghiem kep’,-b/(2*a));
Bước 4: 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:
Program
Vidu1 ;
Uses
Crt ;
Var
a, b, c, d :Real ; x1, x2 : Real;
begin
clrscr;
write(‘Moi nhap a, b, c: ’); Readln(a,b,c);
d := b * b – 4 * a*c;
if d < 0 then
writeln(‘Phuong trinh vo nghiem’);
else
begin
if d > 0 then
begin
x1 : = (-b – sqrt(d))/(2*a);
x2 :=(-b + sqrt(d))/(2*a);
writeln(‘Phuong trinh co hai nghiem ’, x1:6:2,x2:6:2);
end;
if d=0 then
writeln(‘Phuong trinh co nghiem kep ’,-b/(2*a));

End;
Readln
End.
Bước 5: Tiếp theo giáo viên chạy thử chương trình cho học sinh quan sát.
Bước 6: Cuối cùng giáo viên đánh giá kết quả và cho điểm các nhóm.
2.3.1.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 tiết lí thuyết khi dạy giáo viên lưu ý các lỗi thường gặp.
- Khi khai báo biến mảng thì thường viết sai từ khóa.
- Trong khai báo mảng thì chỉ số đầu và chỉ số cuối chưa được xác định.
- Khi tham chiếu đến một phần tử của mảng một chiều thì thường viết
sai. Ví dụ để tham chiếu đến phần tử thứ 1 của mảng a thì học sinh viết
a1 hoặc a(1).
- Đối với bài ‘‘Kiểu xâu’’ học sinh thường nhầm lẫn giữa hàm và thủ
tục....vv
b) Biện pháp sửa lỗi.

8


Ví dụ: Cho dãy A gồm n số nguyên dương A1, A2, …, An. Tìm phần tử
lớn nhất của dãy cùng với chỉ số của nó.
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.
Program Tim_max ;
Uses
Crt ;
Var
A : aray[1..Nmax] of integer;
n, i, cs: byte;

max: integer;
begin
clrscr;
write(‘Nhap n: ’);
Readln(n);
for i:=1 to n do
begin
write(‘Nhap phan tu thu ’, i,’ :’);
readln(a(i));
end;
max:=a[1]; cs:=1;
for i:=2 to n do
if a[i] > max then begin max:= a[i]; cs:=i; end;
writeln(‘Gia tri lon nhat la: ’, max,’ tai vi tri: ’, cs) ;
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 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à :
Trong khai báo biến mảng: Var A: aray[1..Nmax] of integer; có tới 2
lỗi sai. Một là, sai từ khóa Array chứ không phải là Aray (mã lỗi:3). Hai là, chỉ
số cuối Nmax chưa được xác định (mã lỗi:3). Lỗi này nhiều học sinh vẫn không
hiểu vì sao sai. Vì các em thấy trong SGK cũng viết như vậy.
=>Do đó giáo viên cần làm rõ để học sinh hiểu, Nmax trong SGK đã có giá trị
xác định là 250 nhờ đã khai báo hằng trước đó: Const Nmax=250;
Câu lệnh nhập Readln(a(i)); sai (mã lỗi: 64). Sửa lại là: Readln(a[i]);
Chương trình được sửa lại là:

Program Tim_max ;
Uses
Crt ;
Const
Nmax = 250;
Var
A : array[1..Nmax] of integer; n, i, cs: byte;
max:
integer;
begin
clrscr;
9


write(‘Nhap n: ’);
Readln(n);
for i:=1 to n do
begin
write(‘Nhap phan tu thu ’, i,’ :’);
readln(a[i]);
end;
max:=a[1]; cs:=1;
for i:=2 to n do
if a[i] > max then
begin max:= a[i]; cs:=i;
end;
writeln(‘Gia tri lon nhat la: ’, max,’ tai vi tri: ’, cs) ;
readln
end.
Bước 5: Chạy thử chương trình cho cả lớp quan sát, để các em được khắc

sâu thêm nội dung bài học.
Bước 6: Giáo viên đánh giá kết quả và cho điểm các nhóm.
2.3.1.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 tiết lí thuyết khi dạy giáo viên lưu ý các lỗi thường gặp.
- Quên không khai báo biến tệp. Quên không gắn tên tệp.
- Đường dẫn đến tệp sai; Không mở tệp để đọc hay ghi nhưng vẫn thao
tác đọc/ghi tệp; Mở quá nhiều tệp.
- Thao tác trên tệp xong thì không thực hiện đóng tệp.
b) Biện pháp sửa lỗi.
Tiết 38 – Ví dụ làm việc với tệp yêu cầu học sinh làm bài tập sau:
Ví dụ: Cho tệp SONGUYEN.INP chứa các số nguyên, các số cách nhau
bởi dấu cách. Hãy viết chương trình tính tổng các số nguyên dương có trong tệp
ở trên, kết quả ghi lên tệp SONGUYEN.OUT.
Cách tiến hành:
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 ở trê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ột nhóm bất kì cho cả lớp cùng quan sát. Đây là chương trình của
nhóm đó:
Program Vi_du;
Var
f, g : Text; n, s : integer ;
begin
asign(f, ‘SONGUYEN.INP’) ;assign(g,’ SONGUYEN.OUT’)
S := 0 ;
while not eof(f) do
begin
read(f,n) ;
if n > 0 then S :=S + n ;

end;
10


writeln(g, ‘Tong cac so duong co trong tep la: ’, s);
end.
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
củng cố.
Các lỗi sai có trong chương trình trên là:
+ Câu lệnh asign(f, ‘SONGUYEN.INP’) ; sai (mã lỗi: 3), vì viết sai
chính tả từ khóa assign
+ Câu lệnh while not eof(f) do sai (mã lỗi:104), vì tệp chưa được mở để
nhập dữ liệu .
+ Câu lệnh writeln(g, ‘Tong cac so duong co trong tep la: ’, s); sai (mã
lỗi: 105), vì tệp chưa được mở để xuất dữ liệu.
+ Thiếu câu lệnh đóng tệp. Trong trường hợp này, khi thực hiện biên
dịch thì máy tính không báo lỗi (không sai về mặt cú pháp). Tuy nhiên
sau khi thực hiện chương trình, mở tệp SONGUYEN.OUT để xem kết
quả thì kết quả không có trong tệp. Nguyên nhân là do chưa thực hiện
đóng tệp nên việc ghi tệp chưa được hoàn tất.
Giáo viên thực hiện chỉnh sửa chương trình trên thành chương trình hoàn
chỉnh:
Program Vi_du;
Var
f, g : Text; n, s : integer ;
begin
assign(f, ‘SO.INP’) ; reset(f);
assign(g,’SO.OUT’); rewrite(g);
S := 0 ;
while not eof(f) do

begin
read(f,n) ;
if n > 0 then S :=S + n ;
end;
writeln(g, ‘Tong cac so duong co trong tep la: ’, s);
close(f); close(g);
end.
Giáo viên chạy thử chương trình cho học sinh quan sát.
Bước 4. Từ chương trình hoàn chỉnh ở trên, 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.1.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”
a) Ở các tiết lí thuyết khi dạy giáo viên lưu ý các lỗi thường gặp
+ 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.
+ Quên khai báo kiểu dữ liệu cho tên hàm.
11


b) Biện pháp sửa lỗi.
* Tiết 44 – Ví dụ về cách viết và sử dụng chương trình con cho học
sinh tìm các lỗi sai trong chương trình:
Ví dụ: Viết chương trình thực hiện rút gọn phân số, trong đó có sử dụng
hàm tính ước chung lớn nhất của hai số nguyên.
Cách tiến hành như sau:
Bước 1. Giáo viên chiếu chương trình đã viết sẵn cho học sinh quan sát:
program Rut_gon;
var

tuso, mauso, a: integer;
funtion
UCLN(x,y:integer);
var sodu:integer;
begin
while y < > 0 do
begin
Sodu := x mod y;
x:=y;
y:=sodu;
end;
end;
begin
write(‘Moi ban nhap tu so va mau so: ’) ; readln(tuso, mauso) ;
UCLN :=x;
a:=UCLN(tuso, mauso);
if a > 1 then
begin
tuso := 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 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à :

+ 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ày thiếu dấu “(” nhưng bản chất câu lệnh này sai vì đặt sai vị trí.
Câu

12


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.3.2 Kinh nghiệm khắc phục những lỗi sai về ngữ nghĩa
2.3.2.1 Đối với chương II: Chương trình đơn giản
Đối với lỗi về ngữ nghĩa khi dạy thì giáo viên lưu ý trường hợp có thể
dẫn đến kết quả sai:
- Chuyển biểu thức trong Toán học sang biểu thức trong Pascal sai dẫn đến
kết quả bị sai
- Chưa hiểu thứ tự ưu tiên phép toán, chuyển từ biểu thưc toán học sang biểu
thức trong pascal bị sai
Cho học sinh làm bài tập: Thử chạy chương trình với các bộ Test
khác nhau
Ví dụ 1: Viết chương trình tính giá trị của biểu thức sau, với a, b, c được
nhập từ bàn phím khác 0: x=

a 2 + b2

; ta có chương trình sau:
abc

Program vidu2;
uses crt;
Var a,b, c: integer;
x: real;
Begin
write(‘ nhap a,b,c’); readln(a,b,c);
x:= a*a+b*b / a*a*b;
write(‘ gia tri cua bieu thuc la ‘, x: 8: 2);
readln
end.
Cách Thực hiện:
Bước 1: Soạn sẵn chương trình mà trình biên dịch sẽ không phát hiện ra
lỗi cú pháp chỉ còn lỗi ngữ nghĩa cho học sinh quan sát, rồi nhận xét
Bước 2: Chạy thử chương trình với các bộ Test , cho học sinh so sánh với
việc tính trong toán học để học sinh phát hiện lỗi từ đó các em sẽ suy nghĩ để
tìm ra lỗi
Bước 3: Chia lớp thành 4 nhóm nhỏ, yêu cầu các nhóm làm sau đó gọi lần
lượt mỗi nhóm lên bảng trình để so sánh kết quả trong toán học. Cuối cùng giáo
viên kết luận lại vấn đề: chỉ sai trong chính biểu thức, đúng phải là: x:=
(a*a+b*b)/(a*b*c);
2.3.2.2 Đối với chương III: Cấu trúc rẽ nhánh và lặp và chương IV:
Dữ liệu có cấu trúc
Khi dạy giáo viên lường trước các lỗi có thể dẫn đến kết quả sai để lưu
ý cho học sinh, sau đó cho học sinh được thực hành phát hiện lỗi qua các bài
tập ví dụ:

13



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ó người đã viết chương trình như sau:
Program vidu2;
Uses crt;
Var a,b,c:integer;
Begin
Clrscr;
Write(‘nhap vao 3 so:’);
Readln(a,b,c);
If aElse
If aWrite(‘So lon nhat la:’,a);
Readln;
End.
Cách thực hiện:
Bước 1: Giáo viên cho trình biên dịch soát lỗi để học sinh quan sát đã hết
lỗi cú pháp thông qua màn hình của máy chiếu
Bước 2: Chạy chương trình với những bộ Input khác nhau để từ đó đưa ra
nhận xét: chương trình trên cho đáp số lúc đúng, lúc sai tuỳ thuộc vào a,b,c. Hãy
giải thích tại sao và sửa lại cho đúng ?
Ta thực hiện chương trình trên với 2 bộ input sau đây:
- a=3,b=4,c=5
a
b
c
aa

3
4
5
T (3<4)
4
Vậy số lớn nhất là 4 Kết quả sai
- a=5,b=4,c=7
a
B
c
aa5
4
7
F (5<4)
T (5<7)
7
Vậy số lớn nhất là 7 Kết quả đú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 vd2_1;
Uses crt;
Var a,b,c:integer;
Begin `
Clrscr;
Write(‘nhap vao 3 so:’);
Readln(a,b,c);
If aBegin

14


If bEnd
Else
If aWrite(‘So lon nhat la:’,a);
Readln;
End.
Bước 3: Sau khi sửa lại chương trình hoàn chỉnh, giáo viên cho chạy lại
với bộ test trước đó để học sinh thấy được ý nghĩa của việc sửa lỗi ngữ nghĩa
(nếu có lỗi về ngữ nghĩa sẽ ảnh hưởng đến việc đưa ra output)
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?
Giáo viên yêu cầu học sinh phát hiện lỗi cho chương trình giải bài toán
trên như sau :
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 1: Giáo viên cho trình biên dịch soát lỗi để học sinh quan sát đã hết
lỗi cú pháp thông qua màn hình của máy chiếu
Bước 2: Cho học sinh thực hiện với các bộ Test khác nhau: 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.
Bước 3: GV gợi ý cho học sinh sửa lỗi : 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.3. Đối với chương V: Tệp và thao tác với tệp và chương VI:
Chương trình con và lập trình có cấu trúc
Giáo viên tạo ra các tình huống mắc lỗi để lưu ý cho học sinh, thông
qua các trường hợp:
* Tràn số do kết quả tính toán vượt quá giới hạn.
15


Function GT(n:integer):integer;
Var i,t:integer;
Begin
T:=1;
For i:=2 to n do t:=t*i;
Gt:=t;
End;
Begin
Write(‘GT(8)=’, GT(8));
Readln;
End.

Khi thực hiện chương trình GT(8)=-25126 là sai vì thực tế 8!=40320
Lỗi này do khai báo hàm trả về số nguyên nên miền giá trị tối đa là 32767
* 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ộ.
Function GT(n:integer):Longint;
Var i:integer;
Begin
For i:=2 to n do GT:=GT*i;
End;
Trong thân hàm đã sử dụng tên hàm làm biến cục bộ nên khi biên dịch sẽ báo
lỗi gọi hàm nhưng thiếu tham số do chương trình hiểu GT:=GT*i là lời gọi đệ
qui. Để tránh lỗi này cần lưu ý với học sinh: để trả kết quả cho hàm (không đệ
quy), 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ị về cho hàm.
2.3.3. Kinh nghiệm giúp học sinh lập trình giải bài toán trong
toán học hoặc trong thực tế
Trong số các bài tập trong sách giáo khoa, có những bài chỉ cần “hơi
lạ” một chút thì học sinh đã không biết xác định bài toán, thuật toán để viết
chương trình, cụ thể như:
Bài tâp 1: Đối với bài tập 9 –SGK Tr36: Yêu cầu viết chương trình tính
diện tích phần gạch chéo; thoạt nhìn học sinh chỉ có thể tính được bằng cách tính
diện tích các phần gạch chéo nhỏ rồi cộng tổng=> như vậy sẽ phức tạp và có khi
là không tìm được output
Cách thực hiện:
Bước 1: Cho học sinh xác định bài toán
Input: bán kính đường tròn là a, a nhập từ bàn phím
Output: diện tích phần gạch chéo
Bước 2: GV gợi ý thông qua các câu hỏi

Câu hỏi 1: Để tính diện tích mà ta chỉ biết bán kính thì ta thường nghĩ
ngay đến diện tích của hình gì ?
16


Khi đó HS sẽ trả lời ngay được đó là diện tích của hình tròn
Câu hỏi 2: Các em hãy quan sát lại hình vẽ (hình 3 SGK trang 36) xem
giữa diện tích phần gạch chéo với diện tích hình tròn có mối liên hệ gì không?
Lúc này học sinh sẽ quan sát, suy nghĩ và sẽ tìm được mối liên hệ giữa diện tích
phần gạch chéo và diện tích hình tròn đó là: Diện tích phần gạch chéo = ½ diện
tích hình tròn
Bước 3: Sau khi đã tìm được thuật toán để giải bài toán, yêu cầu học sinh
viết chương trình hoàn chỉnh; kết quả mong đợi như sau:
program bai9;
uses crt;
const pi=3.142;
var a, s: real;
begin
Write(‘ nhap ban kinh a >0, a=’);
readln(a);
S:=(pi *a*a)/2;
writeln(‘ Dien tich phan gach cheo la’, s: 8:4);
readln
end.
Từ bài toán này, bản thân nhận thấy các em đã hình dung được để viết
một chương trình việc đầu tiên các em phải xác định đúng bài toán, tìm thuật
toán, và sau cùng là sử dụng các câu lệnh thích hợp để diễn đạt thuật toán. Ngoài
ra các em còn biết được rằng khi viết được 1 chương trình chạy trên máy tính thì
chúng ta có thể thực hiện nó cho nhiều bộ số (input) khác nhau chứ không cố
định trường hợp cụ thể như trong toán học.

Bài tập 2: Đối với bài toán cổ : Vừa gà vừa chó, bó lại cho tròn, ba mươi
sáu con, một trăm chân chẵn. Hỏi có bao nhiêu con mối loại?
Cách thực hiện:
Bước 1: Gợi ý để học sinh tìm Input, Output, chọn biến, kiểu dữ liệu cho
biến, tìm công thức liên hệ
Gọi x là số con gà; y là số con chó; x, y : byte
Input: x + y = 36; 2*x+4*y=100=> x + 2*y =50
Out put: x, y
Bước 2: GV: Trong toán học thì các em chỉ cần giải hệ là tìm được x, y
Vậy trong tin học ta phải làm cách nào để tìm được x, y? sẽ có vài học sinh phát
biểu là thay lần lượt các giá tri của y với y có thể nhận các giá trị từ 1đến 24
(gv giải thích cho học sinh có thể cho biến x nhận các giá trị từ 1 đến 49 nhưng
không nên sử dụng vì như vậy vòng lặp phải thực hiện nhiều hơn).
Bước 3: Yêu cầu học sinh nêu các câu lệnh thích hợp sẽ sử dụng để mô
tả cho ý tưởng đó=> các em sẽ nêu ra loại câu lệnh lặp với số lần biết trước
Cho từng nhóm học sinh trình bày và nhận xét nhóm bạn, kết quả được đoạn
câu lệnh như mong đợi:
For y: =1 to 24 do
17


Begin
X:= 36-y;
If x+ 2 *y= 50 then
Writeln (‘so con ga la ’, x, ‘so con cho la ‘, y);
End;
Bước 4 :GV tiếp tục yêu cầu học sinh hoàn thiện chương trình: gồm khai
báo biến và đoạn câu l tệnh trên đặt trong phần thân chương trình
Bài tập 3: Đối với bài toán Tuổi cha, tuổi con (bài 7-SGK Tr 51)
Bước 1: GV cho học sinh tìm Input, output của bài toán;

Input: tuoicha, tuoicon (tuoicha>2*tuoicon; tuoicha-tuoicon>25)
Output: Sau nam=? thì tuoicha=2*tuoicon
Bước 2: Hướng dẫn học sinh tìm thuật toán
Để học sinh dễ hiểu được bài toán, giáo viên đưa ra một ví dụ
(tuoicon=1,tuoicha=26 thì sau 24 năm tuoicha=50, tuoicon=25 như vậy tuổi cha
đã gấp 2 lần tuổi con)
Học sinh đã biết khi thời gian năm tăng 1 thì tuổi của cha cũng thêm 1, con cũng
tăng 1
GV đặt câu hỏi: Khi nào thì việc tăng tuổi cha và con sẽ dừng?
HS sẽ trả lời được : tuoi cha= 2*tuoicon
Đây là thao tác lặp có điều kiện nên sử dụng câu lệnh lặp kiểm tra điều kiện
While …Do
Từ những gợi ý như trên GV cho các nhóm thảo luận để viết hoàn thiện chương
trình, kết quả như mong đợi:
Uses crt;
Var tuoicha, tuoicon, nam: word;
Begin
Clrscr;
Write(‘nhap tuoi cha tuoi con:’);
Write (‘tuoi cha>2*tuoicon va tuoicha-tuoicon>=25’);
Readln(tuoicha, tuoicon);
nam:=0;
while tuoicha <> 2*tuoicon Do
begin
tuoicha:=tuoicha+1;
tuoicon:=tuoicon+1;
nam:=nam+1;
end;
writeln(‘Sau ‘, nam, ‘nam tuoi cha gap doi tuoi con’);
readln

End.
Từ bài toán này các em đã thấy được việc ứng dụng tin học để giải các bài toán
trong thực tiễn cuộc sống, qua đó các em thấy được ý nghĩa của việc mình đang
học và sẽ tăng thêm niềm hứng thú yêu thích môn học này
18


Bài tập 4: Gửi tiền tiết kiệm không kì hạn (bài 8 – SGK Tr51), Cách thực
hiện cũng tương tự như bài tập 3
2.4. Hiệu quả của sáng kiến kinh nghiệm:
Trong năm học 2015 – 2016 vừa qua tôi được giao nhiệm vụ giảng dạy 2
lớp 11, Tôi đã vận dụng kinh nghiệm này vào giảng dạy lớp 11A1 (là lớp thực
nghiệm) và lớp 11A2 (là lớp đối chứng) kết quả thu được rất khả quan: Học sinh
từ chỗ ngại học môn Tin học 11 nay đã hứng thú yêu thích học môn này và có
thể chủ động viết được những chương trình đơn giản chạy được trên máy tính
bởi vì các em đã vượt qua dược những rào cản như khó khăn xác định bài toán,
thuật toán; khó khăn khi chương trình có quá nhiều lỗi và không biết sửa các lỗi
ấy như thế nào. Cụ thể như sau:
* Bảng so sánh thái độ học tập của học sinh:
Không hứng
Rất hứng
thú (ngại
Bình thường
Hứng thú
thú
Lớp
Sĩ số
học)
SL
%

SL
%
SL
%
SL
%
Đối
42
15
35.7
20
47.6
7
16.7
0
0
chứng
Thực
42
0
0
7
16.7
25
59.5
10
23.8
nghiệm
* Bảng so sánh kết quả điểm các bài kiểm tra:
Yếu

Trung bình
Khấ
Giỏi
Lớp
Sĩ số
SL
%
SL
%
SL
%
SL
%
Đối
42
12
28.5
22
52.3
8
19.2
0
0
chứng
Thực
42
3
7.1
10
23.8

20
47.6
9
22.4
nghiệm
3. Kết luận
Trên đây là kết quả của quá trình nghiên cứu của bản thân trong năm học
2015 -2016 vừa qua cũng như kinh nghiệm dạy học của bản thân từ khi bước
vào ngành đến nay. Khi áp dụng với đối tượng là học sinh miền núi như học sinh
trường THPT Lê Lai tôi thấy đề tài thực sự có hiệu quả. Việc đưa ra “Một số
kinh nghiệm khắc phục khó khăn của học sinh khi học lập trình Pascal –
môn Tin học 11” nó đã khắc phục những lúng túng của bản thân trong những
năm đầu đi dạy và đã giúp đa số học sinh có hứng thú và yêu thích hơn đối với
việc lập trình Pascal nói riêng và bộ môn Tin học nói chung
Đó là lí do tôi muốn gửi đến đồng nghiệp trong SKKN nhằm chia sẻ với
đồng nghiệp các kinh nghiệm giảng dạy Tin học 11 tốt hơn. Tuy nhiên, đây là
kinh nghiệm của bản thân nên nó có thể phù hợp với giáo viên này nhưng không
phù hợp với giáo viên khác, phù hợp với đối tượng học sinh này nhưng không
phù hợp với đối tượng học sinh khác. Vì vậy mong các bạn đồng nghiệp tiếp tục
góp ý để tôi ngày một hoàn thiện đề tài này. Tôi xin chân thành cảm ơn!

19


XÁC NHẬN CỦA
THỦ TRƯỞNG ĐƠN VỊ

Thanh Hóa, ngày 30 tháng 4 năm 2016
Tôi xin cam đoan đây là SKKN của
mình viết, không sao chép nội dung

của người khác.
(Ký và ghi rõ họ tên)

Dương Thị Lan

20


TÀI LIỆU THAM KHẢO
1. Hồ Sĩ Đàm (chủ biên) và nhóm tác giả - Sách giáo khoa Tin học 11 – Nhà
xuất bản giáo dục năm 2007.
2. Hồ Sĩ Đàm (chủ biên) và nhóm tác giả - Sách bài tập Tin học 11 – Nhà
xuất bản giáo dục năm 2007.
3. Hồ Sĩ Đàm (chủ biên) và nhóm tác giả - Sách giáo viên Tin học 11 – Nhà
xuất bản giáo dục năm 2007.
4. Quách Tuấn Ngọc – Ngôn ngữ lập trình Pascal – Nhà xuất bản giáo dục.
5.
6.
7. GS-TS Hoàng Kiếm -“Giải một bài toán trên máy tính như thế nào”

21