#include stdio.h
#include string.h
intadd(intx,int y ) )。
{
返回(xy );
}
intsub(intx,int y ) )。
{
返回(x-y );
}
intmul(intx,int y ) )。
{
返回(x * y );
}
intDivi(intx,int y ) )。
{
返回(x/y );
}
int(*func ) ) (int x,int y ) ) add,sub,mul,divi} );
int num; //参数字符串转换的数值
int curch; //当前字符
char chtbl[]=’ -*/()=’; //
charcorch[]=’-*/(=0123456789 ‘ ); //
输入(void ) )。
{
unsigned int i;
为wile (真)
{
curch=getchar (; //获取一个输入字符
if(curch==eof ) ) ) ) ) ) )。
返回- 1;
判断curch是否属于corch数组的内容
for(I=0; corch[i] curch!=corch[i]; I;
if(Istrlen(corch ) )
黑; //出口: curch属于corch序列的内容
}
return curch; //
}
获取intgetid(void ) chtbl数组中的curch的下标值,或表示输入时的数据返回值-1
{
int i;
if(curch=’0’curch=’9′ ) (如果curch属于0-9,则转换为数字(可以有多位) )。
{
for(num=0; curch=’0′ curch=’9’; getach () )//结束时再一次获取cur ch (getach ) )
{
num=num*10 curch-‘0’;
}
返回- 1; //表示输入的是数据,不是运算符
}
else//curch不属于0-9
{
for(I=0; chtbl[i]; I(//curch为-*/) )=; 如果有,就跳出去
{
if(chtbl(I )==curch ) ) ) ) ) ) ) ) )。
黑;
}
if(I=5) curch为-*/)时,取得下一个字符
getach (; curch为=时,跳过:公式结束,进入计算
return i; //表示输入了运算符
}
}
/*
总结:输入数据字符串后,将该字符串转换为对应的数值,获取非数值字符并保存在curch中;
输入- * /()将返回chtbl数组的下标,并检索下一个字符。
如果输入=,则会直接返回chtbl数组中下标的值。
*/
//公式可以分为一个或多个计算单位;
//多个单元:分别计算后合并为一个计算单元;
intcal(void )//eg :1 2=; 一(二)三; 1*2=
{
int x1; //x1=1; 1; 1
int x2; //x2=2; (二)三; 2
int x3; //
int op1; //op1:计算单元的第一个运算符
int op2; //op2:计算单元的第二个运算符
int i; //I :1,2 (-1;
i=getid (; 获取chtbl数组中curch的下标值或不属于该数组(-1 ) )。
if(I==4) curch为“”的情况下,继续取得数据
x1=cal (;
else
x1=num;
op1=getid (;
if(op1=5) curch为“=”时,表示输入结束,进入计算
return x1;
i=getid (;
if(I==4) )。
x2=cal (;
else
x2=num;
op2=getid (;
while(OP2=0OP25 )//op2: – * /() ) ) ) ) ) )。
{
i=getid (;
if(I==4) )。
x3=cal (;
else
x3=num;
//op1: *
if () op2/2==1) ) op2/2==1) )//op2: -/)
x2=func[op2](x2,x3 );
else
{
x1=func[op1](x1,x2 );
x2=x3;
op1=op2;
}
op2=getid (;
}
return(func[op1] ) x1,x2 );
}
void main () )
{
int value;
printf (pleaseinputanexpression : (n ); //输入式:1 2=
getach (;
wile(curch!=’=’ )如果curch不是“=”
{
value=cal (;
printf(theresultis:%d\n ),value );
printf (pleaseinputanexpression : (n );
getach (; //重新输入表达式
}
}