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

📄 calcul.txt

📁 用C语言编写的计算器
💻 TXT
📖 第 1 页 / 共 2 页
字号:

#include "conio.h"
#include "bios.h"
#include "process.h"
#include "string.h"
#include "stdio.h"
#include <stdlib.h>
#include <graphics.h>
#include <math.h>
#include <ctype.h>
#include <dos.h>

#include <malloc.h>
/******************以下定义顺序存储结构的堆栈*/
#define  MAXNUM 1000   
    typedef struct{
         char stack[MAXNUM];
         long top;}stackchar;   /*定义操作符堆栈*/


   typedef struct{
         float stack[MAXNUM];
         long top;}stackfloat;   /*定义操作数堆栈*/


   stackchar  *OPTR;   /*存放运算符,注:一定要设置成指针类型*/
   stackfloat  *OPND;    /*存放操作数*/



/***************全局变量     定义保存屏幕区域的数组变量*/
     char buf00[3*3*2],buf10[3*3*2],buf20[3*3*2],buf30[3*3*2],buf40[3*3*2],
          buf50[3*3*2],buf60[3*3*2],buf70[3*3*2],buf80[3*3*2],buf90[3*3*2],
          bufadd0[3*3*2],bufsub0[3*3*2],bufmul0[3*3*2],bufdiv0[3*3*2],
          bufequ0[3*3*2],bufleft0[3*3*2],bufright0[3*3*2],
          bufshow0[55*13*2];   /*存放  按键后闪烁的变色按钮*/

     char buf0[3*3*2],buf1[3*3*2],buf2[3*3*2],buf3[3*3*2],buf4[3*3*2],
          buf5[3*3*2],buf6[3*3*2],buf7[3*3*2],buf8[3*3*2],buf9[3*3*2],
          bufadd[3*3*2],bufsub[3*3*2],bufmul[3*3*2],bufdiv[3*3*2],
          bufequ[3*3*2],bufleft[3*3*2],bufright[3*3*2],
          bufshow[55*13*2];  /*存放正常时的按钮*/ 


 /*----------函数原型----------------------*/

   void initsystem();  /*初始化计算器系统*/

   void reset(); /*复位*/
   void display();  /*显示按键*/


   char keytochar();
   float chartofloat();
/*---------函数原型定义结束-----------------------------*/    
       
   char precede(char a,char b);
       

   float operate(float a,char theta,float b);
      
   
       /*******以下为存储操作数和运算符号的堆栈**********************/
 void initstackchar(stackchar  *s);
        
 void initstackfloat(stackfloat  *s);
         
 void pushchar(stackchar *s,char x);        
   char popchar(stackchar *s);     
   char gettopchar(stackchar *s);        
   void pushfloat(stackfloat *s,float x);
   float popfloat( stackfloat *s);      
   float gettopfloat(stackfloat *s);
          
/*---------函数原型定义结束-----------------------------*/   
/**************************************/





  

       
  main()
  {
     int i;
     long m;
     long key;
     char chartemp;
     char theta;
     float a,b;
     char charkey;
     char ch2;
     float tempfloat;

 

     /*初始化堆栈*/
     initstackchar(OPTR);initstackfloat(OPND);
     pushchar(OPTR,'=');   /* 把= 号压入栈底*/
     
        
     initsystem();   /*初始化计算器*/
    
/****************************************************************/
         
        key=0;
        while(bioskey(1)==0);  /*等待键盘输入*/
        key=bioskey(0);charkey=keytochar(key);

        display(key);    /*调用显示按钮函数*/
        reset();

        m=0; 

      if(key!=4846)  /*ALT + R  */ 
      {  m++;  
        gotoxy(m,2);
        cprintf("%c",charkey);
      }


      
   
    while(1)   
    {
       

                 /**********检测是否对计算器复位************/
                 if(key==4864)     /*ALT+R  复位计算器*/
                 {
                          /*初始化堆栈*/
                          initstackchar(OPTR);
                          pushchar(OPTR,'=');   /* 把= 号压入栈底*/
                          initstackfloat(OPND);       
                          initsystem();   /*初始化计算器*/

                          key=0;
                          while(bioskey(1)==0);  /*等待键盘输入*/
                          key=bioskey(0);charkey=keytochar(key);

                          display(key);    /*调用显示按钮函数*/
                          reset();m=0;
                          m++;  
                          gotoxy(m,2);
                          cprintf("%c",charkey);
                 }
                 /**********检测是否对计算器复位************/

      
       while(!((charkey=='=')&&(gettopchar(OPTR)=='=')))  /*输入不是等号(注:以等号作为计算表达式的结束)*/
       {




                 /**********检测是否对计算器复位************/
                 if(key==4864)     /*ALT+R  复位计算器*/
                 {
                          /*初始化堆栈*/
                          initstackchar(OPTR);
                          pushchar(OPTR,'=');   /* 把= 号压入栈底*/
                          initstackfloat(OPND);       
                          initsystem();   /*初始化计算器*/

                          key=0;
                          while(bioskey(1)==0);  /*等待键盘输入*/
                          key=bioskey(0);charkey=keytochar(key);

                          display(key);    /*调用显示按钮函数*/
                          reset();m=0;
                          m++;  
                          gotoxy(m,2);
                          cprintf("%c",charkey);
                 }
                 /**********检测是否对计算器复位************/


             if(!((charkey=='+')||(charkey=='-')||(charkey=='*')||(charkey=='/')||(charkey=='(')||(charkey==')')))
             {
              tempfloat=chartofloat(charkey); 
             }          
            /*如果输入的不是运算符,即输入数*/
           while(!((charkey=='+')||(charkey=='-')||(charkey=='*')||(charkey=='/')||(charkey=='(')||(charkey==')')))
            {
/*@@@@@@@@@@@@@@@@@用于输入多位数字的处理  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
                  
                  
               
               while(bioskey(1)==0);  /*继续等待键盘输入*/
               key=bioskey(0); charkey=keytochar(key);              
               display(key);    /*调用显示按钮函数*/
               reset(); 
               m++;  
               gotoxy(m,2);
               cprintf("%c",charkey); 
                  if(!((charkey=='+')||(charkey=='-')||(charkey=='*')||(charkey=='/')||(charkey=='(')||(charkey==')')))   
                  {
                     tempfloat=tempfloat*10+chartofloat(charkey); 
                  }
                  else
                  {  pushfloat(OPND,tempfloat);    }



/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
                 
               


               
            }
            
           
          while((charkey=='+')||(charkey=='-')||(charkey=='*')||(charkey=='/')||(charkey=='(')||(charkey==')'))
               /*输入操作符*/
          {    
              
                switch(precede(gettopchar(OPTR),charkey))  /*比较优先级*/
                { 
                   case '<':   /*栈顶元素优先权低*/

                      pushchar(OPTR,charkey);
                      while(bioskey(1)==0);  /*继续等待键盘输入*/
                      key=bioskey(0);charkey=keytochar(key); 
                      
                      display(key);    /*调用显示按钮函数*/
                      reset();
                      m++;  
                      gotoxy(m,2);
                      cprintf("%c",charkey);

                      break;
       

                   case '=':     /*脱括弧,并接收下一个字符*/
                      popchar(OPTR);
                      while(bioskey(1)==0);  /*继续等待键盘输入*/
                      key=bioskey(0); charkey=keytochar(key);
                     

                      display(key);    /*调用显示按钮函数*/
                      reset();
                      m++;  
                      gotoxy(m,2);
                      cprintf("%c",charkey);

                      break;

                   case '>':       /*退栈并将运算结果入栈*/
                       theta=popchar(OPTR);  b=popfloat(OPND);  a=popfloat(OPND);
                       pushfloat(OPND,operate(a,theta,b));break;
                   case 'F':


                      m++;  
                      gotoxy(m,2);
                     


                       cprintf("You input wrongly!");
                       while(bioskey(1)==0);  /*继续等待键盘输入*/
                      key=bioskey(0); charkey=keytochar(key);


                }/*  End of switch()*/
           }/*else*/
           
       }/*while()输入不是等号=*/



     a=gettopfloat(OPND);
     m++;  
     gotoxy(m,2);
     cprintf("%f",a);
 


               /**********************以下用于复位   ALT+R   ******************************************/
              while(bioskey(1)==0);  /*等待键盘输入*/
              key=bioskey(0);charkey=keytochar(key);
              while(key!=4864)
              {
                 while(bioskey(1)==0);  /*等待键盘输入*/
                 key=bioskey(0);charkey=keytochar(key);
              } 
              /****************************************************************/       
     }  /*while(1)  */
  

    
  }   /*主函数main()结束*/





/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
         /**以下为各个子函数*/
 
   
   char precede(char a,char b)
       {
          switch(a)
            {
                  case '+':
                            switch(b)
                            {
                                 case '+':return('>');
                                 case '-':return('>');
                                 case '*':return('<');
                                 case '/':return('<');
                                 case '(':return('<');
                                 case ')':return('>');
                                 case '=':return('>');

                            }
                  case '-':
                            switch(b)
                            {
                                 case '+':return('>');
                                 case '-':return('>');
                                 case '*':return('<');
                                 case '/':return('<');
                                 case '(':return('<');
                                 case ')':return('>');
                                 case '=':return('>');

                            }
                 case '*':
                            switch(b)
                            {
                                 case '+':return('>');
                                 case '-':return('>');
                                 case '*':return('>');
                                 case '/':return('>');
                                 case '(':return('<');
                                 case ')':return('>');
                                 case '=':return('>');
                           }
                  case '/':
                            switch(b)
                            {
                                 case '+':return('>');
                                 case '-':return('>');
                                 case '*':return('>');
                                 case '/':return('>');
                                 case '(':return('<');
                                 case ')':return('>');
                                 case '=':return('>');

                            }
                 case '(':
                            switch(b)
                            {
                                 case '+':return('<');
                                 case '-':return('<');
                                 case '*':return('<');
                                 case '/':return('<');
                                 case '(':return('<');
                                 case ')':return('=');
                                 case '=':return('F');/*返回错误*/}
                 case ')':
                            switch(b)
                            {
                                 case '+':return('>');
                                 case '-':return('>');
                                 case '*':return('>');
                                 case '/':return('>');
                                 case '(':return('F');/*返回错误*/
                                 case ')':return('>');
                                 case '=':return('>');}
                case '=':
                            switch(b)
                            {
                                 case '+':return('<');
                                 case '-':return('<');
                                 case '*':return('<');
                                 case '/':return('<');
                                 case '(':return('<');
                                 case ')':return('F');/*返回错误*/
                                 case '=':return('=');}


            }  /*switch(a)*/
       }

   float operate(float a,char theta,float b)
        {
             switch(theta)
                {
                   case '+':return(a+b);
                   case '-':return(a-b);
                   case '*':return(a*b);
                   case '/':return(a*1.0/b);
                }
        }
   
 /*******以下为存储操作数和运算符号的堆栈**********************/
 void initstackchar(stackchar  *s)
          {
              s=(stackchar*)malloc(sizeof(stackchar));
              s->top=-1;

           }
 void initstackfloat(stackfloat  *s)
          {
              s=(stackfloat*)malloc(sizeof(stackfloat));
              s->top=-1;

           }

 void pushchar(stackchar *s,char x)
          {
            s->top++;
            s->stack[s->top]=x;          

          }


   char popchar(stackchar *s)     
          {
            char x;
            x=s->stack[s->top]; 
            s->top--;
            return(x);         
          }

   char gettopchar(stackchar *s)
          {            
            return(s->stack[s->top]);          
          }



   void pushfloat(stackfloat *s,float x)
          {
            s->top++;
            s->stack[s->top]=x;          

          }


   float popfloat( stackfloat *s)      
          {
            float x;
            x=s->stack[s->top]; 
            s->top--;
            return(x);         
          }

   float gettopfloat(stackfloat *s)
          {            
            return(s->stack[s->top]);          
          }

/**************************************/

  void initsystem()
   {
     textbackground(WHITE);            /*设置总窗口背景色*/
     clrscr();     /*总窗口背景着色*/
 
     window(1,1,80,1);    /*定义一个文本窗口*/
     textbackground(RED);    /*设置窗口背景色*/ 
     textcolor(BLACK);
     clrscr();
      gotoxy(1,1);
      printf("Instruction:  Reset---ALT+R;     Result--- =");





     /*****以下设置提示:  如何输入公式       窗口*********************************************/
        
      window(22,17,67,22);    /*定义一个文本窗口*/
     textbackground(GREEN);    /*设置窗口背景色*/ 
     textcolor(WHITE);
     clrscr();
      gotoxy(1,1);
      printf("You should input as following:");
      gotoxy(1,2);
      printf("      (   )=    ");
      gotoxy(1,3);
      printf("For example:   (2-3/(3+7*2)-9)=   ");

    
   /***********************************************************************************/
    /**闪烁按钮*********************************************************************************/
   /*********以下为 + - * / 的按钮******************************/
     /*Button "+"*/
     window(2,3,4,5);
     textbackground(BLUE);    /*设置窗口背景色*/ 
     textcolor(RED);
     clrscr();
      gotoxy(2,2);
      printf("+");
      gettext(2,3,4,5,bufadd0);

    /*Button "-"*/
     window(6,3,8,5);
     textbackground(BLUE);    /*设置窗口背景色*/ 
     textcolor(RED);
     clrscr();
      gotoxy(2,2);
      printf("-");
      gettext(6,3,8,5,bufsub0);


    /*Button "*"*/
     window(10,3,12,5);
     textbackground(BLUE);   
     textcolor(RED);
     clrscr();
      gotoxy(2,2);
      printf("*");gettext(10,3,12,5,bufmul0);

    /*Button "/"*/
     window(14,3,16,5);
      textbackground(BLUE);   
     textcolor(RED);
     clrscr();
      gotoxy(2,2);

⌨️ 快捷键说明

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