C++ 对基于时间和分钟计算通话成本的简单家庭作业计划感到失望
程序提示符基本上要求一个程序,在该程序中,您必须从此人处获得两个输入:时间(基于一个军事时间,即1800是下午6点)和通话分钟。 然后取这两个输入,使用布尔if-then和else语句,应用折扣,然后得到净金额。这是我的密码:C++ 对基于时间和分钟计算通话成本的简单家庭作业计划感到失望,c++,C++,程序提示符基本上要求一个程序,在该程序中,您必须从此人处获得两个输入:时间(基于一个军事时间,即1800是下午6点)和通话分钟。 然后取这两个输入,使用布尔if-then和else语句,应用折扣,然后得到净金额。这是我的密码: #include <iostream> #include <iomanip> using namespace std; int main() { // some user variables that need inputing based
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{ // some user variables that need inputing based on their call
int starttime;
int minutes;
const float tax = 0.04;
const float flatrate = 0.35;
const float mindiscount = 0.15;
const float timediscount = 0.5;
float callrate = float (minutes * flatrate); // the standard call rate stored in a variable.
float gross; // the gross cost before discount
float net; // the net cost
cout << "enter start time: " << endl;
cin >> starttime;
if (starttime > 2499) // a check put inplace so someone doesn't enter an invalid time integer
{cout << "You entered an invalid time. Should only be based on the 24 hour clock " << endl;
return 1;}
cout << "enter total minutes: " << endl;
cin >> minutes;
gross = callrate;
cout << "gross cost: " << gross << setprecision(2) << endl;
{if ((minutes < 60 ) && (starttime < 1800 && starttime > 800)) // if no discounts are made, this is the final price before tax
net = gross;
else if (starttime > 1800 || starttime < 800) // if the call is between 6:00 PM and 8:00 AM, it gets a 50% discount
net = gross - (gross * timediscount);}
if (minutes > 60 ) // if the call lasted longer than 60 minutes, it gets a 15% discount
net = net - (net * mindiscount);
cout << "net cost: " << float (net + (net * tax)) << setprecision(2) << endl; // the final net cost with the 4% tax added.
return 0;
}
即使是基于分钟数*0.35(每分钟35美分)的总成本也应该是一个非常基本的小数字,但显示为802795。
我做错了什么?这里:
float callrate = float (minutes * flatrate);
minutes
在未初始化的情况下被使用,因此您将获得其中碰巧存在的任何垃圾值。我并没有完全遵循您的程序逻辑,但您可能希望在此之后移动该行:
当(假定输入是从cin
正确获得的,您没有验证)minutes
将有一个实际的初始化值
您也不会以这种方式使用float
,类似于:
float callrate = (float) minutes * flatrate;
但是这里无论如何都不需要强制转换,因为flatrate
首先是一个浮动,并且出于计算的目的,minutes
将自动升级。C风格的铸件在C++中也被认为是不好的形式,所以如果可以的话就避免它们。p>
编辑:同样的问题出现在这里:
{
if ((minutes < 60 ) && (starttime < 1800 && starttime > 800))
net = gross;
else if (starttime > 1800 || starttime < 800)
net = gross - (gross * timediscount);
}
if ( minutes > 60 )
net = net - (net * mindiscount);
{
如果((分钟<60)和&(开始时间<1800和开始时间>800))
净额=毛额;
否则如果(起始时间>1800 | |起始时间<800)
净=总-(总*时间折扣);
}
如果(分钟>60)
净=净-(净*mindiscount);
如果第一个If
或相应的else If
条件均为true,则net
永远不会被赋值,因此第二个If
语句可以使用未初始化的值。如果minutes>=60
且starttime
介于800和1800之间,则始终会发生这种情况
<> P>你必须小心初始化变量,因为C++在这方面是非常不宽容的。每当你得到奇怪或垃圾值时,很有可能就是这样 这里:
float callrate = float (minutes * flatrate);
minutes
在未初始化的情况下被使用,因此您将获得其中碰巧存在的任何垃圾值。我并没有完全遵循您的程序逻辑,但您可能希望在此之后移动该行:
当(假定输入是从cin
正确获得的,您没有验证)minutes
将有一个实际的初始化值
您也不会以这种方式使用float
,类似于:
float callrate = (float) minutes * flatrate;
但是这里无论如何都不需要强制转换,因为flatrate
首先是一个浮动,并且出于计算的目的,minutes
将自动升级。C风格的铸件在C++中也被认为是不好的形式,所以如果可以的话就避免它们。p>
编辑:同样的问题出现在这里:
{
if ((minutes < 60 ) && (starttime < 1800 && starttime > 800))
net = gross;
else if (starttime > 1800 || starttime < 800)
net = gross - (gross * timediscount);
}
if ( minutes > 60 )
net = net - (net * mindiscount);
{
如果((分钟<60)和&(开始时间<1800和开始时间>800))
净额=毛额;
否则如果(起始时间>1800 | |起始时间<800)
净=总-(总*时间折扣);
}
如果(分钟>60)
净=净-(净*mindiscount);
如果第一个If
或相应的else If
条件均为true,则net
永远不会被赋值,因此第二个If
语句可以使用未初始化的值。如果minutes>=60
且starttime
介于800和1800之间,则始终会发生这种情况
<> P>你必须小心初始化变量,因为C++在这方面是非常不宽容的。每当你得到奇怪或垃圾值时,很有可能就是这样 尝试在每个步骤中打印中间结果,或使用调试器。用户输入有效的开始时间并不重要,但
if(starttime>2499)
不会抱怨0868或2499这样的时间。您需要将输入分为小时和分钟,并分别进行检查。请尝试在每个步骤中打印中间结果,或使用调试器。用户何时输入有效的开始时间无关紧要,但如果(starttime>2499)不抱怨0868或2499这样的时间,则无所谓。你需要将输入分成小时和分钟,并分别检查。它现在可以工作了,但是有了这个修正,我仍然得到了一个疯狂的最终“净值”数字。这是我在更正后的输出:输入开始时间:1300输入电话总分钟数:100总成本:$35净成本:$-2147483648进程返回0(0x0)执行时间:9.273 s按任意键继续。同一问题:net
仅在分钟数<60
时分配一个值,该值与测试输入无关。当你以后做net=net-(net*mindiscount)
,net的后两个用法同样是未初始化的值,所以您再次得到垃圾值。请看编辑我的答案。它现在起作用了,但是经过这次更正,我仍然得到了一个疯狂的最终“净值”数字。这是我在更正后的输出:输入开始时间:1300输入电话总分钟数:100总成本:$35净成本:$-2147483648进程返回0(0x0)执行时间:9.273 s按任意键继续。同一问题:net
仅在分钟数<60
时分配一个值,该值与测试输入无关。当你以后做net=net-(net*mindiscount)
,net的后两个用法同样是未初始化的值,所以您再次得到垃圾值。请参见编辑我的答案。