|
#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,'='}; //將要運(yùn)算的東西放入數(shù)組
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;
}
}
//以下內(nèi)容是將數(shù)組str1 里面的乘法和除法運(yùn)算的數(shù)消掉全部變成只帶加減運(yùn)算符的數(shù)
j=0;k=0;
for(i=0;i<N;i++)
str[i]=0; //清空數(shù)組重復(fù)利用
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]; //前一個數(shù)必須是存在的且是除法運(yùn)算符 目的是將乘號前面的除法運(yùn)算符的結(jié)果算出來
//應(yīng)為連續(xù)的除法運(yùn)算并沒有放入數(shù)組而是存入變量b
else a =str1[i-1]*a; //不然就連續(xù)將帶乘法運(yùn)算符的數(shù)算成一個數(shù)
if( str1[i+2]=='+' || str1[i+2]=='-' )
{
a =str1[i+1]*a; //將加號之前的乘法運(yùn)算結(jié)合
str[j]=a; //將乘積放入數(shù)組
j++;
str[j]=str1[i+2]; //將加或減法運(yùn)算符放入數(shù)組
j++;
i=i+2;
a=1;b=1;k=0; //說明除法運(yùn)算已到盡頭記得將除積和乘積清掉
}
else if( str1[i+2]=='=' ) //如果連乘碰到‘=’運(yùn)算符就說明運(yùn)算篩選結(jié)束了
{
a =str1[i+1]*a; //將加號之前的乘法運(yùn)算結(jié)合
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]; //將加號之前的除法運(yùn)算結(jié)合
str[j]=b;
j++;
str[j]=str1[i+2];
j++;
i=i+2;
b=1;a=1;k=0; //說明除法運(yùn)算已到盡頭記得將除積和乘積清掉
}
else if( str1[i+2]=='=' )
{
b /=str1[i+1]; //將加號之前的除法運(yùn)算結(jié)合
str[j]=b;
j++;
str[j]=str1[i+2];
break;
}
}
else if(str1[i]=='=') //如果連除碰到‘=’運(yùn)算符就說明運(yùn)算篩選結(jié)束了
{
str[j]=str1[i-1];
j++;
str[j]=str1[i];
break;
}
}
/******************當(dāng)不確定時可以看看自己的數(shù)對不對*******************/
// 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]);
/*********************/
//將數(shù)組剩下的數(shù)進(jìn)行加減運(yùn)算
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); //輸出結(jié)果
break;
}
}
for(i=0;i<N;i++)
str[i]=0; //清空數(shù)組重復(fù)利用
}
|
評分
-
查看全部評分
|