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

Một số kinh nghiệm giúp học sinh khắc phục lỗi thường gặp khi viết chương trình bằng ngôn ngữ lập trình pascal 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 (176.91 KB, 18 trang )

1. Mở đầu
1.1. Lí do chọn đề tài
Ngày nay cùng với sự phát triển như vũ bão của công nghệ thông tin, môn
tin học đã trở thành môn học bắt buộc trong các trường trung học phổ thông.
Tuy nhiên với tư tưởng của học sinh, môn tin học là môn phụ nên các em thường
ít chú tâm và đầu tư cho môn học. Đặc biệt là với nội dung học lập trình ở lớp
11, kiến thức tương đối khó càng khiến cho q trình dạy - học gặp nhiều khó
khăn. Vậy làm thế nào để tạo hứng thú cho học sinh từ đó phát huy tính tích cực
và chủ động của các em với môn học luôn là câu hỏi tôi luôn trăn trở.
Xuất phát từ thực tiễn giảng dạy tại trường tôi thấy rằng, trong các tiết thực
hành ở phòng máy khi học sinh được giáo viên hướng dẫn viết và chạy được
một chương trình pascal để xem kết quả các em thường tỏ ra rất thích thú và
trong các tiết học sau thì tập trung học hơn kể cả các tiết lý thuyết và thực hành.
Tuy nhiên qua các năm giảng dạy tôi nhận thấy một thực trạng chung là khi các
em viết chương trình trên giấy hay trên máy tính mặc dù là tương đối đầy đủ các
câu lệnh nhưng vẫn mắc một số lỗi phổ biến. Điều này dẫn đến tâm lý chán nản
vì quá trình sửa lỗi có thể mất rất nhiều thời gian. Chính vì vậy để phần nào giúp
các em thuận lợi hơn trong q trình viết chương trình tơi chọn đề tài sáng kiến
kinh nghiệm của mình là "Một số kinh nghiệm giúp học sinh khắc phục lỗi
thường gặp khi viết chương trình bằng ngơn ngữ lập trình Pascal - Tin học
11".
1.2. Mục đích của sáng kiến
Giúp học sinh hạn chế việc sinh lỗi khi viết chương trình và khi mắc lỗi thì
khắc phục nhanh các lỗi phổ biến thường gặp. Từ đó tiết kiệm thời gian khi viết
một chương trình hồn chỉnh, tạo hứng thú và phát huy tính tích cực, sáng tạo
của các em với môn học.
1.3. Đối tượng nghiên cứu
Học sinh lớp 11 - Trường THPT Vĩnh Lộc.
1.4. Phương pháp nghiên cứu
- Khảo sát, phân tích, giải quyết vấn đề kết hợp giữa lí thuyết và thực hành.
- Kết hợp thực tiễn dạy học và giáo dục ở trường THPT Vĩnh Lộc


- Tham khảo các tài liệu về ngôn ngữ lập trình Pascal và tài liệu về sáng
kiến kinh nghiệm.
- Tham khảo ý kiến đóng góp của đồng nghiệp.
2. Nội dung sáng kiến kinh nghiệm
2.1. Cơ sở lí luận của sáng kiến kinh nghiệm
Trong bối cảnh toàn ngành Giáo dục và Đào tạo đang nỗ lực đổi mới
phương pháp dạy học theo hướng phát huy tính tích cực chủ động của học sinh
trong hoạt động học tập. Điều 24.2 của Luật giáo dục đã nêu rõ: “Phương pháp
giáo dục phổ thơng phải phát huy tính tích cực, tự giác, chủ động, sáng tạo của
học sinh, phù hợp với đặc điểm của từng lớp học, môn học; bồi dưỡng phương
pháp tự học, rèn luyện kỹ năng vận dụng kiến thức vào thực tiễn, tác động đến
tình cảm, đem lại niềm vui, hứng thú học tập cho học sinh”. Với một số nội
dung trong đề tài này, học sinh có thể thuận lợi, tự tin khi lập trình giải bài tốn

1


trên máy tính. Qua đó nâng cao khả năng tự học, tự rèn luyện thông qua một số
bài tập, dạng bài tập cụ thể.
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
Qua thực tế giảng dạy ở trường 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 bộ mơn này rất khó, vừa
phải tìm thuật tốn và đến khi viết chương trình phải nhớ hệ thống câu lệnh mà
yêu cầu phải đúng đến từng dấu chấm, dấy phẩy. Vì vậy học sinh thường gặp
khá nhiều lỗi khi lập trình giải các bài tốn , thậm chí có những lỗi các em mắc
phải nhiều lần do không hiểu nguyên nhân xuất hiện lỗi. Bên cạnh đó cũng có
một số lượng khơng nhỏ học sinh rất u thích tin học và thích tìm hiểu một số
bài toán, dạng toán mở rộng và nâng cao.
2.3. Các giải pháp đã sử dụng để giải quyết vấn đề
2.3.1. Một số lỗi thường gặp của học sinh trong lập trình Pascal:

2.3.1.1. Đặt tên sai quy tắc
- Trong ngôn ngữ lập trình Turbo Pascal, mọi đối tượng dùng trong chương
trình đều phải được đặt tên theo quy tắc. Tên là một dãy liên tiếp khơng q 127
kí tự bao gồm chữ số, chữ cái hoặc dấu gạch dưới và bắt đầu bằng chữ cái hoặc
dấu gạch dưới. (Trong Free Pascal thì tên có thể có tới 255 kí tự).
- Học sinh thường mắc lỗi đặt tên không đúng theo quy tắc của ngơn ngữ
lập trình Pascal. Các em thường đặt tên có dấu cách hay có thêm các kí tự khác,
ngồi các kí tự được phép đặt tên trong ngơn ngữ lập trình Pascal.
- Biện pháp khắc phục: Để khắc phục lỗi này ở học sinh thì giáo viên cần
kiểm tra lại thường xuyên qua các bài tập đọc – hiểu và phát hiện lỗi hoặc qua
các bài tập viết chương trình và nhắc nhở mỗi khi các em mắc phải lỗi này.
- Đặc biệt trong giờ thực hành, giáo viên có thể chủ động viết một chương
trình có khai báo một số tên không đúng quy tắc đặt tên của ngơn ngữ lập trình
Pascal rồi dịch chương trình để chỉ ra lỗi như: Error: Fatal: Syntax error, “;”
expected but “ordinal const” found.
- Ví dụ: Cho chương trình đơn giản sau
Program Vi du 1;
Begin
writeln(‘Xin chao lop A1’);
End;
Giáo viên chạy chương trình để học sinh xem thông báo lỗi và quay lại
chương trình yêu cầu học sinh tìm lỗi và khắc phục?
Tên chương trình sai quy tắc, có thể sửa thành Vidu1 hoặc Vi_du_1
Chương trình lỗi
Chương trình đúng
Program Vi du 1;
Program Vi_du_1;
Begin
Begin
writeln(‘Xin chao lop A1’);

writeln(‘Xin chao lop A1’);
End;
End;
2.3.1.2. Viết sai tên dành riêng và tên chuẩn
- Học sinh thường mắc lỗi viết sai các tên hoặc nhầm lẫn giữa tên dành
riêng và tên chuẩn trong khi viết chương trình..

2


- Biện pháp khắc phục: giáo viên yêu cầu học sinh nhớ chính xác các tên
dành riêng và tên chuẩn thường dùng trong chương trình. Ngồi ra, giáo viên
nên cài đặt phần mềm Free Pascal để hỗ trợ nhiều hơn cho học sinh trong việc
thực hành.
- Đặc biệt, trong các giờ thực hành, giáo viên có thể chuẩn bị trước một
chương trình có viết sai tên trong Pascal rồi dịch chương trình để chỉ ra cho học
sinh thấy lỗi Fatal: Syntax error.
2.3.1.3. Khai báo thiếu biến
- Khi viết chương trình nhiều khi học sinh chưa thể xác định được hết các
biến cần sử dụng trong chương trình nên thường khai báo thiếu biến.
- Biện pháp khắc phục: Trước khi viết chương trình nên yêu câu học sinh
xác định các biến cần sử dụng và kiểu dữ liệu của mỗi biến. Sau khi viết xong
mỗi chương trình, yêu cầu học sinh đọc lại chương trình để kiểm tra lại việc khai
báo và sử dụng các biến.
- Trong giờ thực hành có thể sử dụng chương trình dịch của Pascal để kiểm
tra việc khai báo biến cho chương trình. Nếu nhấn F9 mà có thơng báo compile
failed với lỗi Error: Indentifier not found “D” thì có nghĩa là có biến “D” đang
được sử dụng mà chưa khai báo.
- Học sinh cần bổ sung vào phần khai báo những biến trong chương trình
sử dụng mà chưa có trong phần khai báo.

- Ví dụ: Chương trình giải phương trình bậc hai trong Bài tập và thực hành
1, giáo viên có thể chiếu chương trình khai báo thiếu biến D, yêu cầu học sinh
xác định lỗi và sửa lỗi.
Chương trình lỗi
Chương trình đúng
Program Giai_PTB2;
Program Giai_PTB2;
uses crt;
uses crt;
Var a,b,c,x1,x2: real;
Var a,b,c,x1,x2,D: real;
Begin
Begin
clrscr;
clrscr;
writeln(‘a,b,c:’); readln(a,b,c);
writeln(‘a,b,c:’); readln(a,b,c);
D:=b*b-4*a*c;
D:=b*b-4*a*c;
x1:=(-b - sqrt(D))/(2*a);
x1:=(-b - sqrt(D))/(2*a);
x2:=-b/a - x1;
x2:=-b/a - x1;
writeln(x1:6:2, x2:6:2);
writeln(x1:6:2, x2:6:2);
readln;
readln;
END.
END.
2.3.1.4. Đặt tên biến trùng nhau

- Trong một chương trình viết bằng ngơn ngữ lập trình Pascal, mỗi đối
tượng có một tên và không phân biệt chữ hoa và chữ thường.
- Học sinh thường mắc sai lầm khi đặt tên các biến trùng nhau. Đặc biệt với
những chương trình có sử dụng nhiều biến tham gia, học sinh thường đặt một
biến có tên chữ thường, một biến có tên chữ in hoa mà không nhớ rằng trong
Pascal không phân biệt chữ hoa và chữ thường (ví dụ: var c, C:integer;)
- Biện pháp khắc phục: giáo viên cần kiểm tra lại thường xuyên và nhắc
nhở các em mỗi khi các em mắc phải lỗi này.
3


- Trong giờ thực hành, giáo viên có thể chủ động viết một chương trình có
khai báo một biến tên “c” và một biến tên “C” rồi dịch chương trình để chỉ ra lỗi
Error: Duplicate indentifier “c”.
2.3.1.5. Tràn số do không xác định được miền giá trị của biến
- Trong ngơn ngữ lập trình Pascal, mỗi kiểu dữ liệu có một miền giá trị xác
định. Vì vậy, khi khai báo biến phải xác định được miền giá trị của nó trong
chương trình.
- Học sinh thường chỉ nhớ kiểu dữ liệu mà không nhớ được miền giá trị của
các kiểu dữ liệu trong Pascal. Đặc biệt là với kiểu số nguyên, học sinh thường
khai báo kiểu integer mà không xác định miền giá trị của biến có thể nhận khi
thực hiện chương trình.
- Kết quả là chương trình vẫn dịch và chạy bình thường với bộ dữ liệu nhỏ
đưa vào, nhưng khi thực hiện chương trình với những bộ dữ liệu lớn thì chương
trình báo lỗi tràn số.
- Biện pháp khắc phục: giáo viên yêu cầu học sinh không chỉ nhớ kiểu dữ
liệu mà phải nhớ cả miền giá trị của từng kiểu dữ liệu trong Pascal.
- Ngoài ra, với mỗi chương trình, giáo viên yêu cầu học sinh xác định giá
trị mà biến có thể nhận khi thực hiện chương trình. Đặc biệt là với những bài tập
cho trước miền giá trị của dữ liệu vào thì giáo viên nên yêu cầu học sinh xác

định miền giá trị của dữ liệu ra.
- Ví dụ với bài tập viết chương trình tính và đưa ra màn hình diện tích hình
vng có cạnh a với giá trị nguyên nằm trong phạm vi từ 100 đến 200.
Cách 1
Cách 2
Program DT_hinh_vuong;
Program DT_hinh_vuong;
uses crt;
uses crt;
Var a: byte; S: Integer;
Var a: byte; S: word;
Begin
Begin
clrscr;
clrscr;
writeln(‘a:’); readln(a);
writeln(‘a:’); readln(a);
S:=a*a;
S:=a*a;
writeln(‘Dien tich= ‘,S:6);
writeln(‘Dien tich= ‘,S:6);
readln;
readln;
END.
END.
Học sinh sẽ thường viết chương trình theo hai cách khai báo như trên, cả
hai cách đều không sai nhưng để không mắc lỗi tràn số với các bộ test lớn thì
khai báo như cách 2 là hợp lí nhất để đạt điểm tối đa.
2.3.1.6. Gán kết quả phép chia cho biến kiểu số nguyên
- Trong ngôn ngữ lập trình Pascal, kết quả thực hiện của phép chia ln là

số thực. Vì vậy, ta khơng thể gán kết quả của phép chia cho biến kiểu số nguyên.
- Học sinh thường nhớ được cú pháp của phép chia trong Pascal mà không
để ý rằng kết quả của phép chia rất có thể là một số thực. Hậu quả là các em
thường mắc lỗi gán giá trị cho biến kiểu số nguyên bằng giá trị của phép chia.
- Biện pháp khắc phục: giáo viên yêu cầu học sinh có thể xác định giá trị
của phép chia, đồng thời yêu cầu các em nhớ phép chia lấy phần nguyên trong
Pascal.
4


- Trong các chương trình học sinh viết, mỗi khi học sinh gán kết quả phép
chia cho biến kiểu số nguyên thì giáo viên cần chỉ rõ cho học sinh thấy được giá
trị của phép chia ln có thể là một số thực và nếu có là số ngun thì trong
Pascal cũng khơng được phép gán kết quả phép tốn chia cho biến kiểu số
nguyên mà phải sử dụng phép chia lấy phần nguyên “div”.
- Trong giờ thực hành, giáo viên có thể viết chương trình có sử dụng phép
gán kết quả phép chia cho biến kiểu số nguyên rồi dịch chương trình để chỉ ra
lỗi Error: Incompatible types: got “Extended” expected “SmallInt”.
Ví dụ: trường hợp kết quả của phép chia là số nguyên ta phải dùng phép div
để gán kết quả cho biến kiểu nguyên như trong đoạn chương trình sau:
Var a, tuso, mauso: integer;
.....
a:=ucln(tuso,mauso);
tuso:= tuso div a;
mauso:= mauso div a;
.....
.3.1.7. Viết biểu thức mà chưa nhớ thứ tự thực hiện các phép toán
Thứ tự ưu tiên các phép tốn trong ngơn ngữ lập trình Pascal như sau:
- Lời gọi hàm
- Biểu thức trong ngoặc

- Toán tử NOT
- Toán tử đổi dấu: - * , / , div, mod
- + - or
- >=, >, <=, <, =, <>
Học sinh thường mắc lỗi khi viết biểu thức mà mẫu số chứa phép nhân
hoặc biểu thức lơgic có các biểu thức quan hệ liên kết với nhau bởi phép tốn
lơgic nhưng khơng sử dụng dấu ngoặc trịn cho các biểu thức quan hệ.
- Biện pháp khắc phục: giáo viên nên nhấn mạnh việc sử dụng dấu ngoặc
tròn cho các biểu thức để đảm bảo đúng thứ tự thực hiện các phép tốn có chứa
trong biểu thức.
- Đồng thời, giáo viên giới thiệu thêm cho học sinh biết độ ưu tiên của các
phép tốn lơgic cao hơn so với các phép tốn quan hệ (phép tốn lơgic được
thực hiện trước phép tốn quan hệ).
- Ngoài ra, trong giờ thực hành, giáo viên có thể chủ động viết chương trình
có sử dụng biểu thức lơgic mà khơng sử dụng dấu ngoặc trịn cho biểu thức quan
hệ rồi dịch chương trình để chỉ ra cho học sinh thấy lỗi Error: Incompatible
types: got “Boolean” expected “LongWord”.
- Ví dụ: Chương trình trong Bài tập và thực hành 2 có chứa biểu thức lơ
gic:
Chương trình lỗi
Chương trình đúng
.....
.....
If a2=b2+c2 or b2=a2+c2 or
If (a2=b2+c2) or (b2=a2+c2) or
c2=a2+b2 then
(c2=a2+b2) then
.....
.....
5



2.3.1.8. Thiếu dấu chấm phẩy hoặc đặt dấu chấm phẩy sai vị trí
- Trong ngơn ngữ lập trình Pascal, kết thúc mỗi câu lệnh đều có dấu chấm
phẩy, câu lệnh liền trước từ khóa else khơng có dấu chấm phẩy và sau từ khóa
end cuối cùng là dấu chấm.
- Học sinh thường mắc lỗi khi viết kết thúc câu lệnh mà khơng có dấu chấm
phẩy hoặc sử dụng dấu chấm phẩy trước từ khóa else.
- Biện pháp khắc phục: đối với mỗi bài tập học trên lớp giáo viên nên kiểm
tra và yêu cầu học sinh sửa hết các lỗi này trong chương trình của mình.
- Trong giờ thực hành giáo viên có thể viết chương trình có lỗi thiếu dấu
chấm phẩy hay sai lỗi dấu chấm phẩy trước từ khóa else rồi dịch chương trình
để chỉ ra lỗi Fatal Syntax error, “;” expected hay Fatal Syntax error, “;” expected
but else found.
2.1.3.9. Nhầm lẫn giữa phép gán và phép toán quan hệ bằng
- Trong ngơn ngữ lập trình Pascal, phép gán có cú pháp “:=” dùng để gán
giá trị cho biến bên trái bằng giá trị của biểu thức bên phải.
- Học sinh thường nhầm lẫn giữa phép gán với biểu thức quan hệ bằng bởi
vì các em quen với việc tính tốn trong các mơn học khác.
- Biện pháp khắc phục: giáo viên cần nói rõ ý nghĩa phép gán trong Pascal
là dùng để thay đổi giá trị của biến và nó là một câu lệnh. Cịn dấu “=” trong
Pascal là phép toán quan hệ bằng.
- Trong giờ thực hành, giáo viên có thể viết một chương trình mà thay phép
gán “:=” bởi phép toán quan hệ bằng “=” rồi dịch chương trình để chỉ ra lỗi
Error Illegal Expression.
2.3.1.10. Chạy chương trình mà khơng quan tâm đến kết quả
- Khi viết xong một chương trình, dịch thành cơng chương trình là có thể
chạy chương trình. Nhưng điều đó chưa khẳng định được là chương trình cho
kết quả đúng.
- Nhiều học sinh hiện nay chỉ viết chương trình mang tính đối phó mà

khơng cần quan tâm tới tính đúng đắn của chương trình.
- Hậu quả là trong các giờ thực hành, nhiều học sinh viết chương trình đến
khi chương trình chạy được là các em xem như đã hoàn thành u cầu của giáo
viên mà khơng biết rằng chương trình các em viết cho kết quả khơng đúng hay
vẫn cịn sai với một số bộ test.
- Biện pháp khắc phục: Để khắc phục tình trạng này ở học sinh thì mỗi khi
giao bài tập cho học sinh, giáo viên nên chuẩn bị trước các bộ test mẫu hoặc
hướng dẫn học sinh tìm bộ test tiêu biểu của một số bài toán đơn giản để yêu cầu
học sinh thực hiện chạy chương trình theo bộ test mẫu và đối chiếu kết quả.
2.3.1.11. Biến đếm, biến chỉ số là biến kiểu số thực
- Trong ngơn ngữ lập trình Pascal, biến đếm, biến chỉ số trong mảng
thường là biến kiểu số nguyên.
- Học sinh thường nắm cú pháp của câu lệnh trong Pascal không vững, dẫn
đến việc các em chỉ nhớ cú pháp câu lệnh mà không nhớ được ý nghĩa của các
thành phần trong câu lệnh. Hậu quả là các em sử dụng cả biến kiểu số thực làm
biến đếm hay biến chỉ số của mảng.

6


- Biện pháp khắc phục: giáo viên có thể chủ động viết một chương trình có
khai báo biến đếm và biến chỉ số của mảng là biến kiểu số thực rồi dịch chương
trình để chỉ ra lỗi Error: Ordinal expression expected và lỗi Error: Incompatible
types: got “Real” exptected “LongInt”.
Ví dụ:
Chương trình lỗi
Chương trình đúng
var S: integer; i: real;
var S: integer; i: integer;
begin

begin
for i:=1 to 100 do
for i:=1 to 100 do
if i mod 3=0 then S:=S+i;
if i mod 3=0 then S:=S+i;
writeln(‘S= ‘, S);
writeln(‘S= ‘, S);
End.
End.
2.3.1.12. Vòng lặp vô hạn
- Trong ngôn ngữ lập trình Pascal, biến đếm trong vịng lặp for được tăng
hoặc giảm một cách tự động hay vòng lặp while-do chỉ kết thúc khi điều kiện
lặp sai.
- Học sinh khi viết các chương trình có sử dụng vịng lặp lồng nhau mà
chưa phân tích rõ việc sử dụng các biến nên có em sử dụng cùng một biến cho
các vịng lặp lồng nhau. Bên cạnh đó, có những học sinh xác định điều kiện lặp
khơng chính xác làm cho điều kiện lặp trong vịng lặp while-do ln ln đúng.
Hậu quả là chương trình lặp vơ hạn mà khơng cho ra kết quả.
Ví dụ: Tính tổng S = 1k + 2k + …. + nk
Học sinh lập trình giải bài toán trên như sau:
.....
S:=0;
For i:=1 to n do
Begin
T:=1;
For i:=1 to k do
T:=T*i;
S:=S+T;
End;
Đoạn chương trình trên có thể lặp vơ tận khi kết thúc vịng lặp con i ln

nhận giá trị bằng k.
Biện pháp khắc phục: giáo viên nên yêu cầu học sinh phân tích rõ thuật
tốn, các biến được sử dụng trong chương trình cùng ý nghĩa của nó và chỉ cần
chú ý các vòng lặp lồng nhau phải sử dụng biến điều khiển khác nhau.
- Hay việc xác định điều kiện lặp phải được thay đổi trong vòng lặp đến
một lúc nào đó điều kiện đó phải sai để tránh lặp vô hạn.
- Trong giờ thực hành, giáo viên có thể viết một chương trình có vịng lặp
vơ hạn rồi dịch chương trình để chỉ ra cho các em thấy lỗi Error: Illegal
assignment to for-loop variable “a”.

7


2.3.1.13. Khai báo sai miền chỉ số cho dữ liệu kiểu mảng
Ví dụ 1: Nhập vào một mảng N số nguyên (N<= 100) 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;
- Biện pháp khắc phục: Lưu ý cho học sinh phân biệt giữa miền chỉ số và
giá trị phần tử trong mảng. 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 so với đề
bài.
N<100: số phần tử tối đa của mảng là 100 phần tử.
Các số lớn hơn 3 và nhỏ hơn 100: kiểu dữ liệu của các phần tử ( byte)
Khai báo đúng mảng a sẽ là:
ar a: array[1..100] of byte;
2.3.1.14. 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. Vì vậy hàm trên
được sửa lại như sau:
Function GT(n : integer) : Longint ;
Var i, t : integer ;
Begin
t:=1;
For i := 2 to n do t := t*i ;
GT:=t;
End ;
2.3.2. Một số dạng bài tập luyện tập
2.3.2.1. Bài tập về khai báo biến:
Bài 1: Cho đoạn chương trình sau trong chương trình tính chu vi và diện
tích tam giác có độ dài ba cạnh a, b, c nguyên.

C:=a+b+c;
P:=C mod 2;
S:=sqrt(p(p-a)(p-b)(p-c));

8



? Đoạn chương trình trên có lỗi cú pháp nào khơng?
? Khai báo biến cho chương trình trên.
- Một số lỗi trong đoạn chương trình:
Đặt tên biến trùng nhau (C và c)
P phải là biến số thực nên không sử dụng phép mod.
Trong biểu thức tính S thiếu dấu nhân (*)
- Đoạn chương trình sửa lại:

Cv:=a+b+c;
P:=Cv / 2;
S:=sqrt(p*(p-a)*(p-b)*(p-c));

- Khai báo biến:
Var a, b, c, Cv: integer;
P,S: real;
Tùy thuộc vào thời lượng tiết dạy giáo viên có thể chạy thử chương trình để
học sinh thấy rõ thơng báo lỗi hoặc u cầu học sinh hồn thiện chương trình.
Bài 2: Trong một chương trình đã chạy tốt, khi thực hiện khơng có lỗi có
một số lệnh như sau:
…..
s:= ‘n’;
J:=sqr(n);
If ch = ‘Ok’ then ch:= ‘It is’ + ch;
…..
While kt and (i<=j) do
Begin
Kt:=Not(n mod i=0);-X:=1.5*j+i;
End;
Hãy viết phần khai báo biến cho đoạn chương trình trên.

Với dạng bài tập này, ta căn cứ vào các câu lệnh đã cho để viết phần khai
báo biến cho chương trình trên như sau:
Var n, i, j : integer;
X : real;
Kt : boolean;
s : char ; ch : string;
Tuy nhiên ta cũng có nhiều cách để khai báo biến ví dụ biến s có thể thuộc
kiểu string; j có thể thuộc kiểu real,…
Bài 3: Khai báo biến cho đoạn chương trình sau:

Begin
Writeln(‘Nhap n (n<250)’); Readln(n);
For i:=1 to n do readln(a[i]);
D:=0;
For i:=1 to n do
9


If a[i] =k then d:=d+1;
Writeln(d);

- Biến n,i, d cùng kiểu dữ kiệu nguyên.
Các phần tử của mảng A và k có cùng kiểu dữ liệu là nguyên hoặc thực.
- Có thể khai báo biến như sau:
Var n,i,d: integer;
K: real;
A:array[1..250] of real;
Hoặc khai báo:
Var n,i,d: integer;
K: integer;

A:array[1..250] of integer;
2.3.2.2 Bài tập về sửa lỗi chương trình:
Đối với bài tập này, giáo viên yêu cầu nhận xét chương trình đã viết đúng
về mặt cú pháp hay chưa, sau khi thực hiện chương trình có cho kết quả đúng
hay chưa, có đúng đối với tất cả các trường hợp hay không?
Bài 1: Sửa các lỗi cú pháp cho chương trình tính diện tích hình trịn có bán kính
r là số ngun (0Program vi du 1;
Cont pi=3.14;
Var r,s: integer;
Begin
Writeln(‘Nhap ban kinh r=’); Readln(r);
S:=pi*r*r;
Writeln(‘Dien tich hinh chu nhat ‘,s:8:2);
And.
Một số lỗi trong chương trình:
- Tên chương trình sai quy tắc vì có chứa dấu cách Vi du 1 (có thể sửa
thành vi_du_1)
- Sai một số tên: cont (const), And (end)
- Kiểu dữ liệu của biến chưa thích hợp (r: byte; s: real).
Chương trình đúng:
Program vi_du_1;
Const pi=3.14;
Var r: byte; s: real;
Begin
Writeln(‘Nhap ban kinh r=’); Readln(r);
S:=pi*r*r;
Writeln(‘Dien tich hinh chu nhat ‘,s:8:2);
End.
Bài 2: Cho chương trình giải phương trình bậc hai ax 2 + bx +c=0 (a<>0)

được soạn sẵn như sau:
Program giaiptb2;
Var a,b,c,d,x1,x2:real;
10


Begin
Write('Nhap các he so a,b,c'); readln(a,b,c);
d:=b*b-4*a*c;
If d<0 then Writeln('Phuong trinh co nghiem kep: x=',-b/(2*a):4:2);
Else
If d=0 then Writeln('Phuong trinh vo nghiem');
Else
Begin
x1= (-b+sqrt(d))/2*a;
x2= (-b-sqrt(d))/2*a;
Write('Phuong trinh co hai nghiem: ‘);
Writeln(‘ x1=',x1:4:2,' va x2=',x2:4:2);
End;
Readln;
End.
Giáo viên chạy chương trình trên để học sinh quan sát các thơng báo lỗi,
sau đó quay lại chương trình và yêu cầu học sinh sửa các lỗi cú pháp như:
- Trước else có dấu chấm phẩy.
- Nhầm lẫn giữa câu lệnh gán và phép so sánh bằng trong biểu thức.
- Viết thiếu dấu ngoặc tròn để phân biệt thứ tự các phép tốn trong biểu
thức tính x1, x2.
Khi đã sửa hết lỗi cú pháp, cho học sinh đề xuất bộ test tiêu biểu để kiểm tra
tính đúng đắn của chương trình.
Ví dụ (1,2,1); (1,1,1); (2,3,1)

Kiểm thử chương trình với ba bộ test trên thì học sinh sẽ phát hiện ra hai
trong ba trường hợp kết quả bị sai do quá trình kiểm tra điều kiện của d đã
ghi ra kết quả sai. Yêu cầu học sinh sửa lỗi và chạy chương trình.
Chương trình đúng:
Program giaiptb2;
Var a,b,c,d,x1,x2:real;
Begin
Write('Nhap các he so a,b,c'); readln(a,b,c);
d:=b*b-4*a*c;
If d=0 then Writeln('Phuong trinh co nghiem kep: x=',-b/(2*a):4:2)
Else
If d<0 then Writeln('Phuong trinh vo nghiem')
Else
Begin
x1:= (-b+sqrt(d))/(2*a);
x2:= (-b-sqrt(d))/(2*a);
Write('Phuong trinh co hai nghiem: ‘);
Writeln(‘ x1=',x1:4:2,' va x2=',x2:4:2);
End;
Readln;
End.
11


Bài 3: Để 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 vd3;
Uses crt;
Var a,b,c:interger;
Begin

Clrscr;
Write(‘nhap vao 3 so:’);
Readln(a,b,c);
If aElse
If aWrite(‘So lon nhat la:’,a);
Readln;
End.
Chương trình trên cho đáp số lúc đúng, lúc sai tuỳ thuộc vào a,b,c. Hãy giải
thích tại s 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
aa3
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
a

a5
4
7
F
T
(5<4)
(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 vd3_1;
Uses crt;
Var a,b,c:integer;
Begin
Clrscr;
Write(‘nhap vao 3 so:’);
Readln(a,b,c);
If aBegin
If bEnd
Else
12


If aWrite(‘So lon nhat la:’,a);
Readln;

End.
2.3.2.3. Bài tập về đọc hiểu chương trình:
Loại bài tập này sẽ giúp phát triển tư duy, giúp học sinh hiểu bài, nhất là
khi dạy các cấu trúc lệnh. Đối với dạng bài tập này, giáo viên nên hướng dẫn các
em thực hiện tuần tự từng câu lệnh cụ thể.
Bài 1: Cho biết chương trình sau thực hiện việc gì:
Var a, b: real;
Begin
Writeln(‘ Nhap a,b:’);
Readln(a,b);
If a= 0 then
If b=0 then writeln(‘Phuong trinh co vo so nghiem’)
Else writeln(‘Phuong trinh vo nghiem’)
Else writeln(‘Phuong trinh co nghiem duy nhat’,-b/a);
Readln
End.
Sau khi đọc chương trình trên học sinh có thể nhận biết được ý nghĩa của
nó là dùng để giải phương trình bậc nhất ax+b=0.
Bài 2: Cho biết kết quả khi thực hiện chương trình sau:
Program bai2;
Uses crt;
Var i ,n: integer; s: longint;
A:array[1..250] of integer;
Begin
Begin
Writeln(‘Nhap n ’); Readln(n);
For i:=1 to n do readln(a[i]);
S:=0;
For i:=1 to n do
If a[i] mod 2 <>0 then s:=s+a[i];

Writeln(s);
End;
Readln;
End.
Dựa vào câu lệnh If a[i] mod 2 <>0 then s:=s+a[i]; học sinh có để suy
đốn được chương trình trên thực hiện việc tính tổng các số lẻ trong dãy số.
Bài 3: Cho biết kết quả khi thực hiện chương trình sau:
Var S: longint;
a,b,c,d: word;
Function gt(x: word): longint;
Var i: word; t: longint;
Begin
13


T:=1;
For i:=2 to x do t:=t*i;
gt:=t;
End;
Begin
Writeln(‘Nhap bon so nguyen duong a,b,c,d’); Readln(a,b,c,d);
S:=gt(a) + gt(b) +gt(c) +gt(d);
Writeln(s);
Readln
End.
Trước hết yêu cầu học sinh nêu ý nghĩa của hàm gt. Từ đó kết quả sau khi
thực hiện chương trình là tính tổng S=a! + b!+c!+d!.
2.3.2.4. Bài tập về viết thuật toán, viết chương trình theo thuật tốn đó:
Một bài tốn có thể có nhiều cách giải khác nhau ứng với mỗi cách giải ta
có một thuật tốn. Để giúp học sinh có khả năng nhanh chóng nắm được ý tưởng

của người khác cần luyện cho các em biết giải bài toán theo một thuật toán đã
được trao đổi. Khả năng hiểu được nhanh ý tưởng của người khác cũng chính là
yêu cầu trong hoạt động nhóm. Phát triển khả năng này là phát triển một phẩm
chất tư duy quí báu để các em biết hợp tác trong công việc, một trong những yêu
cầu của người lao động, sáng tạo trong thời đại mới, thời đại mà một sản phẩm
là sự kết tinh lao động của nhiều người.
Trong nhiều trường hợp tưởng như không cần thuật toán cụ
thể học sinh vẫn viết được chương trình. Thực tế thuật tốn đó khơng được viết
ra nhưng đã hình thành sẵn trong đầu người viết.
Với đa số học sinh hiện nay, cần phải dành một lượng thời
gian thích hợp để rèn luyện loại bài tập này. Phải làm sao cho việc viết thuật
toán trở thành kĩ năng để khi các em lập trình trên máy, tuy khơng cần viết thuật
tốn ra song các em có thể hình dung được thuật tốn đó trong đầu. Cần phải tạo
cho các em có ý thức khi viết một chương trình Pascal là phải tn thủ theo trình
tự sau:
Bài tốn Xây dựng thuật tốnViết chương trình
Bài 1: Viết chương trình tìm giá trị nhỏ nhất của dãy số nguyên A gồm N phần
tử (N< 250).
Yêu cầu học sinh viết thuật toán và từ thuật toán viết thành chương trình
hồn chỉnh .
Với bài tốn này học sinh có thể thực hiện được dựa vào bài tốn tìm max
đã thực hiện trước đó.
Thuật toán:
Bước 1: Nhập N và dãy a1, a2, ..., aN.
Bước 2: Min <-- a1, i <-- 2;
Bước 3: Nếu i > N thì đưa ra giá trị Min rồi kết thúc;
Bước 4: Nếu ai < Min thì Min <-- ai;
Bước 5: i <-- i + 1 rồi quay lại Bước 3;
14



Chương trình
Program tim_min;
Var i,n,min, csmin: integer;
A: array[1..250] of integer;
Begin
Writeln(‘Nhap n=’); Readln(n);
For i:=1 to n do
Begin
Writeln(‘nhap phan tu thu’,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(‘min=’,min,’csmin=’,csmin);
Readln
End.
Bài 2: Lập chương trình cắt bỏ các kí tự trống thừa của một xâu cho trước. Hãy
viết chương trình theo thuật tốn sau:
Bước 1: i := 1; Tword := ‘’; XauM:= ‘’;
Bước 2: Kiểm tra xau[i] <> ‘ ’. Nếu đúng thì đến bước 3,
sai đến bước 5.
Bước 3: Tword := Tword + xau[i] ;
Bước 4: Kiểm tra I <= length(xau). Đúng thì tăng i lên 1 và
quay lại bước 2; sai thì đến bước 8.
Bước 5: Kiểm tra Tword <> ‘’. Đúng thì xauM := xauM +
Tword+ ‘ ’ ; gán Tword = ‘’ và quay lại bước 4. Sai thì chuyển đến bước 6.

Bước 6: Kiểm tra Tword<> ‘’. Đúng thì gán
xauM:=xauM+Tword; sai thì xố kí tự trống ở vị trí length(xauM) của xauM.
Bước 7: gán xau:=xauM;
Bước 8: kết thúc.
Chương trình có thể được viết như sau:
Program xoatrang;
Uses crt;
Var xau, xauM, Tword:string;
I:byte;
Begin
Wrire(‘nhap vao mot xau ki tu’);readln(xau);
xauM:= ‘’;Tword:= ‘’;
for i:=1 to length(xau) do
if xau[i]<> ‘ ’ then Tword:=Tword+xau[i]
else
15


begin
if Tword<> ‘’ then xauM:=xauM+Tword+ ‘ ’;
Tword:= ‘’;
End;
If Tword <> ‘’ then xauM:=xauM+Tword
Else xau:=xauM;
Write(‘Xau sau khi xoa cac ki tu trang thua la:’,xau);
Readln;
End.
Tuy nhiên bài tốn trên ngồi cách giải trên ta có thể sử dụng thuật tốn
khác để giải. Thuật tốn như sau:
Bước 1: Xố các kí tự trống thừa ở đầu.

Sử dụng vòng lặp while: while xau[1]= ‘ ’ do delete(xau,1,1);
Bước 2: Xố các kí tự trống ở cuối.
Dùng vòng lặp: while xau[length(xau)]= ‘ ’ do delete(xau,length(xau),1);
Bước 3: xố các kí tự trống thừa giữa các từ.
Kiểm tra 2 kí tự liền kề nhau có hơn 1 kí tự trống thì xố kí tự trống.
While pos( ‘ ’,xau)<>0 do delete(xau,pos( ‘ ’,xau),1);
Học sinh có thể viết chương trình theo thuật tốn 2.
Bài 3: Viết chương trình đếm số lượng các số nguyên tố trong một dãy A gồm n
số nguyên dương được nhập từ bàn phím. (n< 100)
Ý tưởng:
Xây dựng hàm kiểm tra tính nguyên tố của một số ngun dương bất kì. Sau
đó duyệt lần lượt tất cả các phần tử của dãy A, nếu phần tử nào là số nguyên tố
thì tăng biến đếm lên một đơn vị.
Thuật toán kiểm tra số nguyên tố đã thực hiện ở lớp 10, có thể cho học sinh nêu
lại thuật tốn này.
Chương trình:
Program Mang;
const nmax=100;
Var A: array[1..nmax] of longint;
n,i:byte;
Function NguyenTo(X:longint):boolean;
var j:integer;
begin
NguyenTo := false;
for j:=2 to Trunc(sqrt(X)) do
If X mod j = 0 then exit; {thoat khoi chuong trinh con}
NguyenTo := X > 1; {Thuc chat: NguyenTo := true;}
end;
Begin
writeln(‘Nhap so luong phan tu cho mang’); readln(n);

d:=0;
for i:=1 to n do
Begin
16


readln(A[i]);
if nguyento(A[i]) then d:=d+1;
end;
Writeln(‘So luong phan tu co gia tri nguyen to trong day la: ‘, d);
readln
End.
Học sinh có thể có nhiều cách khác nhau để xây dựng hàm kiểm tra tính
nguyên tố của một số nguyên dương.
2.4. Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động giáo dục, với
bản thân, đồng nghiệp và nhà trường
Trong quá trình giảng dạy, kể cả tiết học trên lớp và trên phịng thực hành
tơi ln nhắc nhở học sinh về một số lỗi cơ bản mà các em thường mắc phải
đồng thời hướng dẫn các em cách khắc phục. Đặc biệt với mỗi bài đều lấy ví dụ
tiêu biểu về lỗi cơ bản, nhờ vậy các em đã dần hạn chế được lỗi khi viết chương
trình và khi gặp lỗi thì biết cách khắc phục. Các tiết học tin đã mang lại cho các
em hứng thú hơn, tính chủ động và tích cực cũng được phát huy. Kết quả thể
hiện rõ nhất ở sự tiến bộ của học sinh trong từng bài kiểm tra.
Dưới đây là kết quả học tập cuối năm mơn tin đối chứng giữa hai lớp có
trình độ tương đương ở hai năm học trước và sau khi áp dụng sáng kiến kinh
nghiệm:
Lớp 11B2 – Năm học 2018 – 2019
Giỏi
Khá
TB

Yếu - Kém
Lớp
Sĩ số
SL
%
%
SL
%
%
SL
%
12,
11 B3
49
7
14,3
36
73,5
6
0
0
2
Lớp 11A3 - Năm học 2019 - 2020
Giỏi
Khá
TB
Yếu - Kém
Lớp
Sĩ số
SL

%
%
SL
%
%
SL
%
11 A3
50
9
18
41
82
0
0
0
0
3. Kết luận, kiến nghị
3.1. Kết luận
Sáng kiến kinh nghiệm trên đây được đúc rút từ quá trình giảng dạy, học
tập và nghiên cứu của bản thân qua các năm học với mong muốn giúp học sinh
thuận lợi hơn trong quá trình học tập, khơi dậy hứng thú và phát huy tính tích
cực của các em trong các giờ học để đạt hiệu quả dạy học tốt nhất.
Do kinh nghiệm bản thân còn hạn chế, tơi rất mong nhận được sự đóng
góp ý kiến của đồng nghiệp để tơi tiếp tục hồn thiện hơn nội dung của sáng
kiến và việc áp dụng vào thực tiễn giảng dạy trong nhà trường mang lại kết qủa
cao nhất.
3.2. Kiến nghị
Đặc thù của mơn tin là q trình dạy học gắn liền với việc thực hành trên
máy tính, vì vậy kính mong nhà trường, các cấp quản lí quan tâm hơn, tạo điều

17


kiện và trang bị thêm hệ thống máy chiếu, máy tính để học sinh được tiếp cận
và tiếp thu kiến thức tốt nhất, nâng cao hiệu quả trong các tiết dạy.
XÁC NHẬN CỦA
Thanh Hóa, ngày 28 tháng 06 năm 2020
THỦ TRƯỞNG
Tôi xin cam đoan đây là sáng kiến kinh nghiệm của
mình viết, khơng sao chép nội dung của người khác.
ĐƠN VỊ
Người viết

Bùi Thị Vân

18