Bank with Error Codes
Completed
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
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;
}