189 lines
6.2 KiB
C
189 lines
6.2 KiB
C
|
/*
|
|||
|
Program: evalExpression-v2.c (Report comments/bugs to chikh@yuntech.edu.tw)
|
|||
|
Function: <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>ѽd<EFBFBD><EFBFBD>infixTopostfix.c<EFBFBD>{<EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>ĤT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>ĥ|<EFBFBD>D<EFBFBD><EFBFBD><EFBFBD>n<EFBFBD>D<EFBFBD>A<EFBFBD>ϱo<EFBFBD>{<EFBFBD><EFBFBD><EFBFBD>i<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϥΪ<EFBFBD>
|
|||
|
<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܦ<EFBFBD><EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>H<EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܦ<EFBFBD><EFBFBD>A<EFBFBD>A<EFBFBD>̦<EFBFBD><EFBFBD>i<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><EFBFBD>G<EFBFBD>ȡC
|
|||
|
<EFBFBD>PevalExpression-v1.c<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>ۦP<EFBFBD>A<EFBFBD>ߤ@<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>bevaluate()<EFBFBD><EFBFBD><EFBFBD>ƪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD>覡<EFBFBD>F<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Hstrtok()
|
|||
|
<EFBFBD>@<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>A<EFBFBD>H<EFBFBD>ťէ@<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>һݪ<EFBFBD><EFBFBD>B<EFBFBD>⤸<EFBFBD>P<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>C
|
|||
|
Notes:
|
|||
|
10+20*(50-30)/2^4-6*8
|
|||
|
10+20*(-50+30)/-2^4-6*8
|
|||
|
10.5+20.8*(50.1-30.6)/2.5^4-6.6*8.2
|
|||
|
10.5+20.8*(-50.1+30.6)/2.5^-4-6.6*8.2
|
|||
|
10-30*(+50-20)/-2^-4+7.5*-6
|
|||
|
10+30*(+50.2+3.8)/+2^2.5+15*-6.5
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <string.h> /* for strtok() */
|
|||
|
#include <math.h> /* for pow() */
|
|||
|
#include <ctype.h> /* for isdigit() */
|
|||
|
|
|||
|
#define MAX 120
|
|||
|
|
|||
|
void infix_to_postfix(char [], int, char []); /* <20>Ѥ<EFBFBD><D1A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǩ<EFBFBD><C7A8><EFBFBD> */
|
|||
|
int compare(char, char); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹB<D3B9><42><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD> */
|
|||
|
float evaluate(char []); /* <20>s<EFBFBD>q<EFBFBD><71><EFBFBD><EFBFBD><EFBFBD>ơA<C6A1><41><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6><EFBFBD><EFBFBD>@<40>һݪ<D2BB><DDAA>ƾǹB<C7B9><42><EFBFBD>æ^<5E>ǵ<EFBFBD><C7B5>G<EFBFBD><47> */
|
|||
|
|
|||
|
/* <20>b<EFBFBD><62><EFBFBD>Ǫ<EFBFBD><C7AA>ܪk<DCAA><6B><EFBFBD>C<EFBFBD>μȦs<C8A6><73><EFBFBD>|<7C><><EFBFBD>A<EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD><6C><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><C7AA>A<EFBFBD><41><EFBFBD>u<EFBFBD><75><EFBFBD>Ȭ<EFBFBD>INDEX/2 */
|
|||
|
char infix_priority[9] = {'#', ')', '+', '-', '*', '/', '^', '('};
|
|||
|
char stack_priority[8] = {'#', '(', '+', '-', '*', '/', '^'};
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
int i, index = -1;
|
|||
|
char infix_q[MAX], postExpr[2*MAX] = {0}; /* <20>x<EFBFBD>s<EFBFBD>ϥΪ̿<CEAA><CCBF>J<EFBFBD><4A><EFBFBD>Ǧ<EFBFBD><C7A6>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>ഫ<EFBFBD><E0B4AB><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6>r<EFBFBD><72><EFBFBD>s<EFBFBD><73>postExpr */
|
|||
|
|
|||
|
printf("\n<EFBFBD>п<EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܦ<EFBFBD>(<28>䴩+-*/^()<29>B<EFBFBD><42>) => ");
|
|||
|
|
|||
|
while (infix_q[index] != '\n')
|
|||
|
infix_q[++index] = getchar();
|
|||
|
infix_q[index] = '#'; /* <20><><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD>̫<EFBFBD><CCAB>@<40>Ӧr<D3A6><72><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E>'#'<27>A<EFBFBD>@<40><><EFBFBD>B<EFBFBD>⦡<EFBFBD>r<EFBFBD>굲<EFBFBD><EAB5B2> */
|
|||
|
|
|||
|
printf("\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܦ<EFBFBD><EFBFBD>G");
|
|||
|
infix_to_postfix(infix_q,index,postExpr);
|
|||
|
//printf("\n --> %s\n",postExpr);
|
|||
|
printf("\n\n<EFBFBD>B<EFBFBD><EFBFBD>G=%g",evaluate(postExpr));
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10+20*(50-30)/pow(2,4)-6*8);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10+20*(-50+30)/pow(-2,4)-6*8);
|
|||
|
printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10.5+20.8*(50.1-30.6)/pow(2.5,4)-6.6*8.2);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10.5+20.8*(-50.1+30.6)/pow(2.5,-4)-6.6*8.2);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10-30*(+50-20)/pow(-2,-4)+7.5*-6);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10+30*(+50.2+3.8)/pow(2,2.5)+15*-6.5);
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
void infix_to_postfix(char infix_q[], int index, char postExpr[])
|
|||
|
{
|
|||
|
int top = 0, ctr, tag = 1, i = 0;
|
|||
|
char c, stack_t[MAX]; /* <20>x<EFBFBD>s<EFBFBD>٤<EFBFBD><D9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD>B<EFBFBD><42><EFBFBD>l */
|
|||
|
|
|||
|
stack_t[top] = '#'; /* <20><><EFBFBD><EFBFBD><EFBFBD>|<7C>̩<EFBFBD><CCA9>U<EFBFBD>[<5B>J#<23><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD> */
|
|||
|
for (ctr = 0; ctr <= index; ctr++) { /* <20>B<EFBFBD>⦡<EFBFBD><E2A6A1><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>q<EFBFBD><71>0<EFBFBD>r<EFBFBD><72><EFBFBD>}<7D>l<EFBFBD>A<EFBFBD>v<EFBFBD>r<EFBFBD><72><EFBFBD>y<EFBFBD>A<EFBFBD><41><EFBFBD>̫ܳ<DCB3><CCAB>@<40>Ӧr<D3A6><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
switch (infix_q[ctr]) { /* <20>˵<EFBFBD>ctr<74><72><EFBFBD>ޭȹ<DEAD><C8B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>A<EFBFBD>d<EFBFBD>ݬO<DDAC>_<EFBFBD>k<EFBFBD>X<EFBFBD><58><EFBFBD>U<EFBFBD><55><EFBFBD>@<40><><EFBFBD>p */
|
|||
|
case ')': /* <20><><EFBFBD>J<EFBFBD><4A>')'<27>A<EFBFBD>N<EFBFBD><4E><EFBFBD>X<EFBFBD><58><EFBFBD>|<7C><><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>X'('<27><><EFBFBD><EFBFBD> */
|
|||
|
printf(" "); /* <20>ù<EFBFBD><C3B9><EFBFBD><EFBFBD>ܥ[<5B>J<EFBFBD>ťն<C5A5><D5B6>j */
|
|||
|
sprintf(postExpr,"%s ",postExpr);
|
|||
|
while (stack_t[top] != '(') {
|
|||
|
printf("%c ",c=stack_t[top--]);
|
|||
|
sprintf(postExpr,"%s%c ",postExpr,c);
|
|||
|
}
|
|||
|
top--; /* <20><>'('<27>@<40>ֲ<EFBFBD><D6B2><EFBFBD> */
|
|||
|
break;
|
|||
|
|
|||
|
case '#': /* <20><><EFBFBD>J<EFBFBD><4A>#<23>A<EFBFBD>N<EFBFBD><4E><EFBFBD>w<EFBFBD><77><EFBFBD>y<EFBFBD><79><EFBFBD>̥<EFBFBD><CCA5>r<EFBFBD><72><EFBFBD>A<EFBFBD><41><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>|<7C><><EFBFBD>|<7C><><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>q<EFBFBD>q<EFBFBD>u<EFBFBD>X */
|
|||
|
printf(" ");
|
|||
|
sprintf(postExpr,"%s ",postExpr); /* <20>ɤJ<C9A4>ťթ<C5A5><D5A9><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6>r<EFBFBD><72> */
|
|||
|
while (stack_t[top] != '#') {
|
|||
|
printf("%c ",c=stack_t[top--]);
|
|||
|
sprintf(postExpr,"%s%c ",postExpr,c);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case '(':
|
|||
|
case '^':
|
|||
|
case '*':
|
|||
|
case '/':
|
|||
|
printf(" ");
|
|||
|
sprintf(postExpr,"%s ",postExpr);
|
|||
|
while (compare(stack_t[top],infix_q[ctr])) {
|
|||
|
printf("%c ",c=stack_t[top--]);
|
|||
|
sprintf(postExpr,"%s%c ",postExpr,c);
|
|||
|
}
|
|||
|
stack_t[++top] = infix_q[ctr];
|
|||
|
tag = 1;
|
|||
|
break;
|
|||
|
case '+':
|
|||
|
case '-':
|
|||
|
if (tag == 1) { /* <20>P<EFBFBD>_ '(' '^' '*' '/' <20>᪺ +- <20><><EFBFBD>O<EFBFBD>_<EFBFBD><5F><EFBFBD>ܥ<EFBFBD><DCA5>t<EFBFBD><74><EFBFBD>@<40><><EFBFBD>B<EFBFBD><42><EFBFBD>l */
|
|||
|
stack_t[++top] = infix_q[ctr];
|
|||
|
tag = 2;
|
|||
|
}
|
|||
|
else {
|
|||
|
printf(" ");
|
|||
|
sprintf(postExpr,"%s ",postExpr);
|
|||
|
while (compare(stack_t[top],infix_q[ctr])) {
|
|||
|
printf("%c ",c=stack_t[top--]);
|
|||
|
sprintf(postExpr,"%s%c ",postExpr,c);
|
|||
|
}
|
|||
|
stack_t[++top] = infix_q[ctr];
|
|||
|
tag = 1;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ' ':
|
|||
|
break; /* do nothing<6E>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L */
|
|||
|
/* <20><><EFBFBD>J<EFBFBD><4A><EFBFBD>B<EFBFBD>⤸<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X */
|
|||
|
default:
|
|||
|
for (i = 0; isdigit(infix_q[ctr+i]) || infix_q[ctr+i]=='.'; i++) {
|
|||
|
printf("%c",c=infix_q[ctr+i]);
|
|||
|
sprintf(postExpr,"%s%c",postExpr,c);
|
|||
|
}
|
|||
|
ctr += (i-1);
|
|||
|
if (tag == 2) { /* <20>N<EFBFBD>s<EFBFBD><73><EFBFBD>b<EFBFBD><62><EFBFBD>|<7C><><EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD>X */
|
|||
|
printf(" %c ",c=stack_t[top--]); /* <20><><EFBFBD>P<EFBFBD>u<EFBFBD>X<EFBFBD><58><EFBFBD>|<7C><><EFBFBD>ݪ<EFBFBD><DDAA><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
sprintf(postExpr,"%s %c ",postExpr,c=='-'?'_':'@');
|
|||
|
}
|
|||
|
tag = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>u<EFBFBD><75><EFBFBD>v<EFBFBD>A<EFBFBD>Y<EFBFBD><59><EFBFBD>J<EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>p<EFBFBD><EFBFBD><F3B5A5A9><EFBFBD><EFBFBD>|<7C><><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>A<EFBFBD>h<EFBFBD>Ǧ^<5E>Ȭ<EFBFBD> 1<>A<EFBFBD>_<EFBFBD>h<EFBFBD><68> 0 */
|
|||
|
int compare(char stack_o, char infix_o)
|
|||
|
{
|
|||
|
int index_s = 0, index_i = 0;
|
|||
|
while (stack_priority[index_s] != stack_o)
|
|||
|
index_s++;
|
|||
|
while (infix_priority[index_i] != infix_o)
|
|||
|
index_i++;
|
|||
|
return index_s/2 >= index_i/2 ? 1 : 0;
|
|||
|
}
|
|||
|
|
|||
|
float evaluate(char expr[])
|
|||
|
{
|
|||
|
char *token;
|
|||
|
float stack[MAX], a, b, c;
|
|||
|
int top = -1;
|
|||
|
|
|||
|
token = strtok(expr," "); /* <20><><EFBFBD>o<EFBFBD>Ĥ@<40>ӲŰO */
|
|||
|
while (token != NULL) { /* <20>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD>šA<C5A1>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>r<EFBFBD><72> */
|
|||
|
if (atof(token)!=0.0)
|
|||
|
stack[++top] = atof(token);
|
|||
|
else {
|
|||
|
b = stack[top--];
|
|||
|
a = stack[top--];
|
|||
|
switch(token[0]) {
|
|||
|
case '+':
|
|||
|
c = a+b;
|
|||
|
break;
|
|||
|
case '-':
|
|||
|
c = a-b;
|
|||
|
break;
|
|||
|
case '@':
|
|||
|
stack[++top] = a; /* <20>h<EFBFBD><68><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1>^<5E><><EFBFBD>|<7C>A<EFBFBD>]<5D><><EFBFBD>@<40><><EFBFBD>B<EFBFBD><42> */
|
|||
|
c = b;
|
|||
|
break;
|
|||
|
case '_':
|
|||
|
stack[++top] = a; /* <20>h<EFBFBD><68><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1>^<5E><><EFBFBD>|<7C>A<EFBFBD>]<5D><><EFBFBD>@<40><><EFBFBD>B<EFBFBD><42> */
|
|||
|
c = -b;
|
|||
|
break;
|
|||
|
case '*':
|
|||
|
c = a*b;
|
|||
|
break;
|
|||
|
case '/':
|
|||
|
c = (float)a/b;
|
|||
|
break;
|
|||
|
case '^':
|
|||
|
c = (float)pow(a,b);
|
|||
|
break;
|
|||
|
}
|
|||
|
stack[++top] = c;
|
|||
|
}
|
|||
|
token = strtok(NULL," "); /* <20>ܯS<DCAF>O<EFBFBD><4F><EFBFBD>g<EFBFBD>k<EFBFBD>A<EFBFBD>ЦP<D0A6>Ǧh<C7A6>[<5B>d<EFBFBD>N */
|
|||
|
}
|
|||
|
|
|||
|
return stack[top];
|
|||
|
}
|