SHARE
TWEET

Fraction calculator

a guest May 6th, 2012 37 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2. * Fraction calculator
  3. * Initial version by 'zer0c00l' - http://pastebin.com/m7PaahKr
  4. * This version: Constantin 'morpha' Köpplinger
  5. * WaitForEnter() based on WaitForEnter() by Rachel 'Moosader' Morris
  6. */
  7. #include <iostream>
  8. #include <string>
  9. #include <functional>
  10.  
  11. int GCD(int n, int d, unsigned int max_depth = 1000)
  12. {
  13.         if(n == 0)
  14.         {
  15.                 return d;
  16.         }
  17.         if(--max_depth == 0)
  18.         {
  19.                 return 0;
  20.         }
  21.         return GCD(d % n, n, max_depth);
  22. }
  23.  
  24. void reduce(int &num, int &den)
  25. {
  26.         if(int gcd = GCD(num, den))
  27.         {
  28.                 num /= gcd;
  29.                 den /= gcd;
  30.         }
  31. }
  32.  
  33. template <typename TYPE>
  34. void input(TYPE &to, std::function<bool (TYPE data, bool valid_input)> validator)
  35. {
  36.         do
  37.         {
  38.                 std::cin.sync();
  39.                 std::cin.clear();
  40.                 std::cin >> to;
  41.         } while(std::cin.fail() || !validator(to, std::cin.good()));
  42. }
  43.  
  44. template <typename TYPE>
  45. void input(TYPE &to, std::string const &onError)
  46. {
  47.         do
  48.         {
  49.                 std::cin.sync();
  50.                 std::cin.clear();
  51.                 std::cin >> to;
  52.                 if(std::cin.fail())
  53.                 {
  54.                         std::cout << onError;
  55.                         continue;
  56.                 }
  57.         } while(false);
  58. }
  59.  
  60. void WaitForEnter()
  61. {
  62.         std::cin.sync();
  63.         std::cin.clear();
  64.         while(std::cin.get() != '\n'){}
  65. }
  66.  
  67. int main()
  68. {
  69.         int numeratorOne;
  70.         int denominatorOne;
  71.         int numeratorTwo;
  72.         int denominatorTwo;
  73.         int numeratorResult;
  74.         int denominatorResult;
  75.         char operation;
  76.  
  77.  
  78.         std::cout << "Enter the Numerator of the first fraction: ";
  79.         input<int>(numeratorOne, std::string("Sorry I didn't get that, please enter the numerator of the first fraction: "));
  80.  
  81.         std::cout << "Enter Denominator of the first fraction: ";
  82.         input<int>(denominatorOne, [](int denom, bool valid) -> bool
  83.         {
  84.                 if(!valid)
  85.                 {
  86.                         std::cout << "Sorry I didn't get that, please enter the denominator of the first fraction: ";
  87.                         return false;
  88.                 }
  89.                 if(denom == 0)
  90.                 {
  91.                         std::cout << "Sorry the denominator can not be zero, please enter a non-zero integer: ";
  92.                         return false;
  93.                 }
  94.                 return true;
  95.         });
  96.  
  97.         std::cout << "Enter the Numerator of the second fraction: ";
  98.         input<int>(numeratorTwo, std::string("Sorry I didn't get that, please enter the numerator of the second fraction: "));
  99.  
  100.         std::cout << "Enter Denominator of the second fraction: ";
  101.         input<int>(denominatorTwo, [](int denom, bool valid) -> bool
  102.         {
  103.                 if(!valid)
  104.                 {
  105.                         std::cout << "Sorry I didn't get that, please enter the denominator of the second fraction: ";
  106.                         return false;
  107.                 }
  108.                 if(denom == 0)
  109.                 {
  110.                         std::cout << "Sorry the denominator can not be zero, please enter a non-zero integer: ";
  111.                         return false;
  112.                 }
  113.                 return true;
  114.         });
  115.  
  116.         std::cout << "Please select which operation you would like to do. "
  117.                  << "\n" << "1 - Add      [+]"
  118.                  << "\n" << "2 - Subtract [-]"
  119.                  << "\n" << "3 - Multiply [*, x]"
  120.                  << "\n" << "4 - Divide   [/, :]"
  121.                  << "\n" << "Select from the above list: ";
  122.  
  123.         input<char>(operation, [](char denom, bool valid) -> bool
  124.         {
  125.                 if(!valid)
  126.                 {
  127.                         std::cout << "Sorry please select a number from 1-4 (or the appropriate sign): ";
  128.                         return false;
  129.                 }
  130.                 if(std::string("1234+-/*:x").find(denom) == std::string::npos)
  131.                 {
  132.                         std::cout << "Sorry I didn't get that, please select a number from 1-4 (or the appropriate symbol): ";
  133.                         return false;
  134.                 }
  135.                 return true;
  136.         });
  137.  
  138.         switch(operation)
  139.         {
  140.                 //Add
  141.                 case '1':
  142.                         operation = '+';
  143.                 case '+':
  144.                         numeratorResult = ((numeratorOne * denominatorTwo) + (numeratorTwo * denominatorOne));
  145.                         denominatorResult = (denominatorOne * denominatorTwo);
  146.                 break;
  147.  
  148.                 //Subtract
  149.                 case '2':
  150.                         operation = '-';
  151.                 case '-':
  152.                         numeratorResult = ((numeratorOne * denominatorTwo) - (numeratorTwo * denominatorOne));
  153.                         denominatorResult = (denominatorOne * denominatorTwo);
  154.                 break;
  155.  
  156.                 //Multiply
  157.                 case '3':
  158.                         operation = 'x';
  159.                 case '*':
  160.                 case 'x':
  161.                         numeratorResult = (numeratorOne * numeratorTwo);
  162.                         denominatorResult = (denominatorOne * denominatorTwo);
  163.                 break;
  164.  
  165.                 //Divide
  166.                 case '4':
  167.                         operation = '/';
  168.                 case '/':
  169.                 case ':':
  170.                         numeratorResult = numeratorOne * denominatorTwo;
  171.                         denominatorResult = denominatorOne * numeratorTwo;
  172.                 break;
  173.         }
  174.  
  175.         reduce(numeratorResult, denominatorResult);
  176.  
  177.         std::cout << numeratorOne << "/" << denominatorOne
  178.         << " " << operation << " "
  179.         << numeratorTwo << "/" << denominatorTwo
  180.         << " = "
  181.         << numeratorResult << "/" << denominatorResult << "\n";
  182.  
  183.         std::cout << "Press RETURN to quit.";
  184.         WaitForEnter();
  185.  
  186.         return 0;
  187. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top