Я пытаюсь написать программу для балансировки чековой книжки в 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.
Баланс, который он возвращает, достаточно велик, чтобы я мог предположить, что у меня есть бесконечный цикл где-то.
Эта...
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);
}
MoneyFunct;
не вызывая функцию. Эта строка просто оценивает значение указателя функции и отбрасывается. Если вы хотите вызвать его с параметрами, вам нужно вызвать его как в MoneyFunct(CashLeft, StartBal, TransacType, Transac, /* whatever Q is */, TotalServiceCharge);
Или что-то.
MoneyFunct;
делает? (Это не вызов функции.) Также, пожалуйста, не включайте в код такие длинные строки. Задача StackOverflow Q & A состоит в том, чтобы свести ваш вопрос к минимальной проблеме, которая запутывает вас ... и, таким образом, мешают все скучные запросы и сообщения. Вы действительно должны сократить свою программу до единой точки замешательства, в отличие от предоставления нам всей вашей постановки проблемы и ее решения. Если вам нужно задать несколько мелких вопросов, это лучше, чем «один большой» с вашим полным кодом.