如何使程序停止出现构建问题并停止使用负数?

问题描述

我的程序需要能够计算每月的电话费,并且有3个计划:10小时免费且收费9.95的基本服务,20小时免费并收费14.95的金卡服务以及白金服务,您无限制的小时它的价格为19.95。当我的程序的小时数少于免费小时数时,它会从初始成本中减去这些小时数,并且还有构建小时数。

  #include <iostream>
#include <string>
using namespace std;

int main()
{
    //Set up the variables.
    string input;
    int hours;
    int basicHours;
    int goldHours;
    float extraBasic;
    float basicCost;
    float goldCost;

    // Will ask and display the user their plan and hours.
    cout << "Hello! Welcome to the Comms4You Telecom Company!" << endl;
    cout << "Please provide your plan." << endl;
    cin >> input;
    cout << input << ",Ok now please provide the amount of hours you used." << endl;
    cin >> hours;
    //Calculate different equations
     basicHours = (hours - 10);
     goldHours = (20 - hours);
     extraBasic = (basicHours * 2);
     basicCost = (9.95 + extraBasic);
     goldCost = (14.95 + goldHours);
    //This part is for displaying to the users plans and hours.(Also calculations)
     if (input == "Platinum") {
         cout << "Our company thanks you for using " << hours << " hours! " << "Your total cost is $19.95.";
     }
     else if (input == "Gold") {
         cout << "Our company thanks you for using " << hours << " hours! " << "Your total cost is $" << goldCost << ".";
     }
     else if (input == "Basic") {
         cout << "Our company thanks you for using " << hours << " hours! " << "Your total cost is $" << basicCost << ".";
     }
     else
        return 0; 

}

解决方法

问题出在以下几行:

     basicHours = (hours - 10);
     goldHours = (20 - hours);
     extraBasic = (basicHours * 2);
     basicCost = (9.95 + extraBasic);
     goldCost = (14.95 + goldHours);

考虑他们在做什么。

basicHours = (hours - 10);

如果小时数为11,则basicHours现在为11 - 10 = 1。很好但是,如果小时数是9,则basicHours现在为9 - 10 = -1。这不是您想要的;如果我的空闲时间少于10小时,那么您希望basicHours为0。 因此,您可以改写:

if (hours > 10) {
    basicHours = hours - 10;
}
else {
    basicHours = 0;
}

或等效地:

basicHours = (hours > 10) ? hours - 10 : 0;

goldHours = (20 - hours)

这应该与basicHours完全相同,只是用20而不是10!我会让你修改上面的代码。

basicCost = (9.95 + extraBasic);goldCost = (14.95 + goldHours);

这是错误的。 9.95是货币价值,以欧元为单位。 extraBasic是一个时间,以小时为单位。您不能用欧元增加时间!如果我使用12个小时的基本计划,9.95€ + 2h的结果是什么?我不知道,这没有道理。

如果我在基本计划中使用了12个小时,那么我必须支付9.95€,并且必须支付额外的2小时。额外2小时的费用是多少?这是一个小时成本的2倍;换句话说,这是多余的时间乘以小时费率。您的程序中应具有一个名为hourlyRatebasicHourlyRate的常量变量,并带有该值。然后您可以编写:

basicCost = 9.95 + extraBasic * basicHourlyRate;
goldCost = 14.95 + goldHours * goldHourlyRate;

编码风格:单独的数据和代码

要遵循的一个好规则是永远不要将数据放入代码中。所有文字值都是数据。基本计划以及黄金和铂金计划的成本均为数据。每小时费率是数据。每个计划的“免费”小时数是数据。定义一些带有显式名称的变量,在代码的开头用数据初始化这些变量,然后编写其余代码,而无需使用文字值。这很重要的原因有两个。

  1. 使用变量将更易于阅读代码。变量中的显式名称使代码有意义。如果您在代码内部使用文字值,那么阅读您的代码的人将不知道这些值代表什么。为什么从10中减去hours?我们必须考虑一下10的来源。但是,如果您写basicPayingHours = hours - freeBasicHours,我们会立即理解。 “正在阅读代码的人”包括向您展示代码的StackOverflow成员,还包括您的同学或同事,老师或老板,最重要的是,自六个月后再次阅读代码时,您自己。

  2. 当数据更改时,如果数据与代码完全分开,则更新代码会容易得多。想象一下您正在为该电话公司工作。明年,他们将更新计划,现在的基本计划是每月9.99,而不是9.95。如果将此值存储在代码的basicPlanInitialCost = 9.95;行的开头,则很容易对其进行更新。但是,如果代码中多次出现9.95,则必须对其进行跟踪并手动更改所有内容-此过程很容易出错,原因有两个:可能不小心更改了也要花费9.95的其他项目的成本;您可能会忘记更新依赖于基本成本每月价格(例如基本成本的年度价格,12 * 9.95 = 119.40)的值。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...