这两天写了一个计算器,目前能实现加减乘除,支持小数,能判断空格,能排查一些基本错误。运用了栈的思想,虽然这是数据结构里最基本的内容了,但还是实现着很困难,中间参考了廖星的代码。这个用了数组实现,所以代码只有140行左右。先上代码
这次代码要总结的是:
第一:对栈的思想理解加深了。
第二:这种代码如果放在学期开始的时候也许也能写出来,但是拖到了现在。
第三:中间部门参考了廖星的代码。所以真正的不算是自己写的
第四:自己的编程能力真的还需提高。
第五:关于调试的方法,自己研究出的system(“pause”)的方法不错。不过希望自己能再多研究研究更好的
10号就要考概率论了,之前基本在它上面下的功夫很少。最近在看各种博客,上面不断在说数学和概率论对计算机的重要性。看来还是自己太无知了。所以在接下来的几天里,不会在更新技术博客了。好好加油复习概率论了。加油!!
2014年1月6日
#include<stido.h> #include<stdlib.h> #include<string.h> #define size 200 int isoptr(char op) { if(op=='+'||op=='-'||op=='*'||op=='/'||op=='('||op==')'||op=='#') return 1; else return 0; } char precede(char lopt,char ropt) { switch(lopt) { case '+': case '-': if(ropt=='+'||ropt=='-'||ropt==')'||ropt=='#') return '>'; else if(ropt=='*'||ropt=='/'||ropt=='(') return '<'; case '*': case '/': if(ropt=='+'||ropt=='-'||ropt=='*'||ropt=='/'||ropt==')'||ropt=='#') return '>'; else if(ropt=='(') return '<'; case '(': if(ropt=='+'||ropt=='-'||ropt=='*'||ropt=='/'||ropt=='('||ropt=='^') return '<'; else if(ropt==')') return '='; case ')': if(ropt=='+'||ropt=='-'||ropt=='*'||ropt=='/'||ropt==')'||ropt=='#') return '>'; case '#': if(ropt=='+'||ropt=='-'||ropt=='*'||ropt=='/'||ropt=='(') return '<'; else if(ropt=='#') return '='; } } double operate(double a,char c,double b) { switch(c) { case '+' :return a+b; case '-' :return a-b; case '*' :return a*b; case '/' :return a/b; } } int main() { double a,b,sum=0; char optr[size],optt[size]; double opnd[size]; char c,op; int i=-1,k=0,m=0,temp=0; int o=-1,p=0; op=getchar(); optr[0]='#'; while(op!='#'||optr[p]!='#') { while(op==' ') { getchar(); op=getchar(); } if(!isoptr(op)) { if(op<='9'&&op>='0'||op=='.') { i++; optt[i]=op; op=getchar(); } else { printf("你输入的格式有错误!\n"); return 0; } } else { if(i>=0) { while(i>=0) { if(optt[i]=='.') k=m; else { sum+=pow(10,m)*(optt[i]-'0'); m++; } i--; } o++; opnd[o]=(double)(sum/pow(10,k)); sum=0; k=0; m=0; i=-1; temp=1; } switch(precede(optr[p],op)) { case '<': p++; optr[p]=op; op=getchar();break; case '=': p--; op=getchar();break; case '>': c=optr[p]; --p; b=opnd[o]; --o; a=opnd[o]; --o; ++o; if(o<0) { printf("你输入的格式错误!"); return 0; } opnd[o]=operate(a,c,b); break; } } if(op=='\n'||op=='=')op='#'; } if(temp==0) { for(k=0;k<=i;k++) printf("%c",optt[k]); printf("\n"); } else if(o>=0) printf("%g\n",opnd[o]); else printf("你输入的格式错误!\n"); return 0; }
这次代码要总结的是:
第一:对栈的思想理解加深了。
第二:这种代码如果放在学期开始的时候也许也能写出来,但是拖到了现在。
第三:中间部门参考了廖星的代码。所以真正的不算是自己写的
第四:自己的编程能力真的还需提高。
第五:关于调试的方法,自己研究出的system(“pause”)的方法不错。不过希望自己能再多研究研究更好的
10号就要考概率论了,之前基本在它上面下的功夫很少。最近在看各种博客,上面不断在说数学和概率论对计算机的重要性。看来还是自己太无知了。所以在接下来的几天里,不会在更新技术博客了。好好加油复习概率论了。加油!!
2014年1月6日