Download as pdf or txt
Download as pdf or txt
You are on page 1of 51

Trang 1 CHƯƠNG 4 Đưa ra quyết định

Biểu thức Boolean và cấu trúc lựa chọn


Lý do mọi người thường nghĩ máy tính thông minh nằm ở khả năng của máy tính
các chương trình để đưa ra quyết định. Một chương trình chẩn đoán y tế có thể quyết định xem các triệu chứng của bạn
phù hợp với các cấu hình bệnh khác nhau có vẻ khá thông minh, cũng như một chương trình có thể cung cấp các
các tuyến đường lái xe tiềm năng dựa trên điểm đến của bạn.

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.

THAM KHẢO NHANH 4-1 nếu Tuyên bố Tiêu chuẩn Mã giả

Đ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.

Nhiều ngôn ngữ không sử dụng từ sau đó;


cuốn sách này sử dụng nó cho rõ ràng.
Cái khác nếu điều kiện thì
từ khóa
trước bất kỳ câu lệnh thực thi khi điều kiện là đúng
các câu lệnh
khác
điều đó thực thi
nếu thử nghiệm
câu lệnh thực thi khi điều kiện sai
điều kiện là
sai. An endif
mệnh đề khác
không phải
Mặc dù nhiều ngôn ngữ hiện đại
cần thiết. Từ khóa endif kết thúc
không yêu cầu thụt lề,
cấu trúc.
câu lệnh trong cả if và else
các mệnh đề trong cuốn sách này được thụt lề.

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 ()

đầu ra " Chương trình này


Tuyên bố
tính toán bảng lương
tên chuỗi
num giờ dựa trên "
128 num RATE = 10,00
num WORK_WEEK = 40
num OVERTIME = 1,5 đầu ra " tỷ lệ làm thêm giờ

num trả trong tổng số " , OVERTIME,

string QUIT = "ZZZ" " sau " , WORK_WEEK,


" giờ. "

dọn phòng ()
đầu ra " Enter
tên nhân viên hoặc " ,
QUIT, " thoát >> "

tên <> Đúng


detailLoop ()
QUIT?
tên đầu vào

Không
detailLoop ()

trở về
hoàn thành()
đầu ra " Enter
giờ làm việc >> "

dừng lại

giờ đầu vào

Không giờ> Đúng

TUẦN LÀM VIỆC?

pay = (WORK_WEEK *
trả = giờ * RATE) + (giờ -
TỶ LỆ WORK_WEEK) * TỶ LỆ *
TĂNG CA

đầu ra " Thanh toán cho " ,


tên, " là $", trả tiền

hoàn thành()

đầu ra " Enter


tên nhân viên hoặc " ,
QUIT, " thoát >> " đầu ra " Lương làm thêm giờ
tính toán

hoàn thành "

tên đầu vào

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

Biểu thức Boolean và cấu trúc lựa chọn

(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.

Xem video Biểu thức và Quyết định Boolean.


Trang 6 Sử dụng các toán tử so sánh quan hệ

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


Biểu thức Boolean và cấu trúc lựa chọn

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

Sử dụng các toán tử so sánh quan hệ


Tham chiếu nhanh 4-2 mô tả sáu toán tử so sánh quan hệ được hỗ trợ bởi tất cả
các ngôn ngữ lập trình hiện đại. Mỗi toán tử này là nhị phân — nghĩa là, như
các toán tử số học mà bạn đã học trong Chương 2, mỗi toán tử so sánh quan hệ trong
Tham chiếu nhanh 4-2 yêu cầu hai toán hạng. Mỗi biểu thức sử dụng một trong các toán tử này
đánh giá đúng hoặc sai. Lưu ý rằng một số toán tử được hình thành bằng cách sử dụng hai ký tự không có
không gian giữa chúng.

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

THAM KHẢO NHANH 4-2 Toán tử so sánh quan hệ

Tên người vận hành Thảo luận

= 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

nếu customerAge> = 65 thì


chiết khấu = 0,10
khác
chiết khấu = 0
endif

Để 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.

nếu Mã khách hàng <> 1 thì


chiết khấu = 0,25
khác
Không Đúng chiết khấu = 0,50
mã khách hàng
endif
<> 1?

chiết khấu = 0,50 chiết khấu = 0,25

Hình 4-5 Sử dụng phép so sánh phủ định


© 2015 Cengage Learning

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ì.

nếu customerCode = 1 thì


chiết khấu = 0,50
khác
Không Đúng chiết khấu = 0,25
Mã khách hàng = 1? endif

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à:

nếu customerZipCode <> LOCAL_ZIP_CODE thì


tổng cộng = tổng cộng + giao hàng
endif

Tránh một lỗi phổ biến với các toán tử quan hệ


Một lỗi phổ biến xảy ra khi lập trình với các toán tử quan hệ đang sử dụng
sai và thiếu ranh giới hoặc giới hạn cần thiết cho một lựa chọn. Nếu bạn sử dụng dấu>
biểu tượng để thực hiện lựa chọn khi đáng lẽ bạn phải sử dụng> =, tất cả các trường hợp đều bằng nhau sẽ
bỏ chọn. Thật không may, những người yêu cầu chương trình không phải lúc nào cũng nói như
chính xác như một máy tính. Ví dụ, nếu sếp của bạn nói, "Hãy viết một chương trình chọn tất cả
nhân viên trên 65 tuổi, ”cô ấy có ý muốn bao gồm nhân viên 65 tuổi hay không? Nói cách khác,
là tuổi so sánh > 65 hay tuổi> = 65 ? Mặc dù cụm từ trên 65 cho biết lớn hơn
hơn 65, không phải lúc nào mọi người cũng nói những gì họ muốn nói và cách hành động tốt nhất là
kiểm tra kỹ ý nghĩa dự định với người đã yêu cầu chương trình — cho
ví dụ, người dùng cuối, người giám sát của bạn hoặc người hướng dẫn của bạn. Các cụm từ tương tự có thể gây ra
sự hiểu lầm không nhiều hơn, ít nhất, và không dưới.
Trang 10 Hiểu và logic

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


Sử dụng các toán tử so sánh quan hệ

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:

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 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

khởi đầu dọn phòng ()

Tuyên bố
num customerId đầu ra "Thanh toán qua điện thoại

num callMade máy tính"

136 num callMinutes


num customerBill
num CALLS = 100
num MINUTES = 500 khách hàng đầu vàoId,

num BASIC_SERVICE = 30,00 callMade, callMinutes

num PREMIUM = 20,00

trở về

dọn phòng ()

hoàn thành()

không phải Đúng


detailLoop ()
eof?

đầu ra " Chương trình đã kết thúc "

Không
detailLoop ()

hoàn thành() trở về


customerBill =
BASIC_SERVICE

dừng lại

Không Đúng
callMade>
CUỘC GỌI?

Không callMinutes Đúng


> PHÚT?

customerBill =
customerBill +
CAO CẤP

khách hàng đầu raId,


callMade, "cuộc gọi được thực hiện;
đã sử dụng ", callMinutes,
"phút. Tổng hóa đơn $",
customerBill

khách hàng đầu vàoId,


callMade, callMinutes

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.

Lồng VÀ Quyết định cho hiệu quả


Khi bạn lồng hai quyết định, bạn phải chọn quyết định nào sẽ đưa ra trước.
Về mặt logic, một trong hai biểu thức trong quyết định AND có thể được đánh giá trước. Tuy nhiên, 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 chính xác một trong hai lựa chọn
để thực hiện đầu tiên.

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

if callMade> CALLS then


Không callMade> Đúng
nếu callMinutes> MINUTES thì
CUỘC GỌI? customerBill = customerBill + PREMIUM 139
endif
endif

Không callMinutes Đúng


> PHÚT?

customerBill =
customerBill +
CAO CẤP

nếu callMinutes> MINUTES thì


Không Đúng if callMade> CALLS then
callMinutes
customerBill = customerBill + PREMIUM
> PHÚT?
endif
endif

Không callMade> Đúng


CUỘC GỌI?

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ả.

Sử dụng toán tử AND


Hầu hết các ngôn ngữ lập trình cho phép bạn hỏi hai hoặc nhiều câu hỏi trong một phép so sánh duy nhất
bằng cách sử dụng toán tử AND có điều kiện hoặc đơn giản hơn là toán tử AND kết hợp các quyết định trong
biểu thức đơn. Ví dụ: nếu bạn muốn thanh toán thêm một khoản tiền cho khách hàng sử dụng điện thoại di động
thực hiện hơn 100 cuộc gọi với tổng số hơn 500 phút trong thời hạn thanh toán, bạn có thể
sử dụng các quyết định lồng nhau, như được hiển thị trong phần trước hoặc bạn có thể bao gồm cả hai quyết định trong
biểu thức đơn bằng cách viết câu hỏi sau:

callMade> CALLS AND callMinutes> MINUTES

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.

THAM KHẢO NHANH 4-3 Bảng chân lý cho toán tử AND


x? y? x VÀ y?

Thật Thật Thật


Thật Sai Sai
Sai Thật Sai
Sai Sai Sai

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

nếu cuộc gọiMade> CALLS AND callMinutes> MINUTES thì


customerBill = customerBill + PREMIUM
endif

callMade>
Không CUỘC GỌI VÀ Đúng
142 callMinutes>
PHÚT?

customerBill =
customerBill +
CAO CẤP

if callMade> CALLS then


nếu callMinutes> MINUTES thì
customerBill = customerBill + PREMIUM
endif
endif

Không callMade> Đúng


CUỘC GỌI?

Không callMinutes Đúng


> PHÚT?

customerBill =
customerBill +
CAO CẤP

Hình 4-9 Sử dụng toán tử AND và logic đằng sau nó


© 2015 Cengage Learning

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

Tránh các lỗi thường gặp trong lựa chọn AND


Đưa ra các quyết định chắc chắn nên được lồng vào nhau
Khi bạn cần đáp ứng hai tiêu chí trở lên để bắt đầu một sự kiện trong một chương trình, bạn phải
đảm bảo rằng quyết định thứ hai được thực hiện hoàn toàn trong phạm vi quyết định đầu tiên. Ví dụ, nếu một
mục tiêu của chương trình là thêm $ 20 phí bảo hiểm cho hóa đơn của những khách hàng sử dụng điện thoại di động143vượt quá

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.

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


Phí bảo hiểm được thêm vào
hóa đơn khách hàng bởi vì
cuộc gọiMade là cao
đủ, nhưng
callMinutes có thể là
quá thấp.
Không Đúng
callMade>
CUỘC GỌI?
if callMade> CALLS then
customerBill = customerBill + PREMIUM
customerBill = endif
customerBill + nếu callMinutes> MINUTES thì
CAO CẤP
customerBill = customerBill + PREMIUM
endif

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


Phí bảo hiểm được thêm vào
Không callMinutes Đúng
hóa đơn khách hàng bởi vì
> PHÚT?
callMinutes cao
đủ, nhưng cuộc gọi
có thể quá thấp.
customerBill =
customerBill +
CAO CẤP
Đừng làm điều đó
Nếu khách hàng đã vượt quá
cả cuộc gọi và phút
giới hạn, phí bảo hiểm là
được thêm vào của khách hàng
hóa đơn hai lần.

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.

Đảm bảo rằng Biểu thức Boolean là Hoàn thành


Khi bạn sử dụng toán tử AND trong hầu hết các ngôn ngữ, bạn phải cung cấp một Boolean hoàn chỉnh
biểu thức trên mỗi bên của toán tử. Nói cách khác, callMinutes> 100 AND
callMinutes <200 sẽ
là một biểu thức hợp lệ để tìm callMinutes trong khoảng từ 100 đến 200.
Tuy nhiên, callMinutes> 100 AND <200 sẽ không hợp lệ vì dấu nhỏ hơn và
200 tuân theo toán tử AND không tạo thành biểu thức Boolean hoàn chỉnh.

Để 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

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


Hiểu và logic
145

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.

Hiểu HOẶC Logic


Đôi khi bạn muốn hành động khi một trong hai điều kiện là đúng. Đây là
được gọi là quyết định HOẶC vì một trong hai điều kiện hoặc một số điều kiện khác phải được đáp ứng trong
để một số hành động diễn ra. Nếu ai đó hỏi, "Bạn có rảnh cho bữa tối thứ Sáu hoặc
Thứ bảy ?, "chỉ một trong hai điều kiện phải đúng đối với câu trả lời cho toàn bộ câu hỏi
là có; chỉ khi câu trả lời cho cả hai nửa câu hỏi đều sai thì giá trị của toàn bộ
biểu thức sai.

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

Không callMade> Đúng


CUỘC GỌI?

Không văn bản Đã gửi> Đúng


LỪA ĐẢO? customerBill =
customerBill +
customerBill = CAO CẤP
customerBill +
CAO CẤP

đầu ra customerId, cuộc gọiMade,


"cuộc gọi đã thực hiện;", textSent,
"tin nhắn đã được gửi. Tổng hóa đơn $",
customerBill

khách hàng đầu vàoId,


callMade, textSent

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.

Viết HOẶC lựa chọn để đạt hiệu quả


Đối với điều kiện VÀ, khi bạn sử dụng điều kiện HOẶC, bạn có thể chọn yêu cầu
câu hỏi đầu tiên. Ví dụ: bạn có thể thêm $ 20 vào hóa đơn của những khách hàng gặp một
hoặc tiêu chí còn lại trong số hai tiêu chí sử dụng logic trong một trong hai phần của Hình 4-12.

Không callMade> Đúng

CUỘC GỌI?

Không văn bản Đã gửi> Đúng

LỪA ĐẢO?
customerBill =
customerBill +
customerBill = CAO CẤP
customerBill +
CAO CẤP

if callMade> CALLS then


customerBill = customerBill + PREMIUM
khác
if textSent> TEXTS then
customerBill = customerBill + PREMIUM
endif
endif

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)

Không văn bản Đã gửi> Đúng

LỪA ĐẢO?
148

Không Đúng
callMade>
CUỘC GỌI?
customerBill =
customerBill +
customerBill = CAO CẤP
customerBill +
CAO CẤP

if textSent> TEXTS then


customerBill = customerBill + PREMIUM
khác
if callMade> CALLS then
customerBill = customerBill + PREMIUM
endif
endif

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ẻ.

THAM KHẢO NHANH 4-4 Bảng Chân lý cho Toán tử HOẶC


x? y? x HAY y?

Thật Thật Thật


Thật Sai Thật
Sai Thật Thật
Sai Sai Sai

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

if callMade> CALLS then


customerBill = customerBill + PREMIUM
khác
if textSent> TEXTS then
customerBill = customerBill + PREMIUM
endif
endif

Không callMade> Đúng

CUỘC GỌI?

Không văn bản Đã gửi> Đúng

LỪA ĐẢO?
customerBill =
customerBill +
customerBill = CAO CẤP
customerBill +
CAO CẤP

Hình 4-13 Sử dụng toán tử OR và logic đằng sau nó


© 2015 Cengage Learning

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.

Tránh các lỗi thường gặp trong lựa chọn HOẶC


Đảm bảo rằng Biểu thức Boolean là Hoàn thành
Như với toán tử AND , hầu hết các ngôn ngữ lập trình yêu cầu một Boolean hoàn chỉnh
biểu thức trên mỗi bên của toán tử OR . Ví dụ: nếu bạn muốn hiển thị một thông báo
khi khách hàng thực hiện 0 cuộc gọi hoặc hơn 2000 cuộc gọi, biểu thức callMade = 0
HOẶC cuộc gọiMade> 2000 là
thích hợp nhưng cuộc gọiMade = 0 HOẶC> 2000 thì không, vì
biểu thức ở bên phải của toán tử OR không phải là một biểu thức Boolean hoàn chỉnh.
Trang 26
Ngoài ra, như với toán tử AND , bạn có thể đặt từng phép so sánh đơn giản trong dấu ngoặc đơn
để rõ ràng nếu bạn muốn, như trong tuyên bố sau:
if (callMade = 0) HOẶC (callMade> 2000) thì
đầu ra "Sử dụng không thường xuyên"
151
endif

Đảm bảo rằng các lựa chọn được cấu trú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.

Không callMade> Đúng


CUỘC GỌI?

customerBill =
Không văn bản Đã gửi> Đúng
customerBill +
LỪA ĐẢO?
CAO CẤP

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


Lưu đồ này không phải là
có cấu trúc. Quyết định này
được xuất cảnh sớm.

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.

Các tuyên bố quan trọng:


num patronAge
giá num
num MIN_AGE = 13
num MAX_AGE = 64
num FULL_PRICE = 8,50
num DISCOUNTED_PRICE = 6,00

nếu patronAge <MIN_AGE AND patronAge> MAX_AGE thì


Đừng làm điều đó giá = DISCOUNTED_PRICE
Nó là không thể cho một khác
người bảo trợ cho cả hai giá = FULL_PRICE
dưới 13 tuổi và trên 64 tuổi. endif

Không patronAge < Đúng


MIN_AGE VÀ
patronAge>
MAX_AGE?

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

nếu patronAge <MIN_AGE HOẶC patronAge> MAX_AGE thì


giá = DISCOUNTED_PRICE
khác
giá = FULL_PRICE
endif

patronAge <
Không MIN_AGE HOẶC Đúng
patronAge>
MAX_AGE?

giá = FULL_PRICE giá = DISCOUNTED_PRICE

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?

giá = DISCOUNTED_PRICE giá = FULL_PRICE

Hình 4-17 Incorrectlogicthatattemptstochargefullpriceforpatronswhoseageisover12andunder65


© 2015 Cengage Learning
Trang 30 Các tuyên bố quan trọng:
num patronAge
giá num
num MIN_AGE = 12 nếu patronAge> MIN_AGE AND patronAge <MAX_AGE thì 155
num MAX_AGE = 65 giá = FULL_PRICE
num FULL_PRICE = 8,50 khác
num DISCOUNTED_PRICE = 6,00 giá = DISCOUNTED_PRICE
endif

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

Xem video Tìm hiểu sâu về các quyết định VÀ và HOẶC.

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


Hiểu HOẶC Logic

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

Hiểu KHÔNG Logic


Bên cạnh toán tử AND và OR , hầu hết các ngôn ngữ đều hỗ trợ toán tử NOT . Bạn sử dụng logic KHÔNG
toán tử để đảo ngược ý nghĩa của một biểu thức Boolean. Ví dụ như sau
đầu ra câu lệnh Có thể đăng ký bỏ phiếu khi tuổi lớn hơn hoặc bằng 18:
nếu KHÔNG (tuổi <18) thì
đầu ra "Có thể đăng ký bình chọn"
endif

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

nếu tuổi> = 18 thì


đầu ra "Có thể đăng ký bình chọn"
endif
Trang 32

Tránh một lỗi phổ biến trong biểu thức NOT


Bởi vì suy nghĩ với tiêu cực rất khó, bạn cần phải cẩn thận để không tạo ra những điều tầm thường
biểu thức khi sử dụng logic NOT. Ví dụ: giả sử sếp của bạn yêu cầu bạn hiển thị
thông báo cho tất cả các nhân viên ngoại trừ những người ở Phòng 1 và 2. Bạn có thể viết
sau mã không chính xác:
Đừng làm điều đó
nếu KHÔNG phải nhân viênDept = 1 HOẶC KHÔNG phải nhân viênDept = 2 thì Logic này không
đầu ra "Nhân viên không thuộc Bộ phận 1 hoặc 2" loại bỏ nhân viên trong
endif Khoa 1 và 2.

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.

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


Hiểu KHÔNG Logic

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) .

Thực hiện lựa chọn trong phạm vi


Bạn thường cần phải thực hiện hành động khi một biến nằm trong một phạm vi giá trị. Ví dụ,
giả sử công ty của bạn cung cấp nhiều chiết khấu cho khách hàng dựa trên số lượng mặt hàng
theo thứ tự, như trong Hình 4-19.
Trang 33

Khi bạn viết chương trình xác định một


Mặt hàng Giảm giá tỷ lệ chiết khấu dựa trên số lượng mặt hàng, bạn
Đã đặt hàng Tỷ lệ (%) có thể đưa ra hàng trăm quyết định, đánh giá
itemQuantity = 1 , itemQuantity = 2 ,
v.v.
0 đến 10 0 trên. Tuy nhiên, sẽ thuận tiện hơn khi tìm thấy
chính xác tỷ lệ chiết khấu bằng cách sử dụng một kiểm tra phạm vi.
Khi bạn sử dụng kiểm tra phạm vi , bạn so sánh
11 đến 24 10
biến thành một loạt các giá trị đánh dấu giới hạn
kết thúc của phạm vi. Để thực hiện kiểm tra phạm vi, hãy
25 đến 50 15 so sánh bằng cách sử dụng thấp nhất hoặc cao nhất
giá trị trong mỗi phạm vi giá trị. Ví dụ, để tìm
mỗi tỷ lệ chiết khấu được liệt kê trong Hình 4-19, bạn có thể
51 trở lên 20 sử dụng một trong các kỹ thuật sau:

So sánh bằng cách sử dụng các đầu thấp của


Hình 4-19 Tỷ lệ chiết khấu dựa trên
các dãy.
mục thứ tự Bạn có thể hỏi: Liệu số lượng item có ít hơn không
© 2015 Cengage Learning hơn 11? Nếu không, nó có nhỏ hơn 25 không? Nếu
không, nó có nhỏ hơn 51 không? (Nếu có thể
giá trị âm, bạn cũng sẽ kiểm tra giá trị nhỏ hơn 0 và lấy
hành động thích hợp nếu nó là.)

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

Không itemsOrdered <= Đúng


RANGE1?

Đúng khách hàng


Không mục thứ tự
<= RANGE2? = DISCOUNT1

Không Đúng khách hàng


mục thứ tự = DISCOUNT2
<= RANGE3?

khách hàng khách hàng


= DISCOUNT4 = DISCOUNT3

if itemsOrdered <= RANGE1 then


customerDiscount = DISCOUNT1
khác
if itemsOrdered <= RANGE2 then
customerDiscount = DISCOUNT2
khác
if itemsOrdered <= RANGE3 then
customerDiscount = DISCOUNT3
khác
customerDiscount = DISCOUNT4
endif
endif
endif

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

RANGE3 là true, do đó, customerDiscount trở thành DISCOUNT3 , là 0,15. Đi bộ qua


logic với các giá trị khác cho itemsOrdered và xác minh cho chính mình rằng chiết khấu đúng là
áp dụng mỗi lần.
Tránh các lỗi thường gặp khi sử dụng kiểm tra phạm vi
Để tạo các chương trình được viết tốt bao gồm kiểm tra phạm vi, bạn nên cẩn thận loại bỏ
các đường chết và để tránh thử nghiệm cùng một phạm vi giới hạn nhiều lần.

Loại bỏ các con đường chết


Khi các lập trình viên mới thực hiện kiểm tra phạm vi, họ có xu hướng bao gồm logic có quá
nhiều quyết định, kéo theo nhiều công việc hơn mức cần thiết.
Hình 4-21 cho thấy một đoạn chương trình chứa kiểm tra phạm vi mà người lập trình
đã hỏi một câu hỏi quá nhiều — câu hỏi được tô bóng trong hình. Nếu bạn biết điều đó
itemsOrdered không
nhỏ hơn hoặc bằng RANGE1 , không nhỏ hơn hoặc bằng RANGE2 và không
nhỏ hơn hoặc bằng RANGE3 , thì itemsOrdered phải lớn hơn RANGE3 . Các
so với RANGE3 là tầm thường, vì vậy hỏi xem itemsOrdered lớn hơn RANGE3 là một
mất thời gian; không có đơn đặt hàng nào của khách hàng có thể đi theo con đường hợp lý ở phía xa bên trái của
sơ đồ. Bạn có thể nói một con đường như vậy là một con đường chết hoặc không thể truy cập được và rằng các câu lệnh
được viết ở đó tạo thành mã chết hoặc không thể truy cập được. Mặc dù một chương trình có chứa
logic như vậy sẽ thực hiện và chỉ định mức chiết khấu chính xác cho những khách hàng đặt hàng nhiều hơn
50 mặt hàng, cung cấp một đường dẫn như vậy là không hiệu quả.

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

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

Không Đúng
itemsOrdered <=
RANGE1?

Đừng làm điều đó Không Đúng


mục thứ tự khách hàng
Đây là một con đường chết.
<= RANGE2? = DISCOUNT1

Không Đúng khách hàng


mục thứ tự
= DISCOUNT2
<= RANGE3?

Không Đúng khách hàng


mục thứ tự = DISCOUNT3
> RANGE3?

khách hàng
= DISCOUNT4

if itemsOrdered <= RANGE1 then


Đừng làm điều đó
customerDiscount = DISCOUNT1
Quyết định này không bao giờ có thể
khác
sai.
if itemsOrdered <= RANGE2 then
customerDiscount = DISCOUNT2
khác
if itemsOrdered <= RANGE3 then
customerDiscount = DISCOUNT3
khác
if itemsOrdered> RANGE3 then
customerDiscount = DISCOUNT4
endif
endif
endif
endif

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

num DISCOUNT3 = 0,15


num DISCOUNT4 = 0,20

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?

khách hàng khách hàng


= DISCOUNT4 = DISCOUNT3

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


Không có ý nghĩa
hỏi phần đầu tiên
if itemsOrdered <= RANGE1 then trong số những câu hỏi này.
customerDiscount = DISCOUNT1
khác
if itemsOrdered> RANGE1 AND itemsOrdered <= RANGE2 then
customerDiscount = DISCOUNT2
khác
if itemsOrdered> RANGE2 AND itemsOrdered <= RANGE3 then
customerDiscount = DISCOUNT3
khác
customerDiscount = DISCOUNT4
endif
endif
endif

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.

Thực hiện lựa chọn trong phạm vi

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.

Hiểu ưu tiên khi kết hợp


Toán tử VÀ và HOẶC
Hầu hết các ngôn ngữ lập trình cho phép bạn kết hợp nhiều toán tử AND và OR trong một
biểu hiện như bạn cần. Ví dụ: giả sử rằng bạn cần đạt được số điểm ít nhất là 75 trên
mỗi ba bài kiểm tra để vượt qua một khóa học. Bạn có thể khai báo hằng số MIN_SCORE bằng 75 và kiểm tra
nhiều điều kiện với một câu lệnh như sau:
nếu điểm1> = MIN_SCORE VÀ điểm2> = MIN_SCORE VÀ điểm 3> = MIN_SCORE thì
classGrade = "Đạt"
khác
classGrade = "Không đạt"
endif

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ả.

Các tuyên bố quan trọng: nếu xếp hạng = "G" thì


xếp hạng chuỗi nếu tuổi <= 12 thì
tuổi num đầu ra "Áp dụng chiết khấu"
khác
nếu tuổi> = 65 thì
đầu ra "Áp dụng chiết khấu"
endif
endif
endif

Không Xếp hạng Đúng


= "G"?

Không Đúng
tuổi <=
12?

Không tuổi> = Đúng đầu ra


65? "Giảm giá
áp dụng "

đầ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

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


Hiểu ưu tiên khi kết hợp toán tử AND và OR
166

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.

Tóm tắt chương


Các quyết định của chương trình máy tính được thực hiện bằng cách đánh giá các biểu thức Boolean.
cấu trúc if-then-else hoặc if-then để lựa chọn giữa hai kết quả có thể xảy ra.
Bạn có thể sử dụng toán tử so sánh quan hệ để so sánh hai toán hạng của cùng một dữ liệu
kiểu. Các toán tử so sánh quan hệ tiêu chuẩn là =,>, <,> =, <=, và <>.
Trong một quyết định AND, hai điều kiện phải đúng để một hành động kết quả xảy ra. An
Quyết định AND yêu cầu một quyết định lồng nhau hoặc sử dụng toán tử AND . Trong AND
quyết định, cách tiếp cận hiệu quả nhất là bắt đầu bằng cách hỏi câu hỏi ít có khả năng
đúng.
Trong một quyết định HOẶC, ít nhất một trong hai điều kiện phải đúng để thực hiện một hành động
địa điểm. T
có nhiều khả năng là đúng. Hầu hết các ngôn ngữ lập trình đều cho phép bạn hỏi hai hoặc nhiều hơn
câu hỏi trong một phép so sánh duy nhất bằng cách sử dụng toán tử OR có điều kiện .
Toán tử NOT logic đảo ngược ý nghĩa của một biểu thức Boolean.

Để 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

Câu hỏi đánh giá

168 1. A biểu thức có một trong hai giá trị: true hoặc false.

a. Người Gruzia c. Man rợ


b. Boolean d. Chọn lọc
2. Trong một lựa chọn, mệnh đề else thực thi .
a. khi điều kiện được kiểm tra là đúng
b. khi điều kiện được kiểm tra là sai
c. luôn luôn
d. chỉ sau khi mệnh đề if thực thi
3. Toán tử lớn hơn đánh giá là đúng khi .

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.

4. Một biểu thức Boolean tầm thường là một biểu thức .

a. không quan trọng c. luôn luôn là sai


b. là phức tạp d. luôn có cùng giá trị

5. Nếu x <= y là true, thì .


a. x = y là đúng c. x> y là sai
b. y <= x là đúng d. x> = y là sai
6. Nếu j <> k là true, thì .
a. j = k là đúng c. j <k có thể đúng
b. j> k có thể đúng 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

9. Nếu p đúng và q sai thì .

a. p HOẶC q là đúng c. p VÀ q là đúng


b. p HOẶC q là sai d. p lớn hơn q
10. Lựa chọn có chữ cái nào tương đương với quyết định sau?
169
nếu x> 10 thì
nếu y> 10 thì
đầu ra "X"
endif
endif
a. nếu x> 10 HOẶC y> 10 thì xuất "X" endif
b. nếu x> 10 VÀ x> y thì xuất "X" endif
c. nếu y> x thì xuất "X" endif
d. nếu x> 10 VÀ y> 10 thì xuất "X" endif

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. a> b VÀ b> c c. e <f VÀ g <100 VÀ g <> 5


b. d = 10 HOẶC d> 20 d. h <10 VÀ h = 4
13. Biểu thức nào sau đây là biểu thức Boolean tầm thường?
a. k <b VÀ k> b c. n> 12 HOẶC p> 12
b. m = 10 HOẶC m = 20 d. q> 10 VÀ q <19
14. Biểu thức nào sau đây là biểu thức Boolean tầm thường?
a. r <b VÀ f> b c. f> 12 HOẶC f <19
b. r = 10 HOẶC r <0 d. r> f VÀ f <b
15. 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 8 nhận?
nếu bộ phận <5 thì
tăng = SMALL_RAISE
khác
nếu bộ phận <14 thì
tăng = MEDIUM_RAISE
khác
nếu bộ phận <9 thì
tăng = BIG_RAISE
endif
endif
endif
Trang 45

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

nếu bộ phận <6 thì


tăng = MEDIUM_RAISE
khác
nếu bộ phận <10 thì
tăng = BIG_RAISE
endif
endif
endif
a. SMALL_RAISE
b. MEDIUM_RAISE
c. BIG_RAISE
d. không thể nói

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

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

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

k. numberBig> numberMedium AND numberBig <numberSmall


l. numberBig = 100 HOẶC numberBig> numberSmall
m. số Lớn <10 HOẶC số Nhỏ> 10
n. numberBig = 30 AND numberMedium = 100 OR numberSmall = 100
2. Thiết kế một lưu đồ hoặc mã giả cho một chương trình chấp nhận hai số từ một
người dùng và hiển thị một trong các thông báo sau: Thứ nhất lớn hơn, Thứ hai lớn hơn,
Các số bằng nhau.

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.

c. Aprogramthat chấp nhận bán hàng


và hiển thị danh sách những nhân viên bán hàng đã bán các chính sách từ 5 đến 10 trong tháng.
Trang 47

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à 30 hoặc ít hơn, tiền thưởng là $ 25.


Nếu điểm năng suất là 31 trở lên và nhỏ hơn 80, tiền thưởng là $ 50.
175
Nếu điểm năng suất là 80 trở lên và dưới 200, tiền thưởng
là $ 100.

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ể:

60% nhân viên có điểm năng suất lớn hơn 200.


Thực hiện bảo trì

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.

Khu vực chơi game

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.

Số phù hợp Giải thưởng ($)

Bất kỳ một phù hợp 10


Hai kết hợp 100
Ba khớp, không theo thứ tự 1000
Ba khớp theo thứ tự chính xác 1.000.000
Không có trận đấu 0

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.

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

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?

You might also like