#define N 100
#define L 100
//可加减乘除的计算器
void Make_Calculate(void)
{
float str[N]={ 2,3,'+',5,7, '+',20,'/',4,'/',5,'+',11,'*',80,'*',40,'/',13,'-',20,'/',2,'*',2,'/',6,'+',5,'='}; //将要运算的东西放入数组
float str1[L];
u16 i,j,k=0;
float a=1,b=1;
for(i=0;i<N;i++)
{
j++;
if(str[i]=='+' )
{
switch(j-1)
{
case 1: str1[k]=str[i-1]; k++; str1[k]='+'; k++; break;
case 2: str1[k]=str[i-2]*10+str[i-1]; k++; str1[k]='+'; k++; break;
case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='+'; k++; break;
case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='+'; k++; break;
}
j=0;
}
else if(str[i]=='-')
{
switch(j-1)
{
case 1: str1[k]=str[i-1]; k++; str1[k]='-'; k++; break;
case 2: str1[k]=str[i-2]*10+str[i-1]; k++; str1[k]='-'; k++; break;
case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='-'; k++; break;
case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='-'; k++; break;
}
j=0;
}
else if(str[i]=='*')
{
switch(j-1)
{
case 1: str1[k]=str[i-1]; k++; str1[k]='*'; k++; break;
case 2: str1[k]=str[i-2]*10+str[i-1]; k++; str1[k]='*'; k++; break;
case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='*'; k++; break;
case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='*'; k++; break;
}
j=0;
}
else if(str[i]=='/')
{
switch(j-1)
{
case 1: str1[k]=str[i-1]; k++; str1[k]='/'; k++; break;
case 2: str1[k]=str[i-2]*10+str[i-1]; k++; str1[k]='/'; k++; break;
case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='/'; k++; break;
case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='/'; k++; break;
}
j=0;
}
else if(str[i]=='=')
{
// printf("%d",j);
switch(j-1)
{
case 1: str1[k]=str[i-1]; k++; str1[k]='='; break;
case 2: str1[k]=str[i-2]*10+str[i-1]; k++; str1[k]='='; break;
case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='='; break;
case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='='; break;
}
j=0;
}
}
//以下内容是将数组str1 里面的乘法和除法运算的数消掉全部变成只带加减运算符的数
j=0;k=0;
for(i=0;i<N;i++)
str[i]=0; //清空数组重复利用
for(i=0;i<N;i++)
{
if( str1[i]=='+' || str1[i]=='-' )
{
str[j]=str1[i-1];
j++;
str[j]=str1[i];
j++;
}
else if(str1[i]=='*')
{
if( (i-2>0) && str1[i-2]=='/' ) a=b/str1[i-1]; //前一个数必须是存在的且是除法运算符 目的是将乘号前面的除法运算符的结果算出来
//应为连续的除法运算并没有放入数组而是存入变量b
else a =str1[i-1]*a; //不然就连续将带乘法运算符的数算成一个数
if( str1[i+2]=='+' || str1[i+2]=='-' )
{
a =str1[i+1]*a; //将加号之前的乘法运算结合
str[j]=a; //将乘积放入数组
j++;
str[j]=str1[i+2]; //将加或减法运算符放入数组
j++;
i=i+2;
a=1;b=1;k=0; //说明除法运算已到尽头记得将除积和乘积清掉
}
else if( str1[i+2]=='=' ) //如果连乘碰到‘=’运算符就说明运算筛选结束了
{
a =str1[i+1]*a; //将加号之前的乘法运算结合
str[j]=a;
j++;
str[j]=str1[i+2];
break;
}
}
else if(str1[i]=='/')
{
if( (i-2>0) && str1[i-2]=='*' ) b=a*str1[i-1];
else if(k==1) b /=str1[i-1];
else if(k==0) {b =str1[i-1]; k=1;}
if( str1[i+2]=='+' || str1[i+2]=='-' )
{
b /=str1[i+1]; //将加号之前的除法运算结合
str[j]=b;
j++;
str[j]=str1[i+2];
j++;
i=i+2;
b=1;a=1;k=0; //说明除法运算已到尽头记得将除积和乘积清掉
}
else if( str1[i+2]=='=' )
{
b /=str1[i+1]; //将加号之前的除法运算结合
str[j]=b;
j++;
str[j]=str1[i+2];
break;
}
}
else if(str1[i]=='=') //如果连除碰到‘=’运算符就说明运算筛选结束了
{
str[j]=str1[i-1];
j++;
str[j]=str1[i];
break;
}
}
/******************当不确定时可以看看自己的数对不对*******************/
// printf("**********\n");
// printf("%5.2f\n",str[0]);
// printf("%5.2f\n",str[2]);
// printf("%5.2f\n",str[4]);
// printf("%5.2f\n",str[6]);
// printf("%5.2f\n",str[8]);
/*********************/
//将数组剩下的数进行加减运算
a=0;
for(i=0;i<N;i++)
{
if( str[i]=='+' )
{
if( i-2<0 ) a= str[i-1]+str[i+1];
else a +=str[i+1];
}
else if( str[i]=='-' )
{
if( i-2<0 ) a= str[i-1]-str[i+1];
else a -=str[i+1];
}
else if( str[i]=='=' )
{
printf("%5.2f\n",a); //输出结果
break;
}
}
for(i=0;i<N;i++)
str[i]=0; //清空数组重复利用
}
|