希望各位大大从实际工作的角度来分析下我写的程序
刚完成一个计算器的程序,满足如下的一些操作:优先乘除,优先括号,负数可以直接在数字前加-号表示,也可以先-号再在外面加一个括号,对于输入格式也会先做一个检查
基本的测试我自己大致试过了,希望各位大大能指出各方面的不足,因为我希望从事这个行业,所以需要提升的地方有很多。
我自己大致觉得不足的地方:几个函数看起来有点臃肿,有些变量命名都不太好。
希望能得到意见和建议。
顺便问下,看完老谭的C和C++以及MFC后,是不是应该看windows编程啊
程序代码:
#include<iostream.h> #include<string.h> #include<stdio.h> double change(char str) { return (double)str-'0'; } char change_c(int n) { return n+'0'; } double calculate(char str[]) { double num[100]; double temp[100]; char strCtrl[100]; int i=0,j,k,len; double bit; int nCount=-2; int key=0; while(str[i]!='\0')//字符串赋值给数组 { if(str[i]<'0'||str[i]>'9') { if(str[i]=='-') { key=1; if(nCount>=0&&(str[i-1]>='0'&&str[i-1]<='9')) { strCtrl[nCount+1]='+'; } } else { strCtrl[nCount+1]=str[i]; } i++; } if(str[i]>='0'&&str[i]<='9') { nCount+=2; num[nCount]=0; len=0; while(str[i]>='0'&&str[i]<='9') { temp[len]=change(str[i]); len++; i++; } bit=1; for(k=len-1;k>=0;k--) { num[nCount]+=temp[k]*bit; bit*=10; } len=0; if(str[i]=='.') { i++; while(str[i]>='0'&&str[i]<='9') { //right=1; temp[len]=change(str[i]); len++; i++; } bit=0.1; for(k=0;k<len;k++) { num[nCount]+=temp[k]*bit; bit/=10; } } if(key) { num[nCount]=-num[nCount]; } key=0; } } strCtrl[nCount+1]='\0'; strcpy(str,strCtrl); i=0; while(str[i]!='\0')//先算乘除法 { if(str[i]=='*') { num[i-1]*=num[i+1]; j=i; while(str[j+2]!='\0') { num[j+1]=num[j+3]; str[j]=str[j+2]; j++; } str[j]='\0'; i--; } if(str[i]=='/') { num[i-1]/=num[i+1]; j=i; while(str[j+2]!='\0') { num[j+1]=num[j+3]; str[j]=str[j+2]; j++; } str[j]='\0'; i--; } i++; } double sum=0; for(i=0;i<strlen(str);i+=2) sum+=num[i]; return sum; } char cStr[100]; void dtoch(double num) { int integ; double dec; int tem[100],nCount=0,i; int Isneg=0; if(num<0) { num=-num; cStr[0]='-'; Isneg=1; } integ=(int)num; dec=num-integ; while(integ!=0) { tem[nCount]=integ%10; integ/=10; nCount++; } for(i=0;i<nCount;i++) { cStr[i+Isneg]=change_c(tem[nCount-i-1]); } if(dec!=0) { cStr[i+Isneg]='.'; nCount=0; while(dec!=0) { tem[nCount]=int(dec*10); dec=dec*10-int(dec*10); nCount++; } for(int j=0;j<nCount;j++) { i++; cStr[i+Isneg]=change_c(tem[j]); } } cStr[i+Isneg+1]='\0'; } double bracket(char str[]) { int nblk=0; int place[100]; int i=0; char temp[100]; char str_tail[100]; while(str[i]!='\0') { if(str[i]=='(') { place[nblk]=i; nblk++; } i++; }//搜索字符串中的'(',并将其位置存放在数组place中,nblk表示括号'('的序数 for(int j=nblk-1;j>=0;j--) { int k=0; int ntail=0; int nstr=place[j]+1; while(str[nstr]!=')') { temp[k]=str[nstr]; k++;nstr++; } nstr++; while(str[nstr]!='\0') { str_tail[ntail]=str[nstr]; ntail++;nstr++; } str_tail[ntail]='\0'; temp[k]='\0'; dtoch(calculate(temp)); str[place[j]]='\0'; strcat(str,cStr); strcat(str,str_tail); } return calculate(str); } int check(char str[]) //检查字符串格式是否正确 { int i=0; int nleft=0,nright=0; int lastblk; int nNum=0; while(str[i]!='\0') { if(str[i]=='(') { nleft++;lastblk=0; } else if(str[i]==')') { nright++;lastblk=1; } else if(str[i]=='.') { if((str[i-1]<'0'||str[i-1]>'9')||(str[i+1]<'0'||str[i+1]>'9')) { printf("输入格式错误,请重新输入\n");return 0; } } else if(str[i]=='+'||str[i]=='*'||str[i]=='/') { if(((str[i-1]<'0'||str[i-1]>'9')&&str[i-1]!=')')||((str[i+1]<'0'||str[i+1]>'9')&&str[i+1]!='('&&str[i+1]!='-')) { printf("输入格式错误,请重新输入\n");return 0; } } else if((str[i]>='0'&&str[i]<='9')||str[i]=='-') { if(str[i]!=0) nNum++; } else { printf("输入格式错误,请重新输入\n");return 0; } i++; } if(nleft!=nright||lastblk==0) { printf("输入格式错误,请重新输入\n");return 0; } if(nNum==0&&nleft!=0) { printf("输入格式错误,请重新输入\n");return 0; } return 1; } int main() { char str[100]; printf("本计算器支持小数,括号优先和乘除法优先原则\n"); printf("输入一个计算表达式,包括.()+-*/和数字,输入回车退出\n"); while(1) { gets(str); if(check(str)) printf("%f\n",bracket(str)); } getchar(); return 0; }?
[ 本帖最后由 毕业旅行 于 2010-7-23 17:01 编辑 ]