|
| 1 | +#include <iostream> |
| 2 | +#include <limits> |
| 3 | +#include <iomanip> |
| 4 | +#include <cmath> |
| 5 | +using namespace std; |
| 6 | + |
| 7 | +void clearInput() { |
| 8 | + cin.clear(); |
| 9 | + cin.ignore(numeric_limits<streamsize>::max(), '\n'); |
| 10 | +} |
| 11 | + |
| 12 | +double getNumber(const string &prompt) { |
| 13 | + double x; |
| 14 | + while (true) { |
| 15 | + cout << prompt; |
| 16 | + if (cin >> x) { |
| 17 | + clearInput(); |
| 18 | + return x; |
| 19 | + } |
| 20 | + cout << "Invalid number. Try again.\n"; |
| 21 | + clearInput(); |
| 22 | + } |
| 23 | +} |
| 24 | + |
| 25 | +int getIntInRange(const string &prompt, int lo, int hi) { |
| 26 | + int c; |
| 27 | + while (true) { |
| 28 | + cout << prompt; |
| 29 | + if (cin >> c) { |
| 30 | + clearInput(); |
| 31 | + if (c >= lo && c <= hi) return c; |
| 32 | + cout << "Choice out of range (" << lo << " - " << hi << "). Try again.\n"; |
| 33 | + } else { |
| 34 | + cout << "Invalid input. Enter a number.\n"; |
| 35 | + clearInput(); |
| 36 | + } |
| 37 | + } |
| 38 | +} |
| 39 | + |
| 40 | +namespace conv { |
| 41 | + double metersToKilometers(double m) { return m / 1000.0; } |
| 42 | + double kilometersToMeters(double km) { return km * 1000.0; } |
| 43 | + double metersToMiles(double m) { return m / 1609.344; } |
| 44 | + double milesToMeters(double mi) { return mi * 1609.344; } |
| 45 | + double feetToMeters(double ft) { return ft * 0.3048; } |
| 46 | + double metersToFeet(double m) { return m / 0.3048; } |
| 47 | + |
| 48 | + double cToF(double c) { return (c * 9.0/5.0) + 32.0; } |
| 49 | + double fToC(double f) { return (f - 32.0) * 5.0/9.0; } |
| 50 | + double cToK(double c) { return c + 273.15; } |
| 51 | + double kToC(double k) { return k - 273.15; } |
| 52 | + |
| 53 | + double gramsToKilograms(double g) { return g / 1000.0; } |
| 54 | + double kilogramsToGrams(double kg) { return kg * 1000.0; } |
| 55 | + double kilogramsToPounds(double kg) { return kg * 2.2046226218; } |
| 56 | + double poundsToKilograms(double lb) { return lb / 2.2046226218; } |
| 57 | + |
| 58 | + double litersToMilliliters(double L) { return L * 1000.0; } |
| 59 | + double millilitersToLiters(double mL) { return mL / 1000.0; } |
| 60 | + double litersToGallons(double L) { return L * 0.2641720524; } |
| 61 | + double gallonsToLiters(double gal) { return gal / 0.2641720524; } |
| 62 | +} |
| 63 | + |
| 64 | +void pressEnterToContinue() { |
| 65 | + cout << "\nPress ENTER to continue..."; |
| 66 | + cin.get(); |
| 67 | +} |
| 68 | + |
| 69 | +void lengthMenu() { |
| 70 | + while (true) { |
| 71 | + cout << "\n--- Length Converter ---\n"; |
| 72 | + cout << "1) Meters → Kilometers\n"; |
| 73 | + cout << "2) Kilometers → Meters\n"; |
| 74 | + cout << "3) Meters → Miles\n"; |
| 75 | + cout << "4) Miles → Meters\n"; |
| 76 | + cout << "5) Feet → Meters\n"; |
| 77 | + cout << "6) Meters → Feet\n"; |
| 78 | + cout << "7) Back to Main Menu\n"; |
| 79 | + int ch = getIntInRange("Choose (1-7): ", 1, 7); |
| 80 | + if (ch == 7) return; |
| 81 | + |
| 82 | + double v = getNumber("Enter value: "); |
| 83 | + cout << fixed << setprecision(6); |
| 84 | + switch (ch) { |
| 85 | + case 1: cout << v << " m = " << conv::metersToKilometers(v) << " km\n"; break; |
| 86 | + case 2: cout << v << " km = " << conv::kilometersToMeters(v) << " m\n"; break; |
| 87 | + case 3: cout << v << " m = " << conv::metersToMiles(v) << " miles\n"; break; |
| 88 | + case 4: cout << v << " miles = " << conv::milesToMeters(v) << " m\n"; break; |
| 89 | + case 5: cout << v << " ft = " << conv::feetToMeters(v) << " m\n"; break; |
| 90 | + case 6: cout << v << " m = " << conv::metersToFeet(v) << " ft\n"; break; |
| 91 | + } |
| 92 | + pressEnterToContinue(); |
| 93 | + } |
| 94 | +} |
| 95 | + |
| 96 | +void temperatureMenu() { |
| 97 | + while (true) { |
| 98 | + cout << "\n--- Temperature Converter ---\n"; |
| 99 | + cout << "1) Celsius → Fahrenheit\n"; |
| 100 | + cout << "2) Fahrenheit → Celsius\n"; |
| 101 | + cout << "3) Celsius → Kelvin\n"; |
| 102 | + cout << "4) Kelvin → Celsius\n"; |
| 103 | + cout << "5) Back to Main Menu\n"; |
| 104 | + int ch = getIntInRange("Choose (1-5): ", 1, 5); |
| 105 | + if (ch == 5) return; |
| 106 | + |
| 107 | + double v = getNumber("Enter value: "); |
| 108 | + cout << fixed << setprecision(4); |
| 109 | + switch (ch) { |
| 110 | + case 1: cout << v << " °C = " << conv::cToF(v) << " °F\n"; break; |
| 111 | + case 2: cout << v << " °F = " << conv::fToC(v) << " °C\n"; break; |
| 112 | + case 3: cout << v << " °C = " << conv::cToK(v) << " K\n"; break; |
| 113 | + case 4: cout << v << " K = " << conv::kToC(v) << " °C\n"; break; |
| 114 | + } |
| 115 | + pressEnterToContinue(); |
| 116 | + } |
| 117 | +} |
| 118 | + |
| 119 | +void weightMenu() { |
| 120 | + while (true) { |
| 121 | + cout << "\n--- Weight Converter ---\n"; |
| 122 | + cout << "1) Grams → Kilograms\n"; |
| 123 | + cout << "2) Kilograms → Grams\n"; |
| 124 | + cout << "3) Kilograms → Pounds\n"; |
| 125 | + cout << "4) Pounds → Kilograms\n"; |
| 126 | + cout << "5) Back to Main Menu\n"; |
| 127 | + int ch = getIntInRange("Choose (1-5): ", 1, 5); |
| 128 | + if (ch == 5) return; |
| 129 | + |
| 130 | + double v = getNumber("Enter value: "); |
| 131 | + cout << fixed << setprecision(6); |
| 132 | + switch (ch) { |
| 133 | + case 1: cout << v << " g = " << conv::gramsToKilograms(v) << " kg\n"; break; |
| 134 | + case 2: cout << v << " kg = " << conv::kilogramsToGrams(v) << " g\n"; break; |
| 135 | + case 3: cout << v << " kg = " << conv::kilogramsToPounds(v) << " lb\n"; break; |
| 136 | + case 4: cout << v << " lb = " << conv::poundsToKilograms(v) << " kg\n"; break; |
| 137 | + } |
| 138 | + pressEnterToContinue(); |
| 139 | + } |
| 140 | +} |
| 141 | + |
| 142 | +void volumeMenu() { |
| 143 | + while (true) { |
| 144 | + cout << "\n--- Volume Converter ---\n"; |
| 145 | + cout << "1) Liters → Milliliters\n"; |
| 146 | + cout << "2) Milliliters → Liters\n"; |
| 147 | + cout << "3) Liters → Gallons (US)\n"; |
| 148 | + cout << "4) Gallons (US) → Liters\n"; |
| 149 | + cout << "5) Back to Main Menu\n"; |
| 150 | + int ch = getIntInRange("Choose (1-5): ", 1, 5); |
| 151 | + if (ch == 5) return; |
| 152 | + |
| 153 | + double v = getNumber("Enter value: "); |
| 154 | + cout << fixed << setprecision(6); |
| 155 | + switch (ch) { |
| 156 | + case 1: cout << v << " L = " << conv::litersToMilliliters(v) << " mL\n"; break; |
| 157 | + case 2: cout << v << " mL = " << conv::millilitersToLiters(v) << " L\n"; break; |
| 158 | + case 3: cout << v << " L = " << conv::litersToGallons(v) << " gal\n"; break; |
| 159 | + case 4: cout << v << " gal = " << conv::gallonsToLiters(v) << " L\n"; break; |
| 160 | + } |
| 161 | + pressEnterToContinue(); |
| 162 | + } |
| 163 | +} |
| 164 | + |
| 165 | +// --- Main --- |
| 166 | +void printMainMenu() { |
| 167 | + cout << "\n=============================\n"; |
| 168 | + cout << " UNIT CONVERTER\n"; |
| 169 | + cout << "=============================\n"; |
| 170 | + cout << "1) Length\n"; |
| 171 | + cout << "2) Temperature\n"; |
| 172 | + cout << "3) Weight\n"; |
| 173 | + cout << "4) Volume\n"; |
| 174 | + cout << "5) Exit\n"; |
| 175 | +} |
| 176 | + |
| 177 | +int main() { |
| 178 | + cout << "Simple Unit Converter (console)\n"; |
| 179 | + while (true) { |
| 180 | + printMainMenu(); |
| 181 | + int ch = getIntInRange("Choose (1-5): ", 1, 5); |
| 182 | + switch (ch) { |
| 183 | + case 1: lengthMenu(); break; |
| 184 | + case 2: temperatureMenu(); break; |
| 185 | + case 3: weightMenu(); break; |
| 186 | + case 4: volumeMenu(); break; |
| 187 | + case 5: |
| 188 | + cout << "Goodbye!\n"; |
| 189 | + return 0; |
| 190 | + } |
| 191 | + } |
| 192 | + return 0; |
| 193 | +} |
0 commit comments