Các bớc giải bài toán trong tin học Chu Thị Tú Anh
1
Phần
Phần Phần
Phần I
II
I:
::
:
mở đầu
mở đầumở đầu
mở đầu
A
AA
A-
- Lí do chọn đề tài
Lí do chọn đề tài Lí do chọn đề tài
Lí do chọn đề tài
Trong những năm gần đây, việc đào tạo về Công nghệ thông tin (CNTT) đ trở
thành nhu cầu ngày càng cấp thiết hơn đối với mọi ngời, từ nhân viên bán hàng, kỹ s,
bác sĩ và phóng viên đến nhà doanh nghiệp, cán bộ quản lí Phù hợp với xu thế phát triển
của x hội, tin học đ trở thành một môn học chính thức và đợc yêu thích ở nhà trờng.
Ngay từ trên ghế nhà trờng không ít học sinh đ quyết tâm học tập để trở thành chuyên
gia CNTT và một số em đ đạt thành tích cao tại các kỳ thi do tỉnh, quốc gia tổ chức.
Một trong những mục tiêu khi đa tin học vào trong nhà trờng là nhằm giúp cho
học sinh có khả năng phân tích, tổng hợp, trừu tợng hoá, khái quát vấn đề và đặc biệt là
phát huy t duy. Muốn vậy ngoài việc dạy đại trà tin học trong nhà trờng nhằm đảm bảo
tính phổ thông, hớng nghiệp và dạy nghề cần phải tạo điều kiện cho các học sinh có năng
khiếu tin học đợc phát triển về khả năng lập trình để giải quyết các bài toán. Để góp phần
vào việc phục vụ cho quá trình dạy và học tin học trong trờng PTDT Nội trú, trong
chuyên đề này tôi xin trình bày:
Các bớc
Các bớcCác bớc
Các bớc giải một bài toán trong tin học.
giải một bài toán trong tin học. giải một bài toán trong tin học.
giải một bài toán trong tin học.
Nội dung chuyên đề gồm 2 phần:
A- Tìm hiểu cấu trúc dữ liệu biểu diễn bài toán.
B- Các bớc để giải bài toán trong tin học.
B
BB
B-
- Phơng
Phơng Phơng
Phơng pháp nghiên cứu
pháp nghiên cứu pháp nghiên cứu
pháp nghiên cứu
Phơng pháp chủ yếu khi viết chuyên đề: Các bớc
Các bớc Các bớc
Các bớc giải bài toán trong tin
giải bài toán trong tin giải bài toán trong tin
giải bài toán trong tin
học
họchọc
học
là nghiên cứu Sách giáo khoa và một số tài liệu tham khảo, từ đó tổng hợp chắt lọc
các kiến thức và nội dung cần thiết để xây dựng chuyên đề.
C
CC
C-
- Đối tợng nghi
Đối tợng nghi Đối tợng nghi
Đối tợng nghiên cứu
ên cứuên cứu
ên cứu
Chuyên đề viết ra với mục đích phục vụ cho quá trình dạy và học tin học trong
trờng PTDT Nội trú nên nội dung ngắn gọn, dễ hiểu, không quá phức tạp. Học sinh có
thể tự nghiên cứu và hiểu đợc.
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
2
Phần 2
hần 2hần 2
hần 2: Nội dung
: Nội dung: Nội dung
: Nội dung
A
AA
A-
-
Tìm hiểu cấu trúc dữ liệu biểu diễn
Tìm hiểu cấu trúc dữ liệu biểu diễnTìm hiểu cấu trúc dữ liệu biểu diễn
Tìm hiểu cấu trúc dữ liệu biểu diễn bài toán
bài toán bài toán
bài toán
Các bài toán trong thực tế thờng có dữ liệu vào và kết quả ra thuộc những kiểu dữ
liệu quen biết nh: số nguyên, số thực, kí tự Khi cần lập trình cho những bài toán nh
vậy, ngời lập trình sử dụng các kiểu dữ liệu đó thờng gặp một số hạn chế nhất định, phụ
thuộc vào các yếu tố nh: dung lợng bộ nhớ, khả năng xử lí của CPU
Vì vậy, mỗi một ngôn ngữ lập trình thờng cung cấp một số kiểu dữ liệu chuẩn cho
biết phạm vi giá trị có thể l trữ, dung lợng bộ nhớ cần thiết để lu trữ và các phép toán
tác động lên dữ liệu.
Trong ngôn ngữ Pascal ta có sơ đồ các kiểu dữ liệu nh sau:
BOOLEAN
INTEGER
BASIC TYPE REAL
CHAR
SIMPLE TYPE
DATA TYPE USER DEFINED SUBRANGE
TYPE ENUMERATED
STRUCTURE
TYPE ARRAY
SET
RECORD
STRING
FILE
BOOLEAN: Kiểu logic chỉ có thể nhận một trong hai giá trị TRUE hoặc FALSE
INTEGER: Kiểu số nguyên (-32768 32767)
REAL: Kiểu số thực (2.9x10
-39
1.7x10
38
)
CHAR: Kiểu kí tự gồm 256 kí tự trong bộ m ASCII.
SUB_RANGE: Kiểu miền con của một kiểu sơ cấp
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
3
Ví dụ:
TYPE
CHU_HOA=A Z;
Chu_thuong=a z;
So_nguyen=0 200;
ENUMERATED: Kiểu liệt kê đợc định nghĩa bằng cách liệt kê tất cả các phần
tử có thể có.
Ví dụ:
TYPE
THU=(Chunhat, ThuHai, ThuBa, ThuTu, ThuNam, ThuSau, ThuBay);
Color=(Red, Blue, Green, White, Black);
ARRAY: Kiểu mảng gồm một tập hợp các phần tử cùng một kiểu dữ liệu cơ sở
đợc xác định bởi chỉ số.
Ví dụ:
TYPE
A=array[1 100] of integer;
B=array[1 100,1 100] of integer;
RECORD: Kiểu bản ghi gồm một tập hợp các phần tử thuộc các kiểu dữ liệu
khác nhau.
Ví dụ:
TYPE
Hocsinh=record
HoTen:string[20];
Lop:1 12;
DiemTB:real;
Ketqua:Boolean;
End;
SET: Kiểu tập hợp gồm một số các đối tợng có cùng kiểu cơ sở.
Ví dụ:
TYPE
Chucai= SET OF Char;
Chuso= SET OF 0 9;
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
4
STRING: Kiểu xâu gồm một dy các kí tự.
Ví dụ:
TYPE
TRUONG: STRING[50];
HOTEN:STRING;
FILE: Kiểu tệp gồm một tập hợp các dữ liệu có liên quan với nhau và có cùng
kiểu đợc nhóm lại thành một dy và đợc lu trữ trên bộ nhớ nhớ ngoài.
Ví dụ:
TYPE
Tep=FILE of integer;
Bai=text;
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
5
B
BB
B-
- Các bớc để giải bài toán trong tin học:
Các bớc để giải bài toán trong tin học: Các bớc để giải bài toán trong tin học:
Các bớc để giải bài toán trong tin học:
I_ Bớc 1: Xác định bài toán:
1- Khái niệm bài toán:
Trong quá trình tồn tại và phát triển, mọi cá nhân luôn phải liên tục giải quyết các
bài toán. 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.
Theo nhiều nhà nghiên cứu thì mọi bài toán đều có thể diến đạt theo một sơ đồ
chung:
A B
Trong đó:
+ A: là giả thiết, điều kiện ban đầu hoặc là cái đ cho, cái đ có khi bắt đầu giải bài
toán.
+ B: là kết luận, mục tiêu cần đạt đợc hoặc là 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 hoặc là một chuỗi các thao tác
cần thực hiện, cần thi hành để từ những cái đ có A có đợc cái phải tìm B.
2- Xác định bài toán:
Theo sơ đồ trên thì xác định bài toán có nghĩa là xác định A, B và nếu có thể đợc
thì xác định luôn các thao tác đợc phép sử dụng để đi từ A đến B.
3- Bài toán trong tin học:
Một bài toán trên máy tính cũng mang đầy đủ các tính chất của một bài toán tổng
quát đ nói ở trên nhng có thể đợc diễn dạt theo môt cách nói khác.
* A: là input hay còn gọi là thông tin vào.
* B: là output hay còn gọi là thông tin ra.
* là chơng trình tạo ra từ các lệnh cơ bản của máy cho phép biến đổi từ
A thành B.
4- Những khó khăn:
Để xác định một bài toán trên máy tính ta thờng gặp những khó khăn sau:
- Thông báo về A hay B không đầy đủ và không rõ ràng.
- Thông báo về các điều kiện đặt ra cho cách giải thờng không đợc nêu ra một
cách minh bạch.
5- Một số ví dụ:
Ví dụ 1: Tìm ớc chung lớn nhất của hai số nguyên dơng M và N.
Input: hai số nguyên dơng M và N.
Output: Ước chung lớn nhất của M và N.
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
6
Ví dụ 2: Bài toán tìm kiếm nhị phân:
Cho dy A tăng gồm N số nguyên khác nhau a
1
, a
2
, a
N
và một số nguyên k cho
trớc. Cần biết có hay không chỉ số i (1<=i<=N) mà a
i
= k. Nếu có hy cho biết chỉ số đó.
Input: Dy A là dy tăng gồm N số nguyên khác nhau a
1
, a
2
, a
N
, số nguyên k.
Output: Chỉ số i mà a
i
= k hoặc thông báo không có số hạng nào của dy A có giá
trị bằng k.
Ví dụ 3: Bài toán 8 quân hậu:
Hy tìm các cách đặt 8 quân hậu trên một bàn cờ vua sao cho không có quân hậu
nào có thể ăn quân hậu nào.
Input:
- Một bàn cờ một bảng hình vuông gồm 8 hàng và 8 cột.
- Quân hậu là quân có thể ăn đợc bất kì quân nào nằm trên cùng một hàng, cùng
một cột hay cùng một đờng chéo.
- Ta có tất cả 8 quân hậu.
Output: Các bảng vuông trên đó đ có đánh dấu vị trí của 8 quân hậu sao cho
không có quân hậu nào có thể ăn quân hậu nào khác, nghĩa là trên mỗi hàng, mỗi cột, mỗi
đờng chéo chỉ có thể có một quân hậu.
6- Một số nhận xét:
- Việc xác định bài toán là rất quan trọng nó ảnh hởng rất lớn đến đến cách thức và
chất lợng của việc giải quyết bài toán.
- Một bài toán cho dù đợc diễn đạt bằng thông báo chính xác đến đâu đi chăng nữa
thì phần lớn thông tin về A và B là tiềm ẩn trong đầu ngời giải. Thông báo về A hoặc B
chỉ là biểu tợng gợi nhớ tới các thông tin tiềm ẩn đó.
- Bớc đầu tiên để xác định một bài toán là phải phát biểu lại bài toán một cách
chính xác theo ngôn ngữ riêng của mình vì đó chính là cách tiếp cận bài toán, hiểu bài
toán.
- Bớc kế tiếp là tìm hiểu các thông tin Input A và thông tin Output B, tìm các mối
liên giữa chúng.
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
7
II_ Bớc 2: Chọn cấu trúc dữ liệu để biểu diễn bài toán:
1- Một số lu ý khi chọn cấu trúc dữ liệu:
- Cấu trúc dữ liệu phải biểu diễn đợc đấy đủ các thông tin nhập và xuất của bài
toán.
- Cấu trúc dữ liệu phải phù hợp với thao tác của thuật toán mà ta lựa chọn để giải
quyết bài toán.
- Cấu trúc dữ liệu phải phù hợp với điều kiện cho phép của ngôn ngữ lập trình và
MTĐT đang đợc sử dụng.
2- Một số ví dụ:
Ví dụ 1: Tìm ớc chung lớn nhất của hai số nguyên dơng M và N.
M, N là các số nguyên dơng nên cấu trúc dữ liệu nguyên dơng là hợp lý. Có thể
sử dụng dữ liệu kiểu INTEGER.
Ví dụ 2: Bài toán tìm kiếm nhị phân:
Để biểu diễn dy gồm N số nguyên thì cấu trúc dữ liệu ở đây sử dụng mảng một
chiều là hợp lí. Cụ thể là sử dụng một mảng gồm có N số nguyên (kiểu Integer).
Ví dụ 3: Bài toán quản lí học sinh của một lớp:
Thông tin về một học sinh bao gồm: Họ tên, Ngày sinh, Điểm Toán, văn, ngoại
ngữ, lí, hoá, sinh, sử ,địa, TD, GDCD, Xếp loại. Đa ra kết quả xếp loại của từng học sinh
trong một lớp.
Để biểu diễn thông tin về một học sinh ta sử dụng một bản ghi (RECORD) để biểu
diễn.
Type HS = record
HoTen:string[20];
NgaySinh:string[10];
Toan, Van, NN, Sinh, Su, Dia, GDCD, TD:real;
DiemTB:real;
XepLoai:char;
End;
Để biểu diễn số học sinh trong một lớp ta sử dụng mảng (ARRAY):
Var LopA: array[1 Nmax] of HS;
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
8
3_ Bớc 3: Tìm thuật toán:
Tìm thuật toán là bớc quan trọng nhất để giải quyết một bài toán. Mỗi thuật toán
chỉ có thể giải đợc một bài toán nhng một bài toán có thể có nhiều thuật toán khác
nhau.
Khi thiết kế thuật toán hoặc lựa chọn thuật toán ngời ta thờng quan tâm đến các
tài nguyên nh: thời gian thực hiện, số lợng ô nhớ
Ví dụ: với bài toán tìm kiếm nhị phân, dy đ cho là dy đ đợc sắp xếp nên thuật
toán tìm kiếm nhị phân (sẽ trình bày ở dới đây) cần ít thao tác hơn nhiều so với thuật
toán tìm kiếm tuần tự.
Ví dụ 1: Tìm ớc chung lớn nhất cua hai số nguyên dơng M và N.
Ta có thuật toán Euclide đợc diễn tả bằng lu đồ nh sau:
ƯCLN là M
M>N
M<>N
M:=M
-
N
end
Begin
Nhập M, N
M:=M+N
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
9
Ví dụ 2: Bài toán tìm kiếm nhị phân:
Ta có thuật toán tìm kiếm nhị phân nh sau:
Nh
ậ
p N v
à
a
1
, a
2
a
N
Dau<
-
1;Cuoi<
-
N
Giua:=[(Dau+Cuoi)/2]
A
giua
=k?
Đ
a ra giua rồi
kết thúc
Đúng
A
giua
<k
?
Đúng
Dau<
-
giua+1
Cuoi<
-
Giua
-
1
Sai
Dau>Cuoi
Đúng
Sai
Sai
TB không có phần tử
bằng k
rồi kết thúc
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
10
IV_ Bớc 4: Lập trình:
1- Khái niệm:
Lập trình là dùng ngôn ngữ máy tính cụ thể nào đó (ví dụ Pascal) để diễn tả thuật
toán, cấu trúc dữ liệu thành các câu lệnh để máy tính có thể thc hiện đợc và giải quyết
đúng bài toán mà ngời lập trình mong muốn.
2- Kĩ năng lập trình:
- Kĩ năng lập trình là 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 cụ thể.
- Đ gọi là kĩ năng thì chỉ có thể có đợc thông qua việc tèn luyện tích cực.
- Kinh nghiệm cho thấy một thuật toán hay nhng việc cài đặt lộn xộn, vụng về khi
chạy trên máy tính có thể cho kết quả rất tồi tệ.
3- Phát triển chơng tình bằng cách tinh chế từng bớc:
Tinh chế từng bớc 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ừ đó viết thành chơng trình.
Muốn lập trình không phải chỉ nắm vững ngôn ngữ lập trình là đủ, vấn đề cốt yếu
là biết phát triển dần dần để chuyển các ý tởng thành chơng trình hoàn chỉnh.
4- Phơng pháp tinh chế từng bớc:
Ban đầu chơng trình đợc viết bằng những lời tự nhiên (ngôn ngữ tiếng Việt
chẳng hạn).
- ở từng bớc sau, mỗi câu lời đợc phân tích ra chi tiết hơn bằng nhiều câu lời
khác tơng ứng với sự phân tích một công việc thành những công việc nhỏ hơn. Mỗi câu
lời đó là một sự đặc tả công việc.
- Càng ở những bớc sau các lời tự nhiên đợc thay thế bằng câu lời trong ngôn
ngữ lập trình
- Phơng pháp tinh chế từng bớc là một thể hiện của sự t duy, giải quyết vấn đề
từ trên xuống trong đó sự phát triển của các bớc là hớng về phía ngôn ngữ lập trình
đang đợc sử dụng.
4- Các ví dụ:
Ví dụ 1: Bài toán tìm ớc chung lớn nhất của hai số nguyên dơng M, N.
Theo thuật toán Euclid đ trình bày ở trên ta tinh chế chơng trình nh sau:
* Tinh chế lần 1:
Bắt đầu
Nhập M, N. Lu M vào a, lu N vào b. (Lu lại giá trị cho M và N)
Chừng nào M khác N thì
Nếu M>N thì thay thế M bởi M-N
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
11
Ngợc lại thay thế N bởi N-M.
Xuất ƯCLN của M, N là M.
Kết thúc.
* Ting chế lần 2:
Bắt đầu;
Nhập M, N; a<-M; b<-N;
While M<>N do
IF M>N then M<-M-N
Else N<-N-M;
In ra UCLN của M và N là M;
Kết thúc.
Chơng trình có thể viết hoàn chỉnh nh sau:
Program UCLN;
Var M,N,a,b: integer;
Begin
Write( Moi ban nhap gia tri M, N); readln(M,N);
a:=M; b:=N;
While M<>N do
If M>N then M:=M-N
Else N:=N-M:
Writeln(ƯCLN của ,a,,,b, la:,M);
Readln
End.
Ví dụ 2: Bài toán tìm kiếm nhị phân:
Tinh chế lần 1: ý tởng của thuật toán
Sử dụng tính chất dy A là dy tăng, ta thu hẹp nhanh phạm vi tìm kiếm sau mỗi
lần so sánh khoá với số hạng đợc chọn. Để làm điều đó là chọn số hạng a
giua
ở giữa dy
để so sánh với k, trong đó giua=
+
2
1N
.
Khi đó chỉ xảy ra một trong 3 trờng hợp:
+ Nếu a
giua
= k thì đa ra chỉ số giua cần tìm. Việc tìm kiếm kết thúc.
+ Nếu a
giua
> k thì do A là dy đ sắp xếp tăng nên việc tìm kiếm tiếp theo sẽ thực
hiện trên dy a
1
, a
2
, a
giua-1
.
+ Nếu a
giua
< k thì việc tìm kiếm sẽ đợc thực hiện trên dy số a
giua+
, a
N
.
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
12
Quá trình sẽ đợc lặp lại một số lần cho đến khi hoặc đ tìm thấy khoá k trong dy
A hoặc phạm vi tìm kiếm bằng rỗng.
* Tinh chế lần 2:
Bắt đầu.
B1- Nhập dữ liệu
B2- Dau<-1; Cuoi<-N;
B3- Kiểm tra điều kiện: Dau > Cuoi ?
B3.1: Nếu Dau< Cuoi thì :
B4- giua=
+
2
CuoiDau
.
B5- Nếu a
giua
= k thì thông báo chỉ số giua rồi kêt thúc.
B6- Nếu a
giua
> k thì đặt Cuoi<-giua-1 rồi quay lại B3
B7- Nếu a
giua
< k thì đặt Dau<-giua+1 rồi quay lại B3
B3.2: Nếu Dau > Cuoi thì thông báo dy A không có số hạng nào có giá trị
bằng k rồi kết thúc.
* Tinh chế lần 3:
Bắt đầu.
B1- Nhập dữ liệu: N, các số hạng của dy: a
1
, a
2
, a
N
.
B2- Dau<-1; Cuoi<-N;
B3- While Dau < Cuoi và cha tìm thấy k thì
1. Tính - giua=
+
2
CuoiDau
.
2. IF A
giua
= k then thông báo Tìm thấy k
Ngợc lại If A
giua
> k then Cuoi<-giua-1
Ngợc lại Dau<-giua+1
B4- Nếu không tìm thấy k (tức Dau>Cuoi) thì thông báo không có số hạng nào của
dy bằng k.
* Chơng trinh hoàn chỉnh:
Program TKNP;
Uses crt;
Const Nmax=250;
Type Arrint=Array[1 Nmax] of integer;
Var N,i,k,Dau,Cuoi,giua:integer;
A:Arrint;
Timthay:boolean;
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
13
BEGIN
Clrscr;
Write(Nhap so phan tu cua day so N=); readln(N);
Writeln(Nhap cac phan tu cua day so tang:);
For i:=1 to N do
Begin
Write(PT thu ,i, la:); readln(A[i]);
End;
Write(Nhap k=); readln(k);
Dau:=1; Cuoi:=N; Timthay:=false;
While (Dau< Cuoi) and not(Timthay) do
Begin
Giua:=(Dau+Cuoi) mod 2;
If A[giua] = k then Timthay:=true
Else if A[giua]>k then Cuoi:=giua-1
Else Dau:=giua+1;
End;
If Timthay then writeln(Chi so tim duoc la:,giua)
Else writeln(Khong tim thay!);
Readln
END.
V-bớc 5: Hiệu chỉnh:
Sau khi đợc viết xong, chơng trình vẫn còn có thể có nhiều lỗi khác cha phát
hiện đợc nên có thể không cho kết quả đúng. Vì vậy, cần phải chạy thử chơng trình với
một số bộ Input tiêu biểu phụ thuộc vào đặc thù của bài toán và bằng cách nào đó ta đ
biết trớc Output. Các bộ Input và Output tơng ứng này đợc gọi là các Test. Nếu có sai
sót ta phải sửa chơng trình và thử lại.
Ví dụ 1: Với thuật toán tìm kiếm nhị phân ta có thể Test chơng trình với các bộ
test tơng ứng với kết quả là tìm thấy hoặc không tìm thấy.
Ví dụ 2: Với bài toán giải phơng trình bậc hai: Ta có thẻ Test chơng trình với các
bộ test tơng ứng với kết quả của bài toán là: Vô nghiệm (Delta<0), Có nghiệm kép
(Delta=0), Có hai nghiệm phân biệt (Delta>0).
Các bớc giải bài toán trong tin học Chu Thị Tú Anh
14
Kết luận
Kết luậnKết luận
Kết luận
Quá trình xây dựng chơng trình là một chuỗi các bớc tinh tế. ở mỗi bớc, một
công việc đợc phân ra làm nhiều công việc con, ta sẽ làm mịn dần các công việc đó và
càng ở các bớc sau ta sẽ hớng công việc về ngôn ngữ lập trình mà ta đang sử dụng.
Ngời lập trình muốn có kĩ năng xây dựng và phát triển chơng trình tốt phải trải
qua quá trình rèn luyện, tìm tòi và nghiên cứu.
Trên đây là chuyên đề Các bớc giải một bài toán trong tin học giúp cho các bạn
yêu thích lập trình có thể xem nh một tài liệu tham khảo, khai thác thêm thông tin về
cách giải quyết một bài toán trong tin học.
Do hạn chế về thời gian và kinh nghiệm, chuyên đề có thể còn nhiều sai sót, rất
mong nhận đợc sự đóng góp ý kiến của các bạn.
Xin chân thành cảm ơn!
Ngời viết chuyên đề
Chu Thị Tú Anh