#include
#include
#include
#include
#define BUF_MAX 100
double handle(char *str) //处理没括号的
{
double res,*data=NULL,*data_old=NULL;
char *flag=NULL,*flag_old=NULL,*temp=str,*temp_old=str;
int n=0,m=0,i=0;
assert(NULL!=str);
while(*temp)
{
if(*temp==' ')
strcpy(temp,temp+1);
else
temp++;
}
temp=str;
while(*temp)
{
if(temp==temp_old && *temp=='-')
{
temp++;
continue;
}
else if (*temp=='+' || *temp=='-' ||*temp=='*' ||*temp=='/')
n++;
temp++;
}
flag_old=(char *)malloc(sizeof(char)*n);
if(NULL==flag_old)
{
perror("malloc fail!\n");
}
data_old=(double *)malloc(sizeof(double)*(n+1));
if(NULL==data_old)
{
perror("malloc fail!\n");
}
temp=str;
flag=flag_old;
data=data_old;
while(*temp!='\0')
{
if(temp==temp_old && *temp=='-')
{
temp++;
continue;
}
else if(*temp=='+' || *temp=='-' ||*temp=='*' ||*temp=='/')
{
*flag++=*temp;
*temp='\0';
*data++=atof(temp_old);
temp_old=temp+1;
}
temp++;
}
*data=atof(temp_old);
flag=flag_old;
data=data_old;
do
{
m=n;
for(i=0;i
if('*'==*(flag+i) || '/'==*(flag+i))
{
if('*'==*(flag+i))
{
*(data+i)*=*(data+i+1);
}
else
{
*(data+i)/=*(data+i+1);
}
if(i
memcpy(flag+i,flag+i+1,sizeof(char)*(m-(i+1)));
memcpy(data+i+1,data+i+2,sizeof(double)*(m-i-1));
}
n-=1;
break;
}
}
if(n==m)
{
for(i=0;i
if('+'==*(flag+i) || '-'==*(flag+i))
{
if('+'==*(flag+i))
{
*(data+i)+=*(data+i+1);
}
else
{
*(data+i)-=*(data+i+1);
}
if(i
memcpy(flag+i,flag+i+1,sizeof(char)*(m-(i+1)));
memcpy(data+i+1,data+i+2,sizeof(double)*(m-i-1));
}
n-=1;
break;
}
}
}
}while(n>0);
res=*data_old;
free(flag_old);
free(data_old);
return res;
}
double handle_space(char *str) //处理带括号的
{
char p_space_e[100];
char *temp=str;
char *space_b=NULL,*space_e=NULL;
double res_temp,res;
assert(str);
while(*temp)
{
if('('==*temp)
{
space_b=temp;
temp++;
}
else if(')'==*temp && space_e==NULL && space_b!=NULL)
{
space_e=temp;
*temp='\0';
res_temp=handle(space_b+1);
strcpy(p_space_e,space_e+1);
sprintf(space_b,"%f",res_temp);
strcat(str,p_space_e);
temp=str;
}
else
temp++;
}
return handle(str);
}
int main()
{
char buf[BUF_MAX];
double res;
printf("Please input your formula:\n");
fgets(buf,BUF_MAX,stdin);
res=handle_space(buf);
printf("The result is %f\n",res);
}
开发环境:VS2010。望采纳,共同进步
我有呀,这个我写过,只需要一个switch开关语句就可以了
/*******************************************************************************
** 程序名称:表达式计算器
** 程序描述:本程序能够进行只含有非负整数与+ - * /符号的表达式计算;并能够识别
** 错误的算式,给出警报。
**程序特色: 能够进行诸如2+3*5-2*3*6和3-6*2/3的混合运算?
** 使用说明:输入你的算式,注意其中的每个数字不要超过10000,即最大数是999.
** 【C-Free编译通过】
** 程序作者:syrchina
** 最后修改:2009-5-1
*******************************************************************************/
#include "Stdio.h"
#include "Conio.h"
/*******************************************************************************
** 函数名称:calculate
** 函数描述:进行运算,并输出结果
** 输入参数:c[],length
** 输出参数:无
*******************************************************************************/
calculate(int c[],int length)
{
int i;
int error=0;
float result=0;
c[0]=1;
c[2]=10043;
c[length-2]=10045;
c[length-1]=1; /*初始化开头与结尾为加减法*/
/*进行运算*/
/*先乘除,后加减的运算顺序*/
/*将乘除转换为加法*/
for (i=0;i<=length;i++)
{
switch (c[i])
{
case 10042:
c[i+1]=c[i-1]*c[i+1];
c[i]=c[i-2];
c[i-2]=10043;
c[i-1]=0;
break;
case 10047:
c[i+1]=c[i-1]/c[i+1];
c[i]=c[i-2];
c[i-2]=10043;
c[i-1]=0;
break;
}
}
/*进行加减运算*/
result=result+c[0];
for (i=0;i<=length;i++)
{
switch (c[i])
{
case 10043:
result=result+c[i+1];
break;
case 10045:
result=result-c[i+1];
break;
}
/*防错:防止计算结果超过30000*/
if (result>30000)
{
printf("Sorry, the result is beyone my calculating ability.\n\n");
error=1;
break;
}
}
/*输出结果*/
if (error==0)
printf("\n The result is: %.2f\n\n",result);
}
/*******************************************************************************
** 函数名称:translate
** 函数描述:将字符串a[]转换为整型数组b[]中的数字
** 输入参数:无
** 输出参数:
*******************************************************************************/
int translate(char a[])
{
int b[20];
int c[20];
int i=0,k=0;
int length=0;
int error=0;
i=0;
k=0;
length=0;
error=0;
/*初始化b[],c[],全部归零*/
for (i=0;i<20;i++)
{
b[i]=0;
c[i]=0;
}
i=0;
while (a[i]!='\0')
{
switch (a[i]) /*字符串的提取与转换,提取为个位数字*/
{
case '0':
b[i]=a[i]-'0';
break;
case '1':
b[i]=a[i]-'0';
break;
case '2':
b[i]=a[i]-'0';
break;
case '3':
b[i]=a[i]-'0';
break;
case '4':
b[i]=a[i]-'0';
break;
case '5':
b[i]=a[i]-'0';
break;
case '6':
b[i]=a[i]-'0';
break;
case '7':
b[i]=a[i]-'0';
break;
case '8':
b[i]=a[i]-'0';
break;
case '9':
b[i]=a[i]-'0';
break;
case '+':
b[i]=a[i]+10000;
break;
case '-':
b[i]=a[i]+10000;
break;
case '*':
b[i]=a[i]+10000;
break;
case '/':
b[i]=a[i]+10000;
break;
default:
printf("Error, your input is not available.\n");
break;
}
i++;
}
length=i-1;
b[length+1]='\0';
/*防错:对最后一位是否为数字进行检查:*/
if (a[length]>'9'||a[length]<'0')
{
printf("Error, the last char is not a number.\n\n");
error=1;
}
/*防错:对最前一位是否为数字进行检查:*/
if (a[0]>'9'||a[0]<'0')
{
printf("Error, the first char is not a number.\n\n");
error=1;
}
/*数字重组:对上面提取的单个数字进行组合,使多位数复原*/
i=0;
k=3;
while (1)
{
if (b[i]>=0&&b[i]<=9) /*c[]存储复原后的多位数*/
{
c[k]=c[k]*10+b[i];
/*防错:防止单个数超过30000*/
if (c[k]>30000)
{
printf("Sorry, the number you input is too large, I can't calculate.\n\n");
error=1;
break;
}
}
if (i==length) break;
if ((b[i]==10043)||(b[i]==10045)||(b[i]==10042)||(b[i]==10047)) /*ASCII码+10000:+ →10043,- →10045,* →10042,/ →10047*/
{
k++; /*c[]标记运算符号 */
c[k]=b[i];
k++;
}
i++;
}
c[k+3]='\0';
calculate(c,k+3);
}
/*******************************************************************************
** 函数名称:main
** 函数描述:调用子函数实现表达式计算功能
** 输入参数:无
** 输出参数:无
*******************************************************************************/
main()
{
int i;
char a[20];
/*初始化a[],b[],c[],全部归零*/
for (i=0;i<20;i++)
{
a[i]=0;
}
while (1)
{
if (a[0]=='0'&&a[1]=='\0')/*当一行中只有0时,推出程序 */
{
printf("The program will exit...");
//sleep(2);
exit(0);
}
printf("******** Multi-function calculator *********\n");
printf(" For example you can input 2+3*5-2*3*6\n");
printf(" Every number should litter than 10000\n");
printf(" Please input a caluating line:\n ");
gets(a);
translate(a);
}
getch();
}
呵呵。这个不难,你百度一下,有很多的代码