-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
executable file
·213 lines (192 loc) · 4.36 KB
/
main.cpp
File metadata and controls
executable file
·213 lines (192 loc) · 4.36 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#include<cctype>
#include<iostream>
//#include<map>
#include <sstream>
using namespace std;
enum input_value
{
//NAME用来支持定义字符的数学值 例如 pi=3.1416926
// NAME,
NUMBER, END,
PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
PRINT = ';', ASSIGN = '=', LP = '(', RP = ')'
};
// 数值表达式 计算器 支持 + - * / ( ) 按符号优先级 计算
// 一个数值间不能有空格,比如数字十 10 不能为 1 0,只能为10
// 数值与操作符直接可以有任意空格,比如 10 + 2 * 5
class Calculator
{
private:
stringstream strin;//输入流
input_value current_value;
// map<string, double> table;
double number_value;
string string_value;
int number_of_errors;
double error(const string &s);
double fun_1(bool get);
double fun_2(bool get);
double fun_3(bool get);
input_value get_value();
void CalculatorInit();
public:
double calculateString(const string &strs);
};
double Calculator::error(const string &s)
{
++number_of_errors;
cerr << "错误:" << s << endl;
return 0;
}
input_value Calculator::get_value()
{
char ch = 0;
strin >> ch;
switch (ch)
{
case 0:
return current_value = END;
case ';':
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
return current_value = input_value(ch);
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
strin.putback(ch);
strin >> number_value;
return current_value = NUMBER;
default:
// if (isalpha(ch))
// {
// strin.putback(ch);
// strin >> string_value;
// return current_value = NAME;
// }
error("非法输入!");
return current_value = PRINT;
}
}
double Calculator::fun_3(bool get)
{
if (get) get_value();
switch (current_value)
{
case NUMBER:
{
double v = number_value;
get_value();
return v;
}
// case NAME:
// {
// double &v = table[string_value];
// if (get_value() == ASSIGN)
// {
// v = fun_1(true);
// }
// return v;
// }
case MINUS:
return -fun_3(true);
case LP:
{
double e = fun_1(true);
if (current_value != RP)
{
return error(") 缺失");
}
get_value();
return e;
}
default:
{
return error("输入错误!");
}
}
}
double Calculator::fun_2(bool get)
{
double left = fun_3(get);
for (;;)
switch (current_value)
{
case MUL:
left *= fun_3(true);
break;
case DIV:
if (double d = fun_3(true))
{
left /= d;
break;
}
{
return error("除数不能为0!");
}
default:
return left;
}
}
double Calculator::fun_1(bool get)
{
double left = fun_2(get);
for (;;)
switch (current_value)
{
case PLUS:
left += fun_2(true);
break;
case MINUS:
left -= fun_2(true);
break;
default:
return left;
}
}
void Calculator::CalculatorInit()
{
current_value = PRINT;
number_value = 0;
number_of_errors = 0;
// table["pi"] = 3.1415926535897932385;
// table["e"] = 2.718284590452354;
string_value = "";
strin.clear();
strin.str("");
}
double Calculator::calculateString(const string &strs)
{
CalculatorInit();
strin << strs << "=";
while (strin)
{
get_value();
if (current_value == END) break;
if (current_value == PRINT) continue;
return fun_1(false);
}
return 0;
}
int main()
{
string line;
Calculator calculator;
while (getline(cin, line))
{
cout << calculator.calculateString(line) << endl;
}
return 0;
}