#include #include #include struct smoney { int hi; int low; }; int main (int argc, char **argv) { while (true) { int numacc = 0; scanf("%d", &numacc); if (numacc == 0) { printf("goodbye\n"); return 0; } std::map accounts[10]; for(int i = 0; i < numacc; i++) { int acc; int bank; int money; smoney a; scanf("%d/%d %d.%d", &acc, &bank, &a.hi, &a.low); accounts[bank][acc] = a; } while(true) { char operation[50]; scanf("%s", operation); std::string s(operation); //printf("%s", operation); if (s == "end") break; if (s == "withdraw") { int acc; int bank; int hi; int low; scanf("%d/%d %d.%d", &acc, &bank, &hi, &low); std::map::iterator iter = accounts[bank].find(acc); if (iter == accounts[bank].end()) { printf("withdraw %d.%d: no such account\n", hi, low); } else { if ((accounts[bank][acc].hi > hi) || (accounts[bank][acc].hi == hi && accounts[bank][acc].low >= low)) { printf("withdraw %d.%d: ok\n", hi, low); accounts[bank][acc].hi -= hi; accounts[bank][acc].low -= low; if (accounts[bank][acc].low < 0) { --accounts[bank][acc].hi; accounts[bank][acc].low += 100; } } else { printf("withdraw %d.%d: insufficient funds\n", hi, low); } } } else if (s == "deposit") { int acc; int bank; int hi; int low; scanf("%d/%d %d.%d", &acc, &bank, &hi, &low); std::map::iterator iter = accounts[bank].find(acc); if (iter == accounts[bank].end()) { printf("deposit %d.%d: no such account\n", hi, low); } else { accounts[bank][acc].hi += hi; accounts[bank][acc].low += low; if (accounts[bank][acc].low >= 100) { ++accounts[bank][acc].hi; accounts[bank][acc].low -= 100; } printf("deposit %d.%d: ok\n", hi, low); } } else if (s == "create") { int acc; int bank; scanf("%d/%d", &acc, &bank); std::map::iterator iter = accounts[bank].find(acc); if (iter == accounts[bank].end()) { // ??? accounts[bank][acc].hi = 0; accounts[bank][acc].low = 0; printf("create: ok\n"); } else { printf("create: already exists\n"); } } else if (s == "transfer") { int acc1; int bank1; int acc2; int bank2; int hi; int low; scanf("%d/%d %d/%d %d.%d", &acc1, &bank1, &acc2, &bank2, &hi, &low); if (acc1 == acc2 && bank1 == bank2) { printf("transfer %d.%d: same account\n", hi, low); continue; } std::map::iterator iter = accounts[bank1].find(acc1); if (iter == accounts[bank1].end()) { printf("transfer %d.%d: no such account\n", hi, low); continue; } std::map::iterator iter2 = accounts[bank2].find(acc2); if (iter2 == accounts[bank2].end()) { printf("transfer %d.%d: no such account\n", hi, low); continue; } if ((accounts[bank1][acc1].hi > hi) || (accounts[bank1][acc1].hi == hi && accounts[bank1][acc1].low >= low)) { //printf("bank1 %d bank2 %d\n", bank1, bank2); if (bank1 != bank2) { printf("transfer %d.%d: interbank\n", hi, low); } else { printf("transfer %d.%d: ok\n", hi, low); } accounts[bank1][acc1].hi -= hi; accounts[bank1][acc1].low -= low; if (accounts[bank1][acc1].low < 0) { --accounts[bank1][acc1].hi; accounts[bank1][acc1].low += 100; } accounts[bank2][acc2].hi += hi; accounts[bank2][acc2].low += low; if (accounts[bank2][acc2].low >= 100) { ++accounts[bank2][acc2].hi; accounts[bank2][acc2].low -= 100; } } else { printf("withdraw %d.%d: insufficient funds\n", hi, low); } } } printf("end\n\n"); } return 0; }