小弟经过九九八十一难写出了一个运算器
小弟经过九九八十一难写出了一个运算器,仅支持加减乘除以及平方(^)运算,括号不分大中小,支持多重括号,支持负数,支持空格.例如输入一个字符串: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 编辑 ]