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
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.
Với ý định “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” nên trong sáng kiến kinh
nghiệm này tôi muốn trình bày một kinh nhgiệm trong việc rèn luyện kỹ năng
lập trình cho học sinh khi học môn Tin học 11.
II. Thực trạng của vấ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
1
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
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.
B. GIẢI QUYẾT VẤN ĐỀ
I. 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.
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)
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:
Program bai1;
Var i,N:word;
S:real;
2
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
Begin
Write(‘Nhap N=’);
Readln(N);
S:=0;
For i:=1 to N do S:=S + 1/i;
Writeln(‘Tong = ‘, S:10:2);
Readln;
End.
Giáo viên có thể đưa ra các bộ test tương ứng với giá trị của N để làm rõ yêu cầu
đề bài hoặc để chú ý một số trường hợp cho học sinh.
Từ bài toán này ta yêu cầu học sinh làm bài tập 2 như sau:
Bài tập 2: 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
1
3
1
2
1
1 ++++
và đưa kết quả ra màn hình.
Nhận xét:
+ Từ màn hình soạn thảo của Pascal yêu cầu học sinh vào File chọn Save As để
lưu lại tên tệp với tên bài 2 sau đó sửa lại chương trình bài 1 để được bài 2, bỏ
bớt các biến không dùng đến (cách làm này rất tiết kiệm thời gian vì chương
trình bài 2 mở rộng từ bài 1).
+ Ở 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 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
1+
−+−+−
và đưa kết quả ra màn hình.
Nhận xét: Học sinh sẽ thấy bài này chỉ khác với bài tập 1 là có dấu khác nhau tại
các số hạng, còn chương trình thì cũng tương tự như thế nên học sinh sẽ cố gắng
tìm cách đặt dấu tại các số hạng hoặc tìm cách biểu diễn (-1)
N+1
trong pascal,
hoặc có học sinh sẽ dùng tính chẵn lẽ của số hạng.
3
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
Tuy nhiên ta sẽ hướng dẫn học sinh dùng biến để điền dấu cho các số hạng như
sau:
Program bai3;
Var i,dau,N:integer;
S:real;
Begin
Write(‘Nhap N=’);
Readln(N);
Dau:=1;
S:=0;
For i:=1 to N do
begin
S:=S + dau*(1/i);
Dau := -1*dau;
End;
Writeln(‘Tong = ‘, S:10:2);
Readln;
End.
Giáo viên nên giải thích tại sao lại nên dùng biến dau như vây?
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
1
N
N +
−++−+−
và đưa kết quả ra
màn hình.
Nhận xét: Học sinh dễ nhận thấy về cơ bản thì cách làm bài này cũng giống như
bài 1 nhưng chỉ băn khoăn làm thế nào để tính các giai thừa?. Nếu học sinh chưa
biết cách tính giai thừa bằng các câu lệnh của Pascal thì giáo viên nên hướng dẫn
học sinh cách tính giai thừa của một số i để xem học sinh kết hợp vào để giải bài
toán này như thế nào?
Cách tính giai thừa của một số i sử dụng các câu lệnh của Pascal:
Gt:=1;
For j:=1 to i do gt:=gt*j; khi đó biến gt sẽ mang giá trị của i!
Khi đó học sinh có thể kết hợp như sau:
Program bai5;
Var j,i,dau,N:Integer;
Gt:longint; {giáo viên nên giải thích}
4
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
S:real;
Begin
Write(‘Nhap N=’);
Readln(N);
Dau:=1;
S:=0;
For i:=1 to N do
begin
Gt:=1;
For j:=1 to i do gt:=gt*j;
S:=S + dau*(1/gt);
Dau := -1*dau;
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);
Dau := -1*dau;
End;
Writeln(‘Tong = ‘, S:10:2);
Readln;
End.
5
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
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 hợp này.
Bài tập 6: Sửa lại chương trình ở bài tập 5 nhưng sử dụng câu lệnh lặp WHILE
tính tổng sau: S=
!
1
)1(
!4
1
!3
1
!2
1
1
1
N
N +
−++−+−
và đưa kết quả ra màn hình.
Bằng cách lưu và sửa lại chương trình ở bài tập 5 học sinh sẽ giải quyết một cách
nhanh chóng.
(Giáo viên yêu cầu học sinh về nhà đọc thêm câu lện Repeat …Until nếu chưa
dạy thêm) để làm các bài tập sau đây để nộp lại cho giáo viên vào ngày nào đó
trong tuần để giáo viên kiểm tra.
Bài tập 7: Sử dụng câu lệnh lặp Repeat … Until viết lại các bài toán từ 1 đến 6
với điều kiện 1<N<100. Sử dụng câu lệnh Repeat … Until để kiểm tra điều
kiện nhập giá trị của N.
Giáo viên yêu cầu học sinh trình bày ra giấy và sau đó thu lại. (Thực chất nếu
giáo viên đã hướng dẫn học sinh về câu lệnh Repeat … Until thì học sinh có thể
làm ngay tại phòng máy được)
Vậy sau khi học xong buổi 1 ta đã rèn luyện được một số kỹ năng vận
dụng các câu lệnh 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 đó 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.
6
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
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.
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 1<a<b). Với a, b được nhập từ bàn phím.
Nhậ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;
7
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
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: 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ố
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 b1;
Var i,n:integer;
kq:boolean;
begin
write('N = ');readln(n);
kq:=true;{Giả sử N là SNT, Gán kq bằng true}
if n<=1 then kq:=false
else
8
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
for i:=2 to trunc(sqrt(n)) do{i chạy từ 2 đến phần nguyên căn bậc 2 của N}
if n 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 bằng lệnh Break}
end;
if kq then writeln('So nguyen to') else write('Khong la so nguyen to');
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 (N>10), in ra
màn hình các số nguyên tố trong khoảng từ 1 đến N.
Nhận xét: Học sinh sẽ áp dụng thuật toán của bài 1 để giải quyết bài 2. 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. Sau khi
áp dụng bài 1, sao chép và sửa lại chương trình bài 1 để có chương trình bài 2,
chương trình có thể được 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}
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
9
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
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ó thể được học sinh viết như sau:
program bai3;
var N,i , j, k, m,d : longint;
kq1, kq2:boolean;
begin
writeln(‘Nhap N= ‘); readln(N);
for i:=2 to N-1 do {vong lap 1}
begin {kiem tra xem so i co phai la so nguyen to hay khong}
kq1:=true;
for k:=2 to trunc(sqrt( i )) do {vong lap 2}
if i mod k =0 then
begin
kq1:=false;{do i chia het cho k nen i khong nguyen to}
break;
end;
if kq1 then {neu so i la snto thi tim so j la so nto ma i+j=N}
for j := i to N-1 do {vong lap 3}
begin {kiem tra xem so j co phai la so nguyen to hay khong}
kq2:=true;
for m:=2 to trunc(sqrt( j )) do
if j mod m=0 then
begin
kq2:=false;{Gan kq2=false, tuc j khong la so nto}
break;
end;
if kq2 then
if i+j = N then
begin
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}
10
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
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:
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 này sau đó hướng dẫn và cũng cố lại thuật toán. Chương trình có thể
như sau:
Program bai4;
uses crt;
Var m, n: longint;
dem,i:integer;
kq:boolean;
Begin
repeat
clrscr;
Write('Nhap mot so tu nhien:'); readln(n);
Until (n>1) and (n<=65355);
Kq:=true;
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then
begin
kq:=false;
break;
end;
if kq then writeln(n,' la so nguyen to')
else {tach so n thanh cac thua so nguyen to}
begin
dem:=0;
m:=n;
Write(n,' = ');
11
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
While (m mod 2 = 0) do
Begin
dem:=dem+1;
m:=m div 2;
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.
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 khảo và rèn luyện được ở nhà sau đó giáo viên sẽ sửa chương trình ở
buổi sau.
Dữ liệu vào Dữ liệu ra
5 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
12
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
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ố vd 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:
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.
13
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
Chương trình cụ thể như sau:
Program Bai5;
var a,b: array [1 100] of longint;
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
Begin
Kb:=0;
For k:=1 to ka do
For cs:=0 to 9 do
begin
m:=a[k]*10+cs; {kiem tra xem m co la so nguyen to khong}
kt:=true;
If (m<=1) then kt:=false
Else
Begin
for j:= 2 to trunc(Sqrt(m)) do
If (m mod j =0) then
begin
kt:=false;
break;
end;
End; {het doan lenh kiem tra so nguyen to}
If kt then {neu la so nguyen to thi}
Begin
Inc(kb);
b[kb]:=a[k]*10+cs;
end;
end;
ka:=kb;
For t:=1 to ka do
a[t]:=b[t]; {luu lai cac gia tri cua mang b vao mang a}
end;
For k:=1 to ka do
Write(a[k]:10);
14
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
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.
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;
15
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
writeln; {Dua con tro xuong dong de in so luong phan tu thoa man}
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.
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;
16
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
tg:integer;
i,j,n:integer;
begin
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: 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ự giảm
dần.
Nhận xét: Yêu cầu học sinh sửa lại chương trình bài tập 1 để được chương trình
ở bài tập 2. (Mất 2 phút để học sinh hoàn thành)
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 3: 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
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.
17
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
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.
Dữ liệu vào Dữ liệu ra
N=8
88 29 81 12 42 35 62 83
88 29 81 12 42 35 62 83
81 29 88 62 83 35 12 42
Nhận xét: Giáo viên nên để 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.
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ử, sắp xếp 2 dãy A và B tăng dần sau
đó trộn 2 dãy thành dãy C sao cho dãy C cũng là dãy đã được sắp xếp tăng dần.
In mảng A, B, C ra màn hình.
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:
+ Nhập mảng A gồm M phần tử, mảng B gồm N phần tử
+ Sắp xếp mảng A
+ Sắp xếp mảng B
I:=1; j:=1; k:=1
Trộn mảng như sau:
Trong khi i<=m và j<=n
Nếu A[i]<B[j] thì {số nhỏ hơn đưa vào mảng C trước}
C[k]:=a[i]
Tăng i, tăng k
Ngược lại
C[k]:=b[j]
Tăng j, tăng k
{Nếu M<>N (kích thước 2 mảng khác nhau) thì một trong 2 dãy sẽ được đưa vào
mảng C hết trước, khi đó phần còn lại của mảng C sẽ là phần còn lại của một
trong 2 mảng, do đó 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
18
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
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.
Nhận xét: Mất 1 phút để học sinh hoàn thành.
Giáo viên có thể nhắc lại thuật toán tìm Min để học sinh nhớ.
Bài tâp 3: Sửa lại chương trình bài 2 để hoàn thành chương trình của bài 3 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.
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]<Min thì gán Min:=a[i];
End;
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 và một số K. Kiểm tra xem số K có trong mảng A hay không?
Nếu có ghi ‘CO’, ngược lại ghi ‘KHONG’ ra màn hình.
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 tìm kiếm đã được tìm hiểu trong sách Tin học 10 và 11, sau đó mới
hướng dẫn thuật toán và giúp học sinh hoàn thiện chương trình.
19
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
Bài tập 5: 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 6: 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: 1 2 6 5 4 3 6 7 6 với X = 6 => Dãy in ra: 1 2 5 4 3 7
Nhận xét: Giáo viên nên để cho học sinh thử tìm thuật toán cho bài tập 5 và bài
tập 6 dựa vào thuật toán tìm kiếm đã làm ở các bài trên, sau đó mới hướng dẫn
thuật toán và giúp học sinh hoàn thiện chương trình.
C. 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 là hứng thú học tập. 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
và còn nhiều thiếu sót, rất mong được sự góp ý kiến, phê bình, phản hồi của các
đồng nghiệp.
Cuối cùng tôi hy vọng cách làm này sẽ được các đồng nghiệp nghiên cứu
và áp dụng vào thực tiễn dạy học để rút ra những điều bổ ích.
Tôi xin chân thành cảm ơn!
XÁC NHẬN CỦA HIỆU TRƯỞNG
Thanh Hóa, ngày 25 tháng 5 năm 2013
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.
Tài liệu tham khảo
+ Sách giáo khoa, Sách bài tập, Sách hướng dẫn giáo viên Tin học 11
+ Một số tài liệu về Pascal tại các diễn đàn tin học trên Internet
20