You are on page 1of 37

Trang 1 CHƯƠNG 3 Hiểu cấu trúc

Nhược điểm của Mã mì Ý không có cấu trúc


Các ứng dụng kinh doanh chuyên nghiệp thường phức tạp hơn nhiều so với các ví dụ
bạn đã thấy cho đến nay trong Chương 1 và 2. Hãy tưởng tượng số lượng các hướng dẫn trong
chương trình máy tính hướng dẫn chuyến bay của máy bay hoặc kiểm toán tờ khai thuế thu nhập. Cũng
chương trình tạo ra phiếu lương của bạn tại nơi làm việc chứa rất nhiều hướng dẫn.
Thiết kế logic cho một chương trình như vậy có thể là một công việc tốn nhiều thời gian. Khi bạn thêm
hàng trăm hoặc hàng nghìn hướng dẫn cho một chương trình, rất dễ tạo ra một
lộn xộn. Tên mô tả cho các câu lệnh chương trình có cấu trúc logic là mã spaghetti ,
bởi vì logic khó theo dõi như một sợi mì qua một đĩa mì Ý. không phải
chỉ là mã spaghetti khó hiểu, các chương trình chứa nó dễ bị lỗi, khó
để tái sử dụng và khó sử dụng làm khối xây dựng cho các ứng dụng lớn hơn. Các chương trình sử dụng
logic mã spaghetti là các chương trình không có cấu trúc ; nghĩa là, họ không tuân theo các quy tắc của
logic có cấu trúc mà bạn sẽ học trong chương này. Các chương trình có cấu trúc tuân theo những
và loại bỏ các vấn đề do mã spaghetti gây ra.

Ví dụ: giả sử rằng bạn bắt đầu công việc như một người giặt chó và bạn nhận được
hướng dẫn trong Hình 3-1. Sơ đồ này là một ví dụ về mì spaghetti không có cấu trúc
mã. Một chương trình máy tính được tổ chức tương tự có thể "hoạt động" — nghĩa là, nó có thể
tạo ra kết quả chính xác — nhưng sẽ khó đọc và duy trì, cũng như logic của nó
sẽ khó theo dõi.
Bạn có thể làm theo logic của quy trình rửa chó trong Hình 3-1 vì hai lý do:

Bạn có thể đã biết làm thế nào để rửa một con chó.
Lưu đồ chứa một số bước giới hạn.
Trang 2

Đừng làm điều đó


Ví dụ này không sử dụng
phong cách lập trình tốt.
Đến cuối chương,
khởi đầu
bạn sẽ biết cách làm
ví dụ này có cấu trúc,
điều này sẽ làm cho nó ít hơn
Bắt chó gây nhầm lẫn.

Có chó không Đúng


Không
chạy trốn?

Không Con chó có


dầu gội trên?
Đúng
Bật nước
89

Bắt chó
Có chó không Đúng
chạy trốn?

Không Tắt nước

Làm ướt chó và


thoa dầu gội đầu

Có chó không Đúng


chạy trốn?

Không

Rửa sạch chó

dừng lại

Hình 3-1 Logic mã Spaghetti để rửa một con chó

Tuy nhiên, hãy tưởng tượng rằng bạn không quen với việc giặt giũ cho chó, hoặc quá trình này còn xa
phức tạp hơn. (Ví dụ: hãy tưởng tượng bạn phải giặt 100 con chó đồng thời trong khi
bôi thuốc trị bọ chét và ve, cắt tóc cho chúng và nghiên cứu gia phả của chúng.)
Trang 3
90

Mô tả logic phức tạp hơn theo cách không có cấu trúc sẽ rất cồng kềnh. Cuối cùng
của chương này, bạn sẽ hiểu cách thực hiện quy trình không có cấu trúc trong Hình 3-1
rõ ràng hơn và ít bị lỗi hơn.

Các nhà phát triển phần mềm nói rằng một chương trình chứa mã spaghetti có tuổi thọ ngắn hơn chương trình có
mã có cấu trúc. Điều này có nghĩa là các chương trình được phát triển bằng mã spaghetti tồn tại dưới dạng sản xuất
các chương trình trong một tổ chức với thời gian ít hơn. Các chương trình như vậy rất khó thay đổi nên khi cải tiến
là bắt buộc, các nhà phát triển thường thấy dễ dàng hơn khi từ bỏ chương trình hiện có và bắt đầu lại từ đầu.
Điều này làm mất thêm thời gian và tốn nhiều tiền hơn.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Nhược điểm của Mã mì Ý không có cấu trúc

1. Mã spaghetti là tên mô tả cho các chương trình có cấu trúc logic.

2. Các chương trình được viết bằng mã spaghetti không thể tạo ra kết quả chính xác.

3. Các chương trình được viết bằng mã spaghetti khó bảo trì hơn các chương trình khác
các chương trình.

Hiểu ba cấu trúc cơ bản


Vào giữa những năm 1960, các nhà toán học đã chứng minh rằng bất kỳ chương trình nào, dù phức tạp đến đâu, đều có thể
được xây dựng bằng cách sử dụng một hoặc nhiều chỉ trong ba cấu trúc. Một cấu trúc là một đơn vị cơ bản của
logic lập trình; mỗi cấu trúc là một trong những cấu trúc sau:

sự nối tiếp
sự lựa chọn

vòng
Chỉ với ba cấu trúc này, bạn có thể lập sơ đồ cho bất kỳ nhiệm vụ nào, từ nhân đôi một số đến
thực hiện phẫu thuật não. Bạn có thể lập sơ đồ từng cấu trúc với cấu hình cụ thể của
các ký hiệu lưu đồ.

Cấu trúc trình tự


Các cấu trúc chuỗi được hiển thị trong Hình 3-2. Nó thực hiện các hành động hoặc nhiệm vụ theo thứ tự, một
sau cái khác. Một chuỗi có thể chứa bất kỳ số lượng nhiệm vụ nào, nhưng không có tùy chọn để phân nhánh
tắt và bỏ qua bất kỳ nhiệm vụ nào. Khi bạn bắt đầu một loạt các hành động theo một trình tự, bạn phải
tiếp tục từng bước cho đến khi trình tự kết thúc.
Trang 4

Ví dụ, chỉ đường lái xe thường là


được liệt kê dưới dạng một chuỗi. Để nói với một người bạn làm thế nào để có được
từ trường đến nhà bạn, bạn có thể cung cấp
trình tự sau, trong đó một bước
làm theo bước khác và không thể bỏ qua bước nào:
91
go north on First Avenue for 3 miles
rẽ trái trên Đại lộ Washington
go west on Washington for 2 miles
dừng lại ở 634 Washington

Cơ cấu lựa chọn


Hình 3-2 Cấu trúc trình tự
Các cấu trúc lựa chọn , hoặc cấu trúc ra quyết định , © 2015 Cengage Learning

được thể hiện trong Hình 3-3. Với cấu trúc này, một
trong số hai quá trình hành động được thực hiện dựa trên câu trả lời cho một câu hỏi. Lưu đồ mô tả
cấu trúc lựa chọn bắt đầu bằng ký hiệu quyết định và các nhánh của quyết định phải nối
ở dưới cùng của cấu trúc. Mã giả
mô tả cấu trúc lựa chọn bắt đầu bằng if .
Mã giả sử dụng câu lệnh cấu trúc cuối
endif để hiển thị rõ ràng nơi kết thúc của cấu trúc.
Không Đúng
Một số người gọi cấu trúc lựa chọn là
if-then-else bởi vì nó phù hợp với những điều sau
tuyên bố:
nếu một số Điều kiện là đúng thì
làm một
khác
làm theOtherProcess
endif
Hình 3-3 Cấu trúc lựa chọn
Ví dụ: bạn có thể cung cấp một phần của © 2015 Cengage Learning

chỉ đường đến nhà của bạn như sau:


nếu giao thông được hỗ trợ trên Đại lộ Washington thì
đi tiếp 1 dãy nhà trên Đại lộ Đầu tiên và rẽ trái trên Đường Adams
khác
rẽ trái trên Đại lộ Washington
endif

Tương tự, một chương trình trả lương có thể bao gồm một tuyên bố như:
nếu giờ làm việc nhiều hơn 40 thì
tính toán Trả thường xuyên và trả ngoài giờ
khác
tính toán thường xuyên
endif

Những if-else ví dụ này cũng có thể được gọi kép thay thế nếu s (hoặc lựa chọn kép thay thế )
bởi vì chúng chứa hai lựa chọn thay thế — hành động được thực hiện khi điều kiện được kiểm tra là đúng
92
Trang 5
và hành động được thực hiện khi nó sai. Lưu ý rằng nó hoàn toàn chính xác cho một nhánh của
lựa chọn trở thành một nhánh "không làm gì cả". Trong mỗi ví dụ sau, một hành động chỉ được thực hiện
khi điều kiện được kiểm tra là đúng:
nếu trời mưa thì
lấy một chiếc ô
endif

nếu nhân viên tham gia vào chương trình nha khoa thì
khấu trừ $ 40 từ tổng lương của nhân viên
endif

Các ví dụ trước không có mệnh đề khác là đơn-


thay thế nếu s (hoặc các lựa chọn thay thế duy nhất ); a
sơ đồ cấu trúc của chúng được thể hiện trong hình 3-4. Trong những
trường hợp, bạn không thực hiện bất kỳ hành động đặc biệt nào nếu trời không mưa
hoặc nếu nhân viên không thuộc chương trình nha khoa. Các
nhánh mà không có hành động nào được thực hiện được gọi là trường hợp rỗng
hoặc nhánh null .

Cấu trúc vòng lặp


Các cấu trúc vòng lặp được thể hiện trong hình 3-5. Một vòng lặp
tiếp tục lặp lại các hành động trong khi tình trạng vẫn còn
thật. Hành động hoặc các hành động xảy ra trong vòng lặp là
phần thân của vòng lặp . Trong loại vòng lặp phổ biến nhất,
tình trạng được đánh giá; nếu câu trả lời là đúng, bạn thực hiện
phần thân của vòng lặp và đánh giá lại điều kiện. Nếu
điều kiện vẫn đúng, bạn thực hiện lại phần nội dung vòng lặp
và sau đó đánh giá lại điều kiện. Điều này tiếp tục cho đến khi
điều kiện trở thành sai, và sau đó bạn thoát khỏi vòng lặp
kết cấu. Các lập trình viên gọi cấu trúc này một khi vòng lặp ;
mã giả mô tả loại vòng lặp này bắt đầu bằng
while và kết thúc bằng câu lệnh cấu trúc end while . Lưu đồ mô tả
trong khi cấu trúc vòng lặp luôn bắt đầu bằng ký hiệu quyết định có nhánh trả về
tại chỗ trước khi quyết định. Bạn có thể nghe các lập trình viên đề cập đến looping là sự lặp lại hoặc lặp lại .

Vòng lặp while kiểm tra một điều kiện trước khi thực thi phần thân của vòng lặp dù chỉ một lần. Một loại cấu trúc khác
vòng lặp kiểm tra một điều kiện sau khi thực thi phần thân của vòng lặp đầu tiên. Bạn sẽ tìm hiểu thêm về loại vòng lặp thay thế này
trong Chương 4 và trong Phụ lục D. Đối với phần còn lại của chương này, giả sử rằng tất cả các vòng lặp đều là các vòng lặp while yêu cầu
câu hỏi điều khiển trước khi thân vòng lặp thực thi. Tất cả các vấn đề logic có thể được giải quyết chỉ bằng cách sử dụng
ba cấu trúc — trình tự, lựa chọn và vòng lặp while.

Một số lập trình viên gọi một khi vòng một thời gian ... làm vòng lặp , bởi vì nó phù hợp với tuyên bố sau:

trong khi testCondition tiếp tục là đúng do


someProcess
cuối cùng
Trang 6

Khi bạn cung cấp chỉ đường đến ngôi nhà của mình, một phần của chỉ đường có thể là:
trong khi địa chỉ ngôi nhà bạn đang đi qua vẫn dưới 634
đi tiếp đến ngôi nhà tiếp theo
nhìn vào địa chỉ trên ngôi nhà
cuối cùng
93
Bạn gặp các ví dụ về lặp mỗi ngày, như trong mỗi ví dụ sau:
trong khi bạn tiếp tục đói
ăn một miếng nữa
xác định xem bạn có còn cảm thấy đói không
cuối cùng

trong khi các trang chưa đọc vẫn nằm trong bài tập đọc
đọc một trang chưa đọc khác
xác định xem có nhiều trang hơn để đọc hay không
cuối cùng

Kết hợp các cấu trúc


Tất cả các vấn đề logic có thể được giải quyết chỉ bằng cách sử dụng ba cấu trúc này — trình tự, lựa chọn và vòng lặp.
Các cấu trúc có thể được kết hợp theo vô số cách. Ví dụ, bạn có thể có một
chuỗi các nhiệm vụ được theo sau bởi một lựa chọn hoặc một vòng lặp được theo sau bởi một trình tự. Gắn kết cấu trúc
end to end được gọi là cấu trúc xếp chồng . Ví dụ: Hình 3-6 cho thấy một sơ đồ có cấu trúc
đạt được bằng cách xếp chồng các cấu trúc và hiển thị mã giả tuân theo logic lưu đồ.

bướcA
bướcB
nếu điều kiệnC là đúng thì
bướcA bướcD
khác
sự nối tiếp stepE
endif
bướcB trong khi điều kiệnF là đúng
stepG
cuối cùng

Không Đúng
điều kiệnC?

sự lựa chọn
stepE bướcD

Hình 3-6 Lưu đồ có cấu trúc và mã giả với ba cấu trúc xếp chồng lên nhau
Trang 7

Cho dù bạn đang vẽ lưu đồ hay viết mã giả, bạn có thể sử dụng bất kỳ
các từ để thể hiện kết quả quyết định — ví dụ: Có và Không hoặc đúng và sai. Cuốn sách này theo sau
quy ước sử dụng Có và Không trong sơ đồ lưu đồ và đúng và sai trong mã giả.

Mã giả trong Hình 3-6 cho thấy một chuỗi, tiếp theo là một vùng chọn, tiếp theo là một vòng lặp.
Bước đầu tiênA và bướcB thực thi theo trình tự. Sau đó, một cấu trúc lựa chọn bắt đầu với việc kiểm tra
điều kiệnC .
Lệnh theo sau mệnh đề if ( stepD ) thực thi khi nó được kiểm tra
điều kiện ( conditionC ) là đúng, lệnh theo sau else ( stepE ) thực thi khi
điều kiện đã kiểm tra là sai và bất kỳ hướng dẫn nào theo endif đều thực thi trong cả hai trường hợp. Trong
nói cách khác, các câu lệnh ngoài câu lệnh endif là “bên ngoài” cấu trúc lựa chọn.
Tương tự, câu lệnh endared cho biết nơi kết thúc của cấu trúc vòng lặp. Trong Hình 3-6, trong khi
conditionF tiếp
tục đúng, stepG tiếp tục thực thi. Nếu bất kỳ câu lệnh nào theo sau
endwhile tuyên bố, họ sẽ ở bên ngoài, và không phải là một phần của, vòng lặp.

Bên cạnh cấu trúc xếp chồng, bạn có thể thay thế bất kỳ bước riêng lẻ nào trong một lưu đồ có cấu trúc
sơ đồ hoặc mã giả với các cấu trúc bổ sung. Điều này có nghĩa là bất kỳ trình tự, lựa chọn nào,
hoặc vòng lặp có thể chứa các cấu trúc trình tự, lựa chọn hoặc vòng lặp khác. Ví dụ, bạn có thể có
một chuỗi ba nhiệm vụ trên một nhánh của vùng chọn, như trong Hình 3-7. Đặt một
cấu trúc bên trong cấu trúc khác được gọi là cấu trúc lồng nhau .

94

Hình 3-7 Lưu đồ và mã giả hiển thị các cấu trúc lồng nhau — một trình tự được lồng trong một vùng chọn

Trong mã giả cho logic được hiển thị trong Hình 3-7, phần thụt lề cho thấy rằng cả ba
các câu lệnh ( stepJ , stepK và stepL ) phải thực thi nếu điều kiệnH là true. Ba cái này
các câu lệnh tạo thành một khối hoặc một nhóm các câu lệnh thực thi như một đơn vị duy nhất.

Thay cho một trong các bước trong trình tự trong Hình 3-7, bạn có thể chèn một cấu trúc khác. Trong
Hình 3-8, quy trình có tên stepK đã được thay thế bằng cấu trúc vòng lặp bắt đầu bằng
một thử nghiệm của điều kiện có tên là conditionM .
Trang 8 nếu điều kiệnH là đúng thì
stepJ
Không Đúng trong khi điều kiệnM là đúng
điều kiệnH? stepN
cuối cùng
stepL
95
stepJ endif

Đúng
điều kiệnM? stepN

Không

stepL

Hình 3-8 Lưu đồ và mã giả hiển thị các cấu trúc lồng nhau — một vòng lặp được lồng trong một chuỗi,
lồng trong một lựa chọn
© 2015 Cengage Learning

Trong mã giả được hiển thị trong Hình 3-8, lưu ý rằng if và endif được căn chỉnh theo chiều dọc. Điều này
cho thấy rằng họ “ở cùng một cấp độ”. Tương tự như vậy, stepJ , trong khi , endwhile , và stepL là
căn chỉnh và chúng được thụt lề đều nhau. Trong sơ đồ ở Hình 3-8, bạn có thể vẽ một đường thẳng đứng
dòng thông qua những biểu tượng chứa stepJ , các điểm ra vào của trong khi vòng lặp, và
bướcL . Lưu đồ và mã giả biểu diễn chính xác cùng một logic.
Khi bạn lồng các cấu trúc, các câu lệnh bắt đầu và kết thúc một cấu trúc luôn nằm trên
cùng cấp và luôn luôn theo cặp. Các cấu trúc không được chồng lên nhau. Ví dụ, nếu bạn có một if
cấu trúc có chứa một trong khi cấu trúc, thì endwhile tuyên bố sẽ đến trước
endif .
Mặt khác, nếu bạn có một khoảng thời gian có chứa if , thì câu lệnh endif
sẽ đến trước khi endwhile .
Không có giới hạn về số lượng cấp độ bạn có thể tạo khi lồng ghép và xếp chồng các cấu trúc.
Ví dụ, Hình 3-9 cho thấy logic đã được làm phức tạp hơn bằng cách thay thế
stepN với một lựa chọn. Cấu trúc thực hiện stepP hoặc stepQ dựa trên kết quả của
conditionO được lồng trong vòng lặp được điều khiển bởi conditionM . Trong mã giả
trong Hình 3-9, hãy để ý xem if , else và endif mô tả lựa chọn điều kiện như thế nào
liên kết với nhau và trong cấu trúc while được điều khiển bởi conditionM .
Như trước đây, thụt lề được sử dụng trong mã giả phản ánh logic được trình bày bằng đồ thị trong
lưu đồ.
Trang 9

nếu điều kiệnH là đúng thì


stepJ
Không Đúng trong khi điều kiệnM là đúng
điều kiệnH? nếu điều kiệnO là đúng thì
stepP
khác
96
stepQ
endif
cuối cùng
stepL
stepJ endif

Đúng
điều kiệnM?

Không

stepL
Không Đúng
điều kiệnO?

stepQ stepP

Hình 3-9 Lưu đồ và mã giả cho một lựa chọn trong một vòng lặp trong một trình tự trong một lựa chọn
© 2015 Cengage Learning

Nhiều ví dụ trước là chung chung để bạn có thể tập trung vào các mối quan hệ của
biểu tượng mà không cần lo lắng về những gì họ làm. Hãy nhớ rằng các hướng dẫn chung chung như bướcA
và các điều kiện chung như conditionC có thể đại diện cho bất cứ điều gì. Ví dụ, Hình 3-10
cho thấy quá trình mua và trồng hoa ngoài trời vào mùa xuân sau khi nguy
sương giá đã qua. Lưu đồ và cấu trúc mã giả giống như trong Hình 3-9.
Trong các bài tập ở cuối chương này, bạn sẽ được yêu cầu phát triển thêm các tình huống
phù hợp với cùng một mẫu.
Trang 10

nếu chúng ta trồng hoa trong năm nay thì


mua hoa trong chậu
trong khi sương giá vẫn có thể
Không chúng ta đang trồng Đúng nếu hôm nay trên 50F thì
mang hoa chậu ra ngoài trời trong ngày
hoa năm nay?
khác
97
giữ hoa trong chậu trong ngày
endif
cuối cùng
trồng hoa dưới đất
endif
mua những bông hoa
trong chậu

là sương giá
vẫn Đúng
khả thi?

Không

cây
những bông hoa
trong lòng đất
Không kết thúc chưa Đúng
50F hôm nay?

giữ trong chậu mang chậu


hoa bên trong hoa ngoài trời
trong ngày trong ngày

Hình 3-10 Quy trình mua và trồng hoa vào mùa xuân

Sự kết hợp có thể có của các cấu trúc logic là vô tận, nhưng mỗi phân đoạn của một cấu trúc
chương trình là một chuỗi, một lựa chọn hoặc một vòng lặp. Ba cấu trúc được hiển thị cùng nhau trong
Tham khảo nhanh 3-1. Lưu ý rằng mỗi cấu trúc có một điểm vào và một điểm thoát. Một
cấu trúc có thể gắn với cấu trúc khác chỉ tại một trong những điểm này.
Trang 11

THAM KHẢO NHANH 3-1 The Three Structures

Sự nối tiếp Lựa chọn Vòng

98
nhập cảnh nhập cảnh nhập cảnh

Không Đúng Đúng

Không

lối ra

lối ra

lối ra

Hãy thử tưởng tượng về mặt vật lý chọn bất kỳ cấu trúc nào trong ba cấu trúc bằng cách sử dụng các “chốt” nhập và xuất. đó là
những điểm mà bạn có thể kết nối cấu trúc này với cấu trúc khác. Tương tự, bất kỳ cấu trúc hoàn chỉnh nào, từ
điểm vào đến điểm thoát của nó, có thể được chèn vào trong biểu tượng quy trình của bất kỳ cấu trúc nào khác, tạo thành
cấu trúc.

Tóm lại, một chương trình có cấu trúc có các đặc điểm sau:

Một chương trình có cấu trúc chỉ bao gồm sự kết hợp của ba cấu trúc cơ bản—
trình tự, lựa chọn và vòng lặp. Bất kỳ chương trình có cấu trúc nào cũng có thể chứa một, hai hoặc tất cả
ba loại cấu trúc.
Mỗi cấu trúc có một điểm vào duy nhất và một điểm thoát duy nhất.
Các cấu trúc có thể được xếp chồng lên nhau hoặc kết nối với nhau chỉ tại các điểm vào hoặc ra của chúng.
Bất kỳ cấu trúc nào cũng có thể được lồng trong cấu trúc khác.

Một chương trình có cấu trúc không bao giờ bắt buộc phải chứa các ví dụ về cả ba cấu trúc. Ví dụ, nhiều
các chương trình đơn giản chỉ chứa một chuỗi một số tác vụ thực thi từ đầu đến cuối mà không có bất kỳ
các lựa chọn hoặc vòng lặp cần thiết. Một ví dụ khác, một chương trình có thể hiển thị một chuỗi số, lặp lại để làm
vì vậy, nhưng không bao giờ đưa ra bất kỳ quyết định nào về các con số.
Trang 12

Sử dụng đầu vào mồi để cấu trúc chương trình

Xem video Hiểu Cấu trúc.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Hiểu ba cấu trúc cơ bản

1. Mỗi cấu trúc trong lập trình có cấu trúc là một chuỗi, lựa chọn hoặc
vòng.

2. Tất cả các vấn đề logic chỉ có thể được giải quyết bằng cách sử dụng ba cấu trúc — trình tự,
99
lựa chọn và vòng lặp.

3. Ba cấu trúc không thể được kết hợp trong một chương trình duy nhất.

Sử dụng đầu vào mồi để cấu trúc chương trình


Nhắc lại chương trình nhân đôi số đã thảo luận trong Chương 2; Hình 3-11 cho thấy một
chương trình. Chương trình chấp nhận một số làm đầu vào và kiểm tra điều kiện cuối dữ liệu.
Nếu điều kiện không được đáp ứng, thì con số sẽ được nhân đôi, câu trả lời được hiển thị và tiếp theo
số là đầu vào.
Trang 13 khởi đầu

Tuyên bố
num originalNumber
100 num tínhAnswer

Đừng làm điều đó


đầu vào
ban đầu
Logic này không có cấu trúc.

Không
không eof? dừng lại

Đúng

tínhAnswer =
originalNumber * 2

đầu ra
tính toán

Hình 3-11 Lưu đồ không có cấu trúc của chương trình nhân đôi số
© 2015 Cengage Learning

Nhớ lại từ Chương 1 rằng cuốn sách này sử dụng eof để biểu thị một điều kiện cuối dữ liệu chung khi
các thông số được kiểm tra không quan trọng đối với cuộc thảo luận. Trong ví dụ này, bài kiểm tra không phải là eof vì
quá trình xử lý sẽ tiếp tục trong khi chưa đạt đến phần cuối của dữ liệu.

Chương trình được biểu diễn bằng hình 3-11 có cấu trúc không? khởi đầu
Lúc đầu, có thể khó nói. Ba cho phép
cấu trúc đã được minh họa trong Tài liệu tham khảo nhanh 3-1, và
lưu đồ trong Hình 3-11 trông không giống hệt như Tuyên bố
bất kỳ hình dạng nào trong ba hình dạng đó. Tuy nhiên, vì bạn có thể num originalNumber
cấu trúc ngăn xếp và lồng nhau trong khi vẫn giữ lại tổng thể num tínhAnswer

cấu trúc, có thể khó xác định liệu một


lưu đồ nói chung là có cấu trúc. Nó là dễ dàng nhất để
phân tích sơ đồ trong Hình 3-11 từng bước một. đầu vào
Phần đầu của sơ đồ có dạng như Hình 3-12. ban đầu

Phần này của lưu đồ có được cấu trúc không? Vâng, nó là một
chuỗi hai nhiệm vụ — khai báo và
nhập một giá trị.
Hình 3-12 Sự bắt đầu của một
lưu đồ nhân đôi số
© 2015 Cengage Learning
Trang 14

Thêm phần tiếp theo của lưu đồ trông giống như


Hình 3-13. Sau giá trị isinput cho originalNumber , khởi đầu

không eof? tình


trạng được kiểm tra. Trình tự đã kết thúc;
một lựa chọn hoặc một vòng lặp đang bắt đầu. Bạn có thể không biết
cái nào, nhưng bạn có biết rằng với một trình tự, mỗi Tuyên bố
nhiệm vụ hoặc bước phải tuân theo mà không có bất kỳ cơ hội nào để num originalNumber 101
num tínhAnswer
rẽ nhánh. Vì vậy, loại cấu trúc nào bắt đầu với
câu hỏi trong hình 3-13? Nó là một lựa chọn hay một vòng lặp?

Cả hai cấu trúc lựa chọn và lặp đều bắt đầu bằng một câu hỏi,
đầu vào
nhưng chúng khác nhau như sau: ban đầu

Trong cấu trúc lựa chọn, các nhánh logic ở một trong các
hai hướng sau câu hỏi, và sau đó là luồng
quay lại với nhau; câu hỏi không được hỏi a Không
không eof?
lần thứ hai trong cấu trúc lựa chọn.
Trong một vòng lặp, mỗi khi câu trả lời cho câu hỏi Đúng
dẫn đến việc thực thi phần thân của vòng lặp, luồng của
logic trở lại câu hỏi bắt đầu vòng lặp.
Khi phần thân của một vòng lặp thực thi, câu hỏi rằng Hình 3-13 Nhân đôi số
điều khiển vòng lặp luôn được hỏi lại.
lưu đồ tiếp tục
Nếu điều kiện cuối dữ liệu không được đáp ứng trong số- © 2015 Cengage Learning

vấn đề nhân đôi trong Hình 3-11 ban đầu, sau đó


kết quả được tính toán và xuất ra, thu được một số mới và logic trả về
câu hỏi kiểm tra phần cuối của tệp. Nói cách khác, trong khi câu trả lời cho câu trả lời không phải là eof?
câu hỏi tiếp tục là Có, phần nội dung gồm hai câu lệnh tiếp tục được thực thi. Vì thế,
các không eof ? câu hỏi bắt đầu một cấu trúc có nhiều khả năng là một vòng lặp hơn là một lựa chọn.
Bài toán nhân đôi số có chứa một vòng lặp, nhưng nó không phải là một vòng lặp có cấu trúc. Trong một
cấu trúc trong khi vòng lặp, các quy tắc là:
1. Bạn hỏi một câu hỏi.
2. Nếu câu trả lời cho biết bạn nên thực thi phần nội dung vòng lặp, thì bạn làm như vậy.
3. Sau khi thực hiện phần nội dung vòng lặp, bạn phải quay lại ngay để đặt câu hỏi
một lần nữa — bạn không thể đi bất cứ nơi nào khác!
Lưu đồ trong Hình 3-11 đưa ra một câu hỏi. Nếu câu trả lời là Có (nghĩa là, trong khi không?
là true), sau đó chương trình thực hiện hai tác vụ trong thân vòng lặp: Nó thực hiện số học và
nó hiển thị kết quả. Làm hai việc có thể chấp nhận được vì hai nhiệm vụ không thể thực hiện được
sự phân nhánh tạo thành một chuỗi và có thể lồng một cấu trúc này vào trong một cấu trúc khác
kết cấu. Tuy nhiên, khi trình tự kết thúc, logic không quay trở lại vòng lặp-
câu hỏi kiểm soát. Thay vào đó, nó vượt lên trên câu hỏi để lấy một số khác. Cho
vòng lặp trong hình 3-11 là một vòng lặp có cấu trúc, logic phải trở lại không eof?
câu hỏi khi trình tự nhúng kết thúc.

Lưu đồ trong Hình 3-14 cho thấy chương trình với luồng logic quay trở lại
không eof? câu hỏi ngay sau chuỗi hai bước lồng nhau. Hình 3-14 cho thấy
Trang 15 Đừng làm điều đó
khởi đầu

Logic này được cấu trúc,


Tuyên bố
num originalNumber nhưng chương trình không bao giờ
102 num tínhAnswer
chấp nhận tiếp theo
đầu vào giá trị đầu vào.
ban đầu

Đúng
không eof?

Không

dừng lại tínhAnswer =


originalNumber * 2

đầu ra
tính toán

Hình 3-14 Lưu đồ có cấu trúc, nhưng không chức năng, của bài toán nhân đôi số

một lưu đồ có cấu trúc, nhưng nó có một lỗ hổng lớn - lưu đồ không thực hiện công việc của
liên tục nhân đôi số lượng khác nhau.
Thực hiện theo sơ đồ thông qua một lần chạy chương trình điển hình, giả sử điều kiện eof là
giá trị đầu vào bằng 0. Giả sử khi chương trình bắt đầu, người dùng nhập giá trị 9 cho giá trị
trong số originalNumber . Đó không phải là eof , vì vậy số được nhân với 2 và 18 là
được hiển thị dưới dạng giá trị của countAnswer . Sau đó, câu hỏi không eof? được hỏi lại.
Không phải là eof? điều kiện vẫn phải đúng bởi vì một giá trị mới đại diện cho trạm gác
giá trị (kết thúc) chưa được nhập và không thể nhập được. Logic không bao giờ trở lại
các originalNumber đầu vào công việc, vì vậy giá trị của originalNumber bao giờ thay đổi.
Do đó, 9 nhân đôi một lần nữa và câu trả lời 18 được hiển thị một lần nữa. Không phải là eof? kết quả là
vẫn đúng, vì vậy các bước tương tự được lặp lại. Điều này diễn ra mãi mãi, với câu trả lời 18 là
được tính toán và xuất nhiều lần. Logic chương trình được hiển thị trong Hình 3-14 được cấu trúc,
nhưng nó không hoạt động như dự định. Ngược lại, chương trình trong Hình 3-15 hoạt động, nhưng
nó không có cấu trúc bởi vì sau khi các tác vụ thực thi trong một vòng lặp có cấu trúc, luồng
logic phải trở lại trực tiếp câu hỏi điều khiển vòng lặp. Trong Hình 3-15, lôgic
không trở lại câu hỏi này; thay vào đó, nó đi "quá cao" bên ngoài vòng lặp để lặp lại
các originalNumber đầu vào công việc.
Trang 16 khởi đầu
Đừng làm điều đó
Logic này không có cấu trúc.
Tuyên bố
num originalNumber
num tínhAnswer 103

đầu vào
ban đầu

Đúng
không eof?

Không

dừng lại tínhAnswer =


originalNumber * 2

đầu ra
tính toán

Hình 3-15 Lưu đồ chức năng nhưng không có cấu trúc

Làm thế nào để bài toán nhân đôi số vừa được cấu trúc vừa hoạt động như dự định? Thường,
để một chương trình được cấu trúc, bạn phải thêm một thứ gì đó bổ sung. Trong trường hợp này, nó là mồi
bước đầu vào. Một mồi đầu vào hoặc mồi đọc là một tuyên bố nói thêm rằng bị đầu vào đầu tiên
giá trị trong một chương trình. Ví dụ: nếu một chương trình sẽ nhận 100 giá trị dữ liệu làm đầu vào, bạn nhập
giá trị đầu tiên trong một câu lệnh tách biệt với 99 giá trị khác. Bạn phải làm điều này để giữ
chương trình có cấu trúc.
Hãy xem xét giải pháp trong Hình 3-16; nó được cấu trúc và nó thực hiện những gì nó phải làm.
Nó chứa một câu lệnh originalNumber đầu vào được tô bóng, bổ sung . Logic chương trình
chứa một chuỗi và một vòng lặp. Vòng lặp chứa một chuỗi khác.
Trang 17 khởi đầu

Tuyên bố
num originalNumber
104 num tínhAnswer

đầu vào Đây là lớp sơn lót


ban đầu đầu vào.

Đúng
không eof?

Không
tínhAnswer =
originalNumber * 2
dừng lại

đầu ra
tính toán

Bước này nhận được tất cả


đầu vào
các đầu vào tiếp theo.
ban đầu

Hình 3-16 Lưu đồ chức năng, có cấu trúc cho bài toán nhân đôi số
© 2015 Cengage Learning

Bước đầu vào bổ sung originalNumber được hiển thị trong Hình 3-16 là điển hình trong cấu trúc
các chương trình. Bước đầu tiên trong hai bước đầu vào là đầu vào mồi. Thuật ngữ sơn lót đến
từ thực tế là đầu vào là đầu tiên hoặc chính (nó giúp quá trình diễn ra, như trong “mồi
máy bơm ”). Mục đích của bước đầu vào mồi là để kiểm soát vòng lặp sắp tới
điều đó bắt đầu với không phải eof? câu hỏi. Phần tử cuối cùng trong vòng lặp có cấu trúc được
tiếp theo và tất cả các giá trị đầu vào tiếp theo. Điều này cũng là điển hình trong các vòng lặp có cấu trúc —
bước cuối cùng được thực thi trong phần thân vòng lặp sẽ thay đổi điều kiện được kiểm tra trong câu hỏi
bắt đầu vòng lặp, mà trong trường hợp này không phải là eof? câu hỏi.

Trong Chương 2, bạn đã biết rằng nhóm các nhiệm vụ sơ bộ tạo tiền đề cho công việc chính của
một chương trình được gọi là phần dọn phòng. Đầu vào mồi là một ví dụ về nhiệm vụ dọn phòng.

Hình 3-17 cho thấy một cách khác mà bạn có thể cố gắng rút ra logic cho số-
chương trình nhân đôi. Thoạt nhìn, hình có vẻ như cho thấy một giải pháp có thể chấp nhận được
vấn đề — nó có cấu trúc, nó chứa một chuỗi theo sau là một vòng lặp với
một chuỗi gồm ba bước được lồng trong nó và nó dường như loại bỏ nhu cầu về
câu lệnh đầu vào mồi. Khi chương trình bắt đầu, các khai báo được thực hiện và
Trang 18

không eof? câuhỏi được hỏi. Nếu nó không phải là phần cuối của dữ liệu đầu vào, thì chương trình sẽ nhận được một
số, nhân đôi nó và hiển thị nó. Sau đó, nếu không phải eof? điều kiện vẫn đúng,
chương trình nhận một số khác, nhân đôi nó và hiển thị nó. Chương trình có thể tiếp tục
trong khi nhiều số là đầu vào. Tại một số điểm, số đầu vào sẽ đại diện cho eof
tình trạng; ví dụ, chương trình có thể đã được viết để nhận ra giá trị 0 là
giá trị kết thúc chương trình. Sau khi giá trị eof được nhập, điều kiện của nó không 105
ngay lập tức được thử nghiệm. Thay vào đó, kết quả được tính toán và hiển thị lần cuối trước
câu hỏi kiểm soát vòng lặp được hỏi lại. Nếu chương trình được viết để nhận ra eof
khi số gốc là 0, thì câu trả lời không liên quan của số 0 sẽ được hiển thị trước
chương trình kết thúc. Tùy thuộc vào ngôn ngữ bạn đang sử dụng và loại đầu vào
đang được sử dụng, kết quả có thể tồi tệ hơn: Chương trình có thể kết thúc bằng cách hiển thị
thông báo lỗi hoặc đầu ra giá trị có thể là rác không thể giải mã được. Trong mọi trường hợp, điều này cuối cùng
đầu ra là thừa — không có giá trị nào nên được nhân đôi và đầu ra sau điều kiện eof là
đã gặp.
Theo nguyên tắc chung, kiểm tra kết thúc chương trình phải luôn đến ngay sau đầu vào
vì đó là điểm sớm nhất mà nó có thể được đánh giá. Do đó, tốt nhất
giải pháp cho vấn đề nhân đôi số vẫn là giải pháp được hiển thị trong Hình 3-16 —
giải pháp có cấu trúc chứa câu lệnh đầu vào mồi.

Đừng làm điều đó

khởi đầu
Logic này được cấu trúc,
nhưng thiếu sót. Khi người dùng
Tuyên bố nhập giá trị eof, nó sẽ
num originalNumber
num tínhAnswer
Đúng không chính xác được nhân đôi và
không eof?
đầu ra.
đầu vào
Không
ban đầu

dừng lại
tínhAnswer =
originalNumber * 2

đầu ra
tính toán

Hình 3-17 Giải pháp có cấu trúc nhưng không chính xác cho bài toán nhân đôi số
© 2015 Cengage Learning
Trang 19

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sử dụng đầu vào mồi để cấu trúc chương trình

106 1. Đầu vào mồi là câu lệnh lặp đi lặp lại tất cả dữ liệu được nhập vào
trong một chương trình.

2. Một chương trình có cấu trúc có thể chứa nhiều hướng dẫn hơn một chương trình không có cấu trúc.

3. Một chương trình có thể được cấu trúc nhưng vẫn không chính xác.

Hiểu lý do cấu trúc


Tại thời điểm này, rất có thể bạn đang nói, “Tôi thích chương trình nhân đôi số ban đầu
trở lại trong Hình 3-11 chỉ tốt. Tôi có thể làm theo nó. Ngoài ra, chương trình đầu tiên có một bước ít hơn trong đó, vì vậy
nó đã được ít công việc hơn. Ai quan tâm nếu một chương trình được cấu trúc? ”
Cho đến khi bạn có một số kinh nghiệm lập trình, rất khó để đánh giá được lý do
chỉ sử dụng ba cấu trúc — trình tự, lựa chọn và vòng lặp. Tuy nhiên, ở với những
ba cấu trúc tốt hơn vì những lý do sau:
Rõ ràng — Chương trình nhân đôi số nhỏ. Khi các chương trình lớn hơn, chúng nhận được nhiều hơn
khó hiểu nếu chúng không có cấu trúc.
Tính chuyên nghiệp — Tất cả các lập trình viên khác (và giáo viên lập trình mà bạn có thể gặp phải)
mong đợi các chương trình của bạn được cấu trúc. Đó là cách mọi thứ được thực hiện một cách chuyên nghiệp.
Hiệu quả — Hầu hết các ngôn ngữ máy tính mới hơn đều hỗ trợ cấu trúc và sử dụng cú pháp cho phép bạn xử lý
hiệu quả với trình tự, lựa chọn và lặp lại. Các ngôn ngữ cũ hơn, chẳng hạn như hợp ngữ,
COBOL và RPG, được phát triển trước khi các nguyên tắc của lập trình có cấu trúc là
đã phát hiện. Tuy nhiên, ngay cả các chương trình sử dụng các ngôn ngữ cũ hơn đó cũng có thể được viết bằng
dạng cấu trúc. Các ngôn ngữ mới hơn như C #, C ++ và Java thực thi cấu trúc theo cú pháp của chúng.

Trong các ngôn ngữ cũ hơn, bạn có thể để lại một lựa chọn hoặc vòng lặp trước khi nó hoàn tất bằng cách sử dụng câu lệnh “go to”.
Câu lệnh cho phép logic "đi đến" bất kỳ phần nào khác của chương trình cho dù nó nằm trong cùng
cấu trúc hay không. Lập trình có cấu trúc đôi khi được gọi là lập trình goto-less .

Bảo trì — Bạn và các lập trình viên khác sẽ thấy dễ dàng hơn trong việc sửa đổi và bảo trì
các chương trình có cấu trúc như những thay đổi được yêu cầu trong tương lai.
Tính mô-đun — Các chương trình có cấu trúc có thể dễ dàng được chia nhỏ thành các mô-đun có thể
được gán cho bất kỳ số lượng lập trình viên nào. Các thói quen sau đó được ghép lại với nhau như
đồ nội thất mô-đun tại mỗi điểm vào hoặc ra duy nhất của mỗi thói quen. Ngoài ra, một mô-đun thường
có thể được sử dụng trong nhiều chương trình, tiết kiệm thời gian phát triển trong dự án mới.
Trang 20

Nhận biết cấu trúc

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Hiểu lý do cấu trúc

1. Chương trình có cấu trúc rõ ràng hơn các chương trình không có cấu trúc. 107

2. Bạn và các lập trình viên khác sẽ thấy dễ dàng hơn khi sửa đổi và duy trì cấu trúc
các chương trình thay đổi được yêu cầu trong tương lai.

3. Structuredprogramsarenoteasilydivided intopart, làm cho chúng ít lỗi hơn.

Nhận biết cấu trúc


A
Khi bạn bắt đầu tìm hiểu về cấu trúc
thiết kế chương trình, rất khó để phát hiện liệu một
lưu đồ logic của một chương trình được cấu trúc. Đối với
ví dụ, là phân đoạn lưu đồ trong Hình 3-18 Không Đúng
B?
có cấu trúc?
Vâng, đúng vậy. Nó có một trình tự và một cấu trúc lựa chọn. C

Phân đoạn lưu đồ trong Hình 3-19 có cấu trúc không?


Vâng, đúng vậy. Nó có một vòng lặp và một lựa chọn trong vòng lặp.
Có phải phân đoạn lưu đồ ở góc trên bên trái của
Hình 3-20 có cấu trúc? Hình 3-18 Ví dụ 1
© 2015 Cengage Learning
Không, nó không được xây dựng từ ba cơ bản
cấu trúc. Một cách để làm rõ một
phân đoạn lưu đồ không có cấu trúc được sử dụng
phương pháp "tô mì spaghetti"; đó là,
Đúng
hình dung sơ đồ là một tô mì Ý D?

mà bạn phải gỡ rối. Hãy tưởng tượng bạn có thể


Không
lấy một miếng mì ống ở đầu Không Đúng
tô và bắt đầu kéo. Khi bạn "kéo" mỗi E?

biểu tượng ra khỏi mớ hỗn độn rối ren, bạn có thể


gỡ rối các con đường riêng biệt cho đến khi toàn bộ F

phân đoạn được cấu trúc.

Hình 3-19 Ví dụ 2
© 2015 Cengage Learning
Trang 21

G
Đừng làm điều đó
Phân đoạn chương trình này là
108 Không Đúng không có cấu trúc.
H?

2
Không Đúng
G
TÔI?

J K 3 G
H?

Không
H?
4
G 5

G
Không Đúng
H? J
Không Đúng
H?

TÔI?

Không
TÔI?
J

J J
G
6
G
7
Không Đúng
H?

Không Đúng
H?
Không Đúng
TÔI?

Không Đúng
TÔI?
J J K

J J K

Hình 3-20 Ví dụ 3 và quy trình để cấu trúc nó


© 2015 Cengage Learning
Trang 22 109

Nhìn vào sơ đồ ở góc trên bên trái của Hình 3-20. Nếu bạn có thể bắt đầu kéo
mũi tên ở trên cùng, bạn sẽ gặp một hộp có nhãn G. (Xem Hình 3-20, Bước 1.)
quy trình như G là một phần của cấu trúc có thể chấp nhận được — ít nhất nó tạo thành phần đầu của một
cấu trúc trình tự.

Hãy tưởng tượng rằng bạn tiếp tục kéo các biểu tượng từ phân đoạn rối. Mặt hàng tiếp theo
trong lưu đồ là một câu hỏi kiểm tra một điều kiện có nhãn H, như bạn có thể thấy trong
Hình 3-20, Bước 2. Tại thời điểm này, bạn biết chuỗi bắt đầu bằng G đã kết thúc.
Chuỗi không bao giờ có câu hỏi trong chúng, vì vậy chuỗi kết thúc; hoặc là một lựa chọn
hoặc một vòng lặp bắt đầu bằng câu hỏi H. Một vòng lặp phải quay trở lại điều khiển vòng lặp
câu hỏi ở một số thời điểm sau đó. Bạn có thể thấy từ logic ban đầu rằng liệu
câu trả lời cho H là Có hoặc Không, logic không bao giờ trở lại H. Do đó, H bắt đầu lựa chọn
cấu trúc, không phải là cấu trúc lặp.

Để tiếp tục tháo gỡ logic, bạn sẽ kéo lên trên dòng chảy xuất hiện từ bên trái
bên (bên Không) của Câu hỏi H. Bạn gặp J, như thể hiện trong Bước 3 của Hình 3-20. Khi nào
bạn tiếp tục vượt qua J, bạn đến cuối lưu đồ.

Bây giờ bạn có thể chuyển sự chú ý của mình sang phía Có (phía bên phải) của điều kiện được kiểm tra
ở H. Khi bạn kéo lên ở phía bên phải, bạn gặp Câu hỏi I. (Xem Bước 4 của
Hình 3-20.)
Trong phiên bản ban đầu của lưu đồ ở Hình 3-20, hãy làm theo dòng ở phía bên trái
của Câu hỏi I. Đường nổi lên từ phía bên trái của lựa chọn I được gắn với J,
nằm ngoài cấu trúc lựa chọn. Bạn có thể nói rằng lựa chọn do tôi kiểm soát đang trở thành
vướng mắc với lựa chọn được kiểm soát H, vì vậy bạn phải gỡ rối các cấu trúc bằng cách
lặp lại bước gây rối. (Trong ví dụ này, bạn lặp lại Bước J để
gỡ rối nó khỏi cách sử dụng khác của J.) Tiếp tục kéo dòng chảy mà
xuất hiện từ J cho đến khi bạn đến cuối phân đoạn chương trình, như được hiển thị trong Bước 5 của
Hình 3-20.

Bây giờ kéo ở phía bên phải của Câu hỏi I. Quy trình K bật lên, như được hiển thị trong Bước 6 của
Hình 3-20; sau đó bạn đạt đến cuối cùng.

Tại thời điểm này, sơ đồ không bị rối có ba đầu lỏng lẻo. Các kết thúc lỏng lẻo của Câu hỏi Tôi có thể
được tập hợp lại với nhau để tạo thành một cấu trúc lựa chọn; thì các đầu lỏng lẻo của Câu H có thể là
kết hợp với nhau để tạo thành một cấu trúc lựa chọn khác. Kết quả là lưu đồ được hiển thị trong
Bước 7 của Hình 3-20. Toàn bộ phân đoạn lưu đồ được cấu trúc — nó có một trình tự theo sau
bởi một lựa chọn bên trong một lựa chọn.

Nếu bạn muốn thử cấu trúc một ví dụ khó hơn về chương trình không có cấu trúc, hãy xem Phụ lục B.
Trang 23

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


110
Nhận biết cấu trúc

1. Một số quy trình không thể được thể hiện trong một định dạng có cấu trúc.

2. Một lưu đồ phi cấu trúc có thể đạt được kết quả chính xác.

3. Bất kỳ lưu đồ không có cấu trúc nào đều có thể được “tách rời” để trở thành có cấu trúc.

Cấu trúc và mô đun hóa Logic phi cấu trúc


Nhớ lại quy trình rửa chó được minh họa trong Hình 3-1 ở đầu chương này.
Khi bạn nhìn vào nó bây giờ, bạn sẽ nhận ra nó là một quá trình không có cấu trúc. Có thể
quá trình này được cấu hình lại để thực hiện chính xác các tác vụ giống nhau theo cách có cấu trúc?
Tất nhiên!
Hình 3-21 trình bày cách bạn có thể tiếp cận cấu trúc logic rửa chó.
Phần 1 của hình cho thấy phần đầu của quá trình. Bước đầu tiên, Bắt chó, là một
trình tự đơn giản. Bước này được theo sau bởi một câu hỏi. Khi một câu hỏi gặp phải,
trình tự kết thúc và một vòng lặp hoặc một lựa chọn bắt đầu. Trong trường hợp này, sau khi con chó
bỏ chạy, bạn phải bắt con chó và xác định xem nó có chạy trốn lần nữa hay không, vì vậy a
vòng lặp bắt đầu. Để tạo một vòng lặp có cấu trúc giống như những vòng lặp bạn đã thấy trước đó trong phần này
chương, bạn có thể lặp lại quy trình Bắt chó và quay lại ngay lập tức với Chú chó có
chạy trốn? câu hỏi.
Trang 24

1 2 khởi đầu
khởi đầu

Bắt chó
Bắt chó 111

Có chó không Đúng


Đúng chạy trốn?
Có chó không
chạy trốn?
Không Nắm lấy
Nắm lấy chó
Không
chó Bật nước

3
khởi đầu
Có chó không Đúng
chạy trốn?
Bắt chó
Không Tắt
Nước

Có chó không Đúng


Bắt chó
chạy trốn?
Bắt chó
Không

Bật nước
Đừng làm điều đó
Vòng lặp này không có cấu trúc
Có chó không Đúng
bởi vì logic của nó
chạy trốn?

Tắt
không trở lại câu hỏi
Không Nước sau khi cơ thể của nó thực thi.

Bắt chó

Có chó không Đúng Nắm lấy


chạy trốn? chó

Không

Bật nước

Hình 3-21 Các bước cấu trúc quy trình rửa chó
Trang 25

112

Trong sơ đồ ban đầu ở Hình 3-1, bạn bật nước khi con chó không chạy
xa. Bước này là một trình tự đơn giản, vì vậy nó có thể được thêm vào sau vòng lặp một cách chính xác. Khi mà
nước được bật, logic ban đầu sẽ kiểm tra xem con chó có bỏ chạy sau cái mới này hay không
phát triển. Điều này bắt đầu một vòng lặp. Trong sơ đồ ban đầu, các đường chéo nhau, tạo ra một đám rối, vì vậy
bạn lặp lại nhiều bước nếu cần để tách các đường. Sau khi bạn tắt nước và
bắt con chó, bạn gặp câu hỏi Con chó có gội đầu không? Bởi vì logic
chưa đến bước gội đầu thì không cần hỏi câu này; câu trả lời tại
điểm này luôn luôn là Không. Khi một trong những con đường hợp lý xuất hiện từ một câu hỏi có thể
không bao giờ được đi du lịch, bạn có thể loại bỏ câu hỏi. Phần 2 của Hình 3-21 cho thấy rằng nếu
con chó chạy đi sau khi bạn bật nước, nhưng trước khi bạn làm con chó bị ướt và
gội đầu cho nó thì phải tắt nước, bắt chó, trả lời câu hỏi.
hỏi liệu con chó có chạy đi không.

Logic trong Phần 2 của Hình 3-21 không có cấu trúc vì vòng lặp thứ hai bắt đầu
với câu hỏi Con chó có chạy trốn không? không ngay lập tức trở lại vòng lặp-
câu hỏi kiểm soát sau khi phần thân của nó thực thi. Vì vậy, để tạo cấu trúc vòng lặp, bạn có thể
lặp lại các hành động xảy ra trước khi quay lại câu hỏi kiểm soát vòng lặp. Các
phân đoạn lưu đồ trong Phần 3 của Hình 3-21 được cấu trúc; nó chứa một chuỗi, một vòng lặp, một
và một vòng lặp cuối cùng, lớn hơn. Vòng lặp cuối cùng này chứa trình tự, vòng lặp và
sự nối tiếp.

Sau khi bắt được chó và hết nước, bạn làm ướt và gội đầu cho chó. Sau đó,
theo sơ đồ ban đầu trong Hình 3-1, bạn kiểm tra lại một lần nữa để xem liệu
con chó đã bỏ chạy. Nếu nó có, bạn tắt nước và bắt con chó. Từ đây
vị trí trong logic, câu trả lời cho Con chó có bật dầu gội đầu không? câu hỏi sẽ luôn luôn
được Có; như trước đây, không cần đặt câu hỏi khi chỉ có một
câu trả lời. Vì vậy, nếu con chó bỏ chạy, vòng lặp cuối cùng sẽ thực thi. Bạn tắt nước, tiếp tục
để bắt con chó khi nó chạy trốn liên tục và vặn nước. Khi con chó
bắt được cuối cùng, bạn rửa sạch con chó và kết thúc chương trình. Hình 3-22 cho thấy cả hai
lưu đồ hoàn chỉnh và mã giả.
Trang 26

khởi đầu
khởi đầu
Bắt chó
trong khi con chó chạy trốn
Bắt chó
Bắt chó cuối cùng
Bật nước
trong khi con chó chạy trốn 113
Tắt nước
Có chó không Đúng
Bắt chó Bắt chó
chạy trốn? trong khi con chó chạy trốn
Bắt chó
Không
cuối cùng
Bật nước
Bật nước cuối cùng
Làm ướt chó và thoa dầu gội đầu
trong khi con chó chạy trốn
Đúng Tắt nước
Có chó không
Bắt chó
chạy trốn?
trong khi con chó chạy trốn
Tắt nước Bắt chó
Không
cuối cùng
Bật nước
Bắt chó cuối cùng
Rửa sạch chó
Làm ướt chó
dừng lại
và áp dụng
dầu gội đầu
Có chó không Đúng
Bắt chó
chạy trốn?

Không
Bật nước

Có chó không Đúng


chạy trốn?

Không Tắt nước

Bắt chó

Rửa sạch chó

Có chó không Đúng


Bắt chó
chạy trốn?
dừng lại
Không

Bật nước

Hình 3-22 Lưu đồ rửa chó có cấu trúc và mã giả

Lưu đồ trong Hình 3-22 đã hoàn chỉnh và có cấu trúc. Nó chứa trình tự xen kẽ
và các cấu trúc vòng lặp.
Trang 27

Hình 3-22 bao gồm ba vị trí mà trình tự vòng lặp của việc bắt chó và
bật nước được lặp lại. Nếu muốn, bạn có thể sửa đổi bản sao
để các tập lệnh của chúng được viết một lần và được chứa trong một mô-đun riêng biệt.
Hình 3-23 cho thấy một phiên bản được mô-đun hóa của chương trình; ba lệnh gọi mô-đun được tô bóng.
114
khởi đầu khởi đầu
catchDogStartWater ()
trong khi con chó chạy trốn
Tắt nước
catchDogStartWater () catchDogStartWater ()
cuối cùng
Làm ướt chó và thoa dầu gội đầu
trong khi con chó chạy trốn
Tắt nước
Có chó không Đúng catchDogStartWater ()
chạy trốn? cuối cùng
Rửa sạch chó
Tắt nước dừng lại

Không
catchDogStartWater ()
Bắt chó
Làm ướt chó và catchDogStartWater () trong khi con chó chạy trốn
thoa dầu gội đầu
Bắt chó
cuối cùng
Đúng Bật nước
Có chó không
chạy trốn? trở về

Tắt nước
Không

Rửa sạch chó catchDogStartWater ()

dừng lại catchDogStartWater ()

Bắt chó

Có chó không Đúng


Bắt chó
chạy trốn?

Không

Bật nước

trở về

Hình 3-23 Phiên bản mô-đun hóa của chương trình rửa chó
© 2015 Cengage Learning
Trang 28

Cấu trúc và mô đun hóa Logic phi cấu trúc

Một lợi thế để mô-đun hóa các bước cần thiết để bắt chó và bắt đầu xuống nước
là chương trình chính trở nên ngắn hơn và dễ hiểu hơn. Khác
lợi thế là nếu quy trình này cần được sửa đổi, các thay đổi có thể được thực hiện chỉ trong 115

một địa điểm. Ví dụ, nếu bạn quyết định rằng cần phải kiểm tra nước
nhiệt độ mỗi lần bạn bật nước, bạn sẽ chỉ thêm các hướng dẫn đó
một lần trong phiên bản mô-đun hóa. Trong phiên bản gốc ở Hình 3-22, bạn sẽ có
để thêm các hướng dẫn đó ở ba nơi, gây ra nhiều công việc hơn và tăng cơ hội
vì lỗi.

Cho dù phức tạp đến đâu, bất kỳ tập hợp bước nào cũng luôn có thể được rút gọn thành các tổ hợp
của ba cấu trúc tuần tự, lựa chọn và vòng lặp cơ bản. Những cấu trúc này có thể
lồng nhau và xếp chồng lên nhau theo vô số cách để mô tả logic của bất kỳ quy trình nào
và để tạo logic cho mọi chương trình máy tính được viết trong quá khứ, hiện tại hoặc
Tương lai.

Để thuận tiện, nhiều ngôn ngữ lập trình cho phép hai biến thể của ba cấu trúc cơ bản. Trường hợp
cấu trúc là một biến thể của cấu trúc lựa chọn và vòng lặp do là một biến thể của vòng lặp while. Bạn có thể
tìm hiểu về hai cấu trúc này trong Phụ lục D. Mặc dù những cấu trúc bổ sung này có thể được sử dụng trong hầu hết các
ngôn ngữ lập trình, tất cả các vấn đề logic có thể được giải quyết mà không cần chúng.

Xem video Logic phi cấu trúc cấu trúc.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Cấu trúc và mô đun hóa Logic phi cấu trúc

1. Khi bạn gặp một câu hỏi trong sơ đồ logic, một trình tự sẽ
được kết thúc.

2. Trong vòng lặp có cấu trúc, logic trở lại câu hỏi điều khiển vòng lặp sau
phần thân vòng lặp thực thi.

3. Nếu một lưu đồ hoặc mã giả chứa một câu hỏi mà câu trả lời không bao giờ
khác nhau, bạn có thể loại bỏ câu hỏi.
Trang 29

116

Tóm tắt chương


Mã spaghetti là tên mô tả cho các câu lệnh chương trình không có cấu trúc không
tuân theo các quy tắc của logic cấu trúc.
Các chương trình rõ ràng hơn có thể được xây dựng chỉ bằng ba cấu trúc cơ bản: trình tự,
lựa chọn và vòng lặp. Ba cấu trúc này có thể được kết hợp theo vô số cách
bằng cách xếp chồng và lồng chúng. Mỗi cấu trúc có một điểm vào duy nhất và một lối ra duy nhất
điểm; một cấu trúc chỉ có thể gắn với cấu trúc khác tại một trong những điểm này.
Đầu vào mồi là câu lệnh nhận giá trị đầu vào đầu tiên trước khi bắt đầu
một vòng lặp có cấu trúc. Thông thường, bước cuối cùng trong phần thân vòng lặp là bước tiếp theo và tất cả
các giá trị đầu vào tiếp theo.
Các lập trình viên sử dụng các kỹ thuật có cấu trúc để thúc đẩy sự rõ ràng, chuyên nghiệp, hiệu quả,
và tính mô đun.
Một cách để sắp xếp một phân đoạn lưu đồ không có cấu trúc là tưởng tượng nó như một phần của
spaghetti mà bạn phải gỡ rối.
Bất kỳ tập hợp các bước logic nào cũng có thể được viết lại để phù hợp với ba cấu trúc: trình tự,
lựa chọn và vòng lặp.

Điều khoản quan trọng


Mã spaghetti là chương trình logic, không có cấu trúc.

Chương trình không có cấu trúc là chương trình không tuân theo các quy tắc của logic có cấu trúc.

Chương trình có cấu trúc là chương trình tuân theo các quy tắc của logic có cấu trúc.

Một cấu trúc là một đơn vị cơ bản của lập trình logic; mỗi cấu trúc là một chuỗi, lựa chọn hoặc vòng lặp.

Một cấu trúc chuỗi chứa loạt các bước thực hiện theo thứ tự. Một chuỗi có thể chứa bất kỳ
số lượng nhiệm vụ, nhưng không có tùy chọn để phân nhánh, bỏ qua bất kỳ nhiệm vụ nào.

Một cấu trúc lựa chọn hoặc cấu trúc quyết định chứa một câu hỏi, và, tùy thuộc vào
trả lời, thực hiện một trong hai quy trình hành động trước khi tiếp tục với nhiệm vụ tiếp theo.

Một tuyên bố cuối cùng cấu trúc chỉ định vào cuối của một cấu trúc giả.

If -then-else là một tên khác của cấu trúc lựa chọn thay thế kép.

Thay thế kép nếu s (hoặc lựa chọn thay thế kép ) xác định một hành động sẽ được thực hiện khi
điều kiện đã thử nghiệm là đúng và một hành động khác cần thực hiện khi điều kiện đó là sai.

Thay thế duy nhất nếu s (hoặc các lựa chọn thay thế duy nhất ) chỉ thực hiện hành động trên một nhánh của
quyết định.

Các trường hợp rỗng hoặc chi nhánh rỗng là một nhánh của một quyết định mà không có hành động được thực hiện.

Một cấu trúc vòng lặp tiếp tục lặp lại hành động trong khi một điều kiện thử nghiệm vẫn còn đúng.
Trang 30

Nội dung vòng lặp là tập hợp các hành động xảy ra trong một vòng lặp.

Một khi vòng lặp là một cấu trúc mà vẫn tiếp tục lặp lại một quá trình trong khi một số điều kiện
vẫn đúng.
117

Lặp lại và lặp là các tên thay thế cho một cấu trúc vòng lặp.

Một thời gian ... làm vòng lặp là một tên thay thế cho một trong khi vòng lặp.

Xếp chồng các cấu trúc là hành động gắn các cấu trúc từ đầu đến cuối.

Các cấu trúc lồng vào nhau là hành động đặt một cấu trúc vào trong một cấu trúc khác.

Một khối là một nhóm các câu lệnh thực thi như một đơn vị duy nhất.

Một mồi đầu vào hoặc mồi đọc là tuyên bố mà đọc đầu vào đầu trước khi bắt đầu
một vòng lặp có cấu trúc sử dụng dữ liệu.

Lập trình Goto-less là một cái tên để mô tả lập trình có cấu trúc, vì có cấu trúc
lập trình viên không sử dụng câu lệnh “go to”.
Bài tập

Câu hỏi đánh giá

1. Logic chương trình được gọi là mã.

a. con rắn c. mì ống Ý


b. chuỗi d. gnarly

2. Ba cấu trúc của lập trình có cấu trúc là .


a. trình tự, lựa chọn và vòng lặp c. trình tự, thứ tự và quá trình
b. lựa chọn, vòng lặp và lặp lại d. nếu, khác, và sau đó
3. Một cấu trúc trình tự có thể chứa .
a. chỉ một nhiệm vụ c. không quá ba nhiệm vụ
b. chính xác ba nhiệm vụ d. bất kỳ số lượng nhiệm vụ

4. Từ nào sau đây không phải là một thuật ngữ khác cho cấu trúc lựa chọn?
a. cấu trúc quyết định c. cấu trúc if kép thay thế
b. cấu trúc vòng lặp d. cấu trúc if-then-else
5. Cấu trúc kiểm tra một điều kiện, thực hiện hành động nếu kết quả là đúng, và sau đó kiểm tra
điều kiện một lần nữa có thể được gọi là tất cả các điều kiện sau ngoại trừ a (n) .

a. sự lặp lại c. sự lặp lại


b. vòng d. nếu-thì-khác

Trang 31

CHƯƠNG 3 Hiểu cấu trúc

6. Đặt một cấu trúc trong một cấu trúc khác được gọi là các cấu trúc.
a. xếp chồng c. xây dựng
b. gỡ rối d. làm tổ

7. Các cấu trúc gắn kết từ đầu đến cuối được gọi là .
118
a. xếp chồng c. xây dựng
b. gỡ rối d. làm tổ
8. Khi một hành động được yêu cầu nếu một điều kiện là đúng, nhưng không cần hành động nếu điều kiện đó là đúng
sai, bạn sử dụng một .
a. sự nối tiếp c. lựa chọn thay thế kép
b. vòng d. lựa chọn thay thế duy nhất

9. Để thực hiện hành động miễn là một điều kiện vẫn đúng, bạn sử dụng .
a. sự nối tiếp c. lựa chọn thay thế kép
b. vòng d. lựa chọn thay thế duy nhất
10. Khi bạn phải thực hiện một hành động khi một điều kiện đúng và một điều kiện khác

https://translate.googleusercontent.com/translate_f 31/37
9/7/2021 Nhược điểm của Mã mì Ý không có cấu trúc
khi nó sai, bạn sử dụng .
a. sự nối tiếp c. lựa chọn thay thế kép
b. vòng d. lựa chọn thay thế duy nhất
11. Thuộc tính nào sau đây cả ba cấu trúc cơ bản đều dùng chung?

a. Tất cả các sơ đồ của chúng đều chứa chính xác ba biểu tượng xử lý.
b. Tất cả đều có một điểm vào và một điểm ra.
c. Tất cả chúng đều chứa đựng một quyết định.
d. Tất cả đều bắt đầu với một quá trình.

12. Điều nào đúng với cấu trúc xếp chồng?


a. Hai trường hợp có cùng cấu trúc không thể xếp chồng lên nhau.
b. Khi bạn xếp chồng các cấu trúc, bạn không thể lồng chúng trong cùng một chương trình.
c. Mỗi cấu trúc chỉ có một điểm mà nó có thể được xếp chồng lên nhau.
d. Khi bạn xếp chồng các cấu trúc, cấu trúc trên cùng phải là một chuỗi.

13. Khi bạn nhập dữ liệu vào một vòng lặp trong một chương trình, câu lệnh đầu vào đứng trước
vòng lặp .

a. là phần duy nhất của chương trình được phép không có cấu trúc
b. không thể dẫn đến eof
c. được gọi là đầu vào mồi
d. thực hiện hàng trăm hoặc thậm chí hàng nghìn lần trong hầu hết các chương trình kinh doanh

Trang 32

Bài tập

14. Một nhóm câu lệnh thực thi như một đơn vị là .
a. khối c. khúc gỗ
b. gia đình d. đội quân
15. Điều nào sau đây được chấp nhận trong một chương trình có cấu trúc?
119
a. đặt một trình tự trong nhánh thực sự của một quyết định thay thế kép
b. đặt một quyết định trong một vòng lặp
c. đặt một vòng lặp trong một trong các bước theo trình tự
d. Tất cả những điều này đều có thể chấp nhận được.
16. Trong cấu trúc lựa chọn, câu hỏi kiểm soát cấu trúc là .
a. đã hỏi một lần ở đầu cấu trúc
b. hỏi một lần ở cuối cấu trúc
c. được hỏi nhiều lần cho đến khi nó sai
d. hỏi lặp đi lặp lại cho đến khi nó là sự thật
17. Khi một vòng lặp thực thi, câu hỏi kiểm soát cấu trúc là .

https://translate.googleusercontent.com/translate_f 32/37
9/7/2021 Nhược điểm của Mã mì Ý không có cấu trúc
a. đã hỏi chính xác một lần
b. không bao giờ hỏi nhiều hơn một lần
c. được hỏi trước hoặc sau khi phần thân vòng lặp thực thi
d. chỉ hỏi nếu nó là đúng, và không được hỏi nếu nó là sai
18. Điều nào sau đây không phải là lý do để thực thi các quy tắc cấu trúc trong máy tính
các chương trình?
a. Các chương trình có cấu trúc dễ hiểu hơn các chương trình không có cấu trúc.
b. Các lập trình viên chuyên nghiệp khác sẽ mong đợi các chương trình có cấu trúc.
c. Các chương trình có cấu trúc thường ngắn hơn các chương trình không có cấu trúc.
d. Các chương trình có cấu trúc có thể được chia nhỏ thành các mô-đun một cách dễ dàng.
19. Điều nào sau đây không phải là lợi ích của việc điều biến chương trình?

a. Các chương trình mô-đun dễ đọc và dễ hiểu hơn các chương trình không mô-đun.
b. Nếu bạn sử dụng mô-đun, bạn có thể bỏ qua các quy tắc cấu trúc.
c. Các thành phần mô-đun có thể được sử dụng lại trong các chương trình khác.
d. Nhiều lập trình viên có thể làm việc trên các mô-đun khác nhau cùng một lúc.
20. Điều nào sau đây là đúng với logic có cấu trúc?
a. Bạn có thể sử dụng logic có cấu trúc với các ngôn ngữ lập trình mới hơn, chẳng hạn như Java
và C #, nhưng không phải với những cái cũ hơn.
b. Bất kỳ nhiệm vụ nào cũng có thể được mô tả bằng cách sử dụng một số kết hợp của ba cấu trúc:
trình tự, lựa chọn và vòng lặp.
c. Các chương trình có cấu trúc yêu cầu bạn chia mã thành dễ xử lý
mỗi mô-đun chứa không quá năm hành động.
d. Tất cả những điều này đều đúng.

Trang 33

CHƯƠNG 3 Hiểu cấu trúc

Bài tập lập trình

1. Trên hình 3-10 trình bày quy trình mua và trồng hoa vào mùa xuân.
sử dụng các cấu trúc tương tự như ví dụ chung trong Hình 3-9. Sử dụng cùng một lôgic
120 cấu trúc như trong Hình 3-9 để tạo lưu đồ hoặc mã giả mô tả một số
quy trình khác mà bạn biết.

2. Mỗi phân đoạn của lưu đồ trong Hình 3-24 là không có cấu trúc. Vẽ lại từng
phân đoạn để nó làm điều tương tự nhưng có cấu trúc.

a. b.

A D

Đúng Không Đúng

https://translate.googleusercontent.com/translate_f 33/37
9/7/2021 Nhược điểm của Mã mì Ý không có cấu trúc
B? C E?

Không
F H

c.
Đúng
G?
K

Không Tôi

Không Đúng
L?

M P

N Đúng
Q?

Không

Đúng
Ơ?

Không R

Hình 3-24 Lưu đồ cho Bài tập 2 (tiếp theo)


© 2015 Cengage Learning

Trang 34

Bài tập

(còn tiếp)

d. e.

S Không Đúng
B?

121

Không Đúng C G
T?

Đúng
U Y H?

Không
D
Đúng
Z?
Tôi

Đúng
Không E? Tôi
V

https://translate.googleusercontent.com/translate_f 34/37
9/7/2021 Nhược điểm của Mã mì Ý không có cấu trúc
Không

Đúng F
W?

Không

X A

Hình 3-24 Lưu đồ cho Bài tập 2


© 2015 Cengage Learning

3. Viết mã giả cho mỗi ví dụ (từ a đến e) trong Bài tập 2, đảm bảo
mã giả được cấu trúc và thực hiện các nhiệm vụ tương tự như phân đoạn lưu đồ.

4. Giả sử rằng bạn đã tạo ra một cánh tay máy móc có thể giữ một cây bút. Cánh tay có thể
thực hiện các nhiệm vụ sau:

Hạ bút xuống một tờ giấy.


Nâng bút khỏi tờ giấy.
Di chuyển bút 1 inch dọc theo một đường thẳng. (Nếu hạ bút, hành động này
vẽ một đường dài 1 inch từ trái sang phải; nếu cây bút được nâng lên, hành động này chỉ
đặt lại vị trí bút sang phải 1 inch.)

Quay sang phải 90 độ.


Vẽ một hình tròn có đường kính 1 inch.

Vẽ lưu đồ có cấu trúc hoặc viết mã giả có cấu trúc mô tả logic


điều đó sẽ làm cho cánh tay vẽ hoặc viết như sau. Có một hành động của bạn học sinh

Trang 35

CHƯƠNG 3 Hiểu cấu trúc

như cánh tay máy móc và thực hiện các hướng dẫn của bạn. Không tiết lộ mong muốn
kết quả cho đối tác của bạn cho đến khi bài tập hoàn thành.

a. hình vuông 1 inch


b. hình chữ nhật 2 inch x 1 inch
122
c. một chuỗi ba hạt

d. một từ ngắn (ví dụ: mèo)


e. một số có bốn chữ số

5. Giả sử rằng bạn đã tạo ra một robot cơ khí có thể thực hiện những việc sau
nhiệm vụ:
Đứng lên.
Ngồi xuống.

Quay trái 90 độ.


https://translate.googleusercontent.com/translate_f 35/37
9/7/2021 Nhược điểm của Mã mì Ý không có cấu trúc

Quay sang phải 90 độ.

Đi một bước.

Ngoài ra, robot có thể xác định câu trả lời cho một điều kiện thử nghiệm:
Tôi có đang chạm vào thứ gì đó không?

a. Đặt hai chiếc ghế cách nhau 20 feet, đối diện trực tiếp với nhau. Vẽ một cấu trúc
lưu đồ hoặc viết mã giả mô tả logic cho phép rô bốt
bắt đầu từ vị trí ngồi trên một chiếc ghế, băng qua phòng và kết thúc là ngồi trong
ghế khác. Yêu cầu một sinh viên khác đóng vai trò là người máy và thực hiện
hướng dẫn.
b. Vẽ lưu đồ có cấu trúc hoặc viết mã giả mô tả logic sẽ
cho phép robot bắt đầu từ vị trí ngồi trên một chiếc ghế, đứng lên và đi vòng tròn
chiếc ghế, băng qua phòng, vòng qua chiếc ghế khác, quay trở lại chiếc ghế đầu tiên và ngồi.
Yêu cầu một bạn học đóng vai trò là người máy và thực hiện các chỉ dẫn của bạn.

6. Vẽ lưu đồ có cấu trúc hoặc viết mã giả mô tả quá trình


đoán một số từ 1 đến 100. Sau mỗi lần đoán, người chơi được thông báo rằng
đoán quá cao hoặc quá thấp. Quá trình tiếp tục cho đến khi người chơi đoán
con số đúng. Chọn một số và nhờ một học viên khác thử đoán nó bằng cách làm theo
hướng dẫn của bạn.

7. Tra cứu một từ trong từ điển có thể là một quá trình phức tạp. Ví dụ,
giả sử rằng bạn muốn tra cứu logic. Bạn có thể mở từ điển một cách ngẫu nhiên
trang và xem nước trái cây. Bạn biết từ này có thứ tự bảng chữ cái trước logic, vì vậy bạn lật
chuyển tiếp và xem thịt cừu. Điều đó vẫn chưa đủ xa, vì vậy bạn hãy lật về phía trước và xem
con khỉ. Bạn đã đi quá xa, vì vậy bạn quay ngược lại, v.v. Vẽ một cấu trúc
lưu đồ hoặc viết mã giả mô tả quá trình tra cứu một từ trong
từ điển. Chọn một từ ngẫu nhiên và nhờ một học viên khác cố gắng thực hiện
hướng dẫn của bạn.

Trang 36

Bài tập

8. Vẽ lưu đồ có cấu trúc hoặc viết mã giả có cấu trúc mô tả cách thực hiện một
khối lượng đồ giặt. Bao gồm ít nhất hai quyết định và hai vòng lặp.

9. Vẽ lưu đồ có cấu trúc hoặc viết mã giả có cấu trúc mô tả cách


Học để chuẩn bị cho bài kiểm tra. Bao gồm ít nhất hai quyết định và hai vòng lặp.

10. Vẽ lưu đồ có cấu trúc hoặc viết mã giả có cấu trúc mô tả cách 123
bọc một món quà. Bao gồm ít nhất hai quyết định và hai vòng lặp.

11. Vẽ lưu đồ có cấu trúc hoặc viết mã giả có cấu trúc mô tả các bước để
chuẩn bị món ăn yêu thích của bạn. Bao gồm ít nhất hai quyết định và hai vòng lặp.

Thực hiện bảo trì


1. Tệp có tên MAINTENANCE03-01.txt được bao gồm trong stu- có thể tải xuống của bạn

https://translate.googleusercontent.com/translate_f 36/37
9/7/2021 Nhược điểm của Mã mì Ý không có cấu trúc
tệp
rằngvết
nólõm. Giả đổi
cần sửa sử rằng chương
như được môtrình này các
tả trong là một chương
nhận trình
xét (các làmbắt
dòng việc
đầutrong
bằngtổhai
chức của bạn và
dấu gạch chéo) ở đầu tệp. Công việc của bạn là thay đổi chương trình để đáp ứng cái mới
thông số kỹ thuật.

Tìm lỗi

1. Các tệp có thể tải xuống của bạn cho Chương 3 bao gồm DEBUG03-01.txt, DEBUG03-02.txt,
và DEBUG03-03.txt. Mỗi tệp bắt đầu với một số nhận xét mô tả vấn đề.
Nhận xét là các dòng bắt đầu bằng hai dấu gạch chéo (//). Tiếp theo các nhận xét, mỗi tệp
chứa mã giả có một hoặc nhiều lỗi bạn phải tìm và sửa.
2. Các tệp có thể tải xuống của bạn cho Chương 3 bao gồm một tệp có tên DEBUG03-04.jpg
chứa một sơ đồ có lỗi cú pháp và / hoặc lôgic. Kiểm tra lưu đồ và
sau đó tìm và sửa tất cả các lỗi.

Khu vực chơi game


1. Chọn một trò chơi đơn giản dành cho trẻ em và mô tả logic của nó, sử dụng sơ đồ có cấu trúc
hoặc mã giả. Ví dụ, bạn có thể cố gắng giải thích Rock, Paper, Scissors; Âm nhạc
Nhiều cái ghế; Vịt, Vịt, Ngỗng; trò chơi bài chiến tranh; hoặc trò chơi loại trừ Eenie,
Meenie, Minie, Moe.
2. Chọn một chương trình trò chơi truyền hình như Wheel of Fortune hoặc Jeopardy! và mô tả
các quy tắc của nó bằng cách sử dụng lưu đồ có cấu trúc hoặc mã giả.

3. Chọn một môn thể thao như bóng chày hoặc bóng đá và mô tả các hành động trong một giới hạn
thời gian chơi (chẳng hạn như gậy at-bat trong bóng chày hoặc sở hữu trong bóng đá) bằng cách sử dụng
lưu đồ cấu trúc hoặc mã giả.

Trang 37

CHƯƠNG 3 Hiểu cấu trúc

Lên cho cuộc thảo luận


1. Tìm thêm thông tin về một trong những người sau đây và giải thích lý do tại sao người đó
quan trọng đối với lập trình có cấu trúc: Edsger Dijkstra, Corrado Bohm, Giuseppe
124
Jacopini và Grace Hopper.
2. Các chương trình máy tính có thể chứa các cấu trúc bên trong các cấu trúc và xếp chồng lên nhau
cấu trúc, tạo ra các chương trình rất lớn. Máy tính cũng có thể thực hiện hàng triệu
tính toán số học trong một giờ. Làm thế nào chúng ta có thể biết kết quả là
chính xác?
3. Phát triển một danh sách kiểm tra các quy tắc mà bạn có thể sử dụng để giúp bạn xác định xem một sơ đồ
hoặc phân đoạn mã giả có cấu trúc.

https://translate.googleusercontent.com/translate_f 37/37

You might also like