From 86d528026e38f05c61ec5203454e6d15cfd10d1b Mon Sep 17 00:00:00 2001 From: Aditya Agrawal Date: Sat, 15 Nov 2025 19:00:52 +0530 Subject: [PATCH] feat: added atm cash despenser --- Src/ATM_CASH_DESPENSER/COR.cpp | 176 +++++++++++++++++++++++++++++ Src/ATM_CASH_DESPENSER/compile.bat | 18 +++ Src/ATM_CASH_DESPENSER/cor.exe | Bin 0 -> 53012 bytes 3 files changed, 194 insertions(+) create mode 100644 Src/ATM_CASH_DESPENSER/COR.cpp create mode 100644 Src/ATM_CASH_DESPENSER/compile.bat create mode 100644 Src/ATM_CASH_DESPENSER/cor.exe diff --git a/Src/ATM_CASH_DESPENSER/COR.cpp b/Src/ATM_CASH_DESPENSER/COR.cpp new file mode 100644 index 0000000..b1f2e75 --- /dev/null +++ b/Src/ATM_CASH_DESPENSER/COR.cpp @@ -0,0 +1,176 @@ +#include +using namespace std; + +// Abstract Handler (Base Class) +class MoneyHandler { +protected: + MoneyHandler *nextHandler; + +public: + MoneyHandler() { + this->nextHandler = nullptr; + } + + void setNextHandler(MoneyHandler *next) { + nextHandler = next; + } + + virtual void dispense(int amount) = 0; +}; + +class ThousandHandler : public MoneyHandler { +private: + int numNotes; + +public: + ThousandHandler(int numNotes) { + this->numNotes = numNotes; + } + + void dispense(int amount) override { + int notesNeeded = amount / 1000; + + if(notesNeeded > numNotes) { + notesNeeded = numNotes; + numNotes = 0; + } + else { + numNotes -= notesNeeded; + } + + if(notesNeeded > 0) + cout << "Dispensing " << notesNeeded << " x ₹1000 notes.\n"; + + int remainingAmount = amount - (notesNeeded * 1000); + if(remainingAmount > 0) { + if(nextHandler != nullptr) nextHandler->dispense(remainingAmount); + else { + cout << "Remaining amount of " << remainingAmount << " cannot be fulfilled (Insufficinet fund in ATM)\n"; + } + } + } +}; + +// Concrete Handler for 500 Rs Notes +class FiveHundredHandler : public MoneyHandler { +private: + int numNotes; + +public: + FiveHundredHandler(int numNotes) { + this->numNotes = numNotes; + } + + void dispense(int amount) override { + int notesNeeded = amount / 500; + + if(notesNeeded > numNotes) { + notesNeeded = numNotes; + numNotes = 0; + } + else { + numNotes -= notesNeeded; + } + + if(notesNeeded > 0) + cout << "Dispensing " << notesNeeded << " x ₹500 notes.\n"; + + int remainingAmount = amount - (notesNeeded * 500); + if(remainingAmount > 0) { + if(nextHandler != nullptr) nextHandler->dispense(remainingAmount); + else { + cout << "Remaining amount of " << remainingAmount << " cannot be fulfilled (Insufficinet fund in ATM)\n"; + } + } + } +}; + +// Concrete Handler for 200 Rs Notes +class TwoHundredHandler : public MoneyHandler { +private: + int numNotes; + +public: + TwoHundredHandler(int numNotes) { + this->numNotes = numNotes; + } + + void dispense(int amount) override { + int notesNeeded = amount / 200; + + if(notesNeeded > numNotes) { + notesNeeded = numNotes; + numNotes = 0; + } + else { + numNotes -= notesNeeded; + } + + if(notesNeeded > 0) + cout << "Dispensing " << notesNeeded << " x ₹200 notes.\n"; + + int remainingAmount = amount - (notesNeeded * 200); + if(remainingAmount > 0) { + if(nextHandler != nullptr) nextHandler->dispense(remainingAmount); + else { + cout << "Remaining amount of " << remainingAmount << " cannot be fulfilled (Insufficinet fund in ATM)\n"; + } + } + } +}; + +// Concrete Handler for 100 Rs Notes +class HundredHandler : public MoneyHandler { +private: + int numNotes; + +public: + HundredHandler(int numNotes) { + this->numNotes = numNotes; + } + + void dispense(int amount) override { + int notesNeeded = amount / 100; + + if(notesNeeded > numNotes) { + notesNeeded = numNotes; + numNotes = 0; + } + else { + numNotes -= notesNeeded; + } + + if(notesNeeded > 0) + cout << "Dispensing " << notesNeeded << " x ₹100 notes.\n"; + + int remainingAmount = amount - (notesNeeded * 100); + if(remainingAmount > 0) { + if(nextHandler != nullptr) nextHandler->dispense(remainingAmount); + else { + cout << "Remaining amount of " << remainingAmount << " cannot be fulfilled (Insufficinet fund in ATM)\n"; + } + } + } +}; + +// Client Code +int main() { + // Creating handlers for each note type + MoneyHandler* thousandHandler = new ThousandHandler(3); + MoneyHandler* fiveHundredHandler = new FiveHundredHandler(5); + MoneyHandler* twoHundredHandler= new TwoHundredHandler(10); + MoneyHandler* hundredHandler= new HundredHandler(20); + + // Setting up the chain of responsibility + thousandHandler->setNextHandler(fiveHundredHandler); + fiveHundredHandler->setNextHandler(twoHundredHandler); + twoHundredHandler->setNextHandler(hundredHandler); + + int amountToWithdraw = 4000; + + // Initiating the chain + cout << "\nDispensing amount: ₹" << amountToWithdraw << endl; + thousandHandler->dispense(amountToWithdraw); + + return 0; +} diff --git a/Src/ATM_CASH_DESPENSER/compile.bat b/Src/ATM_CASH_DESPENSER/compile.bat new file mode 100644 index 0000000..e599dae --- /dev/null +++ b/Src/ATM_CASH_DESPENSER/compile.bat @@ -0,0 +1,18 @@ +@echo off +echo Compiling C++ Chain of Responsibility Application... + +REM Compile the main program +g++ -std=c++11 -o cor COR.cpp + +if %errorlevel% equ 0 ( + echo Compilation successful! + echo Running the Chain of Responsibility application... + echo. + cor.exe +) else ( + echo Compilation failed! + echo Please check for any syntax errors. +) + +pause + diff --git a/Src/ATM_CASH_DESPENSER/cor.exe b/Src/ATM_CASH_DESPENSER/cor.exe new file mode 100644 index 0000000000000000000000000000000000000000..e1b9b9f06c4b8a2beed936507e4de579692b9f8d GIT binary patch literal 53012 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∾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