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

How do I make my program stop having build issues and make it stop using negative numbers?

我的程序需要能够计算月度 phone 账单,并且有 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 .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。这很好。但是如果 hours 是 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. 有了变量,代码会更容易阅读。变量中的明确名称使代码有意义;如果您在代码中使用文字值,阅读您代码的人将不知道这些值代表什么。为什么要从 hours 中减去 10?我们得想想这个10是从哪里来的。但是,如果你写basicPayingHours = hours - freeBasicHours,我们马上就明白了。 “阅读你的代码的人”包括你向其展示代码的 Whosebug 成员,还包括你的同学或同事、你的老师或老板,最重要的是,当你在六个月后再次阅读你的代码时你自己。

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