⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 一个表达式求值程序.txt

📁 一个表达式求值程序 ACM常用
💻 TXT
📖 第 1 页 / 共 2 页
字号:
		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 + -