Tải bản đầy đủ

SKKN 2017-2018 BỒI DƯỠNG HSG MÔN TIN HỌC 9-Trần Minh Thọ

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

Độc lập - Tự do - Hạnh phúc
Ninh Hòa, ngày 4 tháng 4 năm 2018
Kính gửi: Hội đồng Xét duyệt sáng kiến thị xã
BÁO CÁO SÁNG KIẾN KINH NGHIỆM NĂM 2018

ĐỀ TÀI: “Một số kinh nghiệm bồi dưỡng học sinh giỏi môn tin học 9”
Họ tên người thực hiện: Trần Minh Thọ
Chức vụ, đơn vị công tác: Giáo viên, trường THCS Trần Quang Khải.
Trình độ chuyên môn: Đại học sư phạm vật lý, tin học
Thời gian thực hiện SKKN: 3 năm
I. ĐẶT VẤN ĐỀ
1. Lý do chọn đề tài
Môn tin học ở trường phổ thông trang bị cho học sinh những hiểu biết cơ bản
về công nghệ thông tin và vai trò của nó trong xã hội hiện đại. Môn học này giúp học
sinh bước đầu làm quen với phương pháp giải quyết vấn đề theo quy trình công nghệ
và kĩ năng sử dụng máy tính phục vụ học tập và cuộc sống. Tin học có ý nghĩa to lớn
đối với sự phát triển trí tuệ, tư duy thuật toán, góp phần hình thành học vấn phổ thông
cho học sinh.
Bồi dưỡng học sinh giỏi là một trong những phong trào mũi nhọn của trường

và của Thị xã, Có học sinh giỏi các cấp nhất là học sinh giỏi Thị xã, Tỉnh. Giáo viên
mới thấy được sự thành công của mình trong sự nghiệp giáo dục và sự tiến bộ nghề
nghiệp đối với xã hội.
Việc bồi dưỡng học sinh giỏi tin học 9 (ngôn ngữ lập trình Pascal) có nét đặc
trưng riêng, không giống như các môn học khác. Trong 10 năm tham gia bồi dưỡng
học sinh giỏi cấp trường và 4 năm tham gia bồi dưỡng học sinh giỏi cấp Thị xã đi thi
học sinh giỏi cấp Tỉnh, tôi xin nêu lên một số kinh nghiệm của mình.
2. Thực trạng
- Thuận lợi
Được sự quan tâm chỉ đạo Phòng giáo dục và đào tạo, Ban giám hiệu nhà trường.
Giáo viên giảng dạy có nhiều kinh nghiệm và có tâm huyết với công tác bồi dưỡng
học sinh giỏi.
Nhà trường trang bị đủ máy vi tính để học sinh thực hành.
- Khó khăn


Các em chưa được học tin học từ các lớp 6, 7, 8. (nhà trường không tổ chức dạy
tin học)
Một số phụ huynh học sinh chưa thật sự quan tâm.
Môn tin học được xem là môn tự chọn nên nhiều học sinh còn xem nhẹ.
Các kiến thức về môn Pascal được học ở trường Cao Đẳng Sư Phạm chỉ đủ để dạy
chương trình bình thường. Muốn bồi dưỡng học sinh giỏi được tốt thì giáo viên cần
phải tìm tòi, học hỏi thêm rất nhiều.
1. Thực trạng:
Hằng năm, Sở và Phòng giáo dục đào tạo đều tổ chức thi học sinh giỏi môn tin học
cấp thị xã, cấp Tỉnh. Hội đồng đội tổ chức thi tin học trẻ không chuyên cấp thị xã và
cấp Tỉnh.
Trước đây, thi học sinh giỏi môn tin học chỉ có 3 trường có học sinh dự thi là
THCS Hùng Vương, THCS Đinh Tiên Hoàng, THCS Quang Trung. Sau đó, có thêm
học sinh trường THCS Trần Quang Khải tham gia và tôi là giáo viên bồi dưỡng các em
học sinh giỏi môn tin học.
Giáo viên rất có tâm huyết với phong trào bồi dưỡng học sinh giỏi nói chung và
môn tin học nói riêng nên chúng tôi đã khắc phục những khó khăn nêu trên vẫn tổ
chức bồi dưỡng học sinh giỏi môn tin học.
II.GIẢI QUYẾT VẤN ĐỀ
1. Cơ sở lý luận
Nhiệm vụ và mục tiêu phát triển tổng quát đặt ra cho Giáo dục - Đào tạo trong giai
đoạn hiện nay là “nâng cao dân trí, đào tạo nhân lực, bồi dưỡng nhân tài ”.
Đội ngũ giáo viên là đội ngũ cốt cán biến mục tiêu Giáo dục - Đào tạo thành hiện
thực, giữ vai trò quyết định chất lượng và hiệu quả đào tạo giáo dục. Đa số giáo viên
hiện nay là những người có tâm huyết, tận tụy với nghề có tinh thần cầu tiến học hỏi
luôn hy sinh cho sự nghiệp Giáo dục. Do đó việc dạy học có chất lượng giáo dục nói
chung và học sinh giỏi nói riêng là việc quyết định quan trọng nhất của giáo viên.
Học sinh có nhiệm vụ tiếp thu và vận dụng kiến thức vào thực tiễn vừa nâng cao
trình độ văn hoá của bản thân vừa đưa đất nước đến sự phát triển của khoa học kỹ
thuật và khoa học giáo dục, sự hội nhập quốc tế làm cơ sở cho việc đổi mới giáo dục
theo hướng hiện đại, vừa sát với tình hình thực tế của địa phương.
Để học sinh thích thú hơn trong việc học tập, có nhiều kiến thức mới, kiến thức
nâng cao học sinh có thể an tâm trong học tập. Vai trò của giáo viên hết sức to lớn, họ
chính là người góp phần quyết định chất lượng hoạt động dạy học và giáo dục là người
thầy gây ảnh hưởng đến sự phát triển nhân cách của học sinh.

2


2. Các giải pháp, biện pháp thực hiện
a. Sự chuẩn bị của giáo viên.
Giáo viên phải tìm kiếm, chọn lọc để có nhiều tài liệu về Ngôn ngữ lập trình
Pascal. Kinh nghiệm cho thấy mỗi tài liệu đều có những ưu điểm riêng, tài liệu 1 trình
bày tốt vấn đề A nhưng lại sơ sài vấn đề B, tài liệu 2 trình bày tốt vấn đề B nhưng lại
sơ sài vấn đề A. Vậy ta nên có cả hai tài liệu để có thể nắm bắt tốt cả hai vấn đề A và
B. Bản thân Tôi phải đi khắp các hiệu sách ở Ninh Hòa và cả thành phố Nha Trang để
mua sách. Để bồi dưỡng tốt học sinh giỏi tin 9 theo Tôi giáo viên nên có những tài liệu
sau:
STT
1

Tên Sách

Tác giả

Bài tập ngôn ngữ lập trình Pascal

Quách Tuấn Ngọc

Giáo trình lý thuyết và bài tập Pascal toàn tập

Nguyễn Đình Tê – Hoàng
Đức Hải

3

Bài giảng ngôn ngữ lập trình Pascal

Nguyễn Hữu Trọng

4

Lý thuyết và bài tập Pascal

Đinh Xuân Lâm

5

Pascal tập 1,2

Trần Đan Thư

6

Phương pháp giải các bài toán trong tin học

Trần Đức Huyên

7

Cấu trúc dữ liệu và giải thuật

Đỗ Xuân Lôi

8

Tin học 11

Hồ Sĩ Đàm (chủ biên)

...

...

...

2

(Các tài liệu trên sau nhiều năm Tôi sưu tầm mà có được)
Lưu trữ chương trình Turbo Pascal 7.0, Free pascal, nghiên cứu các phần mềm
vi tính để học Pascal như: Tự học ngôn ngữ lập trình Pascal, PS100, Turbovn (chương
trình Pascal 7.0 báo lỗi bằng tiếng Việt), Free Pascal...Đây là những phần mềm giống
như một giáo trình, Tôi sẽ cài các phần mềm này vào máy vi tính ở nhà của học sinh,
để học sinh có thể tự học và nghiên cứu ở nhà.
Phải sưu tầm đầy đủ đề thi học sinh giỏi môn tin 9 ở các năm trước. Từ đó bám
sát vào các đơn vị kiến thức để đi sâu, tránh dạy lan man quá nhiều đơn vị kiến thức
nhưng không dùng đến. Ví dụ: Bồi dưỡng học sinh giỏi Huyện thì giáo viên không cần
dạy các đơn vị kiến thức như kiểu bản ghi (record), chương trình con đệ quy, giải thuật
quay lui...các kiến thức đó để bồi dưỡng học sinh giỏi Tỉnh.
Trao đổi học hỏi kinh nghiệm từ các đồng nghiệp của các trường khác đi trước.
Tôi thường liên hệ với thầy Tuấn ở THCS Quang Trung và thầy Hiếu trường THCS
Chu Văn An để trao đổi kinh nghiệm bồi dưỡng môn Pascal, mượn các đề thi, tài liệu
các thầy rất nhiệt tình giúp đỡ.

3


Đặc biệt là việc tìm tài liệu trên mạng internet, đăng ký thành viên tại các trang
web như diễn đàn tin học (http://www.ddth.com/ ), công ty cổ phần tin học Bạch Kim
(http://dethi.violet.vn/), Sở Giáo Dục và Đào Tạo Thừa Thiên Huế
(http://khaothi.thuathienhue.edu.vn/DETHI/hocsinhgioi.htm), Diễn đàn giáo viên tin
học (http://tinhoc.vno.vn/), code pascal (http://codepascal.blogspot.com/)... Đây là
những trang web mà Tôi thường ghé thăm để lấy tài liệu và giáo trình, lấy đề thi ở
những huyện khác, tỉnh khác, đưa lên các đề thi vòng trường, các vấn đề cần giải đáp,
trao đổi kinh nghiệm với các giáo viên khác trên cả nước. Việc này giúp Tôi học hỏi
được rất nhiều kiến thức, tìm ra những điều mới lạ, những giải thuật đơn giản, cách
giải ngắn gọn cho những bài toán khó.
Trước mỗi buổi dạy giáo viên cần chuẩn bi kỹ các nội dung cần truyền đạt đến
học sinh: về lý thuyết, bài tập, và bài tập về nhà. Phần lý thuyết cần gắn gọn, nhưng
đầy đủ làm sao cho học sinh dễ dàng nắm bắt kiến thức từ đó làm được các bài tập;
phần bài tập giáo viên phải chuẩn bị kỹ các giải thuật, lời giải chi tiết nên chạy thử
chương trình trước để phát hiện các sai sót, sự cố nếu có tránh tình trạng cho học sinh
làm bài tập nhưng giáo viên lại không giải được; Sau một buổi học nên cho học sinh
một hoặc hai bài tập về nhà. Giáo viên nên có sổ ghi chép giống như giáo án, mỗi năm
có thể bổ sung chỉnh sửa, rút kinh nghiệm để việc bồi dưỡng học sinh ngày càng tốt
hơn và công việc bồi dưỡng năm sau đỡ vất vả hơn năm trước.
Ví dụ: Chuẩn bị nội dung một buổi dạy bồi dưỡng học sinh giỏi phần vẽ các
hình đơn giản (thời lượng 4 tiết)

VẼ HÌNH
1. Bài toán viết chương trình vẽ các hình:
a. Chữ nhật đặc.
b. Chữ nhật rỗng.
c. Tam giác cân đặc.
d. Tam giác cân rỗng.
e. Tam giác vuông đặc.
f. Tam giác vuông rỗng.
(Hình chữ nhật nằm ngang: nhập chiều dài và chiều rộng, Tam giác: nhập
chiều cao; vẽ các hình trên với ký tự là dấu *; hình tam giác có đỉnh ở trên
có thể làm thành 6 bài riêng biệt hoặc làm chung một chương trình có lựa
chọn )

4


2. Hướng dẫn giải thuật
a. Hình chữ nhật đặc nằm ngang
Ví dụ: nhập chiều dài (d) = 6 và chiều rộng (r) = 4 thì máy sẽ vẽ hình sau

* * * * * *
* * * * * *
* * * * * *
* * * * * *
Cho học sinh vẽ bảng sau vào vở
Cột (c)
Hàng
(h)

1 2 3 4 .. d
1 * * * * * *
2 * * * * * *
.. * * * * * *
r

* * * * * *

Đầu tiên ta vẽ chiều dài trước

* * * * * *
Thành ra bài toán vẽ d ngôi sao trên một dòng, cho một biến cột (c) chạy từ 1
đến d và vẽ *
for c:=1 to d do write(‘*’);

writeln;

Công việc trên được lặp lại r lần nên cho biến hàng (h) chạy từ 1 đến r và làm
công việc trên
For h:=1 to r do
Begin

End;

Lưu ý khi nhập thì chiều dài luôn lớn hơn hoặc bằng chiều rộng.
Hình chữ nhật đặc thẳng đứng thì làm thế nào? (học sinh tự làm)

5


b. Hình chữ nhật rỗng nằm ngang
Cột (c)
Hàng
(h)

1 2 3 4 .. d
1 * * * * * *
2 *

*

.. *

*

r

* * * * * *

Tương tự như câu a nhưng lưu ý ở các giá trị c=1, c=d, h=1, h=r thì vẽ * còn lại
thì vẽ khoảng trống #32, vậy nên phải có thêm câu lệnh điều kiện if...then...else
Chương trình sẽ là:
for h:=1 to r do
begin
for c:=1 to d do
if (c=1)or(h=1)or(c=d)or(h=r) then write(‘*’) else write(#32);
writeln;

c. Hình tam giác đặc đỉnh ở trên: chiều cao là n
Cột (c)
Hàng
(h)

1 2 3 4 5 6 2*n-1
1 a
2
..

*

b

* * *
* * * * *

n * * * * * * *
Cách giải tương tự như câu a, b nhưng lưu ý 2 cạnh bên của tam giác cân:
cạnh a thì có mối quan hệ c=n-h+1, cạnh b thì có mối quan hệ c=n+h-1; và biến
c sẽ đi từ 1 đến 2*h-1 chỉ những giá trị c >= n-h+1 và c<= n+h-1 thì vẽ * còn lại
vẽ khoảng trống #32
Chương trình như sau:

6


uses crt;
var c,h,n:integer;
begin
readln(n);
clrscr;
for h:=1 to n do
begin
for c:=1 to 2*n-1 do
if (c>=n-h+1)and(c<=n+h-1)then write('*') else write(#32);
writeln;
end;
readln;
end.

d. Hình tam giác rỗng đỉnh ở trên: chiều cao là n
Cột (c)
Hàng
(h)

1 2 3 4 5 6 2*n-1
1 a
2

*

b

*

..

*

*

*

n * * * * * * *
Cách giải tương tự như câu c nhưng lưu ý khi c=n-h+1 hoặc c=n+h-1
hoặc d=n thì vẽ * còn lại vẽ khoảng trống #32
Chương trình như sau: thay đoạn if

(c>=n-h+1)and(c<=n+h-1)ở

If (c=n-h+1)or (c=n+h-1) or (h=n)

e. (vì nội dung quá dài Tôi xin không trình bày mục e,f)...
f. ...
Bài tập ở lớp: Vẽ hình Tam giác cân đặc đỉnh ở dưới?
Cột (c)
Hàng
(h)

1

2

3

4

5

6

7

1 *

*

*

*

*

*

*

2

*

*

*

*

*

*

*

*

3 a
4

b

*

7

câu c thành


Gợi ý: đường thẳng a: c>=h và đường thẳng b: c<=2*n-h
Bài giải chi tiết
uses crt;
var c,h,d,r,n:integer;
begin
readln(n);
clrscr;
for h:=1 to n do
begin
for c:=1 to 2*n do if (c>=h)and(c<=2*n-h)then write('*') else write(#32);
writeln;
end;
readln;
end.

Bài tập về nhà: Vẽ hình tam giác vuông rỗng đỉnh ở dưới chiều cao và ký tự
nhập từ bàn phím
Ví dụ: Chiều cao n= 4 và ký tự ch= &
Kết quả:

& & & &
&

&

& &
&
Bài giải chi tiết
uses crt;
var c,h,n:integer;
ch:char;
begin
readln(n);
readln(ch)
clrscr;
for h:=1 to n do
begin
for c:=1 to n do if(c=1)or(h=1)or(c=n-h+1)then write(ch) else write(#32);

writeln;
end;
readln;
end.

-----------

8


b. Khi bồi dưỡng học sinh giỏi cấp Thị xã
 Nội dung, kế hoạch bồi dưỡng:
Cần xác định chính xác nội dung các đơn vị kiến thức để bồi dưỡng học sinh
giỏi Huyện trước khi tiến hành bồi dưỡng. Tránh dạy quá nhiều đơn vị kiến thức mà
không khắc sâu, củng cố. Sau khi xác định nội dung thì lập ra một kế hoạch bồi dưỡng
cụ thể từng đơn vị kiến thức và thời gian dạy từng đơn vị kiến thức đó (gần giống như
là phân phối chương trình khi dạy chính khóa).
Ví dụ:
Thời gian

Tiết
Nội dung bồi dưỡng
1 Giới thiệu ngôn ngữ Pascal
2 Giới thiệu ngôn ngữ Pascal
Thứ Tư
Cấu trúc tổng quát của một chương trình
Ngày 2/8
3 Pascal
Cấu trúc tổng quát của một chương trình
4 Pascal
5 Các kiểu dữ liệu đơn giản
6 Các kiểu dữ liệu đơn giản
Thứ Năm
Tuaàn Ngày 3/8
7 Các kiểu dữ liệu đơn giản
1
8 Các kiểu dữ liệu đơn giản
Hằng, biến, biểu thức, câu lệnh, lệnh gán,
9 lệnh ghép
Hằng, biến, biểu thức, câu lệnh, lệnh gán,
Thứ sáu 10 lệnh ghép
Ngày 4/8
Hằng, biến, biểu thức, câu lệnh, lệnh gán,
11 lệnh ghép
Hằng, biến, biểu thức, câu lệnh, lệnh gán,
12 lệnh ghép
13 Xuất nhập dữ liệu
14 Xuất nhập dữ liệu
Thứ Ba
Ngày 8/8 15 Xuất nhập dữ liệu
16 Xuất nhập dữ liệu
17 Bài tập
18 Bài tập
Tuaàn Thứ Tư
2
Ngày 9/8 19 Bài tập
20 Bài tập
21 Câu lệnh lựa chọn If và Case
Thứ Năm 22
Câu lệnh lựa chọn If và Case
Ngày
23 Câu lệnh lựa chọn If và Case
10/8
24 Câu lệnh lựa chọn If và Case
Tuaàn
25 Bài tập
3
26 Bài tập

9

Ghi chú


Thứ Ba
Ngày
Thứ Tư
Ngày
16/8
Thứ Năm
Ngày
17/8
Thứ
BaNgày
22/8

Tuaàn
4

Thứ Tư
Ngày
23/8
Thứ Năm
Ngày
24/8
Thứ Ba
Ngày
29/8

Tuaàn
5

Thứ Tư
Ngày
30/8
Thứ Năm
Ngày
31/8

Tuaàn
6

Thứ Ba
Ngày 5/9

27

Bài tập

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

Bài tập
Bài tập
Bài tập
Bài tập
Bài tập
Câu lệnh lặp (For…to/downto…do)
Câu lệnh lặp (For…to/downto…do)
Bài tập
Bài tập
Câu lệnh lặp ( While…do )
Câu lệnh lặp ( While…do )
Bài tập
Bài tập
Câu lệnh lặp (Repeat…until)
Câu lệnh lặp (Repeat…until)
Bài tập
Bài tập
Bài tập tổng hợp các câu lệnh lặp
Bài tập tổng hợp các câu lệnh lặp
Bài tập tổng hợp các câu lệnh lặp
Bài tập tổng hợp các câu lệnh lặp
Bài tập tổng hợp các câu lệnh lặp
Bài tập tổng hợp các câu lệnh lặp
Bài tập tổng hợp các câu lệnh lặp
Bài tập tổng hợp các câu lệnh lặp
Kiểu dữ liệu mảng (array)
Kiểu dữ liệu mảng (array)
Kiểu dữ liệu mảng (array)
Kiểu dữ liệu mảng (array)
Bài tập
Bài tập
Bài tập
Bài tập
Kiểu mảng 2 chiều
Bài tập
Bài tập
Bài tập
Kiểu xâu kí tự

10


66
67
68
69
Thứ Bảy 70
Ngày 9/9 71
72
73
Thứ
74
BaNgày
75
12/9
76
77
Thứ Tư
78
Ngày
79
13/9
80
81
Thứ Bảy
82
Ngày
83
16/9
84
85
Thứ Ba
86
Ngày
87
19/9
88
89
Thứ Tư
90
Ngày
91
20/9
92
93
Thứ Bảy
94
Ngày
95
23/9
96
97
Thứ Ba
98
Ngày
99
26/9
100
101
Thứ Tư 102
Ngày
103
27/9
104
105
Thứ Tư
Ngày 6/9

Tuaàn
7

Tuaàn
8

Tuaàn
9

Kiểu xâu kí tự
Kiểu xâu kí tự
Kiểu xâu kí tự
Bài tập
Bài tập
Bài tập
Bài tập
Bài tập
Bài tập
Bài tập
Bài tập
Kiểu dữ liệu tập hợp
Kiểu dữ liệu tập hợp
Kiểu dữ liệu tập hợp
Kiểu dữ liệu tập hợp
Ôn tập
Ôn tập
Ôn tập
Ôn tập
Kiểu Record
Kiểu Record
Bài tập
Bài tập
Bài tập
Bài tập
Bài tập
Bài tập
Kiểu tệp tin
Kiểu tệp tin
Bài tập
Bài tập
Ôn tập tổng hợp
Ôn tập tổng hợp
Ôn tập tổng hợp
Ôn tập tổng hợp
Giải một số đề thi các năm trước
Giải một số đề thi các năm trước
Giải một số đề thi các năm trước
Giải một số đề thi các năm trước
Giải một số đề thi các năm trước

11


Thứ Bảy
Ngày
30/9
Thứ
BaNgày
3/10

Tuaàn
10

Thứ Tư
Ngày
4/10
Thứ Bảy
Ngày
7/10

106
107
108
109
110
111
112
113
114
115
116
117
118
119
120

Giải một số đề thi các năm trước
Giải một số đề thi các năm trước
Giải một số đề thi các năm trước
Ôn tập
Ôn tập
Ôn tập
Ôn tập
Ôn tập
Ôn tập
Ôn tập
Ôn tập
Thi vòng trường
Thi vòng trường
Thi vòng trường
Thi vòng trường

Tổng cộng 120 tiết, mỗi buổi giáo viên dạy từ 3 đến 4 tiết. Nhưng thực tế chúng
tôi bồi dưỡng nhiều hơn thế.
Thời lượng của mỗi đơn vị kiến thức có thể thay đổi tùy thuộc vào sự tiếp thu
đơn vị kiến thức đó của học sinh.
 Thời gian bồi dưỡng:
Thời gian bồi dưỡng tốt nhất là sau khi học sinh thi xong học kỳ 2 của năm học
trước, tiếp theo là kì nghĩ hè nên có em có nhiều thời gian dành cho việc học bồi
dưỡng. Mỗi tuần từ 2 đến 4 buổi (mỗi buổi khoảng 3, 4 tiết) tùy thuộc vào nội dung
kiến thức mà giáo viên đang dạy, làm sao cho học sinh không nghỉ quá lâu nhưng phải
đảm bảo có thời gian cho các em tự làm bài tập ở nhà. Ví dụ sau khi học sinh học xong
các đơn vị kiến thức về câu lệnh lặp (For..to/downto..do; Repeat...until; while...do), dữ
liệu kiểu mảng (array), dữ liệu kiểu xâu (string), đó là những khoảng thời gian học
sinh làm bài tập nhiều nhất vì vậy mỗi tuần giáo viên chỉ bồi dưỡng 2, 3 buổi để học
sinh có thời gian tự làm bài tập ở nhà. Còn khi học lý thuyết thì mỗi tuần 4 buổi.
 Phương pháp bồi dưỡng:
Mỗi đơn vị kiến thức đều có 2 phần là lý thuyết và bài tập, thời gian học lý
thuyết khoảng 20% đến 25% còn lại là thời gian cho học sinh làm bài tập.
Phần lý thuyết và bài tập mẫu thì chủ yếu là giáo viên giảng học sinh nghe và
tiếp thu, giáo viên làm việc 80% học sinh 20%, Tuy nhiên cũng có những phần kiến
thức cho học sinh tự đọc tài liệu và thu thập thông tin sau đó giáo viên chốt lại trọng
tâm.

12


Phần bài tập thì học sinh làm việc 80% giáo viên 20%. Các em tự giải, viết
chương trình, sau đó cho một học sinh trình bày cách giải học sinh khác nhận xét, cuối
cùng giáo viên kết luận nhấn mạnh thêm trọng tâm.
Khi làm bài tập thì chủ yếu là học sinh thực hành trên máy vi tính nhưng trước
khi học sinh viết chương trình giáo viên yêu cầu học sinh nên trình bày giải thuật ra
giấy nháp xem có còn giải thuật khác tối ưu hơn hay không rồi mới tiến hành viết
chương trình trên máy tính. Đây là cách để học sinh thư giãn đôi mắt không tập trung
vào màn hình máy tính lâu và cũng là cách khắc phục tình trạng điện cúp, hoặc phòng
máy tính đang bận. Thỉnh thoảng nên cho các em giải lao đi dạo ngoài sân trường, ăn
một viên kẹo, cái bánh... cho khuây khỏa, tuyệt đối không cho học sinh chơi game.
 Những lưu ý khi tiến hành bồi dưỡng:
Cần xác định đây là môn học thuộc về ban tự nhiên, đòi hỏi tư duy lô gic, rất
gần gũi với toán học, nếu học sinh học giỏi toán thì rất thuận tiện để bồi dưỡng vì vậy
khi chọn đội tuyển giáo viên cần thông báo cho học sinh những ý trên và điều kiện để
tham gia là điểm trung bình môn cả năm của môn toán phải từ 8.5 trở lên.
Sau khi đã chọn được đội tuyển thì việc đầu tiên là xây dựng học sinh lòng yêu
thích môn học bằng cách giới thiệu các bài toán hay về Pascal như các chương trình đồ
hoạ, vẽ hình, âm thanh những ứng dụng của Pascal trong thực tế như lập trình pascal
điều khiển robot, giải phương trình, cộng phân số, tìm ước chung lớn nhất, tính lãi suất
ngân hàng, tính tiền điện, giải các bài toán cổ...Tôi có giới thiệu cho các em phần mềm
đánh số báo danh ngẫu nhiên viết bằng Pascal do tôi tự làm.
Cần hướng dẫn học sinh các kỹ năng sử dụng máy vi tính (thuộc về Windows)
như Copy, di chuyển tệp tin, nén và giải nén tệp, tìm kiếm (start  search...) đặc biệt
nếu có điều kiện thì dành ra một đến hai buổi để hướng dẫn các em lên mạng internet
vào các trang web có liên quan đến Pascal (đã nói ở trên) để tìm thêm tư liệu, tự tìm
tòi thu thập kiến thức.
Đưa cho học sinh mượn tài liệu và photo tài liệu, các đề bài tập, đề thi mà giáo
viên dùng để dạy cho học sinh, về nhà tự nghiên cứu. Có gì thắc mắc cần giải quyết
học sinh có thể gặp giáo viên bất cứ thời gian nào (qua điện thoại, face book,
messenger) để giải đáp thắc mắc.
Sau mỗi chương hoặc mỗi đơn vị kiến thức giáo viên phải cho học sinh làm bài
kiểm tra (như một đề thi) để thông qua đó, đánh giá, kiểm tra việc tiếp thu kiến thức
của học sinh từ đó có biện pháp điều chỉnh nội dung và thời lượng dạy cho phù hợp.
Các đề kiểm tra giáo viên phải chuẩn bị kỹ đáp án, soạn công phu có hình thức giống
như đề thi của Huyện, Tỉnh để học sinh làm quen dần.
Ví dụ: Sau khi học xong dữ liệu kiểu chuổi cho học sinh làm đề kiểm tra sau:

13


(đề này là kiểm tra lần 3 vì trước đó đã có 2 lần kiểm tra: lần 1 sau khi học sinh
học xong các câu lệnh lặp; lần 2 sau khi học sinh học xong dữ liệu kiểu mảng một
chiều)
TRƯỜNG THCS TRẦN QUANG KHẢI
ĐỀ THI HỌC SINH GIỎI TIN HỌC 9– Lần 3
THỜI GIAN: 150 PHÚT
1.

NGÀY THI: 13/10/2016

Viết chương trình tìm các vị trí xuất hiện chuổi S1 trong chuổi S? (6 đ)
Dữ liệu vào: Chuổi s và chuổi s1.
Kết quả ra: Các vị trí tìm thấy s1 trong s.
Ví dụ:
Input

Test 1

Output

‘aaahocjhochoc’

4 8 11

‘hoc’
Test 2

‘adddddee’

2 3 4 5

‘dd’
Tên tập tin:D:\thi\vong3\timchuoi.pas
2.

Nhập vào một chuổi sau đó xuất ra (các) từ dài nhất trong chuổi? (6Đ)
Dữ liệu vào: Một chuổi.
Kết quả ra: Các từ dài nhất trong chuổi.
Ví dụ:
Input

Test 1
Test 2

Output

Tran Nguyen dao
Tran quang dao

Nguyen
bgggg

quang
bgggg

Tên tập tin:D:\thi\vong3\Tu-max.pas
3.
(Đề bài này do tôi tự nghĩ ra) Bờm và cuội là 2 học sinh rất giỏi tin học và
thường liên lạc với nhau bằng thư điện tử (Email). Nhưng những bức thư mà hai bạn
gởi cho nhau chỉ toàn là dãy những chữ số liền nhau. Cả hai bạn đều có chương trình
mã hoá các con số thành những ký tự và ngược lại giải mã các con số thành ký tự,
theo qui định hai bạn sẽ chuyển những ký tự mình định gởi thành các con số là thứ
tự của ký tự đó trong bảng mã ASCII (ví dụ : A:65; B:66) từ chữ thường máy chuyển
thành chữ hoa rồi mã hoá thành các con số.(ví dụ: aA65, bB66). Sau khi

14


mã hoá sẽ chuyển thư đi. Người nhận có chương trình để giải mã các con số thành
những ký tự in hoa (vdụ: 6566326768AB CD). Em hãy viết
a.
Chương trình 1 (d:\thi\vong3\MAHOA.pas) để mã hoá 1 xâu ký tự
thành các chữ số. (4Đ)
Ví dụ:
Input

Output

Di an che?

68733265783267726963

b.
Chương trình 2 (d:\thi\vong3\GIAIMA.PAS) để giải mã 1 chuổi số
thành các ký tự. (4Đ)
Ví dụ:
Input

Output

79326865853286658963

O DAU VAY?
ĐỀ THI CÓ 1 TRANG - HẾT

ĐÁP ÁN VÒNG 3 -NGÀY THI: 13/10/2008
1. Timchuoi.pas
var s,s1:string;
begin
readln(s);
readln(s1);
while pos(s1,s)>0 then
begin
write(pos(s1,s):4);
s[pos(s1,s)]:=chr(1);
end;
readln;
end.
2. Tu-max.pas
var s,s1:string;
a:array[1..128]of string;
i,j,max:integer;
begin
readln(s);
while s[1]=#32 do delete(s,1,1);
while s[length(s)]=#32 do delete(s,length(s),1);
while pos(#32#32,s)>0 do delete(s,pos(#32#32,s),1);
j:=1;
for i:=1 to length(s) do
begin
if s[i]<>#32 then a[j]:=a[j]+s[i]
else inc(j);
end;
max:=length(a[1]);
for i:=1 to j do
if length(a[i])>max then max:=length(a[i]);
writeln('(cac) tu dai nhat: (co ',max,' ky tu:)');
for i:=1 to j do
if length(a[i])=max then writeln(a[i]);
readln;
end.

15


3. 2 chuong trinh
a. Mahoa.pas
uses crt;
var s:string;
i:integer;
begin
clrscr;
writeln('Nhap chuoi can ma hoa:');
readln(s);
writeln('Ma hoa thanh cac con so la:');
for i:=1 to length(s) do
begin
s[i]:=upcase(s[i]);
write(ord(s[i]));
end;
readln;
end.
b. Giaima.pas
uses crt;
var s,s2:string;
ch:char;
i,x,d:integer;
begin
clrscr;
writeln('Nhap chuoi so mat ma:');
readln(s);
writeln('Giai ma chuoi so tren la:');
while length(s)>0 do
begin
s2:=copy(s,1,2); {lay moi lan 2 ky tu dau tien}
delete(s,1,2);
{xoa 2 ky tu da lay di}
val(s2,x,i);
{chuyen thanh so x}
write(chr(x));
{chuyen thanh ma asscii}
end;
readln;
end.

Khi viết chương trình trên máy tính học sinh thường mắc một số lỗi cú pháp,
máy tính khi biên dịch thì sẽ báo lỗi và chương trình không chạy được, các thông báo
lỗi lại bằng tiếng Anh nhiều khi các em không hiểu và rất mất thời gian để tìm và sửa
lỗi. Qua các năm dạy giáo viên cần nắm bắt các lỗi mà học sinh thường mắc phải,
nguyên nhân và cách khắc phục các lỗi trên. Bản thân qua 4 năm bồi dưỡng học sinh
giỏi Tôi đã tập hợp được một số lỗi sau:
MỘT SỐ LỖI CÚ PHÁP THƯỜNG GẶP
Error 2. Identifier expected: mong gặp định danh (có thể do chưa khai báo biến,
hằng…)
Error 3. Unknown identifier: định danh chưa được khai báo. Hãy khai báo định danh
này ở đầu thủ tục hoặc chương trình. (có thể do sai chính tả một tên, từ khoá nào đó)
Error 4. Duplicate identifier: định danh được khai báo 2 lần trở lên.
Error 8. String constant exceeds line: giá trị của xâu ký tự quá dài, xem lại có thiếu
dấu đóng/mở (dấu nháy đơn) hằng văn bản không?
Error 26. TYPE mismatch: Kiểu không tương thích. các nguyên nhân sinh lỗi có thể
là: - Biểu thức được gán cho biến không đúng kiểu. Thí dụ

16


VAR x: char;
BEGIN
x: = 127 * 8
END.
Error 36. BEGIN expected: Thiếu BEGIN
Error 37. END expected: Thiếu END
Error 38. Integer expression expexted: Cần biểu thức nguyên
Error 40. Boolean expression expected: Cần biểu thức kiểu BOOLEAN
Error 41. Operand types do not match operator: Kiểu toán hạng không phù hợp với
toán tử
Error 42. Error in expression: Biểu thức sai. Thường gặp trường hợp sử dụng ký tự
lạ hoặc quên viết dấu phép toán trong biểu thức.
Error 54. OF expected:Thiếu OF trong TYPE, CASE, FILE, SET, ARRAY
Error 57. THEN expected:Thiếu THEN trong IF
Error 58. TO or DOWN TO expected: Thiếu To hoặc DOWN TO trong FOR
Error 85. ";" expected: Cần có dấu chấm phẩy.
Error 86. ": " expected: Cần có dấu hai chấm.
Error 87. " , " expected: Cần có dấu phẩy
Error 88. " ( " expected: Cần có dấu mở ngoặc đơn
Error 89 " ) " expected: Cần có dấu đóng ngoặc đơn
Error 99. " = " expected: Cần có dấu bằng.
Error 91. ":= "expected: Cần dấu gán
Error 113 Error in statement: Câu lệnh sai. Có thể do trước else có dấu chấm phẩy
“;”.
Error 200 Division by zero: chia cho số 0. (Lỗi khi chạy chương trình)
.v.v.
Cần rèn cho các em tính cẩn thận khi viết chương trình Pascal tránh để xảy ra
các lỗi cú pháp và các lỗi logic (ví dụ: thiếu dấu; thiếu “end” trong câu lệnh ghép và
thay vì viết a*b học sinh lại viết a-b, hoặc w/(h*h) thì viết w/h*h), đặc biệt lưu ý học
sinh là viết chương trình phải mang tính có cấu trúc, thụt đầu dòng các lệnh con (dùng
phím tab và shift + tab),
Ví dụ: chương trình vẽ tam giác cân đặc đỉnh ở trên với chiều cao nhập từ bàn
phím
Cách viết 1:

17


uses crt;
var c,h,n:integer;
begin
readln(n);clrscr;
for h:=1 to n do
begin
for c:=1 to 2*n-1 do
if (c>=n-h+1)and(c<=n+h-1)then write('*') else write(#32);
writeln;end;readln;
end.

Cách viết 2:
{ve hinh tam giac can dac dinh o tren}
uses crt;
var c,h,n:integer;
begin
readln(n);
clrscr;
for h:=1 to n do
begin
for c:=1 to 2*n-1 do
if (c>=n-h+1)and(c<=n+h-1)then write('*') else write(#32);
writeln;
end;
readln;
end.

Cả hai cách viết đều đúng, nhưng rõ ràng cách viết thứ 1 người đọc sẽ rất khó
hiểu, rối rắm lỡ có sai cũng khó chỉnh sửa, cách viết thứ 2 mang tính cấu trúc hơn,
người đọc sẽ dễ hiểu, và người lập trình dễ dàng chỉnh sửa hơn.
Yêu cầu học sinh phải ghi chép đầy đủ, rõ ràng nội dung bài học, với mỗi bài
toán phải ghi rõ giải thuật và lời giải chi tiết, khuyến khích các em tìm tòi các giải
thuật khác tốt hơn, ngắn gọn hơn. Nghĩa là mỗi bài toán cần phải đi sâu vào vấn đề,
tìm nhiều cách giải khác nhau, lựa chọn cách giải tối ưu nhất.
Ví dụ: Bài toán tìm ước chung lớn nhất của 2 số nguyên a,b
Cách 1: Cho biến i chạy từ a (hoặc b) đến 1 nếu cả hai số đều chia hết cho i thì i
chính là ước chung lớn nhất. Cách này chưa tốt vì nếu số a (hoặc b) quá lớn so với số b
(hoặc a) thì chương trình không tối ưu. Vì vậy nên cho biến i chạy từ số nhỏ trong 2 số
(gọi là min) đến 1 nếu cả hai số đều chia hết cho i thì i chính là ước chung lớn nhất. Ở
cách này có thể dùng 3 vòng lặp for...,while... và repeat:
Dùng vòng lặp For...downto...do kết hợp với hàm break.
var a,b,min,i:integer;
begin
write('Nhap 2 so nguyen:'); readln(a,b);
if a>b then min:=b else min:=a; {lấy số nhỏ}
forDùng
i:=min
1 do
vòngdownto
lặp while...do.
if (a mod i=0)and(b mod i=0) then break;{dừng vòng lặp}
write(‘UCLN=’,i);

readln;
i:=min; {nhận giá trị nhỏ}
end.
while (a mod i<>0)or(b mod i<>0)do i:=i-1;

18


Dùng vòng lặp repeat...until

i:=min;
repeat
if (a mod i<>0)or(b mod i<>0)then i:=i-1;
until (a mod i=0)and(b mod i=0);


Cách 2: Trong khi hai số khác nhau thì lấy số lớn trừ cho số bé, đến khi hai số
bằng nhau thì đó chính là ước chung lớn nhất
Có thể dùng vòng lặp while...do.

while a<>b do
if a>b then a:=a-b else b:=b-a;
ucln:=a;{hoặc ucln:=b}


Có thể dùng vòng lặp repeat...until

{repeat
if a>b then a:=a-b
else if b>a then b:=b-a;
until a=b;}


Cách 3: Dùng giải thuật Euclid (là cách nhanh nhất).

while b<>0 do
begin
r:=a mod b;
a:=b;
b:=r;
end
ucln:=a;


Và đặc biệt lưu ý khi giải toán là “hiểu hơn là nhớ”, học sinh phải nắm bắt được
dạng toán và cách giải cơ bản để khi gặp dạng toán tương tự thì có thể giải được chứ
không nên học thuộc lòng lời giải một bài toán, mà không nắm được giải thuật của bài
toán.
Ví dụ :
Bài tập : Viết chương trình tìm các số có 3 chữ số

abc

sao cho:

abc

= a3 + b3 + c3.

Ý tưởng:
Dùng phương pháp vét cạn. Ta biết rằng: a có thể có giá trị từ 19 (vì a là số
hàng trăm), b,c có thể có giá trị từ 09. Ta sẽ dùng 3 vòng lặp FOR lồng nhau để
duyệt qua tất cả các trường hợp của a,b,c.

19


Ứng với mỗi bộ abc, ta sẽ kiểm tra: Nếu 100.a + 10.b + c = a 3 + b3 + c3 thì in ra
bộ abc đó.
Các bài tập tương tự có dùng giải thuật vét cạn:
1. Bài toán cổ Vừa gà vừa chó bó lại cho tròn, 36 con, 100 chân chẵn.; trăm con trâu
ăn trăm bó cỏ
2. Tìm tất cả các cách chi trả một số tiền x, biết có các tờ tiền 50, 100, 500.
3. Tìm tất cả các số có 3 chữ số thỏa điều kiện chữ số hàng chục bằng tổng hai chữ
số kia.
4. .v.v.
Mỗi bài toán phải cho học sinh tự suy nghĩ, tìm thuật giải khoảng từ 10 đến 30
phút rồi giáo viên mới hướng dẫn và khi hướng dẫn thì nên gợi mở từng bước (giống
như vòng thi tăng tốc của chương trình Đường lên đỉnh Olympia) thậm chí có những
bài toán giáo viên để cho học sinh tự giải trong một thời gian dài (một tuần thậm chí
nửa tháng) rồi mới hướng dẫn. Đối với những bài toán đó giáo viên nên “treo phần
thưởng” cho học sinh khi học sinh làm được. Điều này giúp học sinh ghi nhớ, khắc sâu
bài toán và dạng toán của nó.
Khi gặp một bài toán phức tạp giáo viên nên chia nhỏ ra thành những yêu cầu
nhỏ rồi nâng cấp dần lên (“chia để trị”)
Ví dụ: VCT in ra tất cả các số nguyên tố từ n đến m? Với n, m nhập từ bàn
phím.
Trước khi làm bài này ta nên hướng dẫn học sinh làm lần lượt các bài sau
Bài 1: Viết chương trình nhập vào số tự nhiên x rồi thông báo lên màn hình số
đó có phải là số nguyên tố hay không.
Bài 2: Viết chương trình xuất ra các số nguyên tố từ 2 đến m? với m nhập từ bàn
phím.
Các bài toán bao giờ cũng lồng vào sự liên hệ thực tế cho học sinh thấy được cái
hay của môn học, và dễ dàng nắm bắt yêu cầu của đề hơn từ đó gây hứng thú khi học.
Ví dụ: đề bài tập sau giống như người ra đề đang kể chuyện nên học sinh sẽ dễ
dàng hiểu rõ yêu cầu và thấy được ứng dụng của môn học trong thực tế. (và đề này là
do tôi tự nghĩ ra)
Bờm là học sinh rất mê lập trình bằng Pascal và Bờm rất hay làm công việc
nhập họ tên của các bạn học sinh bằng máy tính. Khi nhập tên thì chữ đầu của từ phải
viết hoa như vậy phải mất công bấm giữ phím shift mỗi lần gõ chữ đầu một từ. Một
hôm Bờm mới nảy ra một ý tưởng là dùng Pascal viết một chương trình nhập tên để
máy tính tự động biến đổi chữ đầu từ là chữ hoa khi nhập vào một chuổi các ký tự
chữ cái thường từ bàn phím. Em hãy viết chương trình nhập vào một chuổi các ký tự

20


chữ cái gồm nhiều từ mỗi từ là một tên của một học sinh và trên màn hình phải hiện
ra đúng chữ đầu của tên là chữ hoa còn các chữ cái còn lại là chữ thường. Sau đó sắp
xếp các tên trên theo thứ tự alphabet mỗi tên xuất một dòng
Dữ liệu vào: Các phím chữ cái thường từ a z và phím cách trống để phân biệt
tên học sinh này với tên học sinh kia.
Kết quả ra: Màn hình sẽ hiển thị chữ đầu của mỗi tên học sinh là chữ hoa
(người nhập không cần bấm giữ phím shift hoặc bật Caplock), sắp
xếp các tên trên theo thứ tự alphabet mỗi tên xuất một dòng.
Gợi ý: Dùng hàm Readkey.
Ví dụ:
Input
dung cuong an xuan dao

Output
Dung Cuong An Xuan Dao
An
Cuong
Dao
Dung
Xuan

c. Khi tham gia bồi dưỡng học sinh giỏi cấp Tỉnh cùng với 2 đồng nghiệp
 Phân chia nội dung, thời gian bồi dưỡng:
Sau khi các em thi học sinh giỏi cấp thị xã xong chúng tôi chọn đội tuyển để
bồi dưỡng chuẩn bị dự thi học sinh giỏi cấp tỉnh khoảng 10 học sinh. và trong
các năm gần đây các giáo viên bồi dưỡng gồm.
Thầy Lê Trung Hiếu - trường THCS Chu Văn An (nhóm trưởng)
Thầy Lê Công Tuấn - trường THCS Quang Trung
và tôi Trần Minh Thọ - trường THCS Trần Quang Khải
Chúng tôi họp bàn với nhau để phân chia nội dung và thống nhất thời gian bồi
dưỡng (mỗi tuần 3 buổi, mỗi buổi 4 tiết) có kế hoạch chi tiết rõ ràng do nhóm
trưởng phân công.


Thiết lập trang web hỗ trợ việc bồi dưỡng (để giáo viên giao bài tập và học
sinh gởi bài tập đã làm)

Tôi dùng Google sites để thiết lập trang web bồi dưỡng học sinh giỏi cấp Tỉnh.
Điều này rất thuận lợi để giáo viên giao bài tập và học sinh nộp bài làm của mình. Mỗi
giáo viên và học sinh đều có tài khoản google mail để tôi cấp quyền tham gia chỉnh

21


sửa trang web (chủ yếu là giao bài tập và nộp bài làm) còn tôi có quyền quản trị thiết
kế giao diện, bố cục trang web.
Thuận lợi của trang web là giáo viên có ngồi trên máy tính và xem các bài làm
của học sinh nộp từ đó cho nhận xét và chỉnh sửa. Hơn nữa, các học sinh có thể tham
khảo bài làm của nhau để học hỏi cái hay, giải thuật tốt của các bạn.
Tuy nhiên, hạn chế là nếu học sinh lười học thì có thể copy bài của bạn để gởi lên
trước để làm bài của mình. Điều này cũng hiếm xảy ra vì chúng tôi đã dặn dò các em
phải có tinh thần tự giác, nếu các em không biết làm, hoặc không hiểu vấn đề thì hỏi
bạn, hỏi giáo viên chứ không nên copy bài của bạn.
Có thể tham khảo trang web tại địa chỉ: http://tiny.cc/hsg1617
Tên đăng nhập: nguoichamskkn.2017@gmail.com
Mật khẩu: skknskkn
Cần lưu ý khi thi học sinh giỏi cấp tỉnh thì bài thi thực hành của học sinh sẽ được
chấm trên máy, chạy được test nào thì chấm điểm test đó nên khi bồi dưỡng học sinh
giỏi tỉnh giáo viên bồi dưỡng cần hướng học sinh tìm các giải thuật tối ưu cho các bài
toán để giải thuật có thể giải quyết được các số liệu lớn hay nói cách khác là thuật toán
đưa ra phải “ăn hết test” của đề bài toán có như vậy mới đạt được điểm trọn vẹn của
bài toán.
Ví dụ về bài toán số siêu nguyên tố dưới đây
Bài toán về số siêu nguyên tố:
Số siêu nguyên tố là số mà khi bỏ 1 số tùy ý các chữ số bên phải của nó thì phần

còn lại vẫn là 1 số nguyên tố
Ví dụ: 2333 là 1 số siêu nguyên tố có 4 chữ số vì 233, 23, 2 cũng là các số

nguyên tố.
Bài toán 1:
Nhập vào 1 số nguyên và cho biết nó có phải là số siêu nguyên tố không?
Ví dụ: 2333  YES
4333  NO
Ở bài toán này ta chỉ cần viết chương trình con kiểm tra nguyên tố và
chương trình con kiểm tra siêu nguyên tố trong khi số nhập vào là số nguyên tố
thì ta chia cho 10 kết quả nếu số đó = 0 thì nó chính là số siêu nguyên tố ngược
lại thì nó không phải là số siêu nguyên tố.
Code như sau:
program sieu_nguyen_to_0;

22


var n,i:longint;
function nt(n:longint):boolean;
var i:longint;
begin
nt:=false;
if n<2 then exit;
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then exit;
nt:=true;
end;
function snt(n:longint):boolean;
begin
snt:=false;
while nt(n) do n:=n div 10;
if n=0 then snt:=true;
end;
begin
write('nhap n:');readln(n);
if snt(n) then write('YES') else write('NO');
readln;
end.

Với thuật toán trên ta có thể chỉnh sửa lại để thành bài toán tìm và xuất ra
các số siêu nguyên tố nhỏ hơn 1.000.000 chương trình chạy rất tốt. Nhưng đối
với các số lớn hơn thì chương trình chạy rất lâu và không thể chạy hết test của
bài toán 2 dưới đây.
Bài toán 2:
Cho số nguyên dương N (0số cùng số các số đó.
Ví dụ: Với N = 4

có 16 số
2333, 2339, 2393, 2399, 2939, 3119, 3137, 3733, 3739, 3797, 5939, 7193, 7331,
7333, 7393.
Thoạt tiên các em học sinh sẽ nghĩ với N=4 ta cho một biến x chạy từ 1000
đến 9999 rồi dùng chương trình trên để kiểm tra x có là số siêu nguyên tố thì xuất
ra còn với n=5 thì ta cho biến x chạy từ 100 00 đến 99999, … Và sẽ viết code như
sau:
program sieu_nguyen_to_2a;
var a,b:array[1..100]of longint;
n,i,j,k,x,y,z,t:longint;
function nt(a:longint):boolean;
var x:longint;
begin
nt:=false;
if a<2 then exit;
for x:=2 to trunc(sqrt(a)) do
if a mod x=0 then exit;
nt:=true;
end;
function snt(a:longint):boolean;

23


begin

snt:=false;
while nt(a) do a:=a div 10;
if a=0 then snt:=true;

end;
function lt(n:byte):longint; {dùng tạo ra số có n chữ số}
var i:byte;
begin
if n=0 then lt:=1;
for i:=1 to n do lt:=10*lt(n-1);
end;
begin
repeat
write('nhap n:');
readln(n);
until (0for i:=lt(n-1) to lt(n)-1 do
if snt(i) then write(i:8);
readln;
end.

Code trên chạy rất tốt đối với n nhỏ nhưng với n lớn bằng 7,8,9 thì chương
trình chạy rất lâu, với n=8 thì có thể chờ cả buổi. Vì vậy, thuật toán trên là chưa
tối ưu. Giáo viên cần hướng dẫn cho học sinh thuật toán dưới đây.
Ta dùng mảng a để lưu các số siêu nguyên tố có 1 chữ số. Sau đó, thêm số ở
hàng đơn vị vào các số siêu nguyên tố đã lưu.
Tiếp đến, kiểm tra xem nó có phải là số nguyên tố không và lưu các số
nguyên tố này lại. Như vậy, máy sẽ chạy nhanh hơn (vì kiểm tra nguyên tố sẽ

nhanh hơn kiểm tra siêu nguyên tố).
Cụ thể như sau:

Các số siêu nguyên tố có 1 chữ số là: 2, 3, 5, 7.
Để tìm các số siêu nguyên tố có 2 chữ số thì ta thêm vào hàng đơn vị của các số
siêu nguyên tố các số từ 1 đến 9 (hoặc chỉ thêm các số 1,3,7,9 mà không cần thêm
các số chẳn và số 5 vì chắc chắn số đó sẽ không phải là số nguyên tố) rồi kiểm tra
nó có phải là số nguyên tố không, nếu phải thì ta lưu lại vào mảng b. Nghĩa là
mình đi ngược lại với định nghĩa.
Đầu tiên ta tạo dãy các số siêu nguyên tố có 1 chữ số là: 2, 3, 5, 7

Với a[1] =2 ta ghép thêm vào để được các số : 21, 22, …, 29 →23, 29
Với a[2] =3 ta ghép thêm vào để được các số : 31, 32, …, 39 →31, 37
Với a[3] =5 ta ghép thêm vào để được các số : 51, 52, …, 59 →53, 59
Với a[4] =7 ta ghép thêm vào để được các số: 71, 72, …, 79 →71, 73, 79
Các số nguyên tố có 2 chữ số (cũng là số siêu nguyên tố có 2 chữ số) ta lưu vào
mảng b, (mảng b là tạm thôi để thực hiện vòng lặp) rồi sau đó cho mảng a bằng
mảng b. Tương tự như vậy, ta tiếp tục thêm vào hàng đơn vị các số nguyên tố có

24


2 chữ số để trở thành số có 3 chữ số rồi kiểm tra xem chúng có phải là số
nguyên tố không, nếu chúng là số nguyên tố thì chúng cũng là số siêu nguyên tố
có 3 chữ số.
Code như sau:
program sieu_nguyen_to_2b;
var a,b:array[1..100]of longint;
n,i,j:longint;
k,y,t,d:byte;
function nt(n:longint):boolean;
var i:longint;
begin
nt:=false;
if n<2 then exit;
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then exit;
nt:=true;
end;
begin
repeat
write('nhap n (0until (0t:=4;
a[1]:=2;a[2]:=3;a[3]:=5;a[4]:=7;
d:=4;
for k:=2 to n do
begin
y:=1;d:=0;
for i:=1 to t do
for j:=1 to 9 do
if nt(a[i]*10+j) then
begin
b[y]:=a[i]*10+j;
y:=y+1;
d:=d+1;
end;
a:=b;
t:=y-1;
end;
writeln('Co ',d,' so');
for i:=1 to t do write(a[i]:10);
readln
end.

3. HIỆU QUẢ
Nêu các kết quả đã đạt được trong các năm qua:
Năm học 2013-2014: 2 học sinh đạt giải khuyến khích cấp thị xã, 1 học sinh được
chọn vào đội tuyển tỉnh.
Năm học 2014-2015: 1 học sinh đạt giải nhì, 1 học sinh đạt giải khuyến khích cấp
thị xã, 1 học sinh đạt giải khuyến khích cấp Tỉnh.
Năm học 2015-2016: 1 học sinh đạt giải 3 cấp thị xã (không có giải nhất nhì), 1 học
sinh đạt giải nhì cấp Tỉnh.

25


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×

×