如何让我的程序停止出现构建问题并停止使用负数?
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倍;换句话说,它是额外时间乘以小时费率。您的程序中应该有一个名为 hourlyRate
或 basicHourlyRate
的常量变量,具有该值。然后你可以写:
basicCost = 9.95 + extraBasic * basicHourlyRate;
goldCost = 14.95 + goldHours * goldHourlyRate;
编码风格:数据和代码分离
要遵循的一个好规则是永远不要将数据放入代码中。所有文字值都是数据。基本计划、黄金计划和白金计划的费用是数据。小时费率是数据。每个计划的“免费”小时数是数据。定义一些具有显式名称的变量,在代码的最开始用数据初始化这些变量,然后在不使用文字值的情况下编写其余代码。这很重要有两个原因。
有了变量,代码会更容易阅读。变量中的明确名称使代码有意义;如果您在代码中使用文字值,阅读您代码的人将不知道这些值代表什么。为什么要从 hours
中减去 10
?我们得想想这个10
是从哪里来的。但是,如果你写basicPayingHours = hours - freeBasicHours
,我们马上就明白了。 “阅读你的代码的人”包括你向其展示代码的 Whosebug 成员,还包括你的同学或同事、你的老师或老板,最重要的是,当你在六个月后再次阅读你的代码时你自己。
当数据发生变化时,如果数据与代码完全分离,更新代码会容易得多。想象一下你正在为此工作phone公司。明年,他们更新了他们的计划,基本计划现在是每月 9.99,而不是 9.95。如果此值存储在代码开头的一行 basicPlanInitialCost = 9.95;
中,则更新它非常容易。但是,如果您的代码中多次出现 9.95,您将不得不跟踪它们并手动更改它们 - 这个过程很容易出错,原因有两个:您可能不小心更改了其他成本也为 9.95 的成本;您可能会忘记更新依赖于基本成本每月价格的值(例如基本成本的年度价格,即 12 * 9.95 = 119.40
)。
我的程序需要能够计算月度 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倍;换句话说,它是额外时间乘以小时费率。您的程序中应该有一个名为 hourlyRate
或 basicHourlyRate
的常量变量,具有该值。然后你可以写:
basicCost = 9.95 + extraBasic * basicHourlyRate;
goldCost = 14.95 + goldHours * goldHourlyRate;
编码风格:数据和代码分离
要遵循的一个好规则是永远不要将数据放入代码中。所有文字值都是数据。基本计划、黄金计划和白金计划的费用是数据。小时费率是数据。每个计划的“免费”小时数是数据。定义一些具有显式名称的变量,在代码的最开始用数据初始化这些变量,然后在不使用文字值的情况下编写其余代码。这很重要有两个原因。
有了变量,代码会更容易阅读。变量中的明确名称使代码有意义;如果您在代码中使用文字值,阅读您代码的人将不知道这些值代表什么。为什么要从
hours
中减去10
?我们得想想这个10
是从哪里来的。但是,如果你写basicPayingHours = hours - freeBasicHours
,我们马上就明白了。 “阅读你的代码的人”包括你向其展示代码的 Whosebug 成员,还包括你的同学或同事、你的老师或老板,最重要的是,当你在六个月后再次阅读你的代码时你自己。当数据发生变化时,如果数据与代码完全分离,更新代码会容易得多。想象一下你正在为此工作phone公司。明年,他们更新了他们的计划,基本计划现在是每月 9.99,而不是 9.95。如果此值存储在代码开头的一行
basicPlanInitialCost = 9.95;
中,则更新它非常容易。但是,如果您的代码中多次出现 9.95,您将不得不跟踪它们并手动更改它们 - 这个过程很容易出错,原因有两个:您可能不小心更改了其他成本也为 9.95 的成本;您可能会忘记更新依赖于基本成本每月价格的值(例如基本成本的年度价格,即12 * 9.95 = 119.40
)。