简单的银行账户程序无法正确存储余额

Posted

技术标签:

【中文标题】简单的银行账户程序无法正确存储余额【英文标题】:Simple bank account program does not store the balance correctly 【发布时间】:2014-12-15 00:12:40 【问题描述】:

我目前正在结束我的银行账户计划,但在完成的过程中遇到了一些问题。这个问题似乎很容易解决,但我不能完全理解我应该如何去实际解决它。

我将首先包括以下作业:

    实现类帐户。账户具有余额、充值和提现功能、查询当前余额的功能。将值传递给构造函数以设置初始余额。 如果未传递任何值,则初始余额应设置为 $0。 如果试图提取的钱多于账户中的可用资金,则收取 5 美元的罚款。 增强 Account 类以计算当前余额的利息。

    实现类银行。这家银行有两个对象,支票和储蓄,属于前面练习中开发的 Account 类型。

实现四个实例方法:

存款(双倍金额,字符串账户) 提现(双倍金额,字符串账户) 转账(双倍金额,字符串账户) printBalances()

这里的帐户字符串是“S”或“C”。对于存款或取款,它表明哪个账户受到影响。对于转帐,它表明从哪个账户取钱;这笔钱会自动转入另一个帐户。

唯一的问题似乎是将每个帐户的信息实际存储在 Account.cpp 文件的 balance 变量中。它只是保持在 0,这就是为什么我觉得这个问题应该很容易解决。我想我只是忘记了一些关于类实现的非常基本的东西,但这就是我在这里的原因!现在我想起来了,我认为我的部分困惑来自于我之前实现过类似的程序但只使用数组而不是变量的事实,而且我没有遇到同样的问题。无论如何,数据似乎都存储到了数组中,所以这可能是我的问题吗?代码如下:

帐户.h:

#include <iostream>
#include <string>
#include <iomanip>      

using namespace std;

class Account

public:
    Account();
    Account(double balance);
    void Add(double money);
    void Withdraw(double money);
    double GetBalance();

private:
    double balance; 
;

帐户.cpp:

#include "Account.h"

//  Penalty Fee Constant
const double PENALTY_FEE = 5.00;

Account::Account()

    balance = 0.00;


Account::Account(double money)

    balance = money;


void Account::Add(double money)

    balance += money;


void Account::Withdraw(double money)

    if(money > balance)
        balance += PENALTY_FEE;
    else
        balance -= money;


double Account::GetBalance()

    return balance;

银行.cpp:

#include "Account.h"

void deposit(double, string);
void withdraw(double, string);
void transfer(double, string);
void printBalances();

int main()

    string accountChoice;
    int selection;
    double transaction = 0;

    //  !!!!!!!!!!!!!!!!!!HAVE TO STILL COMPUTE INTEREST!!!!!!!!!!!!!!!!

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

    do
    
        cout << "Please make a selection:" << endl;
        cout << "1.) Deposit" << endl;
        cout << "2.) Withdraw" << endl;
        cout << "3.) Transfer" << endl;
        cout << "4.) Print balances" << endl;
        cout << "5.) Quit" << endl;
        cin >> selection;

        if(selection == 1)
        
            cout << endl << "Please select the account you would like to perform operations on(S or C):" << endl;
            cin >> accountChoice;
            cout << endl << "Please enter the amount to be deposited:" << endl;
            cin >> transaction;
            cout << endl;

            deposit(transaction, accountChoice);
        
        else if(selection == 2)
        
            cout << endl << "Please select the account you would like to perform operations on(S or C):" << endl;
            cin >> accountChoice;
            cout << endl << "Please enter the amount to be withdrawn:" << endl;
            cin >> transaction;
            cout << endl;

            withdraw(transaction, accountChoice);
        
        else if(selection == 3)
        
            cout << endl << "Please select the account you would like to perform operations on(S or C):" << endl;
            cin >> accountChoice;
            cout << endl << "Please enter the amount to be transferred:" << endl;
            cin >> transaction;
            cout << endl;

            transfer(transaction, accountChoice);
        
        else if(selection == 4)
            printBalances();
        else
            cout << "Closing program -- Thank you for using the ATM teller!" << endl;
    while(selection != 5);


    system("pause");
    return 0;


void deposit(double amount, string account)

    Account savings, checking;

    if(account == "S" || account == "s")
        savings.Add(amount);
    else
        checking.Add(amount);


void withdraw(double amount, string account)

    Account savings, checking;

    if(account == "S" || account == "s")
        savings.Withdraw(amount);
    else
        checking.Withdraw(amount);


void transfer(double amount, string account)

    Account savings, checking;

    if(account == "S" || account == "s")
    
        savings.Withdraw(amount);
        checking.Add(amount);
    
    else
    
        checking.Withdraw(amount);
        savings.Add(amount);
    


void printBalances()

    Account savings, checking;

    cout << "The current balance in savings is: " << savings.GetBalance() << endl;
    cout << "The current balance in checking is: " << checking.GetBalance() << endl << endl;

【问题讨论】:

在操作函数中,您创建了几个帐户:“帐户储蓄,检查;”,调用方法然后返回,确保帐户得到 RAII。 抱歉,如果我没有正确理解您的术语,但您是否建议我将这些方法从类型 void 更改为返回类型?这对我来说完全有道理,但我只是想验证一下! 哦等等 - 操作函数不是 Account 的成员函数! 这有点搞砸了。 你不能通过盲目的拨动开关来解决这个问题;您必须了解代码在做什么以及它有什么问题。您应该始终孤立地开发新功能,但由于您还没有这样做,我建议您将其减少到 minimal complete example,为了您和我们一样。 【参考方案1】:

每次需要时,您都会创建一个新的 Account 对象。当然打印出来的时候会是0,因为默认构造函数会将余额初始化为0。

而是在App启动时,作为用户识别自己的账号什么的,并创建对应的账号实例。该实例需要在用户对其进行操作的整个过程中都存在。

所以不要在方法中实例化,而是在主函数中实例化。并将实例传递给方法,作为根据需要修改实例的一种方式。

【讨论】:

【参考方案2】:

我认为,如果您声明另一个类“客户”,并分别给他们一个姓名、客户编号和一个支票和储蓄账户,我认为总体上可能会更清楚。客户应该在某个具有进程生命周期的地方实例化,以便它们不会被删除,例如。在静态容器中,例如 std::map。

ATM,(对不起!),您似乎有一些非成员函数可以实例化帐户,对它们进行处理,然后在函数返回时将它们删除。

【讨论】:

谢谢先生!!!我想我太着迷于认为它与 Account.cpp 直接有关,以至于我完全忽略了我最初担心在非成员函数中声明类对象时会发生这种情况。我不认为我被允许根据教师的规则创建一个额外的课程,而且我们还没有被告知 std::map,所以我怀疑我是否可以使用它们,尽管它可能对这种情况很有用。但是,我将由她运行它,以确保因为我觉得您的解决方案更有意义,我真的不明白为什么我们没有 Customer 类...

以上是关于简单的银行账户程序无法正确存储余额的主要内容,如果未能解决你的问题,请参考以下文章

编写一个类似银行账户的程序,属性:账号 储户姓名 地址 存款余额 利率。方法:存款 取款查询余额计算利息

用Java编写银行账户存取款业务,急求!!

返回银行账户余额的功能

EXCEL函数计算不同银行账户余额

leetcode-简易银行系统

银行0925