//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
Мой инструктор хочет, чтобы я написал программу, в которой можно рассчитать сумму денег, чтобы заплатить автору, который отправляет статью в журнал. Сумма денег, выплачиваемая автору, основана на том, сколько слов содержится в этой статье. Он работает так...
Длина -if (в словах) составляет менее 7500: автор получает $ 0,08 за слово.
Длина -if составляет от 7 500 до 8 000: автор получает фиксированную сумму в 600 долларов США.
Длина -if составляет от 8 000 до 17 500: автор получает $ 0,075 за слово.
Длина -if составляет от 17 500 до 19 000: автору выплачивается фиксированная сумма в 1313 долларов США.
Длина -if больше 19 000: автор получает $ 0,08 за слово.
Также: Существуют три разных "Уровня" авторов (A, B и C). Автору "C" (новый автор) будет выплачиваться на основании вышеизложенной информации. Автор "B" уровня (созданный писатель) получит выплату в 1,25 раза от суммы автора уровня C. Автор "A" (rockstar) получит оплату в 1,75 раза от количества автора уровня C.
Математика: В принципе, я написал программу так, чтобы она сначала вычисляла сумму для оплаты автору (amtToPay). Затем он вычисляет то, что равно (Уровень). Затем (TotalPay) является (amtToPay), умноженным на (Уровень).
Моя проблема: все работает отлично, за исключением той части, где она//вычисляет уровень автора. Например, если я должен был ввести автора в качестве уровня "А", он должен получить в 1,75 раза больше, чем у автора уровня С. Таким образом, он должен умножить (amtToPay) на 1.75, за исключением того, что на самом деле делает, умножая его на "1" и игнорируя ".75".
Я новичок в программировании, и я понимаю, что, возможно, есть много других способов написать это. Но, пожалуйста, попробуйте и помогите мне, что вы можете. Спасибо.
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;
Правильный способ сделать это - не использовать типы с плавающей точкой вообще, за исключением, возможно, для распечаток. Способ достижения этого - масштабировать все с помощью силы десять, которая удалит все дробные компоненты из ваших значений. В вашем коде наименьшая значащая цифра находится в тысячах мест (0,075). Это означает, что вам нужно умножить все свои значения на 1000. Это называется вашим масштабным коэффициентом. Затем вы можете выполнять свою математику, используя только интегральные типы: int
, long
, int64_t
и т.д. В конце ваших вычислений вы можете разделить результаты на целые числа и дробные компоненты.
Как это:
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-битный целочисленный тип.
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;