Bài giảng Tin học đại cương: Chương 7 - Bài toán và thuật toán được biên soạn nhằm cung cấp cho các bạn những kiễn thức về khái niệm vấn đề và bài toán; thuật toán và các phương pháp biểu diễn thuật toán; các bước để giải một bài toán trên máy tính; chuyển đổi bài toán thành chương trình máy tính.
Trang 1Tin học đại cương
Introduction to Information Technology
Nhóm biên soạn HP Tin Học Đại Cương
Khoa Công Nghệ Thông Tin Trường ĐHSP TP Hồ Chí Minh
Bộ môn Kĩ Thuật Dạy Học
Trang 2Chương 7: Bài toán và thuật toán
Trang 3Giới thiệu
Trong xu hướng phát triển của xã hội, công nghệ thông tin ngày càng đóng một vai trò rất quan trong giúp mọi người
có thể hoàn thành công việc của mình trở nên nhanh
chóng, hiệu quả và dễ dàng hơn thông qua các chương
trình ứng dụng trên máy tính Thuật toán và thuật giải lànền tảng để những lập trình viên có thể xây dựng nhữngchương trình ứng dụng phù hợp
Đó cũng chính là mục tiêu của chương này nhằm cung
cấp các khái niệm ban đâu về bài toán và thuật toán
Đông thời đưa ra qui trình cơ bản để giải quyết 1 bài toántrên máy tính như thế nào?
3 Bản quyền: Khoa CNTT 2011
Trang 4Nội dung chính
Chương 7: Bài toán và thuật toán
Khái niệm vấn đề và bài toán.
Thuật toán và các phương pháp biểu diễn thuật
toán.
Các bước để giải một bài toán trên máy tính.
Chuyển đổi bài toán thành chương trình máy tính.
Trang 5Khái niệm vấn đề
Vấn đề thường được dùng với nghĩa rộng hơn bài toán,
bài toán là vấn đề mà để giải quyết nó phải liên quan ítnhiều đến tính toán
Pitago chia mọi vấn đề mà con người cần giải quyếtthành hai loại:
Theorema : vấn đề cần khẳng định tính đúng – sai
Problema: vấn đề cần tìm giải pháp để để đạt được mục tiêu từ những điều kiện ban đầu nào đó
5 Bản quyền: Khoa CNTT 2011
Trang 7Ví dụ về vấn đề - bài toán
1 Bài toán kiểm tra tính nguyên tố
Điều kiện ban đầu: Số nguyên dương N
Mục tiêu cần đạt: N có là số nguyên tố hay không?
2 Bài toán quản lý hồ sơ sinh viên
Điều kiện ban đầu: Hồ sơ gốc của các sinh viên trong
trường
Mục tiêu cần đạt: Bảng thống kê, phân loại sinh viên theo kết quả học tập
7 Bản quyền: Khoa CNTT 2011
Trang 8Bài toán trong tin học?
Trong thực tế, không phải vấn đề nào cũng có thể là những bài
toán có tính toán (bài toán của toán học).
Ví dụ:
Làm sao giao dịch ngân hàng tự động không cần nhân viên
Làm sao để con người nói chuyện được với nhau mà không cần phải gặp mặt nhau.
Làm sao để xếp loại học sinh của trường học có 3000 học sinh
một cách nhanh chóng
Tất cả là bài toán trong tin học
Là vấn đề mà ta muốn máy tính thực hiện để từ dữ liệu vào (Input) tanhân được dữ liệu – thông tin ra cần thiết (output)
Trang 9Ví dụ bài toán trong tin học
1 Bài toán tìm ước chung lớn nhất của hai số nguyên
dương M,N
Input: Hai số nguyên M,N
Output: ƯCLN
2 Bài toán xếp thời khóa biểu cho trường học
Input: Tên giáo viên, môn dạy
Output: TKB của trường
3 Bài toán tìm điểm thi đại học của thí sinh
Input: Số báo danh
Output: Điểm thi
9 Bản quyền: Khoa CNTT 2011
Trang 10Giải bài toán trên máy tính
nhƣ thế nào?
Output Input
Bài toán
Bằng cách nào ?
Giải bài toán
Hướng dẫn các thao tác cho máy thực hiện
Thuật toán
Trang 11Thuật toán là gì?
Từ thuật toán (Algorithm) xuất phát từ tên
một nhà toán học người Trung Á là
Muhammad ibn Musa al-Khwarizmi,
thường gọi là al’Khwarizmi Ông là tác giả
một cuốn sách về số học, trong đó ông đã
dùng phương pháp mô tả rất rõ ràng, mạch lạc
cách giải những bài toán Sau này, phương
pháp mô tả cách giải toán của ông đã được
xem là một chuẩn mực và được nhiều nhà toán
học khác tuân theo Từ algorithm ra đời dựa
theo cách phiên âm tên của ông
Muḥammad ibn Mūsā Khwārizmī (Arabic: نب دمحم
al-يمزراوخلا ىسوم ) was a Persian mathematician, astronomer, astrologer and geographer He was born around 780, in either Khwarizm or Baghdad, and died around 850
(Trích từ Wikipedia)
11 Bản quyền: Khoa CNTT 2011
Trang 12Khái niệm thuật toán
Thuật toán là khái niệm cơ sở của toán học và tin học
Thuật toán là một dãy các chỉ thị rõ ràng và có thể thi hành được để hướng dẫn thực hiện hành động nhằmđạt được mục tiêu đặt ra
Thuật toán là sự thể hiện của một phương pháp để giảiquyết vấn đề
Trang 13 Nghiên cứu thuật toán là một trong những vấn đề quantrọng của tin học
Lý thuyết về thuật toán giải quyết một số vấn đề sau:
Những bài toán nào giải đƣợc bằng thuật toán, những bài toán nào không giải đƣợc bằng thuật toán
Tìm thuật toán tốt nhất, tối ƣu
Triển khai thuật toán trên máy tính
13 Bản quyền: Khoa CNTT 2011
Trang 14Đặc trưng của thuật toán
Nhập (input) Các thuật toán thường có giá trị đầu vào
Xuất (output) Từ giá trị vào thuật toán cho ra kết quả
Tính xác định(definiteness) Các bước trong thuật toánphải chính xác rõ ràng
Tính hữu hạn(finiteness). Thuật toán phải cho ra lời giải(hay kết quả) sau một số bước hữu hạn
Tính hiệu quả(Effectiveness) Tính hiệu quả được đánhgiá dựa trên một số tiêu chuẩn như khối lượng tínhtoán, không gian và thời gian sử dụng (khi thực hiệnthuật toán trên máy tính)
Tính tổng quát(Generalliness) Thuật toán phải áp dụngđược cho tất cả các bài toán cùng dạng, chứ không chỉ
áp dụng được cho một số trường hợp riêng lẻ nào đó
Trang 15Ví dụ về thuật toán giải
rồi qua bước 5
Bước 3 : Gán cho x giá trị -b/a, rồi qua bước 4
Bước 4: Xuất ra giá trị x rồi qua bước 5
Bước 5 : Kết thúc Bản quyền: Khoa CNTT 2011 15
Trang 16Cấu trúc cơ bản của thuật toán
Tuần tự: thực hiện hết lệnh này đến lệnh khác
Rẽ nhánh: tùy theo dữ liệu đầu vào mà ta quyết định
thực hiện câu lệnh gì tiếp theo
Lặp: thực hiện lại nhiều lần một số câu lệnh nào đó
cho đến khi điều kiện không còn thỏa mãn nữa
Trang 18Biểu diễn thuật toán bằng
phương pháp ngôn ngữ tự nhiên
Liệt kê các thao tác, các chỉ thị bằng ngôn ngữ tự nhiên
Ví dụ: Có 43 que diêm Hai người chơi luân phiên bốcdiêm Mỗi lượt, mỗi người bốc từ 1 đến 3 que diêm.Người nào bốc cuối cùng sẽ thắng cuộc
Giải thuật để người đi trước luôn thắng cuộc được diễn
tả bằng cách liệt kê từng bước như sau:
Bước 1: Bốc 3 que rồi đợi đối phương đi
Bước 2: Đối phương bốc (giả sử x que, 0<x<4)
Bước 3: Đến lượt người đi trước bốc a = (4-x) que.
Nếu còn diêm thì quay lại Bước 2
Ngược lại qua bước 4
Bước 4:Tuyên bố thắng cuộc. Kết thúc
Trang 19Biễu diễn thuật toán bằng
phương pháp lưu đồ (lowchart)
Là một phương tiện hình học giúp ta diễn tả giải thuậtmột cách trực quan
Được tạo bởi các kiểu khối cơ bản, nối với nhau bằngcác đường có hướng
Thuật ngữ tiếng Anh là Flow Chart
19 Bản quyền: Khoa CNTT 2011
Trang 20Các ký hiệu cơ bản trong
phương pháp lưu đồ
bắt đầu kết thúc
chương
điều kiện
nhập hoặc xuất thao tác
Trang 21Bản quyền: Khoa CNTT 2011
Trang 22Biểu diễn thuật toán bằng
phương pháp mã giả (pseudo code)
Ngoài việc sử dụng ngôn ngữ tự nhiên và lưu đồ để
biểu diễn thuật toán, người ta còn sử dụng ngôn ngữtựa pascal, c, … được gọi là mã giả
Trong mã giả ta sử dụng cả cấu trúc của ngôn ngữ lập
trình và ngôn ngữ tự nhiên
Trang 24Các bước giải
1 bài toán trên máy tính
Bước 1: Xác định vấn đề - bài toán
Bước 2: Lựa chọn phương pháp giải
Bước 3: Xây dựng thuật toán hoặc thuật giải
Trang 25Các bước để thiết kế thuật toán
Bước 1: Xác định vấn đề bài toán (input, output)
Bước 2: Hình thành ý tưởng chính để để xây dựng thuậttoán (bài toán giải bằng cách nào? Thuật toán sẽ dừngkhi nào?)
Bước 3: Xây dựng thuật toán (ngôn ngữ tự nhiên, lưu
đồ, mã giả)
Bước 4: Mô phỏng để kiểm tra tính đúng đắn của thuậttoán (chạy thử bằng tay)
25 Bản quyền: Khoa CNTT 2011
Trang 26ví dụ 1: Kiểm tra một số nguyên a là số
Trang 27Ví dụ 1: …(tt)
Xây dụng thuật toán
Cách 1: Dùng ngôn ngữ tự nhiên
Bước 1: Nhập a Bước 2: Nếu a chia hết cho 2 thì xuất a chẵn
Ngược lại thì xuất a lẻ Qua bước 3 Bước 3: Kết thúc
Trang 28Ví dụ 2: Tìm số lớn nhất trong dãy số
Xác định vấn đề - bài toán:
Input: Số nguyên dương N và dãy N số nguyên
a1, a2, …, aN (ai với i : 1 N).
Output : Số lớn nhất (Max) của dãy số.
Lựa chọn phương pháp giải:
Đặt giá trị Max a1.
Cho i chạy từ 2 đến N, so sánh giá trị ai với giá trị Max, nếu ai > Max thì Max nhận giá trị mới là ai.
Max là giá trị lớn nhất cần tìm
Trang 29Tìm ra quả lớn nhất rồi!
MAX
Ồ! Quả này lớn hơn
Mô phỏng ý tưởng
29
Trang 30Xây dựng thuật toán
Bước 4: Nếu ai > Max thì Max ai;
Bước 5: i i+1 rồi quay lại B3
Cách 2: Dùng lưu đồ
B1 B2
Max ai
Đ S
S Đ
Trang 31Mô phỏng thuật toán
Nhập n=7
Nhập dãy A có 7 phần tử
7 6
5 4
3 2
1 i
6 9
12 2
7 8
Max <8 Max <12
31 Bản quyền: Khoa CNTT 2011
Trang 32Ví dụ 3: Bài toán kiểm tra tính nguyên tố
Xác định bài toán
Input: Số nguyên dương N
Output: N là số nguyên tố hoặc N không là số nguyên tố
Trang 33Bài toán kiểm tra tính nguyên tố (tt)
Ý tưởng
N<4 : Xem như bài toán đã được giải quyết
N>=4 : Tìm ước i đầu tiên > 1 của N
- Nếu i < N N không là số nguyên tố
N không là số nguyên tố : Tìm thấy iÎ[2 (N-1)] Kết thúc
N là số nguyên tố : Không tìm thấy iÎ[2 (N-1)], i=N Kết thúc
33 Bản quyền: Khoa CNTT 2011
Trang 34Kiểm tra tính nguyên tố (tt)
Xây dựng thuật toán
a) Cách liệt kê :
Bước 1 : Nhập số nguyên dương N;
Bước 2 : Nếu N=1 thì thông báo “N không là số
Bước 5 : Nếu i là ước của N thì đến bước 7
Bước 6 : i i +1 rồi quay lại bước 5; (Tăng i
lên 1 đơn vị)
Bước 7 : Nếu i = N thì thông báo “N là số
34 Bản quyền: Khoa CNTT 2011
Trang 35Kiểm tra nguyên tố (tt)
b) Sơ đồ khối :
Bước 1 : Nhập số nguyên dương N;
Bước 2 : Nếu N=1 thì thông báo “N không
Bước 6 : i i +1 rồi quay lại bước 5;
(Tăng i lên 1 đơn vị)
Bước 7 : Nếu i = N thì thông báo “N là số
nguyên tố”, ngược lại thì thông báo “N
không là số nguyên tố”, kết thúc
35 Bản quyền: Khoa CNTT 2011
Đ S
Đ S
Nhập N
N là SNT
N là không SNT
Trang 36Kiểm tra tính nguyên tố (tt)
Cải tiến thuật toán
Nếu N=2500 thì bước 5,6 lặp lại 2499 lầnCần phải tìm cách giảm số lần xuống
Dựa vào một tính chất của số nguyên tố:
Nếu N >= 4 và không có ước trong phạm vi từ 2 đến phần nguyên căn bậc 2 của N N là số nguyên tố
Ý tưởng : Tìm i tăng dần trong phạm vi từ 2 đến phần nguyên
√N thỏa điều kiện là ước của N :
Các bạn hãy viết lại thuật toán theo ý
tưởng mới
Trang 37Ví dụ 3: Bái toán tìm kiếm
Input : Dãy A gồm N số nguyên khác nhau a 1 ,
hoặc thông báo không tìm thấy k trong dãy
Vị trí của 2 trong dãy là 5 (không tìm thấy 6)
37 Bản quyền: Khoa CNTT 2011
Trang 38Hình thành ý tưởng
Tìm kiếm tuần tự được thực hiện một cách tự nhiên :
Lần lượt đi từ số hạng thứ nhất,
So sánh giá trị số hạng đang xét với khóa
Cho đến khi gặp một số hạng bằng khóa hoặc dãy đã
được xét hết mà không tìm thấy giá trị của khóa trên dãy.
Trang 39Xây dựng thuật toán
Bước 4: i i + 1;
Bước 5: Nếu i > N thì thông báo
có giá trị bằng k, rồi kết thúc;
Bước 6: Quay lại bước 3;
Nhập N, a1, a2,…,an và k
Đƣa ra i ; Kết thúc
B.3
B.4
B.5 B.6
Đ S
Thông báo trong dãy số A không có số hạng nào bằng k Nhập N, a1, a2, …, an và k
Bản quyền: Khoa CNTT 2011
Trang 40Mô phỏng thuật toán
5 i
51 25
11 8
9 2
4 1
7 5
A
5
- Với k = 2 Tại vị trí i = 5 có a5 = 2 = k
5 4
3 2
4 3
2 1
i
51 25
11 8
9 2
4 1
7 5
A
- Với k = 6 Không tìm thấy k = 6 trên dãy
11
Trang 41Bài tập 1
Thiết kế thuật toán theo phương pháp dùng ngôn ngữ tựnhiên cho các bài toán sau:
a Kiểm tra 2 số a, b giống nhau hay khác nhau
b Kiểm tra 1 số a, b số nào lớn hơn
c Giải phương trình bậc 2: ax2 + bx + c = 0
41 Bản quyền: Khoa CNTT 2011
Trang 43Bài tập 3
Thiết kế thuật toán theo phương pháp dùng phương pháp
mã giả cho các bài toán sau:
a Có n hộp có khối lượng khác nhau và một cái cân dĩa
Tìm cách cân để tìm được hộp có trọng lượng nặng
nhất
b Tìm ước số chung lớn nhất của a và b
c Nhập vào 3 số nguyên dương, kiểm tra xem 3 số đã
cho có tạo thành tam giác không? Nếu có là tam giácgì? (Đều, cân, vuông, vuông cân, thường)
43 Bản quyền: Khoa CNTT 2011
Trang 45Thuật giải (tt)
Từ những nhận định trên người ta thấy rằng: cần phải
có những đổi mới cho khái niệm thuật toán “Thuật
Trang 47Ví dụ về thuật giải
Bài toán đổ nước
Có hai bình đựng nước là B5 có dung tích 5lít , B8 có dung tích 8lít Hãy chỉ
ra cách đong để có được hai lít nước Các thao tác có thể thực hiện được là :
Hứng đầy nước vào bình B5 hoặc B8.
Đổ hết nước trong một bình.
Đổ nước từ bình này sang bình khác cho đến lúc bình kia đầy.
Thuật giải :
Đổ đầy nước vào bình B5 (B5=5)
Đổ hết nước từ bình B5 sang bình B8 (B5=0, B8=5).
Đổ đầy nước bình B5 (B5=5, B8=5).
Đổ nước từ bình B5 cho đến khi B8 đầy (B5=2, B8=8).
TÍNH XÁC ĐỊNH VÀ TÍNH ĐÚNG Bản quyền: Khoa CNTT 2011 47
Trang 48Con người làm việc
Khái niệm về ngôn ngữ lập trình
Trang 49Sự hỗ trợ của máy tính
Khái niệm về ngôn ngữ lập trình
Bản quyền: Khoa CNTT 2011
Trang 50Giải bài toán này thế nào
đây?
Cách giải được diễn đạt bằng ngôn ngữ tự nhiên
Source code
Kiến thức
về NNLT
Kiến thức Chuyên môn
Chương trình
biên dịch
(Bộ máy của NNLT)
File Ngôn ngữ máy (exe, dll, com, )
Sự hỗ trợ của máy tính
Khái niệm về ngôn ngữ lập trình
Trang 51Phân loại ngôn ngữ lập trình
51 Bản quyền: Khoa CNTT 2011
Trang 52Ngôn ngữ máy
hiểu và thực hiện.Mỗi loại máy có ngôn ngữ máy
của riêng nó được tập hợp dưới dạng các câu lệnh.
Ưu điểm: cho phép khai thác triệt để và tối ưu khả năng của máy tính
cồng kềnh và khó hiệu chỉnh
Trang 53Hợp ngữ (Assembly)
thay bằng tên viết tắt tương ứng Hợp ngữ chỉ chạy được sau khi đã được dịch ra ngôn ngữ máy thông qua chương trình hợp dịch ( Assembler )
ngữ máy
trình
53 Bản quyền: Khoa CNTT 2011
Trang 54Ngôn ngữ bậc cao
Không phụ thuộc vào loại máy tính cụ thể
máy thông qua chương trình thông dịch ( Interpreter ) hoặc biên dịch ( Compiler )
Ưu điểm: dễ viết, chương trình dễ hiểu, dễ hiệu
chỉnh và dễ nâng cấp hơn
Trang 55Chương trình dịch
trình trên ngôn ngữ ban đầu (chương trình nguồn) sang chương trình tương đương trên ngôn ngữ
máy.
Chương trình dịch chia làm 2 loại:
Kỹ thuật thông dịch (Interpreter)
Kỹ thuật biên dịch (Compiler)
55 Bản quyền: Khoa CNTT 2011
Trang 56Kỹ thuật thông dịch
Là kiểu dịch từng dòng lệnh để hiểu công việc cần làm và thực hiện ngay chứ không nhất thiết phải tạo
ra các đoạn mã tương đương trong ngôn ngữ máy
Nếu một câu lệnh phải thực hiện nhiều lần thì cũng phải dịch nhiều lần
Ứng dụng: môi trường đối thoại giữa người và hệ thống
Trang 57Kỹ thuật biên dịch
Là kiểu dịch toàn bộ chương trình ban đầu thành
một chương trình tương ứng trong ngôn ngữ máy (chương trình đích), sau đó nạp chương trình đích vào máy tính để thực hiện
Ứng dụng: phù hợp với các chương trình ổn định và phải thực hiện nhiều lần
57 Bản quyền: Khoa CNTT 2011
Trang 58Một số ngôn ngữ
lập trình thông dụng
Basic đƣợc thiết kế bởi John G Kemeny và Thomas E Kurtz tại ĐH Dartmouth vào 1963
Pascal đƣợc Niklaus Wirth phát thiết kế năm 1970
C do Dennis Richie thiết kế năm 1972 tại phòng thí
nghiệp Bell Telephone của hãng AT&T sử dụng trong hệđiều hành Unix
Java đƣợc phát triễn bởi James Gosling thuộc Sun
Microsystem vào 6/1991
Trang 59THE END
Bản quyền: Khoa CNTT 2011