我正在尝试为分配计算远程呼叫费率的分配创建一个程序,该程序会考虑呼叫的开始时间和长度,并输出总成本和净成本。 涉及到几个参数,我已经在条件语句中实现了
任何在下午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 : $23.45
net cost: $0.78792
netcost未正确评估,因为它正在跳过第一个条件,即使startTime的值符合参数。 输出应为:
Enter start time: 2322
Enter length of call in minutes: 67
gross cost: $23.45
net cost: $10.24
我不是在找人做我的作业,只是指示一些方向引导我朝着正确的方向前进,我已经多次超过条件而且我仍然对为什么不进行评估感到困惑。感谢任何帮助。谢谢。
答案 0 :(得分:4)
这里有一个逻辑错误:一个数字不能大于或等于1800 且同时小于或等于800。修改第一个条件。我会分两部分打破它
if((time >= 1800 & <=2400) || (time >= 0 && time <= 800))
。
这里的实际逻辑错误是在晚上6点之后调用 而在8AM之前 将在不同的日子里调用!因此,我们确实需要两个条件来检查日期的界限,并结合起来。
@Reto Koradi每条评论的编辑:
如果省略边界检查,结果不会改变。如上所述,改变的要点是突出两个条件的相互排斥性,这是通过将&&
换成||
来实现的:
if (time >= 1800 || time <= 800)
答案 1 :(得分:2)
问题是
if ((startTime >= 1800) && (startTime <= 800)){
这两个条件是相互排斥的。没有大于1800的数字,同时小于800.你可能想要修正这样的比较条件(由于iksemyonov的评论,对未来的读者有所改进。请参考他对同一问题的回答)
if ((startTime >= 1800) || (startTime <= 800)){
答案 2 :(得分:2)
为什么它不起作用的解释是相当明显的,并已在其他答案中涵盖。这个表达式永远不会成立,因为没有数字大于1800且小于800。
if ((startTime >= 1800) && (startTime <= 800)){
&&
运算符测试两个条件是否为真。
更有趣的部分是为什么人们犯了这个错误。当你开始使用逻辑表达式时,你既不是第一个也不是最后一个陷入这个陷阱的人。
我认为原因在于,在自然语言中,我们使用“和”这个词与逻辑运算符非常不同。当你说“早上8点之前和下午6点之后”时,“和”更多地与“联合”设置操作相对应。你基本上定义了一个包含“上午8点之前的所有时间”和“下午6点之后的所有时间”的集合,这是一个集合联盟。
与“union”设置操作匹配的逻辑运算符是逻辑“或”。至少有一个输入集中的任何元素都是union的一部分。因此,对于两个集合的并集,union是第一组或中第二组元素的集合。
理解了这一点,正确的条件是:
if ((startTime >= 1800) || (startTime <= 800)){
其中||
是逻辑“或”运算符。
逻辑操作的工作方式与日常用语的使用方式不同并不罕见。因此,在将语言转换为逻辑表达式时,您始终需要小心。另一个流行的例子是,自然语言中的“或”主要对应于排他性或,而“或”运算符是包含性的。因此,如果有人告诉你“你可以接受或离开它”,这意味着你必须决定,而标准的逻辑“或”运算符实际上允许你同时做到这两点。
答案 3 :(得分:1)
x怎么样&gt; 1800和x&lt; 800在同一时间是真的吗?如果第一个为真,则该语句将始终为false。