0

这是一个 ATM 风格的程序,但目前它并不能完全满足我的需要......

我需要获取当前余额,当资金从支票或储蓄中转出时,它应该将其添加到支票中并从储蓄中减去。确实如此,但不正确...

输入示例

-=[ Funds Transfer ]=-
-=[ Savings to Checking ]=-
Account Name: nomadic
Amount to transfer: $400
New Balance in Checking: $900   // original was 500
New Balance in Savings: $7.7068e+012  // this should now be 1100...

这是我的代码,它有很多代码,但没有错误,因此将其放入 IDE 并编译对于任何愿意提供帮助的人来说应该相当快。

主银行类.h

#ifndef MAINBANKCLASS_H
#define MAINBANKCLASS_H
#include <iostream>
#include <fstream>
#include <string>

using namespace std;


class Banking 
{
protected:
    string  checkAcctName, saveAcctName;        // Name on the account
    int acctNumber[13];         // Account number
    float acctBalance, initSaveDeposit, initCheckDeposit, depAmt;       // amount in account, and amount to deposit

public:
    char getBalanceChoice();        // Get name on account for displaying relevant information
    char newAccountMenu();  // Create a new account and assign it a random account number
    void invalid(char *);       // If an invalid option is chosen
    char menu();                // Print the main menu for the user.
    virtual float deposit(){ return 0; }    // virtual function for deposits
//  virtual float withdrawal() = 0; // Virtual function for withdrawals
    void fatal(char *); // Handles fatal errors.
    Banking();
};


class Checking : public Banking
{
    public:
        friend ostream operator<<(ostream &, Checking &);
        friend istream operator>>(istream &, Checking &);
        Checking operator <= (const Checking &) const;
        void newCheckingAccount();
        void viewCheckingBalance();
        void transferFromSaving();
        float deposit() { return (acctBalance += depAmt); }
};

class Saving : public Banking
{
    public:
        friend ostream &operator<<(ostream &, Saving &);
        friend istream &operator>>(istream &, Saving &);
        Saving operator <= (const Saving &) const;
        void newSavingAccount();
        void viewSavingBalance();
        void transferFromChecking();
        float deposit() { return (acctBalance += depAmt); }
};

class checkAndSave : public Banking
{
    public:
        void newCheckAndSave();
        void viewBothBalances();
};
#endif 

银行账户.cpp

    #include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
#include <fstream>
#include <time.h>
#include "MainBankClass.h"



/*****************************\
|   BANKING CONSTRUCTOR     |
\*****************************/

Banking::Banking()
{
    string  acctName;       // Name on the account
    acctNumber[13] = 0;         // Account number
    acctBalance = 0;
    initCheckDeposit = 0;
    initSaveDeposit = 0;
    depAmt = 0;     
};

/********************************\
| The following code is to print the menu   |
| and recieve the users choice on what      |
| they want to do with the ATM              |
\********************************/

char Banking::menu()
{
    char choice;

        system("cls");
        cout << "\t\t -=[ Main Menu ]=- \n\n"
               << "\tA) Create New Account\n"
               << "\tB) View Account Balance\n"
               << "\tC) Transfer Funds From Checking To Savings\n"
               << "\tD) Transfer Funds From Savings To Checking\n"
               << "\tE) Exit\n"
               << "\n\n\tSelection: ";
        cin >> choice;
        cin.ignore();
        choice = toupper(choice);

        while(!isalpha(choice))
        {
            invalid("[!!] Invalid selection.\n[!!] Choose a valid option: ");
            cin >> choice;
            cin.ignore();
        }

    return choice;
}

/*********************\
| Will read in account choic  |
| and display it for the user       |
\*********************/

char Banking::getBalanceChoice()
{
    char choice;
    fstream saveFile("saving.dat", ios::in  | ios::beg);
    system("cls");
    cout << "\t\t -=[ View Account Balance ]=-\n\n";

    cout << "A) View Checking Account\n"
          << "B) View Saving Account\n"
          << "C) View Checking \\ Saving Account\n" << endl;
    cout << "Choice: ";
    cin >> choice;
    choice = toupper(choice);

    if(!isalpha(choice))
        fatal(" [!!] Invalid Choice");

    return choice;
}


/***************************\
| Incase an invalid decision to made    |
| this throws the error message sent    |
| to it by the calling area             |
\***************************/
void Banking::invalid(char *msg)
{
    cout << msg;
}


/*************************\
| Used if files can not be opened    |
| and exits with code 251:           |
| miscommunication with server   |
\*************************/

void Banking::fatal(char *msg)
{
    cout << msg;
    exit(1);
}


/***************************\
| Create an account, either checking    |
| or savings, or both.                  |
| Must should create a randomly     |
| generated account number that will    |
| correspond with each account.     |
\***************************/

/************************\

NOTE::  WILL BE UPDATED
TO CONTAIN A PIN FOR
ACCOUNT VERIFICATION

*************************/
char Banking::newAccountMenu()
{
    srand(time(NULL));  // Seed random generator with time initialized to NULL
    char acctChoice;        // choice for the account type


    ofstream checkFile("checking.dat", ios::out  | ios::app);       // For saving checking accounts
    ofstream saveFile("saving.dat", ios::out  | ios::app);          // For saving savings accounts

        system("cls");
        cout << "\t\t-=[ New Account Creation ]=-\n\n" << endl;
        cout << "A) Checking Account\n"
              << "B) Savings Account\n"
              << "C) Checking and Saving Account\n" << endl;
        cout << "New account type: ";
        cin >> acctChoice;
        acctChoice = toupper(acctChoice);
        cin.clear();
        cin.sync();
        return acctChoice;
}





/*********************************************************************
**********************************************************************


                                CHECKING ACCOUNT CODE


**********************************************************************
**********************************************************************/

// New Checking Account Creation
void Checking::newCheckingAccount()
{
    system("cls");
    ofstream checkFile("checking.dat", ios::out  | ios::app);       // For saving checking accounts

    cout << "\t\t -=[ New Checking Account ]=- \n" << endl;
    cout << "Name of the main holder to be on the account: ";
    getline(cin, checkAcctName);
    cout << "Initial deposit amount: $";
    cin >> initCheckDeposit;

    if(initCheckDeposit <= 0)
        {
            while(initCheckDeposit <= 0)
                {
                    invalid("[!!] 0 or negative amount entered\nMaybe a typo?\n");
                    cout << "Deposit Amount: $";
                    cin >> initCheckDeposit;
                }
        }

    if(!checkFile)
        fatal("[!!] Fatal Error 251: Miscommunication with server\n");

    checkFile << checkAcctName << endl;

    for(int j = 0; j < 13; j++)
        {
            acctNumber[j] = (rand() % 10);      // Build a random checking account number
            checkFile << acctNumber[j];
        }

    checkFile << endl;
    checkFile << initCheckDeposit << endl;
    checkFile.close();
}

void Checking::viewCheckingBalance()
{
    fstream checkFile("checking.dat", ios::in  | ios::beg);
    string name;
    int i = 0;
    double balance = 0;

        system("cls");

        cout << "\t\t -=[ View Checking Account ]=-\n\n" << endl;
        cout << "Account Name: ";
        cin.sync();
        getline(cin, name);
        getline(checkFile, checkAcctName);

        while(name != checkAcctName && !checkFile.fail())
        {
            i++;
            getline(checkFile, checkAcctName);
        }

        if(name == checkAcctName)
          {
                system("cls");
                cout << "\t\t -=[ Checking Account Balance ]=-\n\n" << endl;
                cout << "Account Name: " << checkAcctName << "\n";
                cout << "Account Number: ";
                for(int j = 0; j < 13; j++)
                {
                    char input_number; 
                    stringstream converter;
                    checkFile.get(input_number);
                    converter << input_number;
                    converter >> acctNumber[j];
                    cout << acctNumber[j];
                }
                // if balance a problem, try the below commented out line
                // checkFile.ignore(numeric_limits<streamsize>::max(), '\n');                
                cout << endl;
                checkFile >> acctBalance;
                cout << "Balance: $" << fixed << showpoint << setprecision(2) << acctBalance << endl;
           }
        else
            fatal("[!!] Invalid Account\n");
        checkFile.close();
        getchar();
}

void Checking::transferFromSaving() // Move funds FROM SAVINGS to CHECKING
{
    system("cls");
    string name;
    long checkPos = 0;
    long savePos = 0;
    float savingBalance = 0;
    string saveAcctName;
    int i = 0;
    cin.clear();
    fstream saveFile("saving.dat", ios::in | ios::out  | ios::beg);
    fstream checkFile("checking.dat", ios::in | ios::out  | ios::beg);

    cout << "\t\t-=[ Funds Transfer ]=-" << endl;
    cout << "\t\t-=[ Savings to Checking ]=-" << endl;

    cout << "Account Name: ";
    cin.sync();
    getline(cin, name);
    getline(checkFile, checkAcctName);

    while(name != checkAcctName && !checkFile.fail())
    {
        i++;
        getline(checkFile, checkAcctName);
    }

    getline(saveFile, saveAcctName);
    while(name != saveAcctName && !saveFile.fail())
    {
        i = 0;
        i++;
        getline(saveFile, saveAcctName);
    }


    if(name == checkAcctName)
     {
         cout << "Amount to transfer: $";
         float depAmt = 0;
         cin >> depAmt;

         for(int j = 0; j < 13; j++)
        {
             char input_number; 
            stringstream converter;
            checkFile.get(input_number);
            converter << input_number;
            converter >> acctNumber[j];
        }

         checkPos = checkFile.tellg();      // if the file is found, get the position of acctBalance and store it in ptrPos
        checkFile.seekg(checkPos);
         checkFile >> acctBalance;
         savePos = saveFile.tellg();
         saveFile.seekg(savePos);   // sending the cursor in the file to ptrPos + 1 to ignore white space
         saveFile >> savingBalance;

         if(savingBalance < depAmt) // if checking account does not have enough funds, exit with NSF code
             fatal("[!!] Insufficient Funds\n");

         acctBalance += depAmt;     // can be changed to an overloaded operator
         savingBalance -= depAmt;   // can be changed to an overloaded operator
         checkFile.seekp(checkPos); // go to position previously set above
         checkFile << acctBalance;      // write new balance to checkFile
         saveFile.seekp(savePos);   // same thing as above comment
         saveFile << savingBalance; // write new balance to saveFile
         cout << "New Balance in Checking: $" << acctBalance << endl;   // will be removed later
         cout << "New Balance in Savings: $" << savingBalance << endl;  // will be removed later aswell
    }
    else 
        fatal("[!!] Linked accounts do not exist.\n");      // if account is not found

    saveFile.close();
    checkFile.close();
}




/********************************************************
********************************************************

                        SAVING ACCOUNT CODE

*********************************************************
*********************************************************/


void Saving::newSavingAccount()
{
    system("cls");
    ofstream saveFile("saving.dat", ios::out  | ios::app);          // For saving savings accounts
    cout << "\t\t -=[ New Savings Account ]=- \n" << endl;

    cout << "Name of the main holder to be on account: ";
    getline(cin, saveAcctName);
    cout << "Deposit Amount: $";
    cin >> initSaveDeposit;

    if(initSaveDeposit <= 0)
    {
        while(initSaveDeposit <= 0)
            {
                invalid("[!!]0 or negative value entered.\nPerhaps a typo?\n");
                cout << "Deposit amount: $";
                cin >> initSaveDeposit;
            }
    }

    if(!saveFile)
        fatal("[!!] Fatal Error 251:  Miscommunication with server\n");

    saveFile << saveAcctName << endl;
    for(int j = 0; j < 13; j++)
        {
            acctNumber[j] = (rand() % 10);
            saveFile << acctNumber[j];
        }
    saveFile << endl;
    saveFile << initSaveDeposit << endl;
    saveFile.close();
}

void Saving::viewSavingBalance()
{
    string name;
    int i = 0;
    fstream saveFile("saving.dat", ios::in  | ios::beg);
    cin.clear();
    system("cls");
    cout << "\t\t -=[ View Saving Account ]=-\n\n" << endl;
    cout << "Account Name: ";
    cin.sync();
    getline(cin, name);
    getline(saveFile, saveAcctName);

    while(name != saveAcctName && !saveFile.fail())
    {
        i++;
        getline(saveFile, saveAcctName);
    }

    if(name == saveAcctName)
     {
         system("cls");

        cout << "\t\t -=[ Saving Account Balance ]=-\n\n" << endl;
        cout << "Account Name: " << saveAcctName << "\n";
        cout << "Account Number: ";

        for(int j = 0; j < 13; j++)
        {
             char input_number; 
            stringstream converter;
            saveFile.get(input_number);
            converter << input_number;
            converter >> acctNumber[j];
            cout << acctNumber[j];
        }
        // if balance a problem, try the below commented out line
         // checkFile.ignore(numeric_limits<streamsize>::max(), '\n');                
     cout << endl;
     saveFile >> acctBalance;
     cout << "Balance: $" << fixed << showpoint << setprecision(2) << acctBalance << endl;
    }
    else
        fatal("[!!] Invalid Account\n");
    saveFile.close();
    getchar();
}


// NEED TO WORK ON THIS PORTION TOMORROW AND MONDAY, ADD OVERLOADED OPS FOR ASSIGNMENT!!!!!!!
void Saving::transferFromChecking() // This is to take money FROM checking and ADD IT TO SAVING
{
    system("cls");
    string name;
    long savePos = 0;
    long checkPos = 0;
    float checkingBalance = 0;
    string checkAcctName;
    int i = 0;
    cin.clear();
    fstream saveFile("saving.dat", ios::in | ios::out  | ios::beg);
    fstream checkFile("checking.dat", ios::in | ios::out  | ios::beg);

    cout << "\t\t-=[ Funds Transfer ]=-" << endl;
    cout << "\t\t-=[ Checking to Savings ]=-" << endl;

    cout << "Account Name: ";
    cin.sync();
    getline(cin, name);
    getline(saveFile, saveAcctName);
    getline(checkFile, checkAcctName);

    while(name != saveAcctName && name != checkAcctName && !saveFile.fail() && !checkFile.fail())
    {
        i++;
        getline(saveFile, saveAcctName);
        getline(checkFile, checkAcctName);
    }

    if(name == saveAcctName)
     {
         cout << "Amount to transfer: $";
         float depAmt = 0;
         cin >> depAmt;

         for(int j = 0; j < 13; j++)
        {
             char input_number; 
            stringstream converter;
            saveFile.get(input_number);
            converter << input_number;
            converter >> acctNumber[j];
        }

        savePos = saveFile.tellg();     // if the file is found, get the position of acctBalance and store it in ptrPos
        saveFile.seekg(savePos);
        saveFile >> acctBalance;
        checkPos = checkFile.tellg();
        checkFile.seekg(checkPos);              // if file is found, store current position of the cursor to ptrPos
        checkFile >> checkingBalance;

         if(checkingBalance < depAmt)   // if checking account does not have enough funds, exit with NSF code
             fatal("[!!] Insufficient Funds\n");    // Can also place overloaded op here

         acctBalance += depAmt;     // can be changed to an overloaded operator
         checkingBalance -= depAmt; // can be changed to an overloaded operator
         saveFile.seekg(savePos);   // go to position previously set above
         saveFile << acctBalance;       // write new balance to saveFile
         checkFile.seekg(checkPos); // same thing as above comment
         checkFile << checkingBalance;  // write new balance to checkFile
         cout << "New Balance in Savings: $" << acctBalance << endl;    // will be removed later
         cout << "New Balance in Checking: $" << checkingBalance << endl;   // will be removed later aswell
    }
    else 
        fatal("[!!] Linked accounts do not exist.\n");      // if account is not found

    saveFile.close();
    checkFile.close();
}

/********************************************
********************************************

            CHECK AND SAVE CODE

**********************************************
**********************************************/

void checkAndSave::newCheckAndSave()
{
    system("cls");
    ofstream saveFile("saving.dat", ios::out  | ios::app);          // For saving savings accounts
    ofstream checkFile("checking.dat", ios::out  | ios::app);       // For saving checking accounts

    cout << "\t -=[ New Checking & Saving Account ]=- \n" << endl;

    cout << "Name of the main holder to be on account: ";
    getline(cin, checkAcctName);
    saveAcctName = checkAcctName;
    cout << "Checking Deposit Amount: $";
    cin >> initCheckDeposit;

    if(initCheckDeposit <= 0)
    {
        while(initCheckDeposit <= 0)
        {
            invalid("[!!] 0 or negative amount entered\nMaybe a typo?\n");
            cout << "Deposit Amount: $";
            cin >> initCheckDeposit;
        }
    }

    cout << "Saving Deposit Amount: $";
    cin >> initSaveDeposit;

    if(initSaveDeposit <= 0)
    {
        while(initSaveDeposit <= 0)
        {
            invalid("[!!]0 or negative value entered.\nPerhaps a typo?\n");
            cout << "Deposit amount: $";
            cin >> initSaveDeposit;
        }
    }


    if(!saveFile || !checkFile)
        fatal("[!!] Fatal Error 251:  Miscommunication with server\n");

    checkFile << checkAcctName << endl;
    saveFile << saveAcctName << endl;

    for(int j = 0; j < 13; j++)
    {
        acctNumber[j] = (rand() % 10);
        checkFile << acctNumber[j];
        saveFile << acctNumber[j];
    }

    saveFile << endl;
    saveFile << initSaveDeposit << endl;

    checkFile << endl;
    checkFile << initCheckDeposit << endl;
    checkFile.close();
    saveFile.close();
}

void checkAndSave::viewBothBalances()
{
    string name;
    int i = 0;
    fstream checkFile("checking.dat", ios::in  | ios::beg);
    fstream saveFile("saving.dat", ios::in  | ios::beg);
    system("cls");
            cin.clear();
            cout << "\t-=[ Saving & Checking Account Balance ]=-\n\n" << endl;
            cout << "Account Name: ";
            cin.sync();
            getline(cin, name);
            getline(checkFile, checkAcctName);
            saveAcctName = name;

            /**********************\
            | Checking Account portion  |
            | of the checking & savings |
            | overview                      |
            \**********************/
        while(name != checkAcctName && !checkFile.fail())
        {
            i++;
            getline(checkFile, checkAcctName);
        }

        system("cls");
        if(name != checkAcctName && checkFile.fail())
            invalid("\n\n[!!] No Checking Account Found\n");

        cout << "\t\t -=[ Checking Account ]=- \n" << endl;
        cout << "Account Name: " << checkAcctName << "\n";
          cout << "Account Number: ";

        for(int j = 0; j < 13; j++)
          {
              char input_number; 
              stringstream converter;
              checkFile.get(input_number);
               converter << input_number;
               converter >> acctNumber[j];
               cout << acctNumber[j];
           }
                // if balance a problem, try the below commented out line
                // checkFile.ignore(numeric_limits<streamsize>::max(), '\n');                
                cout << endl;
                checkFile >> acctBalance;
                cout << "Balance: $" << fixed << showpoint << setprecision(2) << acctBalance << endl;

             /*********************\
             | Saving Account portion       |
             | of the checking & saving     |
             | overview                     |
             \*********************/
             getline(saveFile, saveAcctName);
            while(name != saveAcctName && !saveFile.fail())
            {
                i++;
                getline(saveFile, saveAcctName);
            }

            if(name != saveAcctName && saveFile.fail())
                invalid("\n\n[!!] No Saving Account Found\n");

            if(name == saveAcctName)
             {
                   cout << "\t\t -=[ Saving Account ]=-\n\n" << endl;
                   cout << "Account Name: " << saveAcctName << "\n";
                   cout << "Account Number: ";

                 for(int j = 0; j < 13; j++)
                   {
                       char input_number; 
                      stringstream converter;
                      saveFile.get(input_number);
                      converter << input_number;
                      converter >> acctNumber[j];
                      cout << acctNumber[j];
                  }
                  // if balance a problem, try the below commented out line
                  // checkFile.ignore(numeric_limits<streamsize>::max(), '\n');                
                  cout << endl;
                  saveFile >> acctBalance;
                  cout << "Balance: $" << fixed << showpoint << setprecision(2) << acctBalance << endl;
             }

        if(name != saveAcctName && name != checkAcctName && saveFile.fail() && checkFile.fail())
             fatal("[!!] No Accounts Have Been Found\n");

         checkFile.close();
         saveFile.close();
         getchar();
}

主文件

#include <iostream>
#include "MainBankClass.h"
using namespace std;



int main()
{
    Banking bank;
    Checking check;
    Saving save;
    checkAndSave CanS;
    char choice;

    choice = bank.menu();       // Call the banking menu
    switch(choice)
        {
            case 'A':
                choice = bank.newAccountMenu();
                    switch(choice)
                        {
                            case 'A':
                                check.newCheckingAccount();
                                break;

                            case 'B':
                                save.newSavingAccount();
                                break;

                            case 'C':
                                CanS.newCheckAndSave();
                                break;

                            default:
                                system("cls");
                                bank.fatal("[!!] Invalid option\n");
                                break;
                        }
                break;
/***********************************************/
            case 'B':
                choice = bank.getBalanceChoice();
                    switch(choice)
                    {
                        case 'A':
                            check.viewCheckingBalance();
                            break;
                        case 'B':
                            save.viewSavingBalance();
                            break;
                        case 'C':
                            CanS.viewBothBalances();
                            break;
                        default:
                            bank.fatal("Invalid decision\n");
                            break;
                    }
/*************************************************/             
                break;
            case 'C':
                check.transferFromSaving();
                break;
            case 'D':
                save.transferFromChecking();
                break;
            case 'E':
                system("cls");
                cout << "\t\t-=[ Disconnecting From System ]=-\n";
                cout << "\t\t\t  Thank you" << endl;
                cout << "\t\t       Have a nice day!" << endl;
                exit(1);
                break;
            default:
                system("cls");
                bank.invalid("\n\n\n\n\t\t [+] Invalid Selection \n\t\t[+] Disconnecting From System \n\t\t\tGood-bye \n\n\n\n\n\n\n");
                exit(1);
                break;
        }

    return 0;
}
4

1 回答 1

1

这种错误只是需要调试器。我不知道你的问题是什么(代码很长),但我知道如果你只是在调试器中逐步完成它,你将能够准确地看到事情变糟的那一刻。

于 2010-04-26T23:19:13.007 回答