- 注册时间
- 2004-8-29
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2005-8-5 15:31:00
|
显示全部楼层
long GetValue(addr str,float &value)
{
char buf[EXPLEN+1];
char tmp[EXPLEN+1];
float fstk[STKLEN];
char cstk[STKLEN];
float a,b,tvalue;
long length;
long pbuf;
int sign,k,i,j,t;
int findex,cindex; //pointer for stk
char match,ope;
length=strlen(str);
memcpy(buf,str,length);
buf[length]='@';
buf[length+1]=0;
findex=0;
cindex=0;
cstk[cindex++]='@'; //push '@' in cstk
sign=1;
pbuf=buf;
t=ReadExpr(pbuf,tmp,&length,sign);
while(cstk[cindex-1]!='@'||*pbuf!='@'){
if(t<0) return -1; //something error
else if(t==MsgConst){
GetConstValue(tmp,&tvalue);
fstk[findex++]=tvalue;
sign=0;
}
else if(t==MsgOper){
if(strcmp(tmp,"(")==0) sign=1;
else sign=0;
match=precede(&cstk[cindex-1],&tmp[0]);
if(match=='<')
cstk[cindex++]=tmp[0];
else if(match=='=')
cindex--;
else{
ope=cstk[--cindex];
b=fstk[--findex];
a=fstk[--findex];
if(operate(a,b,ope,&tvalue)<0) return -1;
fstk[findex++]=tvalue;
continue;
}
}
pbuf=pbuf+length;
t=ReadExpr(pbuf,tmp,&length,sign);
}
value=fstk[0];
return 1;
}
//***************************************************
long ReadExpr(addr exp,addr buf,long& length,int sign)
{
int dot;
addr expr;
expr=exp;
length=0;
if(*exp=='('||*exp==')'||*exp=='*'||*exp=='/'||*exp=='@'){
length=1;
*buf=*exp;
*(buf+1)=0;
return MsgOper;
}
if((*exp=='+'||*exp=='-')&&sign==0){
length=1;
*buf=*exp;
*(buf+1)=0;
return MsgOper;
}
while(*exp=='+'||*exp=='-'){
exp++;
length++;
}
if(isdigit(*exp)||*exp=='.'){
dot=0;
while(isdigit(*exp)||*exp=='.'){
if(*exp=='.') dot++;
exp++;
length++;
}
if(dot>1){
ErrMsg=ErrIllegalDot;
return -1;
}
memcpy(buf,expr,length);
*(buf+length)=0;
return MsgConst;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//******************************************************
long GetConstValue(addr str,float& value)
{
float t;
int sign;
value=0;
sign=1;
while(*str=='-'||*str=='+'){
if(*str=='-') sign=sign*-1;
str++;
}
while(*str!='.'&&*str!=0){
value=value*10.0;
value=value+(float)(*str-'0');
str++;
}
if(*str==0){
value=value*(float)sign;;
return 1;
}
t=1;
str++;
while(*str){
t=t*0.1;
value=value+t*(float)(*str-'0');
str++;
}
value=value*(float)sign;
return 1;
}
char precede(char &op1,char &op2)
{
int i,j;
if(op1=='+') i=0;
else if(op1=='-') i=1;
else if(op1=='*') i=2;
else if(op1=='/') i=3;
else if(op1=='(') i=4;
else if(op1==')') i=5;
else i=6;
if(op2=='+') j=0;
else if(op2=='-') j=1;
else if(op2=='*') j=2;
else if(op2=='/') j=3;
else if(op2=='(') j=4;
else if(op2==')') j=5;
else j=6;
return cede[i*7+j];
}
long operate(float a,float b,char ope,float& value)
{
if(ope=='+'){
value=a+b;
return 1;
}
if(ope=='-'){
value=a-b;
return 1;
}
if(ope=='*'){
value=a*b;
return 1;
}
if(ope=='/'){
if(b==0.0){
ErrMsg=ErrDivideZero;
return -1;
}
value=a/b;
return 1;
}
}
//**********************************************
void OutPutErrMsg()
{
char _ErrMsgTxt[22];
printf("something error!");
}
PS:代码一起贴上去显示的时候就少了很多,晕S。
害的我修改了N次
N+3次了,不管了
已更新,可以下载了
[此贴子已经被作者于2005-8-10 12:52:10编辑过]
|
|