Конвертирование долларов в центы в с ++ - PullRequest
0 голосов
/ 06 мая 2018

Я изучаю C ++ и пытаюсь конвертировать доллары в центы с помощью функции, которая имеет статическую переменную, которая накапливает сумму при каждом вызове. К сожалению, похоже, что я создал переполнение или недополнение ситуации с моей функцией. Любые указатели для этой функции будут очень полезны. Вот код.

#include <iostream>
#include <iomanip>
using namespace std;

void normalizeMoney(float& dollars, int cents = 150);
// This function takes cents as an integer and converts it to dollars
// and cents. The default value for cents is 150 which is converted
// to 1.50 and stored in dollars

int main()
{
   int cents;
   float dollars;

   cout << setprecision(2) << fixed << showpoint;

   cents = 95;
   cout << "\n We will now add 95 cents to our dollar total\n";

   normalizeMoney(dollars, cents);//    Fill in the code to call normalizeMoney to add 95 cents

   cout << "Converting cents to dollars resulted in " << dollars << " dollars\n";



   cout << "\n We will now add 193 cents to our dollar total\n";

   normalizeMoney(dollars, 193);// Fill in the code to call normalizeMoney to add 193 cents

   cout << "Converting cents to dollars resulted in " << dollars << " dollars\n";

   cout << "\n We will now add the default value to our dollar total\n";

   normalizeMoney(dollars);// Fill in the code to call normalizeMoney to add the default value of cents

   cout << "Converting cents to dollars resulted in " << dollars << " dollars\n";

   return 0;
}

//*******************************************************************************
//  normalizeMoney
//
//  task:     This function is given a value in cents. It will convert cents
//            to dollars and cents which is stored in a local variable called
//            total which is sent back to the calling function through the
//            parameter dollars. It will keep a running total of all the money
//            processed in a local static variable called sum.
//
//  data in:  cents which is an integer
//  data out: dollars (which alters the corresponding actual parameter)
//
//*********************************************************************************

void normalizeMoney(float& dollars, int cents)
{
    float total = 0;

    // Fill in the definition of sum as a static local variable
    static float sum = 0.0;

    // Fill in the code to convert cents to dollars
    if (cents >= 100) {
        cents -= 100;
        dollars += 1;
        total = total + dollars;
        sum = static_cast <float> (sum + dollars + (cents / 100));

    }
    else {
        total += (cents / 100);
        static_cast <float> (sum += (cents / 100));
    }
    cout << "We have added another $" << dollars << "   to our total" << endl;
    cout << "Our total so far is    $" << sum << endl;

    cout << "The value of our local variable total is $" << total << endl;
}

Вывод, который я получаю:

We will now add 95 cents to our dollar total
We have added another $-107374176.00    to our total
Our total so far is     $0.00
The value of our local variable total is $0.00
Converting cents to dollars resulted in -107374176.00 dollars

 We will now add 193 cents to our dollar total
We have added another $-107374176.00    to our total
Our total so far is     $-107374176.00
The value of our local variable total is $-107374176.00
Converting cents to dollars resulted in -107374176.00 dollars

 We will now add the default value to our dollar total
We have added another $-107374176.00    to our total
Our total so far is     $-214748352.00
The value of our local variable total is $-107374176.00
Converting cents to dollars resulted in -107374176.00 dollars
Press any key to continue . . .

Если кто-то может сказать мне, где я испортил, я был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Что касается вашего исходного вопроса, dollars никогда не инициализируется. Таким образом, любое значение, которое окажется в памяти в то время, будет вашим начальным значением в долларах, к которому прибавляет ваша функция. Но вместо исправления основного, эта проблема связана с тем, что вы не присваиваете вновь рассчитанную сумму в dollars в своей функции, что было бы ожидаемым поведением в соответствии с описанием функции.

Чтобы ответить на ваш дополнительный вопрос в комментариях, для перевода ваших центов в доллары все, что вам нужно сделать, - это вычислить cents / 100.0f, отметив тот факт, что вы делите число с плавающей запятой 100.0f вместо целого числа 100, так что ваш результат сам по себе становится float вместо int.

Примечания:

Хотя, судя по всему, это своего рода школьное задание, все же стоит упомянуть пару вещей:

  1. Не хранить денежные суммы в значениях с плавающей запятой.
  2. Функция подпись / поведение является безумной границей.

В настоящее время вы пытаетесь достичь чего-то вроде «нормализуйте эти центы и добавьте их к этому значению». Если вы хотите написать одну функцию, которая конвертирует ваши центы в доллары, было бы более логично написать ее как

float normalizeMoney(const int cents = 150);

и затем используется как

dollars += normalizeMoney(95);

забыв о совершенно необоснованной статической переменной.

0 голосов
/ 06 мая 2018

Я думаю, что другие комментарии ответили на вопрос. Вот некоторые предложения для других ошибок: вместо if (cents> = 100) и т. д. сделайте только остальную часть: 193 cents / 100 == 1.93 Кроме того, эта заливка решит вашу проблему, когда будет добавлено более 199 центов (это будет касаться только первого доллара).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...