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

Một số lỗi cơ bản khi học ngôn ngữ lập trình của học sinh lớp 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 (143.13 KB, 16 trang )

MỤC LỤC
1: MỞ ĐẦU
1.1.Lý do chọn đề tài .................................................................................... 2
1.2.Mục đích nghiên cứu ................................................................................2
1.3.Đối tượng nghiên cứu................................................................................3
1.4.Phương pháp nghiên cứu ……………………...........................................3

2. NỘI DUNG SÁNG KIẾN KING NGHIỆM
2.1. Cơ sở lý luận .........................................................................................4
2.2.Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm……............4
2.3. Giải pháp sử dụng để giải quyết vấn đề ..………………………..
….............4
1) Khai báo biến chưa chính xác…………………….................................... 4
2) Không hiểu nguyên tắc làm tròn số đối với số thực………........................4
3) Khai báo sai miền chỉ số cho dữ liệu kiểu mảng………………….......... 5
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
5) Sử dụng dấu ; sai vị trí…………………… ...............................................5
6) Không phân biệt được hằng xâu và biến…………................................... .6
7) Tràn số do kết quả tính toán vượt quá giới hạn .………………………… 6
8) Sử dụng tên hàm làm biến cục bộ……………………………………….. 6
2.3.1 Một số kinh nghiệm dạy lập trình Pascal …........................................ ….7
1) Có nhiều dạng bài tập ........................................................................ ……7
2) Trình bày thuật toán, yêu cầu học sinh viết chương trình theo đúng thuật
toán đó ........................................................................................................9
3) Giải bài toán trong một trường hợp riêng, yêu cầu học sinh phát hiện thiếu
sót để từ đó hoàn thiện chương trình .......................................................10
4) Phân chia một bài toán thành nhiều bài toán nhỏ ................................... 11
5) Sửa lỗi chương trình .………………………………………………..…. 11
2.3.2.Một số bài tập tham khảo ………………….………………………........12
2.3.3.Kết quả nghiên cứu .............................................................................15
2.4. Hiệu quả sáng kiến kinh nghiệm.........................................................……14



3. KẾT LUẬN
DANH MỤC TÀI LIỆU THAM KHẢO ......................................................16

1


1: MỞ ĐẦU
1.1. Lý do chọn đề tài :
- Trong những năm gần đây sự bùng nổ và phát triển thong tin đã khiến
cho nhận thức về vấn đề tin học trở nên khác đi rất nhiều. Nhiều quốc gia trên
thế giới ý thức được rất rõ tầm quan trọng của tin học và có những đầu tư lớn
cho lĩnh vực này, như Trung Quốc, Ấn Độ và các nước láng giềng của chúng ta,
đặc biệt trong giáo dục nâng cao dân trí về tin học và đào tạo nguồn nhân lực có
chất lượng cao. Người Việt Nam có nhiều tố chất thích hợp với ngành khoa học
này.
- Nhưng cái gì cũng có những bắt đầu và khó khăn của nó. Với học sinh
của chúng ta tin học còn là một môn học mới mẻ. Nên ta phải xác định đối
tượng của chúng ta là những cá thể như thế nào trong giảng dạy. Ví dụ: với học
sinh lớp 1 mới chỉ đọc thông viết thạo và còn bỡ ngỡ với các phép tính có nhớ
thì đề toán như thế này: “ Cho một dãy gồm các số 78, 54, 37, 95, 46. Hãy
khoanh vào đầu chữ cái có số nhỏ nhất.
A: 46
B: 31
C:37
D:95
Các em rất dễ rơi vào trường hợp chọn phương án B vì trong 4 đáp án thì
đáp án B có giá trị nhỏ nhất. Nhưng thực tế giá trị trong đáp án B lại không tồn
tại trong dãy số.
Và học sinh lớp 11 của chúng ta cũng thuộc đối tượng như thế đối với môn

tin học. Tuy nhiên có những học sinh qua phần bài toán và thuật toán của
chương trình lớp 10 đã có những bước đột phá về tư duy trong ngôn ngữ lập
trình. Nhưng số đó là không nhiều nếu không muốn nói là rất ít. Trong khi đối
tượng của chúng ta hầu hết là không thể. Có những em có thể lập trình giải được
một số bài toán đơn giản nhưng khi đề nghị trình bày thuật toán thì lại không
thể, từ đó dẫn đến
+ Học sinh thường gặp khó khăn khi xác định bài toán.
+ Khó liên hệ phương pháp giải một bài toán trong toán học với thuật giải
trong tin học.
- Tuy nhiên mọi thứ điều có điểm khởi đầu của nó, với học sinh việc học
ngôn ngữ lập trình và mô phỏng bằng Turbo Pascal là khởi đầu cho việc tiếp cận
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,
các máy tự động thay vì việc giải một bài toán bằng việc giải một hệ thống bài
toán… Qua đó giúp các em có thêm một định hướng, một niềm đam mê về tin
học, về nghề nghiệp mà các em chọn sau này.
- Xuất phát từ cơ sở trên, tôi đã chọn đề tài “Một số lỗi cơ bản khi học
ngôn ngữ lập trình của học sinh lớp 11”.
1.2. Mục đích nghiên cứu:
- Qua những năm giảng dạy tại trường THPT Hà Trung tôi đã thấy phần
đông các em gặp khó khăn khi học ngôn ngữ lập trình và cài đặt chương trình để
giải các bài toán trong tin học và các em thường mắc rất nhiều lỗi và có những
lỗi các em không thể lý giải nguyên nhân vì sao. Vì vậy trong nội dung đề tài
2


này tôi nêu ra một số lỗi phổ biến các em thường mắc phải và cách sửa các lỗi
này.
- Tuy vậy, đối với đối tượng học sinh khá giỏi, đa phần các em rất hào
hứng với việc học lập trình, cụ thể là ngôn ngữ lập trình Turbo Pascal. Do đó

trong đề tài này tôi cũng trình bày thêm một số lưu ý cũng như kinh nghiệm dạy
lập trình Pascal đề giúp học sinh có thể hiểu bài một cách nhanh chóng, nắm
chắc kiến thức và kĩ năng lập trình Pascal và một số ví dụ mở rộng, nâng cao với
đối tượng học sinh này.
1.3. Đối tượng nghiên cứu:
- Đối tượng nghiên cứu: học sinh các lớp 11K, 11H trường THPT Hà Trung
năm học 2016-2017.
- Kế hoạch nghiên cứu: trực tiếp qua các bài dạy.
- Phạm vi nghiên cứu: toàn bộ chương trình tin học lớp 11.
1.4. Phương pháp nghiên cứu
Qua thực trạng những sai sót cơ bản khi các em học ngôn ngữ lập trình.
Hầu như các khóa học đều phàn nàn về khó khăn khi học môn tin học lớp 11.
Tôi đưa ra một bài test về ý kiến và những vướng mắc các E thường gặp phải.
Thuật toán và giải toán có khác nhau gì. Bài toán làm được bằng ngôn ngữ tự
nhiên có thể giải bằng tin học không. Nếu các Em hướng dẫn một người chưa
biết giải toán các em sẽ hướng dẫn ngường đó giải một dạng bài toán như thế
nào

3


2: NỘI DUNG SÁNG KIẾN KINH NGHIỆM
2.1. Cơ sở lí luận:
- Thông tư 14/2002/TT - BGD&ĐT ngày 1/4/2002 về việc hướng dẫn
quán triệt chủ trương đổi mới giáo dục phổ thông.
- Nhiệm vụ các năm học của Bộ GD & ĐT nhằm đẩy mạnh chương trình
phát triển nguồn nhân lực CNTT và các đề án dạy Tin học ứng dụng CNTT và
truyền thông.
- 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”. Như vậy, chúng ta
có thể thấy định hướng đổi mới phương pháp dạy học đã được khẳng định,
không còn là vấn đề tranh luận. Cốt lõi của việc đổi mới phương pháp dạy học ở
trường phổ thông là giúp học sinh hướng tới việc học tập chủ động, chống lại
thói quen học tập thụ động. Với một số nội dung trong đề tài này, học sinh có thể
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ể.
1.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 Hà Trung 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ó.
- Các học sinh thường gặp khá nhiều lỗi khi viết một chương trình trong
ngôn ngữ lập trình Pascal.
- Tuy nhiên cũng có một số lượng không nhỏ học sinh rất yêu thích tin học
và thích tìm hiểu một số bài toán, dạng toán ngoài phạm vi sách giáo khoa.
2.3. Giải pháp sử dụng để giải quyết vấn đề
1)Khai báo biến chưa chính xác
Ví dụ: Khai báo biến về số học sinh của một lớp các em thường khai báo
biến kiểu nguyên hoặc kiểu thực “Integer” hoặc “real” điều này dẫn đến vùa tốn
bộ nhớ và cho dù có lý luận với máy tính bây giờ bộ nhớ đã phát triển rất nhiều.
Nhưng thực tế ta sẽ khó kiểm soát sự đúng đắn của kết quả vì: Số học sinh
không thể là số âm hay không thể có 0.5 học sinh.
2) Không hiểu nguyên tắc làm tròn số đối với số thực.
Trong toán học:

8
2

3
3



2
2
2
2

Tuy nhiên trong Pascal biểu thức sau sẽ cho kết quả sai:
4


If 8/sqrt(2)=2/sqrt(2)+3/sqrt(2)+3/sqrt(2) then write(‘Dung!’) else
write(‘sai!’);
Khi thực hiện vế trái máy tính chỉ tính sai số 1 lần, còn vế phải chịu sai số
3 lần. Do đó kết quả khi thực hiện là không giống nhau. Đây chỉ là 1 nguyên
nhân khiến cho quá trình tính toán gần đúng trên máy tính thành tính toán sai.
Để tránh điều này bạn nên tuân thủ theo các qui tắc dưới đây:
- So sánh bằng nên dùng biểu thức a  b  
Const e=0.0001;
….
If abs(a-b)Quá trình tối ưu tính toán biểu thức của ngôn ngữ có thể làm ảnh hưởng đến
kết quả của phép toán. Trong Pascal chỉ ép được qua lại các kiểu nguyên mà
không cho ép từ kiểu thực sang kiểu nguyên và ngược lại. Để chuyển từ kiểu
thực sang kiểu nguyên ta dùng hàm Round hoặc Trunc
3) 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 số nguyên gồm các số lớn hơn 25 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[25..100] of integer;
4) Dùng cùng tên biến điều khiển cho các vòng lặp for lồng nhau.
Ví dụ 3: 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 luôn
nhận giá trị bằng k.
Để khắc phục lỗi này, 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.
5) Sử dụng dấu (;) sai vị trí.
5


- 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ả.
6) 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.
7) Tràn số do kết quả tính toán vượt quá giới hạn.
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
8) 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.

6



2.3.1.Một số kinh nghiệm dạy lập trình Pascal:
1) Có nhiều dạng bài tập:
Khi dạy lập trình nói chung và Pascal nói riêng, nhiều khi người dạy chỉ
chú ý tới các bài tập về lập trình mà không nghĩ rằng trong những bước đầu để
học sinh hiểu bài cần phải đưa ra nhiều dạng bài tập, trong số các dạng bài tập
đó ở đây ta có thể nêu ra một số dạng như sau: bài tập về viết thuật toán, bài tập
về đọc hiểu chương trình, bài tập về sửa lỗi chương trình,…
Bài tập về viết thuật toán:
- Theo định nghĩa trong sách giáo khoa Tin học 10, thuật toán là một dãy
hữu hạn các thao tác được sắp xếp theo một trình tự xác định, sao cho sau khi
thực hiện dãy thao tác ấy từ INPUT ta nhận được OUTPUT. Nói cách khác,
trình bày thuật toán tức là chỉ ra các bước cần thực hiện để đi đến kết quả.
- Việc trình bày thuật toán trước khi viết chương trình là hết sức quan trọng.
Thuật toán đúng thì chương trình mới có khả năng đúng, còn một thuật toán sai
chắc chắn là cho một chương trình sai. Tuy nhiên đối với phần lớn học sinh lớp
11 thường bỏ qua bước này do tâm lý học sinh không thích các loại bài tập như
thế. Vì các em luôn nghĩ và hình thành thuật toán trong đầu và cài đặt vào
chương trình ngay. Nhưng 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
toán ra song các em có thể hình dung được thuật toá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 tuân thủ theo trình
tự sau:
Bài toán Xây dựng thuật toánViết chương trình
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 lệnh theo từng câu lệnh cụ thể.
Ví dụ1: Cho biết kết quả khi thực hiện chương trình sau:
Program vd1;

Uses crt;
Var i:integer;
Begin
Clrscr;
I:=7;
While i>1 do
Begin
If (i mod 2)<>0 then i:=i*3+1
Else i:=i div 2;
Writeln(i);
End;
7


Readln;
End.
Bài tập về sửa lỗi chương trình:
Ví dụ 2: Để 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 vd2;
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.
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=27,b=44,c=51
A
b
c
aa27
44
51 T (27<44)
44
Vậy số lớn nhất là 44 Kết quả sai
- a=51,b=44,c=27
A
b
c
aa51
44
27 F (51<44) T (51<27)
51
Vậy số lớn nhất là 51 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:’);
8


Readln(a,b,c);
If aBegin
If bEnd
Else
If aWrite(‘So lon nhat la:’,a);
Readln;
End.
Bài tập về khai báo biến:
Ví dụ 3: 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:
…..
Ok:= ‘n’;
J:=round(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;
ok:char;ch:string;
Tuy nhiên ta cũng có nhiều cách để khai báo biến ví dụ biến ok có thể thuộc
kiểu string; j có thể thuộc kiểu real,…
2) Trình bày thuật toán, yêu cầu học sinh viết chương trình theo đúng thuật
toán đó:
Một bài toá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 toá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
9


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.
Ví dụ 4: 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 toá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ì
xoá 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 vd4;
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
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 toán trên ngoài cách giải trên ta có thể sử dụng thuật toán khác để
giải. Thuật toán như sau:
- Bước 1: Xoá các kí tự trong thừa ở đầu.
Sử dụng vòng lặp while: while xau[1]= ‘ ’ do delete(xau,1,1);

10


- Bước 2: Xoá các kí tự trống ở cuối.
Sử dụng vòng lặp while: while xau[length(xau)]= ‘ ’ do
delete(xau,length(xau),1);
- Bước 3: xoá 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ì xoá 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 toán 2.
3) Giải bài toán trong một trường hợp riêng, yêu cầu học sinh phát hiện thiếu
sót để từ đó hoàn thiện chương trình:
Ví dụ 6: Viết chương trình đếm và in ra các số trong 1 xâu đã cho.
Cho đoạn chương trình giải quyết công việc trên như sau:
i:=1; dem:=0;
While i<=length(xau) do
Begin
If (xau[i]>= ‘0’) and (xau[i]<= ‘9’) then
Begin
xauM:= ‘’;
while (xau[i]>= ‘0’) and (xau[i]<= ‘9’) do
begin
xauM:=xauM+xau[i];
i:=i+1;
end;
dem:=dem+1;
val(xauM,a[dem],n);
i:=i-1;
End;
I:=i+1;

End;
Write(‘xau co ’,dem, ‘ so la:’);
For i:=1 to dem-1 do write(a[i], ‘,’);
Write(a[dem]);
Đố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 đã thực hiện
đúng hay chưa, có đúng đối với tất cả các trường hợp hay không?
Học sinh có thể phát hiện chương trình chỉ đúng với xâu chứa các số
thông thường, còn nếu xâu chứa số thực thị chương trình chưa cho kết quả đúng.
Từ nhận xét đó giáo viên hướng dẫn các em bổ sung và chỉnh sửa lại chương
trình.
11


4) Phân chia một bài toán thành nhiều bài toán nhỏ:
Trong thực tế. chúng ta thường gặp những vấn đề lớn mà với sức của một
người thì không thể giải quyết được. khi gặp những vấn đề như vậy, ta thường
nhờ bạn bè, người thân giúp một tay, mỗi người lo một phần việc.Khi giải một
bài toán, ta thường chia bài toán lớn ban đầu thành nhiều bài toán con để việc
giải bài toán ban đầu trở nên dễ dàng hơn, … Và như vậy, khi cần giải quyết
một vấn đề nào đó bằng máy tính, để viết một chương trình phức tạp ta có thể
viết từng phần chương trình giải quyết từng vấn đề nhỏ.
Như vậy, việc phân chia một bài toán thành nhiều bài toán nhỏ sẽ giúp
cho việc giải quyết bài toán mạch lạc, việc kiểm tra sai sót thuận tiện, có thể
thấy kết quả ở từng bước và có thể điều chỉnh kịp thời.
5) Sửa lỗi chương trình:
Trong khi lập trình việc giúp học sinh nhận ra lỗi sai và cách sửa các lỗi
đó là rất cần thiết và quan trọng. Để có thể sửa lỗi nhanh chóng cần có sự tích
luỹ kinh nghiệm những lỗi thường hay gặp

2.3.2.


Một số bài tập tham khảo:
Bài 1. Hệ đếm
Có một xe ôtô chở một cây gỗ vượt quá khổ cho phép, nguồn tin đầu tiên
cho biết: số của biển xe là số có 3 chữ số đối xứng.
( Một số có n chữ số trong một hệ đếm nào đó được gọi là đối xứng nếu chữ
số thứ 1 giống với chữ số thứ n, chữ số thứ 2 giống với chữ số thứ n - 1, ... ).
Sau đó cảnh sát nhận được thêm thông tin: Số biển số là một số nguyên
tố. Cảnh sát nhờ các em học sinh lớp 11K và 11H đưa ra sau phân tích các
nguồn tin và xác định tập các số có thể là số của biển số: biển số nếu viết trong
hệ nhị phân cũng là một số đối xứng. Nhờ vậy mà cảnh sát đã bắt đúng đối
tượng. Hãy cho biết các số mà các bạn học sinh lớp 11K và 11H đã xác định và
dự đoán đúng.
Ý tưởng:
Có thể có nhiều cách giải khác nhau nhưng tất cả đều cần phải giải quyết
các vấn đề:
- Kiểm tra xem một số có là số nguyên tố hay không?
- Tìm dạng biểu diễn nhị phân của một số.
- Kiểm tra một số có là đối xứng không?
- Chọn các số đối xứng (trong hệ thập phân) thích hợp để kiểm tra.
Chương trình:
PROGRAM BienSo;
Uses crt;
Var m,i,j,k,n,l:integer;
12


a,b: array[1..14] of integer;
Procedure ChuyenMa(i:integer);
Begin

i:=0;
while i<>0 do
begin
i:=i+1;
a[i]:=i mod 2;
i:=i div 2;
end;
End;
Function NgTo(i:integer):boolean;
var b:boolean;
j:integer;
Begin
b:=true; j:=1;
while (jbegin
j:=j+1;
if i mod j = 0 then b:=false;
end;
ngto:=b;
End;
Function DoiXung:boolean;
var b:boolean;
j:integer;
Begin
b:=true;
i:=1;
while (i<=l div 2) and b do
begin
if a[i]<>a[l-i+1] then b:=false
else i:=i+1;

end;
DoiXung:=b;
End;
BEGIN
clrscr;
b[1]:=1; b[2]:=3;
b[3]:=7; b[4]:=9;
13


for m:=1 to 4 do
for k:=0 to 9 do
begin
n:=101*b[m] + 10*k;
if ngto(n) then
begin
chuyenma(n);
if doixung then
begin
write('Bien so can tim: ',n:5,' Ma nhi phan la ');
for j:=1 to l do write(a[j]:2);
writeln;
end
else
writeln('So ngto doi xung nhung ma nhi phan khong doi xung ',n:5);

end;
end;
END.
Bài 2. Quan hệ

Có N người mang tên tương ứng là 1, 2, ..., N và tình trạng quen biết của
N người này được cho bởi mảng đối xứng A[1..N,1..N] trong đó A[i,j] = A[j,i] =
1 nếu i quen j và bằng 0 nếu i không quen j. Hãy xét xem liệu có thể chia N
người đó thành 2 nhóm mà trong mỗi nhóm hai người bất kì đều không quen
nhau?
Dữ liệu vào được cho bởi file QUANHE.INP trong đó dòng thứ nhất ghi
số nguyên dương N <= 100, trong N dòng tiếp theo, dòng thứ i ghi N số
A[i,1], ..., A[i,N].
Kết quả ghi ra file QUANHE.OUT như sau:
o Nếu không có thể , ghi dòng chữ KHONG THE
o Nếu có thể, ghi ra hai dòng, dòng thứ nhất tên những người thuộc
nhóm 1, dòng thứ hai tên những người thuộc nhóm 2.
Gợi ý:
Lập mảng QHE[1..N] khởi tạo mọi giá trị bằng 0. Bắt đầu chia nhóm từ
người thứ nhất cho tới người thứ N. Khi xét người thứ i, những khả năng sau có
thể xảy ra:
- Nếu QHE[i] = 0 (chưa được xếp nhóm) thì xếp vào nhóm 1(QHE[i] = 1)
và xếp những người j quen i vào nhóm 2 (cho QHE[j] =2).
- Nếu QHE[i] = 1 và trong số những người quen i có một người j mà
QHE[j] cũng bằng 1 thì kết luận không xếp được.
- Nếu QHE[i] = 2 và trong số những người quen i có một người j mà
QHE[j] cũng bằng 2 thì kết luận không xếp được.
14


2.4. Hiệu quả của sáng kiến kinh nghiệm
Sáng kiến kinh nghiệm là những gì ta đúc rút được qua quá trình giảng
dạy và thực nghiệm. Viết sáng kiến kinh nghiệm thường xuyên liên tục cũng là
nhiệm vụ chính trị của mỗi giáo viên, tuy nhiên cần phải lựa chọn phương pháp
nghiên cứu nhắm đến đối tượng nào và có phù hợp với nhà trường trung học phổ

thông. Sáng kiến kinh nghiệm đang trình bày của tôi dựa theo các luận cứ khoa
học hướng đối tượng, cụ thể: thuyết trình, quan sát, điều tra cơ bản, phân tích kết
quả thực nghiệm sư phạm,v.v… phù hợp với bài học và môn học.
2.4.1.Kết quả nghiên cứu:
- Bảng số liệu kết quả đạt được của học sinh lớp 11 năm học 2015-2016
khi chưa thực hiện đề tài:
STT Lớp
Sỉ số Đạt yêu cầu Không đạt yêu cầu
1
11K
45
88%
12%
2
11H
46
62.5%
37.5%
- Khi thực hiện thực nghiệm qua các đối tượng học sinh đã nêu trên, đa số
các em tránh được các lỗi thường gặp khi học lập trình Pascal.
- Một số không ít học sinh có tiến bộ rõ rệt khi viết các chương trình có sử
dụng lập trình có cấu trúc.
- Nâng cao việc yêu thích học tin học đối với một bộ phận học sinh và
một số em có định hướng nghề nghiệp sau này.
- Bảng số liệu kết quả đạt được của học sinh lớp 11 năm học 2016-2017
sau khi thực hiện đề tài:
Lớp

Số học sinh khảo sát


Kết quả từ TB trở lên
Đầu năm

Học kì I Cuối năm

11K

45

36

42

45

11H

46

38

44

46

3. KẾT LUẬN
Nội dung của đề tài này, hướng tới việc giúp cho việc học ngôn ngữ lập
trình nói chung và Pascal nói riêng của học sinh được tốt hơn và tránh được
những lỗi cơ bản khi lập trình.
Trên đây là những kinh nghiệm của tôi qua những năm dạy ở khối lớp 11

trường THPT Hà Trung và tham khảo qua một số nguồn thông tin, tư liệu khác
nhau, rất mong được sự đóng góp của các đồng nghiệp nhằm giúp đề tài của tôi
được hoàn thiện thêm.
15


TÀI LIỆU THAM KHẢO
1) Hồ Sĩ Đàm (chủ biên)- Sách giáo khoa, sách giáo viên tin học lớp 11
2) Quách Tuấn Ngọc - Ngôn ngữ lập trình Pascal
3) Các bài tập tham khảo ở đĩa CD “100 bài toán-tin”
XÁC NHẬN CỦA THỦ TRƯỞNG

Thanh hóa, ngày 07 /05/ 2018

ĐƠN VỊ

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.

NGUYỄN TUẤN BẰNG

16