//Purpose: To calculate the price to pay an author
//Programmer: Brandon C Ballard
//Last Updated: 2/20/2014
#include <iostream>
#include <cstdlib>
using namespace std;
//function prototype
float TotalPay(int numWords, char Level);
int main()
{
float TotalPay;
int numWords;
char Level;
int amtToPay;
cout << "Please enter number of words: ";
cin >> numWords;
cout << endl;
cout << "Please enter a Level, A,B, or C: ";
cin >> Level; cout << endl << endl;
//calculate price per word
if (numWords < 7500)
amtToPay = numWords * .08;
else if (numWords >= 7500 && numWords < 8000)
amtToPay = 600;
else if (numWords >= 8000 && numWords < 17500)
amtToPay = numWords * .075;
else if (numWords >= 17500 && numWords < 19000)
amtToPay = 1313;
else
amtToPay = numWords *.07;
//calculate the Level of the author
if (Level == 'C' or Level == 'c')
Level = 1;
else if (Level == 'B' or Level == 'b')
Level = 1.25;
else if (Level == 'A' or Level == 'a')
Level = 1.75;
TotalPay = amtToPay * Level;
cout << "Length of Story (words): "; cout << numWords; cout << endl << endl;
cout << "Amount Due Author: "; cout << "$"; cout << TotalPay; cout << endl << endl << endl;
system("PAUSE");
return 0;
}//end main function
我的导师要我写一个程序,可以计算向一个杂志提交文章的作者支付的金额。支付作者的金额取决于文章中有多少单词。它就像这样......
- 如果长度(单词)小于7,500:作者获得每字0.08美元的报酬。
- 如果长度为7,500到8,000:作者获得固定的600美元。
- 如果长度为8,000到17,500:作者每个单词的报酬为0.075美元。
- 如果长度为17,500至19,000:作者获得固定的1313美元。
- 如果长度大于19,000:作者获得每字0.08美元的报酬。
另外:作者有三种不同的“级别”(A,B和C)。 “C”级作者(新作者)将根据上述信息获得报酬。 “B”级作者(已建立的作家)将获得相当于C级作者数量1.25倍的报酬。 “A”级作者(摇滚明星)的报酬是C级作者的1.75倍。
数学:基本上,我编写了程序,以便它首先计算支付作者的金额(amtToPay)。然后,它计算(等级)等于什么。然后(TotalPay)是(amtToPay)乘以(Level)。
我的问题:除了//计算作者等级的部分外,一切都很有效。例如,如果我将作者输入“A”级别,他应该获得C级作者的1.75倍的报酬。因此,它应该将(amtToPay)乘以1.75,除了实际做的是将它乘以“1”并忽略“.75”。
我是编程新手,我知道可能还有很多其他方法可以编写。但请尽量帮助我尽力而为。谢谢。
答案 0 :(得分:1)
Level
是一个整数类型,因此当您为其指定浮点数时,小数部分将被删除。
尝试定义double rateLevel
然后
if (Level == 'C' or Level == 'c')
rateLevel = 1;
else if (Level == 'B' or Level == 'b')
rateLevel = 1.25;
else if (Level == 'A' or Level == 'a')
rateLevel = 1.75;
TotalPay = amtToPay * rateLevel;
执行此操作的正确方法是根本不使用浮点类型,除非打印输出。实现这一目标的方法是通过10的幂来扩展所有内容,这将从您的值中删除所有小数部分。在您的代码中,最低有效位数在千位(0.075)。这意味着您需要将所有值乘以1000.这称为比例因子。然后,您只需使用整数类型int
,long
,int64_t
等进行数学运算。在计算结束时,您可以将结果拆分为整数和小数分量。< / p>
像这样:
int TotalPayDollars = TotalPay/1000;
int TotalPayMilliDollars = TotalPay - 1000*TotalPayDollars;
int TotalPayCents = (int)((double)TotalPayMilliDollars/10 + 0.5);
第一行是所有整数数学,因此除以1000会丢弃任何小数部分。
第二行找到原始值与截断值之间的差异。我们将TotalPayDollars
乘以1000,使其再次与TotalPay
相同。
在最后一行,+ 0.5
可以向上舍入到最近的分数。
注意:选择比例因子时,确保不溢出整数类型非常重要。 32位有符号整数只能保存最多2 ^ 31-1(2,147,483,647)的数字。如果您的任何计算将高于该值,则应使用64位整数类型。
答案 1 :(得分:1)
Level
是char
类型,它是不可或缺的,你应该专门创建一个新变量以保持按级别提升的数量:
double level_boost;
//logic
Totalpay = amtToPay * level_boost;
PS:在您的逻辑中,您不必使用&&
:
if (numWords < 7500)
amtToPay = numWords * .08;
else if (numWords < 8000)
//if the numwords is less than 7500 will be handled by first if
amtToPay = 600;