SKKN 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

SKKN 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

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án chia đối với số nguyên đó là DIV(chia lấy phần nguyên) và MOD(chia lấy phần dư) 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ọc sinh THPT bình thường thì chỉ được giới thiệu sơ qua chủ yếu là để biết, và với mộ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ệt trong 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ọc sinh 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úp họ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ựa chọ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 đang giả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

doc 22 trang thuychi01 10481
Bạn đang xem 20 trang mẫu của tài liệu "SKKN 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", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
MỤC LỤC
Trang
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ứu1
1.4. Phương pháp nghiên cứu...1
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
Kết luận, kiến nghị ...........................................................................................19
1. Mở đầu
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án chia đối với số nguyên đó là DIV(chia lấy phần nguyên) và MOD(chia lấy phần dư) 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ọc sinh THPT bình thường thì chỉ được giới thiệu sơ qua chủ yếu là để biết, và với mộ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ệt trong 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ọc sinh 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úp họ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ựa chọ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 đang giả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.
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án DIV, 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. 
Đố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
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ình khai 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
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
- 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 Tin họ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ách thụ độ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ới mô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 đội tuyể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ép toá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ất lú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ại nà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ài toá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ận thấ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 em hiể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 cho mộ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ăng lậ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ới giá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ải trong 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.
+ Khó khăn:
- Môn tin học ít có cơ hội chọn được học sinh tốt nhất ở các trường có chất lượng đầu vào thấp.
- Phụ huynh không thích cho con em mình vào đội tuyển môn Tin học vì sợ ảnh hưởng đến việc học và ôn thi Đại học. Học sinh ngày càng thực dụng hơn, nhiều giáo viên chủ nhiệm thiếu tinh thần ủng hộ các em học sinh lớp mình vào đội tuyển môn Tin học.
2.3. Các giải pháp đã sử dụng để giải quyết vấn đề
2.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ết chươ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 theo tô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ép chia (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ậy biế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ật toá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;
Lặp lại:
	N := N div 10;
	Dem := dem+1;
Cho đến khi N =0;
Giáo viên có thể cho học sinh viết chương trình cho câu a trước sau đó bổ sung các lệnh để hoàn thiện các câu còn lại.
Câu b) Sau khi làm xong câu a, giáo viên để học sinh tự làm câu b, trường hợp học sinh còn lúng túng thì giáo viên mới hướng dẫn. Sau khi hoàn thiện câu b xong giáo viên cũng cố lại thuật toán của câu b để học sinh mắm chắc thuật toán:
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ố N cho 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 phé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ến tổ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ướng dẫ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 được câ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ọc sinh 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 khi nà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ố đầu tiê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ật toá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ố N cho 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 phé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ằng sodao 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ệc dù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:
Program baicb1;
Var dem,N, tong, sodao,sodu: longint;
BEGIN
Write('Nhap N=');
Readln(N);
Dem:=0;
Tong:=0;
Sodao:=0;
Repeat
 sodu := N mod 10;
 Dem := Dem + 1;
 Tong:= 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);
Readln;
END.
Yêucầu: Học sinh về nhà làm lại bài toán bằng cách chuyển từ câu lệnh repeatuntil sang câu lệnh while... do. 
Từ bài toán trên ta đã ôn tập cho học sinh về việc sử dụng phép toán DIV, MOD để đế đếm số chữ số của một số nguyên, tính tổng các chữ số, cách tìm số đảo của một số nguyên, cách tìm chữ số đầu tiên của một số nguyên. Từ 4 kỹ năng 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ợp thê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òng lặ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ậy cầ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.
Chương trình tham khảo:
program baivd1;
var n,du,d:longint;
begin
	writeln('NHAP N ');
	readln(n);	d:=0;
	repeat
	du:=n mod 10;
	if du=0 then inc(d);
	n:=n div 10;
	until n<10;
	writeln('So chu so 0 co nghia la: ', d);
readln;
end.
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ại thuậ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ại tạ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à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.
Chương trình tham khảo:
program baivd2;
var n, k, du : longint;
 m,s,t:QWord;
begin
 writeln('Nhap N= '); readln(N);
	for k:=1 to N do {kiem tra tung so k <=N xem co la so doi xung khong}
	begin
	s:=0; m:=k; {luu gia tri cua k vao bien m, goi s la so doi xung cua k}
	while m>0 do
 begin
	du := m mod 10;
	s:= s*10 + du;	m := m div 10;
	 end;
	if s =k then
 	begin
{doan lenh kiem tra xem k*k co phai la sdx khong, tuong tu doan lenh tren}
 s:=0; t:=k;m:=t*t;
{luu gia tri cua k*k bvao bien m, goi s la so doi xung cua k*k}
	while m>0 do
 begin
	du := m mod 10;
	s:= s*10 + du;
	m := m div 10;
	 	 end;
	if s =t*t then
 begin
 	write(k, 'la so doi xung');
 	writeln('B.phuong cua ', k ,' la ', s, 'cung doi xung');
 end;
 	end;
 end;
readln;
end.
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 khi bì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ại thuậ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 để đánh dấ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:
program bai3vd;
var 	n,k, du1, du2 :longint;
 i, t, m: QWord;
	kt :boolean;
begin
 writeln('nhap n='); readln(n);
 for 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
	begin
	du1:= m mod 10;
	du2 := i mod 10;
	if du1 du2 then kt:=false; {ktra thay khong thoa man}
	m:= m div 10;
	i := i div 10;
	end;
	if (i=0) and kt then
	begin
	write(k, ' ');	writeln(t*t);
	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à 5 trong 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 sinh xác định được yêu cầu, tìm thuật toán để để viết chương trình, sau đó nếu học sinh cò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ân ngược lại theo hệ số đa thức. Chương trình tham khảo như sau:
program bai4vd;
var n,so,coso: QWord; du :byte;
begin
 writeln('nhap n= '); readln(n);
 so:=0; coso:=1;
 while n>0 do
 begin
 du := n mod 10;
 if (du0) and (du 5) then
 begin
 so := so+du* coso;
 coso:=coso*10;
 end;
 n := n div 10;
 end;
 writeln('Sau khi bo di so 0 va so 5 so con lai la ', so);
readln;
END.
2.3.3 Vận dụng làm một số bài tập từ các đề thi
Bà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ên trê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ụ:
snail.inp
snail.out
1 5
4
Hướng dẫn thuật toán: Khi gặp bài này học sinh có kiến thức số học tốt có thể giải theo cách 1 trong (Bảng 1) dưới đây. 
Tuy nhiên giáo viên có thể hướng dẫn cho học sinh thấy được các trường hợp sau:
Nếu a=v thì chỉ mất 1 ngày, ngược lại thì đoạn đường thực sự là v-b, bước đi thực 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).
Cách 1
Cách 2
PROGRAM b1;
const fi='snail.inp';
 fo='snail.out';
var a,b,v,tg:longint;
 dem:longint;
 f1,f2:text;
BEGIN
 assign(f1,fi);
 reset(f1);
 assign(f2,fo);
 rewrite(f2);
 read(f1,a,b,v);
 tg:=0;dem:=0;
 while tg<v do
 begin
 if tg+a=v then
 begin
 dem:=dem+1;
 break
 end 
 else
 begin
 tg:=tg+a-b;
 dem:=dem+1;
 end;
 end;
 write(f2,dem);
 close(f1);
 close(f2);
END.
const fi='snail.inp';
	fo='snail.out';
var f1,f2:text;
 a,b,v:int64;
BEGIN
 assign(f1,fi); reset(f1);
 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 abs(a-b))+1);
close(f1);close(f2);
END.
(Bảng 1)
Bà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 N1, N2 (2 số cách nhau một dấu cách).
Dữ liệu vào: Ghi vào tệp Bai2.out các số bậc thang tìm được, mỗi số cách nhau 1 dấu cách.
Bai2.inp
Bai2.out
10 30
11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28 29
Bài này liên quan đến tính chất bậc thang của một số nên nếu học sinh đã học chương trình con giáo viên có thể cho các em viết hàm kiểm tra xem một số có là 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ần kiể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 ta dù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át không cần phải kiểm tra tiếp. Quá trình đó lặp lại cho đên khi thương <10 (vì theo yêu cầu của đề bài)
Chương trình tham khảo:
Program So_bac_thang;
const fi='bai2.inp';
 fo='bai2.out';
Var i,n1,n2: integer;
 f1, f2 : text;
Function SBT(n:integer):Boolean;
Var kt: boolean;
 sodu:byte;
Beg

Tài liệu đính kèm:

  • docskkn_huong_dan_hoc_sinh_su_dung_cac_phep_toan_div_mod_de_ren.doc