Professional Documents
Culture Documents
Chương 4
Chương 4
Mọi quyết định mà một chương trình máy tính đưa ra đều liên quan đến việc đánh giá một biểu thức Boolean —an
biểu thức có giá trị chỉ có thể đúng hoặc sai. Đánh giá đúng / sai là tự nhiên từ một
quan điểm của máy tính, bởi vì mạch máy tính bao gồm các công tắc bật-tắt hai trạng thái,
thường được biểu thị bằng 1 hoặc 0. Mọi quyết định của máy tính đều mang lại giá trị true-or-false, yes-or-no, 1-or-0
kết quả. Một biểu thức Boolean được sử dụng để điều khiển mọi cấu trúc lựa chọn. Sự lựa chọn
cấu trúc không mới đối với bạn — đó là một trong ba cấu trúc cơ bản mà bạn đã học về
Chương 3. Xem Hình 4-1 và 4-2.
Nhà toán học George Boole (1815–1864) tiếp cận logic đơn giản hơn những người tiền nhiệm của ông,
bằng cách thể hiện các lựa chọn hợp lý với các ký hiệu đại số thông thường. Ông được coi là người sáng lập của
logic toán học và biểu thức Boolean (đúng / sai) được đặt tên cho anh ta.
Không Đúng
Không Đúng
Hình 4-1 Phương án thay thế kép Hình 4-2 Phương án thay thế duy nhất
cấu trúc lựa chọn cấu trúc lựa chọn
© 2015 Cengage Learning © 2015 Cengage Learning
Trong Chương 3, bạn đã biết rằng cấu trúc trong Hình 4-1 là một lựa chọn thay thế kép
bởi vì một hành động được liên kết với mỗi trong hai kết quả có thể xảy ra: Tùy thuộc vào câu trả lời
đối với câu hỏi trong biểu tượng quyết định, luồng logic sẽ chuyển sang nhánh bên trái
của cấu trúc hoặc bên phải. Các lựa chọn loại trừ lẫn nhau; nghĩa là, logic có thể chảy
chỉ một trong hai lựa chọn thay thế, không bao giờ cho cả hai. Dạng cấu trúc lựa chọn này là một
lựa chọn if-then-else .
Biểu thức Boolean và cấu trúc lựa chọn
Trang 2
Cuốn sách này tuân theo quy ước rằng hai con đường hợp lý xuất hiện từ một lựa chọn thay thế kép là
được vẽ ở bên phải và bên trái của một viên kim cương trong một sơ đồ. Một số lập trình viên vẽ ra một trong những dòng chảy nổi lên
từ đáy của viên kim cương. Định dạng chính xác của sơ đồ không quan trọng bằng ý tưởng rằng một
đường dẫn logic chảy vào một lựa chọn và hai kết quả có thể xuất hiện. Lưu đồ của bạn sẽ dễ dàng hơn
độc giả để theo dõi nếu bạn nhất quán khi bạn rút ra các lựa chọn. Ví dụ: nếu nhánh Có chảy đến
đúng cho một lựa chọn, nó sẽ chảy sang phải cho tất cả các lựa chọn tiếp theo trong cùng một sơ đồ.
127
Phân đoạn lưu đồ trong Hình 4-2 đại diện cho một lựa chọn thay thế duy nhất trong đó hành động
chỉ được yêu cầu cho một kết quả của câu hỏi. Dạng cấu trúc lựa chọn này được gọi là
một if-then lựa chọn, bởi vì không thay thế hoặc khác hành động đó là cần thiết.
Nhanh tham khảo 4-1 chương trình tiêu chuẩn giả sử dụng để xây dựng nếu báo cáo trong
Cuốn sách này.
Điều kiện được kiểm tra là một biểu thức Boolean. Nó có thể là một so sánh
Từ khóa if bắt đầu chẳng hạn như x> y, nó có thể là một biến Boolean nếu ngôn ngữ hỗ trợ
tuyên bố và đặt trước bất kỳ kiểu đó, hoặc nó có thể là một cuộc gọi đến một phương thức trả về giá trị Boolean.
câu lệnh thực thi (Chương 9 trong phiên bản toàn diện của cuốn sách này mô tả các phương pháp
khi điều kiện được kiểm tra trả về các giá trị.)
là đúng.
Hình 4-3 cho thấy sơ đồ và mã giả cho một chương trình tương tác tính toán khoản thanh toán
dành cho nhân viên. Chương trình hiển thị lương hàng tuần cho mỗi nhân viên vào cùng một giờ
tỷ lệ ($ 10,00) và giả định rằng không có khoản khấu trừ lương. Các cuộc gọi logic của dòng chính
mô-đun housekeeping () , detailLoop () và finish () . Các detailLoop () mô-đun chứa
một lựa chọn thay thế kép điển hình xác định xem một nhân viên có làm việc nhiều hơn hay không
so với một tuần làm việc tiêu chuẩn (40 giờ) và trả lương gấp rưỡi so với bình thường của nhân viên
tỷ lệ giờ cho số giờ làm việc vượt quá 40 giờ mỗi tuần.
Trang 3
khởi đầu dọn phòng ()
dọn phòng ()
đầu ra " Enter
tên nhân viên hoặc " ,
QUIT, " thoát >> "
Không
detailLoop ()
trở về
hoàn thành()
đầu ra " Enter
giờ làm việc >> "
dừng lại
pay = (WORK_WEEK *
trả = giờ * RATE) + (giờ -
TỶ LỆ WORK_WEEK) * TỶ LỆ *
TĂNG CA
hoàn thành()
trở về
trở về
Hình 4-3 Lưu đồ và mã giả cho chương trình trả lương làm thêm giờ (tiếp theo)
Trang 4
(còn tiếp)
khởi đầu
Tuyên bố
tên chuỗi
num giờ
129
num RATE = 10,00
num WORK_WEEK = 40
num OVERTIME = 1,5
num trả
string QUIT = "ZZZ"
dọn phòng ()
trong khi tên <> QUIT
detailLoop ()
cuối cùng
hoàn thành()
dừng lại
dọn phòng ()
đầu ra "Chương trình này tính toán bảng lương dựa trên"
xuất "tỷ lệ làm thêm giờ của", OVERTIME, "sau", WORK_WEEK, "giờ".
đầu ra "Nhập tên nhân viên hoặc", QUIT, "để nghỉ việc >>"
tên đầu vào
trở về
detailLoop ()
đầu ra "Nhập giờ làm việc >>"
giờ đầu vào
nếu giờ> WORK_WEEK thì
pay = (WORK_WEEK * RATE) + (giờ - WORK_WEEK) * RATE * OVERTIME
khác
pay = giờ * RATE
endif
đầu ra "Thanh toán cho", tên, "là $", thanh toán
đầu ra "Nhập tên nhân viên hoặc", QUIT, "để nghỉ việc >>"
tên đầu vào
trở về
hoàn thành()
đầu ra "Hoàn thành tính toán lương làm thêm giờ"
trở về
Hình 4-3 Lưu đồ và mã giả cho chương trình trả lương làm thêm giờ
© 2015 Cengage Learning
Trong suốt cuốn sách này, nhiều ví dụ được trình bày ở cả dạng lưu đồ và dạng mã giả. Khi bạn
phân tích một giải pháp, ban đầu bạn có thể thấy dễ dàng hơn khi chỉ tập trung vào một trong hai công cụ thiết kế. Khi nào
bạn hiểu cách chương trình hoạt động bằng cách sử dụng một công cụ thiết kế (ví dụ: lưu đồ), bạn có thể xác nhận
rằng giải pháp giống hệt nhau bằng cách sử dụng công cụ khác.
Trang 5
Trong mô-đun detailLoop () của chương trình trong Hình 4-3, quyết định chứa hai mệnh đề:
Các if-then khoản là một phần của các quyết định chứa các hành động hoặc hành động mà
thực thi khi điều kiện đã kiểm tra trong quyết định là đúng. Trong ví dụ này, mệnh đề giữ
tính làm thêm giờ dài hơn.
Các điều khoản khác của quyết định là phần thực thi chỉ khi điều kiện thử nghiệm
trong quyết định là sai. Trong ví dụ này, mệnh đề chứa phép tính ngắn hơn.
Hình 4-4 cho thấy một thực thi mẫu của chương trình trong môi trường dòng lệnh.
Giá trị dữ liệu được nhập cho ba nhân viên. Hai nhân viên đầu tiên không làm việc
hơn 40 giờ, vì vậy lương của họ được hiển thị đơn giản là giờ nhân với 10 giờ. Thứ ba
nhân viên, tuy nhiên, đã làm thêm giờ một giờ và do đó, kiếm được 15 đô la cho lần cuối cùng
giờ thay vì $ 10.
Hình 4-4 Mẫu thực hiện chương trình trả lương làm thêm giờ trong Hình 4-3
Nhiều ngôn ngữ lập trình hiện đại hỗ trợ kiểu dữ liệu Boolean. Thay vì giữ số hoặc từ,
mỗi biến Boolean chỉ có thể chứa một trong hai giá trị — true hoặc false.
1. Mệnh đề if-then là một phần của quyết định được thực thi khi một
điều kiện trong một quyết định là đúng.
2. Mệnh đề else là một phần của quyết định được thực thi khi một điều kiện được kiểm tra
trong một quyết định là đúng.
3. Biểu thức Boolean là một biểu thức có giá trị đúng hoặc sai. 131
Cả hai toán hạng trong một biểu thức so sánh phải cùng kiểu dữ liệu; đó là, bạn có thể
so sánh các giá trị số với các giá trị số khác và chuỗi văn bản với các chuỗi khác. Một số
ngôn ngữ lập trình cho phép các ngoại lệ; ví dụ, bạn có thể so sánh một ký tự với
số sử dụng giá trị mã số của ký tự. Phụ lục A chứa thêm thông tin về
hệ thống mã hóa. Trong cuốn sách này, chỉ các toán hạng của cùng một kiểu dữ liệu mới được so sánh.
Trong bất kỳ biểu thức Boolean nào, hai giá trị được so sánh có thể là biến hoặc hằng.
Ví dụ: biểu thức Boolean currentTotal = 100 so sánh một biến,
currentTotal ,
thành một hằng số, 100. Tùy thuộc vào giá trị của currentTotal ,
biểu thức là đúng hay sai. Trong biểu thức currentTotal = beforeTotal , cả hai giá trị
là các biến và kết quả cũng đúng hoặc sai tùy thuộc vào các giá trị được lưu trữ trong mỗi
hai biến. Mặc dù nó hợp pháp, bạn sẽ không bao giờ sử dụng các biểu thức mà bạn so sánh
hai hằng số — ví dụ: 20 = 20 hoặc 30 = 40 . Biểu thức như vậy là biểu thức tầm thường
bởi vì mỗi cái sẽ luôn đánh giá cho cùng một kết quả: true cho 20 = 20 và false cho 30 = 40 .
Trang 7
= Toán tử tương đương Đánh giá là đúng khi các toán hạng của nó tương đương. Bởi vì
toán tử gán trong nhiều ngôn ngữ là
dấu, những ngôn ngữ đó thường sử dụng dấu bằng kép (==) như
toán tử tương đương để tránh nhầm lẫn với
toán tử gán.
132
> Lớn hơn Đánh giá là đúng khi toán hạng bên trái lớn hơn
nhà điều hành toán hạng bên phải.
< Toán tử nhỏ hơn Đánh giá là đúng khi toán hạng bên trái nhỏ hơn bên phải
toán hạng.
>= Lớn hơn hoặc- Đánh giá là đúng khi toán hạng bên trái lớn hơn hoặc
toán tử ngang bằng tương đương với toán hạng bên phải.
<= Ít hơn hoặc bằng Đánh giá là đúng khi toán hạng bên trái nhỏ hơn hoặc
nhà điều hành tương đương với toán hạng bên phải.
<> Toán tử không ngang bằng Đánh giá là đúng khi các toán hạng của nó không tương đương.
Một số ngôn ngữ sử dụng dấu chấm than theo sau là
dấu bằng (! =) làm toán tử không-bằng. Trong một lưu đồ hoặc
mã giả, bạn có thể thích sử dụng đại số không bằng-
để biểu tượng (≠) hoặc để đánh vần các từ "không bằng."
Một số ngôn ngữ yêu cầu các phép toán đặc biệt để so sánh các chuỗi, nhưng cuốn sách này sẽ giả sử
rằng các toán tử so sánh tiêu chuẩn hoạt động chính xác với các chuỗi dựa trên
giá trị bảng chữ cái. Ví dụ: so sánh "black" <"blue" sẽ được đánh giá là
true vì "black" đứng trước "blue" theo thứ tự bảng chữ cái. Thông thường, các biến chuỗi không
được coi là bằng nhau trừ khi chúng giống hệt nhau, bao gồm cả khoảng cách và liệu chúng
xuất hiện ở dạng chữ hoa hoặc chữ thường. Ví dụ: "bút đen" không bằng "bút đen",
“BÚT ĐEN” hoặc “Bút đen”.
Bất kỳ quyết định nào cũng có thể được thực hiện bằng cách sử dụng kết hợp chỉ ba loại so sánh: bằng nhau,
lớn hơn, và nhỏ hơn. Bạn không bao giờ cần ba phép so sánh bổ sung (lớn hơn
hoặc bằng nhau, nhỏ hơn hoặc bằng hoặc không bằng), nhưng việc sử dụng chúng thường đưa ra quyết định nhiều hơn
tiện lợi. Ví dụ: giả sử rằng bạn cần giảm giá 10% cho bất kỳ
khách hàng từ 65 tuổi trở lên và tính giá đầy đủ cho những khách hàng khác. Bạn có thể dùng
ký hiệu lớn hơn hoặc bằng để viết logic như sau:
Sử dụng các toán tử so sánh quan hệ
Trang 8
Để thay thế, hoặc nếu toán tử > = không tồn tại, bạn có thể diễn đạt tương tự 133
logic bằng cách viết:
nếu customerAge <65 thì
chiết khấu = 0
khác
chiết khấu = 0,10
endif
Trong bất kỳ quyết định nào mà a> = b là đúng, thì a <b là sai. Ngược lại, nếu a> = b sai, thì
a <b đúng. Bằng cách diễn đạt lại câu hỏi và hoán đổi các hành động được thực hiện dựa trên
kết quả, bạn có thể đưa ra quyết định giống nhau theo nhiều cách. Lộ trình rõ ràng nhất thường là hỏi
một câu hỏi để kết quả tích cực hoặc đúng dẫn đến hành động là động lực của bạn
làm bài kiểm tra. Khi chính sách công ty của bạn là “giảm giá cho những người 65 tuổi
trở lên ”, cụm từ lớn hơn hoặc bằng 65 xuất hiện trong tâm trí, vì vậy, điều tự nhiên nhất là
sử dụng. Ngược lại, nếu chính sách của bạn là "không cung cấp chiết khấu cho những người dưới 65 tuổi", thì đó là
tự nhiên để sử dụng cú pháp nhỏ hơn 65. Dù bằng cách nào, những người giống nhau đều được giảm giá.
So sánh hai số tiền để quyết định xem chúng có bằng nhau không là điều khó hiểu nhất trong số
tất cả các so sánh. Sử dụng không bằng trong các quyết định liên quan đến việc suy nghĩ theo hướng phủ định kép,
điều này có thể khiến bạn dễ mắc phải lỗi logic vào chương trình của mình. Ví dụ,
xem xét phân đoạn lưu đồ trong Hình 4-5.
Trong Hình 4-5, nếu giá trị của Mã khách hàng bằng 1, luồng logic đi theo nhánh sai
của vùng lựa chọn. Nếu Mã khách hàng <> 1 là true, chiết khấu là 0,25; nếu Mã khách hàng <> 1 thì không
đúng, nó có nghĩa là Mã khách hàng là 1 và chiết khấu là 0,50. Ngay cả khi đọc cụm từ “nếu
Mã khách hàng không bằng 1 là không đúng ”thật là khó xử.
Trang 9
Hình 4-6 cho thấy cùng một quyết định, lần này được hỏi sử dụng logic tích cực. Đưa ra quyết định
dựa trên Mã khách hàng rõ ràng hơn là cố gắng xác định Mã khách hàng không phải là gì.
134
chiết khấu = 0,25 chiết khấu = 0,50
Hình 4-6 Sử dụng phép so sánh dương tương đương với phép so sánh âm trong Hình 4-5
© 2015 Cengage Learning
Mặc dù so sánh tiêu cực có thể khó sử dụng, nhưng ý nghĩa của bạn đôi khi rõ ràng nhất khi sử dụng
chúng. Thông thường, điều này xảy ra khi bạn sử dụng if mà không có if khác, chỉ thực hiện hành động khi một số
so sánh là sai. Một ví dụ sẽ là:
1. Thông thường, bạn chỉ có thể so sánh các giá trị có cùng kiểu dữ liệu. 135
2. Một biểu thức Boolean được định nghĩa là một biểu thức quyết định xem hai giá trị
bằng nhau.
3. Trong bất kỳ biểu thức Boolean nào, hai giá trị được so sánh có thể là một trong hai biến
hoặc các hằng số.
Hiểu và logic
Thông thường, bạn cần đánh giá nhiều hơn một biểu thức để xác định xem một hành động có nên
diễn ra. Khi bạn đặt nhiều câu hỏi trước khi kết quả được xác định, bạn sẽ tạo ra một
điều kiện hợp chất . Ví dụ: giả sử bạn làm việc cho một công ty điện thoại di động tính phí
khách hàng như sau:
Thêm $ 20 được tính cho những khách hàng thực hiện tổng cộng hơn 100 cuộc gọi kéo dài
trong hơn 500 phút.
Logic cần thiết cho chương trình thanh toán này bao gồm quyết định VÀ — một quyết định kiểm tra
điều kiện với hai phần mà cả hai đều phải đánh giá là đúng để một hành động diễn ra. Trong này
trường hợp, phải thực hiện cả số lượng cuộc gọi tối thiểu và số phút tối thiểu
phải được sử dụng trước khi khách hàng bị tính phí bảo hiểm. Một quyết định sử dụng một
Điều kiện AND có thể được xây dựng bằng cách sử dụng một quyết định lồng nhau hoặc lồng nhau nếu — nghĩa là,
quyết định trong điều khoản if-then hoặc else của một quyết định khác. Lần đầu tiên bạn biết về
cấu trúc lồng nhau trong Chương 3. Bạn luôn có thể xếp chồng và lồng ghép bất kỳ cấu trúc nào trong ba cấu trúc cơ bản
cấu trúc. Một loạt các câu lệnh if lồng nhau còn được gọi là một câu lệnh if xếp tầng . Các
lưu đồ và mã giả cho chương trình xác định các khoản phí cho khách hàng là
được hiển thị trong Hình 4-7.
Trang 11
Tuyên bố
num customerId đầu ra "Thanh toán qua điện thoại
trở về
dọn phòng ()
hoàn thành()
Không
detailLoop ()
dừng lại
Không Đúng
callMade>
CUỘC GỌI?
customerBill =
customerBill +
CAO CẤP
trở về
Hình 4-7 Lưu đồ và mã giả cho chương trình thanh toán điện thoại di động (tiếp theo)
Trang 12
(còn tiếp)
khởi đầu
Tuyên bố
num customerId
num callMade
137
num callMinutes
num customerBill
num CALLS = 100
num MINUTES = 500
num BASIC_SERVICE = 30,00
num PREMIUM = 20,00
dọn phòng ()
trong khi không có
detailLoop ()
cuối cùng
hoàn thành()
dừng lại
dọn phòng ()
xuất "Máy tính thanh toán qua điện thoại"
input customerId, callMade, callMinutes
trở về
detailLoop ()
customerBill = BASIC_SERVICE
if callMade> CALLS then
nếu callMinutes> MINUTES thì
customerBill = customerBill + PREMIUM
endif
endif
đầu ra customerId, callMade, "các cuộc gọi đã thực hiện; đã sử dụng",
callMinutes, "phút. Tổng hóa đơn $", customerBill
input customerId, callMade, callMinutes
trở về
hoàn thành()
đầu ra "Chương trình đã kết thúc"
trở về
Hình 4-7 Lưu đồ và mã giả cho chương trình thanh toán điện thoại di động
© 2015 Cengage Learning
Logic của chương trình thanh toán điện thoại di động giả định rằng dữ liệu khách hàng được truy xuất từ một tệp. Điều này
loại bỏ sự cần thiết của lời nhắc và giữ cho chương trình ngắn hơn để bạn có thể tập trung vào quyết định-
quá trình làm nên. Nếu đây là một chương trình tương tác, bạn sẽ sử dụng dấu nhắc trước mỗi câu lệnh nhập.
Chương 7 trình bày về xử lý tệp và giải thích một số bước bổ sung mà bạn có thể thực hiện khi làm việc với tệp.
Trong Hình 4-7, các biến và hằng số thích hợp được khai báo, sau đó
mô-đun housekeeping () hiển thị tiêu đề giới thiệu và nhận tập dữ liệu đầu vào đầu tiên.
Sau khi điều khiển trở lại logic dòng chính, điều kiện eof được kiểm tra và nếu mục nhập dữ liệu không
Trang 13
hoàn tất, mô-đun detailLoop () thực thi. Trong mô-đun detailLoop () , khách hàng
hóa đơn được đặt thành phí tiêu chuẩn, và sau đó quyết định lồng vào nhau sẽ thực thi. Trong cấu trúc if lồng nhau
trong Hình 4-7, biểu thức callMade> CALLS được đánh giá đầu tiên. Nếu biểu thức này là đúng,
chỉ khi đó biểu thức Boolean thứ hai ( callMinutes> MINUTES) mới được đánh giá. Nếu điều đó
biểu thức cũng đúng, sau đó phí bảo hiểm $ 20 được thêm vào hóa đơn của khách hàng. Nếu một trong hai
các điều kiện đã thử nghiệm là sai, giá trị hóa đơn của khách hàng không bao giờ bị thay đổi, vẫn giữ nguyên giá trị ban đầu
đã gán giá trị BASIC_SERVICE là $ 30.
Hầu hết các ngôn ngữ cho phép bạn sử dụng một biến thể của cấu trúc lựa chọn được gọi là cấu trúc trường hợp khi bạn
phải lồng một loạt các quyết định về một biến hoặc biểu thức duy nhất. Phụ lục D chứa thông tin về
cấu trúc trường hợp.
Ví dụ: Hình 4-8 cho thấy hai cách để thiết kế cấu trúc quyết định lồng nhau
ấn định phí bảo hiểm cho các hóa đơn của khách hàng nếu họ thực hiện hơn 100 cuộc gọi điện thoại di động và
sử dụng hơn 500 phút trong thời hạn thanh toán. Chương trình có thể hỏi về các cuộc gọi đã thực hiện
trước tiên, loại bỏ những khách hàng không kiếm được nhiều hơn mức tối thiểu, sau đó yêu cầu
về số phút chỉ được sử dụng cho những khách hàng vượt qua (nghĩa là, được đánh giá là đúng vào ngày)
kiểm tra cuộc gọi tối thiểu. Hoặc, chương trình có thể hỏi về số phút trước, loại bỏ
những người không đủ điều kiện, sau đó hỏi về số lượng cuộc gọi chỉ dành cho khách hàng
ai vượt qua bài kiểm tra biên bản. Dù bằng cách nào, chỉ những khách hàng vượt quá cả hai giới hạn mới phải thanh toán
phí bảo hiểm. Nó có tạo ra sự khác biệt mà câu hỏi được hỏi đầu tiên không? Xa như
kết quả đi, không. Dù bằng cách nào, cùng một khách hàng trả phí bảo hiểm — những người đủ điều kiện trên
cơ sở của cả hai tiêu chí. Tuy nhiên, về mức độ hiệu quả của chương trình, nó có thể làm cho
khác biệt câu hỏi nào được hỏi trước.
Trang 14
Hiểu và logic
customerBill =
customerBill +
CAO CẤP
customerBill =
customerBill +
CAO CẤP
Hình 4-8 Hai cách tạo hóa đơn điện thoại di động sử dụng các tiêu chí giống nhau
© 2015 Cengage Learning
Giả sử rằng bạn biết rằng trong số 1000 khách hàng sử dụng điện thoại di động, khoảng 90%, hoặc 900,
hơn 100 cuộc gọi trong thời hạn thanh toán. Giả sử rằng bạn cũng biết rằng chỉ khoảng một nửa
1000 khách hàng, hoặc 500, sử dụng hơn 500 phút thời gian gọi.
Nếu bạn sử dụng logic được hiển thị đầu tiên trong Hình 4-8 và bạn cần tạo ra 1000 hóa đơn điện thoại,
câu hỏi đầu tiên, callMade> CALLS , sẽ thực hiện 1000 lần. Đối với khoảng 90 phần trăm của
khách hàng, hoặc 900 người trong số họ, câu trả lời là đúng, vì vậy 100 khách hàng bị loại khỏi
Trang 15
bài tập cao cấp, và 900 chuyển sang câu hỏi tiếp theo về số phút đã sử dụng. Chỉ có
khoảng một nửa số khách hàng sử dụng hơn 500 phút, vì vậy 450 trong số 900 người trả phí bảo hiểm, và
cần 1900 quyết định để xác định chúng.
Sử dụng logic thay thế được hiển thị thứ hai trong Hình 4-8, câu hỏi đầu tiên, callMinutes>
MINUTES , cũng sẽ được hỏi 1000 lần — một lần cho mỗi khách hàng. Bởi vì chỉ khoảng một nửa
khách hàng sử dụng số phút cao, chỉ 500 người sẽ vượt qua bài kiểm tra này và tiếp tục
câu hỏi cho số lượng cuộc gọi được thực hiện. Sau đó, khoảng 90% trong số 500, hoặc 450 khách hàng, sẽ
vượt qua bài kiểm tra thứ hai và được thanh toán số tiền phí bảo hiểm. Trong trường hợp này, cần 1500 quyết định để
xác định 450 khách hàng trả phí bảo hiểm.
Cho dù bạn sử dụng thứ tự quyết định đầu tiên hay thứ hai trong Hình 4-8, thì 450 khách hàng giống nhau
người đáp ứng cả hai tiêu chí trả phí bảo hiểm. Sự khác biệt là khi bạn hỏi về
số lượng cuộc gọi đầu tiên, chương trình phải đưa ra quyết định nhiều hơn 400 so với khi bạn hỏi về
phút được sử dụng đầu tiên.
Sự khác biệt 400 quyết định giữa cách sắp xếp thứ nhất và thứ hai trong Hình 4-8 không
mất nhiều thời gian trên hầu hết các máy tính. Nhưng phải mất một thời gian, và nếu một công ty có
hàng trăm nghìn khách hàng thay vì chỉ 1000 hoặc nếu nhiều quyết định như vậy phải
được thực hiện trong một chương trình, hiệu suất (thời gian thực hiện) có thể được cải thiện đáng kể bằng cách
đưa ra quyết định theo thứ tự hiệu quả hơn.
Thường thì khi bạn phải đưa ra các quyết định lồng ghép, bạn không biết sự kiện nào có nhiều khả năng xảy ra
xảy ra; trong trường hợp đó, bạn có thể đặt một trong hai câu hỏi một cách hợp pháp trước. Tuy nhiên, nếu bạn biết
xác suất của các điều kiện, hoặc có thể đưa ra một phỏng đoán hợp lý, quy tắc chung là: Trong AND
quyết định, trước tiên hãy hỏi câu hỏi ít có khả năng đúng hơn. Điều này giúp loại bỏ càng nhiều trường hợp
quyết định thứ hai càng tốt, giúp tăng tốc thời gian xử lý.
Xem video Viết các lựa chọn lồng nhau hiệu quả.
Khi bạn sử dụng một hoặc nhiều toán tử AND để kết hợp hai hoặc nhiều biểu thức Boolean, mỗi
Biểu thức boolean phải đúng để toàn bộ biểu thức được đánh giá là đúng. Đối với
ví dụ, nếu bạn hỏi, "Bạn có phải là công dân Hoa Kỳ sinh ra ở bản địa và bạn có ít nhất 35 tuổi không?",
câu trả lời cho cả hai phần của câu hỏi phải là có trước khi câu trả lời có thể là một câu trả lời,
tóm lại là có. Nếu một trong hai phần của biểu thức là sai, thì toàn bộ biểu thức là sai.
Trang 16
Toán tử AND có điều kiện trong Java, C ++ và C # bao gồm hai dấu và, không có dấu cách giữa
chúng (&&). Trong Visual Basic, bạn sử dụng từ khóa Và.
Một công cụ có thể giúp bạn hiểu toán tử AND là bảng sự thật. Bảng sự thật là
141
sơ đồ được sử dụng trong toán học và logic để giúp mô tả sự thật của toàn bộ biểu thức
dựa trên sự thật của các bộ phận của nó. Tham chiếu nhanh 4-3 chứa một bảng sự thật liệt kê tất cả
khả năng với toán tử AND. Như bảng hiển thị, đối với hai biểu thức x và y bất kỳ ,
biểu thức x AND y chỉ đúng nếu cả x và y đều đúng riêng lẻ. Nếu chỉ có x hoặc y thì
false, hoặc nếu cả hai đều false, thì biểu thức x AND y là false.
Nếu ngôn ngữ lập trình bạn sử dụng cho phép toán tử AND , bạn phải nhận ra rằng câu hỏi
bạn đặt đầu tiên (bên trái toán tử AND ) là người sẽ được hỏi đầu tiên và các trường hợp
bị loại dựa trên câu hỏi đầu tiên sẽ không chuyển sang câu hỏi thứ hai. Trong khác
các từ, mỗi phần của biểu thức sử dụng toán tử AND chỉ được đánh giá khi cần thiết
để xác định xem toàn bộ biểu thức là đúng hay sai. Tính năng này được gọi là ngắn mạch
sự đánh giá . Máy tính chỉ có thể hỏi một câu hỏi tại một thời điểm; ngay cả khi mã giả của bạn
trông giống như ví dụ đầu tiên trong Hình 4-9, máy tính sẽ thực thi logic được hiển thị trong
ví dụ thứ hai. Ngay cả khi bạn sử dụng toán tử AND , máy tính sẽ đưa ra quyết định lần lượt
thời gian và thực hiện chúng theo thứ tự bạn yêu cầu. Như bạn có thể thấy trong bảng sự thật, nếu cái đầu tiên
câu hỏi trong biểu thức AND được đánh giá là false, sau đó toàn bộ biểu thức là false. Trong đó
trường hợp này, không có ích lợi gì khi đánh giá biểu thức Boolean thứ hai. Nói cách khác, đánh giá
một biểu thức AND bị ngắt ngay khi một phần của nó được xác định là sai.
Bạn không bao giờ bắt buộc phải sử dụng toán tử AND vì sử dụng các câu lệnh if lồng nhau có thể
luôn đạt được cùng một kết quả. Tuy nhiên, việc sử dụng toán tử AND thường làm cho mã của bạn nhiều hơn
ngắn gọn, ít mắc lỗi và dễ hiểu hơn.
Trang 17
callMade>
Không CUỘC GỌI VÀ Đúng
142 callMinutes>
PHÚT?
customerBill =
customerBill +
CAO CẤP
customerBill =
customerBill +
CAO CẤP
Có thể có sự nhầm lẫn giữa các thuật ngữ điều kiện và toán tử logic. Toán tử có điều kiện là
thường được sử dụng nhất khi đánh giá ngắn mạch có hiệu lực, nhưng đôi khi bạn sẽ nghe thấy các lập trình viên sử dụng
hai thuật ngữ thay thế cho nhau. Để làm phức tạp vấn đề, một số lập trình viên gọi các toán tử là điều kiện
toán tử logic.
Trang 18
100 cuộc gọi và 500 phút trong một chu kỳ thanh toán, sau đó phân đoạn chương trình được hiển thị trong Hình 4-10
chứa ba loại lỗi logic khác nhau.
Hình 4-10 Lôgic không chính xác khi thêm $ 20 phí bảo hiểm vào hóa đơn của những khách hàng sử dụng điện thoại di động gặp
hai tiêu chí
© 2015 Cengage Learning
Logic trong Hình 4-10 cho thấy rằng nếu một khách hàng thực hiện quá nhiều cuộc gọi, thì $ 20 sẽ được cộng vào
hóa đơn. Khách hàng này không nhất thiết phải được tính thêm tiền vì số phút của khách hàng
có thể thấp. Ngoài ra, trong Hình 4-10, một khách hàng đã thực hiện ít cuộc gọi không bị loại
từ quyết định thứ hai. Thay vào đó, tất cả khách hàng phải chịu câu hỏi về biên bản, và
Trang 19
một số được ấn định phí bảo hiểm mặc dù họ có thể chỉ thực hiện một vài cuộc gọi.
Ngoài ra, bất kỳ khách hàng nào vượt qua cả hai bài kiểm tra vì cuộc gọi và số phút của anh ta đều cao
phí bảo hiểm đã được thêm vào hóa đơn của anh ta hai lần. Các quyết định trong Hình 4-10 được xếp chồng lên nhau khi chúng
nên được lồng vào nhau, vì vậy logic mà chúng biểu diễn không đúng cho vấn đề này.
Để rõ ràng, bạn có thể bao gồm mỗi biểu thức Boolean trong một biểu thức ghép trong tập hợp riêng của nó
của dấu ngoặc đơn. Điều này giúp bạn dễ dàng thấy rằng mỗi toán hạng của toán tử AND là một
hoàn thành biểu thức Boolean. Sử dụng định dạng này nếu nó rõ ràng hơn đối với bạn. Ví dụ, bạn có thể
Viết như sau:
if (callMinutes> MINUTES) AND (callMade> CALLS) thì
customerBill = customerBill + PREMIUM
endif
Đảm bảo rằng các Biểu thức không Vô tình Tầm thường
Khi bạn sử dụng toán tử AND , rất dễ vô tình tạo ra các biểu thức tầm thường
luôn luôn đúng hoặc luôn luôn sai. Ví dụ: giả sử rằng bạn muốn hiển thị một thông báo nếu một ô
khách hàng điện thoại không thực hiện cuộc gọi và nếu khách hàng thực hiện hơn 2000 cuộc gọi. Bạn có thể
bị cám dỗ để viết biểu thức sau, nhưng nó sẽ không chính xác:
nếu cuộc gọiMade = 0 VÀ cuộc gọiMade> 2000 thì
đầu ra "Sử dụng không thường xuyên" Đừng làm điều đó
endif Biểu thức AND này là
luôn luôn giả dối.
Câu lệnh if này không bao giờ dẫn đến một thông báo được hiển thị vì cả hai phần của AND
biểu thức không bao giờ có thể đúng cùng một lúc. Ví dụ: nếu giá trị của callMade hết
2000, giá trị của nó không phải là 0 và nếu callMade là 0, nó không quá 2000. Lập trình viên dự định
sử dụng mã sau:
nếu callMade = 0 thì
đầu ra "Sử dụng không thường xuyên"
khác
nếu cuộc gọiMade> 2000 thì
đầu ra "Sử dụng không thường xuyên"
endif
endif
Ngoài ra, người lập trình có thể sử dụng toán tử OR , như bạn sẽ thấy trong phần tiếp theo.
Trang 20
1. Khi bạn lồng các cấu trúc lựa chọn vì hành động kết quả yêu cầu
rằng hai điều kiện là đúng, một trong hai quyết định hợp lý có thể được đưa ra trước
và kết quả sẽ giống nhau.
2. Khi cần có hai lựa chọn để một hành động diễn ra, bạn thường có thể
cải thiện hiệu suất chương trình của bạn bằng cách chọn phù hợp
lựa chọn để thực hiện đầu tiên.
3. Để cải thiện hiệu quả trong một lựa chọn lồng nhau, trong đó hai điều kiện phải
đúng đối với một số hành động xảy ra, trước tiên bạn nên đặt câu hỏi
có khả năng là sự thật.
Ví dụ: giả sử công ty điện thoại di động đã thiết lập một biểu phí mới như sau:
Hóa đơn dịch vụ cơ bản hàng tháng là $ 30.
Thêm $ 20 được tính cho những khách hàng thực hiện hơn 100 cuộc gọi hoặc gửi nhiều hơn
hơn 200 tin nhắn văn bản.
Hình 4-11 cho thấy mô-đun detailLoop () đã thay đổi của chương trình thanh toán hoàn thành
mục tiêu này. Giả sử rằng các khai báo mới đã được thực hiện cho biến textSent và
một văn bản liên tục đã được gán giá trị 200.
Trang 21
detailLoop ()
customerBill =
146 BASIC_SERVICE
trở về
detailLoop ()
customerBill = BASIC_SERVICE
if callMade> CALLS then
customerBill = customerBill + PREMIUM
khác
if textSent> TEXTS then
customerBill = customerBill + PREMIUM
endif
endif
đầu ra customerId, callMade, "các cuộc gọi được thực hiện;",
textSent, "đã gửi tin nhắn. Tổng hóa đơn $", customerBill
input customerId, callMade, textSent
trở về
Hình 4-11 Lưu đồ và mã giả cho chương trình thanh toán điện thoại di động mà khách hàng phải đáp ứng
một hoặc cả hai tiêu chí để được tính phí bảo hiểm
© 2015 Cengage Learning
Trang 22
Chi tiếtLoop () trong chương trình trong Hình 4-11 kiểm tra các cuộc gọi biểu thứcMade> CALLS ,
và nếu kết quả là đúng, số tiền phí bảo hiểm sẽ được cộng vào hóa đơn của khách hàng. Bởi vì làm
nhiều cuộc gọi là đủ để khách hàng phải trả phí bảo hiểm, không cần thêm
nghi vấn. Nếu khách hàng chưa thực hiện hơn 100 cuộc gọi, chỉ khi đó chương trình mới thực hiện
cần hỏi liệu văn bản> TEXTS có đúng không. Nếu khách hàng không thực hiện hơn 100 cuộc gọi,
nhưng đã gửi hơn 200 tin nhắn văn bản, sau đó số tiền đặc biệt được thêm vào
hóa đơn của khách hàng.
CUỘC GỌI?
LỪA ĐẢO?
customerBill =
customerBill +
customerBill = CAO CẤP
customerBill +
CAO CẤP
Hình 4-12 Hai cách để ấn định phí bảo hiểm cho các hóa đơn của những khách hàng đáp ứng một trong hai
tiêu chí (còn tiếp)
Trang 23
(còn tiếp)
LỪA ĐẢO?
148
Không Đúng
callMade>
CUỘC GỌI?
customerBill =
customerBill +
customerBill = CAO CẤP
customerBill +
CAO CẤP
Hình 4-12 Hai cách để ấn định phí bảo hiểm cho các hóa đơn của khách hàng đáp ứng một trong hai tiêu chí
© 2015 Cengage Learning
Bạn có thể đoán rằng một trong những giải pháp này vượt trội hơn giải pháp kia khi bạn có
một số thông tin cơ bản về khả năng xảy ra tương đối của mỗi điều kiện được thử nghiệm. Đối với
ví dụ: giả sử bạn biết rằng trong số 1000 khách hàng sử dụng điện thoại di động, khoảng 90% hoặc 900
thực hiện hơn 100 cuộc gọi trong thời hạn thanh toán. Giả sử rằng bạn cũng biết rằng chỉ khoảng một nửa
trong số 1000 khách hàng, hoặc 500, gửi hơn 200 tin nhắn văn bản.
Khi bạn sử dụng logic được hiển thị trong nửa đầu của Hình 4-12, trước tiên bạn hỏi về các lệnh gọi
thực hiện. Đối với 900 khách hàng, câu trả lời là đúng và bạn thêm phí bảo hiểm vào hóa đơn của họ. Chỉ có
khoảng 100 bộ dữ liệu khách hàng tiếp tục đến câu hỏi tiếp theo liên quan đến tin nhắn văn bản,
trong đó khoảng 50 phần trăm trong số 100 hoặc 50, được lập hóa đơn cho số tiền bổ sung. Cuối cùng, bạn có
đã đưa ra 1100 quyết định bổ sung chính xác số tiền bảo hiểm cho 950 khách hàng.
Nếu bạn sử dụng logic HOẶC trong nửa sau của Hình 4-12, trước tiên bạn hỏi về tin nhắn văn bản—
1000 lần, mỗi lần cho 1000 khách hàng. Kết quả đúng với 50% hoặc 500 khách hàng,
hóa đơn của ai được tăng lên. Đối với 500 khách hàng khác, bạn hỏi về số lượng cuộc gọi đã thực hiện.
Đối với 90 phần trăm trong số 500, kết quả là đúng, vì vậy phí bảo hiểm sẽ được cộng thêm cho 450 người khác.
Cuối cùng, cùng 950 khách hàng được tính thêm $ 20 — nhưng phương pháp này yêu cầu
thực hiện 1500 quyết định, nhiều hơn 400 quyết định so với khi sử dụng logic quyết định đầu tiên.
Trang 24
Nguyên tắc chung là: Trong một quyết định HOẶC, trước tiên hãy đặt câu hỏi có nhiều khả năng đúng hơn. Điều này
phương pháp tiếp cận loại bỏ càng nhiều lần thực thi quyết định thứ hai càng tốt và thời gian
cần xử lý tất cả dữ liệu bị giảm. Đối với tình huống VÀ, trong tình huống HOẶC, nó là
hiệu quả hơn để loại bỏ nhiều quyết định bổ sung nhất có thể.
149
Sử dụng Toán tử HOẶC
Nếu bạn cần thực hiện hành động khi một trong hai điều kiện được đáp ứng, bạn có thể sử dụng
hai cấu trúc lựa chọn lồng nhau, riêng biệt, như trong các ví dụ trước. Tuy nhiên, hầu hết
ngôn ngữ lập trình cho phép bạn đưa ra hai hoặc nhiều quyết định trong một lần so sánh
sử dụng toán tử OR có điều kiện (hoặc đơn giản là toán tử OR ). Ví dụ, bạn có thể hỏi
câu hỏi sau:
cuộc gọi Tạo> CUỘC GỌI HOẶC tin nhắn Đã gửi> TEXTS
Khi bạn sử dụng toán tử OR lôgic , chỉ một trong các điều kiện được liệt kê phải được đáp ứng cho
kết quả là hành động sẽ diễn ra. Tham chiếu nhanh 4-4 chứa bảng chân trị cho OR
nhà điều hành. Như bạn có thể thấy trong bảng, toàn bộ biểu thức x OR y chỉ sai khi x và y
mỗi cái đều sai riêng lẻ.
Nếu ngôn ngữ lập trình bạn sử dụng hỗ trợ toán tử OR , bạn vẫn phải nhận ra rằng
so sánh bạn đặt đầu tiên là biểu thức sẽ được đánh giá đầu tiên và các trường hợp vượt qua
thử nghiệm của phép so sánh đầu tiên sẽ không tiến hành phép so sánh thứ hai. Như với AND
, đặc điểm này được gọi là đoản mạch. Máy tính chỉ có thể hỏi một câu hỏi tại một
thời gian; ngay cả khi bạn viết mã như thể hiện ở đầu Hình 4-13, máy tính sẽ thực thi
logic được hiển thị ở dưới cùng.
Trang 25
nếu cuộc gọi Tạo> GỌI HOẶC nhắn tin Gửi> TEXTS thì
customerBill = customerBill + PREMIUM
callMade> endif
Không Đúng
CUỘC GỌI HOẶC
150 văn bản Đã gửi>
LỪA ĐẢO?
customerBill =
customerBill +
CAO CẤP
CUỘC GỌI?
LỪA ĐẢO?
customerBill =
customerBill +
customerBill = CAO CẤP
customerBill +
CAO CẤP
C #, C ++, C và Java sử dụng hai ký hiệu ống (||) làm toán tử OR logic. Trong Visual Basic, từ khóa được sử dụng
đối với nhà điều hành là Hoặc.
Bạn có thể nhận thấy rằng câu lệnh gán customerBill = customerBill +
PREMIUM xuất hiện hai lần trong quá trình ra quyết định trong Hình 4-12 và 4-13. Khi bạn
tạo một lưu đồ, sự cám dỗ là vẽ logic để trông giống như Hình 4-14. Về mặt logic, bạn
có thể lập luận rằng sơ đồ trong Hình 4-14 là đúng vì khách hàng chính xác là
đã thanh toán thêm $ 20. Tuy nhiên, lưu đồ này không có cấu trúc. Câu hỏi thứ hai không phải là
cấu trúc khép kín với một điểm vào và ra; thay vào đó, dòng chảy thoát ra khỏi
cấu trúc lựa chọn bên trong để tham gia bên Có của cấu trúc lựa chọn bên ngoài.
customerBill =
Không văn bản Đã gửi> Đúng
customerBill +
LỪA ĐẢO?
CAO CẤP
Hình 4-14 Lưu đồ không có cấu trúc để xác định hóa đơn điện thoại di động của khách hàng
© 2015 Cengage Learning
Đảm bảo rằng bạn sử dụng HOẶC lựa chọn khi chúng được yêu cầu
Lựa chọn HOẶC có khả năng xảy ra lỗi bổ sung do sự khác biệt trong cách mọi người
và máy tính sử dụng ngôn ngữ. Khi sếp của bạn muốn thêm một số tiền vào các hóa đơn của
những khách hàng thực hiện hơn 100 cuộc gọi hoặc gửi hơn 200 tin nhắn, có khả năng cô ấy sẽ nói,
“Thêm $ 20 vào hóa đơn của bất kỳ ai thực hiện hơn 100 cuộc gọi và cho bất kỳ ai gửi nhiều hơn
hơn 200 văn bản. ” Yêu cầu của cô ấy chứa từ và giữa hai loại người — những người
đã thực hiện nhiều cuộc gọi và những người đã gửi nhiều tin nhắn — đặt trọng tâm vào người dân.
Trang 27
Tuy nhiên, mỗi quyết định bạn đưa ra có khoảng 20 đô la cộng thêm cho một khách hàng đã gặp
tiêu chí này hoặc tiêu chí kia hoặc cả hai. Nói cách khác, điều kiện OR nằm giữa mỗi
thuộc tính của khách hàng chứ không phải giữa các khách hàng khác nhau. Thay vì trước đó của người quản lý
tuyên bố, sẽ rõ ràng hơn nếu cô ấy nói, "Thêm 20 đô la vào hóa đơn của bất kỳ ai đã kiếm được nhiều hơn
hơn 100 cuộc gọi hoặc đã gửi hơn 200 tin nhắn, ”nhưng bạn không thể tin tưởng vào những người nói như
máy vi tính. Là một lập trình viên, bạn có công việc làm rõ những gì thực sự đang được yêu cầu.
Thông thường, một yêu cầu thông thường cho A và B về mặt logic có nghĩa là một yêu cầu cho A hoặc B.
Đảm bảo rằng các Biểu thức không Vô tình Tầm thường
ThewayweuseEnglishcanca Buồn nôn Anothertypeoferrorwhenyouarerequiredtofindwhetheravalue
Hai giá trị khác, ví dụ, một người quản lý rạp chiếu phim có thể nói, “Cấp phép
cho khách hàng là những người dưới 13 tuổi và những người trên 64 tuổi; nếu không, hãy tính phí
fullprice. ”Becausethemanagerhasusedthewordandintherequest, youmightbetemptedtocreate
quyết định thể hiện trong Hình 4-15; tuy nhiên, logic này sẽ không cung cấp giá chiết khấu cho bất kỳ
phimmoatron.YoumustrememberthateverytimethedecisionismadeinFigure4-15, itismadefora
người bảo trợ phim duy nhất. Nếu patronAge chứa giá trị thấp hơn 13, thì nó không thể chứa
valueover 64. Tương tự, nếu patronAge chứa giá trị trên 64, không có cách nào nó có thể chứa giá trị nhỏ hơn
giá trị. Do đó, không có giá trị nào có thể được lưu trữ trong patronAge mà cả hai phần của điều kiện AND
couldbetrue — và giá sẽ không bao giờ được đặt thành giá chiết khấu cho bất kỳ khách hàng nào. Nói cách khác,
quyết định được đưa ra trong Hình 4-15 là không đáng kể. Hình 4-16 cho thấy logic chính xác.
giá cả = giá cả =
GIÁ ĐẦY ĐỦ DISCOUNTED_PRICE
Hình 4-15 Lôgic không chính xác cố gắng giảm giá cho khách hàng cũ và trẻ tuổi
© 2015 Cengage Learning
Trang 28
Các tuyên bố quan trọng:
num patronAge
giá num
num MIN_AGE = 13 153
num MAX_AGE = 64
num FULL_PRICE = 8,50
num DISCOUNTED_PRICE = 6,00
patronAge <
Không MIN_AGE HOẶC Đúng
patronAge>
MAX_AGE?
Hình 4-16 Lôgic chính xác cung cấp chiết khấu cho khách hàng cũ và trẻ tuổi
© 2015 Cengage Learning
Một lỗi tương tự có thể xảy ra trong logic của bạn nếu người quản lý rạp hát nói điều gì đó như, "Đừng
giảm giá — nghĩa là tính toàn bộ giá — nếu khách hàng quen trên 12 tuổi hoặc dưới 65 tuổi. ” Bởi vì
từ hoặc xuất hiện trong yêu cầu, bạn có thể lập kế hoạch logic của mình giống như Hình 4-17. Không
khách hàng quen từng được giảm giá vì mọi khách hàng quen đều trên 12 tuổi hoặc dưới 65 tuổi.
Hãy nhớ rằng, trong một quyết định HOẶC, chỉ một trong các điều kiện cần đúng cho toàn bộ
biểu thức được đánh giá là đúng. Vì vậy, ví dụ: vì một khách hàng quen 10 tuổi, dưới 65 tuổi,
giá đầy đủ đã được tính và vì một khách hàng quen 70 tuổi trên 12 tuổi, giá đầy đủ cũng là
tính phí. Hình 4-18 cho thấy logic chính xác cho quyết định này.
Trang 29
Các tuyên bố quan trọng:
num patronAge
giá num
154 num MIN_AGE = 12
num MAX_AGE = 65
num FULL_PRICE = 8,50
num DISCOUNTED_PRICE = 6,00
Đừng làm điều đó nếu patronAge> MIN_AGE HOẶC patronAge <MAX_AGE thì
giá = FULL_PRICE
Mọi khách hàng quen trên 12 tuổi hoặc
khác
dưới 65. Ví dụ, a
giá = DISCOUNTED_PRICE
90 tuổi trên 12 và một
endif
Trẻ 3 tuổi dưới 65 tuổi.
patronAge>
Không MIN_AGE HOẶC Đúng
patronAge <
MAX_AGE?
patronAge>
Không MIN_AGE VÀ Đúng
patronAge <
MAX_AGE?
giá cả =
giá = FULL_PRICE
DISCOUNTED_PRICE
Hình 4-18 Lôgic đúng tính giá đầy đủ cho những khách hàng quen trên 12 tuổi và dưới 65 tuổi
© 2015 Cengage Learning
1. Trong một lựa chọn HOẶC, hai hoặc nhiều điều kiện phải được đáp ứng để cho một sự kiện
diễn ra.
2. Khi bạn sử dụng lựa chọn HOẶC, bạn có thể chọn đặt câu hỏi trước và
vẫn đạt được một chương trình có thể sử dụng được.
3. Nguyên tắc chung là: Trong một quyết định HOẶC, trước tiên hãy hỏi câu hỏi có nhiều khả năng
là sự thật.
Trang 31
Ví dụ này sử dụng dấu ngoặc đơn xung quanh biểu thức tuổi <18 để chỉ ra rằng toán tử NOT
áp dụng cho toàn bộ biểu thức Boolean tuổi <18 . Không có dấu ngoặc đơn, một số ngôn ngữ
có thể cố gắng đánh giá biểu thức KHÔNG tuổi trước khi thử nghiệm so sánh nhỏ hơn.
Tùy thuộc vào ngôn ngữ lập trình, kết quả sẽ không chính xác hoặc
tuyên bố sẽ không thực hiện ở tất cả.
Tham chiếu nhanh 4-5 chứa bảng chân trị cho toán tử NOT . Như bạn có thể thấy, bất kỳ
biểu thức sẽ đúng nếu không có toán tử sẽ trở thành sai với nó và bất kỳ biểu thức nào
điều đó sẽ là sai nếu không có toán tử trở thành đúng với nó.
THAM KHẢO NHANH 4-5 Bảng chân lý cho người KHÔNG phải toán tử
x? KHÔNG phải x?
Thật Sai
Sai Thật
Bạn đã biết rằng các toán tử số học như + và -, và các toán tử quan hệ
chẳng hạn như> và <, là các toán tử nhị phân yêu cầu hai toán hạng. Không giống như các toán tử đó,
Toán tử NOT là toán tử một ngôi , có nghĩa là nó chỉ cần một toán hạng — nghĩa là bạn không sử dụng
nó nằm giữa hai biểu thức, nhưng bạn sử dụng nó trước một biểu thức duy nhất.
Như khi sử dụng toán tử so sánh nhị phân không ngang bằng, sử dụng toán tử NOT một bậc có thể
tạo ra các tuyên bố khó hiểu vì logic phủ định rất khó theo dõi. Ví dụ, nếu
ý định không cho phép đăng ký cử tri cho những người dưới 18 tuổi, sau đó một trong hai
câu lệnh sẽ hoàn thành mục tiêu của bạn, nhưng câu thứ hai dễ hiểu hơn:
nếu KHÔNG (tuổi <18) thì
đầu ra "Có thể đăng ký bình chọn"
endif
Giả sử rằng một nhân viên đang ở Bộ phận 1, và do đó sẽ không có thông báo nào được hiển thị.
Biểu thức workerDept = 1 được đánh giá là sai, vì vậy KHÔNG phải workerDept = 1 là đúng.
Bởi vì toán hạng bên trái của toán tử OR là true, toàn bộ biểu thức Boolean là true, và
thông báo hiển thị không chính xác. Quyết định đúng như sau:
nếu KHÔNG (workerDept = 1 HOẶC staffDept = 2) thì
đầu ra "Nhân viên không thuộc Bộ phận 1 hoặc 2"
endif
Trong C ++, Java và C #, dấu chấm than là ký hiệu được sử dụng cho toán tử NOT. Trong các ngôn ngữ đó,
dấu chấm than có thể được sử dụng trước một biểu thức hoặc kết hợp với các toán tử so sánh khác.
Ví dụ, biểu thức a không bằng b có thể được viết dưới dạng! (A = b) hoặc a! = B. Trong Visual Basic,
toán tử là từ khóa Không.
1. Giá trị của x <> 0 giống với giá trị của NOT (x = 0) .
2. Giá trị của x> y giống với giá trị của NOT (x <y) .
3. Giá trị của x = y HOẶC x> 5 giống với giá trị của x = y HOẶC KHÔNG (x <= 5) .
Bạn có thể hỏi: ItemQuantity lớn hơn hoặc bằng 51? Nếu không, nó có lớn hơn hoặc
bằng 25? Nếu không, nó lớn hơn hoặc bằng 11? (Nếu có thể, giá trị là
âm, bạn cũng sẽ kiểm tra giá trị lớn hơn hoặc bằng 0 và lấy
hành động thích hợp nếu không.)
So sánh bằng cách sử dụng giá trị cao nhất của dãy.
Bạn có thể hỏi: ItemQuantity có lớn hơn 50 không? Nếu không, nó có lớn hơn 24 không? Nếu không, nó là
lớn hơn 10? (Nếu có một giá trị tối đa được phép cho itemQuantity , bạn sẽ
cũng kiểm tra giá trị lớn hơn giới hạn đó và thực hiện hành động thích hợp nếu có.)
Bạn có thể hỏi: ItemQuantity nhỏ hơn hoặc bằng 10? Nếu không, nó nhỏ hơn hoặc bằng
24? Nếu không, nó nhỏ hơn hoặc bằng 50? (Nếu có giá trị tối đa được phép cho
itemQuantity ,
bạn cũng sẽ kiểm tra giá trị nhỏ hơn hoặc bằng giới hạn đó và
thực hiện hành động thích hợp nếu không.)
Hình 4-20 cho thấy sơ đồ và mã giả biểu thị logic cho một chương trình
xác định chiết khấu chính xác cho mỗi số lượng đặt hàng. Trong quá trình ra quyết định,
itemsOrdered được so sánh với giá trị cao cấp của nhóm tầm thấp nhất ( RANGE1 ). Nếu
Các mặt hàng có thứ tự nhỏ hơn hoặc bằng giá trị đó, thì bạn sẽ biết mức chiết khấu chính xác,
GIẢM GIÁ1 ; nếu không, bạn tiếp tục kiểm tra. Nếu các mặt hàng Có thứ tự nhỏ hơn hoặc bằng giá trị cao cấp
của phạm vi tiếp theo ( RANGE2 ), thì chiết khấu của khách hàng là DISCOUNT2 ; nếu không, bạn tiếp tục
kiểm tra, và chiết khấu của khách hàng cuối cùng được đặt thành DISCOUNT3 hoặc DISCOUNT4 . bên trong
mã giả trong Hình 4-20, hãy chú ý cách mỗi liên kết if , else và endif sắp xếp theo chiều dọc.
Trang 34 Các tuyên bố quan trọng:
num mặt hàng
num customerDiscount
num RANGE1 = 10
num RANGE2 = 24
num RANGE3 = 50
num DISCOUNT1 = 0
num DISCOUNT2 = 0,10
num DISCOUNT3 = 0,15
num DISCOUNT4 = 0,20
Hình 4-20 Lưu đồ và mã giả logic để chọn chiết khấu chính xác dựa trên các mặt hàng được đặt hàng
© 2015 Cengage Learning
Trong bộ nhớ máy tính, dấu phần trăm (%) không được lưu trữ với giá trị số đại diện cho phần trăm.
Thay vào đó, tương đương toán học được lưu trữ. Ví dụ: 15% được lưu trữ dưới dạng 0,15. Bạn có thể lưu trữ một phần trăm
giá trị dưới dạng một chuỗi, như trong "15%", nhưng sau đó bạn không thể thực hiện số học với nó.
Ví dụ, hãy xem xét một đơn đặt hàng cho 30 mặt hàng. Các mục biểu thức được sắp xếp theo thứ tự <= RANGE1
đánh giá là sai, vì vậy mệnh đề khác của quyết định sẽ thực thi. Ở đó, các mặt hàng Có thứ tự <=
RANGE2 cũng đánh giá là false, vì vậy mệnh đề else của nó thực thi. Các mục biểu thức Có thứ tự <=
Trang 35
160
Trong Hình 4-21, dễ thấy đường vô ích trong lưu đồ hơn trong mã giả
biểu diễn của cùng một logic. Tuy nhiên, khi bạn sử dụng if mà không có if khác , bạn sẽ
không làm gì khi câu trả lời của câu hỏi là sai.
Đôi khi có những lý do chính đáng để hỏi mọi người những câu hỏi mà bạn đã biết câu trả lời. Đối với
ví dụ, một luật sư xét xử giỏi hiếm khi đặt câu hỏi trước tòa nếu câu trả lời sẽ là một bất ngờ. Với máy tính
logic, tuy nhiên, những câu hỏi như vậy là một sự lãng phí thời gian không hiệu quả.
Tránh kiểm tra cùng một phạm vi giới hạn nhiều lần
Một lỗi khác mà các lập trình viên mắc phải khi viết logic để thực hiện kiểm tra phạm vi cũng
liên quan đến việc hỏi những câu hỏi không cần thiết. Hình 4-22 cho thấy một lựa chọn phạm vi không hiệu quả
hỏi hai câu hỏi không cần thiết. Trong hình, nếu itemsOrdered nhỏ hơn hoặc bằng RANGE1 ,
customerDiscount được
đặt thành DISCOUNT1 . Nếu itemsOrdered không nhỏ hơn hoặc bằng RANGE1 ,
thì nó phải lớn hơn RANGE1 , vì vậy quyết định tiếp theo (được tô bóng trong hình) là
không cần thiết. Logic máy tính sẽ không bao giờ thực hiện quyết định được tô bóng trừ khi các mục
đã lớn hơn RANGE1 — nghĩa là, trừ khi logic tuân theo nhánh sai của
sự lựa chọn. Nếu bạn sử dụng logic trong Hình 4-22, bạn đang lãng phí thời gian máy tính với một
quyết định kiểm tra giới hạn phạm vi đã được kiểm tra. Logic tương tự áp dụng cho
Trang 36
Không Đúng
itemsOrdered <=
RANGE1?
khách hàng
= DISCOUNT4
Hình 4-21 Lựa chọn phạm vi không hiệu quả bao gồm cả đường dẫn không thể truy cập
© 2015 Cengage Learning
Trang 37
Các tuyên bố quan trọng:
num mặt hàng
num customerDiscount
num RANGE1 = 10
162
num RANGE2 = 24
num RANGE3 = 50
num DISCOUNT1 = 0
num DISCOUNT2 = 0,10
Không Đúng
Đừng làm điều đó itemsOrdered <=
Không có ý nghĩa RANGE1?
hỏi phần đầu tiên của
những câu hỏi này. khách hàng
Không mục thứ tự Đúng
= DISCOUNT1
> RANGE1 VÀ
mục thứ tự
<= RANGE2?
khách hàng
Không mục thứ tự Đúng = DISCOUNT2
> RANGE2 VÀ
mục thứ tự
<= RANGE3?
Hình 4-22 Lựa chọn phạm vi không hiệu quả bao gồm các câu hỏi không cần thiết
© 2015 Cengage Learning
Trang 38
quyết định bóng mờ thứ hai trong Hình 4-22. Các lập trình viên mới bắt đầu đôi khi biện minh cho việc sử dụng
những câu hỏi không cần thiết như "chỉ cần đảm bảo thực sự chắc chắn." Thận trọng như vậy là không cần thiết khi viết
logic máy tính.
1. Khi bạn thực hiện kiểm tra phạm vi, bạn so sánh một biến với mọi giá trị trong
dãy dãy.
2. Bạn có thể thực hiện kiểm tra phạm vi bằng cách so sánh sử dụng giá trị thấp nhất
trong mỗi phạm vi giá trị bạn đang sử dụng.
3. Bạn có thể thực hiện kiểm tra phạm vi bằng cách so sánh sử dụng giá trị cao nhất
trong mỗi phạm vi giá trị bạn đang sử dụng.
Mặt khác, nếu bạn chỉ cần vượt qua một trong ba bài kiểm tra để vượt qua một khóa học, thì logic là
như sau:
nếu điểm1> = MIN_SCORE HOẶC điểm2> = MIN_SCORE HOẶC điểm 3> = MIN_SCORE thì
classGrade = "Đạt"
khác
classGrade = "Không đạt"
endif
Logic trở nên phức tạp hơn khi bạn kết hợp các toán tử AND và OR trong
cùng một tuyên bố. Khi bạn làm như vậy, các toán tử AND được ưu tiên hơn, có nghĩa là Boolean
giá trị của biểu thức AND được đánh giá đầu tiên.
Trong Chương 2, bạn đã học được rằng trong các câu lệnh số học, phép nhân và phép chia được ưu tiên
Trang 39
hơn cộng và trừ. Bạn cũng học được rằng quyền ưu tiên đôi khi được gọi là thứ tự
của các hoạt động.
Ví dụ: hãy xem xét một chương trình xác định xem khách hàng quen của rạp chiếu phim có thể
mua một vé giảm giá. Giả sử rằng trẻ em và người lớn tuổi được phép giảm giá
những công dân tham dự các bộ phim được xếp hạng G. Đoạn mã sau có vẻ hợp lý, nhưng nó tạo ra
kết quả không chính xác vì biểu thức có chứa toán tử AND (xem phần tô bóng)
đánh giá trước cái có chứa toán tử OR .
nếu tuổi <= 12 HOẶC tuổi> = 65 VÀ xếp hạng = "G" thì
đầu ra "Áp dụng chiết khấu" Đừng làm điều đó
endif Biểu thức AND được tô bóng
đánh giá đầu tiên, điều này không
ý định.
Ví dụ: giả sử rằng một khách hàng quen của phim 10 tuổi và xếp hạng phim là R.
không được giảm giá (hoặc được phép xem phim!). Tuy nhiên, trong nếu
câu lệnh, một phần của biểu thức có chứa toán tử AND , age> = 65 Đánh giá AND
= "G" ,
được đánh giá đầu tiên. Đối với một bộ phim 10 tuổi và một bộ phim xếp hạng R, câu hỏi này là sai (trên cả hai
đếm), do đó toàn bộ nếu tuyên bố sẽ trở thành tương đương với những điều sau đây:
nếu tuổi <= 12 HOẶC aFalseExpression thì
đầu ra "Áp dụng chiết khấu"
endif
Vì người bảo trợ là 10, tuổi <= 12 là đúng, vì vậy câu lệnh if ban đầu trở thành
tương đương với:
nếu aTrueExpression HOẶC aFalseExpression thì
đầu ra "Áp dụng chiết khấu"
endif
Sự kết hợp true OR false đánh giá là true. Do đó, chuỗi "Áp dụng chiết khấu" là
đầu ra khi nó không nên được.
Nhiều ngôn ngữ lập trình cho phép bạn sử dụng dấu ngoặc đơn để sửa logic và buộc
Biểu thức OR sẽ được đánh giá trước tiên, như được hiển thị trong mã giả sau:
if (age <= 12 OR age> = 65) AND rating = "G" thì
đầu ra "Áp dụng chiết khấu"
endif
Với ngoặc nói thêm, nếu của bạn đọc tuổi là 12 hoặc dưới HOẶC các độ tuổi là 65 trở lên, các
biểu thức được đánh giá là:
if aTrueExpression AND rating = "G" thì
đầu ra "Áp dụng chiết khấu"
endif
Trong tuyên bố này, khi giá trị độ tuổi đủ điều kiện để khách hàng được giảm giá, thì giá trị xếp hạng
cũng phải được chấp nhận trước khi áp dụng chiết khấu. Đây là ý định ban đầu.
Trang 40
Bạn có thể sử dụng các kỹ thuật sau để tránh nhầm lẫn khi trộn các toán tử AND và OR :
Bạn có thể sử dụng dấu ngoặc đơn để ghi đè mức độ ưu tiên mặc định (thứ tự hoạt động).
Bạn có thể sử dụng dấu ngoặc đơn để rõ ràng mặc dù họ không hiểu rõ điều gì xảy ra
sẽ không cần đến chúng. Ví dụ, nếu khách hàng sẽ ở giữa 12 và 19 hoặc trường học
ID để nhận chiết khấu trung học, bạn có thể sử dụng biểu thức (tuổi> 12 VÀ tuổi <19) HOẶC 165
validId = "Có" , mặc dù đánh giá sẽ giống nhau mà không có dấu ngoặc đơn.
Bạn có thể sử dụng các câu lệnh if lồng nhau thay vì sử dụng các toán tử AND và OR . Với
lưu đồ và mã giả được hiển thị trong Hình 4-23, rõ ràng khách hàng quen phim nào nhận được
sự giảm giá. Trong sơ đồ, bạn có thể thấy rằng OR được lồng hoàn toàn bên trong Yes
nhánh của quyết định rating = "G" . Tương tự, trong mã giả trong Hình 4-23, bạn có thể
xem theo sự liên kết rằng nếu xếp hạng không phải là G, logic sẽ tiến hành trực tiếp đến endif cuối cùng
tuyên bố, bỏ qua bất kỳ kiểm tra tuổi nào cả.
Không Đúng
tuổi <=
12?
đầu ra
"Giảm giá
áp dụng "
Hình 4-23 Các quyết định lồng nhau xác định mức chiết khấu của khách hàng quen xem phim
© 2015 Cengage Learning
Trang 41
1. Hầu hết các ngôn ngữ lập trình cho phép bạn kết hợp nhiều AND và OR
toán tử trong một biểu thức khi bạn cần.
2. Khi bạn kết hợp các toán tử AND và OR , các toán tử OR sẽ được ưu tiên,
nghĩa là các giá trị Boolean của chúng được đánh giá đầu tiên.
3. Bạn luôn có thể tránh nhầm lẫn khi trộn các quyết định VÀ và HOẶC bằng cách lồng vào nhau
nếu báo cáo thay vì sử dụng AND và OR nhà khai thác.
Để thực hiện kiểm tra phạm vi, hãy so sánh với giá trị thấp nhất hoặc cao nhất trong
mỗi phạm vi giá trị so sánh. Các lỗi thường gặp khi lập trình viên thực hiện
kiểm tra phạm vi bao gồm hỏi những câu hỏi không cần thiết và đã được trả lời trước đó.
Khi bạn kết hợp các toán tử AND và OR trong một biểu thức, các toán tử AND sẽ lấy
ưu tiên, nghĩa là các giá trị Boolean của chúng được đánh giá đầu tiên.
ầ
Trang 42
Điều khoản quan trọng
Một biểu thức Boolean là một đại diện duy nhất của hai quốc gia, thường được biểu diễn như thật
Hay sai.
Một if-then cấu trúc quyết định chứa một biểu thức Boolean thử nghiệm và một hành động mà là
chỉ được lấy khi biểu thức là true.
Một if-then khoản của một quyết định giữ lại những điều khoản mà thực hiện khi kiểm tra Boolean
biểu thức là đúng.
Các điều khoản khác của một quyết định giữ lại những điều khoản mà chỉ thực hiện khi kiểm tra
Biểu thức Boolean là sai.
Các toán tử so sánh quan hệ là các ký hiệu thể hiện so sánh Boolean.
Các ví dụ bao gồm =,>, <,> =, <= và <>.
Một biểu thức tầm thường là một biểu thức luôn luôn đánh giá cùng một giá trị.
Một điều kiện phức hợp được xây dựng khi bạn cần đặt nhiều câu hỏi trước
xác định một kết quả.
Một quyết định AND có hai hoặc nhiều quyết định; tất cả các điều kiện phải đúng cho một hành động
diễn ra.
Một quyết định lồng nhau , hoặc một if lồng nhau , là một quyết định trong mệnh đề if-then hoặc else của
quyết định khác.
Một tầng lệnh if là một loạt các lồng nếu báo cáo.
Một điều kiện và nhà điều hành (hoặc, đơn giản hơn, một VÀ hành ) là một biểu tượng mà bạn sử dụng để
kết hợp các điều kiện khi tất cả chúng phải đúng để một hành động xảy ra.
Bảng chân lý là sơ đồ được sử dụng trong toán học và logic để giúp mô tả chân lý của một
toàn bộ biểu thức dựa trên sự thật của các bộ phận của nó.
Đánh giá ngắn mạch là một tính năng logic, trong đó các biểu thức trong mỗi phần của một
biểu thức chỉ được đánh giá trong chừng mực cần thiết để xác định kết quả cuối cùng.
Một quyết định HOẶC có hai hoặc nhiều quyết định; nếu ít nhất một điều kiện được đáp ứng, kết quả
hành động diễn ra.
Một điều kiện OR (hoặc, đơn giản hơn, một toán tử OR ) là một biểu tượng mà bạn sử dụng để
kết hợp các điều kiện khi ít nhất một trong số chúng phải đúng để một hành động xảy ra.
Các KHÔNG toán tử logic là một biểu tượng mà đảo ngược ý nghĩa của một biểu thức Boolean.
Một nhà điều hành unary là một trong đó chỉ sử dụng một toán hạng.
Một kiểm tra phạm vi xác định nơi một biến rơi số học khi so sánh với một loạt
của các giá trị đánh dấu giới hạn kết thúc.
Con đường chết hoặc con đường không thể đến được là con đường hợp lý không bao giờ có thể đi được.
Trang 43
Bài tập
168 1. A biểu thức có một trong hai giá trị: true hoặc false.
a. toán hạng bên trái lớn hơn toán hạng bên phải
b. toán hạng bên phải lớn hơn toán hạng bên trái
c. toán hạng bên phải bằng toán hạng bên trái
d. Cả b và c đều đúng.
7. Trong điều kiện AND, kỹ thuật hiệu quả nhất là đặt câu hỏi trước tiên
cái đó .
a. trộn các hằng số và biến
b. sử dụng toán tử nhỏ hơn hoặc nhỏ hơn hoặc bằng với
c. ít có khả năng là sự thật
d. sử dụng một hằng số được đặt tên
8. Nếu m đúng và n sai thì .
a. m VÀ n là đúng c. m HOẶC n là sai
b. m VÀ n là sai d. Nếu m đúng thì n phải đúng.
Trang 44
Bài tập
11. Nếu điều kiện A có 30% khả năng là đúng và điều kiệnB có 10% khả năng
là đúng, sau đó nó là hiệu quả nhất để kiểm tra conditionA đầu tiên .
a. trong một quyết định HOẶC c. trong bất kỳ quyết định nào
b. trong một quyết định AND d. không bao giờ
12. Biểu thức nào sau đây là biểu thức Boolean tầm thường, được viết kém?
a. SMALL_RAISE
b. MEDIUM_RAISE
c. BIG_RAISE
d. không thể nói
170
16. Trong mã giả sau đây, một nhân viên sẽ được tăng lương bao nhiêu phần trăm
Cục 10 nhận?
nếu bộ phận <2 thì
tăng = SMALL_RAISE
khác
17. Khi bạn sử dụng kiểm tra phạm vi, bạn so sánh một biến với giá trị trong
phạm vi.
a. thấp nhất c. cao nhất
b. ở giữa d. thấp nhất hoặc cao nhất
18. Nếu doanh số = 100 , tỷ lệ = 0,10 và chi phí = 50 , giá trị nào sau đây
biểu thức là đúng?
a. doanh số bán hàng> = chi phí VÀ tỷ lệ <1
b. doanh số bán hàng <200 HOẶC chi phí <100
c. chi phí = tỷ lệ HOẶC doanh số bán hàng = tỷ lệ
d. hai trong số những điều trên
19. Nếu a đúng, b đúng và c sai, biểu thức nào sau đây là đúng?
a. a HOẶC b VÀ c c. a VÀ b HOẶC c
b. a VÀ b VÀ c d. hai trong số những điều trên
20. Nếu d đúng, e sai và f sai, biểu thức nào sau đây là đúng?
a. e HOẶC f VÀ d c. d HOẶC e VÀ f
b. f VÀ d HOẶC e d. hai trong số những điều trên
Trang 46
Bài tập
1. Giả sử rằng các biến sau chứa các giá trị được hiển thị:
numberBig = 300 numberMedium = 100 numberSmall = 5
171
wordBig = "Con voi" wordMedium = "Con ngựa" wordSmall = "bug"
Đối với mỗi biểu thức Boolean sau đây, hãy quyết định xem câu lệnh đó có
đúng, sai hoặc bất hợp pháp.
a. numberBig = numberSmall
b. numberBig> numberSmall
c. numberMedium <numberSmall
d. numberBig = wordBig
e. numberBig = "Lớn"
f. wordMedium = "Phương tiện"
g. wordBig = "Con voi"
h. numberMedium <= numberBig / 3
Tôi. numberBig> = 200
j. numberBig> = numberMedium + numberSmall
3. Thiết kế lưu đồ hoặc mã giả cho một chương trình chấp nhận ba số từ
người dùng và hiển thị thông báo nếu tổng của hai số bất kỳ bằng số thứ ba.
4. Công ty Bảo hiểm Nhân thọ Mortimer muốn có một số danh sách dữ liệu nhân viên bán hàng. Thiết kế một
lưu đồ hoặc mã giả cho những điều sau:
a. Một chương trình chấp nhận số ID của một nhân viên bán hàng và số lượng chính sách
đã bán trong tháng trước và chỉ hiển thị dữ liệu nếu nhân viên bán hàng là một
người biểu diễn — một người bán hơn 25 chính sách trong tháng.
b. Một chương trình chấp nhận dữ liệu nhân viên bán hàng liên tục cho đến khi giá trị được
đã nhập và hiển thị danh sách những người có hiệu suất cao.
5. ShoppingBay là một dịch vụ đấu giá trực tuyến yêu cầu một số báo cáo. Dữ liệu cho mỗi
vật phẩm đấu giá bao gồm số ID, mô tả vật phẩm, thời gian đấu giá
quy trình, và yêu cầu tối thiểu như sau. Lưu đồ hình chữ nhật hoặc mã giả cho những điều sau:
a. Một chương trình chấp nhận dữ liệu cho một vật phẩm được đấu giá. Hiển thị dữ liệu cho một cuộc đấu giá
172
chỉ khi giá thầu yêu cầu tối thiểu trên $ 100,00.
b. Một chương trình liên tục chấp nhận dữ liệu vật phẩm đấu giá cho đến khi giá trị trọng điểm là
đã nhập và hiển thị tất cả dữ liệu cho các cuộc đấu giá trong đó giá thầu yêu cầu tối thiểu là
trên $ 100,00.
c. Một chương trình liên tục chấp nhận dữ liệu vật phẩm đấu giá và hiển thị dữ liệu cho
mọi cuộc đấu giá mà chưa có giá thầu nào (nói cách khác, giá thầu tối thiểu
là $ 0,00) và thời lượng của phiên đấu giá là một ngày trở xuống.
d. Một chương trình liên tục chấp nhận dữ liệu đấu giá và hiển thị dữ liệu cho mọi
đấu giá trong đó độ dài từ 7 đến 30 ngày bao gồm.
e. Một chương trình nhắc người dùng đặt giá thầu yêu cầu tối đa, sau đó
liên tục chấp nhận dữ liệu đấu giá và hiển thị dữ liệu cho mọi cuộc đấu giá trong đó
giá thầu tối thiểu nhỏ hơn hoặc bằng số tiền người dùng đã nhập.
6. Công ty điện thoại di động Dash tính phí khách hàng với mức phí cơ bản là $ 5 mỗi tháng đối với
gửi tin nhắn văn bản. Mức phí bổ sung như sau:
60 tin nhắn đầu tiên mỗi tháng, bất kể độ dài tin nhắn, được bao gồm trong
hóa đơn cơ bản.
Thêm năm xu được tính cho mỗi tin nhắn văn bản sau tin nhắn thứ 60,
lên đến 180 tin nhắn.
Thêm 10 xu được tính cho mỗi tin nhắn văn bản sau tin nhắn thứ 180.
Thuế liên bang, tiểu bang và địa phương cộng tổng cộng 12 phần trăm vào mỗi hóa đơn.
Thiết kế lưu đồ hoặc mã giả cho những điều sau:
a. Một chương trình chấp nhận dữ liệu tiếp theo về tin nhắn của một khách hàng: mã vùng
(threedigits), phonenumber (Sevendigits), andnumberoftext messagessent.
tất cả dữ liệu, bao gồm cả hóa đơn cuối tháng cả trước và sau khi thuế đều được thêm vào.
b. Một chương trình liên tục chấp nhận dữ liệu về tin nhắn văn bản cho đến khi một trạm giám sát
giá trị được nhập và hiển thị tất cả các chi tiết.
c. Một chương trình liên tục chấp nhận dữ liệu về tin nhắn văn bản cho đến khi một trạm giám sát
giá trị được nhập và chỉ hiển thị chi tiết về những khách hàng gửi nhiều hơn
100 tin nhắn văn bản.
d. Một chương trình liên tục chấp nhận dữ liệu về tin nhắn văn bản cho đến khi một trạm giám sát
giá trị được nhập và chỉ hiển thị thông tin chi tiết về những khách hàng có tổng hóa đơn
thuế trên $ 20.
e. Một chương trình nhắc người dùng nhập mã vùng gồm ba chữ số để chọn
hóa đơn .ntheprogramcontinulyacceptstextmessagedatauntilasentinelvalue
được nhập và chỉ hiển thị dữ liệu cho các tin nhắn được gửi từ mã vùng được chỉ định.
Trang 48
Bài tập
7. Công ty Bảo hiểm Nghi thức Lái xe cung cấp các chính sách bảo hiểm ô tô cho
trình điều khiển. Thiết kế lưu đồ hoặc mã giả cho những điều sau:
a. Một chương trình chấp nhận dữ liệu hợp đồng bảo hiểm, bao gồm số hợp đồng,
họ của khách hàng, tên của khách hàng, tuổi, ngày đến hạn trả phí bảo hiểm (tháng, ngày,
và năm), và số vụ tai nạn do lái xe trong ba năm qua. Nếu một nhập 173
số chính sách không bao gồm từ 1000 đến 9999, hãy đặt số chính sách
thành 0. Nếu tháng không bao gồm từ 1 đến 12, hoặc ngày không chính xác cho
tháng (ví dụ: không phải từ 1 đến 31 cho tháng 1 hoặc 1 và 29 cho
Tháng 2), đặt tháng, ngày và năm thành 0. Hiển thị dữ liệu chính sách sau bất kỳ
sửa đổi đã được thực hiện.
b. Một chương trình liên tục chấp nhận dữ liệu của chủ sở hữu hợp đồng cho đến khi có giá trị trọng điểm
đã được nhập và hiển thị dữ liệu cho bất kỳ chủ hợp đồng nào trên 35 tuổi.
c. Một chương trình liên tục chấp nhận dữ liệu của chủ sở hữu hợp đồng cho đến khi một giá trị được gửi
đã được nhập và hiển thị dữ liệu cho bất kỳ chủ hợp đồng nào từ 21 tuổi trở lên.
d. Một chương trình liên tục chấp nhận dữ liệu của chủ sở hữu hợp đồng và hiển thị dữ liệu
cho bất kỳ chủ hợp đồng nào không quá 30 tuổi.
e. Một chương trình liên tục chấp nhận dữ liệu của chủ sở hữu hợp đồng và hiển thị dữ liệu
cho bất kỳ chủ hợp đồng nào có phí bảo hiểm đến hạn không muộn hơn ngày 15 tháng 3 hàng năm.
f. Một chương trình liên tục chấp nhận dữ liệu của chủ sở hữu hợp đồng và hiển thị dữ liệu
cho bất kỳ chủ hợp đồng nào có phí bảo hiểm đến hạn và bao gồm cả ngày 1 tháng 1 năm 2016.
g. Một chương trình liên tục chấp nhận dữ liệu của chủ sở hữu hợp đồng và hiển thị dữ liệu
cho bất kỳ chủ hợp đồng nào có phí bảo hiểm đến hạn trước ngày 27 tháng 4 năm 2015.
h. Một chương trình liên tục chấp nhận dữ liệu của chủ sở hữu chính sách và hiển thị dữ liệu cho
bất kỳ ai có số chính sách bao gồm từ 1000 đến 4000, có chính sách
đến hạn vào tháng 4 hoặc tháng 5 của bất kỳ năm nào và ai đã có ít hơn ba vụ tai nạn.
8. The Barking Lot là một trung tâm chăm sóc chó ban ngày. Thiết kế lưu đồ hoặc mã giả cho
tiếp theo:
a. Một chương trình chấp nhận dữ liệu cho số ID của chủ sở hữu con chó và tên,
giống, tuổi và trọng lượng của con chó. Hiển thị hóa đơn chứa tất cả dữ liệu đầu vào như
cũng như phí chăm sóc ban ngày hàng tuần, là $ 55 cho chó dưới 15 pound, $ 75 cho
bao gồm chó từ 15 đến 30 pound, $ 105 cho chó từ 31 đến 80 pound
bao gồm và $ 125 cho những con chó trên 80 pound.
b. Một chương trình liên tục chấp nhận dữ liệu của các chú chó cho đến khi nhập một giá trị trọng điểm,
và hiển thị dữ liệu thanh toán cho từng con chó.
c. Một chương trình liên tục chấp nhận dữ liệu của các chú chó cho đến khi nhập một giá trị trọng điểm,
và hiển thị dữ liệu thanh toán cho những chủ sở hữu chó nợ hơn 100 đô la.
d. Một chương trình liên tục chấp nhận dữ liệu của các chú chó cho đến khi nhập một giá trị trọng điểm,
và hiển thị dữ liệu thanh toán cho những con chó nặng dưới 20 pound trở lên
100 bảng Anh.
Trang 49
9. Mark Daniels là một thợ mộc, người đã tạo ra các bảng hiệu ngôi nhà được cá nhân hóa. Anh ấy muốn một
ứng dụng để tính giá của bất kỳ ký hiệu nào mà khách hàng đặt hàng, dựa trên
các yếu tố sau:
Phí tối thiểu cho tất cả các bảng hiệu là $ 30.
174 Nếu bảng hiệu làm bằng gỗ sồi, thêm $ 15. Không tính thêm phí cho cây thông.
Sáu chữ cái hoặc số đầu tiên được bao gồm trong khoản phí tối thiểu; đây là một
Phí $ 3 cho mỗi ký tự bổ sung.
Ký tự màu đen hoặc trắng được bao gồm trong khoản phí tối thiểu; Đây là một
phí bổ sung $ 12 cho chữ vàng lá.
Thiết kế lưu đồ hoặc mã giả cho những điều sau:
a. Một chương trình chấp nhận dữ liệu cho số đơn đặt hàng, tên khách hàng, loại gỗ,
số lượng ký tự và màu sắc của ký tự. Hiển thị tất cả dữ liệu đã nhập và
giá cuối cùng cho dấu hiệu.
b. Một chương trình liên tục chấp nhận dữ liệu đơn đặt hàng ký và hiển thị tất cả các
thông tin cho bảng hiệu gỗ sồi với năm chữ cái màu trắng.
c. Một chương trình liên tục chấp nhận dữ liệu đơn đặt hàng ký và hiển thị tất cả các
thông tin cho bảng hiệu cây thông với chữ vàng lá và hơn 10 ký tự.
10. Black Dot Printing đang cố gắng tổ chức các toa tàu để tiết kiệm năng lượng. Mỗi đầu vào
hồ sơ chứa tên của nhân viên và thị trấn cư trú. Mười phần trăm của
nhân viên của công ty sống ở Wonder Lake; 30% sống ở thị trấn liền kề
Woodstock. Black Dot muốn khuyến khích nhân viên sống ở một trong hai thị trấn
lái xe để làm việc cùng nhau. Thiết kế lưu đồ hoặc mã giả cho những điều sau:
a. Một chương trình chấp nhận dữ liệu của một nhân viên và hiển thị nó với một thông báo
cho biết liệu nhân viên có phải là ứng cử viên cho dịch vụ đi chung xe hay không (vì anh ta sống ở
một trong hai thành phố).
b. Một chương trình liên tục chấp nhận dữ liệu của nhân viên cho đến khi giá trị của trạm gác là
đã nhập và hiển thị danh sách tất cả nhân viên là ứng viên đi chung xe. Làm
đảm bảo quá trình ra quyết định càng hiệu quả càng tốt.
c. Một chương trình liên tục chấp nhận dữ liệu của nhân viên cho đến khi giá trị được
đã nhập và hiển thị danh sách tất cả nhân viên không đủ điều kiện đi chung xe vì
chúng không sống ở Wonder Lake hay Woodstock. Đảm bảo quyết định-
quá trình làm càng hiệu quả càng tốt.
11. Amanda Cho, một giám sát viên của một cửa hàng quần áo bán lẻ, muốn thừa nhận rằng
đạt được nhân viên bán hàng. Thiết kế lưu đồ hoặc mã giả cho những điều sau:
a. Một chương trình liên tục chấp nhận họ và tên của mỗi nhân viên bán hàng,
số ca làm việc trong một tháng, số lượng giao dịch đã hoàn thành
tháng và giá trị đô la của các giao dịch đó. Hiển thị từng nhân viên bán hàng
tên có điểm năng suất, được tính bằng cách chia đô la đầu tiên cho
giao dịch và chia kết quả theo ca đã làm việc. Hiển thị ba dấu hoa thị sau
điểm năng suất nếu nó là 50 hoặc cao hơn.
Trang 50
b. Một chương trình chấp nhận dữ liệu của từng nhân viên bán hàng và hiển thị tên và
số tiền thưởng. Tiền thưởng sẽ được phân bổ như sau:
Nếu điểm năng suất là 200 hoặc cao hơn, tiền thưởng là 200 đô la.
c. Sửa đổi Bài tập 11b để phản ánh thực tế mới sau đây và có chương trình
thực thi hiệu quả nhất có thể:
1. Một tệp có tên MAINTENANCE04-01.jpg được bao gồm trong tệp có thể tải xuống của bạn
hồ sơ sinh viên. Giả sử rằng chương trình này là một chương trình làm việc trong tổ chức của bạn
và nó cần sửa đổi như được mô tả trong các nhận xét (các dòng bắt đầu bằng
hai 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ác thông số kỹ thuật mới.
Tìm lỗi
1. Các tệp có thể tải xuống của bạn cho Chương 4 bao gồm DEBUG04-01.txt, DEBUG04-02.txt,
và DEBUG04-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à những dòng bắt đầu bằng hai dấu gạch chéo (//). Theo dõi
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 lại.
2. Các tệp có thể tải xuống của bạn cho Chương 4 bao gồm một tệp có tên DEBUG04-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.
1. Trong Chương 2, bạn đã biết rằng nhiều ngôn ngữ lập trình cho phép bạn tạo
một số ngẫu nhiên từ 1 đến một giá trị giới hạn được đặt tên là giới hạn bằng cách sử dụng
câu lệnh tương tự như randomNumber = random (giới hạn) . Tạo logic cho một
trò chơi đoán trong đó ứng dụng tạo ra một số ngẫu nhiên và người chơi
Trang 51
cố gắng đoán nó. Hiển thị một thông báo cho biết liệu người chơi đoán có phải là
đúng, quá cao hoặc quá thấp. (Sau khi bạn hoàn thành Chương 5, bạn sẽ có thể sửa đổi
ứng dụng để người dùng có thể tiếp tục đoán cho đến khi câu trả lời chính xác là
đã nhập.)
2. Tạo ứng dụng trò chơi xổ số. Tạo ba số ngẫu nhiên, mỗi số giữa
176
0 và 9. Cho phép người dùng đoán ba số. So sánh từng dự đoán của người dùng
đến ba số ngẫu nhiên và hiển thị một thông báo bao gồm dự đoán của người dùng,
ba chữ số được xác định ngẫu nhiên và số tiền mà người dùng đã giành được,
như trong Hình 4-24.
Hình 4-24 Giải thưởng cho các con số trùng khớp trong trò chơi xổ số
Đảm bảo rằng ứng dụng của bạn có các chữ số lặp lại. Ví dụ, nếu
người dùng đoán 1, 2 và 3 và các chữ số được tạo ngẫu nhiên là 1, 1 và 1, không
cung cấp cho người dùng tín dụng cho ba lần đoán đúng — chỉ một.
1. Các chương trình máy tính cũng có thể được sử dụng để đưa ra quyết định về khả năng bảo hiểm của bạn
như mức phí bạn sẽ phải trả cho các hợp đồng bảo hiểm sức khỏe và nhân thọ. Ví dụ,
một số điều kiện hiện có có thể làm tăng phí bảo hiểm của bạn đáng kể. Là
việc các công ty bảo hiểm truy cập hồ sơ sức khỏe của bạn và sau đó thực hiện
quyết định bảo hiểm về bạn? Giải thich câu trả lơi của bạn.
2. Đơn xin việc đôi khi được sàng lọc bởi phần mềm đưa ra quyết định về một
sự phù hợp của ứng viên dựa trên các từ khóa trong ứng dụng. Việc sàng lọc như vậy có công bằng không
cho người nộp đơn? Giải thich câu trả lơi của bạn.
3. Các cơ sở y tế thường có nhiều bệnh nhân chờ ghép tạng hơn ở đó
là các cơ quan có sẵn. Giả sử bạn được yêu cầu viết một chương trình máy tính
lựa chọn ứng cử viên nào sẽ nhận được một cơ quan có sẵn. Dữ liệu nào sẽ
bạn muốn có trong hồ sơ để có thể sử dụng trong chương trình của mình và bạn sẽ đưa ra quyết định nào
thực hiện dựa trên dữ liệu? Bạn nghĩ người khác có thể sử dụng dữ liệu nào mà bạn sẽ sử dụng
chọn không sử dụng?