-Tên sáng kiến: Vận dụng một số thuật toán để giải quyết bài toán tin học trong PASCAL - Lĩnh vực: Tin học 8 III.. Vì vậy trong nội dung đề tài này tôi giới thiệu việc lập trình giải một
Trang 1dụng tiến bộ kỹ thuật hoặc nghiên cứu khoa học sư phạm ứng dụng
I Sơ lược lý lịch tác giả:
- Họ và tên: Lê Thanh Hiền - Giới tính: Nam
- Ngày tháng năm sinh: 20/4/1987
- Nơi thường trú: Khánh Hòa - Châu Phú - An Giang
- Đơn vị công tác: Trường THCS Khánh Hòa
- Chức vụ hiện nay: Giáo viên
- Lĩnh vực công tác: Giảng dạy môn Tin học
- Trình độ chuyên môn: ĐHSP Tin học
II Sơ lược đặc điểm tình hình đơn vị:
1.Thuận lợi:
Trường được sự quan tâm, chỉ đạo kịp thời của lãnh đạo ngành và sự hỗ trợ, giúp đỡ nhiệt tìnhcủa chính quyền địa phương và có phòng máy cho học sinh thực hành đảm bảo đủ về sốlượng cho 02 học sinh/máy Phòng học cơ bản đảm bảo để phục vụ cho giảng dạy Tập thể tổchuyên môn có tinh thần đoàn kết cao, sẵn sàng hỗ trợ chia sẻ với đồng nghiệp về chuyênmôn Giáo viên tự học tập để nâng cao trình độ chuyên môn, luôn tìm hiểu và nghiên cứunhững phương pháp dạy học cho phù hợp với từng đối tượng học sinh
2 Khó khăn:
Sĩ số lớp khá đông, phương tiện dạy học còn thiếu, còn nhiều học sinh thiếu sách giáo khoa.Đối với học sinh lớp 8 do nội dung kiến thức mới lạ nên học sinh cần có thời gian để tiếp cậnlàm quen Ý thức chuyên cần của học sinh tham gia lớp học chưa cao Việc tự học của họcsinh ở nhà chưa được phát huy Phần lớn học sinh chưa xác định đúng đắn động cơ và mụctiêu học tập
Trang 2-Tên sáng kiến: Vận dụng một số thuật toán để giải quyết bài toán tin học trong PASCAL
- Lĩnh vực: Tin học 8
III M c đích yêu c u c a đ sáng ki n: ụ ầ ủ ề ế
1. Thực trạng ban đầu trước khi áp dụng sáng kiến
Tin học 8 gắn tích hợp kiến thức của 2 môn học Toán và Tiếng anh Nên học sinh e dèngắn ngại khi nói đến toán học do gặp phải những bài toán khó các em ít vận động tư duysuy nghĩ tìm cách giải và sợ giải sai nhiều lần dẫn đến nản chí Do đó khi các em biết máytính là công cụ giúp con người xử lí thông tin và hỗ trợ học tập việc lập trình giải các bàitoán bằng máy tính Vì vậy trong nội dung đề tài này tôi giới thiệu việc lập trình giải mộtvài bài toán toán học để giúp cho học sinh lớp 8 phần nào giải quyết khó khăn này và vậndụng giải quyết những bài toán thực tế
Kết quả học tập khảo sát chỉ tiêu đầu năm trước khi áp dụng sáng kiến 03 năm học qua
số thuật toán từ cơ bản đến nâng cao phù hợp với mọi đối tượng học sinh
2. Sự cần thiết phải áp dụng sáng kiến
Ngày nay, kiến thức, kỹ năng Công nghệ Thông tin là một trong những kiến thức thiết yếu
mà học sinh cần được trang bị cho học tập và cho cuộc sống Nhằm nâng cao hiệu quả vàchất lượng giáo dục thì việc ứng dụng công nghệ thông tin là công cụ đắc lực hỗ trợ đổimới phương pháp dạy, kiểm tra, đánh giá, hỗ trợ đổi mới quản lý giáo dục Môn tin họcnhằm cung cấp cho học sinh những kiến thức phổ thông về ngành khoa học tin học, hìnhthành và phát triển khả năng tư duy thuật toán, năng lực sử dụng các thành tựu của ngànhkhoa học trong học tập và trong lĩnh vực hoạt động của mình sau này Đặc biệt là về kiến
Trang 3thức sẽ trang bị cho học sinh một cách tương đối có hệ thống các khái niệm cơ bản nhất ởmức phổ thông về tin học, một ngành khoa học với những đặc thù riêng, các kiến thức về
hệ thống, thuật toán, cấu trúc dữ liệu, lập trình, về kỹ năng thì học sinh bước đầu biếtđược sử dụng máy tính, biết soạn thảo văn bản, biết sử dụng Internet, khai thác được cácphần mềm thông dụng, giải được các bài toán đơn giản bằng máy tính Còn về thái độ thìrèn luyện cho học sinh phong cách suy nghĩ và làm việc khoa học như sự ham hiểu biết,tìm tòi, sáng tạo, chuẩn mực chính xác trong suy nghĩ và hành động, say mê môn học, cẩnthận trong công việc, hợp tác tốt với bạn bè
Nội dung sách giáo khoa tin học lớp 8 là một nội dung mới lạ đối với đa số họcsinh nó có 3 định hướng chính sau: Giảng dạy lập trình thông qua các thuật toán cơ bản,cung cấp các khái niệm về ngôn ngữ lập trình, giúp rèn luyện kỹ năng xây dựng thuậttoán và lập trình giải một số bài toán trên máy tính Tuy nhiên mọi thứ điều có điểm khởiđầu của nó, với học sinh việc học ngôn ngữ lập trình Pascal là khởi đầu cho việc tiếp cậnngôn ngữ lập trình khác, qua đó giúp các em hình dung được sự ra đời, cấu tạo, hoạt độngcũng như ích lợi của các chương trình hoạt động trong máy tính, các máy tự động Qua
đó giúp các em có thêm một định hướng, một niềm đam mê về tin học, về nghề nghiệp
mà các em chọn sau này
Xuất phát từ cơ sở trên, tôi đã chọn đề tài “Vận dụng một số thuật toán để giải quyết bài toán tin học trong PASCAL”.
3. Nội dung sáng kiến
3.1 Tìm hiểu khái quát cấu trúc chung của chương trình Pascal
PROCEDURE THUTUC[(Các tham số)];
[Khai báo Const, Type, Var]
BEGIN
END;
FUNCTION HAM[(Các tham số)]:<Kiểu dữ liệu>;
[Khai báo Const, Type, Var]
Trang 43.2 Quá trình giải bài toán trên máy tính
Bước 1: Xác định bài toán: Xác định đâu là thông tin đã cho (input) và đâu là thông tin cần tìm (output) theo đề bài
Bước 2: Mô tả thuật toán là phân tích bài toán và chọn lựa thuật toán thích hợp
Để lập trình giải quyết một vấn đề, điều trước tiên cần có là giải thuật Giải thuật là kiến thức về lĩnh vực của vấn đề đang giải quyết Giải thuật có ý nghĩa quyết định đến
thành công của chương trình, có giải thuật tốt, mới có chương trình tốt Có những giảithuật tổng quát như tổ chức cấu trúc dữ liệu, thuật toán sắp xếp, thuật toán tìm kiếm, thuậttoán phân phối bộ nhớ … những thuật toán thuộc lĩnh vực chuyên môn như những giảithuật của toán, của cơ sở dữ liệu, của trí tuệ nhân tạo, của đồ hoạ …Tuy nhiên trong kiếnthức trung học cơ sở, các em chỉ cần biết qua các thuật toán đơn giản
Ví dụ: Để giải phương trình bậc 2, ta phải xét dấu delta với (delta=b2-4*a*c)
Bước 3: Viết chương trình bằng ngôn ngữ lập trình
- Quan trọng nhất là phần cốt lõi của thân chương trình để giải quyết thành công yêucầu đề ra
- Sau đó là phần nhập dữ liệu ở đầu chương trình và xuất kết quả ở cuối chương trình
- Cuối cùng là thêm phần khai báo, cần dùng những biến nào khai báo trong phần var, đặt tên chương trình trong phần khai báo program.
Trang 5Ví dụ: Để giải phương trình bậc nhất là phát biểu if với điều kiện là các trường hợp a bằng
hay khác 0, b bằng hay khác 0 Trong phần thân chương trình thường không có nhập xuất
Tóm lại: Khi viết một chương trình, đầu tiên đừng nghĩ tên chương trình là gì, dùng các
biến nào, khoan nghĩ đến phải nhập xuất dữ liệu như thế nào cho đẹp mắt, mà phải tậptrung trước tiên vào việc viết phần thân của chương trình sao cho thể hiện chính xác quagiải thuật
Bước 4: Dịch chương trình, chạy thử và kiểm tra kết quả
Biên dịch chương trình xem có chỗ nào viết sai về cú pháp hay một vấn đề nào đó đểđiều chỉnh lại
Khi biên dịch không báo lỗi, chưa chắc chương trình của bạn cho kết quả đúng,
nhiều khi giải thuật sai, sẽ cho kết quả sai Do đó bạn chạy thử chương trình, kiểm tra kếtquả xem có chính xác hay không
Ví dụ: Thay vì dấu cộng bạn lại cho dấu trừ, chỗ đó là biến a, bạn lại để là biến b Cú
pháp đúng, biên dịch đúng nhưng kết quả sai
- Để chạy chương trình, bạn thực hiện một trong những cách sau:
+ Nhấn Ctrl+F9 hoặc
+ Nhấn Alt+R (hoặc nhấp chuột trái tại tên menu, hoặc nhấn phím F10, di chuyển vệt
sáng đến mục Run), đưa vệt sáng đến Run, nhấn phím Enter.
3.3 Tiến trình thực hiện
- Hướng dẫn học sinh qua những tiết học bộ môn và giờ thực hành
- Theo dõi hoạt động học tập của học sinh tại lớp qua mỗi tiết học Yêu cầu các em trìnhbày cách giải quyết bài toán đơn giản
Ví dụ: Nêu các bước tính chu vi và diện tích hình vuông ta cần phải làm sao?
Từ đó, vận dụng kiến thức ngôn ngữ lập trình vào để giải bài toán đó trên máy tính
- Nâng cao dần dạng bài tập mới nhằm nâng cao tư duy tuật toán đối với các em
3.4. Thời gian thực hiện: Năm học 2015-2016, 2016-2017, 2017-2018
3.5. Biện pháp tổ chức
3.5.1 Sử dụng phương pháp giải quyết vấn đề
Trang 6- Đặt các tình huống đưa ra để HS xử lí, giải quyết theo yêu cầu đề bài.
- Vấn đề đặt ra là những thuật toán thực tế gần gũi với cuộc sống
- Học sinh xác định rõ vấn đề trước khi đi vào giải quyết vấn đề
- Học sinh có thể diễn tả bằng cách trình bày trước cả lớp
3.5.2 Sử dụng phương pháp kỹ thuật tạo ra ý tưởng
- Tôn trọng mọi ý tưởng học sinh đưa ra: Khi các ý tưởng được đưa ra, không được phépchỉ trích, phê bình ngay Tất cả các ý tưởng đều được ghi chép lại và phân tích đánh giá ởcác bước sau
- Học sinh tự do suy nghĩ: Không giới hạn việc đưa ra các ý tưởng
- Giáo viên kết nối các ý tưởng: Cải thiện, sửa đổi, góp ý xây dựng cho các ý tưởng
- Từ những ý tưởng sau khi góp ý thống nhất ta vận dụng ngôn ngữ lập trình vào giảiquyết
3.5.3 Sử dụng phương pháp dạy học thực hành
- Học sinh sử dụng máy tính và phần mềm Free Pascal học tập là chính
- Giáo viên sử dụng Phần mềm Netsupport School và kết hợp với Free Pascal để quản lý,hướng dẫn học sinh thực hành
- Thực hành theo sự hướng dẫn của giáo viên
- Giáo viên nhận xét, sửa chữa và đánh giá
3.6. Một số thuật toán thông dụng
3.4.1 Thuật toán 1: Tìm ước chung lớn nhất (UCLL)
Ý tưởng của thuật toán Euclide là UCLN của 2 số a,b cũng là UCLN của 2 số b và
a mod b, vậy ta sẽ đổi a là b, b là a mod b cho đến khi b bằng 0 Khi đó UCLN là
a
Hàm UCLN nhận vào 2 số nguyên a,b và trả lại kết quả là UCLN của 2 số đó
function UCLN(a,b: integer): integer;
var r : integer;
begin
while b<>0 do begin
Trang 7Chú ý: Dựa trên thuật toán tính UCLN ta có thể kiểm tra được 2 số nguyên tố cùng
nhau hay không Ngoài ra cũng có thể dùng để tối giản phân số bằng cách chia cả
tử và mẫu cho UCLN
Bài toán dạng 1: ƯCLL và BCNN
a) Ý tưởng, giải thuật
UCLN của 2 số x, y cũng là UCLN của 2 số y và x mod y, vậy ta sẽ đổi x là y, y là
x mod y cho đến khi y bằng 0 Khi đó UCLN là x
c)Chạy chương trình, in kết quả ra màn hình
Bài toán dạng 2: Rút gọn phân số
Trang 8Cho phân số a/ b trong đó a là số nguyên còn b là số tự nhiên khác không Hãy tìm 2 số c, d sao cho phân số c/ d tối giản và a/b=c/d.
+ Phân tích:
Đây là bài toán đơn giản, nhưng phải chú ý số a có thể âm
Program Rutgon_PS;
Uses crt;
Var Tu, mau, a: integer;
Function UCLN(x, y: integer): integer;
Var sodu:integer;
Begin
While y<>0 doBegin
Write(‘nhap tu so, mau so vao!’); Readln(tu, mau);
a:= UCLN(tu, mau);
if a>1 thenbeginTu:=tu div a;
Mau:=mau div a;
End;
Writeln(Tu:4, mau:4);
End
Trang 93.4.2 Thuật toán 2: Kiểm tra số nguyên tố
Thuật toán của ta dựa trên ý tưởng: nếu n >1 không chia hết cho số nguyên nào
trong tất cả các số từ 2 đến n thì n là số nguyên tố Do đó ta sẽ kiểm tra tất cả các số nguyên từ 2 đến có round(sqrt(n)), nếu n không chia hết cho số nào trong
đó thì n là số nguyên tố.
Nếu thấy biểu thức round(sqrt(n)) khó viết thì ta có thể kiểm tra từ 2 đến n div 2.
Hàm kiểm tra nguyên tố nhận vào một số nguyên n và trả lại kết quả là true (đúng) nếu n là nguyên tố và trả lại false nếu n không là số nguyên tố
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then exit; {nếu n chia hết cho i thì n không là nguyên tố => thoátluôn}
ngto:=true;
end;
Chú ý: Dựa trên hàm kiểm tra nguyên tố, ta có thể tìm các số nguyên tố từ 1 đến n
bằng cách cho i chạy từ 1 đến n và gọi hàm kiểm tra nguyên tố với từng giá trị i
Bài toán dạng 1: Nhập vào một số N Xác định xem số đó có phải số nguyên tố hay không.
a) Ý tưởng, giải thuật
Số nguyên tố là số chia cho 1 và chính nó Giả sử số vừa nhập vào là n, ta cho i chạy từ 2 đến n-1, nếu n chia hết cho i trong bất cứ lần lặp nào thì có nghĩa là n không nguyên tố,
nếu không chia hết cho bất cứ lần lặp nào là nguyên tố Về nguyên tắc là như vậy, ta đã chứng minh được rằng chỉ cần xét từ 1 đến phần nguyên căn 2 của N Như thế thuật toán
sẽ tối ưu hơn.
Gọi số cần xét là n, căn bậc hai của nó là x, hai ước tương ứng có tích bằng n của nó là a
và b(a<>b), ta cần chứng minh a<x hoặc b<x Vì a và b có vai trò tương đương, nên ta
Trang 10for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then bl:=false;
if bl=true then write('so vua nhap la so nguyen to.')
else write('so vua nhap khong phai la so nguyen to.');
readln;
end
c) Chạy chương trình, in kết quả ra màn hình
Bài toán dạng 2: Viết chương trình nhập vào từ bàn phím N số tự nhiên (với
10<=N<=40) thực hiện yêu câu sau:
- Nếu gặp các số lẻ thì tăng 5 đơn vị, nếu gặp các số chẳn thì tăng 10 đơn vị, nếu là
sô nguyên tố thì giữ nguyên giá tri.
- Sau đó sắp xếp và in ra màn hình dãy số vừa nhập theo thứ tự tăng dần.
Bài toán dạng 3: Viết chương trình nhập vào các số tự nhiên (là các số có giá trị lớn hơn
1000) từ bàn phím cho đến khi nào gặp số nguyên tố thì kết thúc nhập Sắp xếp và in ra màn hình dãy số vừa nhập theo thứ tự tăng dần.
Bài toán dạng 4: Số siêu nguyên tố
Số P gọi lầ số siêu nguyên tố, nếu nó nguyên tố và khi ta lần lượt bỏ các chữ số ở hàng đơn vị (từ phải qua trái ) thì số mới nhận được vẫn là một số nguyên tố.
Ví dụ: 239 là số siêu nguyên tố vì 239 là số nguyên tố và 23, 2 cũng là các số nguyên
tố , còn 431 là số nguyên tố, 43 cũng là số nguyên tố, nhưng 4 không phải số nguyên tố nên 431 không phải là số siêu nguyên tố Cho một số n (0<n<10) Hãy đếm số lượng các
số siêu nguyên tố có n chữ số
Trang 11while n mod i<>0 do i:=i+1;
if i=n then nguyento:=true else nguyento:=false;
end;
{Ket thuc chuong trinh con}
begin
clrscr;
write('Nhap chu so:'); readln(p);
a[1]:=2; a[2]:=3; a[3]:=5; a[4]:=7;
Trang 123.4.3 Thuật toán 3: Xử lý số nguyên
Bài toán dạng 1: Tính tổng các số nguyên
Ý tưởng là ta chia số đó cho 10 lấy dư (mod) thì được chữ số hàng đơn vị, và lấy số đó div 10 thì sẽ được phần còn lại Do đó sẽ chia liên tục cho đến khi không chia được nữa
(số đó bằng 0), mỗi lần chia thì được một chữ số và ta cộng dồn chữ số đó vào tổng.Hàm tính tổng chữ số nhận vào 1 số nguyên n và trả lại kết quả là tổng các chữ số của nó:
function tongcs(n:integer): integer;
Trang 13Bài toán dạng 2: Biển số xe chín nút
Mỗi biển số xe mô tô tại An Giang có cấu trúc như sau:
67-X 1 X 2
X 3 X 4 X 5 X 6 X 7
Trang 14Trong đó X1 là các chữ cái từ A đến Z.
X 3 X 4 X 5 X 6 X 7: là các chữ số từ 0 đén 9.
Hãy viết chương trình liệt kê tất cả các biển số xe có:
X3+X4+X5+X6+X7= 9
3.4.4 Thuật toán 4: Tính giai thừa của một số nguyên
Giai thừa n! là tích các số từ 1 đến n Vậy hàm giai thừa viết như sau:
function giaithua(n : integer) : longint;
var i : integer; s : longint;
Trang 153.4.5 Thuật toán 5: Đổi giờ, phút, giây
Write('Nhap vao so giay: '); readln(x);
gio:=x div 3600; x:=x mod 3600; phut:=x div 60; x:=x mod 60;
Writeln('Ket qua = ', gio,'gio: ', phut, 'phut: ', x, 'giay');
Readln;
End.
Bài toán dạng : Viết chương trình nhập vào từ bàn phím thời gian
T1(giờ-phút-giây) T2 là thời gian gấp 2 lần thời gian T1 Hãy in ra màn hình thời gian
T2( giời-phút-giây) sau khi thực hiện phép tính.
Writeln('Ket qua sau khi sap xep:');
For i:=1 To N Do Write(A[i]:5);
Readln;
End
Trang 163.4.7. Thuật toán 7: Phân tích một số thành thừa số nguyên tố
Cho số tự nhiên n (n>1) Hãy phân tích n thành tích các thừa số nguyên tố.
Ví dụ: Cho n=12 thì n=2.2.3, cho n=300 thì n=2.2.3.5.5
+ Phân tích: Chỉ cần duyệt qua các ước nguyên tố từ bé đến lớn rồi ghi ra.
Var i,n :integer;
3.4.8. Thuật toán 8: Chuyển đổi số nhị phân
Bài toán dạng 1 : Chuyển đổi thập phân ra số nhị phân
Biểu diễn số tự nhiên n từ hệ đếm thập phân qua các hệ đếm khác và ngược lại Cho n là số nguyên dương biểu diễn trong hệ thập phân Hãy biểu diễn n trong hệ đếm q – phân ( 1<q<10).