希望各位大大从实际工作的角度来分析下我写的程序
刚完成一个计算器的程序,满足如下的一些操作:优先乘除,优先括号,负数可以直接在数字前加-号表示,也可以先-号再在外面加一个括号,对于输入格式也会先做一个检查
基本的测试我自己大致试过了,希望各位大大能指出各方面的不足,因为我希望从事这个行业,所以需要提升的地方有很多。
我自己大致觉得不足的地方:几个函数看起来有点臃肿,有些变量命名都不太好。
希望能得到意见和建议。

顺便问下,看完老谭的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 编辑 ]



