📄 calc.cpp
字号:
#include"xms.cpp"
#include"type.cpp"
#include"var.cpp"
#include"sbasdat.cpp"
/*--Designed by LiYi in 2000--*/
/*-----------CLASS---------------*/
/*---------------------*/
/* */
/*------------CODE---------------*/ /* */
/* + - 1 2 10 */
void SCAN(uchar a[]) /* * / 3 4 20 */
{uchar n,i2=0,ti,i;uint l,j; /* ^ 5 30 */
l=strlen(a); /* % 8 15 */
setmem(unit,120,0);
/* for(i=0;i<30;i++) */ /* f( f) 80+x 79 40 */
/* unit[i]=0; */ /* \ 9 15 */
for(i=0,n=0;i<l;i++,n++) /* != == = 10 5 */
{ /* ! 12 30 */
if(a[i]==0||a[i]=='\n')
{if(CFI)ERR(1);
return;
}
if(isdigit(a[i])||a[i]=='.') /* < > 13 */
{while(isdigit(a[i])||a[i]=='.') /* <= >= */
fn[i2++]=a[i++]; /*---------------------*/
fn[i2]=0;i--;unit[n]=(float)atof(fn);
i2=0;continue;
}
if(isalpha(a[i]))
{while(isalpha(a[i]))
fn[i2++]=a[i++];
fn[i2]=0;i2=0;
strupr(fn);
if(a[i]=='(')
{
for(j=0;j<FUNMAX;j++)
if(strcmp(fname[j],fn)==0)
{set(80+j,n);break;}
if(j==FUNMAX)
{
ti=strlen(fn);
unit[n]=getarray(a+i-ti,&ti);
i=ti+i-1;
continue;
}
CF[CFI++]=2;continue;
}
switch(a[i])
{
case '%':unit[n]=var.GETIVAR(fn);i++;break;
case '!':unit[n]=var.GETFVAR(fn);i++;break;
default: unit[n]=var.GETFVAR(fn);
}
i--;
continue;
}
switch(a[i])
{
case '+':set(1,n);break;
case '-':set(2,n);break;
case '*':set(3,n);break;
case '/':set(4,n);break;
case '\\':set(9,n);break;
case '^':set(5,n);break;
case '(':CF[CFI++]=1;set(6,n);break;
case ')':if(CFI)
{
switch(CF[--CFI])
{case 0:ERR(1);return;
case 1:set(7,n);break;
case 2:set(79,n);break;
}
break;
}
ERR(4);return;
case '=':if(a[i+1]=='=')i++;
set(11,n);break;
case '>':if(a[i+1]=='='){i++;set(16,n);}
else set(14,n);
break;
case '<':if(a[i+1]=='>'){i++;set(10,n);break;}
if(a[i+1]=='='){i++;set(15,n);}
else set(13,n);
break;
}
}
if(CFI)ERR(5);
}
uchar GETV()
{
if(P1<P2){P1--;return 200;}
return getverbl(verb[P1--]);
}
void set(uchar t,uchar n)
{
verb[vn]=t;verbp[vn++]=n;
}
float VAL(char p1,char p2)
{uchar a,b,c,t1,t2,i2;float x,y,z;char i3;
uchar vbh=255,vbp=255,CC;
t1=P1;t2=P2;P2=p1;P1=p2;
if(vn==0){P1=t1;P2=t2;return unit[0];}
if(p1==p2+1)
if(p2==-1)
if(verbp[p1]==0)return 0;
else return unit[verbp[p1]-1];
else return unit[verbp[p2]+1];
for(i2=p1;i2<=p2;i2++)
{if(verb[i2]==6)
{CC=1;i2++;
for(;i2<=p2;i2++)
{
if(verb[i2]==6){CC++;continue;}
if(verb[i2]==7)
if(--CC==0)goto s;
}
ERR(1);
}
if(verb[i2]>=80)
{CC=1;i2++;
for(;i2<=p2;i2++)
{
if(verb[i2]>=80){CC++;continue;}
if(verb[i2]==79)
if(--CC==0)goto s;
}
}
if(vbh>=getverbl(verb[i2]))vbh=getverbl(verb[i2]),vbp=i2;
s:;
}
if(vbh==255)
{if(verb[p1]==6)z=VAL(p1+1,p2-1);
if(verb[p1]>=80)
{
z=VAL(p1+1,p2-1);
z=(float)(*fun[verb[p1]-80])(z);
if(CALCERR)return 0;
}
goto e;
}
x=VAL(p1,vbp-1);y=VAL(vbp+1,p2);
if(CALCERR)return 0;
switch(verb[vbp])
{
case 1:z=x+y;break;
case 2:z=x-y;break;
case 3:z=x*y;break;
case 4:if(y==0){z=99999;ERR(2);break;}
z=x/y;break;
case 5:z=POW(x,y);break;
case 9:z=(float)(long)(x/y);break;
case 10:z=((float)x!=(float)y);break;
case 11:z=((float)x==(float)y);break;
case 13:z=(x<y);break;
case 14:z=(x>y);break;
case 15:z=((float)x<=(float)y);break;
case 16:z=((float)x>=(float)y);break;
}
e:P1=t1,P2=t2;return z;
}
float CALC(uchar*a)
{
float tunit[30];uchar tun,temp;
uchar tverb[20],tverbp[20];double z;
movmem(unit,tunit,120);
movmem(verb,tverb,20);
movmem(verbp,tverbp,20);
temp=vn;tun=un;un=0;
vn=0;CFI=0; /* ( ) 6 7 40 */
CALCERR=0;
SCAN(a);
if(CALCERR)return 0;
z=VAL(0,vn-1);
movmem(tunit,unit,120);
movmem(tverb,verb,20);
movmem(tverbp,verbp,20);
vn=temp;un=tun;
return z;
}
double cot(double n)
{if(n==0){ERR(3);return 99999;}
return 1.0/tan(n);
}
double SQR(double n)
{
if(n<0){ERR(3);return -30000;}
else return sqrt(n);
}
double LOG(double n)
{
if(n<=0){ERR(3);return -30000;}
else return log(n);
}
double INT(double n)
{return (double)(long)n;
}
void ERR(uchar a)
{
CALCERR=a;
}
uchar getverbl(uchar i)
{
if(i==79)return 40;
if(i>=80)return 40;
else return verbl[i];
}
double POW(double a,double b)
{
if(a<0&&(b!=long(b)))ERR(3);
else return pow(a,b);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -