小弟经过九九八十一难写出了一个运算器
小弟经过九九八十一难写出了一个运算器,仅支持加减乘除以及平方(^)运算,括号不分大中小,支持多重括号,支持负数,支持空格.例如输入一个字符串:1+(2*(2+3)),输出11.运行成功的一刻,真是泪流满面啊。不过个人觉得仍有地方可以改进,不过凭小弟的功力却是不行了,请各位大神们提出你们的宝贵建议。
程序代码:
#include<math.h>
#include<stdio.h>
#include<string.h>
char str[200];
double data[121];
void str_clear(int start,int change,int size);
void str_clear(int start,int change,int size)
{
str[start]=change;
for(;str[start+size-1]!='\0';start++)
str[start+1]=str[start+size];
}
void data_change(int,int);
void data_change(int start,double change)
{
data[start]=change;
}
int main()
{
int data_num=1;
gets(str);
for(int j=0;j<(int)strlen(str);j++)
{
if(str[j]==' ')
{str_clear(j,str[j+1],2);j--;}
}
for(int i=0;i< (int)strlen(str) ;i++)
{
if(str[i]<='9' && str[i]>='0')
{
int n=0;
for(int a=i;str[a]<='9' && str[a]>='0';a++)
{
n*=10;
n+=str[a]-48;
}
if (data_num=='(' || data_num==')' || data_num=='+' || data_num=='-' || data_num=='*' || data_num=='/')
data_num++;
if(str[i-1]=='-' && (str[i-2]=='(') || i==1)
{
n*=-1;
data[data_num]=(double)n;
str_clear(i-1,data_num++,a-i+1);
continue;
}
data[data_num]=(double)n;
str_clear(i,data_num++,a-i);
}
}
while(str[1]!='\0')
{
for(int g=0;g<strlen(str);g++)
{
if(str[g]=='^' && str[g-1]!=')' && str[g+1]!='(')
{
data_change(str[g-1],pow(data[str[g-1]],data[str[g+1]]));
str_clear(g-1,str[g-1],3);
}
}
for(g=0;g<(int)strlen(str);g++)
{ if((str[g]=='*' || str[g]=='/') && str[g-1]!=')' &&str[g+1]!='(' && str[g+2]!='^' && str[g-2]!='^')
{
if(str[g]=='*')
{
data_change(str[g-1],data[str[g-1]]*data[str[g+1]]);
str_clear(g-1,str[g-1],3);
}
else
{
data_change(str[g-1],data[str[g-1]]/data[str[g+1]]);
str_clear(g-1,str[g-1],3);
}
g--;
}
}
for( g=0;g<(int)strlen(str);g++)
{
if((str[g]=='+' || str[g]=='-') && str[g-1]!=')' &&str[g+1]!='(' && str[g+2]!='*' && str[g+2]!='/' && str[g+2] !='^' && str[g-2]!='*' && str[g-2]!='/' && str[g-2] !='^' )
{
if(str[g]=='+' && (str[g-2]=='+' || str[g-2]=='(' || g==1))
{
data_change(str[g-1],data[str[g-1]]+data[str[g+1]]);
str_clear(g-1,str[g-1],3);
g--;
}
else if(str[g-2]=='+' || str[g-2]=='(' || g==1)
{
data_change(str[g-1],data[str[g-1]]-data[str[g+1]]);
str_clear(g-1,str[g-1],3);
g--;
}
}
}
for( g=0;g<(int)strlen(str);g++)
{
if(str[g]=='(' && str[g+2]==')')
str_clear(g,str[g+1],3);
}
}
printf("\n%f\n",data[str[0]]);
return 0;
}
[ 本帖最后由 a745043791 于 2012-8-10 09:58 编辑 ]









