?? calc.c
字號:
/*輸入表達式計算器模塊*/
#include "MAGIC.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <string.h>
float CalcForm(char Input[]) /*計算字符串表達式的浮點值*/
{
float Form[50];
if(Convert(Input,Form))
return SmartCalc(Form);
else
{
/* printf("Error:Input illegal!\n");*/
return INERROR;
}
}
int Convert(char Input[],float Form[]) /*轉換字符串為浮點數組*/
{
int i=0,j=0,flag=0,ll=0,rl=0;
float temp=0;
while(Input[i]!='\0')
{
if(Input[i]>='0'&&Input[i]<='9')
{
temp=temp*10+(Input[i]-48);
flag=1;
if(Input[i+1]=='\0')
{
Form[j]=temp;
j++;
}
}
else if(Input[i]=='+'||Input[i]=='-'||Input[i]=='*'||Input[i]=='/'||Input[i]=='('||Input[i]==')')
{
if(flag)
{
Form[j]=temp;
temp=0;
j++;
}
if(Input[i]=='+')
{
if(((Input[i-1]<'0'||Input[i-1]>'9')&&Input[i-1]!=')')||((Input[i+1]<'0'||Input[i+1]>'9')&&Input[i+1]!='(')) return 0;
Form[j]=ADD;
j++;
}
else if(Input[i]=='-')
{
if(((Input[i-1]<'0'||Input[i-1]>'9')&&Input[i-1]!=')')||((Input[i+1]<'0'||Input[i+1]>'9')&&Input[i+1]!='(')) return 0;
Form[j]=MIS;
j++;
}
else if(Input[i]=='*')
{
if(((Input[i-1]<'0'||Input[i-1]>'9')&&Input[i-1]!=')')||((Input[i+1]<'0'||Input[i+1]>'9')&&Input[i+1]!='(')) return 0;
Form[j]=MUT;
j++;
}
else if(Input[i]=='/')
{
if(((Input[i-1]<'0'||Input[i-1]>'9')&&Input[i-1]!=')')||((Input[i+1]<'0'||Input[i+1]>'9')&&Input[i+1]!='(')) return 0;
Form[j]=DEV;
j++;
}
else if(Input[i]=='(')
{
if(((i>0)&&Input[i-1]!='('&&Input[i-1]!='+'&&Input[i-1]!='-'&&Input[i-1]!='*'&&Input[i-1]!='/')||(Input[i+1]!='\0'&&Input[i+1]!='('&&(Input[i+1]<'0'||Input[i+1]>'9'))) return 0;
Form[j]=LL;
j++;
ll++;
}
else if(Input[i]==')')
{
if((i>0&&Input[i-1]!=')'&&(Input[i-1]<'0'||Input[i-1]>'9'))||(Input[i+1]!='\0'&&Input[i+1]!=')'&&Input[i+1]!='+'&&Input[i+1]!='-'&&Input[i+1]!='*'&&Input[i+1]!='/')) return 0;
Form[j]=RL;
j++;
rl++;
}
flag=0;
}
else return 0;
i++;
}
if(ll!=rl) return 0;
Form[j]=END;
return 1;
}
float SmartCalc(float Form[]) /*遞歸計算浮點數組的值*/
{
int i=0,Start=0,End,Flag1=0,Flag2=0;
float temp;
while(Form[i]!=END)
{
if(Form[i]==LL)
{
Start=i+1;
Flag1=1;
}
else if(Form[i]==RL)
{
End=i-1;
Flag2=1;
if(Flag1==1) break;
}
i++;
}
if(Flag2==0) End=i-1;
if(Flag1+Flag2==0) return FloatCalc(Form,Start,End);
else if(Flag1+Flag2==2)
{
temp=FloatCalc(Form,Start,End);
if(temp==OUTERROR) return OUTERROR;
Replace(Form,Start-1,Start+1,temp);
return SmartCalc(Form);
}
}
void Replace(float Form[],int Start,int End,float Res) /*替換字符串中指定的字符*/
{
Form[Start]=Res;
do
{
Form[++Start]=Form[++End];
}while(Form[End]!=END);
}
float FloatCalc(float Form[],int Start,int End) /*計算從START到END的表達式的值*/
{
int i=Start;
float Sum;
for(i=Start;i<End;i++)
{
if(Form[i]==MUT)
{
Replace(Form,i-1,i+1,Form[i-1]*Form[i+1]);
End=End-2;
i--;
}
else if(Form[i]==DEV)
{
if(fabs(Form[i+1])<1e-5)
{
/* printf("Error:Devided by zero!\n");*/
return OUTERROR;
}
Replace(Form,i-1,i+1,(float)Form[i-1]/Form[i+1]);
End=End-2;
i--;
}
}
Sum=Form[Start];
for(i=Start+1;i<End;i=i+2)
{
if(Form[i]==ADD) Sum=Sum+Form[i+1];
else if(Form[i]==MIS) Sum=Sum-Form[i+1];
}
Replace(Form,Start,End,Sum);
return Sum;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -