資源簡介
帶有變量的中綴表達式是常見的數學表達式。如果規定變量由長度不超過 8 個小寫字母組成;end為保留字,表示程序段結束;用?表示輸出指定變量的值,則可以設計出比較復雜的表達式(即一個可順序執行語句序列)。例如,如果有如下語句段:
abc=10
def=8
c=abc+def
abc=abc+5-c*2
? c
? abc
end
則輸出為:
c=18
abc=-21
注意:為了簡化編程實現,運算符只有+,-,*,/ ,%和^(指數運算),可以處理圓括號(),并假定輸入的算術表達式正確。
要求:使用棧結構實現。
輸入:表達式序列
輸出:全部指定變量的值
表達式中的全部計算結果均為整數。如果在計算過程中出現除數為0的情況,則輸出:Divide 0.
特殊情況說明:
在表達式中,如果操作數出現負數(例如-8),則要特別注意。例如:
10加-8表示為:10+-8。
10減-8表示為:10--8。
代碼片段和文件信息
#include
#include
#include
typedef?struct
{
????char?c[20];
????int?number;
}store;?
store?data[500];
typedef?struct
{
???int?num[500];
???int?top;
}opnd;
opnd?s1;
typedef?struct
{
????char?operate[500];
????int?top;
}oper;//運算?
oper?s2;
char?pri[9][10]=
{?
????“>><<<<<>>“
????“>><<<<<>>“
????“>>>><><>>“
????“>>>><><>>“
????“>>>><><>>“
????“>>>><><>>“
????“<<<<<<<=?“
????“>>>>>>?>>“
????“<<<<<<=“
};
int?push1(opnd?sint?n)
{
????s1.num[s1.top]=n;
????s1.top++;
}
int?push2(oper?schar?c)
{??????
????s2.operate[s2.top]=c;
????s2.top++;
}
int?pop1(opnd?s)
{
????int?n;
????s1.top--;
????n=s1.num[s1.top];
????return?n;
}
char?pop2(oper?s)
{
????char?c;
????s2.top--;
????c=s2.operate[s2.top];
????return?c;
}
int?signswitch?(char?a)
{???
????char?signs[]={‘+‘‘-‘‘*‘‘/‘‘^‘‘%‘‘(‘?‘)‘‘#‘‘\0‘};
????int?k=0;
????while?(signs[k]!=‘\0‘&&signs[k]!=a)
????????k++;
????if?(signs[k]==a)?return?k;
????else?return?-1;
}
char?judge(char?achar?b)
{
????return?pri[signswitch(a)][signswitch(b)];
}
int?calculate(int?xint?ychar?a)
{
????switch(a)
????{????
????case?‘+‘:?return?x+y;
????????case?‘-‘:?return?x-y;
????????case?‘*‘:?return?x*y;
????????case?‘/‘:?if(y)????return?x/y;
????????????else?{printf(“Divide?0.\n“);return?(12345);}
????????case?‘%‘:?return?(long?int)?fmod(xy);
????????case?‘^‘:?if?(y>=0?)?return?(long?int)?pow(xy);
????????????????????else???????return?(0);
????????default:??printf(“Error?No.?3\n“);
?????????????????????return?0;
????}
}
int?main()
{
????char?str[500]temp0[20]temp1[20]temp2[20]count;
????int?i=0j=0k=0l=0flag=0sign=1num1num2sum=0result;
????push2(s2‘#‘);//運算符最底下#?
????gets(str);
????strcat(str“#“);
????while(strcmp(str“end#“))//strcmp比較兩個字符串??判斷是否結束?
????{
????????i=0;
????????j=0;
????????flag=0;
????????sign=1;
????????sum=0;
????????int?len=strlen(str);
????????while(str[i]!=‘#‘||s2.operate[s2.top-1]!=‘#‘)
????????{
????????????if(flag==0)
????????????{
????????????????if(str[i]>=‘a‘&&str[i]<=‘z‘)
????????????????{????temp0[j]=str[i];j++;i++;}//存儲變量?
????????????????else?if(str[i]==‘=‘)???
????????????????{????flag=1;temp0[j]=0;j=0;i++;}
????????????????else?if(str[i]==‘?‘)
????????????????{
????????????????????for(k=i+2;k ????????????????????{????temp2[j]=str[k];j++;}
????????????????????temp2[j]=0;
????????????????????j=0;
????????????????????i=len-1;
????????????????????for(k=0;k ????????????????????????if(strcmp(temp2data[k].c)==0)
??
- 上一篇:北航C語言課件2010考研機試資料
- 下一篇:VC6使用GDI+
評論
共有 條評論