📄 一个表达式求值程序.txt
字号:
if (r.name[0]!='(')
{
seterror(ERR_UNEXPECTEDTOKEN,r.pos,__LINE__,__FILE__);
return FALSE;
}
getnexttoken();
if (!evalexp1(answer))
return FALSE;
if (r.name[0]!=')')
{
seterror(ERR_UNMATCHKH,r.pos,__LINE__,__FILE__);
return FALSE;
}
getnexttoken();
if (!func(answer,index))
return FALSE;
return TRUE;
}
if (r.name[0]=='(')
{
getnexttoken();
if (!evalexp1(answer))
return FALSE;
if (r.name[0]!=')')
{
seterror(ERR_UNMATCHKH,r.pos,__LINE__,__FILE__);
return FALSE;
}
getnexttoken();
}
else
return (atom(answer));
}
BOOL atom(DOUBLE *answer)
{
switch (r.type)
{
case ID_VAR:
if (!findvar(r.name,GETVALUE,answer))
{
seterror(ERR_VARNOTDEFINED,r.pos,__LINE__,__FILE__);
return FALSE;
}
getnexttoken();
break;
case ID_NUMBER:
#ifdef DOUBLE
*answer=_atold(r.name);
#else
*answer=atof(r.name);
#endif
getnexttoken();
break;
default:
//err
seterror(ERR_UNEXPECTEDTOKEN,r.pos,__LINE__,__FILE__);
return FALSE;
break;
}
return TRUE;
}
BOOL getnexttoken()
{
char *temp;
memcpy(&r1,&r,sizeof(TOKEN));
temp=r.name;
r.type=ID_NONE;
r.index=0;
*temp='\0';
if (!*pchar)
{
return TRUE;
}
while (*pchar==' ')pchar++;
if (!*pchar)
{
return TRUE;
}
if (strchr("+-*/%^=()",*pchar))
{
r.type=ID_DELIMITER;
r.index=*pchar;
r.pos=POS(pchar);
*temp++=*pchar++;
}
else if isalpha(*pchar)
{
r.pos=POS(pchar);
while(isalpha(*pchar))*temp++=*pchar++;
*temp=0;
for (int i=0;i<CMDNUM;i++)
{
if (!strcmp(cmdtab[i].cmd,r.name))
{
r.type=ID_COMMAND;
r.index=i;
return TRUE;
}
}
for (i=0;i<FUNCNUM;i++)
{
if (!strcmp(r.name,funcname[i]))
{
r.type=ID_FUNC;
r.index=i;
return TRUE;
}
}
r.type=ID_VAR;
//or func
}
else if isdigit(*pchar)
{
r.pos=POS(pchar);
while (isdigit(*pchar))*temp++=*pchar++;
if (*pchar=='.')
{
*temp++=*pchar++;
while (isdigit(*pchar))*temp++=*pchar++;
}
if (*pchar=='E' || *pchar=='e')
{
*temp++=*pchar++;
if(*pchar=='+' || *pchar=='-')*temp++=*pchar++;
if (isdigit(*pchar))
while (isdigit(*pchar))*temp++=*pchar++;
else
{
while (*pchar!='E' && *pchar!='e')
{
pchar--;
temp--;
}
}
}
r.type=ID_NUMBER;
}
else if (*pchar!=0)
{
r.type=ID_UNKNOWN;
r.pos=POS(pchar);
*temp++=*pchar++;
}
*temp=0;
return TRUE;
}
/*
"sin",
"cos",
"tg",
"ctg",
"atg",
"actg",
"asin",
"acos",
"sqrt",
"sqr",
"fact",
"log",
"ln",
"abs",
"int"
*/
BOOL func(DOUBLE *answer,int index)
{
switch (index)
{
case 0:
*answer=sin(*answer);
break;
case 1:
*answer=cos(*answer);
break;
case 2:
*answer=tan(*answer);
break;
case 3:
*answer=1.0/tan(*answer);
break;
case 4:
*answer=atan(*answer);
break;
case 5:
*answer=PI/2-atan(*answer);
break;
case 6:
*answer=asin(*answer);
break;
case 7:
*answer=acos(*answer);
break;
case 8:
if (*answer<0)
{
seterror(ERR_ILLEAGLENUMBER,r.pos,__LINE__,__FILE__);
return FALSE;
}
*answer=sqrt(*answer);
break;
case 9:
*answer=pow(*answer,2);
break;
case 10:
if (*answer<0)
{
seterror(ERR_ILLEAGLENUMBER,r.pos,__LINE__,__FILE__);
return FALSE;
}
if ((*answer-(long)*answer)<1E-9)
{
long i;
long m=(long)*answer;
*answer=1;
for(i=1;i<=m;i++)
*answer=i*(*answer);
return TRUE;
}
seterror(ERR_ILLEAGLENUMBER,r.pos,__LINE__,__FILE__);
return FALSE;
break;
case 11:
if (*answer<0)
{
seterror(ERR_ILLEAGLENUMBER,r.pos,__LINE__,__FILE__);
return FALSE;
}
*answer=log10(*answer);
break;
case 12:
if (*answer<0)
{
seterror(ERR_ILLEAGLENUMBER,r.pos,__LINE__,__FILE__);
return FALSE;
}
*answer=log(*answer);
break;
case 13:
*answer=fabsl(*answer);
break;
case 14:
*answer=(long)*answer;
break;
}
return TRUE;
}
BOOL cls()
{
clrscr();
return TRUE;
}
BOOL version()
{
showmsg(CMDCOLOR,"\n\rMini Math Calculator ver 1.%d by zs .And all rights unreserved",(long)__TIME__[1]);
showmsg(CMDCOLOR,"\n\rit can perform simple mathmatics calculate\n\r");
showmsg(CMDCOLOR,"surpport +-*/%^ and general function such as sin,cos\n\r");
#ifdef __SMALL__
showmsg(CMDCOLOR,"Compiled in small mode at %s on %s\n\r",__TIME__,__DATE__);
#elif __TINY__
showmsg(CMDCOLOR,"Compiled in tiny mode at %s on %s\n\r",__TIME__,__DATE__);
#elif __COMPACT__
showmsg(CMDCOLOR,"Compiled in compact mode at %s on %s\n\r",__TIME__,__DATE__);
#elif __LARGE__
showmsg(CMDCOLOR,"Compiled in large mode at %s on %s\n\r",__TIME__,__DATE__);
#elif __HUGE__
showmsg(CMDCOLOR,"Compiled in huge mode at %s on %s\n\r",__TIME__,__DATE__);
#elif __MEDIUM__
showmsg(CMDCOLOR,"Compiled in medium mode at %s on %s\n\r",__TIME__,__DATE__);
#endif
showmsg(CMDCOLOR,"If you have any question,contact me!My email address is usenet@263.net\n\r");
showmsg(CMDCOLOR,"\n\r");
return TRUE;
}
BOOL help()
{
showmsg(CMDCOLOR,"\n\rHere are commands reference:\n\r");
showmsg(CMDCOLOR,"help ------ get this info\n\r");
showmsg(CMDCOLOR,"ver ------ get version of this program\n\r");
showmsg(CMDCOLOR,"cls ------ clear current screen\n\r");
showmsg(CMDCOLOR,"prompt [msg] ------ change prompt message\n\r");
showmsg(CMDCOLOR,"list ------ show history buffer\n\r");
showmsg(CMDCOLOR,"funclist ------ show function list\n\r");
showmsg(CMDCOLOR,"sound ------ switch sound\n\r");
showmsg(CMDCOLOR,"lv ------ list vars\n\r");
showmsg(CMDCOLOR,"del [varname] ------ del var\n\r");
showmsg(CMDCOLOR,"load [filename] ------ load a expresion from file\n\r");
showmsg(CMDCOLOR,"demo ------ enter demo mode\n\r");
showmsg(CMDCOLOR,"quit(close) ------ exit this program\n\r");
return TRUE;
}
BOOL delvars()
{
showmsg(CMDCOLOR,"\n\r");
getnexttoken();
while (r.type!=ID_NONE)
{
if (r.type!=ID_VAR)
{
seterror(ERR_COMMADLINE,r.pos,__LINE__,__FILE__);
return FALSE;
}
if (delvar(r.name))
showmsg(CMDCOLOR,"delete %s ok!\n\r",r.name);
else
{
showmsg(ALERTCOLOR,"%s\n\r",r.name);
showmsg(CMDCOLOR,"not defined,failed\n\r",r.name);
}
getnexttoken();
}
return TRUE;
}
BOOL prompt()
{
if (*pchar==0)
{
showmsg(CMDCOLOR,"\n\rcurrent prompt messge:");
showmsg(ALERTCOLOR,promptmsg);
}
else
{
while (*pchar==' ')pchar++;
if (strlen(pchar)<10 && strlen(pchar)>1)
{
strcpy(promptmsg,pchar);
}
else
{
// showmsg(ALERTCOLOR,"prompt len must between 1..10\n\r");
showmsg2(ALERTCOLOR1,"Error(859):prompt len must between 1..10\n\r");
status=98;
}
}
return TRUE;
}
/*
exp1=exp2+exp2;
exp2=exp3*exp3;
exp3=exp4^exp3;
exp4=-exp4
exp4=(exp5)
*/
//#include <
BOOL findstr(int &index,char *s)
{
STRLIST *ps=header.next;
index=1;
while (ps!=NULL)
{
if (!strcmp(s,ps->str))
return TRUE;
index++;
ps=ps->next;
}
return FALSE;
}
BOOL insertstr(int index,char *s)
{
STRLIST *ps=&header;
STRLIST *pnew=NULL;
if ((pnew=new STRLIST)==NULL)
{
seterror(ERR_ALLOCATEMEMORY,0,__LINE__,__FILE__);
return FALSE;
}
pnew->next=NULL;pnew->str=NULL;
pnew->str=new char[strlen(s)+1];
if (!pnew->str)
{
seterror(ERR_ALLOCATEMEMORY,0,__LINE__,__FILE__);
if (pnew)
delete pnew;
return FALSE;
}
strcpy(pnew->str,s);
pnew->next=ps->next;
ps->next=pnew;
for (int i=0;i<MAXHISTORY;i++)
{
if (ps->next)
ps=ps->next;
}
if (ps)
{
if (ps->next!=NULL)
{
delete []ps->next->str;
delete ps->next;
}
ps->next=NULL;
}
return TRUE;
}
BOOL findandinsert(char *s)
{
int index;
if (!findstr(index,s))
{
if (index<MAXHISTORY)
insertstr(MAXHISTORY+1,s);
else
insertstr(MAXHISTORY,s);
return TRUE;
}
return FALSE;
}
BOOL showstrlist()
{
STRLIST *ps=header.next;
if (ps)
showmsg(HISCOLOR,"\n\rHistory content:\n\r");
else
showmsg(HISCOLOR,"\n\rHistory buffer is empty\n\r");
while (ps)
{
showmsg(HISCOLOR,"%s\n\r",ps->str);
ps=ps->next;
}
return TRUE;
}
BOOL flush()
{
STRLIST *p,*p1;
p=header.next;
while (p)
{
delete []p->str;
p1=p;
p=p->next;
delete p1;
}
header.next=NULL;
showmsg(HISCOLOR,"\n\rHistory flushed.OK?\n\r");
return TRUE;
}
int getlistcount()
{
STRLIST *ps=header.next;
int c=0;
while (ps)
{
ps=ps->next;
c++;
}
return c;
}
char *gethisstr(int i)
{
STRLIST *ps=&header;
for (int j=0;j<i;j++)
ps=ps->next;
return ps->str;
}
BOOL funclist()
{
showmsg(CMDCOLOR,"\n\rAvaliable function list:\n\r");
for (int i=0;i<FUNCNUM;i++)
showmsg(CMDCOLOR,"%s\n\r",funcname[i]);
return TRUE;
}
BOOL sound()
{
if(soundon)
{
soundon=FALSE;
showmsg(CMDCOLOR,"\n\rsound is off\n\r");
}
else
{
soundon=TRUE;
showmsg(CMDCOLOR,"\n\rsound is off\n\r");
}
return TRUE;
}
int matherr (struct exception *a)
{
if (a->type == OVERFLOW || a->type == UNDERFLOW)
{
ERRORBEEP(1000,500);
showmsg(ALERTCOLOR,"\n\r!!!Over Flow Error Catched,The result may be wrong!!! \n\r");
seterror(ERR_OVERFLOW,0,__LINE__,__FILE__);
return 1;
}
return 0;
}
BOOL findvar(char *name,int flag,DOUBLE *value)
{
VARLIST *pv=vhead.next;
while (pv)
{
if (!strcmp(name,pv->name))
{
if (flag==GETVALUE)
*value=pv->value;
else
pv->value=*value;
return TRUE;
}
pv=pv->next;
}
return FALSE;
}
BOOL newvar(char *name,DOUBLE value)
{
DOUBLE *val;
VARLIST *pv=&vhead;
VARLIST *pnew;
int vnum=0;
while (pv->next) pv=pv->next;
if ((pnew=new VARLIST)==NULL)
{
seterror(ERR_ALLOCATEMEMORY,0,__LINE__,__FILE__);
return FALSE;
}
pnew->next=NULL;pnew->name=NULL;pnew->value=value;
if (strlen(name)>MAXVARLEN)
{
seterror(ERR_TOOLONGTOKEN,0,__LINE__,__FILE__);
if (pnew)
delete pnew;
return FALSE;
}
pnew->name=new char[strlen(name)+1];
if (!pnew->name)
{
seterror(ERR_ALLOCATEMEMORY,0,__LINE__,__FILE__);
if (pnew)
delete pnew;
return FALSE;
}
strcpy(pnew->name,name);
pv->next=pnew;
return TRUE;
}
BOOL delvar(char *name)
{
VARLIST *pv=vhead.next;
VARLIST *pprev=&vhead;
while (pv)
{
if (!strcmp(name,pv->name))
{
pprev->next=pv->next;
delete []pv->name;
delete pv;
return TRUE;
}
pprev=pv;
pv=pv->next;
}
seterror(ERR_VARNOTDEFINED,0,__LINE__,__FILE__);
return FALSE;
}
BOOL listvars()
{
VARLIST *pv=vhead.next;
if (pv)
showmsg(HISCOLOR,"\n\rdefined vars list:\n\r");
else
{
showmsg(HISCOLOR,"\n\rno vars define yet.\n\r");
return FALSE;
}
int i=0;
while (pv)
{
showmsg(VARCOLOR,"%-20s %.19LG\n\r",pv->name,pv->value);
i++;pv=pv->next;
}
showmsg(HISCOLOR,"Total %d vars.\n\r",i);
return TRUE;
}
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
void interrupt ( *oldtimer)(__CPPARGS);
BOOL timeron=TRUE;
#define FEQ 4
static volatile int count=FEQ;
static time_t t;
#define TIMEINTR 0x08
void directdraw(int x,int y,char *str,char c)
{
char far *vram=(char far *)MK_FP(0xb800,0);
vram+=160*(y-1)+2*(x-1);
int i=0;
while (*str!=0 && i<10)
{
i++;
*vram++=*str++;
*vram++=c;
}
}
void interrupt newtimer(__CPPARGS)
{
count--;
if (!count)
{
char far *vram;
char far *m;
count=FEQ;
time(&t);
m=ctime(&t)+10;
vram=(char far *)MK_FP(0xb800,0);
vram+=160*(25-1)+2*(71-1);
int i;
for (i=0;i<10;i++)
{
*vram++=*m++;
*vram++=TIMECOLOR;
}
// directdraw(71,25,ctime(&t)+10,TIMECOLOR);
}
oldtimer();
}
BOOL installtimer()
{
oldtimer = getvect(TIMEINTR);
setvect(TIMEINTR, newtimer);
return TRUE;
}
BOOL uninstalltimer()
{
setvect(TIMEINTR, oldtimer);
return TRUE;
}
BOOL timer()
{
timeron=!timeron;
return TRUE;
}
BOOL load()
{
char filename[MAXPATH+1];
showmsg(CMDCOLOR,"\n\r");
FILE *stream;
char ch;
while (*pchar==' ')pchar++;
strncpy(filename,pchar,MAXPATH);
stream = fopen(filename, "rt");
if (!stream)
{
seterror(ERR_FILEOPENERROR,r.pos,__LINE__,__FILE__);
return FALSE;
}
int i=0;
findandinsert(strbuf);
do
{
ch = fgetc(stream);
if (ch!=0x0d && ch !=0x0a)
{
strbuf[i]=ch;
i++;
}
} while (ch != EOF && i<strbuflen);
strbuf[i-1]=0;
fclose(stream);
return TRUE;
}
BOOL dir()
{
/*
struct ffblk ffblk;
int done;
printf("Directory listing of *.*\n");
char pathname[MAXPATH+3];
strcpy(pathname,pchar);
// pathname[strlen(pathname)]='\';
// pathname[strlen(pathname)+1]='\';
// pathname[strlen(pathname)]='\';
done = findfirst("*.*",&ffblk,0);
while (!done)
{
showmsg(DIRCOLOR,"
printf(" %s\n", ffblk.ff_name);
done = findnext(&ffblk);
}
*/
}
BOOL cd()
{
}
//the flowing for demo
char
*democmd[]=
{
"help",
"sin(pi/2)",
"2*3-4+(5/3)",
"2^2^3",
"e = e +1/fact(n)",
"n = n+1",
"lv",
"22^22^22",
"21/(1-1)",
};
#define DEMOCMDNUM (sizeof(democmd)/sizeof(char *))
BOOL exec(char *str)
{
strcpy(strbuf, str);
return evalexp();
}
BOOL demo()
{
demomode = 1;
}
BOOL getdemostring()
{
int key;
static p =0;
static v=200;
int err=0;
char *pp = democmd[p];
while (*pp)
{
delay(v);
if (bioskey(1))
{
key=bioskey(0);
if (key == IDK_ESC)
{
demomode = 0;
break;
}
if (key == IDK_UP)
{
v = v >> 1;
if (!v)v = 1;
}
if (key == IDK_DOWN)
{
v = v << 1;
if (v>200) v = 200;
}
}
if (random(100) < 95 && !err)
showmsg(ATTR,"%c",*pp++);
else
{ if (err)
{
showmsg(ATTR,"\b \b");
err =0;
}
else
{
showmsg(ATTR,"%c",random('z'-'a')+'a');
err = 1;
}
}
}
*pp = 0;
strcpy(strbuf, democmd[p]);
delay(v+100);
showmsg(ATTR,"\n\r");
p++;
if (p>DEMOCMDNUM-1)
p =0;
if (bioskey(1))
{
key=bioskey(0);
if (key == IDK_ESC)
demomode = 0;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -