Skip to content

Instantly share code, notes, and snippets.

@mmj-the-fighter
Last active July 13, 2022 05:41
Show Gist options
  • Select an option

  • Save mmj-the-fighter/433df3d74206322415bfa77b10787176 to your computer and use it in GitHub Desktop.

Select an option

Save mmj-the-fighter/433df3d74206322415bfa77b10787176 to your computer and use it in GitHub Desktop.

Revisions

  1. mmj-the-fighter revised this gist Jul 13, 2022. 1 changed file with 43 additions and 35 deletions.
    78 changes: 43 additions & 35 deletions atm.cpp
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,6 @@
    #include <iostream>
    #include <list>
    #include <algorithm>

    using namespace std;

    @@ -42,19 +43,18 @@ AutomatedTellerMachine::AutomatedTellerMachine()
    money.push_back(new MoneyBundle(1, 1));
    totalMoney = CalculateTotal(money);

    ////money.push_back(new MoneyBundle(2000, 0));
    ////money.push_back(new MoneyBundle(1000, 0));
    ////money.push_back(new MoneyBundle(500, 0));
    ////money.push_back(new MoneyBundle(200, 0));
    ////money.push_back(new MoneyBundle(100, 0));
    ////money.push_back(new MoneyBundle(50, 0));
    ////money.push_back(new MoneyBundle(20, 0));
    ////money.push_back(new MoneyBundle(10, 3));
    ////money.push_back(new MoneyBundle(5, 8));
    ////money.push_back(new MoneyBundle(2, 9));
    ////money.push_back(new MoneyBundle(1, 0));
    ////totalMoney = CalculateTotal(money);

    //money.push_back(new MoneyBundle(2000, 0));
    //money.push_back(new MoneyBundle(1000, 0));
    //money.push_back(new MoneyBundle(500, 0));
    //money.push_back(new MoneyBundle(200, 0));
    //money.push_back(new MoneyBundle(100, 0));
    //money.push_back(new MoneyBundle(50, 0));
    //money.push_back(new MoneyBundle(20, 0));
    //money.push_back(new MoneyBundle(10, 3));
    //money.push_back(new MoneyBundle(5, 8));
    //money.push_back(new MoneyBundle(2, 9));
    //money.push_back(new MoneyBundle(1, 0));
    //totalMoney = CalculateTotal(money);
    }

    AutomatedTellerMachine::~AutomatedTellerMachine(){
    @@ -155,32 +155,40 @@ void AutomatedTellerMachine::UserWithDraw(int amount)

    if (CalculateTotal(servlist) != amount){

    int index = 0;
    for (list<MoneyBundle*>::iterator k = money.begin(); k != money.end(); ++k) {
    if ((*k)->count > 0){
    ++index;
    }
    }
    int lastIndex = index - 1;
    //int index = 0;
    //for (list<MoneyBundle*>::iterator k = money.begin(); k != money.end(); ++k) {
    // if ((*k)->count > 0){
    // ++index;
    // }
    //}
    //int lastIndex = index - 1;

    int count = count_if(money.begin(), money.end(), [](const MoneyBundle* mb){return (mb->count > 0); });
    int lastIndex = count - 1;

    cout << "***CANNOT PROCESS REQUEST***" << endl;
    cout << "Try multiples of ";

    index = 0;
    for (list<MoneyBundle*>::iterator k = money.begin(); k != money.end(); ++k) {
    MoneyBundle* mb = *k;
    if (mb->count > 0) {
    cout << mb->denomination;
    if (index < lastIndex - 1)
    cout << ", ";
    else if (index == lastIndex - 1)
    cout << " and ";
    else
    cout << ".";
    ++index;
    if (count > 0) {
    cout << "Try multiples of ";
    int index = 0;
    for (list<MoneyBundle*>::iterator k = money.begin(); k != money.end(); ++k) {
    MoneyBundle* mb = *k;
    if (mb->count > 0) {
    cout << mb->denomination;
    if (index < lastIndex - 1)
    cout << ", ";
    else if (index == lastIndex - 1)
    cout << " and ";
    else
    cout << ".";
    ++index;
    }
    }
    cout << endl;
    }
    else{
    cout << "No Cash" << endl;
    }
    cout << endl;

    }
    else{
    cout << "***TAKE CASH***" << endl;
  2. mmj-the-fighter revised this gist Dec 15, 2020. 1 changed file with 1 addition and 4 deletions.
    5 changes: 1 addition & 4 deletions atm.cpp
    Original file line number Diff line number Diff line change
    @@ -7,10 +7,7 @@ struct MoneyBundle
    {
    int denomination;
    int count;
    MoneyBundle(int aDenomination, int aCount) {
    denomination = aDenomination;
    count = aCount;
    }
    MoneyBundle(int d, int c) : denomination(d), count(c) {}
    };

    class AutomatedTellerMachine
  3. mmj-the-fighter created this gist Dec 14, 2020.
    232 changes: 232 additions & 0 deletions atm.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,232 @@
    #include <iostream>
    #include <list>

    using namespace std;

    struct MoneyBundle
    {
    int denomination;
    int count;
    MoneyBundle(int aDenomination, int aCount) {
    denomination = aDenomination;
    count = aCount;
    }
    };

    class AutomatedTellerMachine
    {
    private:
    list<MoneyBundle*> money;
    long totalMoney;
    public:
    AutomatedTellerMachine();
    ~AutomatedTellerMachine();
    //void AdminDeposit(int denomination, int numberofunits){};
    void AdminShowStatus();
    void UserWithDraw(int amount);
    private:
    void Purge(list<MoneyBundle*> & mblist);
    long CalculateTotal(list<MoneyBundle*> & mblist);
    void ServRequest(list<MoneyBundle*> & servlist);
    };

    AutomatedTellerMachine::AutomatedTellerMachine()
    {
    money.push_back(new MoneyBundle(2000, 2));
    money.push_back(new MoneyBundle(1000, 4));
    money.push_back(new MoneyBundle(500, 1));
    money.push_back(new MoneyBundle(200, 3));
    money.push_back(new MoneyBundle(100, 10));
    money.push_back(new MoneyBundle(50, 5));
    money.push_back(new MoneyBundle(20, 5));
    money.push_back(new MoneyBundle(10, 8));
    money.push_back(new MoneyBundle(5, 10));
    money.push_back(new MoneyBundle(2, 10));
    money.push_back(new MoneyBundle(1, 1));
    totalMoney = CalculateTotal(money);

    ////money.push_back(new MoneyBundle(2000, 0));
    ////money.push_back(new MoneyBundle(1000, 0));
    ////money.push_back(new MoneyBundle(500, 0));
    ////money.push_back(new MoneyBundle(200, 0));
    ////money.push_back(new MoneyBundle(100, 0));
    ////money.push_back(new MoneyBundle(50, 0));
    ////money.push_back(new MoneyBundle(20, 0));
    ////money.push_back(new MoneyBundle(10, 3));
    ////money.push_back(new MoneyBundle(5, 8));
    ////money.push_back(new MoneyBundle(2, 9));
    ////money.push_back(new MoneyBundle(1, 0));
    ////totalMoney = CalculateTotal(money);

    }

    AutomatedTellerMachine::~AutomatedTellerMachine(){
    Purge(money);
    }

    void AutomatedTellerMachine::Purge(list<MoneyBundle*> & mblist)
    {
    list<MoneyBundle*>::iterator i = mblist.begin();
    while (i != mblist.end()){
    MoneyBundle* mb = *i;
    delete mb;
    i++;
    }
    mblist.clear();
    }

    long AutomatedTellerMachine::CalculateTotal(list<MoneyBundle*> & mblist)
    {
    long sum = 0;
    for (list<MoneyBundle*>::iterator i = mblist.begin(); i != mblist.end(); ++i){
    MoneyBundle* mb = *i;
    sum += mb->count * mb->denomination;
    }
    return sum;
    }


    void AutomatedTellerMachine::AdminShowStatus()
    {
    long sum = 0;
    cout << "***ATM STATUS***" << endl;
    for (list<MoneyBundle*>::iterator i = money.begin(); i != money.end(); ++i){
    MoneyBundle* mb = *i;
    long bundleAmount = mb->count * mb->denomination;
    cout << "$" << mb->denomination << " * " << mb->count << " = " << bundleAmount << endl;
    sum += bundleAmount;
    }
    cout << "$Total: " << sum << endl;
    }


    void AutomatedTellerMachine::UserWithDraw(int amount)
    {
    if (totalMoney == 0){
    cout << "***CANNOT PROCESS REQUEST***" << endl;
    cout << "No Cash\n";
    return;
    }

    int requestedAmount = amount;

    if (requestedAmount <= 0){
    cout << "***CANNOT PROCESS REQUEST***" << endl;
    cout << "Amount should be greater than 0\n";
    return;
    }

    if (requestedAmount > totalMoney){
    cout << "***CANNOT PROCESS REQUEST***" << endl;
    cout << "Try a smaller amount\n";
    return;
    }

    list<MoneyBundle*> servlist;

    for (list<MoneyBundle*>::iterator i = money.begin(); i != money.end(); ++i){
    MoneyBundle* mb = *i;
    if (mb->count == 0)
    continue;
    int requiredcount = requestedAmount / mb->denomination;
    if (requiredcount > 0) {
    if (requiredcount > mb->count) {
    requiredcount = mb->count;
    }
    servlist.push_back(new MoneyBundle(mb->denomination, requiredcount));
    requestedAmount = requestedAmount - requiredcount*mb->denomination;
    }
    }

    if (CalculateTotal(servlist) != amount){
    Purge(servlist);
    requestedAmount = amount;
    for (list<MoneyBundle*>::reverse_iterator it = money.rbegin(); it != money.rend(); ++it){
    MoneyBundle* mb = *it;
    if (mb->count == 0)
    continue;
    int requiredcount = requestedAmount / mb->denomination;
    if (requiredcount > 0) {
    if (requiredcount > mb->count) {
    requiredcount = mb->count;
    }
    servlist.push_back(new MoneyBundle(mb->denomination, requiredcount));
    requestedAmount = requestedAmount - requiredcount*mb->denomination;
    }
    }
    }

    if (CalculateTotal(servlist) != amount){

    int index = 0;
    for (list<MoneyBundle*>::iterator k = money.begin(); k != money.end(); ++k) {
    if ((*k)->count > 0){
    ++index;
    }
    }
    int lastIndex = index - 1;

    cout << "***CANNOT PROCESS REQUEST***" << endl;
    cout << "Try multiples of ";

    index = 0;
    for (list<MoneyBundle*>::iterator k = money.begin(); k != money.end(); ++k) {
    MoneyBundle* mb = *k;
    if (mb->count > 0) {
    cout << mb->denomination;
    if (index < lastIndex - 1)
    cout << ", ";
    else if (index == lastIndex - 1)
    cout << " and ";
    else
    cout << ".";
    ++index;
    }
    }
    cout << endl;
    }
    else{
    cout << "***TAKE CASH***" << endl;
    ServRequest(servlist);
    }
    Purge(servlist);
    }

    void AutomatedTellerMachine::ServRequest(list<MoneyBundle*> & servlist)
    {
    long sum = 0;
    list<MoneyBundle*>::iterator i = servlist.begin();
    while (i != servlist.end()){
    MoneyBundle* rm = *i;
    cout << "Droppping " << rm->count << "nos. of $" << rm->denomination << " = " << rm->count * rm->denomination << endl;
    for (list<MoneyBundle*>::iterator j = money.begin(); j != money.end(); ++j) {
    MoneyBundle* mb = *j;
    if (mb->denomination == rm->denomination) {
    mb->count -= rm->count;
    }
    }
    long bundleAmount = rm->count * rm->denomination;
    sum += bundleAmount;
    ++i;
    }
    totalMoney -= sum;
    }

    int main()
    {
    AutomatedTellerMachine atm;
    char choice = 'y';
    int amount = 0;
    while (choice == 'y' || choice == 'Y')
    {
    atm.AdminShowStatus();
    cout << "\nEnter withdrawal amount: ";
    amount = 0;
    cin >> amount;
    cin.get();
    atm.UserWithDraw(amount);
    cout << "\nDo you want to continue: y/n ";
    choice = cin.get();
    }
    return 0;
    }