#includestdio.h
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,先為拜城等服務(wù)建站,拜城等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為拜城企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
#inlcudestdlib.h
void main()
{
char str[20][201],*p0,*p1;
int t,i,s,f,loop;
scanf("%d",t); if ( t20 ) t=20;
for ( i=0;it;i++ ) scanf("%s",str[i]);
for ( i=0;it;i++ )
{ p0=p1=str[i]; s=0; f=1; loop=1;
while ( loop )
{ while ( (*p1)='0' (*p1)='9' ) p1++;
s+=(f*atoi(p0));
switch ( (*p1) )
{ case 0: loop=0; break;
case '+': f=1; break;
case '-': f=(-1); break;
default: loop=0; break;
}
p1++; p0=p1;
}
printf("\nCase %d:\n",i+1);
printf("%s=%d\n",str[i],s);
}
}
#includestdio.h
#includestdlib.h
#define MaxSize 99
void translate(char str[],char exp[]) /*將算術(shù)表達(dá)式轉(zhuǎn)換成后綴表達(dá)式*/
{
struct
{
char data[MaxSize];
int top; /*top為棧頂*/
}op; /*定義一個(gè)含data和top的結(jié)構(gòu)體*/
char ch;
int i = 0,t = 0;
op.top = -1;
ch = str[i]; /*將str的每一個(gè)數(shù)轉(zhuǎn)換成ch*/
i++;
while(ch != '\0') /*ch對(duì)應(yīng)不同的符號(hào)的時(shí)候?qū)?yīng)的轉(zhuǎn)換情況*/
{
switch(ch)
{
case '(': /*當(dāng)是(的時(shí)候,將此括號(hào)存入棧op*/
op.top++;op.data[op.top]=ch;
break;
case ')':
while(op.data[op.top] != '(') /*括號(hào)內(nèi)的轉(zhuǎn)換優(yōu)先級(jí)最高,故先提取表達(dá)式*/
{
exp[t]=op.data[op.top];
op.top--;
t++;
}
op.top--;
break;
case '+':
case '-':
while(op.top != -1op.data[op.top] != '(')
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top++; /*恢復(fù)可插入位置*/
op.data[op.top] = ch;
break;
case '*':
case '/':
while(op.top == '/'||op.top == '*') /*優(yōu)先級(jí)*/
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top++;
op.data[op.top] = ch;
break;
case ' ': /*忽略空格,排除誤操作*/
break;
default:
while(ch = '0'ch = '9')
{
exp[t] = ch;t++;
ch = str[i];i++;
}
i--;
exp[t] = '#'; /*分隔操作數(shù),為了美觀,也為了以后好分隔操作數(shù),呵呵*/
t++;
}
ch = str[i];
i++;
}
while(op.top != -1) /*得到剩下的部分*/
{
exp[t] = op.data[op.top];
t++;
op.top--;
}
exp[t] = '\0'; /*表達(dá)式結(jié)束*/
}
float cal_value(char exp[])
{
struct
{
float data[MaxSize];
int top;
}st; /*操作數(shù)棧*/
float d;
char ch;
int t = 0;
st.top = -1;
ch = exp[t];
t++;
while(ch != '\0')
{
switch(ch) /*運(yùn)算主體*/
{
case '+':
st.data[st.top-1] = st.data[st.top-1]+st.data[st.top];
st.top--;
break;
case '-':
st.data[st.top-1] = st.data[st.top-1]-st.data[st.top];
st.top--;
break;
case '*':
st.data[st.top-1] = st.data[st.top-1]*st.data[st.top];
st.top--;
break;
case '/':
if(st.data[st.top] != 0)
st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];
else
{
printf("\n\t除0是錯(cuò)誤的");
}
st.top--;
break;
default:
d=0;
while(ch = '0'ch = '9') /*從后綴表達(dá)式中獲取操作數(shù),#作用在此體現(xiàn)*/
{
d = 10*d+ch-'0';
ch = exp[t];
t++;
}
st.top++;
st.data[st.top] = d;
}
ch = exp[t];
t++;
}
return st.data[st.top];
}
int main() /*可以提到前面去*/
{
char str[MaxSize],exp[MaxSize]; /*str為算術(shù)表達(dá)式,exps為后綴表達(dá)式*/
printf("請(qǐng)輸入一個(gè)求值表達(dá)式\n");
printf("表達(dá)式:");
gets(str); /*輸入一個(gè)算術(shù)表達(dá)式*/
printf("原表達(dá)式是:%s\n",str);
translate(str,exp); /*將算術(shù)表達(dá)式轉(zhuǎn)換成后追表達(dá)式*/
printf("后綴表達(dá)式:%s\n",exp);
printf("計(jì)算結(jié)果:%g\n",cal_value(exp));/*通過后綴表達(dá)式來求值*/
system("pause");
return 0;
}
此式即等同于 (4!=3)(2)(4+15)
1代表真,0代表非,則原式即 110 所以值為0。
例如:
-12/5 = -2 只為這個(gè)是整數(shù)運(yùn)算,結(jié)果只取整數(shù)部分。
62 1*(6+7) + 7 *(6+1) = 13 +49 62
3.2 *(6+7+1) = 44.8
擴(kuò)展資料:
一個(gè)表達(dá)式的賦值和算符的定義以及數(shù)值的定義域是有關(guān)聯(lián)的。
兩個(gè)表達(dá)式若被說是等值的,表示對(duì)于自由變量任意的定值,兩個(gè)表達(dá)式都會(huì)有相同的輸出,即它們代表同一個(gè)函數(shù)。
一個(gè)表達(dá)式必須是合式的。亦即,其每個(gè)算符都必須有正確的輸入數(shù)量,在正確的地方。如表達(dá)式2+3便是合式的;而表達(dá)式*2+則不是合式的,至少不是算術(shù)的一般標(biāo)記方式。
表達(dá)式和其賦值曾在20世紀(jì)30年代由阿隆佐·邱奇和Stephen Kleene在其λ演算中被公式化。λ演算對(duì)現(xiàn)代數(shù)學(xué)和電腦編程語言的發(fā)展都曾有過重大的影響。
參考資料來源:百度百科-表達(dá)式