#includestdio.h#includemath.h#includewindows.h#includemmsystem.h#pragmacomment(lib,winmm.lib)#definepi3.1415926voidzhuanhua()//进制转换{inta,b,i,j,e,d,flag=0;charc[100],x;for(;flag==0;){printf(那一个数转化为多少进制:格式(x,x)\n);scanf(%d,%d,&a,&b);e=a,d=b;for(i=0;a!=0;i++){if(b==10){c[i]=a%b+48;a=a/b;}else{if(a%b9){c[i]=a%b+48;a=a/b;}if(a%b9){c[i]=a%b+55;a=a/b;}}}printf(%d转化成%d进制结果为:,e,d);for(j=i-1;j=0;j--)printf(%c,c[j]);printf(\nContinueyesorno?));getchar();x=getchar();if(x=='n'||x=='N'){printf(已退出....请选择菜单上的选项\n);flag=1;}}}/**************************************************************************intcheck(char*c)输入参数:char*c:输入的字符串返回参数:0:字符串中有不符合规定的字符1:字符串字符符合规定,没有不符合规定的字符.功能:检查字符串中有否除了0-9,+,-,*,/,(,),之外的其他字符,如果有,则返回0,表示出现错误。若没有,则返回1,表式字符串符合规定。**************************************************************************/intcheck(char*c){intk=0;while(*c!='\0'){if((*c=='s'&&*(c+1)=='i'&&*(c+2)=='n')||(*c=='c'&&*(c+1)=='o'&&*(c+2)=='s')||(*c=='t'&&*(c+1)=='a'&&*(c+2)=='n')||(*c=='c'&&*(c+1)=='o'&&*(c+2)=='t'))c+=3;if(*c=='e'&&*(c+1)=='^')c+=2;if((*c='0'&&*c='9')||*c=='+'||*c=='-'||*c=='*'||*c=='/'||*c=='.'||*c=='('||*c==')'||(*c=='p'&&*(c+1)=='i')||(*c=='i'&&*(c-1)=='p'));else{printf(inputerror,therehavethecharnotthemathexpressionchar!\n);return0;}if(*c=='(')k++;elseif(*c==')')k--;c++;}if(k!=0){printf(inputerror,thereisnothavecorrectbracket'()'!\n);return0;}return1;}/**************************************************************************voidmove(char*f,double*s,intp)输入参数:char*f:运算符数组double*s:数值数组intp:当前运算符数组位置。返回参数:无功能:将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算。传入值p若为3则当前符号的数组位置为3.f[3]=f[3+1].......f[len-2]=f[len-1]f[len-1]='\0';s[i]=s[i+1].......s[len-1]=s[len]因为数值比运算符多一个。***************************************************************************/voidmove(char*f,double*s,intp){inti=0,len=strlen(f);for(i=p;ilen;i++)/*将已经运算过的符号,空出来的位置用后面的符号来填充,*/{/*即把乘和除号的位置用后面的加和减号填充*/f[i]=f[i+1];s[i]=s[i+1];}s[i]=s[i+1];f[len-1]='\0';}/**************************************************************************doubleconvnum(char*c)输入参数:char*c:由数字和小数点组成的字符,用以转换成double型的数值。返回参数:num:返回转换好的值。功能:将输入的字符串先将其小数点以前的部分复制到temp[]数组中,若有小数点,则将小数点之后的数值,也就是小数部分先进行计算,值存入num中计算完成后,再对整数部分进行计算,值加上小数部分的值,存入num中。***************************************************************************/doubleconvnum(char*c){doublenum=0.0;doublea=1.0;inti=0,p=0,len=0;chartemp[100];inttempi=0;intstart=0;intf=1;/*正负符号指示器,若为1则为正数,为-1,此数为负数*/len=strlen(c);if(c[0]=='-'){start=1;f=-1;}for(i=start;ilen;i++){if(c[i]=='p'&&c[i+1]=='i')returnpi;if(c[i]=='s')return(sin(atof(c+3)));if(c[i]=='c'&&c[i+2]=='s')return(cos(atof(c+3)));if(c[i]=='t')return(tan(atof(c+3)));if(c[i]=='c'&&c[i+2]=='t')return(1/tan(atof(c+3)));if(c[i]=='e'&&c[i+1]=='^')return(pow(2.71828,atof(c+2)));if(c[i]=='.'){p=i;break;}temp[tempi++]=c[i];/*将整数部分复制到temp[]中*/}temp[tempi]='\0';if(p!=0){for(i=p+1;ilen;i++)/*将小数部分计算出来*/{if(c[i]=='.')/*如果有多余的小数点,则表示输入错误*/{printf(thereismorethatonedot'.'innumber!error!\n);exit(0);}a=a*0.1;num+=(a*(c[i]-48));}}a=1.0;len=strlen(temp);/*计算整数部分*/for(i=len-1;i=0;i--){num=num+(a*(temp[i]-48));a*=10;}num=num*f;returnnum;}/**************************************************************************doublegood(char*c)输入参数:char*c:即将进行运算的字符串型数学表达式。如3.5+(2*3/5)返回参数:s[0]:计算结果将放入s[0]中功能:将输入的字符串中的数字分别调用convnum(char*c)函数进行数值变换,再将其依次存入doulbes[i]中,将加减乘除运算符依次存入字符串符号数组charf[i]中,然后如果遇到括号,则将括号内的字符串存入另一字符数组中,然后用此good(char*c)递归函数进行递归运算。然后根据先乘除,后加减的顺序对已存入数组的数值根据存入字符串符号数组的运算符进行运算。结果存入s[0]中。返回最终结果。***************************************************************************/doublegood(char*c)/*可递归函数*/{/*取得数值字符串,并调用convnum转换成double*/charg[100],number[30];/*g,保存当前的表达式串,number保存一个数的所有字符*/charf[80];/*保存所有的符号的堆栈*/intfi=0;/*保存符号的位置指针*/doubles[80];/*保存当前所有的数的一个堆栈*/intsi=0;/*保存数字位置指针*/intk=0;/*若k=1则表示有一对括号*/intnum=0,i=0;/*num保存新括号内的字符数,i保存number里的字符位置*/intcc=0;/*乘除符号数量*/intjj=0;/*加减符号数量*/while(*c!='\0')/*当p==1和k==0时,表示已经把括号里的内容全部复制到g[100]中了*/{k=0;num=0;switch(*c){case'+':/*当前字符为+-乘除时则表示*/case'-':case'*':case'/':f[fi++]=*c;if(*c=='*'||*c=='/')cc++;elsejj++;if(*(c-1)!=')'){number[i]='\0';i=0;/*完成一个数字的复制,其位置指针i=0*/s[si++]=convnum(number);}break;case'(':/*有括号,则将当前括号作用范围内的全部字符保存,作为*/k++;/*一个新的字符表达式进行递归调用good函数计算。*/while(k0){c++;g[num++]=*c;if(*c==')'){k--;}elseif(*c=='('){k++;}}g[num-1]='\0';num=0;/*完成一个括号内容的复制,其位置指针num=0*/s[si++]=good(g);break;default:number[i++]=*c;if(*(c+1)=='\0'){number[i]='\0';s[si++]=convnum(number);}break;}c++;}f[fi]='\0';i=0;while(cc0){switch(f[i]){case'*':cc--;s[i+1]=s[i]*s[i+1];move(f,s,i);break;case'/':cc--;s[i+1]=s[i]/(float)s[i+1];move(f,s,i);break;default:i++;break;}}i=0;while(jj0){switch(f[i]){case'+':s[i+1]=s[i]+s[i+1];jj--;move(f,s,i);break;case'-':s[i+1]=s[i]-s[i+1];jj--;move(f,s,i);break;default:printf(operatorerror!);break;}}returns[0];}voidhunhe(){charstr[100];doublesum=0;intp=1;while(1){printf(输入表达式:(提示:输入'exit'退出....)\n);scanf(%s,str);p=strcmp(str,exit);if(p==0)break;p=check(str);if(p==0)continue;sum=good(str);printf(%s=%f,str,sum);printf(\n);}printf(返回菜单....!\n);}voidping()//乘方