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

Mở rộng các bài toán cơ bản tin học để nâng cao kỹ năng lập trình cho học sinh khá, giỏi

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 (128.55 KB, 20 trang )

1. MỞ ĐẦU
1.1. Lý do chọn đề tài
Tin học là một môn học mới ở các trường phổ thông nên học sinh còn
nhiều bỡ ngỡ khi tiếp cận với môn học này. Nội dung tin học lập trình lớp 11 là
một nội dung mới lạ đối với đa số học sinh với nhiều khái niệm, thuật ngữ, cấu
trúc dữ liệu mà học sinh mới được tiếp xúc lần đầu. Chính vì vậy mà học sinh dễ
mắc sai lầm khi lập trình giải quyết các bài toán. Trong việc giảng dạy cho HS,
ngoài việc giúp học sinh lĩnh hội những kiến thức cơ bản, người thầy còn phải
biết kích thích tính tích cực, sự sáng tạo say mê học hỏi trong học tập của các
em. Vì việc học tập tự giác, tích cực, chủ động, sáng tạo đòi hỏi học sinh phải có
ý thức về những mục tiêu đặt ra, tạo được động lực bên trong thúc đẩy bản thân
các em hoạt động để đạt các mục tiêu đó. Điều này được thực hiện trong dạy học
không chỉ đơn giản bằng việc nêu rõ mục tiêu mà quan trọng hơn còn gợi động
cơ trong học tập.
Để rèn luyện kỹ năng lập trình cho học sinh khá, giỏi trước khi chọn đội
tuyển đi thi học sinh giỏi môn Tin học có rất nhiều cách mà giáo viên có thể áp
dụng đối với các đối tượng học sinh khác nhau. Các trường có điểm thi đầu vào
cao thì việc rèn luyện kỹ năng sẽ có nhiều thuận lợi nhưng với các trường có
điểm thi đầu vào trung bình và thấp thì việc rèn luyện kỹ năng lập trình cho các
em gặp rất nhiều khó khăn. Tuy nhiên trong cùng một trường với các đối tượng
học sinh khác nhau giáo viên có thể áp dụng nhiều biện pháp khác nhau để rèn
luyện kỹ năng lập trình cho học sinh với hiệu quả khác nhau. Các giáo viên đều
hướng dẫn cho học sinh biết một bài toán có thể được giải với nhiều thuật toán
khác nhau và mỗi thuật toán chỉ giải được một bài toán hoặc một lớp bài toán,
nhưng thực tế cho thấy, đứng trước một bài toán tin học học sinh thường lúng
túng khi xác định thuật toán hoặc không xác định được thuật toán. Việc này cũng
có thể do nhiều nguyên nhân, chẳng hạn môn Tin học không liên quan đến thi đại
học nên các em không chú tâm học, không đầu tư, do các em không có máy để
thực hành thêm ở nhà. Tuy nhiên khi cho một bài toán tin học có dạng tương tự
hoặc dạng mở rộng từ một bài toán cơ bản nào đó trong sách giáo khoa, hoặc
một bài toán cơ bản nào đó mà các em biết thì các em có thể xây dựng và có


hứng thú để xây dựng thuật toán cho bài toán đặt ra. Vì vậy giáo viên có thể
chọn các bài tập cơ bản từ đó mở rộng và phát triển để rèn luyện kỹ năng lập
trình cho học sinh.
Dĩ nhiên cách làm này không mới với giáo viên nhưng cách chọn các bài
toán cơ bản như thế nào để học sinh có thể vận dụng và gây được hưng thú cho
học sinh đó lại là điều đáng quan tâm. Với đề tài “Mở rộng các bài toán cơ bản
để nâng cao kỹ năng lập trình cho học sinh khả, giỏi” nên trong sáng kiến kinh

1


nghiệm này tôi muốn trình bày kinh nghiệm trong việc rèn luyện kỹ năng lập
trình cho học sinh khá, giỏi khi học môn Tin học 11.
2. Mục đích nghiên cứu
Hệ thống các bài toán dưới dạng một số dạng bài tập thường gặp giúp cho
giáo viên và học sinh phần nào nhận dạng và giải một số bài tập liên quan. Việc
áp dụng thuật toán của các bài toán cơ bản để xây dựng thuật toán cho các bài
toán tương tự hoặc các bài toán mở rộng từ các bài toán cơ bản đó là một quá
trình giúp học sinh rèn luyện kỹ năng lập trình.
3. Đối tượng nghiên cứu
Sử dụng ngôn ngữ lập trình Turbo Pascal và Free Pascal để tiến hành
nghiên cứu các bài toán nâng cao dành cho học sinh khá, giỏi với đối tượng
nghiên cứu là học sinh khối 11 của trường PT Nguyễn Mộng Tuân.
Hình thành được kỹ năng thực hành giải các bài tập cho học sinh và có
được một hệ thống kiến thức với các dạng bài tập lập trình.
4. Phương pháp nghiên cứu
Hình thành ở học sinh kỹ năng phân tích, xử lý các vấn đề liên quan đến
bài tập, sử dụng thành thạo vòng lặp biết trước, thủ tục chuẩn vào/ra đơn giản,
bước đầu làm quen với một số chương trình con dạng thủ tục tạo điều kiện thuận
lợi cho việc tiếp thu kiến thức về cách viết chương trình có cấu trúc.

Để trình bày sáng kiến kinh nghiệm này, tôi đã sử dụng phối kết hợp nhiều
phương pháp như: nghiên cứu tài liệu, thuyết trình, quan sát, tham khảo ý kiến
của cấp trên và đồng nghiệp, điều tra cơ bản, thực nghiệm so sánh, phân tích kết
quả thực nghiệm, … phù hợp với môn học thuộc lĩnh vực Tin học.
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
Nghị quyết hội nghị Trung ương VIII khóa XI chỉ đạo: “Giáo dục và đạo tạo
là Quốc sách hàng đầu, là sự nghiệp của Đảng và Nhà nước và của toàn dân. Đầu
tư cho giáo dục là đầu tư phát triển, được ưu tiên đi trước cho các chương trình,
kế hoạch phát triển kinh tế, xã hội; phát triển giáo dục và đào tạo là nâng cao dân
trí, đào tạo nhân lực, bồi dưỡng nhân tài. Chuyển mạnh quá trình giáo dục từ chủ
yếu trang bị kiến thức sang phát triển toàn diện năng lực và phẩm chất người
học. Học đi đôi với hành, lý luận gắn với thực tiễn, giáo dục nhà trường kết hợp
với giáo dục gia đình và giáo dục xã hội”.

2


Nghị quyết hội nghị Trung ương VIII khóa XI đề ra mục tiêu: “Đối với giáo
dục phổ thông tập trung phát triển trí tuệ, thể chất, hình thành phẩm chất, năng
lực công dân, phát hiện và bồi dưỡng năng khiếu, định hướng nghề nghiệp cho
học sinh. Nâng cao chất lượng giáo dục toàn diện, chú trọng giáo dục lý tưởng
truyền thống đạo đức, lối sống, ngoại ngữ, tin học, năng lực và kỹ năng thực
hành, vận dụng kiến thức vào thực tiễn, phát triển khả năng sáng tạo và tự học,
khuyến khích học tập suốt đời, hoàn thành đào tạo giáo dục phổ thông giai đoạn
sau 2015”.
Căn cứ vào mục tiêu của môn Tin học, là phải cung cấp những tri thức cơ
bản, làm nền tảng để học sinh có thể tiếp tục đi sâu vào tìm hiểu và xây dựng
khoa học Tin học hoặc tiếp thu những tri thức của các lĩnh vực kĩ thuật công
nghệ tiên tiến, nhất là các lĩnh vực của công nghệ thông tin. Môn Tin học, cũng

như mọi môn học khác, căn cứ vào mục tiêu trên để xác định ra nhiệm vụ cụ thể
của môn học, tổ chức hoạt động đào tạo góp phần thực hiện mục tiêu giáo dục
mà Đảng và nhà nước đề ra.
Nếu học sinh được rèn luyện các kỹ năng cơ bản về lập trình tốt thì việc
mở rộng các bài toán cơ bản dành cho học sinh khá giỏi sẽ cuốn hút học sinh, tạo
hứng thú cho học sinh khi học lập trình.
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
Môn Tin học là môn học đặc thù có nhiều kiến thức khó như lập trình
pascal ở lớp 11 (đây là kiến thức thi học sinh giỏi tỉnh môn Tin học) nhưng
thường bị xem nhẹ, bị xem là “môn phụ”. Học sinh – phụ huynh chưa mặn mà,
chưa quan tâm đúng mực tới môn học nên việc lựa chọn và bồi dưỡng học sinh
giỏi là vô cùng khó khăn. Đứng trước một bài toán tin học, học sinh thường lúng
túng và không biết tìm thuật toán của bài toán từ đâu và tìm như thế nào? Một số
học sinh khá, giỏi thì có thói quen là mò mẫm và thử nghiệm để tìm lời giải, điều
đó có thể dẫn tới kết quả đúng hoặc sai hoặc chệch hướng giải quyết bài toán,
hiệu suất để tìm thuật toán như thế là không cao, một số học sinh kém hơn thì
không biết cách tìm thuật toán từ đâu và điều đó gây tâm lý chán nản cho các
em. Với tình hình ấy để giúp học sinh định hướng tốt hơn trong quá trình tìm
thuật toán, trước khi có thể tự tìm được thuật toán tốt hơn thì người giáo viên cần
tạo cho học sinh thói quen tìm thuật toán cho bài toán đặt ra từ các các bài toán
cơ bản quen thuộc mà các em đã biết, khai thác các yếu tố đặc trưng của một số
bài toán cơ bản để tìm thuật toán cho các bài toán mới. Việc áp dụng thuật toán
của các bài toán cơ bản để xây dựng thuật toán cho các bài toán tương tự hoặc
các bài toán mở rộng từ các bài toán cơ bản đó là một quá trình giúp học sinh rèn
luyện kỹ năng lập trình.
3


Chính vì vậy khi mở rộng các bài toán cơ bản trong SGK Tin học 11 để
nâng cao kỹ năng lập trình cho học sinh khá giỏi, tôi nhận thấy các em hiểu sâu

hơn về thuật toán và cảm nhận thấy học lập trình cũng không khó đến mức mình
không thể hiểu, dần dần yêu thích môn học hơn. Và đó cũng là bước cơ bản để
tạo tiền đề trong việc lựa chọn học sinh để bồi dưỡng học sinh giỏi.
2.3. Giải pháp đã sử dụng để giải quyết vấn đề
2.3.1. Các giải pháp thực hiện
1. Xây dựng hệ thống bài tập để rèn luyện kỹ năng lập trình thông qua các
buổi học, mỗi buổi học nên chọn một bài toán cơ bản để mở rộng và phát triển
kỹ năng lập trình.
Mỗi buổi học nên xây dựng hệ thống bài tập như sau:
Bước 1: Chọn bài toán cơ bản hoặc bài toán quen thuộc với học sinh để
học sinh lập trình.
Bước 2: Mở rộng bài toán ở cấp độ 1 (chỉ cần học sinh lập trình được mà
chưa cần quan tâm đến các yếu tố như: quan tâm đến các yếu tố đặc biệt của dữ
liệu vào, thời gian, phạm vi giá trị của biến…)
Bước 3: Mở rộng bài toán ở cấp độ 2 (quan tâm đến các yếu tố như: các
trường hợp đặc biệt của dữ liệu vào, phạm vi giá trị của các biến, thời gian,
chuyển sang đọc ghi vào kiểu tệp …)
Bước 4: Mở rộng bài toán để học sinh rèn luyện kỹ năng lập trình ở nhà
trên máy hoặc trên giấy sau đó nộp lại để giáo viên kiểm tra đánh giá.
2. Tổ chức cho học sinh hình thành kỹ năng lập trình thông qua nhiều buổi
học có sự hướng dẫn của giáo viên tại phòng máy.
3. Tổ chức kiểm tra để thu thập thông tin về khả năng rèn luyện kỹ năng
lập trình của học sinh.
2.3.2 Các biện pháp để tổ chức thực hiện
Nội dung này được triển khai thông qua các buổi học (mỗi buổi học 3
tiết). Số lượng buổi học là bao nhiêu buổi là do giáo viên xây dựng tùy vào chất
lượng học sinh.
Trong phạm vi chương trình môn tin học lớp 11, chúng ta có thể sử dụng
một số hệ thống bài tập sau để rèn luyện kỹ năng lập trình cho học sinh khá, giỏi
thông qua các buổi học:

2.3.2.1. Hoạt động 1: Tìm hiểu một số bài toán về ước số(Buổi 1+2)
Bài tập 1: (Bài toán cơ bản)

4


Viết chương trình nhập từ bàn phím số nguyên dương N, tính tổng các ước thực
sự của N và in ra màn hình. Ví dụ: N=6 thì tổng các ước là 1+2+3 =6; N=9 thì
tổng các ước là 1+ 3 =4
Nhận xét: Học sinh biết để kiểm tra xem số i có phải là ước của số N hay không
thì dùng phép toán Mod (N mod i = 0), giáo viên chỉ cần hướng dẫn học sinh
duyệt các số i đó trong khoảng từ 1 đến (N div 2) là học sinh có thể làm được
nhanh chóng, ta sẽ có đáp án của bài này có thể như sau:
Program bai1;
Var i,tg,N:word;
Begin
write(‘Nhap N=’);
readln(N);
tg:=0;
for i:=1 to N div 2 do
if n mod i =0 then tg:=tg+i;
writeln(‘Tong cac uoc la= ‘, tg:5);
Readln;
End.
Giáo viên có thể yêu cầu học sinh nhập một vài giá trị N để xem kết quả. Sau đó
yêu cầu học sinh làm bài tập 2 như sau:
Bài tập 2: Số N được gọi là số hoàn hảo nếu tổng các ước thực sự của N bằng
chính nó. Viết chương trình nhập từ bàn phím số nguyên dương N, thông báo ra
màn hình DUNG nếu N là số hoàn hảo, ngược lại thì thông báo KHONG.
Nhận xét: Học sinh dễ dàng nhận thấy cách làm bài 2 sẽ tương tự cách làm bài 1,

chỉ thêm một công việc đó là kiểm tra xem tổng các ước đó có bằng N hay
không? Học sinh sẽ nhanh chóng sao chép chương trình bài1 và sửa lại để được
chương trình bài 2 như sau:
Program bai2;
Var i,tg,N:word;
Begin
write(‘Nhap N=’);
readln(N);
tg:=0;
for i:=1 to N div 2 do
if n mod i =0 then tg:=tg+i;
if tg=N then Writeln(‘DUNG’) else writeln(‘KHONG’);
Readln;
End.

5


Tương tự như vậy ta sẽ yêu cầu học sinh làm bài tập 3 như sau:
Bài tập 3: Viết chương trình in ra màn hình các số hoàn hảo trong khoảng từ a
đến b (với 1Nhận xét: Giáo viên để cho học sinh tự làm, nếu còn học sinh nào còn lúng túng
thì mới hướng dẫn. Tuy nhiên thì với bài 2 đã biết cách làm thì học sinh cũng có
thể nhanh chóng hoàn thiện được bài 3 có thể chưa kiểm tra được điều kiện nhập
a,b như sau:
Program bai3;
Var i,a,b,k,tg:word;
Begin
Write(‘Nhap a,b=’);
Readln(a,b);

For k:=a to b do
Begin
Tg:=0;
For i:=1 to K div 2 do
If K mod i =0 then tg:=tg+i;
If tg=K then Writeln(k);
End;
Readln;
End.
Giáo viên yêu cầu học sinh test với một số bộ dữ liệu tương ứng với các giá trị
của a, b và yêu cầu học sinh hoàn thiện thêm đọan lệnh kiểm tra điều kiện nhập
a,b bằng repeat..until.
Bài tập 4: Bài tập được nâng lên với mức độ khó hơn
Trong một buổi học toán, Bờm được học khái niệm về số có tính chất đặc
biệt Số hoàn hảo là số có tổng các ước trừ nó ra thì bằng chính nó. Ví dụ: Số 6 là
số hoàn hảo vì nó có tổng các ước 1+2+3=6, số 8 không phải là số hoàn hảo vì
1+2+4=7#8. Cho dãy từ a1,a2,….aN. Hãy giúp bờm đếm xem trong dãy có bao
nhiêu số có tổng các chữ số là số hoàn hảo.
* Nhận xét:
Bài toán này cũng tương tự như các bài tập trên, nó cũng áp dụng đoạn
chương trình kiểm tra số hoàn hảo nhưng được nâng lên mức độ khó hơn, trong
chương trình có sử dụng hai biến “dem”.
Chương trình được viết như sau:
Program

Bài 4;
6


Var a:array[1..100] of integer;

n.i.dem1: integer;
Function
sohh(m:integer):Boolean;
Var j,dem:integer;
Begin
dem:=0;
sohh:=false;
for j:=1 to m div 2 do
begin
If m mod j=0 then dem:=dem+j;
end;
if dem=m then sohh:=true;
End;
BEGIN
dem1:=0;
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do if sohh(a[i]) then dem:=dem+1;
write(dem1);
END.
Bài tập 5: Hai số a và b được gọi là bạn của nhau nếu tổng các ước của a bằng b
và ngược lại tổng các ước của b bằng a. Viết chương trình tìm các số bè bạn như
trên trong khoảng từ m đến n (m < n, m và n nhập từ bàn phím).
Tương tự ta yêu cầu học sinh sao chép sửa lại chương trình bài tập 4 để được bài
tập 5.
Bài tập 6: (Bài tập về nhà)
Viết chương trình nhập vào 2 số a, b (1hình số lượng các số chẵn, số lượng các số lẽ, số lượng các số hoàn hảo trong
khoảng từ a đến b, với a, b được nhập từ bàn phím.
Bài tập 7: (Bài tập về nhà)

Em hãy dùng câu lệnh while để viết lại chương trình của bài 4 và bài 5.
Yêu cầu: Kiểm tra điều kiện nhập dữ liệu vào. Viết chương trình ra giấy và nộp
lại cho giáo viên.
Sau buổi 2 kỹ năng vận dụng các cấu trúc vòng lặp For- If, While - if lồng
nhau đã đựoc cải thiện hơn.
2.3.2.2. Hoạt động 2: Một số dạng bài tập về mảng một chiều (Buổi 3+4)
DẠNG 1: Duyệt mảng để tìm các phần tử thoả mãn một yêu cầu nào đó?
7


Yêu cầu các phần tử đó có thể là:
+ Là số chẵn
+ Là số lẻ
+ Là số chia hết cho một số K
+ Tính tổng các số của dãy
+ Tìm giá trị lớn nhất, giá trị nhỏ nhất trong dãy
+ Là số chính phương
+ Là số nguyên tố
+ Là số hoàn hảo
+ Dãy có phải là cấp số cộng hay không
+ Dãy tồn tại một cặp số mà trung bình cộng bằng k
+ Sắp xếp dãy số theo thứ tự tăng hay giảm dần.
….
Bài tập 1: (Bài toán cơ bản)
Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm N phần tử.
Thông báo ra màn hình các số chẵn có trong mảng đã nhập và số lượng của
chúng.
Nhận xét: Với cách nhập dữ liệu cho mảng, cách dùng vòng For để duyệt mảng
đã được học hoặc đã được làm quen với các ví dụ các em có thể dễ dàng hoàn
thành chương trình có thể như sau:

Program bai1;
Const Nmax=100;
Var A:array[1..Nmax] of integer;
I,dem,N : integer;
Begin
Writeln(‘Nhap n=’);
Readln(N);
For i:=1 to N do
begin
writeln(‘nhap phan tu thu ‘,i);
read(A[i]); {doc tung phan tu vao mang}
end;
Dem:=0; {khoi tao bien dem=0 (chua dem duoc so nao thoa man)}
For i:=1 to N do
if A[i] mod 2 =0 then {Xu li luon cac phan tu cua mang}
begin
write(A[i],’ ‘); {in phan tu thoa man ra man hinh}
inc(dem); {tang bien dem len mot don vi}
end;
writeln; {Dua con tro xuong dong de in so luong phan tu thoa man}
8


writeln(dem); {in so luong ra man hinh}
readln;
END.
Bài tập 2: Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm
N phần tử. Thông báo ra màn hình các số lẻ có trong mảng đã nhập và số lượng
của chúng.
Nhận xét: Giáo viên yêu cầu học sinh từ chương trình bài tập 1 lưu lại với tên

khác và sửa lại để hoàn thành chương trình bài 2. (Mất khoảng 1-2 phút học sinh
sẽ hoàn thành)
Bài tập 3: Viết chương trình nhập vào từ bàn phím số nguyên N, số K và mảng
A gồm N phần tử. Thông báo ra màn hình các số chia hết cho K có trong mảng
đã nhập và số lượng của chúng.
Nhận xét: Giáo viên yêu cầu học sinh từ chương trình bài tập 2 lưu lại với tên
khác và sửa lại để hoàn thành chương trình bài 3. (Mất khoảng 3-6 phút học sinh
sẽ hoàn thành)
Bài tập 4: Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm
N phần tử. Thông báo ra màn hình các số nguyên tố có trong mảng đã nhập và số
lượng của chúng.
Bài tập 5: Viết chương trình nhập vào từ bàn phím số nguyên N và mảng A gồm
N phần tử. Thông báo ra màn hình các số hoàn hảo có trong mảng đã nhập và số
lượng của chúng.
Nhận xét: Giáo viên yêu cầu học sinh từ chương trình bài tập 1 lưu lại với tên
khác, dựa vào thuật toán kiểm tra số hoàn hảo đã học ở buổi trước để sửa lại
chương trình thành chương trình bài 5. (Mất khoảng 8-12 phút học sinh sẽ hoàn
thành).
DẠNG 2: Thuật toán sắp xếp và một số bài tập áp dụng thuật toán sắp xếp
Bài tập 1: (Bài toán cơ bản)
Viết chương trình vào từ bàn phím số nguyên N và mảng A gồm N phần tử. In ra
màn hình mảng A sau khi đã sắp xếp các phần tử theo thứ tự tăng dần.
Nhận xét: Có nhiều thuật toán sắp xếp nhưng chúng ta chưa nên giới thiệu các
thuật toán như QuickSort..., chỉ nên giới thiệu thuật toán sắp xếp đơn giản, chẳng
hạn:
Program baitap1;
const nmax=20;
var a:array[1..nmax]of integer;
tg:integer;
i,j,n:integer;

begin
9


Writeln(‘Nhap so luong phan tu cua mang’);
Readln(N);
for i:=1 to n do{Cho i chạy từ 1 đến N}
Begin
Writeln(‘nhap phan tu thu ‘,i);
read(a[i]);{Đọc phần tử thứ i vào mảng}
End;
{Sap xep mang}
for i:=1 to n-1 do{Cho i chạy từ 1 đến N -1}
for j:=i+1 to n do{Cho i chạy từ i+1 đến N}
if a[i]>a[j]then{Nếu a[i]>a[j] thì}
begin
tg:=a[i];a[i]:=a[j];a[j]:=tg;{đỗi chỗ a[i] và a[j]}
end;
for i:=1 to n do write(a[i],' ');{In mảng đã sắp xếp ra tệp}
readln;
end.
Bài tập 2: Tương tự thuật toán sắp xếp như Bài 1 nhưng mức độ được nâng lên
khó hơn. Bài toán như sau:
Cho dãy số gồm N số nguyên dương a1,a2,…,an và một số nguyên k.
Yêu cầu: Sắp xếp dãy số theo thứ tự tăng dần và chèn thêm k vào dãy số đã sắp
xếp sao cho dãy vẫn là dãy tăng dần.
Chương trình được viết như sau:
Program baitap2;
Var a:array[1..1000] of integer;
Procedure

sapxep;
Begin
For i:=1 to n-1 do
For j:=i+1 to n do
If a[i] >a[j] then
Begin
tg:=a[i];
a[i]:=a[i+1];
a[i+1]:=tg;
BEGIN
readln(n,k);
for i:=1 to n do read(a[i]);
sapxep;
10


while a[i]if i>n then a[n+1]:=k
else begin
for j:=n downto i do
a[i+1]:=a[i];
a[i]:=k;
end;
for i:=1 to n+1 do write(a[i],’’);
END.
Bài tập 3: Hãy đếm xem trong dãy số cho trước có bao nhiêu số đôi một khác
nhau.
Nhận xét: + Áp dụng thuật toán sắp xếp như các bài toán trên
+ Khởi tạo một biến dem=1
+ Duyệt từ vị trí 1 đến vị trí thứ n-1, nếu a[i]<>a[i+1] thì tăng dem

lên 1.
+ Kết quả bài toán in ra dem.
Chương trình chạy như sau:
Program
baitap3;
Maxn=10000;
Var i,n:longint;
dem:longint;
a:array[0..maxn+1] of longint;
Procedure sapxep;
Var i,j,tg:longint;
begin
For i:=1 to n-1 do
For j:=i+1 to n do
If a[i]>a[j] then
begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
end;
end;
BEGIN
readln(n);
for i:=1 to n do read(a[i]);
dem:=1;
sapxep;
11


for i:=1 to n-1 do

if a[i] <> a[i+1] then inc(dem);
writeln(dem);
END.
Bài tập về nhà: Em hãy suy nghĩ về thuật toán để giải quyết bài toán sau đây, có
thể tham khảo thuật toán đã hướng dẫn.
Bài tập 4: Viết chương trình nhập vào một dãy số nguyên có n phần tử.
a. Đưa những phần tử lẻ ra đầu danh sách, những phần tử chẵn về cuối
danh sách và in kết quả ra màn hình.
b. Sắp xếp các phần tử lẻ đầu danh sách theo thứ tứ tăng dần, sắp xếp
các phần tử
chẵn cuối danh sách theo thứ tự giảm dần. In danh sách ra
màn hình.
Hướng dẫn thuật toán:
Câu a) Dùng đồng thời 2 biến, biến L duyệt từ đầu dãy đến cuối dãy (để xếp các
phần tử lẻ lên đầu), biến R duyệt từ đầu dãy đến cuối dãy (để xếp các phần tử
chẵn về cuối), nếu biến L gặp số chẵn và biến R gặp số lẻ thì ta đổi chỗ 2 giá trị
A[L] và A[R] cho nhau, nếu biến L gặp số lẻ thì tăng L, hoặc biến R gặp số chẵn
thì tăng R. Quá trình tìm và xếp đó sẽ kết thúc khi L>R.
Câu b) Vì câu ở Câu a ta xếp các phần tử lẻ lên đầu, phần tử chẵn ở cuối dãy nên
ở câu b ta chỉ cần dùng biến K đếm xem có bao nhiêu phần tử lẻ sau đó ta dùng
thuật toán sắp xếp tăng dần cho đoạn từ 1 đến K, sau đó ta lại dùng thuật toán sắp
xếp giảm dần cho đoạn từ K+1 đến N.
Bài tập 5: Viết chương trình nhập vào từ bàn phím mảng một chiều A gồm M
phần tử, mảng một chiều B gồm N phần tử. Yêu cầu: Hãy trộn hai dãy trên thành
một dãy C và dãy C được sắp xếp theo thứ tự tăng dần
Nhận xét: Giáo viên nên để cho học sinh thử tìm thuật toán cho bài này dựa vào
thuật toán sắp xếp đã biết ở các bài trên, sau đó mới hướng dẫn thuật toán.
Hướng dẫn thuật toán:
+Đưa ra thuật toán trộn hai dãy lại với nhau:
+ Sử dụng thuật toán sắp xếp như các bài toán trên

+Câu lệnh được sử dụng như sau:
For i:=1 to m+n do read (a[i]);
For j:=(m+n) downto 2 do
For i:=1 to j-1 do
If a[i]>a[i+1] then
Begin
tg:=a[i];
a[i]:=a[i+1];
12


a[i+1]:=tg;
End;
For i:=1 to m+n do write(a[i],’’);
Bài tập 6: Hãy đổi chỗ các phần tử trong dãy sao cho các phần tử dương nằm ở
đầu dãy, các phần tử âm nằm ở cuối dãy và in ra dãy sau khi đã sắp xếp
Nhận xét:
+ Ta sử dụng hai biến i và j
+ Nếu gặp số hạng dương thì biến chỉ số i được tăng lên 1
+ Nếu gặp số hạng âm thì biến chỉ số j bị giảm đi 1
+ Áp dụng thuật toán sắp xếp như các bài toán trên
i:=1;j:=n;
repeat
while a[i]>0 do i:=i+1;
while a[j]<=0 do j:=j-1;
if itg:=a[i];
a[i]:=a[j];
a[j]:=tg;
end;

until j<=i;
for i:=1 to n do write(a[i],’’);
DẠNG 3: Tìm một phần tử X trong mảng thoã mãn điều kiện nào đó
Ví dụ: X là phần tử nhỏ nhất hoặc lớn nhất của dãy
Bài tâp 1: Từ hai bài toán cơ bản trong chương trình SGK học Tin 11 là tìm giá
trị lớn nhất và giá trị nhỏ nhất của một dãy. Ta nâng cao hơn theo mức độ khá bài
toán sau:
Viết chương trình nhập vào từ bàn phím mảng A gồm N phần tử là số nguyên.
Thông báo ra màn hình phần tử lớn nhất và phần tử nhỏ nhất của mảng và chỉ số
lớn nhất và chỉ số nhỏ nhất trong mảng.
Nhận xét: Thuật toán tìm giá trị nhỏ nhất và lớn nhất hoặc sinh đã được làm quen
trong sách giáo khoa nên học sinh có thể dễ dàng làm được bài này.
Dễ dàng học sinh có thể sẽ kết hợp cách làm cả 2 bài để hoàn thành chương trình
bài 3 với 2 vòng lặp, tuy nhiên ta nên yêu cầu học sinh nên sử dụng một vòng
lặp.
Kết hợp lại thuật toán tìm Max và Min để học sinh nhớ:
- Giả sử số lớn nhất và số nhỏ nhất là số đầu tiên: Max:=a[1]; Min:=a[1].
- Duyệt qua các phần tử a[i], với i chạy từ 2 tới N:
Begin
Nếu a[i]>Max thì gán Max:=a[i];
Nếu a[i]13


For i:=1 to n do read a[i];
Max:=1;csmax:=1;
For i:=2 to n do
If a[i]>max then begin
max:=a[i];
csmax:=i;

end;
writeln(max,’’,csmax);
min:=a[1];csmin:=1;
for i:=2 to n do
if a[i]begin
min:=a[i]’
csmin:=i;
end;
writeln(min,’’,csmin);
Bài tập 2: Nhập vào một mảng các số nguyên.
a/ Xếp lại mảng đó theo thứ tự giảm dần.
b/ Nhập vào một số nguyên từ bàn phím. Chèn số đó vào mảng sao cho
mảng vẫn có thứ tự giảm dần. (không được xếp lại mảng)
Bài tập 3: Nhập mảng gồm N số nguyên từ bàn phím. Sau đó nhập số nguyên X.
Hãy loại bỏ ở dãy các phần tử bằng X. In dãy ra màn hình
VD : Dãy: 3 4 6 5 8 3 6 7 6
với X = 6 => Dãy in ra: 3 4 5 8 3 7
2.3.2.3. Hoạt động 3: Một số bài toán về số nguyên tố (Buổi 5+6)
Bài tập 1: (Bài toán cơ bản)
Viết chương trình nhập vào từ bàn phím số nguyên N. Kiểm tra và thông
báo ra màn hình N là số nguyên tố hoặc N không là số nguyên tố.
Nhận xét: Bài toán này học sinh đã được tìm hiểu thuật toán từ lớp 10, nếu học
sinh quên giáo viên có thể nêu lại thuật toán để học sinh nhớ lại. Ở đây ta chưa
cần hướng dẫn cho học sinh thuật toán tốt để kiểm tra số nguyên tố. Chương
trình có thể như sau:
Program baitap1;
Var i,n:integer;
kq:boolean;
BEGIN

write('N = ');readln(n);
kq:=true;
if n<=1 then kq:=false
14


else
for i:=2 to round(sqrt(n)) do
if n mod i=0 then
begin
kq:=false;
break;
end;
if kq then writeln('So nguyen to') else write('Khong la so nguyen to');
readln;
END.
Bài tập 2: Mức độ nâng cao hơn dành cho học sinh khá
Cho dãy gồm n số nguyên dương của dãy và một số nguyên k. Yêu cầu:
a) Đếm số lượng các phần tử của dãy số là số nguyên tố
b) Cho biết chỉ số và giá trị của các phần tử có giá trị nhỏ hơn k là số nguyên
tố.
Nhận xét: Sử dụng thuật toán kiểm tra số nguyên tố như bài 1 nhưng mức độ
thuật toán tốt hơn là sử dụng chương trình con để kiểm tra số nguyên tố. Chương
trình có thể viết như sau:
Program baitap 2;
Var a:array[1..10000] of longint;
K,n,i,dem:longint;
Function snt(m:longint):boolean;
Var j:integer;
Begin

Snt:=true;
If m=1 then snt:=false;
For j:=2 to round(sqrt(m)) do if (m mod j=0) then snt:=false;
End;
BEGIN
Dem:=0;
readln(n,k);
for i:=1 to n do read(a[i]);
for i:=1 to n do if(snt(a[i]) and (a[i]writeln(dem);
For i:=1 to n do if(snt(a[i])) and (a[i]END.
Sau khi học sinh hoàn thành chương trình giáo viên nên đưa ra một số bộ test
tương ứng với các giá trị của N để học sinh chạy thử và hoàn thiện điều kiện
nhập dữ liệu cho chương trình.
15


Bài tập 3: Mức độ dành cho học sinh giỏi
Số siêu nguyên tố là số nguyên tố mà khi bỏ một số tuỳ ý các chữ số bên phải
của nó thì phần còn lại vẫn tạo thành một số nguyên tố.
Ví dụ 37337 là một số siêu nguyên tố có 5 chữ số vì 3733, 373, 37,3 cũng là các
số nguyên tố.
Hãy viết chương trình đọc dữ liệu vào là một số nguyên N (0< N <10) từ bàn
phím và đưa ra kết quả ra màn hình là các số siêu nguyên tố có N chữ số cùng
số lượng của chúng.
Ví dụ khi chạy chương trình:
Dữ liệu vào
5


Dữ liệu ra
23333 23339 23399 23993 29399 31193
31379 37337 37339 37397 59393 59399
71933 73331 73939
Co 15 so sieu nguyen to co 5 chu so

Bài này chúng ta phải hướng dẫn trước thuật toán và in ra giấy để học sinh
có thể tham khảo và rèn luyện được ở nhà sau đó giáo viên sẽ sửa chương trình ở
buổi sau.
Hướng dẫn thuật toán:
- Viết hàm kiểm tra số nguyên tố (ngto(n)) nếu đã học chương trình con.
Nhận xét: Từ định nghĩa về số siêu nguyên tố ta thấy các số siêu nguyên tố có N
chữ số được xây dựng từ các số nguyên tố có một chữ số là 2, 3, 5, 7. Từ các số
nguyên tố có một chữ số ta sẽ ghép chúng với các chữ số từ 0 đến 9 để được số
có 2 chữ số và chỉ lấy các số có 2 chữ số là số nguyên tố. Ví dụ: 23, 29, 31…. Và
cứ tiếp tục xây dựng các số nguyên tố như vậy cho đến khi đủ N chữ số.
- Dùng mảng A để tính và lưu các số siêu nguyên tố có 1, 2, …,n chữ số (lần
lượt xây dựng từng số một)
Dùng mảng B để lưu lại mảng A trươc đó có i chữ số để xây dựng các số
siêu nguyên tố có i+1 chữ số.
Thuật toán cụ thể như sau:
Bước 1: Nhập số nguyên N (số chữ số của số siêu nguyên tố)
Bước 2:
Gán ka =1 {ka là số lượng phần tử của mảng A, ban đầu gán ka=1}
Gán a[ka]=0; {giả sử phần tử đầu tiên của mảng A bằng 0}
i:=1; {biến đếm vòng lặp, dùng để xây dựng số siêu nguyên tố có i
chữ số}
Bước 3: Nếu i>N thì chuyển sang Bước 7 {Đã xây dựng đủ N chữ số}
Bước 4:


16


4.1 Gán kb=0; {kb là số phần tử của mảng B, đóng vai trò là mảng lưu kết
quả trung gian dùng để lưu lại mảng A trong khi tính toán}
4.2 Gán k=1 {là biến dùng để duyệt các phần tử trong mảng A}
4.3 Nếu k>ka thì chuyển sang Bước 5
4.4 Gán biến cs =0 {là biến dùng để duyệt các chữ số từ 0 đến 9}
4.5 Nếu cs>9 thì chuyển sang Bước 4.6
4.5.1 Gán m=a[k]*10 + cs; {dùng biến m để xây dựng số siêu ntố}
4.5.2 Nếu m là số nguyên tố thì sang Bước 4.5.3
{Thuật toán kiểm tra số nguyên tố học sinh đã biết nên không hướng dẫn ở đây}
4.5.3 kb := kb+1 {tăng kb lên 1 để lưu số tiếp theo},
b[kb]:=a[k]*10 + cs; {lưu lại số vừa xây dựng vào mảng B}
4.5.4 Gán cs= cs+1 quay lại Bước 4.5
4.6 Gán k = k +1 quay lại Bước 4.3
Bước 5: Gán ka=kb; {lưu lại số phần tử của mảng A = số phần tử của mảng B
vừa xây dựng được}
5.1 Gán t =1 {dùng biến đếm t để lưu kết quả từ mảng B vào mảng A}
5.2 Nếu t > ka thì chuyển sang Bước 6
5.3 Gán a[t]=b[t], gán t=t+1 quay lại Bước 5.2
Bước 6: Gán i= i+1 và quay lại Bước 3
Bước 7: In ra màn hình các số siêu nguyên tố có N chữ số, số lượng các số siêu
nguyên tố là ka, kết thúc.
Học sinh dựa vào các bước trên để xây dựng chương trình
Bài tập rèn luyện ở nhà:
Bài tập 4:
Cho số nguyên N chẵn (nhập từ bàn phím), lập chương trình phân tích N
thành tổng 2 số nguyên tố. Nếu có in ra các cách phân tích. VD: 6 = 3+ 3
Nhận xét: Học sinh sẽ vận dụng thuật toán của bài 1 và 2 để giải quyết bài 3.

Giáo viên nên để học sinh tự làm, nếu còn lúng túng thì mới hướng dẫn thuật
toán.
Bài tập 5:
Nhập vào một số tự nhiên N (1 < N ≤ 65355). Hãy kiểm tra số N vừa nhập
có phải là số nguyên tố hay không? Nếu đúng thì thông báo ra màn hình đây là
số nguyên tố, ngược lại thì phân tích số N thành tích các thừa số nguyên tố.
Ví dụ:
Dữ liệu vào
Dữ liệu ra
Nhap 1 so tu nhien: 37
37 la so nguyen to
Nhap 1 so tu nhien: 30
30 = 2. 3. 5
Nhap 1 so tu nhien: 3456
3456 = 2. 2. 2. 2. 2. 2. 2. 3. 3. 3
Nhap 1 so tu nhien: 677
677 la so nguyen to

17


Nhận xét: Dựa vào thuật toán kiểm tra số nguyên tố giáo viên nên để học sinh
làm bài tập này sau đó hướng dẫn và cũng cố lại thuật toán.
Bài tập 6: Hai số tự nhiên được gọi là nguyên tố cùng nhau nếu chúng có ước số
chung lớn nhất là 1. Cho trước hai số nguyên m và n, hãy kiểm tra xem hai số đó
có phải là số nguyên tố cùng nhau hay không. Nếu là nguyên tố cùng nhau thì
đưa ra kết quả là 1 ngược lại đưa ra kết quả là 0.
Bài tập 7: Một số được gọi là phản nguyên tố nếu ước số của nó là nhiều nhất
trong n số tự nhiên đầu tiên. Cho số k, hãy ghi ra số phản nguyên tố lớn nhất nhỏ
hoặc bằng k.

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
Việc tổ chức dạy học theo tiến trình đưa những bài toán cơ bản trong SGK
trước sau đó mở rộng nâng cao hơn đã đem lại hiệu quả trong việc nâng cao kiến
thức cho học sinh. Các em dần dần lĩnh hội được tri thức, yêu thích môn học
hơn. Học sinh đã nâng cao được tính tư duy sáng tạo, vận dụng linh hoạt lập
trình tốt về các dạng bài toán. Đây là động lực thúc đẩy quá trình học hỏi, tìm tòi
của bản thân. Và đó cũng là bước tiến quan trọng trong việc lựa chọn ra các em
xuất sắc ôn luyện học sinh giỏi. Sau khi áp dụng đề tài nghiên cứu này trong ba
năm gần đây tôi thấy chất lượng học sinh được nâng lên rõ rệt, đặc biệt số lượng
các em học sinh khá, giỏi môn Tin học khối 11 cũng nhiều hơn. Và đó cũng là
tiền đề để lựa chọn các em tham gia ôn đội tuyển học sinh giỏi có hiệu quả hơn.
Như năm 2015-2016 có 1 em đạt giải khuyến khích trong kỳ thi HSG tỉnh. Và
trong năm học vừa qua tôi cũng đứng đội tuyển và cũng có 1 em đạt giải khuyến
khích trong kỳ HSG tỉnh. Với việc mở rộng các bài toán cơ bản đã rèn luyện kỹ
năng lập trình cho các em học sinh tham gia học đội tuyển, các em cũng có thói
quen tối ưu hóa thuật toán và cài đặt chương trình phù hợp để đạt được kết quả.
Trong quá trình giảng dạy tôi nhận thấy rằng: để hiểu hết được ý nghĩa của
người viết sách giáo khoa thật là không dễ, nhưng để truyền đạt được những kiến
thức cơ bản đó đến học sinh với vai trò là người tổ chức hướng dẫn học sinh tìm
tòi, phát hiện kiến thức càng khó khăn hơn. Để bài học hấp dẫn, gây hứng thú
đối với học sinh, ngoài việc tìm hiểu kỹ SGK, người dạy cần có lòng say mê
nhiệt tình, nâng cao trình độ, tìm hiểu thêm các kiến thức bên ngoài, tích lũy các
kinh nghiệm.
Trong năm học 2016=2017 thì tỉ lệ % kết quả học tập của học sinh khi
chưa thực hiện đề tài: Cụ thể với lớp 11A2 có 45 học sinh, ta thu được kết quả
như sau:

18



Điểm
3
4
5
6
7
8
9

Số học sinh
4
8
13
9
7
3
1

Tỉ lệ (%)
8.88%
17.78%
28.89%
20%
15.56%
6.67%
2.22%

Sau khi thực hiện đề tài, tỉ lệ học sinh khá giỏi đã tăng lên nhiều. Kết quả kiểm
tra đối với lớp 11A4 (giống với đề kiểm tra lớp 11A2 trong năm học 2017-2018)

Điểm
3
4
5
6
7
8
9
10

Số học sinh
0
0
4
11
16
6
5
3

Tỉ lệ (%)
0%
0%
8.89%
24.44%
35.56%
13.33%
11.11%
6,67%


3. KẾT LUẬN VÀ KIẾN NGHỊ
3.1. Kết luận
Sau một thời gian áp dụng cách làm này tôi nhận thấy kỹ năng lập trình
của các em tăng lên đáng kể, đặc biệt các em có hứng thú khi học lập trình hơn.
Nhiều học sinh đã biết vận dụng các thuật toán của các bài toán cơ bản đã biết để
giải quyết các bài toán mở rộng, một số em có thể tự tìm được lời giải được một
số bài toán khác khó hơn và trong khi thi học sinh giỏi vừa rồi các em đã có thể
giành được kết quả. Điều đó cho thấy hiệu quả của cách rèn luyện kỹ năng lập
trình bằng việc mở rộng bài toán cơ bản. Với cách làm đơn giản này các em học
sinh sẽ có hứng thú để tiếp tục tìm hiểu và giải quyết các bài toán khác, các thầy,
cô có thể áp dụng cách làm này với nhiều dạng bài tập khác nhau để thấy được
hiệu quả. Tôi hy vọng các thầy cô có thể chọn được đội tuyển để đi thi học sinh
giỏi môn tin học và có được thành tích cao và đó cũng là mong muốn của tôi khi
viết SKKN này.
SKKN này cũng là một cách làm đơn giản và đó là một kinh nghiệm của
bản thân khi lựa chọn đội tuyển học sinh giỏi để đi thi tại một trường mà điểm
thi đầu vào lớp 10 ở mức thấp trong huyện nên việc chọn đội tuyển rất khó khăn.
Với kết quả đó, tôi mạnh dạn viết ra sáng kiến kinh nghiệm mày mặc dù cách
làm chưa được đầy đủ và sâu sắc, chưa thể hiện đầy đủ được các ưu nhược điểm
19


và còn nhiều thiếu sót, rất mong được sự góp ý kiến của lãnh đạo cấp trên, của
tất cả các đồng nghiệp để đề tài được hoàn thiện hơn.
3.2. Kiến nghị
Qua thực tế giảng dạy khối lớp 11 trong năm học 2017-2018 tôi nhận thấy
rằng việc mở rộng các bài toán cơ bản trong Tin học 11 để nâng cao kỹ năng lập
trình cho học sinh khá giỏi đã đem lại hiệu quả cao trong từng giờ dạy, tiết dạy.
Giúp cho đa số học sinh hiểu bài, có hứng thú khi học lập trình, đặc biệt quan
trọng là lựa chọn được đội tuyển đê ôn thi học sinh giỏi. Tuy nhiên, để việc ứng

dụng đề tài này vào việc dạy học được tốt hơn, tôi xin có một số kiến nghị, đề
xuất như sau:
+Để giúp học sinh yêu thích lập trình có nhiều điều kiện rất mong được sự
quan tâm của nhà trường cùng các ngành có liên quan giúp đỡ về cơ sở vật chất.
+Thư viện cần bổ sung thêm tài liệu tham khảo, bồi dưỡng về môn tin học.
+ Nên tổ chức được các buổi thảo luận, giới thiệu được các sáng kiến kinh
nghiệm có chất lượng cao, ứng dụng lớn trong thực tiễn để đồng nghiệp cùng
học hỏi.
Trên đây là một số kinh nghiệm, biện pháp mà tôi đã rút ra được trong quá
trình dạy học, trao đổi với đồng nghiệp và đã áp dụng trong việc lựa chọn được
học sinh khá giỏi. Trên thực tế, việc ứng dụng sáng kiến này mới chỉ tong một
phạm vi hẹp và chưa được nhiều nên cũng chưa đánh giá được toàn diện những
ưu điểm và hạn chế của ứng dụng sáng kiến này trong dạy học. Vì vậy, tôi rất
mong được sự góp ý chân thành từ các đồng nghiệp, của Ban giám hiệu, đặc biệt
là của hội đồng sáng kiến kinh nghiệm để đề tài được hoàn chỉnh hơn.
Tôi xin chân thành cảm ơn!
Thanh Hóa, ngày 15 tháng 5 năm 2018
XÁC NHẬN CỦA THỦ TRƯỞNG
Tôi xin cam đoan đây là SKKN của mình
ĐƠN VỊ
viết, không sao chép nội dung của người
khác.

Người viết

Lê Thị Thanh Huyền

20




×