Tải bản đầy đủ (.doc) (17 trang)

SKKN:Các bước giải một bài toán cho lớp bài toán trên máy vi tính

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (113.63 KB, 17 trang )

Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

A Đặt vấn đề
1. Lý do
Hiện nay nước ta cũng như các nước trên thế giới đang cạnh tranh về ngành
công nghệ chế tạo máy cũng như các sản phần phần mềm giúp ích cho con người
trên mọi lĩnh vực. Vậy làm thế nào để làm được điều đó : nhờ vào ngành công nghệ
thông tin. Ngày xa xưa con người không biết đọc, không biết viết đó là một nỗi khỗ
vô cùng, còn ngày nay con người không biết sử dụng máy vi tính thì coi như là
không biết đọc, không biết viết. Vậy khi biết sử dụng máy vi tính rồi chúng ta sẽ
làm gì hay chỉ ngồi chơi điện tử, các trò giải trí, soạn thảo các bài văn bản mà
thôi ?
Là một giáo viên tin học một trong các mục tiêu khi đưa tin học vào trường
học là nhằm giúp học sinh không chỉ biết soạn thảo mà còn phải có khả năng phân
tích, tổng hợp, trừu tượng hoá, khái quát hoá vấn đề và đặc biệt là phát triển tư duy,
sáng tạo. Những năm qua môn tin học ở THCS chưa có sách giáo khoa cụ thể
hướng dẫn cho học sinh về cách phân tích lập trình. Vì vậy học sinh chưa có tính
độc lập sáng tạo mà phải nhờ vào giáo viên rất nhiều. Nhưng năm nay đã có sách
giáo khoa hướng dẫn cho học sinh cụ thể qui trình lập trình như thế nào.Vì thế mà
tôi sẽ hướng cho học sinh lớp 8 cách để trở thành một nhà lập trình thì cần phải
nắm bước cơ bản nào?
2. Cơ sở thực tiễn
Trong quá trình dạy tôi nhận thấy ở các em học sinh. Mới đầu các em cũng
rất sợ khi thấy giải một bài toán ở ngoài thì đơn giản và chỉ trong vòng vài giây có
thể nhẩm ra kết quả . Còn ở trong lập trình cũng bài toán đó mà phải làm đến hàng
chục phút mà lại có thể cho kết quả sai. Song bằng những tâm huyết của mình và
cũng như sự yêu thích của học sinh. Nhất là năm nay nghành giáo dục có phát động
phong trào giải toán trên mạng. Điều đó đã thúc đẩy tôi rất nhiều trong việc dạy
học là làm sao đưa ra được cho các em sự đam mê và phát triển tài năng của học
sinh trong việc đào tạo nhân tài cho đất nước .
1




Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

Ngôn ngữ lập trình PASCAL là một phần mềm có cấu trúc và rất được nhiều
độc giả quan tâm và cũng chính đó cũng có nhiều cuốn sách do nhiều tác giả viết.
Song với bản thân tôi khi lựa chọn viết đề tài này là muốn đưa ra
“ các bước giải một bài toán cho lớp bài toán trên máy vi tính” sử dụng bằng ngôn

ngữ lập trình pascal.
B- Giải quyết các vấn đề
Phương pháp cơ bản giải các bài toán trong tin học không chỉ dùng để giải
một bài toán cụ thể mà còn giải 1 lớp các bài toán cụ thể thuộc cùng một loại. Bài
toá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 toán bằng máy vi tính dựa trên
ngôn ngữ pascal thì cần các bước :
1. 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
I- Xác định bài toán

1. 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à 1 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 mà nhiều lúc phải bức mình. Song đối với
học sinh lớp 8 do chương trình học toán của các 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ó : A->B.

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 .
2


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

- → 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.
2. 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.
3. 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

+ 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

3


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

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)
II- 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, 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

4


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

Begin

a, b

a=b

đúng

UCLN là a

EN
D

sai

Đúng


Sai
a<>b

b:= b - a

a:= b - a

Cách 3: Dùng ngôn ngữ phỏng trình
Bắt đầu
Nhập a, b
While a khác b
5


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

IF a>b then thay a :=a -b
Else thay b:=b-a;
Kết thúc in ra USCLN (a,b) .
Cá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.
III- 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.
1. 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.

6


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

- 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ệ.
2. 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.
3. 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 rì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 vấ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.
4. 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 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
7


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

- 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 ( chương trình hoàn chỉnh)
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;
8


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

While I<=N do
Begin
s:=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
9


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

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
if 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.
IV- Chạy Thử , thay đổi, kiểm tra chương trình
1. 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.
10


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

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 aelse if awrite('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 t11



Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

if twrite('so lon nhat la ',t);
readln
End.
Nếu nhập:
Lần nhập
A
1
5
2
5
3
9
2. Phân loại lỗi và cách sửa lỗi

B
4
7
3

C
7
9
5

Kết quả
7
9

9

- 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
1
2

1
3

1
n

Ví dụ: viết chương trình tính tổng S= 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');
12



Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

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;
var
a,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.


13


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

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.
3. 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.
4. 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ươ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….

14


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

Vậ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.
Tóm lại: 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.
C- Kết thúc vấ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;
Vậy để giải quyết được bài toán trên máy tính điện tử sử dụng ngôn ngữ lập
trình pascal nói chung và của lớp 8 nói riêng. Để nâng cao chất lượng dạy học tin ở
15


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

các trường phổ thông thì 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.
Tóm lại đây là chương trình học khá mới mẻ, các bài toán đưa ra để xây
dựng một chương trình chưa có gì lạ phức tạp. Bởi có nhiều bài hay thì học sinh
lớp 8 chưa học đến. Cho nên giáo viên cần phải nắm chắc các phương pháp để
truyền đạt . Đồng thời cũng phối hợp chương trình toán đã học đến những phần
nào để từ đó đưa các ví dụ, bài tập để học sinh có thể nắm chắc lý thuyết cũng như
thực hành trên máy tính dễ tiếp thu Để từ đó các em rút ra được ưu điểm của các
chương trình này so với cách tính tay ở chỗ nào.
Bản thân tôi mong muốn góp một phần nhỏ bé của mình vào sự nghiệp giáo
dục. Bởi đây là môn học khá mới mẻ với tất cả các học sinh THCS . Tóm lại các
bước giải một bài toán cho lớp các bài toán trên máy vi tính của tôi đưa ra đang còn
nhiều thiếu sót . Mong nhận được sự góp ý của các thầy cô giáo cùng như bạn bè
để được hoàn thiện hơn./.

Tôi xin chân thành cảm ơn !
An Bình


, ngày 1 tháng12 năm

2010
Người viết

16


Trường THCS “Các bước giải một bài toán cho lớp bài toán trên máy vi tính”

17