SKKN Rèn luyện kỹ năng lập trình môn Tin học 11 cho học sinh khá, giỏi bằng việc mở rộng các bài toán cơ bản - Pdf 26


SÁNG KIẾN KINH NGHIỆM
ĐỀ TÀI:
"RÈN LUYỆN KỸ NĂNG LẬP TRÌNH MÔN TIN HỌC 11 CHO
HỌC SINH KHÁ, GIỎI BẰNG VIỆC MỞ RỘNG CÁC BÀI TOÁN
CƠ BẢN"
1

A. ĐẶT VẤN ĐỀ
I. Lời nói đầu
Để 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.

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.
II. 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:
BUỔI 1: (Áp dụng khi học xong các bài về các câu lệnh IF, FOR, WHILE)
3

Bài tập 1: (bài toán cở bản): Viết chương trình nhập vào số nguyên dương N từ bàn
phím. Sử dụng câu lệnh lặp FOR tính tổng sau: S=
N
1

3
1
2
1
1 ++++
và đưa kết quả ra màn
hình.
Nhận xét: Đây là bài toán có trong sách giáo khoa và học sinh cũng đã được làm quen
thông qua các ví dụ nên dễ dàng lập trình được:

+ Ở bài này với học sinh khá, giỏi ở một số trường có chất lượng điểm đầu vào cao có thể
giải quyết đơn giản, còn học sinh ở một số trường có điểm đầu vào thấp thì học sinh có
thể băn khoăn ở việc tìm điều kiện của vòng lặp WHILE, đến đây giáo viên có thể hướng
4

dẫn cách chuyển đổi từ vòng lặp For–To-Do (Bài tập 1) sang vòng lặp WHILE , chẳng
hạn:
For i:= <GTđầu> To <Gtcuối> Do
<câu lệnh>;
i:= <GTđầu>;
While i <= <Gtcuối> Do
Begin
<câu lệnh>;
i:=i+1;
End;
Học sinh sẽ tự mình hoàn thành được chương trình.
Bài tập 3:
Viết chương trình nhập vào số nguyên dương N từ bàn phím. Sử dụng câu lệnh lặp FOR
tính tổng sau: S=
N
N
1
)1(
4
1
3
1
2
1
1

Từ bài tập 3 ta sẽ chuyển sang bài tập 4 như sau:
Bài tập 4: Sửa lại chương trình ở bài tập 1 nhưng sử dụng câu lệnh lặp WHILE tính tổng
sau: S=
N
N
1
)1(
4
1
3
1
2
1
1
1+
−+−+−
và đưa kết quả ra màn hình.
Lúc này học sinh sẽ giải quyết một cách đơn giản.
Bài tập 5: Viết chương trình nhập vào số nguyên dương N từ bàn phím. Sử dụng câu
lệnh lặp FOR tính tổng sau: S=
!
1
)1(
!4
1
!3
1
!2
1
1

End;
Writeln(‘Tong = ‘, S:10:2);
Readln;
End.
Giáo viên yêu cầu học sinh tối ưu lại chương trình bằng cách sử dụng một vòng lặp để
xem học sinh làm thế nào? Nếu học sinh vẫn còn lúng túng thì giáo viên nên lấy ví dụ
minh họa với N = 5 chẳng hạn, mô phỏng trạng thái của các biến trong chương trình để
học sinh hiểu được thuật toán với một vòng lặp. Giáo viên yêu cầu học sinh phải hoàn
thiện chương trình với một vòng lặp như sau:
Program bai5;
Var j,i,dau,N:integer;
Gt:longint; {giáo viên nên giải thích}
S:real;
Begin
Write(‘Nhap N=’);
Readln(N);
Dau:=1;
S:=0; gt:=1; {Khởi tạo biến gt ở dây}
For i:=1 to N do
begin
gt:=gt*i;
S:=S + dau*(1/gt);
7

Dau := -1*dau;
End;
Writeln(‘Tong = ‘, S:10:2);
Readln;
End.
Tuy vậy sẽ có học sinh sẽ khởi tạo S:=1; giáo viên nên phân tích và hướng dẫn trường

IF, FOR, WHILE và chuyển đổi qua lại giữa các câu lệnh, học sinh sẽ có cảm giác thích
thú hơn.
BUỔI 2: Một số bài toán về ước số
Bài tập 1: (bài toán cơ bản)
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
8

đó 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ỉ

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

Bài tập 4: Lập chương trình tìm tất cả các số hoàn hảo nhỏ hơn số nguyên N (N >=10),
in các số hoàn hảo và và các ước của số tìm được ra màn hình. Giá trị của N được 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 3 để được bài tập 4.
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 (1<a<b<10000). Thông báo ra màn hì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.
BUỔI 3: Một số bài toán về số nguyên tố

học sinh viết như sau:
Program b2;
Var i,k,n:integer;
kq:boolean;
begin
write('N = ');readln(n);
For k:=1 to N do
begin
kq:=true;{Giả sử k là SNT, Gán kq bằng true}
if K<=1 then kq:=false
else
for i:=2 to trunc(sqrt(K)) do{i chạy từ 2 đến phần nguyên căn bậc 2 của k}
12

if k mod i=0 then{Nếu n chia hết cho i thì}
begin
kq:=false;{Gán kq=false}
break;{thoát vòng lặp trong bằng lệnh Break}
end;
if kq then write(k:5);
end;
readln;
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 khiện nhập dữ liệu cho
chương trình.
Bài tập 3: 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. Chương trình có

writeln(N ,' = ', i, ' + ', j);
d:=d+1;
end;
end;
end;
readln;
End.
Giáo viên giải thích cho học sinh tại sao ở {vong lap 1} biến i lại nhận giá trị bắt
dầu từ 2? Tại sao không cần câu lệnh kiểm tra i<=1 trước {vong lap 2} giống như trong
thuật toán kiểm tra tính nguyên tố của một số nguyên i? Tại sao ở {vong lap 3} biến j lại
nhận giá trị bắt dầu từ i mà không phải là 1?
Giáo viên yêu cầu học sinh về nhà hoàn thiện điều kiện nhập dữ liệu sau đó chuyển sang
bài tập 4.
Bài tập 4:
14

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
Nhap 1 so tu nhien: 30
Nhap 1 so tu nhien: 3456
Nhap 1 so tu nhien: 677
37 la so nguyen to
30 = 2. 3. 5
3456 = 2. 2. 2. 2. 2. 2. 2. 3. 3. 3
677 la so nguyen to
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

write('2');
if m>0 then write('.');
End;
i:=3;
While (m > 2) do
Begin
While (m mod i = 0) do
Begin
dem:=dem+1;
m:=m div i;
write(i);
if m>2 then write('.');
End;
i:=i+2;
End;
End;
Readln;
End.
16

Bài tập rèn luyện ở nhà:
Bài tập 5: 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:
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

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.
Chương trình cụ thể như sau:
Program Bai5;
var a,b: array [1 100] of longint;
18

N,i,k,ka,kb,cs,t: byte;
kt:boolean;
m,j:longint;
BEGIN
Write ('Nhap N: ');
Readln (N);
ka:=1; a[ka]:=0;
For i:=1 to N do

Write(a[k]:10);
Writeln;
Writeln('Co tat ca ',ka,' so sieu nguyen to co ',N,' chu so.');
Readln;
END.
BUỔI 4 + 5: Một số dạng bài tập về mảng một chiều
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 đó?
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
+ Là số nguyên tố
+ Là số hoàn hảo
+ Là số chính phương
….
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.
20

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);

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ố nguyên tố đã học ở buổi trước để sửa lại chương trình thành
chương trình bài 4. (Mất khoảng 10-15 phút học sinh sẽ hoàn thành)
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 b1;
const nmax=20;
var a:array[1 nmax]of integer;
tg:integer;
i,j,n:integer;
begin
22

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;


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

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

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 hầ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ó băo 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 4: 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
gồm 3 loại số : Loại 1 : các số vừa chia hết cho 3 vừa lẻ, loại 3 : các số vừa chia hết cho 3
vừa chẵn, loại 2 : các số còn lại . Yêu cầu hãy xếp các số loại 1 lên đầu dãy , các số loại 3
xuống cuối dãy , các số loại 2 ở giữa dãy . Trước hết xếp gọn hết các số loại 1 , sau đó
xếp đồng thời các số loại 2 và 3. Đưa ra màn hình dãy đã được sắp xếp.

ta sẽ kiểm tra xem mảng nào hết trước}
Nếu i>M thì {nếu mảng A hết trước thì phần còn lại của mảng C sẽ là phần còn lại
của mảng B}
Trong khi j<=N
C[k]:=b[j];
Tăng k, tăng j
Nếu j>N thì {nếu mảng B hết trước thì phần còn lại của mảng C sẽ là phần còn lại
của mảng A}
Trong khi i<=M
C[k]:=a[i];
Tăng k, tăng 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: (Bài tập cơ bản )
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 của 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 Tin học 10, Tin học 11 nên học sinh có thể dễ dàng làm được bài này.
Giáo viên có thể nhắc lại thuật toán tìm Max để học sinh nhớ.
Bài tâp 2: Sửa lại chương trình ở bài 1 để đưa ra màn hình phần tử nhỏ nhất của mảng.
25


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status