我的思路是先回圈一遍a,挑出乘除,把乘除號左右的數進行運算,賦給另一個陣列c,c為字符,然后把c轉化為整型陣列d,最后對陣列d進行加減運算
a——>n——>c——>d——>result
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main()
{
{
printf("hw 附加題\n");
int i,j=0,result,sz,tmp=0,m;
printf("請輸入參與計算數字的個數:\n");
scanf("%d",&sz);
int size=2*sz-1; //size是所有字符的長度,后面用于控制回圈條件
getchar(); //吸識訓車~
printf("請輸入算式:\n");
char a[1000],c[1000],d[1000],n[1000]; //a[1000] 為原始字符,n[1000]用于記錄a[]里的數字部分
//c[1000]記錄a中乘除運算后的字符(就是說a與c的區別在于c里沒有乘除)
//d[1000]為c轉成整型的陣列
int tmp1,tmp2; //這兩個臨時變數是整型
gets(a);
//記錄a中數字(a-->n)
for(int i=0;i<size;i++)
{
if(a[i]!='\n')
{
if(a[i]<='9'&&a[i]>='0')
{
sscanf(&a[i],"%d",&n[i]);
// printf("n[%d]=%d ",i,n[i]);
}
}
else break;
}
//記錄乘除,并將乘除項算出來
for(i=0;i<size;i++)
{
if(a[i]!='\n')
{
if(a[i]=='*')
{
m=i-(2*tmp+1);
/*m=i-(2*tmp+1)是在乘除后生成的新的數的排列序數。如1-2*3 *號位于i=4,進行運算后變成1-6,數字6位于i'=3 == m=i-(2*tmp+1)=4-(2*0+1)=3 完美印證計算公式~ */
//tmp是當前乘除號以前的乘除號的數目
tmp1=n[i-1]*n[i+1]; //如tmp1=2*3
// printf("tmp1=%d\n",tmp1);
sprintf(&c[m],"%d",tmp1); //把整型tmp1轉化為字串c
// printf("c[%d]=%c",m,c[m]);
tmp++; //每乘除一次,tmp自增一
}
else if(a[i]=='/')
{
m=i-(2*tmp+1);
tmp2=n[i-1]/n[i+1];
sprintf(&c[m],"%d",tmp2);
tmp++;
}
else
{
m=i-2*tmp; //在當前不是乘除號的情況下,算出當前字符的序數
c[m]=a[i]; //非乘除時直接賦給c
}
}
else break;
}
//輸出c[m],以便觀察
for(m=0;m<size;m++)
{
printf("c[%d]=%c\n",m,c[m]);
}
//記錄c中數字(c——>d)
for(m=0;m<size;m++)
{
if(c[m]!='\n')
{
if(c[m]<='9'&&c[m]>='0')
{
sscanf(&c[m],"%d",&d[m]);
printf("c[%d]=%c ",m,c[m]);
printf("d[%d]=%d ",m,d[m]);
}
}
else break;
}
result=d[0];
printf("result0=%d\n",result);
//以下為加減計算部分
for(m=0;m<size-2*tmp;m++) //size-2*tmp為進行乘除后的總字符數
{
if(c[m]!='\n')
{
if(c[m]=='-')
{
printf("d[%d]=%d ",m+1,d[m+1]);
result-=d[m+1];
}
else if(c[m]=='+')
{
result+=d[m+1];
}
}
else break;
}
printf("result=%d",result);
}
結果:
uj5u.com熱心網友回復:
麻煩幫忙看看。。。
uj5u.com熱心網友回復:
問題:參與運算的只能一位數。式子中不能連乘或連除(如:1+2*3*4)。供參考:#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main()
{
printf("hw 附加題\n");
int i,j=0,result,sz,tmp=0,m;
char t[2]; //增加字符陣列t
printf("請輸入參與計算數字的個數:\n");
scanf("%d",&sz);
int size=2*sz-1; //size是所有字符的長度,后面用于控制回圈條件
getchar(); //吸識訓車~
printf("請輸入算式:\n");
char a[1000],c[1000],d[1000],n[1000]; //a[1000] 為原始字符,n[1000]用于記錄a[]里的數字部分
//c[1000]記錄a中乘除運算后的字符(就是說a與c的區別在于c里沒有乘除)
//d[1000]為c轉成整型的陣列
int tmp1,tmp2; //這兩個臨時變數是整型
gets(a);
//記錄a中數字(a-->n)
for(int i=0;i<size;i++)
{
if(a[i]!='\n')
{
if(a[i]<='9'&&a[i]>='0')
{
sscanf(&a[i],"%d",&n[i]);
printf("n[%d]=%d ",i,n[i]);
}
}
else break;
}
//記錄乘除,并將乘除項算出來
for(i=0;i<size;i++)
{
if(a[i]!='\n')
{
if(a[i]=='*')
{
m=i-(2*tmp+1);
// m=i-(2*tmp+1)是在乘除后生成的新的數的排列序數。如1-2*3 *號位于i=4,進行運算后變成1-6,
// 數字6位于i'=3 == m=i-(2*tmp+1)=4-(2*0+1)=3 完美印證計算公式~
//tmp是當前乘除號以前的乘除號的數目
tmp1=n[i-1]*n[i+1]; //如tmp1=2*3
//printf("tmp1=%d\n",tmp1);
sprintf(t,"%d",tmp1); //把整型tmp1轉化為字符
c[m] = t[0];
//printf("c[%d]=%c",m,c[m]);
tmp++; //每乘除一次,tmp自增一
i++; //i自增一次
}
else if(a[i]=='/')
{
m=i-(2*tmp+1);
tmp2=n[i-1]/n[i+1];//沒考慮不能整除的情況
sprintf(t,"%d",tmp2);
c[m] = t[0];
tmp++;
i++;
}
else
{
m=i-2*tmp; //在當前不是乘除號的情況下,算出當前字符的序數
c[m]=a[i]; //非乘除時直接賦給c
}
}
else break;
}
//輸出c[m],以便觀察
for(i=0;i<m+1;i++)//for(m=0;m<size;m++)
{
printf("c[%d]=%c\n",i,c[i]);
}
//system("pause");
for(m=0;m<size;m++) //記錄c中數字(c——>d)
{
if(c[m]!='\n')
{
if(c[m]<='9'&&c[m]>='0')
{
sscanf(&c[m],"%d",&d[m]);
printf("c[%d]=%c ",m,c[m]);
printf("d[%d]=%d ",m,d[m]);
}
}
else break;
}
result=d[0];
printf("result0=%d\n",result);
//以下為加減計算部分
for(m=0;m<size-2*tmp;m++) //size-2*tmp為進行乘除后的總字符數
{
if(c[m]!='\n')
{
if(c[m]=='-')
{
printf("d[%d]=%d ",m+1,d[m+1]);
result-=d[m+1];
}
else if(c[m]=='+')
{
result+=d[m+1];
}
}
else break;
}
printf("result=%d",result);
}
//hw 附加題
//請輸入參與計算數字的個數:
//6
//請輸入算式:
//1+2*3+1*5+4
//n[0]=1 n[2]=2 n[4]=3 n[6]=1 n[8]=5 n[10]=4 c[0]=1
//c[1]=+
//c[2]=6
//c[3]=+
//c[4]=5
//c[5]=+
//c[6]=4
//c[0]=1 d[0]=1 c[2]=6 d[2]=6 c[4]=5 d[4]=5 c[6]=4 d[6]=4 result0=1
//result=16請按任意鍵繼續. . .
uj5u.com熱心網友回復:
哇⊙?⊙!謝謝!
之后細看
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/269371.html
標籤:C語言
上一篇:Qt中實作拷貝位元組
下一篇:字串陣列
