C语言|C语言计算器代码(带有报告)

#include #include #includedouble jisuan(char a[]) { int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0; char nibo[50],zhan2[50]; //zhan2存放的是运算符 double x,n,l,z=0,zhan3[50]; //暂存结果 typedef struct { double d1; int d2; }dd; typedef struct { dd data[50]; int top; }zhan1; zhan1 *shu; shu=(zhan1 *)malloc(sizeof(zhan1)); shu->top=0; while(a[i]!='\0') { if(a[i]>='0'&&a[i]<='9') { z=0; j=i+1; while(a[j]>='0'&&a[j]<='9') {j++; } j--; for(k=i; k<=j; k++) { z=z*10+a[k]-'0'; } j=j+1; //j跳到数字后一位 x=z; if(a[j]=='.')//如果是小数的话就把小数和整数一起加上 { l=1; i=j+1; j=i+1; while(a[j]>='0'&&a[j]<='9') {j++; }j--; for(k=i; k<=j; k++) { n=pow(0.1,l); l=l+1; x=x+n*(a[k]-'0'); } i=j+1; }else i=j; shu->data[++shu->top].d1=x; shu->data[shu->top].d2=++cnt; nibo[++t1]='0'+shu->data[shu->top].d2; nibo[t1+1]='\0'; }//如果是数字那么就保存到结构体里 的dd数组里的 第二个成员里 else if(a[i]=='(') { zhan2[++t2]=a[i]; i++; } else if(a[i]==')') { j=t2; while(zhan2[j]!='(') { nibo[++t1]=zhan2[j]; nibo[t1+1]='\0'; j--; } t2=j-1; i++; } else if(a[i]=='+') { while(t2>0&&zhan2[t2]!='(') { nibo[++t1]=zhan2[t2]; nibo[t1+1]='\0'; t2--; } zhan2[++t2]=a[i]; i++; } else if(a[i]=='-') { if(a[i-1]=='$') { a[0]='0'; i=0; } else if(a[i-1]=='(') { a[i-1]='0'; a[i-2]='('; i=i-2; t2--; } else { while(t2>0&&zhan2[t2]!='(') { nibo[++t1]=zhan2[t2]; nibo[t1+1]='\0'; t2--; } zhan2[++t2]=a[i]; i++; } } else if(a[i]=='*'||a[i]=='/') { while(zhan2[t2]=='*'||zhan2[t2]=='/'||zhan2[t2]=='^'||zhan2[t2]=='#') { nibo[++t1]=zhan2[t2]; nibo[t1+1]='\0'; t2--; } zhan2[++t2]=a[i]; i++; } else if(a[i]=='^'||a[i]=='#') { while(zhan2[t2]=='^'||zhan2[t2]=='#') { nibo[++t1]=zhan2[t2]; nibo[t1+1]='\0'; t2--; } zhan2[++t2]=a[i]; i++; } }//把输出的多项式中的数字字符先转换成数值型存入结构体里,然后把加减乘除等的字符存入到zhan2里--这是转化过程并存储入站//下面就是开始计算结果 相当于出站的过程 把dd结构体里的数值取出和zhan2的字符来进行运算,当前结果存储到zhan3里,就用nibo数组来判断是否计算完毕 while(t2>0) { nibo[++t1]=zhan2[t2]; nibo[t1+1]='\0'; t2--; }j=1; t3=0; while(j<=t1) { if(nibo[j]>='0'&&nibo[j]!='^'&&nibo[j]!='#')// { for(i=1; i<=shu->top; i++) { if((int)(nibo[j]-'0')==shu->data[i].d2) { m=i; break; } } zhan3[++t3]=shu->data[m].d1; } else if(nibo[j]=='+') { zhan3[t3-1]=zhan3[t3-1]+zhan3[t3]; t3--; } else if(nibo[j]=='-') { zhan3[t3-1]=zhan3[t3-1]-zhan3[t3]; t3--; } else if(nibo[j]=='*') { zhan3[t3-1]=zhan3[t3-1]*zhan3[t3]; t3--; } else if(nibo[j]=='/') { zhan3[t3-1]=zhan3[t3-1]/zhan3[t3]; t3--; } else if(nibo[j]=='^') { zhan3[t3-1]=pow(zhan3[t3-1],zhan3[t3]); t3--; } else if(nibo[j]=='#') { zhan3[t3]=sqrt(zhan3[t3]); } j++; }return zhan3[t3]; }int main() { for(; ; ) { char x,a[50]; double jieguo; int i=0; a[0]='$'; printf("#表示开方,^表示乘方(支持负数)\n"); printf("请输入表达式无需输入 = 号直接回车可输出答案退出请输入q \n\n"); scanf("%c",&x); if(x=='q') break; while(x!='\n') { a[++i]=x; scanf("%c",&x); } a[i+1]='\0'; jieguo=jisuan(a); printf("\n"); printf("结果为:%lf",jieguo); printf("\n\n\n"); printf("退出请输入q 继续请直接输入\n\n"); } }

【C语言|C语言计算器代码(带有报告)】

    推荐阅读