Vấn đề sử dụng chương trình con để giải quyết những bài toán lớn hơn trong tin học khá mới mẽ đối với học sinh của tôi, học sinh khó tiếp cận với đơn vị kiến thức trên, và đặc biệt thực
Trang 11 MỞ ĐẦU
1.1 Lý do chọn đề tài
Tốc độ phát triển của công nghệ thông tin ngày nay như vũ bão, người thầy cần phải tìm ra phương pháp dạy học tích cực hơn để tăng hiệu quả dạy và học Dạy học sinh học cách chủ động, phương pháp học, cách học những điều mà thực
tế đòi hỏi thay vì chuyển tải một lượng kiến thức quá nhiều đến mức học sinh không thể nhớ nổi, dẫu có nhớ lúc học, nhưng lại chóng quên
Môn Tin học, học sinh chưa có tư duy lập trình tốt, vì vậy rất khó cho việc dạy và học, mặc dù ngôn ngữ lập trình các học sinh cũng đã được giới thiệu ở lớp dưới, dần hình thành một tư duy lập trình trong các em, nhưng phần đông học sinh chưa được tích cực trong học tập, học tập lơ là dẫn đến kết quả yếu kém
Xuất phát từ thực tiễn giảng dạy tại trường THPT Gia Nghĩa tôi thấy rằng,
để đạt hiệu quả cao trong mỗi phần học, tiết học cần có cách thiết kế bài giảng cho phù hợp với nội dung kiến thức; phương pháp, phương tiện dạy học phải phù hợp với từng đối tượng học sinh Để qua mỗi phần học, tiết học học sinh thích thú với kiến thức mới, qua đó hiểu được kiến thức đã học trên lớp, đồng thời học sinh thấy được tầm quan trọng của vấn đề và việc ứng dụng của kiến thức trước hết để đáp ứng những yêu cầu của môn học, sau đó là việc ứng dụng của nó vào các công việc thực tiễn trong đời sống xã hội
Vấn đề sử dụng chương trình con để giải quyết những bài toán lớn hơn trong tin học khá mới mẽ đối với học sinh của tôi, học sinh khó tiếp cận với đơn vị kiến thức trên, và đặc biệt thực hành thường không hoàn thành được bài tập, đa số học sinh thường lười thực hành, e ngại các bài tập có sử dụng chương trình con
Trước khi thực hiện giải pháp này tôi chỉ sử dụng những ví dụ trong sách giáo khoa, sách bài tập mà không có một hệ thống chọn lọc các bài tập làm nổi bật vấn đề chương trình con, kết quả là học sinh thực hành không đạt yêu cầu, thường than khó, ít hứng thú trong học tập
Xuất phát từ cơ sở trên, tôi đã chọn lọc một số bài tập thực hành để đưa vào
hệ thống bài tập thực hành nhằm nâng cao hiệu quả dạy học môn tin học cho học sinh lớp 11 trường THPT Gia Nghĩa, “Sử dụng hệ thống bài tập thực hành nhằm nâng cao hiệu quả dạy và học chương trình con trong tin học lớp 11” là nhằm giúp các em hệ thống lại nội dung lý thuyết chương trình con vận dụng vào bài tập thực hành ở một góc độ trực quan và dễ tiếp thu hơn, từ đó hiểu rõ được ngữ nghĩa cũng như cách sử dụng “chương trình con” làm tốt các bài tập áp dụng, từ đó cảm thấy yêu thích hơn với môn tin học
1.2 Mục đích nghiên cứu
Tìm cách khắc phục những khó khăn của học sinh trong vấn đề tiếp thu kiến thức chương VI, tin học lớp 11, phần “chương trình con và lập trình có cấu trúc” từ
đó tạo cho học sinh hứng thú học tập, thực hành tốt hơn ở môn học này
1.3 Đối tượng nghiên cứu
Trang 2Sử dụng hệ thống bài tập thực hành có chọn lọc để giúp học sinh hứng thú hơn, dễ tiếp nhận đơn vị kiến thức chương trình con trong ngôn ngữ lập trình, tin học lớp 11 THPT
1.4 Phương pháp nghiên cứu
Xây dựng hệ thống bài tập chọn lọc có ứng dụng chương trình con bám sát mục tiêu môn học, để cung cấp cho học sinh làm bài tập thực hành khi học Chương VI: Chương trình con và lập trình có cấu trúc, môn tin học lớp 11
Đánh giá thử nghiệm bằng câu hỏi trắc nghiệm khách quan kết hợp với bài viết luận của học sinh để đánh giá sự tiếp thu kiến thức của học sinh
1.5 Giới hạn phạm vi nghiên cứu
Sử dụng hệ thống bài tập này cho các tiết dạy thực hành phần chương trình con trong tin học các lớp 11A5, 11A6 (năm học 2015 – 2016) trường THPT Gia Nghĩa, Đăk Nông
Trang 32 NỘI DUNG
2.1 Cơ sở lý luận của vấn đề
2.1.1 Lợi ích của việc dùng chương trình con trong ngôn ngữ lập trình
Trong kỹ thuật lập trình việc tổ chức lập trình kiểu cấu trúc modul hóa với các chương trình con trong ngôn ngữ lập trình bậc cao, chương trình con được diễn đạt là các hàm (function) hoặc các thủ tục (procedure)và phương thức (method),
Chương trình kiểu cấu trúc modul hóa, tức là chia chương trình thành nhiều modul, và trong chương trình chính muốn thực hiện thì gọi chúng, điều đó đem lại cho người lập trình các lợi ích sau:
+ Thay các đoạn trình giống nhau bằng một chương trình con, làm cho mã chương trình ngắn hơn, sáng sủa và dễ kiểm tra tính đúng đắn của chương trình
+ Đưa các chương trình con được viết sẵn vào thư viện (library) ở dạng văn bản trình hoặc dạng mã, để khi lập trình mới thì chỉ cần liên kết tới thư viện đó và
sử dụng
+ Những chương trình lớn được thiết kế dạng cấu trúc có thể chia nhỏ thành nhiều chương trình con cho nhiều người hoặc nhóm lập trình khác nhau
2.1.2 Khai báo chương trình con
Tùy theo từng ngôn ngữ lập trình cụ thể chương trình con được khai báo thông thường nằm ngay sau phần khai báo của chương trình chính
Trong ngôn ngữ lập trình Pascal phần khai báo chương trình con nằm ở phần cuối của phần khai báo trong chương trình chính
PROGRAM <Tên_chương_trình>; { Tên chương trình}
USES <Danh_sách_thư_viện>; {Khai báo thư viện}
CONST ;{Khai báo hằng}
TYPE ;{Khai báo kiểu}
VAR ;{Khai báo biến}
{Khai báo chương trình con}
BEGIN {Chương trình chính}
<Các lệnh của chương trình chính>;
END
2.1.2.a Khai báo hàm:
+ Khai báo hàm (Function):
FUNCTION <tên_hàm>[(<Danh_sách_tham_số>)]:<Kiểu_dữ_liệu>; [<phần khai báo>]
BEGIN
<Các lệnh của hàm>;
<tên_hàm>:=<Giá_trị>;
END;
2.1.2.b Khai báo thủ tục:
+ Khai báo thủ tục (Procudure):
Trang 4PROCEDURE <tên_thủ_tục>[(<Danh_sách_tham_số>)];
[<phần khai báo>]
BEGIN <Các lệnh của thủ tục>;
END;
2.1.3 Biến toàn cục và biến cục bộ
Biến toàn cục là biến được khai báo trong chương trình chính Các biến này
có thể được dùng ở mọi nơi trong chương trình và tồn tại trong suốt thời gian làm việc của chương trình
Biến cục bộ (biến địa phương) là các biến được khai báo trong chương trình con, các biến này chỉ được sử dụng trong phạm vi chương trình con mà nó được khai báo, sau khi kết thúc chương trình con các biến này sẽ được giải phóng khỏi
bộ nhớ
2.1.4 Cách truyền tham số trong chương trình con
Chương trình con không cần có tham số nếu không dùng đến chúng hoặc dùng trực tiếp biến toàn cục
Khi truyền tham số các tham số trong lời gọi chương trình con phải đúng thứ tự và kiểu tương ứng với khi khai báo chương trình con
+ Tham số hình thức (đối) là các tham số sau tên hàm và thủ tục trong khai báo
+ Tham số thực sự là các tham số sau tên hàm và thủ tục trong lời gọi + Tham biến: Là các tham số được khai báo sau từ khóa var Các tham số thực phải là các biến chứ không được là giá trị Tham biến có thể được thay đổi trong chương trình con và sau khi ra khỏi chương trình con nó vẫn giữ giá trị thay đổi đó
+ Tham trị: Là các tham số được khai báo mà không đứng sau từ khóa var + Các tham số thực có thể là các giá trị, hằng, biến Tham trị có thể thay đổi trong chương trình con nhưng sau khi kết thúc chương trình con giá trị của nó trở
về như ban đầu
+ Các tham số trong hàm luôn là các tham trị, các tham số trong thủ tục có thể là tham trị hoặc tham biến
2.1.5 Phân biệt cách sử dụng hàm và thủ tục
Hàm khác thủ tục ở chỗ hàm trả về một giá trị cho lệnh gọi thông qua tên hàm còn thủ tục thì không
+ Dùng hàm:
o Kết quả của bài toán trả về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc kiểu con trỏ)
o Lời gọi hàm cần nằm trong các biểu thức tính toán
+ Dùng thủ tục
Trang 5o Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trị hoặc trả về kiểu dữ liệu có cấu trúc (Array, Record, File)
o Lời gọi thủ tục không nằm trong các biểu thức tính toán
2.1.6 Tính đệ quy của chương trình con
Một chương trình con trong ngôn ngữ lập trình có thể gọi về chính nó, một lời gọi như thế gọi là một lời gọi đệ quy
2.2 Thực trạng của vấn đề
Chương trình con là một nội dung khó, mặc dù đã được Bộ giáo dục giảm tải nhiều phần, nhưng để học sinh thực hành và vận dụng được kiến thức trên với học sinh THPT Gia Nghĩa còn rất nhiều khó khăn, đa số học sinh trung bình yếu nên rất khó hoàn thành bài tập thực hành
Trong quá trình giảng dạy bản thân đã thực hiện một số giải pháp, một trong
số các giải pháp đó là sử dụng hệ thống bài tập chọn lọc có sử dụng chương trình con để làm sáng tỏ vấn đề giúp học sinh học tốt hơn, hứng thú hơn trong học tập 2.3 Các biện pháp đã tiến hành để giải quyết vấn đề
Ngoài sử dụng các ví dụ trong sách giáo khoa, tôi sử dụng thêm các bài tập sau để bổ sung cho học sinh từ dễ đến khó trong quá trình thực hành tại phòng máy tính và bài tập về nhà
Bài tập 1: Viết chương trình in ra màn hình hình chữ nhật được vẽ bằng các
kí tự * có N dòng và M cột, N và M được nhập từ bàn phím
Yêu cầu: Chương trình có thể vẽ nhiều lần bằng cách gọi thủ tục
Vehcn(N,M);
Ví dụ
*****
*****
*****
***
***
***
***
***
**********
**********
Bài tập này được bổ sung ngay sau bài tập ví dụ về thủ tục vẽ hình chữ nhật
ví dụ 1 bài 18 Ví dụ về cách viết và sử dụng chương trình con, trang 96, sách giáo khoa tin học 11.
Để khắc sâu cho học sinh cách sử dụng thủ tục, truyền tham số, thay tham
số hình thức bằng tham số thực sự Ngoài sử dụng thủ tục còn nhắc lại cho học sinh kiến thức về vòng lặp
PROGRAM Vidu1;
USES crt;
VAR N, M : byte;
Ch: Char;
PROCEDURE Vehcn(A, B: byte); {A,B la tham so hinh thuc}
Trang 6Var i,j: Byte;
BEGIN
For i:=1 to A do
Begin
For j:=1 to B do Write('*');
Writeln;
End;
END;
BEGIN
Ch := 'Y';
While(Upcase(Ch)='Y') do
Begin
Write('Nhap so N = ' ); Readln (N);
Write('Nhap so M = '); Readln(M);
Vehcn(N,M); {M,N la tham so thuc su duoc truyen vao chuong trinh con Vehcn(A,B)}
Write('Ban muon ve nua khong? (Y/N)');
Readln(Ch);
End;
END
Bài tập 2 bổ sung thêm ngay sau ví dụ tham biến 1(trang 97, sách giáo khoa tin học 11) nhằm làm cho học sinh hiểu rõ hơn về tham trị trước khi kết bằng
ví dụ tham biến 2 (trang 100, sách giáo khoa tin học 11) để học sinh hiểu rõ cách
sử dụng tham biến, tham trị trong chương trình con.
Bài tập 2: Một học sinh viết chương trình cho phép nhập hai số vào hai
biến, thực hiện đổi giá trị của hai biến cho nhau Yêu cầu dùng chương trình con để thực hiện chức năng đổi giá trị
Nhận xét chương trình sau viết như vậy đúng hay chưa? Có thỏa mãn yêu cầu của đề bài?
PROGRAM Vidu2;
USES crt;
VAR M,N: integer;
PROCEDURE DoiAB(A,B :Integer);
Var T: Integer;
Begin
T:=A;
A:=B;
B:=T;
End;
BEGIN
Write('Nhap vao so N = '); Readln(N);
Write('Nhap vao so M = '); Readln(M);
DoiAB(N,M);
Writeln('So N co gia tri la:',N);
Writeln('So M co gia tri sau khi doi la:',M);
Trang 7Readln;
END
Bài tập 3 được đưa vào sau khi dạy mục 2 cách viết và sử dụng hàm trang
101 sách giáo khoa tin học lớp 11 trước ví dụ của sách giáo khoa tìm ước số chung lón nhất của hai số nguyên Nhằm để học sinh dễ hiểu hơn về sử dụng hàm Với ví dụ sách giáo khoa học sinh của tôi khó tiếp nhận vì vậy phải đưa ví dụ này trước sau đó mới đến bài tập 4.
Bài tập 3: Viết chương trình tìm số lớn nhất trong 2 số nguyên A và B.
Yêu cầu: Chương trình có thể so sánh nhiều lần bằng cách sử dụng hàm trả
về số lớn nhất giữa hai số
PROGRAM Vidu3;
USES crt;
VAR A, B, Max : integer; Ch:Char;
FUNCTION Max2so (A, B: integer): integer;
BEGIN
If A > B then Max2so := A else Max2so :=B;
END;
BEGIN
Ch := 'Y';
While(Upcase(Ch)='Y') do
Begin
Write('Nhap so nguyen thu nhat = ' ); Readln(a);
Write('Nhap so nguyen thu hai= '); Readln(b);
Max:= Max2so(a,b); {Max chua gia tri tra ve cua ham Max2so(a,b)} Writeln('So Max la: ' , Max);
Write('Ban muon so sanh nua khong? (Y/N)');
Readln(Ch);
End;
END
Bài tập 4 này dùng để thay thế cách tìm ước số chung lớn nhất của hai số nguyên dương Sau đó yêu cầu học sinh nghiên cứu ví dụ sách giáo khoa Khẳng định lại với học sinh một bài toán có thể có nhiều thuật toán để giải Yêu cầu học sinh so sánh thuật toán nào tốt hơn, vì sao?
Bài tập 4: Viết chương trình tìm ước số chung lớn nhất của hai số N và M,
với N, M nguyên dương được nhập vào từ bàn phím
Yêu cầu: Chương trình dùng hàm tìm ước số chung lớn nhất USCLN(N,M)
PROGRAM Vidu4;
USES crt;
VAR M,N: integer;
FUNCTION USCLN(N,M :Integer):Integer;
Begin
While M<>N do
If M>N then M:=M-N else N:=N-M;
USCLN:=N;
Trang 8BEGIN
N:=0; M:= 0;
While N<=0 do {kiem tra so N luon duong}
Begin
Write('Nhap vao so N = '); Readln(N);
End;
While M<=0 do {Kiem tra so M luon duong}
Begin
Write('Nhap vao so M = '); Readln(M);
End;
Write('USCLN(',N,',',M,')=',USCLN(N,M)); {goi ham USCLN}
Readln;
END
Bài tập 5 nhằm bổ sung thêm sau khi học sinh làm bài tập thực hành 6 trang 103, sách giáo khoa tin học 11, giúp học sinh ôn tập lại cách sử dụng hàm
và thủ tục Biến cục bộ và biến toàn cục
Bài tập 5: Viết chương trình nhập vào một dãy số nguyên dương, tìm và in
ra tất các các ước số chung lớn nhất của từng cặp số liền nhau tương ứng của dãy vừa nhập
Ví dụ:
Nhập dãy số: 5 6 7 3 5 10 20 12 8
Dãy số được xuất ra màn hình là: 1 1 1 1 5 10 4 4
PROGRAM Vidu5;
USES crt;
TYPE Kieu_Mang = Array [1 10000] of integer;
VAR i,N: integer;
A: Kieu_Mang;
FUNCTION USCLN(N,M :Integer):Integer;
Begin
While M<>N do
If M>N then M:=M-N else N:=N-M;
USCLN:=N;
End;
PROCEDURE NhapdayNso(Var A: Kieu_Mang; N:Word);
Var i:integer;
Begin
For i:=1 to N do
Begin
Write('A[',i,']='); Readln(A[i]);
End;
End;
BEGIN
Write('Nhap vao day so co so phan tu N = '); Readln(N);
Trang 9NhapdayNso(A,N);
Writeln('Day cac uoc so chung lon nhat cua tung cap so:');
For i:=1 to N-1 do
Write(USCLN(A[i],A[i+1]),' ');
Readln;
END
Bài tập 6 được đưa vào sau bài tập thực hành 7, trang 105, sách giáo khoa tin học 11 (tiết phân phối chương trình 49, Bài tập luyện tập)
Bài tập 6: Viết chương trình nhập vào một số nguyên dương N, In ra màn
hình các số nguyên tố nhỏ hơn N
Yêu cầu: Dùng hàm để kiểm tra một số có phải là số nguyên tố hay không.
Ví dụ:
Nhập số N= 20
Dãy số được xuất ra màn hình là: 2 3 5 7 11 13 17 19
PROGRAM Vidu6;
USES crt;
VAR i,N: integer;
FUNCTION KTNT(M :Integer):Boolean;
Var i:Integer;
Begin
KTNT:=True;
If M<4 then KTNT:=True
Else
For i:=2 to Trunc(Sqrt(M)) do
If M Mod i= 0 then KTNT:=False;
End;
PROCEDURE InsoNTNHN(N:Integer);
Var i:integer;
Begin
For i:=2 to N-1 do
If KTNT(i) then Write(i,' ');
End;
BEGIN
Write('Nhap vao so N = '); Readln(N);
InsoNTNHN(N);
Readln;
END
Bài tập 7 đưa vào tiết phân phối chương trình 49: Bài tập luyện tập
Bài tập 7: Viết chương trình nhập vào một số nguyên dương N, tính giai
thừa của số n (Viết là n!) Với yêu cầu:
Sử dụng chương trình con để tính giai thừa của một số
n! = 1 nếu n = 0;
Trang 10n! = 1.2.3.4.5 n (Tích của n thừa số).
PROGRAM Vidu7a;
USES Crt;
VAR N:integer; X:int64;
PROCEDURE Giai_Thua(Var GT:int64; N:byte);
Begin
GT:=1;
While n>0 do
Begin
GT:=GT*N;
N:=N-1;
End;
End;
BEGIN
N:=-1;
While N<0 do
Begin
Write('Nhap so N = ');Readln(N);
End;
Giai_Thua(X,N);
Writeln(N,'! = ',X);
Readln;
End
Cách khác tính theo phương pháp đệ qui
PROGRAM Vidu7b; {Tinh Giai thua cua N theo phuong phap de qui} USES crt;
VAR N:integer;
FUNCTION Giai_Thua(N:byte): Int64;
Begin
If n<=1 Then Giai_Thua:=1
Else Giai_Thua:=N*Giai_Thua(N-1);
End;
BEGIN
N:=-1;
While N<0 do
Begin
Write('Nhap so N = ');Readln(N);
End;
Writeln(N,'!',' = ',Giai_Thua(N));
Readln;
END
Bài tập 8 được đưa vào tiết phân phối chương trình: 50.
Bài tập 8: Viết chương trình sắp xếp một dãy số gồm N số thành dãy tăng
dần, xuất kết quả ra màn hình