資源簡介
可以計算包含加減乘除的算術表達式,還可以用來計算帶小數的表達式,表達式輸入錯誤時會提示!

代碼片段和文件信息
#include
#include
#include
#define?Max?30
typedef?struct?node1??/*定義符號棧*/
{
char?data[Max];
int??top;
}SignSeqStack*SignPSeqStack;
typedef?struct?node2??/*定義數字棧*/
{
double?data[Max];
int??top;
}NoSeqStack*NoPSeqStack;
SignPSeqStack?SInit()???/*符號棧的初始化*/
{
????SignPSeqStack?s;
????s=(SignPSeqStack)malloc(sizeof(SignSeqStack));
????if(s)
????????s->top=-1;
????return?s;
}?
NoPSeqStack?NInit()???/*數字棧的初始化*/
{
????NoPSeqStack?s;
????s=(NoPSeqStack)malloc(sizeof(NoSeqStack));
????if(s)
????????s->top=-1;
????return?s;
}?
void?SPush(SignPSeqStack?schar?x)??/*符號入棧函數*/
{
if(s->top==Max-1)
{
printf(“表達式過長,不能計算!“);
return;
}
else
{
s->top++;
s->data[s->top]=x;
}
}
void?NPush(NoPSeqStack?sdouble?x)??/*數字入棧函數*/
{
if(s->top==Max-1)
{
printf(“表達式過長,不能計算!“);
return;
}
else
{
s->top++;
s->data[s->top]=x;
}
}
void?SPop(SignPSeqStack?Schar?*x)??/*符號出棧函數*/
{
if(S->top==-1)
???????return;
else
{
*x=S->data[S->top];
S->top--;
}
}
void?NPop(NoPSeqStack?Sdouble?*x)??/*數字出棧函數*/
{
if(S->top==-1)
???????return;
else
{
*x=S->data[S->top];
S->top--;
}
}
char?Priority(char?s1char?s2)???/*判斷運算符優先級*/
{
int?irowcol;
static?char?CH[7]={‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘#‘}??/*運算符*/
R[7][7]={{‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘>‘}???????/*運算符優先關系*/
?????????????{‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘>‘}
?????????????{‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘}
?????????????{‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘}
?????????????{‘<‘‘<‘‘<‘‘<‘‘<‘‘=‘‘/‘}
?????????????{‘>‘‘>‘‘>‘‘>‘‘/‘‘>‘‘>‘}
?????????????{‘<‘‘<‘‘<‘‘<‘‘<‘‘<‘‘<‘}};
????for(i=0;i<7;i++)
????????if(CH[i]==s1)
{
row=i;
break;
}
for(i=0;i<7;i++)
????if(CH[i]==s2)
{
col=i;
break;
}
if(col<7&&row<7)
return?(R[row][col]);
else
return?‘/‘;
}
void?Symbol(char?*chint?*mSignPSeqStack?SNoPSeqStack?N);
?
void?Digital(char?*chint?*mNoPSeqStack?NSignPSeqStack?S)?/*數字處理函數*/
{
int?flag=0;
int?a=0;???/*a用于存放數字的整數部分*/
double?b=0.0e=0.1;?/*b用于存放數字的小數部分*/
if(ch[*m]==‘-‘)
{
if(!(*m==0||ch[*m-1]==‘(‘))???/*判斷“-”是負號還是減號*/
{
Symbol(chmSN);??/*是減號,處理*/
return;
}
else?
{
flag=1;????/*flag=1表示有負號*/
(*m)++;
}
}
for(;ch[*m]>=‘0‘&&ch[*m]<=‘9‘;(*m)++)??/*處理整數部分*/
{
a*=10;
a+=ch[*m]-‘0‘;?
}
if(ch[*m]==‘.‘)????/*判斷有沒有小數*/
for(++(*m);ch[*m]>=‘0‘&&ch[*m]<=‘9‘;(*m)++)??/*處理小數部分*/
{
double?d;
d=double(ch[*m]-‘0‘);
d*=e;
e*=0.1;
b+=d;
}
(*m)--;
if(flag==1)???/*是負數,將負數入棧*/
????NPush(N0.0-(a+b));
else
NPush(Na+b);
}
void?Symbol(char?*chint?*mSignPSeqStack?SNoPSeqStack?N)??/*符號處理函數*/
{
double?abc;
int?i=*m;
char?xy;
y=Priority(S->data[S->top]ch[i]);
if(y==‘/‘)?/*處理符號*/
{
printf(“你輸入的表達式不合法!將導致計算錯誤!“);
return?;
}
else?if(y==‘<‘)
{
SPush(Sch[i]);
return;
}
else?if(y==‘=‘)
{
SPop(S&x);
????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????50176??2008-03-25?23:21??表達式求值\表達式求值.ncb
?????文件??????53248??2008-03-25?23:20??表達式求值\Debug\vc60.pdb
?????文件?????208986??2008-03-25?23:21??表達式求值\Debug\表達式求值.exe
?????文件?????467968??2008-03-25?23:21??表達式求值\Debug\表達式求值.pdb
?????文件??????12794??2008-03-25?23:20??表達式求值\Debug\表達式求值.obj
?????文件????????254??2008-03-25?23:21??表達式求值\表達式求值.plg
?????文件???????4334??2008-01-11?14:48??表達式求值\表達式求值.cpp
?????文件???????3451??2008-03-25?23:20??表達式求值\表達式求值.dsp
?????文件??????48640??2008-03-25?23:21??表達式求值\表達式求值.opt
?????文件????????528??2008-03-25?23:21??表達式求值\表達式求值.dsw
?????目錄??????????0??2008-01-10?19:42??表達式求值\Debug
?????目錄??????????0??2008-01-10?19:42??表達式求值
-----------?---------??----------?-----??----
???????????????850379????????????????????12
- 上一篇:ASCII碼表ASCII碼表
- 下一篇:期末數電課程設計__四路智力競賽搶答器設計
評論
共有 條評論