#include <stdio.h>
#include <string.h>
int add(int x, int y)
{
return (x+y);
}
int sub(int x, int y)
{
return (x-y);
}
int mul(int x, int y)
{
return (x*y);
}
int divi(int x, int y)
{
return (x/y);
}
int (*func[])(int x, int y) = {add, sub, mul, divi};
int num; //参数的字符串转换的数值
int curch; //当前的字符
char chtbl[] = "+-*/()="; //
char corch[] = "+-*/()=0123456789"; //
int getach(void)
{
unsigned int i;
while(true)
{
curch = getchar(); //获取一个输入字符
if (curch == EOF)
return -1;
//判断curch是否属于corch数组的内容
for (i =0; corch[i] && curch!=corch[i]; i++);
if (i < strlen(corch))
break; //出口:curch属于corch数组中的内容
}
return curch; //
}
int getid(void) //获取curch在chtbl数组中的下标值,或表示输入时数据的返回值-1
{
int i;
if (curch>='0' && curch<='9') //若curch属于0-9,则将其转换为数字(可为多位数)
{
for(num=0; curch>='0' && curch<='9'; getach()) //结束时还有一次获取curch(getach())
{
num = num*10 + curch-'0';
}
return -1; //表示输入的是数据,不是运算符
}
else //curch 不属于 0-9
{
for (i=0; chtbl[i]; i++) //判断curch是否在为 +-*/()=;若在,则跳出
{
if (chtbl[i] == curch)
break;
}
if (i <= 5) //若curch 为+-*/(),则获取下一个字符
getach(); //若curch 为 =, 则跳过:表达式结束,进入计算
return i; //表示输入的是运算符
}
}
/*
总结: 若输入的为数据字符串,则会将该字符串转换成相应是数值,并获取一个非数值的字符,存到curch;
若输入的为+ - * / ()时,则会返回一个其在chtbl数组中的下标值,并获取下一个字符;
若输入的为 = 时,则直接返回其在chtbl数组中的下标值;
*/
//一个表达式可以分成一个或多个计算单元;
//多个单元: 分别计算完后,再合成为一个计算单元;
int cal(void) //eg :1+2=;1+(2+3)=; 1*2=
{
int x1; //x1 = 1; 1; 1
int x2; //x2 = 2; (2+3); 2
int x3; //
int op1; //op1: 计算单元的第一个运算符
int op2; //op2: 计算单元的第二个运算符
int i; //i: 1、2 (-1);
i = getid(); //获取curch在chtbl数组中的下标值,或不属于该数组(-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>=0 && op2<5) //op2: + - * / ()
{
i = getid();
if (i == 4)
x3 = cal();
else
x3 = num;
//op1: + * (
if ((op1/2==0)&&(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("please input an expression:\n"); //输入表达式: 1+2=
getach();
while(curch != '=') //如果curch不为 '='
{
value = cal();
printf("the result is: %d\n", value);
printf("please input an expression:\n");
getach(); //重新输入表达式
}
}