From 1525da16403608738c9fb1530f9462165d527804 Mon Sep 17 00:00:00 2001 From: Satvik-Singh192 Date: Wed, 22 Oct 2025 11:10:44 +0530 Subject: [PATCH] feat: Implement C++ Currency Converter Added a C++ Currency Converter feature with OOP-based design, supporting multi-currency conversion, user-friendly console interface, and error handling. Closes #4 --- Src/Currency_Converter/CurrencyConverter.cpp | 55 +++++++++++ Src/Currency_Converter/CurrencyConverter.h | 26 +++++ Src/Currency_Converter/README.md | 45 +++++++++ Src/Currency_Converter/currency_converter.exe | Bin 0 -> 193745 bytes Src/Currency_Converter/main.cpp | 89 ++++++++++++++++++ 5 files changed, 215 insertions(+) create mode 100644 Src/Currency_Converter/CurrencyConverter.cpp create mode 100644 Src/Currency_Converter/CurrencyConverter.h create mode 100644 Src/Currency_Converter/currency_converter.exe create mode 100644 Src/Currency_Converter/main.cpp diff --git a/Src/Currency_Converter/CurrencyConverter.cpp b/Src/Currency_Converter/CurrencyConverter.cpp new file mode 100644 index 0000000..aed5ff5 --- /dev/null +++ b/Src/Currency_Converter/CurrencyConverter.cpp @@ -0,0 +1,55 @@ +#include "CurrencyConverter.h" +#include +#include + +CurrencyConverter::CurrencyConverter() { + // We will use USD as the "base currency" for all conversions. + // These rates represent how many USD 1 unit of the currency is worth. + // Example: 1 EUR = 1.08 USD + rates["USD"] = 1.00; + rates["EUR"] = 1.08; + rates["INR"] = 0.012; + rates["GBP"] = 1.25; + rates["JPY"] = 0.0067; +} + +bool CurrencyConverter::isCurrencySupported(const std::string& currencyCode) { + return rates.find(currencyCode) != rates.end(); +} + +// Helper function to print all supported currency codes +void CurrencyConverter::printAvailableCurrencies() { + std::cout << "Supported currencies: "; + for (const auto& pair : rates) { + std::cout << pair.first << " "; // pair.first is the key (e.g., "USD") + } + std::cout << std::endl; +} + +// The main conversion logic +double CurrencyConverter::convert(double amount, const std::string& fromCurrency, const std::string& toCurrency) { + + // 1. Error Handling: Check if both currencies are supported + if (!isCurrencySupported(fromCurrency)) { + throw std::invalid_argument("Error: 'From' currency code not supported: " + fromCurrency); + } + if (!isCurrencySupported(toCurrency)) { + throw std::invalid_argument("Error: 'To' currency code not supported: " + toCurrency); + } + + // 2. Handle simple case: No conversion needed + if (fromCurrency == toCurrency) { + return amount; + } + + // 3. Conversion Logic (using USD as a base) + // First, convert the 'from' amount into our base currency (USD) + double amountInUSD = amount * rates[fromCurrency]; + + // Second, convert from USD into the 'to' currency + // (We divide because the rate is X_USD = 1_TARGET_CURRENCY) + // To get 1 USD = Y_TARGET_CURRENCY, we do 1 / rate. + double finalAmount = amountInUSD / rates[toCurrency]; + + return finalAmount; +} \ No newline at end of file diff --git a/Src/Currency_Converter/CurrencyConverter.h b/Src/Currency_Converter/CurrencyConverter.h new file mode 100644 index 0000000..bbbd33c --- /dev/null +++ b/Src/Currency_Converter/CurrencyConverter.h @@ -0,0 +1,26 @@ +#pragma once +#include +#include + +class CurrencyConverter { +private: + // A map to store exchange rates, with USD as the base currency. + // The key is the currency code (e.g., "EUR"), and the value is + // how many USD 1 unit of that currency is worth. + std::map rates; + +public: + // This is the constructor. It's called when you create a new + // CurrencyConverter object. We use it to load our predefined rates. + CurrencyConverter(); + + // The main conversion function. + // Throws an exception if a currency code is invalid. + double convert(double amount, const std::string& fromCurrency, const std::string& toCurrency); + + // A helper function to check if we support a currency. + bool isCurrencySupported(const std::string& currencyCode); + + // A helper function to show the user what currencies are available. + void printAvailableCurrencies(); +}; \ No newline at end of file diff --git a/Src/Currency_Converter/README.md b/Src/Currency_Converter/README.md index c68032a..0b9d398 100644 --- a/Src/Currency_Converter/README.md +++ b/Src/Currency_Converter/README.md @@ -25,3 +25,48 @@ The program is designed using **Object-Oriented Programming (OOP)** principles, - Clear and readable methods --- + +# How to Compile and Run + +## Prerequisites +You will need a C++ compiler installed on your system, such as **g++** (part of the **MinGW-w64** toolset on Windows) or **Clang**. +Make sure it is added to your system's **PATH**. + +--- + +## Steps + +1. **Open your terminal or command prompt.** + +2. **Navigate to the project directory** where the `.cpp` files are located: + + ```bash + cd path/to/Currency_Converter + ``` + +3. **Compile and Run** + # Compile the source code + Run the following command in your terminal: + + ```bash + g++ main.cpp CurrencyConverter.cpp -o currency_converter -std=c++11 + ``` + +This will compile all the necessary files and create a single executable program named +`currency_converter` (or `currency_converter.exe` on Windows). + +--- + + # Run the Application + + **On Windows (PowerShell/CMD):** + ```bash + .\currency_converter.exe + ``` + + **On macOS or Linux:** + ```bash + ./currency_converter + ``` + +Follow the on-screen prompts to use the converter. \ No newline at end of file diff --git a/Src/Currency_Converter/currency_converter.exe b/Src/Currency_Converter/currency_converter.exe new file mode 100644 index 0000000000000000000000000000000000000000..ca69effd86b942456daa89b5f733149552d47f3b GIT binary patch literal 193745 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 z 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 LBwI=U%;*0H**6 +#include +#include +#include + +#include "CurrencyConverter.h" + +double getValidAmount() { + double amount; + while (true) { + std::cout << "Enter amount to convert: "; + if (std::cin >> amount) { + if (amount > 0) { + return amount; + } else { + std::cout << "Please enter a positive amount." << std::endl; + } + } else { + // This handles non-numeric input + std::cout << "Invalid input. Please enter a number." << std::endl; + std::cin.clear(); // Clear the error flag + // Discard the invalid input from the buffer + std::cin.ignore(std::numeric_limits::max(), '\n'); + } + } +} + +// Helper function to get a valid currency code from the user +std::string getValidCurrency(const std::string& prompt, CurrencyConverter& converter) { + std::string code; + while (true) { + std::cout << prompt; + std::cin >> code; + + // Convert input to uppercase to be safe + for (auto &c : code) c = toupper(c); + + if (converter.isCurrencySupported(code)) { + return code; // Valid currency + } else { + std::cout << "Invalid or unsupported currency code. Please try again." << std::endl; + converter.printAvailableCurrencies(); + } + } +} + + +int main() { + // 1. Create an instance of our converter. + // This calls the constructor and loads the rates. + CurrencyConverter converter; + + std::cout << "Welcome to the C++ Currency Converter!" << std::endl; + + // 2. Main application loop + while (true) { + std::cout << "\n------------------------------------" << std::endl; + converter.printAvailableCurrencies(); + + // 3. Get all user inputs + std::string from = getValidCurrency("Convert FROM (e.g., USD): ", converter); + std::string to = getValidCurrency("Convert TO (e.g., EUR): ", converter); + double amount = getValidAmount(); + + // 4. Perform conversion and handle errors + try { + double result = converter.convert(amount, from, to); + + // Print the result + std::cout << "\n--- Result ---" << std::endl; + std::cout << amount << " " << from << " = " << result << " " << to << std::endl; + + } catch (const std::exception& e) { + // This will catch errors we threw in our .convert() function + std::cout << e.what() << std::endl; + } + + // 5. Ask to go again + std::cout << "\nDo you want to perform another conversion? (y/n): "; + char choice; + std::cin >> choice; + if (choice != 'y' && choice != 'Y') { + break; // Exit the while loop + } + } + + std::cout << "Thank you for using the converter. Goodbye!" << std::endl; + return 0; +} \ No newline at end of file