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

📄

📁 用C语言实现一个简单数学计算器
💻
字号:
#include <stdio.h>
#include <windows.h>
#include <malloc.h>
#define LEN  255
#define NLEN  5
 
  typedef struct
  {
    char nodeclass;
    void *left,*right;
    char op;//操作副
	int  con;//书
  }exprtree; 
  exprtree *r;
  char sym[NLEN];
  char input[LEN];
  int  pinput=0;
  
exprtree * maketree(char * op,exprtree *left,exprtree * right);
exprtree * expression ();
float apply(char op,float l,float r);

bool ismulop(char p)
 {
  switch (p)
  {
	  case '*':
      case '/':
		  {return true;break;}
      default : return false;
  }
 }
  
bool isaddop(char p)
 {
	 switch (p)
	 {
   case '+' : 
   case '-' :
   return true;break;
   default : return false;

	 }
}

 char  kind (char * p)
  
 { 
	 switch(*p)
	 {
		 case '*':
         case '/' :
         case '+' :
         case '-' :return 'o';break;// 1代表'Oper'
		 case '(': return 'l';break;//2代表'lparen'
         case ')': return 'r'; break;//3代表'rparen'
		 case '1':
		 case '2':
		 case '3':
		 case '4':
		 case '5':
		 case '6':
		 case '7':
		 case '8':
		 case '9':
	     case '0':return 'n';break;//4代表'ident'
		 case 0:  return 'f'; //结束
	    default: return  'e';//error
	 }
  
}
 
void getsymbol()
 { int psym=0;
   memset(sym,0,NLEN);
   if (input[pinput]==0) return;
   while(input[pinput]>='0' && input[pinput]<='9')
      sym[psym++]=input[pinput++];
   if (psym==0) sym[psym++]=input[pinput++];
   return;
 } 

float evaluate (exprtree *t)
{  float l, r;
   if (t->nodeclass == 'o') 
     {l = evaluate ((exprtree *)t->left);
      r = evaluate ((exprtree *)t->right);
      printf("%c ",t->op);
	  return apply (t->op, l, r);
     }
   else if (t->nodeclass == 'n') 
	  { printf("%d ",t->con);return (float)t->con;}
   else return 0;
}

float apply(char op,float l,float r)
{
    switch (op)
	{case '+': return (l+r);
	 case '-': return (l-r);
	 case '*': return (l*r);
	 case '/': return (l/r);
	}
	return 0;
}

exprtree * factor( )
{      exprtree * result;
       char k;
	   k=kind(sym);
	   if (k=='r') {printf("括号不匹配!\n");exit(0);}
	   if (k=='n') 
	   {result=maketree(sym,NULL,NULL);getsymbol();return result;}
	   else if (k=='f') {result=NULL;getsymbol();return result;}
        else if (k=='l')                                  
	   {   getsymbol();               
           result = expression();                  
	   } 
	   if (kind(sym)!='r') {printf("括号不匹配!\n");exit(0);}
       getsymbol();
	   return result;
}

exprtree * term()
   {   exprtree * loperand,* roperand;
       char op[NLEN];
       loperand = factor();
       while (ismulop(*sym))
	   {
        memcpy(op,sym,NLEN);
        getsymbol();
        roperand = factor();
        loperand = maketree(op,loperand,roperand);
	   }
   return loperand;
}

exprtree *expression ()
  {
   exprtree *loperand,*roperand;
   char op[NLEN];
    loperand = term();
    while (isaddop(*sym))
    {
      memcpy(op,sym,NLEN);
      getsymbol();
      roperand =term();
      loperand = maketree (op,loperand,roperand);
     }
      return loperand;
  }   
   
exprtree * maketree(char * op ,exprtree *left,exprtree *right)
{ exprtree * pt;
  char k;
  pt=(exprtree *)malloc(sizeof(exprtree));
  pt->left=left;
  pt->right=right;
  k=kind(op);
  if (k=='n') {pt->nodeclass='n';pt->con=atoi(op);}
  else if (k=='o'){pt->nodeclass='o';pt->op=*op;}
  else {printf("输入错误!");exit(0);};  
  return pt;}

int getinput()
{char c;
 memset(input,0,LEN);
 pinput=0;

 c=getchar();
 while (c!=10)
 { while (c==32) c=getchar();
   if (( c!='+' && c!='-' && c!='*' && c!='/' && c!='(' && c!= ')') && (c<'0' || c>'9') )return 1;//错误的输入值
   input[pinput++]=c;
   c=getchar();
 }
 pinput=0;
 return 0;//正常返回
}

void checkerror()
{ char k;
  int no=0,nl=0,nr=0,nn=0;
  getsymbol();
  k=kind(sym);
  while (k!='f')
  { switch (k)
    {case 'n':nn++;break;
	 case 'l':nl++;break;
	 case 'r':nr++;break;
	 case 'o':no++;break;
	}
	getsymbol();
    k=kind(sym);
  }
  if (nr!=nl) {printf("括号不匹配!\n");exit(0);}
  if (no>=nn) {printf("操作符错误!\n");exit(0);}
  pinput=0;
}

main ()
{ float f;
  printf("请输入表达式:\n");
  if (getinput()){printf("请输入正确的表达式:\n");exit(0);}
  checkerror();
  getsymbol();
  r=expression();
  printf("后序表达式为:\n");
  if (r==NULL)
  { printf("\n结果为:\n"); }
  else 
  {  f=evaluate(r);
     printf("\n结果为:%f\n",f);
  }
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -