#include
#include
#include
#include
#include
double GetNum(char *&szp)
{
double retint = 0;
for(;isdigit(*szp);szp++)
{
retint *= 10;
retint += *szp - 48;
}
if(*szp == '.')
{
double retdec = 0;
int deccount = 0;
szp++;
for(;isdigit(*szp);szp++)
{
retdec *= 10;
retdec += *szp - 48;
deccount++;
}
while(deccount-->0)
retdec /= 10;
retint += retdec;
}
return retint;
}
void GetUnprintableChar(char *&szp)
{
while (*szp == ' ' || *szp == '\t')
szp++;
}
class factor
{
public:
factor(){};
factor(char *&start)
{
if(*start == '+')sign = true;
else if(*start == '-')sign = false;
else
{
fprintf(stderr, "factor.factor: (sz = %p) error: sign must be '+' or '-'.\n", start);
exit(-1);
}
start++;
GetUnprintableChar(start);
szstart = start;
for(;isdigit(*start)||*start=='*'||*start=='/'||*start==' ';start++);
szend = start;
calculate();
}
void calculate()
{
fatalvalue = GetNum(szstart);
while(szstart!=szend)
{
GetUnprintableChar(szstart);
if(*szstart == '*')
GetUnprintableChar(++szstart), fatalvalue *= GetNum(szstart);
else if (*szstart == '/')
GetUnprintableChar(++szstart), fatalvalue /= GetNum(szstart);
else break;
}
}
double getval()
{
if(sign)
return fatalvalue;
else
return -fatalvalue;
}
void forthset(char *start, char *end, bool s)
{
szstart = start;
szend = end;
sign = s;
}
private:
//input
char *szstart;
char *szend;
bool sign;
//calulate
double fatalvalue;
};
using std::vector;
double separator(char *sz)
{
GetUnprintableChar(sz);
vector factors;
if(isdigit(*sz))
{
factors.push_back(new factor);
char *sze = sz;
while (*sze != '+'&&*sze != '-')
sze++;
factors[0]->forthset(sz, sze, true);
factors[0]->calculate();
sz = sze;
}
while(*sz=='+'||*sz=='-')
factors.push_back(new factor(sz));
if(*sz!=0)
{
fprintf(stderr, "separator: (sz = %p) error: incorrect char at the end of the string.\n", sz);
while (*sz!=0) putchar(*sz++);
exit(-1);
}
double returnvalue = 0;
vector::iterator it;
for(it=factors.begin();it!=factors.end();it++)
returnvalue += (*it)->getval();
return returnvalue;
}
int main(int argc, char **argv)
{
char *sz = argv[1];
printf("%f", separator(sz));
}
1 #include
2 #include
3
4 char token;
5
6 double exp(void);
7 double term(void);
8 double factor(void);
9 char getPrintableChar(void);
10
11 void match(char expectedToken);
12 void error(void);
13
14
15 int main(void)
16 {
17 double result;
18 printf(">>: ");
19 while(1)
20 {
21 token = getPrintableChar();
22 result = exp();
23 if (token == '\n')
24 printf("<<< %g\n>>: ", result);
25 else
26 error();
27 }
28
29 return 0;
30 }
31
32 double exp(void)
33 {
34 double temp = term();
35 while (token == '+' || token == '-')
36 switch(token)
37 {
38 case '+':
39 match('+');
40 temp += term();
41 break;
42 case '-':
43 match('-');
44 temp -= term();
45 break;
46 }
47 return temp;
48 }
49
50 double term(void)
51 {
52 double temp = factor();
53 while (token == '*' || token == '/')
54 switch(token)
55 {
56 case '*':
57 match('*');
58 temp *= factor();
59 break;
60 case '/':
61 match('/');
62 temp /= factor();
63 break;
64 }
65 return temp;
66 }
67
68 double factor(void)
69 {
70 double temp;
71 if (token == '(')
72 {
73 match('(');
74 temp = exp();
75 match(')');
76 }
77 else if (isdigit(token))
78 {
79 ungetc(token, stdin);
80 scanf("%lf", &temp);
81 token = getPrintableChar();
82 }
83 else
84 error();
85
86 return temp;
87 }
88
89 void error(void)
90 {
91 fprintf(stderr, "Error!\n");
92 exit(EXIT_FAILURE);
93 }
94
95 void match(char expectedToken)
96 {
97 if (expectedToken == token)
98 token = getPrintableChar();
99 else
100 error();
101 }
102
103 char getPrintableChar(void)
104 {
105 char temp;
106 do
107 temp = getchar();
108 while (isblank(temp));
109
110 return temp;
111 }