Возникли проблемы с простой программой на C ++, использующей десятичные дроби.

0
//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".

Я новичок в программировании, и я понимаю, что, возможно, есть много других способов написать это. Но, пожалуйста, попробуйте и помогите мне, что вы можете. Спасибо.

  • 1
    Какое отношение имеет прототип функции, который вы никогда не определяете, а затем используете обычную переменную с тем же именем?
  • 0
    Вы обычно должны просто работать в целых числах, чтобы отслеживать десятичное место ... как rateInMil = 75, а не .075 ... тогда вы можете использовать int math без сюрпризов.
Показать ещё 1 комментарий
Теги:
decimal

2 ответа

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;

Правильный способ сделать это - не использовать типы с плавающей точкой вообще, за исключением, возможно, для распечаток. Способ достижения этого - масштабировать все с помощью силы десять, которая удалит все дробные компоненты из ваших значений. В вашем коде наименьшая значащая цифра находится в тысячах мест (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-битный целочисленный тип.

  • 0
    так как я могу это исправить?
  • 0
    Я добавил что-то в ответ, чтобы показать, как это можно исправить.
Показать ещё 3 комментария
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;
  • 0
    благодарю вас! это помогло

Ещё вопросы

Сообщество Overcoder
Наверх
Меню