Lý do chọn đề tài Trong chương trình Tin học lớp 11, Ở bài 6 chỉ giới thiệu sơ qua về 2 phép toánchia đối với số nguyên đó là DIVchia lấy phần nguyên và MODchia lấy phầndư và rất ít bài
Trang 1MỤC LỤC Trang
1 Mở đầu……….1
1.1 Lý do chọn đề tài……… 1
1.2 Mục đich nghiên cứu……….1
1.3 Đối tượng nghiên cứu………1
1.4 Phương pháp nghiên cứu……… 1
2 Nội dung sáng kiến kinh nghiệm……… 2
2.1 Cơ sở lí luận của sáng kiến kinh nghiệm……… 2
2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm……… 2
2.3 Các giải pháp đã sử dụng để giải quyết vấn đề……… 3
2.3.1 Ôn tập về phép toán DIV, MOD… ……… 3
2.3.2 Lựa chọn một số bài toán cơ bản để vận dụng phép toán DIV, MOD
5
2.3.3 Vận dụng làm một số bài tập từ các đề thi ……… 9
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 ……… 19
3 Kết luận, kiến nghị 19
Trang 21 Mở đầu
1.1 Lý do chọn đề tài
Trong chương trình Tin học lớp 11, Ở bài 6 chỉ giới thiệu sơ qua về 2 phép toánchia đối với số nguyên đó là DIV(chia lấy phần nguyên) và MOD(chia lấy phầndư) và rất ít bài tập để học sinh vận dụng Mặt khác 2 phép toán này và các định lýhoặc bổ đề đi kèm thường dạy chủ yếu đối với các học sinh chuyên Tin còn với họcsinh THPT bình thường thì chỉ được giới thiệu sơ qua chủ yếu là để biết, và vớimột số học sinh thì việc hiểu và sử dụng 2 phép toán này cũng rất trừu tượng, khóhiểu Tuy nhiên trong một số đề thi học sinh giỏi chúng ta thấy có rất nhiều bài tậpđòi hỏi phải sử dụng 2 phép toán này khi học sinh viết chương trình, ở các mức độkhác nhau Vì vậy, lượng kiến thức và thời lượng đó đó chưa đủ để học sinh có thểvận dụng vào giải các bài tập liên quan, thường là các bài tập số học Rèn luyện tưduy, kỹ năng và tác phong lập trình là việc làm thường xuyên, có vai trò đặc biệttrong khi bỗi dưỡng học sinh giỏi môn tin, hiệu quả của nó là động lực giúp họcsinh nắm vững kiến thức, phát triển tư duy, hình thành kỹ năng và kỹ xảo Giúphọc sinh có khả năng thích ứng khi đứng trước một vấn đề cần giải quyết, hiểuđược và hiểu đúng vấn đề để từ đó có thể tìm được giải thuật phù hợp cho bài toán.Các bài tập có sử dụng phép toán Div, Mod rất nhiều tuy nhiên giáo viên cần lựachọn một số bài tập phù hợp với khả năng tư duy của học sinh trường mình đanggiảng dạy để bồi dưỡng
Vì lí do đó nên tôi chọn đề tài: “Hướng dẫn học sinh sử dụng các phép toán DIV,
MOD để rèn luyện kỹ năng lập trình” để nghiên cứu.
1.2 Mục đích nghiên cứu
Nghiên cứu một số vấn đề lý thuyết và thực tiễn việc sử dụng các phép toánDIV, MOD để rèn luyện kỹ năng lập trình nhằm bồi dưỡng năng lực cũng như kỹnăng lập trình, góp phần nâng cao chất lượng bồi dưỡng học sinh giỏi môn Tin học
ở trường trung học phổ thông Hoằng Hóa 3
1.3 Đối tượng nghiên cứu
Đối tượng nghiên cứu: Việc sử dụng các phép toán DIV, MOD để rèn luyện kỹ
năng lập trình đối với môn tin học 11 của học sinh THPT
Khách thể nghiên cứu: Học sinh thuộc đội tuyển học sinh giỏi môn Tin học của
trường THPT Hoằng Hóa 3
1.4 Phương pháp nghiên cứu
- Phương pháp nghiên cứu lý luận: Nghiên cứu các tài liệu, sách báo
- Phương pháp điều tra thực tiễn: Quan sát việc học của học sinh trong quá trìnhkhai thác các bài tập sách giáo khoa, sách bài tập và các đề thi học sinh giỏi
- Phương pháp thực nghiệm sư phạm
Trang 32 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
- Cơ sở tâm lý học:
+ Đặc điểm nhận thức của học sinh đối với môn Tin học:
Thực tế hiện nay đối với học sinh THPT phần lớn có thái độ xem bộ môn Tinhọc là môn học phụ, ít quan tâm bởi vì học sinh bị tác động từ nhiều phía một cáchthụ động Vì vậy việc tìm ra các học sinh có hứng thú và có một chút đam mê vớimôn tin học là việc làm rất khó khăn đối với giáo viên khi chọn học sinh cho độituyển học sinh giỏi của mình
+ Tư duy của học sinh:
Khi làm bài tập phần này những em có kiến thức số học trong toán học tốt thì sẽhiểu đề bài nhanh, nhưng nhiều khi các em còn lúng túng, hiểu máy móc khôngđúng bản chất cũng như yêu cầu của đề bài
2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
- Thực trạng công tác bồi dưỡng học sinh giỏi môn Tin học hiện nay.
Thực tế các học sinh tham gia đội tuyển đều có thể hiểu được ý nghĩa của 2 phéptoán này, xong việc vận dụng làm bài tập và rèn luyện kỹ năng thực hành còn rấtlúng túng bởi vì trong sách giáo khoa hay sách bài tập không có nhiều bài tập loạinày nhưng lại có trong đề thi học sinh giỏi những năm gần đây, và có một số bàitoán thực sự là khó với học sinh THPT không chuyên
Qua những năm gần đây khi bồi dưỡng học sinh giỏi môn Tin học tôi nhậnthấy mảng kiến thức liên quan đến 2 phép toán DIV, MOD là loại bài tập khá thú
vị Do đó tôi lựa chọn đề tài này để nghiên cứu và trình bày Bởi việc giúp các emhiểu được bản chất cũng như cách áp dụng 2 phép toán để tìm ra các cách giải chomột số bài tập số học giúp các em rất tốt trong quá trình học và rèn luyện kỹ nănglập trình
- Những thuận lợi và khó khăn:
+ Thuận lợi:
- Công tác bồi dưỡng học sinh giỏi hiện nay đối với môn Tin học đã được nhàtrường quan tâm hơn, đặc biệt là đã có những phần thưởng có tính khích lệ đối vớigiáo viên và học sinh hơn trước
- Phong trào khuyến học, khuyến tài của huyện dành cho các học sinh đạt giảitrong các kỳ thi cũng là động lực thúc đẩy sự nổ lực của giáo viên và học sinh
2.3 Các giải pháp đã sử dụng để giải quyết vấn đề
Trang 42.3.1 Ôn tập về phép toán DIV, MOD
Để ôn tập cách sử dụng phép toán div, mod cho học sinh tôi sử dụng bài toán cơbản sau:
Bài toán: Cho số tự nhiên N (N<=109), với N nhập từ bàn phím.Yêu cầu viếtchương trình:
a) Đếm số chữ số của N và thông báo kết quả ra màn hình;
b) Tính tổng các chữ số của N và thông báo kết quả ra màn hình;
c) Tìm chữ số đầu tiên của N và thông báo kết quả ra màn hình;
d) Tìm số đảo ngược các chữ số của N và thông báo kết quả ra màn hình.Giáo viên có thể tách thành 4 bài toán riêng rẽ để ôn tập cũng được, tuy nhiên theotôi nên kết hợp 4 yêu cầu trong 1 chương trình để học sinh có sự tổng hợp, so sánh
Nhắc lại hai phép toán cơ bản: DIV và MOD
- Chỉ áp dụng với kiểu dữ liệu số nguyên
- Phép toán DIV là phép chia lấy phần nguyên của số nguyên
- Phép toán MOD là phép chia lấy phần dư của số nguyên
Ví dụ: cho N=123456789
a := N mod 10; Lấy chữ số tận cùng của N (tức a = 9)
N := N div 10; Xóa bỏ chữ số tận cùng của N (N = 12345678, tức N giảm
10 lần)
Hướng dẫn thuật toán:
Câu a) Ban đầu khởi tạo biến đếm bằng 0; Lặp lại việc việc dùng phép toán DIV đểchia số N cho 10 đến khi nào thương bằng 0 thì dừng lại, mỗi lần thực hiện phépchia (tức là N bớt đi một chữ số cuối) đồng thời tăng biến đếm lên 1 đơn vị Vậybiến đếm sẽ chứa kết quả là số lượng chữ số của số N Ở câu này không cần sửdụng phép toán MOD Ở đây ta nên viết bằng lời để học sinh tự triển khai thuậttoán, nếu con vướng mắc thì giáo viên hướng dẫn, nếu học sinh yếu hơn thì ta cóthể viết tường minh hơn, ví dụ:
Ban dầu Dem=0;
Ban đầu khởi tạo biến tổng bằng 0; Lặp lại việc việc dùng phép toán MOD để lấy
số dư của phép chia số N cho 10 (sodu :=N mod 10), phép toán DIV để chia số Ncho 10 (N := N div 10) đến khi nào thương bằng 0 thì dừng lại, mỗi lần thực hiện
Trang 5phép chia (tức là N bớt đi một chữ số cuối) đồng thời ta cộng số dư đó vào biếntổng Vậy biến tổng sẽ chứa kết quả là tổng các chữ số của số N.
Câu c) Sau khi làm xong câu a, câu b giáo viên để học sinh tự làm câu c để kiểm tra
tư duy của các em, trường hợp học sinh còn lúng túng thì giáo viên lấy ví dụ hướngdẫn, chẳng hạn với N =12345, sau khi thực hiện việc sodu := n mod 10 và n:= n div
10 liên tiếp, vậy đến khi N=0 thì biến sodu bằng bao nhiêu? Học sinh sẽ tìm đượccâu trả lời Sau khi hoàn thiện câu c xong giáo viên cũng cố lại thuật toán để họcsinh mắm chắc thuật toán:
Lặp lại việc việc dùng phép toán MOD để lấy số dư của phép chia số N cho 10(sodu :=N mod 10), phép toán DIV để chia số N cho 10 (N := N div 10) đến khinào thương bằng 0 thì dừng lại Vậy biến sodu (số dư cuối cùng) sẽ là chữ số đầutiên của số N
Câu d) Đề làm câu d, giáo viên lấy một ví dụ cụ thể học sinh hướng dẫn quy luật đểtìm ra số đảo:
Ví dụ: N=12345; ban đầu sodao :=0;
Lần 1: sodu := n mod 10 =5, N := N div 10 = 1234; sodao = 5;
Lần 2: sodu := n mod 10 =4, N := N div 10 = 123; sodao = 5*?+4=54;
Lần 3: sodu := n mod 10 =3, N := N div 10 = 12; sodao = 54*?+3=543;
Lần 4: sodu := n mod 10 =2, N := N div 10 = 1; sodao = 543*?+2=5432;
Lần 5: sodu := n mod 10 =1, N := N div 10 = 0; sodao = 5432*?+1=54321;
Từ đó học sinh tìm ra quy luật như sau: sodao := sodao*10+sodu;
Sau khi bổ sung các lệnh để hoàn thiện câu d, giáo viên cũng cần nhắc lại thuậttoán để học sinh nắm chắc kiến thức:
Ban đầu khởi tạo biến sodao bằng 0; Lặp lại việc việc dùng phép toán MOD để lấy
số dư của phép chia số N cho 10 (sodu:=N mod 10), phép toán DIV để chia số Ncho 10 (N := N div 10) đến khi nào thương bằng 0 thì dừng lại, mỗi lần thực hiệnphép chia (tức là N bớt đi một chữ số cuối) đồng thời ta gán lại biến sodao bằngsodao trước đó nhân 10 và cộng số dư đó vào Vậy biến sodao sẽ chứa kết quả là sốđảo ngược của số N
Nhận xét: (giáo viên nên đưa ra nhận xét để cũng cố kiến thức cho học sinh)
- Vòng lặp chính để giải quyết cả 4 câu trên là repeat until nên cả 4 câu chỉ cần
sử dụng chung 1 vòng lặp repeat until
- Muốn sử dụng các chữ số của một số nguyên vào việc nào đó ta lặp lại việcdùng phép toán DIV, MOD để chia số N cho 10 đến khi nào thương bằng 0 thìdừng lại (tuy nhiên cũng phải căn cứ vào đề bài để xem lấy bao nhiêu chữ số đểtìm điều kiện dừng cho chính xác), trong quá trình đó ta có thể dùng các chữ sốcủa nó thông qua biến sodu để làm việc
- Cần tránh trường hợp học sinh đi sai mục tiêu bởi vì làm bài này thì học sinh cóthể dùng các lệnh liên quan đến kiểu dữ liệu xâu để viết chương trình
Chương trình tham khảo:
Trang 6Tong:= Tong + sodu;
Sodao := Sodao * 10 + sodu;
N:=N div 10;
Until N=0;
Writeln('So chu so = ' , Dem);
Writeln('Tong chu so = ' , Tong);
Writeln('Chu so dau tien = ' , sodu);
Writeln('So dao nguoc lai = ' , Sodao);
cơ bản đó ta cho học sinh làm các bài tập vận dụng ở mức độ 2 như sau:
2.3.2 Lựa chọn một số bài toán cơ bản để vận dụng phép toán DIV, MOD
Có nhiều bài tập liên quan, tuy nhiên ở đây tôi lựa chọn các bài tập sau đây:
Bài 1: Lập chương trình nhập từ bàn phím số nguyên N (0 < N <= 32767) Hãy xác
định và đưa ra màn hình số chữ 0 có nghĩa của N [1]
- Nhận xét: Với học sinh học khá môn toán đã biết chữ số có nghĩa là chữ số nhưthế nào rồi nên ta chỉ cần hướng dẫn học sinh dùng phép toán DIV, MOD, học sinh
sẽ bắt chước cách sử dụng vòng lặp repeat until như bài trước để làm, kết hợpthêm việc biện luận số dư Có thể có học sinh lúng túng khi tìm điều kiện cho vònglặp, lúc đó giáo viên có thể lấy thêm ví dụ về chữ số có nghĩa, chẳng hạn:
Số 010 có 1 chữ số 0 có nghĩa, còn số 0 trước số 1 là chữ số 0 không có nghĩa, vậycần chia đến khi nào mà số đó còn lại mấy chữ số? Học sinh sẽ tự tìm được câu trảlời và viết được chương trình
Trang 7Chương trình tham khảo:
Bài 2: Viết chương trình tìm và in ra màn hình các số đối xứng bé hơn hoặc bằng N
mà bình phương của nó cũng là một số đối xứng (1<=N<=107) Ví dụ số 11 là sốđối xứng có 112 = 121 cũng là số đối xứng [1]
Khi gặp bài này giáo viên nên để học sinh tự làm trước sau đó mới hướng dẫn lạithuật toán để học sinh nắm vững thuật toán
Hướng dẫn thuật toán: Gọi k là số cần tìm, ta dùng phép toán DIV, MOD để tìm sốđảo của số này để xem k có là số đối xứng không, nếu có thì đặt m=k*k sau đó lạitạo số đảo của số này để xem m có là số đối xứng không, nếu có in ra kết quả
Nhận xét: Khi làm bài này thì có học sinh sẽ vướng mắc về vấn đề kiểu dữ liệu đểchạy được hết giới hạn của đề bài vì vấn đề bình phương của một số, khi đó tùy vàobài làm cụ thể của học sinh mà giáo viên hướng dẫn cho phù hợp
Chương trình tham khảo:
Trang 8write(k, 'la so doi xung');
writeln('B.phuong cua ', k ,' la ', s, 'cung doi xung');
Bài 3: Viết chương trình liệt kê các số bé hơn hoặc bằng N (1<=N <=107) sao cho
số bình phương của số đó có phần bên phải trùng với chính số đó Ví dụ số 25 khibình phương lên là 625 [1]
Khi gặp bài này giáo viên nên để học sinh tự làm trước sau đó mới hướng dẫn lạithuật toán để học sinh nắm vững thuật toán Và giống bài trước khi làm bài này thì
có học sinh sẽ vướng mắc về vấn đề kiểu dữ liệu để chạy được hết giới hạn của đềbài vì vấn đề bình phương của một số, khi đó tùy vào bài làm cụ thể của học sinh
mà giáo viên hướng dẫn cho phù hợp
Hướng dẫn thuật toán: Gọi k là số cần tìm, m=k*k là bình phương của số k, do k <
m nên ta dùng phép toán DIV, MOD theo k để kiểm tra xem các số dư của k và m
có bằng nhau hay không, ban đầu giả sử là bằng nhau ta dùng biến kiểm tra để đánhdấu là true, trong quá trình kiểm tra nếu khác nhau thì đánh dấu lại biến kiểm tra làfalse, quá trình đó lặp lại cho đến khi k div 10 = 0 trước, Nếu xong quá trình đó màbiến kiểm tra vẫn bằng true thì in ra kết quả
Chương trình tham khảo:
Trang 9for k:=1 to N do
begin i:=k;t:=k;
kt :=true; {gia su kiem tra la dung}
m :=i*i; {ktra so bphuong cua so i co phan ben phai trung voi i khong}while (i>0) and kt do
begindu1:= m mod 10;
end;
end;
readln;
END
Bài 4: Viết chương trình nhập vào từ bàn phím số nguyên N (1<= N <= 1018)
In ra màn hình số nguyên nhận được từ N sau khi đã bỏ bớt đi các chữ số 0 và 5trong số nguyên N [1]
Khi gặp bài này giáo viên nên lấy một ví dụ minh họa về yêu cầu của đề bài, ví dụ:Với N=19002552 vậy sau khi bỏ số 0 và số 5 ta thu được số 1922, từ đó học sinhxác định được yêu cầu, tìm thuật toán để để viết chương trình, sau đó nếu học sinhcòn vướng mắc thì giáo viên mới hướng dẫn lại thuật toán
Hướng dẫn thuật toán: Yêu cầu học sinh sử dụng phép toán div, mod và nhânngược lại theo hệ số đa thức Chương trình tham khảo như sau:
readln;
END
2.3.3 Vận dụng làm một số bài tập từ các đề thi
Trang 10Bài 1: Con ốc sên đang ở gốc của một cái cây cao v mét tính từ gốc Ốc sên muốn
bò lên ngọn cây để ăn những lá non trên đó Ban ngày ốc sên bò được a mét lêntrên, nhưng ban đêm, khi ngủ nó bị trôi xuống dưới b mét
Yêu cầu: Cho các số nguyên v, a và b (1 ≤ b < a ≤ v ≤ 109) Hãy xác định sốngày cần thiết để ốc sên lên tới ngọn cây
Dữ liệu: Vào từ file văn bản snail.inp gồm một dòng chứa 3 số nguyên a, b và v.Kết quả: Đưa ra file văn bản snail.out một số nguyên – kết quả tìm được [1]
Ví dụ:
15
sự của con ốc là |a-b|, vậy nếu v-b mà chia hết cho |a-b| thì thương của phép chia đó
là số ngày, ngược lại thì phải mất thêm một ngày nữa, tức là lấy thương đó cộng 1
Từ đó định hướng để học sinh viết chương trình theo cách 2 trong (Bảng 1)
assign(f2,fo); rewrite(f2);
readln(f1,a,b,v);
if a=v then writeln(f2,1) else
if (V-b) mod abs(a-b) = 0 then writeln(f2, (v-b) div abs(a-b)) else
writeln(f2, ((v-b) div b))+1);
abs(a-close(f1);close(f2);
END
(Bảng 1)
Trang 11Bài 2: Một số được gọi là số bậc thang nếu biểu diễn thập phân của nó có nhiều
hơn một chữ số đồng thời theo chiều từ trái qua phải, chữ số đứng sau không nhỏhơn chữ số đứng trước Viết chương trình in ra các số bậc thang trong đoạn [N1,N2] với (10<N1<=N2<=32767) [1]
Dữ liệu vào: Ghi trong tệp Bai2.inp gồm 1 dòng duy nhất chứa 2 số nguyên dương
số bậc thang hay không?
Hướng dẫn thuậ toán: Để kiểm tra một số có là số bậc thang hay không chỉ cầnkiểm tra xem tất cả các số dư sau có lớn hơn số dư trước hay không? Vì vậy tadùng một biến kiểm tra để đánh dấu việc so sánh này, nếu tồn tại một trường hợp
mà số dư sau lớn hơn số dư trước thì ghi nhận lại giá trị cho biến kiểm tra, thoátkhông cần phải kiểm tra tiếp Quá trình đó lặp lại cho đên khi thương <10 (vì theoyêu cầu của đề bài)
Chương trình tham khảo: