#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double add(double cd[],char cf[],int cn);
main()
{
char cmp[255];
double total;
char x;
int n=0;
printf("input to compuer:");
gets(cmp);
if (computer(cmp,&total))
printf("the resust=%f",total);
else
printf("input error!");
getch();
}
computer(char cmp[],double *total)
{
char cf[100];
double cd[100];
int cn,i;
cn=readcmp(cmp,cd,cf);
if (cn>0)
{
*total=add(cd,cf,cn);
return 1;
}
else
return 0;
}
//----内部过程------------------------
readcmp(char cmp[],double cd[],char cf[])
{
/*读取字符=>X
是加减乘除吗?
是的
将数字字符转成数字->存入cd[]
数组序列号+1
数字串清空
将符号存入cf[]
否是0,1,2,3,4,5,6,7,8,9,吗?
是
空格标志是2.
是 非法返回
否 加入数字串
否是空格吗?
是 .数字串是空的吗?
是 空格标志为2
否 空格标志为1
否
非法字符,返回.
*/
char strdigit[100],x;
int digitn=0,i,cn=0,spaceflag=0,diaoflag=0;
cf[0]='+';
for (i=0;cmp[i]!='/0';i++)
{
x=cmp[i];
if (x=='+'||x=='-'||x=='*'||x=='/')
{
if (digitn==0)
{
if (x=='-' && cn==0)
{
strdigit[digitn]=x;
strdigit[digitn+1]='/0';
digitn++;
}
else
return 0;
}
else
{
cd[cn]=atof(strdigit);
cn++;
digitn=0;
spaceflag=0;
diaoflag=0;
cf[cn]=x;
}
}
else if (x>='0' && x<='9')
{
if (spaceflag==2)
{
return 0;
}
else
{
strdigit[digitn]=x;
strdigit[digitn+1]='/0';
digitn++;
}
}
else if (x=='.')
{
if (diaoflag==1)
return 0;
else
{
diaoflag=1;
strdigit[digitn]=x;
strdigit[digitn+1]='/0';
digitn++;
}
}
else if (x==' ')
{
if (digitn>0)
spaceflag=2;
else
spaceflag=1;
}
else
return 0;
}
if (digitn>0)
{
cd[cn]=atof(strdigit);
cn++;
return cn;
}
}
double add(double cd[],char cf[],int cn) //cd[]存放数字组,cf[]存放操作数,cn为操作符数
{
double total; //存放结果
int i; //循环变量
//分类数字->数字数组和操作符->操作符数组
for(i=1;i<cn;i++) //第一个循环计算乘除的值
if (cf[i]=='*' || cf[i]=='/') //分析操作符是否是乘或除?
{
//是的话
if (cf[i]=='*') //分析是乘的话
cd[i]=cd[i-1]*cd[i]; //当前数=上一个数*当前数
else
cd[i]=cd[i-1]/cd[i]; //否则 //当前数=上一个数/当前数
cf[i]=cf[i-1]; //->当前操作为上一操作符
cd[i-1]=0; //上一个的数字为零
}
total=0; //总数=第一个数,
for(i=0;i<cn;i++) //计算加减值
{
if (cf[i]=='+') // 分析操作数是否是'+'
total=total+cd[i]; //是 //总数=总数+当前数
else
total=total-cd[i]; //否 // 总数=总数-当前数
}
return total; //返回总数值.
}