# include
# include
# include
# include
# define MAX_OPERATOR_NUM 100//運算符棧數組長度
# define MAX_DATA_NUM 100//運算數棧數組長度
typedef struct OPStack//定義運算符棧
{
char opStack[MAX_OPERATOR_NUM];
int top;
}OPStack, *pOPStack;
typedef struct DATAStack//定義操作數棧
{
double stack[MAX_DATA_NUM];
int top;
}DATAStack, *pDATAStack;
void InitpOPStack(pOPStack &pOStack)//初始化運算符棧
{
if( !(pOStack = (pOPStack)malloc(sizeof(OPStack))))//為運算符棧分配空間
{
printf("分配內存空間失敗!\n");
exit(-1);
}
pOStack->top = -1;
}
void InitpDATAStack(pDATAStack &pDStack)//初始化運算數棧
{
if( !(pDStack = (pDATAStack)malloc(sizeof(DATAStack))))//為運算數棧分配空間
{
printf("分配內存空間失敗!\n");
exit(-1);
}
pDStack->top = -1;
}
void PushOPStack(pOPStack &pOStack, char ch)//運算符進棧
{
pOStack->opStack[++(pOStack->top)] = ch;
}
void PopOPStack(pOPStack &pOStack, char &ch)//運算符出棧
{
ch = pOStack->opStack[pOStack->top];
pOStack->top--;
}
void PushDATAStack(pDATAStack &pDStack, double d)//運算數進棧
{
++(pDStack->top);
pDStack->stack[pDStack->top] = d;
}
void PopDATAStack(pDATAStack &pDStack, double &d)//運算數出棧
{
d = pDStack->stack[pDStack->top];
pDStack->top--;
}
void ClearpOPStack(pOPStack &pOStack)//清空運算符棧
{
pOStack->top = -1;
}
void ClearpDATAStack(pDATAStack &pDStack)//清空運算數棧
{
pDStack->top = -1;
}
char GetToppOPStack(pOPStack &pOStack)//獲取運算符棧頂元素
{
return pOStack->opStack[pOStack->top];
}
double GetToppDATAStack(pDATAStack &pDStack)//獲取運算數棧頂元素
{
return pDStack->stack[pDStack->top];
}
bool IsOP(char &ch)//區分 運算符 和 運算數 的函數,是運算符時返回true,否則返回false
{//判斷是否為符號
if ( (ch == '+') || (ch == '-') || (ch == '*') || (ch == '/') || (ch == '=') || (ch == 'A') || (ch == 'S') || (ch == 'a') || (ch == 's') || (ch == '(') || (ch == ')') )
return true;
else
return false;
}
char Precede(char op1, char op2) //參考《數據結構》(C語言版)第53頁 3。
2。5表達式求值 表 3。1
{
char tab[9][10];//定義字符串的二維數組來存放運算符優先級的關系
strcpy( tab[0], ">>" );
strcpy( tab[1], ">>" );
strcpy( tab[2], ">>>><>" );
strcpy( tab[3], ">>>><>" );
strcpy( tab[4], ">>>E>>>>" );
strcpy( tab[6], ">>>><>>>>" );
strcpy( tab[7], ">>>><>>>>" );
strcpy( tab[8], "= 0)//判斷被開方數是否為0,若為0,退出程序
{
s = sqrt(b);//調用SQRT()函數
break;
}
else
{
printf("\n#### 求負數的平方根是非法運算。
程序終止! ####\n");
exit_E();//打印結束菜單
exit(-1);
}
}
return s;
}
char ChangeChar(char &c)//通過ChangeChar函數來把a、s的小寫字母改為大寫的
{
if( c == 'a' )
c = 'A';
else if( c == 's' )
c = 'S';
return c;
}
//參考《數據結構》(C語言版)第53頁 3。
2。5表達式求值 算法3。4EvaluateExpression()函數
void EvaluateExpression()//計算函數:讀入表達式,并計算結果
{
pOPStack pOStack;//聲明運算符棧
pDATAStack pDStack;//聲明運算數棧
double result;//存運算的結果
char x, theta, c;//c存放讀取的字符,x、theta存放運算符棧的棧頂元素
int flag, data;//標識符,用來讀入連續的數字
double s;
double getd;//存放GetTop***的結果
double a, b, cc;//a,b存放數據棧出棧的棧頂元素, c存放運算結果
flag = 0;//初始化標識符,用來判斷字符串中的連續數字
data = 0;//
InitpOPStack(pOStack);//初始化運算符棧
InitpDATAStack(pDStack);//初始化運算數棧
PushOPStack(pOStack, '=');//在運算符棧底放入'='
printf("&請輸入表達式以'='結束:");
c = getchar();//讀入字符
ChangeChar(c);//通過調用函數來實現把小寫的a、s改為大寫的A、S
while( c != '=' || GetToppOPStack(pOStack) != '=')
{
if( !IsOP(c) )//不是運算符進棧
{
s = c - '0';//把字符轉化為數字
if ( flag == 1 )
{
PopDATAStack(pDStack, getd);
s = getd*10 + s;
}
PushDATAStack(pDStack, s);
flag = 1;
c = getchar();
ChangeChar(c);
}
else
{
flag = 0;
switch( Precede(GetToppOPStack(pOStack), c) )//輸入元素和運算符棧頂元素比較
{
case ''://退棧并將運算結果進棧
PopOPStack(pOStack, theta);
PopDATAStack(pDStack, b);
PopDATAStack(pDStack, a);
cc = Operate(a, theta, b);
PushDATAStack(pDStack, cc);
break;
}//switch
}//else
}//while
result = GetToppDATAStack(pDStack);//運算結束時,運算數棧的棧底元素就是計算結果
ClearpOPStack(pOStack);//清空運算符棧
ClearpDATAStack(pDStack);//清空運算數棧
printf("->計算結果為:%。
2f\n\n", result);//輸出運算結果
return ;
}
void print_user()//歡迎界面
{
printf("\n歡迎使用C語言版模擬計算器\n\n");
printf("************************************************************************\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("|模擬計算器使用說明|\n\n");
printf("| 作者:謝先斌|\n\n");
printf("|本程序包括對'+'、'-'、'*'、'/'、'()'的運算|\n");
printf("|本程序中ABS()算用A()替代、SQRT()運算用S()代替|\n");
printf("|本程序中的一切字母均不區分大小寫|\n");
printf("正確的表達式如:1+A(7-8)+S(9*8)=\n");
printf("|輸入'='表示表達式輸入結束!!|\n\n");
printf("| 歡迎使用!!!-->--> |\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("************************************************************************\n\n");
}
int main()//主函數
{
char in;
bool b;//標識符,用來標識是否結束程序
b = true;//初始化,不結束
print_user();//打印歡迎界面
printf("*請確認使用計算器Y/N:");
while(1)
{
scanf("%c", &in);//確認是否繼續操作
getchar();//吃掉會車,避免干擾
switch(in)
{
case 'Y':
case 'y':
{
EvaluateExpression();//進入計算函數:讀入表達式,并計算結果
break;
}
case 'N':
case 'n':
{
exit_E();
b = false;
break;
}
//default:
//printf("**輸入錯誤,請重新輸入Y/N:");
//break;
}
if(b==false)//如果 b==false ,退出整個程序
break;
printf("*您確定要繼續使用計算機Y/N:");
getchar();//用getchar吃掉回車,避免對后續輸入中in的干擾
}
return 0;
}
。
全部