-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCalculator.cpp
More file actions
73 lines (66 loc) · 1.27 KB
/
Calculator.cpp
File metadata and controls
73 lines (66 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <iomanip>
#include <string>
class calcError {
public:
virtual std::string show_error() = 0;
};
class divideByZero : public calcError {
public:
std::string show_error() {
return "divide by zero";
}
};
class notANumber : public calcError {
public:
std::string show_error() {
return "not a number";
}
};
class invalidOperation : public calcError {
public:
std::string show_error() {
return "invalid operation";
}
};
int unos_broja() {
int br;
std::cin >> br;
if (std::cin.fail())
throw notANumber();
return br;
}
char unos_operacije() {
char c;
std::cin >> c;
if (c != '*' && c != '/' && c != '+' && c != '-')
throw invalidOperation();
return c;
}
double result(int a, char c, int b) {
if (c == '*')
return a * b;
else if (c == '/') {
if (b == 0)
throw divideByZero();
return static_cast<double>(a) / b;
}
else if (c == '+')
return a + b;
else if (c == '-')
return a - b;
}
int main() {
while (true) {
try {
int a = unos_broja();
char z = unos_operacije();
int b = unos_broja();
std::cout << a << z << b << "=" << result(a, z, b) << std::endl;
}
catch (calcError& err) {
std::cout << err.show_error() << std::endl;
break;
}
}
}