Bank with Error Codes

Lab C++ Advanced 30 points

Commands: open NAME, deposit NAME AMT, withdraw NAME AMT, transfer FROM TO AMT, balance NAME. Methods return an enum class Status (Ok, NoAccount, Exists, Insufficient, BadAmount); print error: STATUS for failures.

Input

n, then n commands.

Output

Balances and errors.

Example

Input

10
open ann
open bob
deposit ann 100
transfer ann bob 30
withdraw bob 50
balance ann
balance bob
open ann
deposit cy 5
deposit ann -1

Output

error: Insufficient
ann: 70
bob: 30
error: Exists
error: NoAccount
error: BadAmount
Sample input available Sample output available
Editor
C++

Hints

Without exceptions, return a status code and let the caller report it.

Read all of a command's arguments before acting, so the input stays in step.

Solution explanation

Status enums make every failure explicit in the function's signature.

Show solution
#include <iostream>
#include <map>
#include <string>
using namespace std;

enum class Status { Ok, NoAccount, Exists, Insufficient, BadAmount };

string name(Status s) {
    switch (s) {
        case Status::NoAccount: return "NoAccount";
        case Status::Exists: return "Exists";
        case Status::Insufficient: return "Insufficient";
        case Status::BadAmount: return "BadAmount";
        default: return "Ok";
    }
}

class Bank {
public:
    Status open(const string &who) {
        if (accounts_.count(who)) return Status::Exists;
        accounts_[who] = 0;
        return Status::Ok;
    }
    Status deposit(const string &who, long long amt) {
        if (amt <= 0) return Status::BadAmount;
        auto it = accounts_.find(who);
        if (it == accounts_.end()) return Status::NoAccount;
        it->second += amt;
        return Status::Ok;
    }
    Status withdraw(const string &who, long long amt) {
        if (amt <= 0) return Status::BadAmount;
        auto it = accounts_.find(who);
        if (it == accounts_.end()) return Status::NoAccount;
        if (it->second < amt) return Status::Insufficient;
        it->second -= amt;
        return Status::Ok;
    }
    Status transfer(const string &from, const string &to, long long amt) {
        if (!accounts_.count(to)) return Status::NoAccount;
        Status s = withdraw(from, amt);
        if (s != Status::Ok) return s;
        return deposit(to, amt);
    }
    Status balance(const string &who, long long &out) const {
        auto it = accounts_.find(who);
        if (it == accounts_.end()) return Status::NoAccount;
        out = it->second;
        return Status::Ok;
    }

private:
    map<string, long long> accounts_;
};

int main() {
    Bank bank;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        string cmd, a, b;
        long long amt = 0;
        Status s;
        cin >> cmd;
        if (cmd == "open") {
            cin >> a;
            s = bank.open(a);
        } else if (cmd == "deposit") {
            cin >> a >> amt;
            s = bank.deposit(a, amt);
        } else if (cmd == "withdraw") {
            cin >> a >> amt;
            s = bank.withdraw(a, amt);
        } else if (cmd == "transfer") {
            cin >> a >> b >> amt;
            s = bank.transfer(a, b, amt);
        } else {
            cin >> a;
            long long bal;
            s = bank.balance(a, bal);
            if (s == Status::Ok) cout << a << ": " << bal << "\n";
        }
        if (s != Status::Ok) cout << "error: " << name(s) << "\n";
    }
    return 0;
}
Output
Answer
HOME LEARN COMMUNITY DASHBOARD