Вопросы по коду для балансировки чековой программы на с ++

0

Я пытаюсь написать программу для балансировки чековой книжки в c++. Вот мои точные инструкции

Напишите программу, которая будет представлять собой транзакции на один месяц в вашей чековой книжке. Запросить пользователя для начального баланса, а затем разрешить пользователю вводить как можно больше транзакций.

Транзакции должны быть в форме C500 (для проверки 500 долларов США) или D250 (для депозита в размере 250 долларов США), или E (на конец месяца).

Каждая транзакция несет плату за обслуживание следующим образом: $.15 за каждую чек и $.10 за каждый депозит; Кроме того, взимается единовременная плата за обслуживание в размере 5 долларов США, если баланс падает ниже 500 долларов США в любое время в течение месяца и плата за обслуживание в размере 10 долларов за каждую чек, написанный, что приводит к отрицательному балансу.

Наконец, вы должны дать пользователю предупреждение, если их баланс составляет от 0 до 50 долларов США. Запустите демонстрационную программу и обратите пристальное внимание на желаемый результат.

(Обратите внимание, что текущий баланс и общая плата за обслуживание печатаются после каждой транзакции, но плата за обслуживание не вычитается из баланса до тех пор, пока пользователь не объявит E на конец месяца).

Мой код:

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

void MoneyFunct(float &CashLeft, float StartBal, char TransacType,
    float Transac, int Q, float TotalServiceCharge);

int main() {
    char TransacType;
    float StartBal;
    float Transac;
    float CashLeft = StartBal;
    float TotalServiceCharge;
    cout << "Enter your starting balance: ";
    cin >> StartBal;
    do {
        cout << "Now enter your transaction."
            << "Enter E when your month has ended." << endl;
        cout << "Enter transaction type: ";
        cin >> TransacType;
        cout << endl;
        cout << "Enter the amount for your transaction: ";
        cin >> Transac;
        cout << endl;
        MoneyFunct;
        cout << "You have $" << CashLeft 
            << " remaining in your account" << endl
            << "Your total service charges are "
            << TotalServiceCharge << endl;
    } while (TransacType != 'E');

    CashLeft = CashLeft + TotalServiceCharge;
    cout << endl << "Your final balance is " 
        << CashLeft << "." << endl
        << "Your total service charges are "
        << TotalServiceCharge << "." << endl
        << "Thanks for using the checkbook balancer!" << endl;
    return 0;
}

void MoneyFunct(float &CashLeft, float StartBal, char TransacType, 
    float Transac, int Q, float TotalServiceCharge)
{
    Q == 4;
    TotalServiceCharge = 0;
    if (TransacType == 'C') {
        CashLeft = CashLeft - Transac;
        TotalServiceCharge = TotalServiceCharge + 0.15;
    } else if (TransacType == 'D') {
        CashLeft = CashLeft + Transac;
        TotalServiceCharge=TotalServiceCharge+0.10;
    }

    if (CashLeft < 500) {
        while (Q == 1) {
            cout << "Your balance has fallen below $500."
               << "A one time charge of $5 will be subtracted "
               << "from your balance." << endl;
            TotalServiceCharge = TotalServiceCharge+5;
            Q++;
        }
    }

    if (CashLeft <= 50 && CashLeft >= 0) {
        cout << "Your balance is lower than $50." <<
            << "If your balance becomes negative "
            << "you will be charged $10" << endl;
    }

    if (CashLeft < 0) {
        cout << "Your balance has become negative." <<
            << "A $10 charge will be subtracted "
            << "from your balance." << endl;
        TotalServiceCharge = TotalServiceCharge+10;
    }
}

Это возвращает что-то похожее на это:

Enter your starting balance: 500
Now enter your transaction. Enter E when your month has ended.
Enter transaction type: D

Enter the amount for your transaction: 500

You have $4.42913e+032 remaining in your account
Your total service charges are nan
Now enter your transaction. Enter E when your month has ended.
Enter transaction type: E

Enter the amount for your transaction: 500

You have $4.42913e+032 remaining in your account
Your total service charges are nan

Your final balance is nan.
Your total service charges are nan.
Thanks for using the checkbook balancer!

Process returned 0 (0x0)   execution time : 7.874 s
Press any key to continue.

Баланс, который он возвращает, достаточно велик, чтобы я мог предположить, что у меня есть бесконечный цикл где-то.

  • 2
    Как вы думаете, линия MoneyFunct; делает? (Это не вызов функции.) Также, пожалуйста, не включайте в код такие длинные строки. Задача StackOverflow Q & A состоит в том, чтобы свести ваш вопрос к минимальной проблеме, которая запутывает вас ... и, таким образом, мешают все скучные запросы и сообщения. Вы действительно должны сократить свою программу до единой точки замешательства, в отличие от предоставления нам всей вашей постановки проблемы и ее решения. Если вам нужно задать несколько мелких вопросов, это лучше, чем «один большой» с вашим полным кодом.
Теги:
function

1 ответ

0
Лучший ответ

Эта...

float CashLeft = StartBal;

... появляется до того, как StartBal был инициализирован cin >> StartBal, поэтому у вас есть Undefined Behavior, прочитав из неинициализированной переменной. Просто переместите строку выше, чтобы быть после cin >> StartBal; ,

Отдельно это хорошая привычка проверять, действительно ли работают потоковые операции. Например:

if (cin >> StartBal)
    CashLeft = StartBal;
else
{
    std::cerr << "unable to read StartBal from cin\n";
    exit(EXIT_FAILURE);
}
  • 0
    Спасибо, Тони. После этого всегда получается, что на счете 500 долларов. Может ли кто-нибудь помочь мне с тем, почему пополнение и снятие не изменяют значение, которое выводится?
  • 0
    @imdabes Обратите внимание, что я сказал о MoneyFunct; не вызывая функцию. Эта строка просто оценивает значение указателя функции и отбрасывается. Если вы хотите вызвать его с параметрами, вам нужно вызвать его как в MoneyFunct(CashLeft, StartBal, TransacType, Transac, /* whatever Q is */, TotalServiceCharge); Или что-то.
Показать ещё 8 комментариев

Ещё вопросы

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