帮助类和派生类处理

时间:2011-04-24 02:21:59

标签: c++

我正在进行一项使用基类“bankAccount”和两个派生类“checkingAccount”和“savingsAccount”的作业。我目前对我得到的输出感到困惑。所有期末余额最终都是负数。任何人都可以看看我的代码,看看他们是否发现了为什么会这样?我认为我在派生类“checkingAccount”的过程函数中做错了。 “savingsAccount”进程函数将类似我只是还没有做到它导致第一个不起作用。谢谢!

标题

#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED

#include <iostream>
#include <fstream>


using namespace std;

class bankAccount
{
    public:
    bankAccount();
    void setAccountInfo(int accountNumTemp, double balanceTemp);
    void prePrint(char accountType);
    void process(char accountType, char transactionTypeTemp, int amountTemp, int j);
    void postPrint();

    private:
    int accountNumber;
    double balance;
};

class checkingAccount: public bankAccount
{
    public:
    void prePrint(int accountNumber, char accountType, double checkingBalance);
    checkingAccount();
    double checkingAccount:: process(char transactionTypeTemp, int amountTemp, int j, double checkingBalance);
    /*applyTansaction();
    applyInterest();*/

    private:
    float interestRate;
    int minimumBalance;
    float serviceCharge;

};

class savingsAccount: public bankAccount
{
    public:
    void prePrint(int savingsAccountNumber, char accountType, double savingsBalance);
    savingsAccount();
   /* applyTansaction();
    applyInterest();*/

    private:
    float interestRate;
};


#endif // HEADER_H_INCLUDED

课程实施:

#include "header.h"

bankAccount:: bankAccount()
{
    accountNumber = 0;
    balance = 0;
}

void bankAccount:: setAccountInfo(int accountNumTemp, double balanceTemp)
{
    accountNumber = accountNumTemp;
    balance = balanceTemp;
}

void bankAccount:: prePrint(char accountType)
{
    if(accountType == 'C')
    {
        int checkingAccountNumber = accountNumber;
        double checkingBalance = balance;
        checkingAccount ca;
        ca.prePrint(checkingAccountNumber, accountType, checkingBalance);
    }
    else if (accountType == 'S')
    {
        int savingsAccountNumber = accountNumber;
        double savingsBalance = balance;
        savingsAccount sa;
        sa.prePrint(savingsAccountNumber, accountType, savingsBalance);
    }


}

void bankAccount:: process(char accountType, char transactionTypeTemp, int amountTemp, int j)
{
        double checkingBalance;
        checkingAccount ca;
        //savingsAccount sa;

        if (accountType == 'C')
        {
            checkingBalance = balance;
            balance = ca.process(transactionTypeTemp, amountTemp, j, checkingBalance);
        }
        /*else if (accountType == 'S')
        {
            savingsBalance = balance;
            sa.process(transactionTypeTemp, amountTemp, j, savingsBalance)
        }*/

}

void bankAccount:: postPrint()
{
   cout << "Balance after processing: " << balance << endl;
}

checkingAccount:: checkingAccount()
{
    interestRate = .02;
    minimumBalance = 500;
    serviceCharge = 20;
}

void checkingAccount:: prePrint(int checkingAccountNumber, char accountType, double checkingBalance)
{
    cout << "Account Number:" << checkingAccountNumber << " account type:" << accountType << " Starting Balance:" << checkingBalance << endl;
}

double checkingAccount:: process(char transactionTypeTemp, int amountTemp, int j, double checkingBalance)
{
  if (transactionTypeTemp == 'D')
        {
            checkingBalance = checkingBalance + amountTemp;
            checkingBalance = (checkingBalance * interestRate);
        }
  else if (transactionTypeTemp == 'W')
        {
            if ((checkingBalance = checkingBalance - amountTemp) < 0)
            {
            cout << "error: transaction number" << j + 1 << " never occured due to insufficent funds." << endl;
            }
            else
            {
                checkingBalance = checkingBalance - amountTemp;
                if(checkingBalance < minimumBalance) //if last transaction brought the balance below minimum balance
                {
                    checkingBalance = (checkingBalance - serviceCharge); //apply service charge
                    checkingBalance = (checkingBalance * interestRate);  //apply interest

                }
                else // if last transaction did not bring the balance below minimum balance
                {
                    checkingBalance = (checkingBalance * interestRate); //apply interest without service charge
                }
            }
        }

        return checkingBalance;
}

savingsAccount:: savingsAccount()
{
    interestRate = .04;
}

void savingsAccount:: prePrint(int savingsAccountNumber, char accountType, double savingsBalance)
{
    cout << "Account Number:" << savingsAccountNumber << " account type:" << accountType << " Starting Balance:" << savingsBalance << endl;
}

主要

#include "header.h"

int main()
{
    ifstream inFile;
    int numberOfAccounts, accountNumTemp, transactionNum, amountTemp;
    double balanceTemp;
    char discard, accountType, transactionTypeTemp;
    bankAccount ba;

    cout << "Processing account data..." << endl;

    inFile.open("Bank.txt");

    if (!inFile)
    {
        for  (int a = 0; a < 20; a++)
            cout  << endl;
        cout << "Cannot open the input file."
             << endl;
            return 1;
    }

    inFile >> numberOfAccounts;
    inFile.get(discard);

    for (int i = 0; i < numberOfAccounts; i++)
    {
            inFile >> accountNumTemp >> accountType >> balanceTemp >> transactionNum;
            inFile.get(discard);
            ba.setAccountInfo(accountNumTemp, balanceTemp);
            ba.prePrint(accountType);

            for (int j = 0; j < transactionNum; j++)
            {
                inFile >> transactionTypeTemp >> amountTemp;
                inFile.get(discard);
                ba.process(accountType, transactionTypeTemp, amountTemp, j);
            }

            ba.postPrint();

    }


    inFile.close();

    return 0;
}

2 个答案:

答案 0 :(得分:2)

我实际上是在为银行工作,所以我不能离开这个。 : - )

添加问题:

if (transactionTypeTemp == 'D')
{
     checkingBalance = checkingBalance + amountTemp;
     checkingBalance = (checkingBalance * interestRate);
}

这实际上只有 才会对帐户产生兴趣!

此外,真实银行在您存款时不计算利息,而是在固定日期,例如每月一次或每年一次。您获得(或支付)的利息还取决于账户具有一定余额的天数。

if ((checkingBalance = checkingBalance - amountTemp) < 0)
{
    cout << "error: transaction number" << j + 1 << " never occured due to insufficent funds." << endl;
}

尽管将文字写入了cout,但事务确实发生了,因为=为Balance分配了一个新值!也许您应该只比较余额和金额?

然后,您再次在else部分重复无效的利息计算。

答案 1 :(得分:1)

有很多问题。我会提一个。您是一个基类(银行账户)和两个派生类(支票账户和储蓄账户)。然后,您在基类中有方法(进程方法),它从派生类中实例化对象。这不好。我认为重新审视派生类会帮助您解决问题。