?? calculate.c
字號:
#include "calculate.h"
#include "stack.h"
int Calculate(char *s)
{
StackChar *OPTR;
StackDouble *OPND;
int BufferPointer=0;
int pointer = 0;
double FirstOut,SecondOut,TempResult,FinalResult;
char buffer[15];
char *endptr;
InitStackChar(&OPTR); //初始化操作數棧
PushChar(OPTR,'=');
InitStackDouble(&OPND); //初始化運算符棧
memset(buffer,'\0',sizeof(buffer));
strcat(s,"="); //先在輸入的表達式后面加上等號
//printf("first\n");
while(*(s+pointer) != '\0')
{
if((*(s+pointer) >= '0')&&(*(s+pointer) <= '9')) //進行操作數的處理
{
if(JudgeChar(*(s+pointer+1))) //操作數的下一個字符是操作符,說明是小于10的數字,直接入棧
{
PushDouble(OPND,(*(s+pointer)-48));
//printf("%f\n",OPND->Top);
pointer++;
}
else
{
do
{
buffer[BufferPointer] = *(s+pointer);
BufferPointer++;pointer++;
}while(!JudgeChar(*(s+pointer))); //操作數的下一個字符還是數,先存入buffer
PushDouble(OPND,strtod(buffer,&endptr));
//puts(buffer);
//printf("%f\n",atof(buffer));
//printf("%lf\n",strtod(buffer,&endptr));
BufferPointer = 0; //清空buffer和BufferPointer
memset(buffer,'\0',sizeof(buffer)); //此處將buffer全置為'\0',置為NULL也行,不過會有一個警告
}
//printf("%lf\n",getTopdouble(OPND));
//printf("second\n");
}
if(JudgeChar(*(s+pointer))) //若輸入為運算符+-*/()=
{
switch(precede(*(s+pointer),GetTopChar(OPTR)))
{
case '>': //操作符優先級高于棧頂元素,則操作符入棧
{
PushChar(OPTR,*(s+pointer));
pointer++;
//printf("%c\n",GetTopChar(OPTR));
//printf("third\n");
break;
}
case '<': //操作符優先級低于棧頂元素,操作數操作符出棧運算,并將運算結果入棧
{
FirstOut = PopDouble(OPND);
SecondOut = PopDouble(OPND);
if((GetTopChar(OPTR) == '/')&&(FirstOut == 0))
{
printf("除數不能為零!!\n");
return ERROR;
}
TempResult = operate(SecondOut,PopChar(OPTR),FirstOut);
//printf("TempResult = %f\n",TempResult);
PushDouble(OPND,TempResult);
break;
}
case '=': //脫括號
{
PopChar(OPTR);
pointer++;
break;
}
}
}
if((*(s+pointer) == '=')&&(GetTopChar(OPTR) == '=')) //表達式末尾的等號與棧內原有的等號相遇,說明操作符全部參與了運算,即計算完畢
{
FinalResult = PopDouble(OPND);
if(FinalResult >= 1e16) //10000000000000000
{
printf("超出表示范圍!!\n");
return ERROR;
}
sprintf(buffer,"%5.10f",FinalResult);
printf("結果是:");
puts(buffer);
//FinalResult = TempResult;
//printf("FinalResult = %f\n",FinalResult);
break; //計算完畢應跳出循環
}
}
free(OPTR);
free(OPND); //free很重要??!
return !ERROR;
}
char precede(char a,char b) //優先級比較函數,同級運算符應返回小于號,加減乘除的優先級大于左右括號
{ //右括號優先級等于左括號,其余情況若出現則當作輸入錯誤處理?
switch(a) //等號和等號相遇時應返回一個特殊值,而不是返回"="?
{
case '+':
switch(b)
{
case '+':return('<');
case '-':return('<');
case '*':return('<');
case '/':return('<');
case '(':return('>');
case ')':return('>');
case '=':return('>');
}
case '-':
switch(b)
{
case '+':return('<');
case '-':return('<');
case '*':return('<');
case '/':return('<');
case '(':return('>');
case ')':return('>');
case '=':return('>');
}
case '*':
switch(b)
{
case '+':return('>');
case '-':return('>');
case '*':return('<');
case '/':return('<');
case '(':return('>');
case ')':return('>');
case '=':return('>');
}
case '/':
switch(b)
{
case '+':return('>');
case '-':return('>');
case '*':return('<');
case '/':return('<');
case '(':return('>');
case ')':return('>');
case '=':return('>');
}
case '(':
switch(b)
{
case '+':return('>');
case '-':return('>');
case '*':return('>');
case '/':return('>');
case '(':return('>');
case ')':return('=');
case '=':return('>');}
case ')':
switch(b)
{
case '+':return('<');
case '-':return('<');
case '*':return('<');
case '/':return('<');
case '(':return('=');
case ')':return('>');
case '=':return('>');}
case '=':
switch(b)
{
case '+':return('<');
case '-':return('<');
case '*':return('<');
case '/':return('<');
case '(':return('<');
case ')':return('F');/*返回錯誤*/
case '=':return('F');}
} /*switch(a)*/
}
double operate(double a,char theta,double b) //元素運算函數
{
switch(theta)
{
case '+':return(a+b);
case '-':return(a-b);
case '*':return(a*b);
case '/':return(a*1.0/b);
}
}
//判斷字符'a'是否為"+-*/()="的其中之一
int JudgeChar(char a)
{
switch(a)
{
case '+':return 1;
case '-':return 1;
case '*':return 1;
case '/':return 1;
case '(':return 1;
case ')':return 1;
case '=':return 1;
default: return 0;
}
}
//判斷是否為"+-*/"的其中之一
int JudgeOptrChar(char a)
{
switch(a)
{
case '+':return 1;
case '-':return 1;
case '*':return 1;
case '/':return 1;
default: return 0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -