C++ && 条件从未执行
c++ && conditional never executed
我正在尝试为计算长途电话费率的作业创建一个程序,该程序接受开始时间和通话时长,并输出总成本和净成本。
涉及到几个参数,我已经在条件语句中实现了,
在 6:00 下午 (1800) 或之后但在 8:00 上午 (800) 之前开始的任何通话都打折 50%。
所有通话均需缴纳 4% 的联邦税。
正常费率是每分钟 0.35 美元。
任何超过 60 分钟的通话都可享受 16% 的费用折扣(减去任何其他折扣后但未加税)。
但是,第一个条件代码从未执行过,我已经尝试了几种不同的操作数,但仍然没有弄明白。
#import <iostream>
using namespace std;
int main() {
//declare variables
int startTime;
int callLength;
double grossCost = 0;
double netCost;
const double callRate = 0.35;
const double fedTax = 0.04;
const double discount1 = 0.50;
const double discount2 = 0.16;
//begin user prompt
cout << "Enter start time: " << endl;
cin >> startTime;
cout << "Enter length of call in minutes: " << endl;
cin >> callLength;
//define our grossCost
grossCost = (callLength * callRate);
//lez do some conditionals
if ((startTime >= 1800) && (startTime <= 800)){
netCost = grossCost - (grossCost * discount1);
netCost *= fedTax;
}
else if (callLength > 60){
netCost = grossCost - (grossCost * discount2);
netCost *= fedTax;
}
else{
netCost = (grossCost * fedTax);
}
//print out our final costs
cout << "gross cost : " << "$" << grossCost << endl;
cout << "net cost: " << "$" << netCost << endl;
return 0;
}
所以,当尝试输入时:
Enter start time: 2322
Enter length of call in minutes: 67
gross cost : .45
net cost: [=11=].78792
netcost 未被正确评估,因为它跳过了第一个条件,即使 startTime 的值符合参数。
输出应该是:
Enter start time: 2322
Enter length of call in minutes: 67
gross cost: .45
net cost: .24
我不是在找人帮我做功课,只是一些指引我朝着正确的方向前进,我已经多次检查条件,但我仍然对为什么它没有评估感到困惑。感谢任何帮助,谢谢。
x > 1800 和 x < 800 怎么可能同时为真?。如果第一个为真,则该陈述将永远为假。
你这里有一个逻辑错误:一个数不能同时大于等于1800和小于等于800。修改第一个条件。我会把它分成两部分
if((time >= 1800 & <=2400) || (time >= 0 && time <= 800))
.
这里实际的逻辑错误是调用 下午 6 点后 和 上午 8 点前 将存在于不同的日子!所以我们确实需要两个条件来同时检查日期的边界。
根据@Reto Koradi 的评论进行编辑:
如果我们省略边界检查,结果不会改变。如上所述,更改的要点是突出两个条件的互斥性,这是通过将 &&
换成 ||
:
来实现的
if (time >= 1800 || time <= 800)
问题是
if ((startTime >= 1800) && (startTime <= 800)){
这两个条件是互斥的。没有大于 1800 且同时小于 800 的数字。您可能希望像这样修复比较条件(感谢 iksemyonov 的评论,为未来的读者改进。请参考他对同一问题的回答)
if ((startTime >= 1800) || (startTime <= 800)){
为什么它不起作用的解释相当明显,并且已在其他答案中涵盖。这个表达式永远不可能为真,因为没有数字既大于 1800 又小于 800。
if ((startTime >= 1800) && (startTime <= 800)){
&&
运算符测试两个条件是否为真。
更有趣的部分是为什么人们会犯这个错误。在开始使用逻辑表达式时,您既不是第一个也不是最后一个掉入这个陷阱的人。
我认为原因是在自然语言中,我们使用单词 "and" 的方式与逻辑运算符非常不同。当您说 "before 8 am and after 6 pm" 时,"and" 更符合 "union" 集合操作。您基本上是在定义一个包含 "all times before 8 am" 和 "all times after 6 pm" 的集合,这是一个集合并集。
与"union"集合运算匹配的逻辑运算符是逻辑"or"。至少一个输入集中的任何元素都是并集的一部分。因此,对于两个集合的并集,并集是包含第一个集合 或 第二个集合中的元素的集合。
明白了这一点,正确的条件是:
if ((startTime >= 1800) || (startTime <= 800)){
其中 ||
是逻辑 "or" 运算符。
与日常语言中使用方式不同的逻辑运算并不少见。所以在将语言翻译成逻辑表达式时,你总是需要小心。另一个流行的例子是自然语言中的 "or" 主要对应于异或,而 "or" 运算符是包容性的。因此,如果有人告诉您 "you can take it or leave it",这意味着您必须做出决定,而标准逻辑 "or" 运算符实际上允许您同时执行这两项操作。
我正在尝试为计算长途电话费率的作业创建一个程序,该程序接受开始时间和通话时长,并输出总成本和净成本。 涉及到几个参数,我已经在条件语句中实现了,
在 6:00 下午 (1800) 或之后但在 8:00 上午 (800) 之前开始的任何通话都打折 50%。
所有通话均需缴纳 4% 的联邦税。
正常费率是每分钟 0.35 美元。
任何超过 60 分钟的通话都可享受 16% 的费用折扣(减去任何其他折扣后但未加税)。
但是,第一个条件代码从未执行过,我已经尝试了几种不同的操作数,但仍然没有弄明白。
#import <iostream>
using namespace std;
int main() {
//declare variables
int startTime;
int callLength;
double grossCost = 0;
double netCost;
const double callRate = 0.35;
const double fedTax = 0.04;
const double discount1 = 0.50;
const double discount2 = 0.16;
//begin user prompt
cout << "Enter start time: " << endl;
cin >> startTime;
cout << "Enter length of call in minutes: " << endl;
cin >> callLength;
//define our grossCost
grossCost = (callLength * callRate);
//lez do some conditionals
if ((startTime >= 1800) && (startTime <= 800)){
netCost = grossCost - (grossCost * discount1);
netCost *= fedTax;
}
else if (callLength > 60){
netCost = grossCost - (grossCost * discount2);
netCost *= fedTax;
}
else{
netCost = (grossCost * fedTax);
}
//print out our final costs
cout << "gross cost : " << "$" << grossCost << endl;
cout << "net cost: " << "$" << netCost << endl;
return 0;
}
所以,当尝试输入时:
Enter start time: 2322
Enter length of call in minutes: 67
gross cost : .45
net cost: [=11=].78792
netcost 未被正确评估,因为它跳过了第一个条件,即使 startTime 的值符合参数。 输出应该是:
Enter start time: 2322
Enter length of call in minutes: 67
gross cost: .45
net cost: .24
我不是在找人帮我做功课,只是一些指引我朝着正确的方向前进,我已经多次检查条件,但我仍然对为什么它没有评估感到困惑。感谢任何帮助,谢谢。
x > 1800 和 x < 800 怎么可能同时为真?。如果第一个为真,则该陈述将永远为假。
你这里有一个逻辑错误:一个数不能同时大于等于1800和小于等于800。修改第一个条件。我会把它分成两部分
if((time >= 1800 & <=2400) || (time >= 0 && time <= 800))
.
这里实际的逻辑错误是调用 下午 6 点后 和 上午 8 点前 将存在于不同的日子!所以我们确实需要两个条件来同时检查日期的边界。
根据@Reto Koradi 的评论进行编辑:
如果我们省略边界检查,结果不会改变。如上所述,更改的要点是突出两个条件的互斥性,这是通过将 &&
换成 ||
:
if (time >= 1800 || time <= 800)
问题是
if ((startTime >= 1800) && (startTime <= 800)){
这两个条件是互斥的。没有大于 1800 且同时小于 800 的数字。您可能希望像这样修复比较条件(感谢 iksemyonov 的评论,为未来的读者改进。请参考他对同一问题的回答)
if ((startTime >= 1800) || (startTime <= 800)){
为什么它不起作用的解释相当明显,并且已在其他答案中涵盖。这个表达式永远不可能为真,因为没有数字既大于 1800 又小于 800。
if ((startTime >= 1800) && (startTime <= 800)){
&&
运算符测试两个条件是否为真。
更有趣的部分是为什么人们会犯这个错误。在开始使用逻辑表达式时,您既不是第一个也不是最后一个掉入这个陷阱的人。
我认为原因是在自然语言中,我们使用单词 "and" 的方式与逻辑运算符非常不同。当您说 "before 8 am and after 6 pm" 时,"and" 更符合 "union" 集合操作。您基本上是在定义一个包含 "all times before 8 am" 和 "all times after 6 pm" 的集合,这是一个集合并集。
与"union"集合运算匹配的逻辑运算符是逻辑"or"。至少一个输入集中的任何元素都是并集的一部分。因此,对于两个集合的并集,并集是包含第一个集合 或 第二个集合中的元素的集合。
明白了这一点,正确的条件是:
if ((startTime >= 1800) || (startTime <= 800)){
其中 ||
是逻辑 "or" 运算符。
与日常语言中使用方式不同的逻辑运算并不少见。所以在将语言翻译成逻辑表达式时,你总是需要小心。另一个流行的例子是自然语言中的 "or" 主要对应于异或,而 "or" 运算符是包容性的。因此,如果有人告诉您 "you can take it or leave it",这意味着您必须做出决定,而标准逻辑 "or" 运算符实际上允许您同时执行这两项操作。