• API
• FAQ
• Tools
• Archive
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.         {
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.