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

Sáng kiến kinh nghiệm môn Tin học cấp trung học phổ thông

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 (300.33 KB, 27 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG THPT …………………………..

SÁNG KIẾN KINH NGHIỆM

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

Người thực hiện: ……………………..

Tân Trụ, tháng 1 năm 2019


DANH MỤC CỤM TỪ VIẾT TẮT
THPT: Truong học phổ thông
SGK: Sách giáo khoa
CTC: Chương trình con
SKKN: Sáng kiến kinh nghiệm


MỤ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


A. ĐẶ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ậ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 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 SGK Tin học
lớ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 sinh
tiếp cận được với ngôn ngữ lập trình bậc cao Pascal. 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 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á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.
Để 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 đã áp dụng phương pháp “Vận dụng kiến thức đã học
hướ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ình
Pascal”.
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ì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, 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
1


B. 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 đạ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 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. Và hiện nay Pascal đã được đưa vào chương trình
họ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ắc
phả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ắng
tìm ra giải pháp trong quá trình giảng dạy.
II. THỰC TRẠNG CỦA VẤN ĐỀ
1. Thuận lợi
- Trường THPT ………………….. đã trang bị 2 phòng thực hành để học sinh
có thể thực hành trên máy tính.
- 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
Do đa phần học sinh trong trường là con em ở nông thôn nên Tin học vẫn là
một môn học mới mẻ, có phụ huyh còn hỏi tôi “học Tin học là học cái gì, học chi
cho biết để nó chơi game chứ gì”. Phần lớn các em ít được tiếp xúc với máy tính
nên khi các em thực hành trên máy tính thao tác còn chậm. 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ẻ cao, vì vậy việc áp dụng
phương pháp dạy học phù hợp với bộ môn và với từng đối tượng học sinh thực sự
rất khó khăn.
- 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ôn
thi tốt nghiệp và Đại học nên quan niệm học môn Tin học để cho qua. Trong khi đó
2



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ến thứ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 sinh thườ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, khai báo không đủ
biến, sử dụng biến mà không khai báo, khai báo sai tên chương trì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ả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á í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ôn
ngữ 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ột
nhóm bất kì cho cả lớp cùng quan sát.

- 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.
3


Program vidu;
Uses crt;
Begin
Clrscr;
Writeln(‘ Lop 11A1 truong THPT’);
Readln
End.
- 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ương
trì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 đặ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 bước đầu biết cách biên dịch sửa lỗi và thực hiện chương
trì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 “;”.
+ 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ố.
4


+ 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:

Program vidu;
Uses crt;
Var
a,b,c: read;
x1,x2:read;
Begin
Clrscr;
Write(‘ nhap a,b,c); readln(a,b,c);
Delta:=b2-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
End.
Bước 1. Giáo viên chiếu chương trình cho các nhóm xem.
Bướ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 xong
học sinh biên dịch sửa lỗi.
5


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.

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).
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:=b2-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;
b+sqrt(delta))/2*a;

sai

phải

sửa


lại



x1:=

(-

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 sử dụng câu lệnh ghép: Begin.. End;

Else
6


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’);
Bướ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ì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.
Program vidu;
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’);
7


End;
Readln
End.
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 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 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 nhanh
nhất, đúng nhất gọi lên trình bày và cho điểm cộng ở cột điểm miệng.
Chương trình:
Program Vidu;
Uses crt;
Const nmax:=50;
Var
A:Aray[1..nmax] 0f Integer;
N,I,csmin:byte;
Min: integer;
Begin
8


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.

- 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
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: 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ì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. Khi thực hành nhiều lần học sinh sẽ biết một số mã lỗi
cơ bản và biết cách sửa lỗi như thế nào.
Program Vidu;
Uses crt;
Const nmax=50;
Var
A:Array[1..nmax] 0f Word;
9


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.
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.
+ 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.
+ Gán giá trị của biến cho thủ tục.
10


+ 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
SN.INP

SN.OUT

10

3 7 5 11 13

7 3 9 6 5 14 16 15 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ộ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 đó:
- 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ương
trì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.
Program Vidu;
Uses crt;
Const INP=’SN.INP’;
OUT=’SN.OUT’;
Var
A: Array[1 .. 100 ] of Byte;
n,i: Byte;

f1,f2:text;s
Function NT(M:byte);
Var S: Word;
Begin
11


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
Read(f2,A[i]);
If NT(A[i]) then Write(f2,A[i] );
End;
End.
Bước 5: Giáo viên củng cố lại một lần nữa và đưa ra một số 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ệ
12


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à:
Program Vidu;
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
Clrscr;
Assign(f1,INP); Reset(f1);
13


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.
Ví dụ 2: 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.

- 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
14


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.
- 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 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 cho
ngườ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ỉ được
phá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ế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 đú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ụ 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:
15


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
1

2


Kiểu
Kiểu thực

Kiểu nguyên

Tên kiẻu

Phạm vi giá trị

Bộ nhớ

Real

2.9*10-39.. 1.7*1038

6 Byte

Extended

1.9*10-4951.. 1.1*104932 10 Byte

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 1 Byte
mã ASCII

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.
16


Nếu 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
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ụ 2:

Progam Vidu2;
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;
17


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. 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ụ 3:
Program VD3;

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ể
18


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
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ụ 4:
Program VD4;
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.
19


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.
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. HIỆU QUẢ CỦA SKKN
Năm học 2017 – 2018 tôi được phân công giảng dạy bốn lớp 11: 11A1,
11A2, 11A3, 11A4. Khi chưa áp dụng đề tài thì kết quả cuối năm học 2017-2018
lớp 11A1, 11A4 và có kết quả như sau:
Lớp

Tổng

Giỏi

Tỉ lệ

Khá

Tỉ lệ

TB

Tỉ lệ

Yếu Tỉ lệ

11A1


41/28

26/16

63.41

15/12

36.59

0/0

0.00

0/0

0.00

11A4

38/20

0/0

0.00

16/12

42.11


21/8

55.26

1/0

2.63

Sang năm học 2018 – 2019 tôi được phân công giảng dạy năm lớp 11: 11A1,
11A2, 11A3, 11A4, 11A5. Tôi đã triển khai đề tài trên lớp hai lớp: 11A1, 11A4.
Với việc nghiên cứu kĩ chương trình sách giáo khoa, tài liệu tham khảo, lựa chọn
phương pháp giảng dạy phù hợp nên những lớp được triển khai đề tài đã thu được
kết quả thực sự. Mức độ tập trung chú ý của lớp cao, học sinh tham gia một cách
tích cực, các em đã chủ động hơn, hứng thú hơn trong học tập, nhất là trong các
giờ thực hành. Kết quả thu được rất khả quan. Cụ thể, với kết quả của trong học kì
I của lớp 11A1, 11A4 như sau:
20


Tôi thấy rằng đã có sự chuyển biến tích cực khi vận dụng SKKN trong việc
Lớp
Tổng Giỏi Tỉ lệ Khá Tỉ lệ
TB
Tỉ lệ Yếu Tỉ lệ
11A1

40/33

11A4


41/14

37/30 92.50
0/0

0.00

3/3

7.50

0/0

0.00

0/0

0.00

18/8

43.90

22/6

53.66

1/0


2.44

giảng dạy lập trình Pascal trên hai lớp 11A1 và 11A4.

21


C. KẾT LUẬN VÀ KIẾN NGHỊ
I. 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 khoảng thời
gian từ tháng 1 năm 2018 đến tháng 12 năm 2018. Khi áp dụng với học sinh hai
lớp 11A1 và 11A4 trường THPT ………….. tôi thấy đề tài thực sự có hiệu quả.
Việc hướng dẫn học sinh 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 chương trình Tin học 11 đã giúp học sinh không
còn lúng túng hoặc mắc lỗi như trước đây. Điều đó đã giúp đa số học sinh có thích
thú đối với việc lập trình nói riêng và bộ môn Tin học nói chung.
Tuy nhiên không có một biện pháp nào tối ưu vì thế trong quá trình dạy học
giáo viên cần biết linh động phát hiện và lựa chọn những biện pháp thích hợp để
sửa lỗi để các tiết học hấp dẫn học sinh hơn.
Giải pháp mà tôi nghiên cứu bước đầu mới áp dụng ở hai lớp trong năm lớp
mà tôi dạy khó có thể tránh khỏi những hạn chế. Một lần nữa rất mong nhận được
sự góp ý của các đồng nghiệp để đề tài của tôi ngày một hoàn thiện hơn. Tôi xin
chân thành cảm ơn.
II. KIẾN NGHỊ
- Tăng cường cho giáo viên đặc biệt giáo viên giảng dạy bộ môn Tin học được
tham gia học bồi dưỡng các chuyên đề về đổi mới phương pháp giảng dạy môn Tin
học, các phần mềm mới phục vụ cho công việc giảng dạy.
- Tạo điều kiện cho giáo viên học tập nâng cao trình độ để đáp ứng với nhu cầu
phát triển CNTT trong thời đại nay.
Tân Trụ, tháng năm

Người viết

22


×