C++ 对基于时间和分钟计算通话成本的简单家庭作业计划感到失望

C++ 对基于时间和分钟计算通话成本的简单家庭作业计划感到失望,c++,C++,程序提示符基本上要求一个程序,在该程序中,您必须从此人处获得两个输入:时间(基于一个军事时间,即1800是下午6点)和通话分钟。 然后取这两个输入,使用布尔if-then和else语句,应用折扣,然后得到净金额。这是我的密码: #include <iostream> #include <iomanip> using namespace std; int main() { // some user variables that need inputing based

程序提示符基本上要求一个程序,在该程序中,您必须从此人处获得两个输入:时间(基于一个军事时间,即1800是下午6点)和通话分钟。 然后取这两个输入,使用布尔if-then和else语句,应用折扣,然后得到净金额。这是我的密码:

#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的后两个用法同样是未初始化的值,所以您再次得到垃圾值。请参见编辑我的答案。