Nhập a =16 b= 24 d =8 Ví dụ 3: Tìm tất cả các số nguyên tố trong các số nguyên N được nhập vào từ bàn phím: + Xác định thông tin vào:Nhập số nguyên N +Xác định thông tin ra: Các số ngu
Trang 1Giáo Viên: Ngô Dương Khôi Đơn vị: Trường THCS Lương Tâm
ĐỀ TÀI:
I ĐẶT VẤN ĐỀ
Hiện nay, khi cơng nghệ thơng tin ngày càng phát triển thì việc ứng dụng cơng nghệ thơng tin vào tất cả các lĩnh vực là một điều tất yếu Trong lĩnh vực giáo dục, cơng nghệ thơng tin đã được ứng dụng trong cơng tác quản lý, giảng dạy và học tập
Một trong các mục tiêu khi chọn ngơn ngữ lập trình Pasacal để thi học sinh giỏi mơn tin học trong trường học là nhằm giúp học sinh khơng chỉ biết soạn thảo văn bản mà cịn phải cĩ khả năng phân tích, tổng hợp, trừu tượng hố, khái quát hố vấn đề và đặc biệt là phát triển tư duy, sáng tạo Với chương trình mơn Tin Học THCS, học sinh mới làm quen với việc lập trình nên gặp nhiều khĩ khăn khi tham dự các kì thi học sinh giỏi mơn tin học.Vì thế tơi sẽ hướng cho học sinh cách để trở thành một nhà lập trình thì cần phải nắm bước nào?
II MỤC TIÊU CỦA ĐỀ TÀI
Chương trình Pascal là một phần mềm cĩ cấu trúc được nhiều độc giả quan tâm và cũng cĩ nhiều cuốn sách do nhiều tác giả viết về ngơn ngữ lập trình này Song với bản thân tơi khi lựa chọn viết đề tài này là muốn chia sẽ kinh nghiệm rèn luyện kỹ năng lập trình cho học sịnh giỏi mơn Tin học với đồng nghiệp trong và ngồi tỉnh Hậu Giang
III NỘI DUNG
1 Thực trạng của vấn đề
Trong quá trình dạy học tơi nhận thấy, mới đầu các em cũng rất sợ khi thấy giải một bài tốn ở ngồi thì đơn giản, cĩ thể chỉ trong vịng vài giây là nhẩm ra kết quả Cịn
ở trong lập trình cũng bài tốn đĩ mà phải làm đến hàng chục phút mà lại cĩ thể cho kết quả sai Điều đĩ đã thúc đẩy tơi rất nhiều trong việc giảng dạy, tơi phải tìm ra phương pháp để học sinh cĩ kỹ năng và sự say mê trong lập trình
2 Nguyên nhân
Phương pháp cơ bản giải các bài tốn trong tin học khơng chỉ dùng để giải một bài tốn cụ thể mà cịn giải 1 lớp các bài tốn cụ thể thuộc cùng một loại Bài tốn được cấu tạo từ hai yếu tố cơ bản: Thơng tin vào (Input) và thơng tin ra (Output) Phương pháp tổng quát để giải một bài tốn bằng máy vi tính dựa trên ngơn ngữ pascal thì cần các bước :
Trang 21 Xác định các bài toán.
2 Tìm thuật toán
3 Viết chương trình
4 Chạy thử, sửa đổi chương trình
3 Giải pháp
a/ Khái niệm bài toán
Trong quá trình học người học sinh hay bất kỳ một cá nhân nào luôn phải liên tục giải quyết các bài toán Trong cuộc sống là một chuỗi các bài toán mà ta phải đối đầu giải quyết không một chút đơn giản Song đối với học sinh, do chương trình học toán của các
em chỉ mới đến giải phương trình bậc nhất là cao nhất Nên việc đưa các lớp bài toán vào giải cho các em đang còn một phần nào bị hạn chế Nhưng bất kỳ một bài toán nào thì chúng ta cũng đọc đề rồi xác định nó như sau: AB
Trong đó:
A là giải thiết : điều kiện ban đầu hoặc cái đã cho khi bắt đầu giải bài toán
B là kết luận: Mục tiêu cần đạt được hay cái phải tìm, phải làm ra khi kết thúc bài toán
là suy luận: giải pháp cần xác định hay một chuối thao tác thực hiện từ A đến B
b/ Bài toán trên máy vi tính
Bài toán trên máy cũng mang đầy đủ các tính chất của bài toán tổng quát trên, nhưng nó lại được diễn đạt theo một các khác
- A: là đưa thông tin vào (Input )
- B: là đưa thông tin ra( Output)
- : là chương trình tạo từ các lệnh cơ bản của máy tính cho phép biến đổi từ A đến B
Một số ví dụ
Ví dụ 1: Tính diện tích hình chữ nhật
Ta cần xác định cho bài toán:
+ Thông tin vào: Chiều dài là cạnh a, chiều rộng là cạnh b
+ Thông tin ra: Kết quả diện tích khi đưa a,b vào
+ Các thông tin cần chế biến thông tin như:
- Lần lượt đưa a,b vào ( cho a=3,b=4)
- Áp dụng công thức tính diện tích hình chữ nhật: a*b
- Kết quả in ra là 12
Ví dụ 2: Cho 2 số tự nhiên a, b.Tìm ước số chung lớn nhất của chúng
Các bước các định bài toán:
+ Xác định thông tin vào: hai số tự nhiên a,b
Trang 3+ Xác định thông tin ra: số tự nhiên d thoả mãn:
d là ước của a và d là ước của b
d là số lớn nhất trong tập các ước chung của a, b + Xác định các thao tác chế biến thông tin
Xây dựng hữu hạn các thao tác cho phép tính được d từ a và b
Nhập a =16 b= 24 d =8
Ví dụ 3: Tìm tất cả các số nguyên tố trong các số nguyên N được nhập vào từ bàn phím:
+ Xác định thông tin vào:Nhập số nguyên N
+Xác định thông tin ra: Các số nguyên tố (chia hết cho nó và số 1)
c/ Tìm thuật toán
Thuật toán là một quá trình gồm một dãy hữu hạn các thao tác đơn giản được sắp xếp theo một trình tự xác định sao cho theo đó từ Input của bài toán sẽ tìm ra được Output bài toán
Một bài toán ta có 4 cách thể hiện thuật toán: Các bước xác định bằng lời, lập sơ đồ khối, dùng ngôn ngữ phỏng trình, dùng một ngôn ngữ lập trình (Pascal)
Ví dụ: Tìm ước số chung lớn nhất của 2 số nguyên dương a,b ta có thể giải bằng các
cách trên
Cách 1: Các bước xác định bài toán bằng lời:
- Bước 1: Nhập 2 số nguyên dương là a,b
- Bước 2: So sánh giá trị a và b Nếu a bằng b thì sang bước 3, ngược lại a khác b thì sang bước 4
- Bước 3: Tìm được ước số chung là a và kết thúc chương trình
- Bước 4: Nếu a lớn hơn b thì ước số chung lớn nhất là a và quay trở lại bước 2 Ngược lại ước số chung là b và quay trở lại bước 2
Cách 2: Giải bài toán bằng sơ đồ
- Có hình thoi thể hiện các thao tác so sánh
- Hình chữ nhật thể hiện các phép tính toán, các câu lệnh
- Hình ôvan thể hiện bắt đầu và kết thúc
- Các mũi tên quy định trình tự các thao tác
Trang 4sai
Đúng Sai
Cách 3: Dùng ngôn ngữ phỏng trình
Bắt đầu
Nhập a, b
While a khác b
IF a>b then thay a :=a -b Else thay b:=b-a;
Kết thúc in ra USCLN (a,b)
Begin
a, b
a<>
b
b:= b - a a:= b - a
End
Trang 5Cách 4: Viết chương trình hoàn chỉnh (dùng ngôn ngữ pascal)
PROGRAM USCLN;
USES CRT;
VAR a,b, :integer;
BEGIN
CLRSCR;
WRITE('nhap 2 gia tri m,n=');READLN(a,b);
WHILE m<>n DO
IF a>b THEN a:=a –b
else b:=b-a;
WRITELN('uoc so chung lon nhat cua 2 so’,a:5);
READLN
END.
d/ Viết chương trình
Lập trình là dùng ngôn ngữ máy vi tính cụ thể nào (ngôn ngữ Pascal) để diễn tả thuật toán, cấu trúc dữ liệu thành câu lệnh để máy tính có thể thực hiện được và giải quyết đúng bài toán mà người lập trình mong muốn
Kỹ năng lập trình
Rèn luyện được cho học sinh kỹ năng cài đặt thành công các thuật toán bằng một ngôn ngữ lập trình Đã gọi là kỹ năng thì chỉ có thể có được thông qua rèn luyện tích cực Kinh nghiệm cho thấy một thuật toán do cài đặt vụng về, lộn xộn thì khi chạy trên máy tính có thể cho kết qủa tồi tệ
Phát triển chương trình bằng cách tinh chế từng bước
Một bài toán ta có thể đưa ra nhiều cách giải khác nhau, song là một giáo viên thì chúng ta cần giúp học sinh viết chương trình làm sao người xem nhìn vào có thể dễ hiểu được bài toán đó là gì? Do đó việc tinh chỉnh các bước cho bài toán trong máy tính là phương pháp khoa học, có hệ thống giúp ta phân tích các thuật toán và cấu trúc dữ liệu từ
đó thành một chương trình Muốn lập trình giỏi không phải chỉ cần nắm ngôn ngữ lập trình là đủ Mà vấn đề cốt yếu là biết phương pháp phát triển dần dần để chuyển các ý tưởng ra thành chương trình hoàn chỉnh
Phương pháp tinh chế từng bước
Một chương trình bắt đầu được viết bằng lời tự nhiên (tiếng việt) thể hiện sự phân tích tổng thể của người lập trình được thể hiện ở từng bước sau các câu lệnh được phân tích chi tiết hơn, bằng những lời khác nhau tương ứng với sự phân tích công việc thành các việc nhỏ chi tiết hơn dễ hiểu và chỉnh xác hơn Song ngôn ngữ lập trình Pascal người lập trình có thể đưa ra phương pháp tinh chỉnh từng bước là thể hiện tư duy giải quyết
Trang 6vấn đề bài toán từ trên xuống trong đó các bước là hướng về ngôn ngữ lập trình làm sao cho bài toán đa ra được phương pháp lập trình tối ưu, sáng sủa
Ví dụ
Tìm tất cả các số nguyên tố trong các số nguyên N được nhập vào từ bàn phím
a Tinh chế lần 1
- Lấy 2 tập
NT= [ ] (để chứa các số nguyên tố tìm đựợc)
S = [2, N] (tập các số cần xét )
- Tìm số đầu tiên trong S đưa vào NT
- Loại bỏ khỏi S các bội số của số nguyên tố vừa tìm được
- Số đầu tiên còn lại của S là số nguyên tố Tiếp tục quá trình cho đến khi S=[ ]
- Xuất NT
b Tinh chế lần 2
Bắt đầu
NT: = [ ]
S = [2, N]
Repeat
Tìm số đầu tiên trong S
NT:= NT+ [S0]
Loại khỏi S các bội số của S0
Until S=[ ];
Xuất NT;
Kết thúc;
c Tinh chế lấn 3
Program nguyen_to;
Const
N=100;
Type
nguyen=1 N;
var
NT, S:set of nguyen;
S0,I:integer;
begin
NT:=[ ]; S:=[2 N];S0:=2;
repeat
while not (S0 in S) do
S0:=S0+1; NT:=NT+[S0];I:=S0;
While I<=N do
Begin
Trang 7s:=S-[i];I:=I+S0;
End;
until S=[];
for I:= 1 to n do
If I in Nt then Write(I:4);
readln
end
d Tinh chế lần 4 Rõ ràng cấu trúc dữ liệu tập hợp Set of nguyen tuy dễ hiểu nhưng rất
cồng kềnh và làm máy chạy chậm chạp, ta có thể dùng mảng Boolean linh hoạt hơn như sau:
Program nguyen_to;
Const
N=100;
var a: array[1 N] of boolean;
i,j: integer;
begin
a[1]:=false;
for i:=2 to N do a[i]:=true;
for i:= 2 to N div 2 do
for j:= 2 to N div i do
a[i*j]:=false;
for i:= 1 to N do
if a[i] then
write(i:3);
readln
end
e Tinh chế lần 5
Trong ngôn ngữ pascal nếu dùng mảng boolean thì ta bị giới hạn N<10000 Để có thể chạy với số lớn hơn ta không dùng mảng, tập hợp mà dùng như sau:
Program nguyen_to;
uses crt;
var
i,j,k,n:integer;
begin
repeat
write('nhap n=');readln(n);
until n>= 2;
for i:= 2 to n do
begin
k:=0;
for j:= 2 to trunc(sqrt(i)) do
Trang 8if i mod j=0 then k:= 1;
if k=0 then write(i:3);
end;
readln
end
Vậy đó là kỹ năng lập trình người lập trình có thể tinh chỉnh chương trình từng bước làm sao đưa ra một phương án tối ưu cho ngwời xem dễ tiếp thu cũng như chiếm bộ nhớ của máy tính càng ít các tốt
e/ Chạy thử, thay đổi và kiểm tra chương trình
Chạy thử
Một chương trình đã viết xong chưa chắc đã chạy được trên máy vi tính để cho kết quả mong muốn
Ví dụ: Tìm số lớn nhất trong 3 số a,b,c nguyên dương được nhập vào từ bàn phím.
Lần 1: Program tim_so;
uses crt;
var
a,b,c:integer;
begin
clrscr;
write('nhap 3 so=');readln(a,b,c);
if a<b then a:=b
else if a<c then a:=c;
write('so lon nhat la ',a);
readln
End
Với chương trình này cũng chạy được song đáp số có lúc đúng, có lúc sai tuỳ thuộc vào lúc nhập giá trị a,b,c{ nếu ta nhập thứ tự a=5,b=7,c=9
Thì sẽ cho ta kết quả số lớn nhất là 7 Vậy thì sai hoàn toàn}
Do đó người lập trình cần phải biết cách tìm lỗi Sữa lỗi, điều chỉnh viết lại chương trình cũng là kỹ năng quan trọng của người lập trình Vậy với dụ trên để kết quả luôn đúng thì ta có thể viết lại chương trình
Lần 2: Program tim_so;
uses crt;
var a,b,c,t:integer;
begin
clrscr;
write('nhap 3 so=');readln(a,b,c);
t:=a;
if t<b then t:=b;
Trang 9if t<c then t:=c;
write('so lon nhat la ',t);
readln
End
Nếu nhập:
Phân loại lỗi và cách sửa lỗi
- Lỗi về thuật toán: Điều chỉnh lại thuật toán, thêm vị trí có thể, loại bỏ thuật toán sai, tìm thuật toán khác nghĩa làm lại từ đầu
Ví dụ: viết chương trình tính tổng S=
n
1
3
1 2
1
1 + + + + (n được nhập vào từ bàn
phím)
Học sinh viết chương trình khai báo biến S thuộc kiểu dữ liệu nguyên thì chương trình sẽ không thực hiện được phép toán tính tổng Do vậy để thực hiện được phép toán thì khai báo biến S là thuộc kiểu dữ liệu thực
- Lỗi về trình tự: Phải xem lại thuật toán, phân tích lại từ trên xuống dưới để đặt lại cho đúng với thuật toán
Ví dụ:Viết chương trình giải phương trình bậc nhất ax+b=0 với a,b được nhập vào
từ bàn phím
program ptb1;
var
a,b:real;
begin
write('nhap cac he so='); readln(a,b);
if a<>0 then writeln('moi so deu la nghiem')
else if b=0 then writeln('phuong trinh co nghiem',-b/a:4:2) else writeln('phuong trinh vo nghiem');
readln
end
Với chương trình trên hoàn toàn có thể chạy được song kết quả sẽ không đúng khi nhập dữ liệu a, b vào Do vậy ta phải sắp xếp lại thuật toán để cho một kết quả đúng như yêu cầu :
Program ptb1;
Trang 10a,b:real;
begin
write('nhap cac he so=');readln(a,b);
if a<>0 then if b=0 then writeln('phuong trinh vo nghiem')
else writeln('phuong trinh co nghiem',-b/a:4:2)
else writeln('moi so deu la nghiem');
readln
end
- Lỗi về cú pháp: viết lại cho đúng cú pháp của ngôn ngữ lập trình mà mình đang
sử dụng
Ví dụ : Lỗi sau câu lệnh ta không sử dụng dấu chấm phẩy, hay kết thúc chương
trình không có dấu chấm, hay từ khoá DOWNTO nếu ta viết DOWN TO thì sẽ không có nghĩa
f/ Kiểm tra
Có nhiều chương trình khó kiểm tra tình đúng đắn, nhất là chương trình tìm kiếm lời giải tối ưu Vì chúng chưa biết kết qủa nào là đúng nhất Vì vậy việc tìm lỗi rất là khó khăn.Trong quá trình chạy thử một chương trình ta cần lưu ý:
- Nếu khởi đầu bằng bộ chương trình (test ) nhỏ nhưng các giá trị đặc biệt (đây là
dễ bị lỗi nhất)
- Làm nhiều các bộ test nhưng phải đa dạng tránh lặp đi lặp lại các bộ test tương tự
- Nên kết thúc bằng các bộ test có kích thước lớn để kiểm tra tính chịu đựng của chương trình
g/ Thay đổi chương trình
Một chương trình đã viết xong, đã chạy thử tốt, giải quyết đúng bài toán mà ta mong muốn nhưng chưa có nghĩa là quá trình lập trình đã xong Mà người lập trình muốn
nó ở đây ta có thể sửa đổi nó theo một hướng khác mà nó có thể đáp ứng được một yêu cầu mới Như phần tinh chế một chương trình là rất quan trọng cho việc sửa chữa chư-ơng trình cũ sang chưchư-ơng trình mới
Ví dụ: - Nhập 3 số a,b,c kiểm tra xem 3 số đó có thể là độ dài của các cạnh một tam giác
hay không Từ đó ta có thể chuyển nó sang dạng là các cạnh đó thoã mãn tam giác cân, đều hay là tính diện tích của tam giác đó
- Tính tổng cho N số nguyên đầu tiên được nhập vào từ bàn phím Từ đó ta có thể triển khai tính giai thừa, tìm số nguyên tố, độ dài của dãy số đó, tính trung bình cộng cho dãy số……
- Nhập vào mảng của dãy số từ bàn phím Từ đó ta có thể tìm giá trị lớn, nhỏ của mảng, trung bình độ dài của mảng, điểm của học sinh…
Trang 11Vậy là một người lập trình bạn cần nắm được các tiêu chuẩn của một chương trình
từ giúp bài toán có một kết quả tốt
- Tính tin cậy: Có một giải thuật đúng
- Tính uyển chuyển: Chương trình có thể sửa đổi
- Tính trong sáng: dễ đọc, dễ hiểu
- Tính hữu hiệu: chạy chương trình nhanh và tốn ít dung lượng bộ nhớ về không gian và thời gian
4 Hiệu quả đạt được
Với việc ứng dụng những kinh nghiệm trên vào việc ôn thi học sinh giỏi tin học và tin học trẻ đã mang lại kết quả rất khả quan cho trường THCS Lương Tâm trong những năm qua, được thể hiện qua bảng thống kê sau:
2013-2014 2 nhì, 3 ba, 3 khuyến khích 1 nhất, 1 ba
5 Bài học kinh nghiệm
Quá trình xây dựng chương trình là một chuỗi các bước tinh chế ở mỗi bước được phân ra nhiều công việc con để từ đó đưa ra được phương pháp tối ưu Song người lập trình cần rèn luyện để có ý thức về các quyết định liên quan và biết khảo sát nghiêm túc cũng như từ bỏ các lời giải ngay cả khi chúng đúng Mà cần phải cân nhắc mọi phương tiện của từng lời giải theo một tiêu chuẩn
Để đưa ra một phương pháp tối ưu cho một bài toán không đơn giản Bởi một bài toán chúng ta có thể đưa ra nhiều phương pháp giải khác nhau Song trong lập trình người giải không sử dụng đúng cách giải thì một bài toán lại đi ngược lại là cho các kết quả khác nhau Điều đó chứng tỏ cho thấy người lập trình cần phải nắm được các bước giải bài toán trong lập trình
Bài toán cho kết quả sai là do nhiều nguyên nhân mà tôi đã trình bày ở phần trước như:
+ Chọn kiểu dữ liệu sai
+ Viết kết quả in ra ở dạng có quy cách và không quy cách
+ Phép gán sai ví dụ như bài toán tính tổng ban đầu ta phải gán S:=0; nếu gán S:= 1; thì cho kết quả sai Hay Bài toán tính tích thì phép gán phải ngược trở lại ban đầu S:=1;
IV ĐỀ XUẤT, KIẾN NGHỊ
Là một giáo viên tin học tôi muốn nói rằng chúng ta không chỉ dạy lý thuyết suông mà cần phải biết kết hợp thực hành Để từ đó học sinh mới nhận thấy được ưu điểm của việc học chương trình này có lợi hơn ở điểm nào Đồng thời cũng phối hợp