Bài toán
Tìm ước số chung lớn nhất (ƯCLN) của hai số
nguyên dương M và N.
Với các giá trị:
M = 5;
N = 5.
UCLN(M,N) = 5
M = 8;
N = 6.
UCLN(M,N) = 2
M = 13;
N = 17.
UCLN(M,N) = 1
UCLN(M,N) = 2
M = 2006; N = 2018.
1. Hãy chỉ ra những ưu điểm của việc giải bài
toán bằng máy tính so với cách giải toán thông
thường?
2. Giải bài toán trên máy tính có những bước nào ?
Các bước thực hiện
Bước 1: Xác định bài toán;
Bước 2: Lựa chọn hoặc thiết kế
thuật toán;
Bước 3: Viết chương trình;
Bước 4: Hiệu chỉnh
Bước 5: Viết tài liệu
Ví dụ: Xét bài toán
Tìm ước chung lớn nhất (ƯCLN) của hai số nguyên
dương M và N
Hãy xác định Input và Output của bài toán trên?
Ví dụ 2:
Cho dãy số A: 2
Tìm số k = 6.
3
6
9
30
100
1. Đây là dạng bài toán nào? Có
những thuật toán nào để giải? Em
chọn thuật toán nào? Vì sao?
2. Khi lựa chọn hoặc thiết kế thuật
toán cần đảm bảo các tiêu chuẩn
nào?
BÀI TOÁN
Cóthể
có nhiều
cách giải
(thuật toán)
Cách 1
Cách 2
Cách 3
...
KẾT QUẢ
2/ Lựa chọn hoặc thiết kế thuật toán
a/ Lựa chọn thuật toán :
- Một thuật toán chỉ giải được một bài toán, nhưng một bài toán có thể có nhiều
thuật toán để giải. Vì vậy ta phải chọn thuật toán tối ưu trong các thuật toán đã
có.
- Một thuật toán tối ưu phải có các tiêu chuẩn sau :
Thời gian thực hiện nhanh.
Ít tốn dung lượng bộ nhớ.
Ít phức tạp (trình bày dễ hiểu, dễ nhìn).
Ví dụ 1:Tìm ước chung lớn nhất của hai số nguyên dương
M, N.
Ý tưởng: ta có 2 ý tưởng sau
• Nếu M=N thì giá trị chung là
UCLN
• Chia M cho N lấy dư là
R
• Nếu M>N thì
UCLN(M,N)=UCLN(M-N,N)
• Nếu R=0 thì
UCLN(M,N)=N
• Nếu M
UCLN(M,N)=UCLN(M,N-M)
• Nếu R khác 0 thì gán N
cho M, gán R cho N
• Tiếp tục chia M cho N.
Thuật toán :
* Diễn tả thuật toán bằng cách liệt kê :
B1:Nhập M,N
B1: Nhập M, N
B2: Nếu M=N thì giá trị
chung là UCLN rồi kết thúc
B2: Chia M cho N lấy
dư là R
B3:Nếu M>N thì
B3: Nếu R=0 thì
UCLN(M,N)=N rồi kết
thúc
M M-N, chuyển sang B2
B4: N
B2
N-M, chuyển sang
B4: M N , N
chuyển sang B2
R,
* Diễn tả thuật toán bằng sơ đồ khối:
Nhập M,N
Nhập M,N
Đ
M=N
S
Đ
M>N
S
N
Đưa ra M và
KT
Chia M cho N
lấy dư R
Đ
R=0
M
M-N
S
M
N
N-M
1
Đưa ra N và
KT
N
R
2
Nên lựa chọn cách giải (thuật toán) nào để viết chương
trình?
Với M=3, N=100
Nhập M,N
Đ
M=N
S
M>N
S
N
N-M
Đ
Đưa ra M và
KT
M
M-N
Lần
M
N
1
3
100
2
3
97
3
3
…
…
94
…
34
3
1
35
2
1
36
1
1
KQ
UCLN(3,100)=1
Với M=3, N=100
Nhập M,N
Chia M cho N
lấy dư R
Đ
R=0
S
M
N
N
R
Đưa ra N và
KT
Lần
M
N
R
1
3
100
3
2
100
3
1
3
3
1
0
KQ
UCLN(3,100)=1
Số
lần
thực
hiện
Thuật toán 1 và
giá trị tương
ứng của (M,N)
Thuật toán 2 và
giá trị tương ứng
của (M,N)
1
2
3
4
3,100
3,97
3,94
3,91
3,100
100,3
3,1
Kết luận: ƯCLN =
1
…
34
35
36
…
3,1
2,1
1,1
3/ Viết chương trình
Là lựa chọn cách tổ chức dữ liệu và lựa
chọn ngôn ngữ lập trình (NNLT) phù hợp
với thuật toán.
Có nhiều loại NNLT, vì vậy khi viết
chương trình trong ngôn ngữ nào thì phải
tuân theo những quy định đó.
Program TimUCLN;
Var M, N, R:integer;
Begin
Write(‘Nhap vao M,N’);
Read(M,N);
Program TimUCLN;
Var M, N, R:integer;
Begin
Write(‘Nhap vao M,N’);
Read(M,N);
While N<> 0 do
While M<>N do
Begin
IF M>N THEN
R:=M mod N;
M:=M-N
M:=N; N:=R;
ELSE
N:=N-M;
Write(‘ uoc chung lon nhat
la:’, M);
End.
end;
Write(‘ uoc chung lon nhat la:’, M);
End.
4/ Hiệu chỉnh
?Khi ta giải một bài toán có phải lúc nào kết quả cũng
đúng
không?
Tại sao
cầnđược
phải có
bước
chỉnh?
Khái
niệm:
Chương
trình
kiểm
trahiệu
bằng
cáchThế
cho
nàothử
là hiệu
chạy
trên chỉnh?
những bộ Input mà người ta đã biết trước
Output. Các bộ Input-Output này gọi là các Test. Nếu
có sai sót người lập trình sửa chương trình rồi thử lại.
Quá trình này được gọi là hiệu chỉnh.
Ghép nối mỗi mục ở cột bên trái với mục ở cột bên phải
để thể hiện nội dung tương ứng của từng bước giải bài
toán trên máy tính.
1. Xác định bài
toán
a) Lựa chọn cách tổ chức dữ liệu và ngôn
ngữ lập trình để diễn đạt thuật toán.
2. Lựa chọn hoặc b) Thực hiện chương trình với 1 số bộ
thiết kế thuật toán Input để kiểm tra kết quả.
3. Viết chương
trình
c) Xác định Input và Output.
4. Hiệu chỉnh
d) Mô tả bài toán, thuật toán, thiết kế
chương trình, kết quả thử nghiệm và
hướng dẫn sử dụng.
5. Viết tài liệu
e) Lựa chọn thuật toán có thời gian thực
hiện nhanh nhất, tốn ít dung lượng bộ nhớ
và ít phức tạp nhất.
1. Xác định bài
toán
a) Lựa chọn cách tổ chức dữ liệu và ngôn
ngữ lập trình để diễn đạt thuật toán.
2. Lựa chọn hoặc b) Thực hiện chương trình với 1 số bộ
thiết kế thuật toán Input để kiểm tra kết quả.
3. Viết chương
trình
c) Xác định Input và Output.
4. Hiệu chỉnh
d) Mô tả bài toán, thuật toán, thiết kế
chương trình, kết quả thử nghiệm và
hướng dẫn sử dụng.
5. Viết tài liệu
e) Lựa chọn thuật toán có thời gian thực
hiện nhanh nhất, tốn ít dung lượng bộ nhớ
và ít phức tạp nhất.
Bài tập 3:
Bài toán: viết thuật toán giải pt bậc nhất ax+b=0 và sử dụng vài bộ
Input để kiểm chứng tính đúng đắn của chương trình.
Xác định bài toán :
- Input : các hệ số a,b
- Output : các kết luận về nghiệm của pt.
Ý tưởng : nghiệm của bài toán phụ thuộc vào các số a và b như
sau:
-Nếu a=0 :
+Nếu b=0 :kết luận pt có vô số nghiệm;
+Nếu b≠ 0 : kết luận pt vô nghiệm;
-Nếu a ≠ 0 : kết luận pt có một nghiệm x = -b/a.
•Thuật toán :
- Sơ đồ khối
Nhập a và b
a=0?
Đ
b=0?
Đ
Pt vsn rồi
kết thúc
S
S
nghiệm x=-b/a
rồi kết thúc
Pt vn rồi
kết thúc
Giải pt: 8x+96=0
Pt có nghiệm :x=-12