Sáng kiến kinh nghiệm
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ề nghà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 xa 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 cha 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 cha có tính độc lập
sáng tạo mà phải nhờ vào giáo viên rất nhiều. Nhng 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 .
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.
1
Sáng kiến kinh nghiệm
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ế. Nhng 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 .
- 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, nhng 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:
2
Sáng kiến kinh nghiệm
+ 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
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
3
Sáng kiến kinh nghiệm
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
a=b đúng
sai
Đúng Sai
a<>b
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) .
Cách 4: Viết chơng trình hoàn chỉnh (dùng ngôn ngữ pascal)
PROGRAM USCLN;
4
Begin
a, b
UCLN là a
EN
D
b:= b - a
a:= b - a
Sáng kiến kinh nghiệm
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.
- 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à
5
Sáng kiến kinh nghiệm
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
- 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+ [S
0
]
Loại khỏi S các bội số của S
0
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;
6
Sáng kiến kinh nghiệm
repeat
while not (S0 in S) do
S0:=S0+1; NT:=NT+[S0];I:=S0;
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 nhng
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
7
Sáng kiến kinh nghiệm
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 cha 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
8
Sáng kiến kinh nghiệm
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;
if t<c then t:=c;
write('so lon nhat la ',t);
readln
End.
Nếu nhập:
Lần nhập A B C Kết quả
1
5 4 7 7
2
5 7 9 9
3
9 3 5 9
2. 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);
9
Sáng kiến kinh nghiệm
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;
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.
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 cha 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 lu ý:
- Nếu khởi đầu bằng bộ chơng trình(test ) nhỏ nhng các giá trị đặc biệt
(đây là dễ bị lỗi nhất).
10
Sáng kiến kinh nghiệm
- Làm nhiều các bộ test nhng 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 nhng cha 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 .
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à
11