[方案相关] 四则运算计算器算法

[复制链接]
 楼主| 发表于 2025-6-23 13:59 | 显示全部楼层 |阅读模式
  1.   /**************************************************************************************
  2.                 *                              四则运算计算器                                                                                                  *
  3.                 *          键盘使用:s1-s16分别为:0,1,2,3,4,5,6,7,8,9,+,-,*,/,(,),共16个键
  4.                 *                k1-k3  分别为:= ~ .
  5.                 *     连接方法:P24连K1, J20连JP3, 插上LCD1602
  6.                 *     三步走策略,如下:
  7.                 *          1.输入,解决按键响应问题。2022.1.1解决!
  8.                 *     2.输出,解决显示问题。        2022.1.2解决!2022.1.3完善!
  9.                 *     3.运算,解决四则运算问题。
  10.                             (1)解决状态机问题。     2022.1.4解决!
  11.                                 (2)确定状态机能工作                2022.1.5解决!
  12.                                 (3)解决运算问题。                2022.1.6初成!
  13.                 *     4.排查,检测边界情况。        2022.1.6大致解决,仍有瑕疵!                                                                      
  14.                 *                                                                                                                                                                          *
  15.                 ***************************************************************************************/
  16.                
  17.                 #include <reg51.h>           //此文件中定义了51的一些特殊功能寄存器
  18.                 #include "stdio.h"
  19.                 #include "stdlib.h"           //此文件中有内存池初始化函数
  20.                 #include <math.h>
  21.                 #define uchar unsigned char
  22.                 #define uint unsigned int
  23.                 #define  MAX_LEN 10
  24.                 sbit EN=P2^7;  //LCD的使能引脚
  25.                 sbit RS=P2^6;  //LCD数据命令选择端
  26.                 sbit RW=P2^5;  //LCD的读写选择端
  27.                
  28.                 //19个键盘
  29.                 sbit K1=P2^4;   //= 键
  30.                 sbit K2=P2^3;   //~ 键
  31.                 sbit K3=P2^2;   //. 键
  32.                 uchar KEY_CODE[]={ 0xee,0xde,0xbe,0x7e,//4X4矩阵键盘键值表,0-9, + - * / ( ), 共16个
  33.                                                    0xed,0xdd,0xbd,0x7d,
  34.                            0xeb,0xdb,0xbb,0x7b,
  35.                            0xe7,0xd7,0xb7,0x77};
  36.                 //定义字符键值表
  37.                 uchar CHAR_TABLE[]={0x30,0x31,0x32,0x33,//这四个会在液晶显示器中显示0 1 2 3
  38.                                     0x34,0x35,0x36,0x37,//这四个会显示4 5 6 7
  39.                                                         0x38,0x39,0x2b,0x2d,//这个四个会显示8 9 + -
  40.                                                         0x2a,0x2f,0x28,0x29,//这个四个会显示* / ( )
  41.                                                         0x3d,0x7e,0x2e};        //这三个会显示= ~ . 共19个
  42.                 //运算优先级表,不使用,太占内存
  43.                 /*uchar PRIORITY[]={'>','>','<','<','<','>',//先行后列,顺序为+ - * / ( )
  44.                                                   '>','>','<','<','<','>',
  45.                                                   '>','>','>','>','<','>',
  46.                                                   '>','>','>','>','<','>',
  47.                                                   '<','<','<','<','<','=',
  48.                                                   '>','>','>','>',' ','>'};*/
  49.        
  50.                 void scanf_(uchar *var);//从矩阵键盘中获取值
  51.                 void print(uchar outStr);//打印字符串
  52.                 void delay5MS();
  53.                 void delay100MS();

  54.                 void writeCMD(uchar com);//写命令子程序
  55.                 void showOneChar(uchar dat);//写数据子程序
  56.                 void init();//初始化子程序,初始化液晶显示屏
  57.                 void clear();//清除显示屏上的显示

  58.                 //核心处理函数
  59.                 uchar stateChange(uchar inp);
  60.                 //比较优先级函数
  61.                 uchar cp_priority(uchar cur);
  62.                 //计算函数
  63.                 void calculate(uchar inp);
  64.                 //检查除法异常函数
  65.                 uchar jd_abnormal();
  66.                 //状态刷新函数,核心处理函数开头
  67.                 void rf_state();
  68.                 //获取状态类别
  69.                 uchar getClass(uchar var);
  70.                 //压栈函数
  71.                 void push_st(uchar inp);
  72.                 //更新tmp值
  73.                 void getTmp(uchar inp);
  74.                 //最终运算
  75.                 void last_cal(double op2, double op1, uchar opr);
  76.                 //显示最终结果
  77.                 void showAns();


  78.                 //建立堆栈                 
  79.                  uchar str[10];//符号堆栈
  80.                  double std[5];//数堆栈
  81.                  //栈顶位置
  82.                  int topd = -1;
  83.                  int topr = -1;
  84.                  //暂存数据
  85.                  double tmp = 0;
  86.                  //状态标志位
  87.                  uchar state = 0;//共8个状态,具体所指请看文档
  88.                  uchar current = 0;//指示当前状态,tmp处理使用
  89.                  uchar bracket = 0;//括号状态,0无或有右括号,1有左括号
  90.                  uchar negative = 0;//负号状态,0无符号,1有负号
  91.                  uchar point = 0;//点状态,0无点,1有点
  92.                  uchar pl = 0;//点位置,0初始位,值为当前是点后第几位
  93.                  uchar sfs = 0;//可能的除0异常状态,0表示当前可能异常,1代表没异常
  94.                
  95.                
  96.         void main()
  97.                 {

  98.                  //准备工作,其中num为获取的键盘字符。
  99.                  uchar num=0xff;
  100.                  //app
  101.                  int ts = 0;
  102.                  init();
  103.                  //初始化堆栈
  104.                  //init_mempool(&str, sizeof(str));
  105.                  //init_mempool(&std, sizeof(std));

  106.                  while(1)
  107.                  {                     
  108.                          scanf_(&num);
  109.                         current = getClass(num);//(1)获取当前输入的状态
  110.                         if(stateChange(num))//当输入有效
  111.                         {
  112.                                 //app处理满屏问题
  113.                                 if(ts == 10)
  114.                                 {
  115.                                         init();
  116.                                         ts = 0;
  117.                                 }
  118.                                 push_st(num);
  119.                                 if(num != '=')//等号特殊,必须先输出
  120.                                         print(num);                       
  121.                                 state = current;//(1)更新state状态
  122.                                
  123.                                 //app
  124.                                 ++ts;       
  125.                         }       
  126.                  }
  127.                 }
  128.      /**********从键盘获取值得函数类似于C语言的scanf()函数**************/                               
  129.         void scanf_(uchar *var)
  130.                 {
  131.                    uchar temp,num;
  132.                    int i=1;
  133.                    temp=i;

  134.                   
  135.                   
  136.                         while(1){

  137.              if(!K1)
  138.                          {
  139.                                  delay100MS(); //延时,软件消除抖动。
  140.                              if(!K1)
  141.                                  {
  142.                                          while(!K1);
  143.                                     *var = '=';
  144.                                         break;
  145.                                  }
  146.                          }
  147.                          else if(!K2)
  148.                          {
  149.                                  delay100MS(); //延时,软件消除抖动。
  150.                              if(!K2)
  151.                                  {
  152.                                          while(!K2);
  153.                                     *var = '~';
  154.                                         break;
  155.                                  }
  156.                          }
  157.                          else if(!K3)
  158.                          {
  159.                                  delay100MS(); //延时,软件消除抖动。
  160.                              if(!K3)
  161.                                  {
  162.                                          while(!K3);
  163.                                     *var = '.';
  164.                                         break;
  165.                                  }
  166.                          }

  167.                      P1 = 0x0f;//置行为高电平,列为低电平。这样用于检测行值。
  168.                          if(P1!=0x0f)
  169.                          {
  170.                              delay100MS(); //延时,软件消除抖动。
  171.                                  temp=P1; //保存行值
  172.                                  P1=0xf0; //置行为低电平,列为高电平,获取列
  173.                                    if(P1!=0xf0)
  174.                                 {
  175.                                   num=temp|P1; //获取了按键位置
  176.                                   //P2=1;
  177.                                   for(i=0;i<16;i++)
  178.                                    if(num==KEY_CODE[i])
  179.                                         {
  180.                                           
  181.                                            if(i==10)*var='+';//获取加号的值
  182.                                        else if(i==11)*var='-';//获取减号的值
  183.                                            else if(i==12)*var='*';//获取乘号的值
  184.                                            else if(i==13)*var='/';//获取除号的值
  185.                                            else if(i==14)*var='(';//获取左括号号的值
  186.                                            else if(i==15)*var=')';//获取右括号的值
  187.                                    else *var=i;//获取数值
  188.                                      
  189.                                     }
  190.                                    break;        //跳出循环,为了只获取一个值
  191.                                  }
  192.                          }         
  193.                         }

  194.                   }

  195.         /******************显示函数***************************/
  196.     void print(uchar arr)
  197.         {         
  198.     uint t=0,j=0;
  199.         uint location;
  200.          if(arr == '=') location = 16;
  201.          else if(arr == '~')location = 17;
  202.          else if(arr == '.')location = 18;
  203.          else if(arr == '+')location = 10;
  204.          else if(arr == '-')location = 11;
  205.          else if(arr == '*')location = 12;
  206.          else if(arr == '/')location = 13;
  207.          else if(arr == '(')location = 14;
  208.          else if(arr == ')')location = 15;
  209.          else{
  210.                 for(j=0;j<10;j++)
  211.                 if(arr == j)location = j;
  212.                  }

  213.          showOneChar(CHAR_TABLE[location]);       
  214.           
  215.         }
  216.                
  217.     /*********************短延时函数*************************/
  218.                   void delay5MS()
  219.                   {
  220.                     int n=3000;
  221.                         while(n--);
  222.                   }

  223.    /*****************定义长点的延时程序**********************/
  224.          void delay100MS()
  225.           {
  226.             uint n=10000;
  227.                 while(n--);
  228.           }
  229.    /*******************写命令子程序**************************/
  230.            void writeCMD(uchar com)
  231.         {
  232.             P0=com;          //com为输入的命令码。通过P2送给LCD
  233.             RS=0;      //RS=0选择指令寄存器
  234.             RW=0;           //RW=0为写
  235.                 delay5MS();          
  236.                 EN=1;      //LCD的使能端E置高电平,读取信息
  237.                 delay5MS();
  238.                 EN=0;       //LCD的使能端E置低电平,执行指令
  239.           
  240.         }
  241.   /*******************写数据子程序**************************/
  242.         void showOneChar(uchar dat)
  243.         {
  244.                 P0=dat;           //写入数据
  245.                 RS=1;      //RS=1选择数据寄存器
  246.                 RW=0;           //RW=0为写
  247.                 EN=1;           //读取信息
  248.                 delay5MS();
  249.                 EN=0;           //执行指令
  250.           
  251.          }
  252. /*******************初始化函数**************************/
  253.          void init()
  254.          {
  255.                 EN=0;      
  256.                 writeCMD(0x38);//设置显示模式
  257.              writeCMD(0x0e);//光标打开,不闪烁
  258.                 writeCMD(0x06);//写入一个字符后指针地址+1,写一个字符时整屏不移动
  259.                 writeCMD(0x01);//清屏显示,数据指针清0,所以显示清0
  260.                 writeCMD(0x80);//设置字符显示的首地址,指明了数据块的首地址为P0
  261.          }

  262. /*********************清屏子程序**********************/
  263.   void clear()
  264.   {
  265.     EN=0;
  266.         writeCMD(0x01);
  267.    
  268.   }


  269.   /*********************核心处理函数**********************/
  270.   uchar stateChange(uchar inp)
  271.   {
  272.   //刷新所有状态
  273.   rf_state();
  274.   //状态机分类处理
  275.   if(inp>=0&&inp<=9)//1类输入*********
  276.   {
  277.    
  278.           if(4 != state && 7 != state)//有效,但要考虑可能的异常情况
  279.         {
  280.                 //考虑除数异常状况
  281.                 if(inp == 0&&state==2&&str[topr]=='/')
  282.                         sfs = 1;
  283.                 else
  284.                         sfs = 0;
  285.                 //考虑点可能存在
  286.                 if(1 == point)
  287.                         pl++;
  288.                 //处理tmp入栈,注意负号,点存在,点位置-------------交给push函数了-------------------               
  289.         return 1;
  290.         }
  291.   }
  292.   else if(inp=='+'||inp=='-'||inp=='*'||inp=='/')//2类输入*********
  293.   {
  294.           if((state==1||state==4||state==7)&&!jd_abnormal())//有效,
  295.         {
  296.                 if(topr != -1)//当符号栈不空,才进入比较与计算
  297.                 calculate(inp);
  298.         return 1;
  299.         }
  300.   }
  301.   else if(inp=='(')//3类输入*********
  302.   {
  303.           if((state==0||state==2)&&bracket==0)//有效
  304.         {
  305.         bracket = 1;
  306.         return 1;
  307.         }
  308.   }
  309.   else if(inp==')')//4类输入*********
  310.   {
  311.           if(state==1&&bracket==1&&!jd_abnormal())//有效
  312.         {
  313.         //test,(数)没考虑
  314.         calculate(inp);
  315.         bracket = 0;
  316.         return 1;
  317.         }
  318.   }
  319.   else if(inp=='~')//5类输入*********
  320.   {
  321.           if(state==0||state==2||state==3)//有效
  322.         {
  323.         negative = 1;
  324.         return 1;
  325.         }
  326.   }
  327.   else if(inp=='.')//6类输入*********
  328.   {
  329.           if(state==1&&point==0)//有效
  330.         {
  331.         point = 1;
  332.         return 1;
  333.         }
  334.   
  335.   }
  336.   else if(inp=='=')//7类输入*********
  337.   {
  338.           if(bracket==0&&(state==1||state==4)&&!jd_abnormal())//有效
  339.         {
  340.         print(inp);//等号特殊,先显示等号
  341.         calculate(inp);//再进行计算
  342.         return 1;
  343.         }
  344.   }

  345.   return 0;//0为无效,1为有效
  346.   }

  347.   /********************比较优先级函数**********************/
  348.   uchar cp_priority(uchar cur)//竖着输入,cur为当前有效输入
  349.   {
  350.   uchar res='=';
  351.   if(cur=='+')//输入是加号
  352.   {
  353.           if(str[topr]=='+')
  354.                 res = '>';
  355.         else if(str[topr]=='-')
  356.                 res = '>';
  357.         else if(str[topr]=='*')
  358.                 res = '>';
  359.         else if(str[topr]=='/')
  360.                 res = '>';
  361.         else if(str[topr]=='(')
  362.                 res = '<';
  363.         else if(str[topr]==')')
  364.                 res = '>';
  365.   }
  366.   else if(cur=='-')//输入是减号
  367.   {
  368.           if(str[topr]=='+')
  369.                 res = '>';
  370.         else if(str[topr]=='-')
  371.                 res = '>';
  372.         else if(str[topr]=='*')
  373.                 res = '>';
  374.         else if(str[topr]=='/')
  375.                 res = '>';
  376.         else if(str[topr]=='(')
  377.                 res = '<';
  378.         else if(str[topr]==')')
  379.                 res = '>';
  380.   }
  381.   else if(cur=='*')//输入是乘号
  382.   {
  383.           if(str[topr]=='+')
  384.                 res = '<';
  385.         else if(str[topr]=='-')
  386.                 res = '<';
  387.         else if(str[topr]=='*')
  388.                 res = '>';
  389.         else if(str[topr]=='/')
  390.                 res = '>';
  391.         else if(str[topr]=='(')
  392.                 res = '<';
  393.         else if(str[topr]==')')
  394.                 res = '>';
  395.   }
  396.   else if(cur=='/')//输入是除号
  397.   {
  398.           if(str[topr]=='+')
  399.                 res = '<';
  400.         else if(str[topr]=='-')
  401.                 res = '<';
  402.         else if(str[topr]=='*')
  403.                 res = '>';
  404.         else if(str[topr]=='/')
  405.                 res = '>';
  406.         else if(str[topr]=='(')
  407.                 res = '<';
  408.         else if(str[topr]==')')
  409.                 res = '>';
  410.   }
  411.   else if(cur=='(')//输入是左括号
  412.   {
  413.           if(str[topr]=='+')
  414.                 res = '<';
  415.         else if(str[topr]=='-')
  416.                 res = '<';
  417.         else if(str[topr]=='*')
  418.                 res = '<';
  419.         else if(str[topr]=='/')
  420.                 res = '<';
  421.         else if(str[topr]=='(')
  422.                 res = '<';
  423.         else if(str[topr]==')')
  424.                 res = ' ';
  425.   }
  426.   else if(cur==')')//输入是右括号
  427.   {
  428.           if(str[topr]=='+')
  429.                 res = '>';
  430.         else if(str[topr]=='-')
  431.                 res = '>';
  432.         else if(str[topr]=='*')
  433.                 res = '>';
  434.         else if(str[topr]=='/')
  435.                 res = '>';
  436.         else if(str[topr]=='(')
  437.                 res = '=';
  438.         else if(str[topr]==')')
  439.                 res = '>';
  440.   }
  441.   else if(cur=='=')//遗漏情况
  442.           res = '>';

  443.   return res;//res为比较符号
  444.   }
  445.   /*********************计算函数**********************/               
  446.   void calculate(uchar inp)
  447.   {
  448.   //操作数和操作号
  449.   double op1 = 0;
  450.   double op2 = 0;
  451.   uchar opr = '=';

  452.   uchar cp = '=';
  453.           cp = cp_priority(inp);
  454.           if(cp == '>')//执行运算-------注意=情况没讨论------------------------------
  455.           {
  456.                 if(inp == ')')//右括号情况特殊,
  457.                 {
  458.                         //对于括号内部,可能需要连环操作,如(1+2*3)=
  459.                         while(str[topr]!='(')
  460.                         {
  461.                                 opr = str[topr--];//运算号出栈

  462.                                 op1 = std[topd--];//运算数1出栈
  463.                                 op2 = std[topd--];//运算数2出栈

  464.                                 last_cal(op2, op1, opr);
  465.                         }
  466.                         //对于括号外部,左括号的到来容易造成堆积---如1+2*(7),留给最后等号处理--------------------
  467.                         topr--;
  468.                         //test
  469.                         //print(str[topr]);
  470.                 }               
  471.                 else
  472.                 {
  473.                         opr = str[topr--];//运算号出栈

  474.                         op1 = std[topd--];//运算数1出栈
  475.                         op2 = std[topd--];//运算数2出栈

  476.                         last_cal(op2, op1, opr);
  477.                 }
  478.                                
  479.                 //test,error,can't go here------------因为在if中------------------------                       
  480.           }

  481.         if(cp == '=')//左括号和右括号临近时
  482.                 topr--;

  483.         if(inp == '=')//最终结果可能需要多次运算,直到栈内剩下一个数
  484.         {
  485.                 //test
  486.                 /*print('*');
  487.                 tmp=op2;
  488.                 showAns();
  489.                 print(opr);
  490.                 tmp=op1;
  491.                 showAns();
  492.                 print('*');*/

  493.                 while(topd!=0)//没到底,就算到底----------------------------------
  494.                 {
  495.                         opr = str[topr--];//运算号出栈

  496.                         op1 = std[topd--];//运算数1出栈
  497.                         op2 = std[topd--];//运算数2出栈

  498.                         last_cal(op2, op1, opr);
  499.                 }
  500.                 tmp = std[topd]; //到底了,输出结果
  501.                 showAns();
  502.                
  503.         }

  504.   }
  505.   /*********************检查除法异常函数**********************/
  506.   uchar jd_abnormal()
  507.   {
  508.           if(sfs==1)
  509.           {       
  510.           //数出栈--------------------------------------------------------
  511.         topd--;
  512.         //回复到前前状态
  513.         sfs = 0;
  514.         state = 2;
  515.         //输入无效
  516.         return 1;
  517.           }
  518.   return 0;//0为正常,1为异常   
  519.   }

  520.   /*********************状态刷新函数**********************/
  521.   void rf_state()
  522.   {
  523.           if(state!=1&&state!=5&&state!=6)//当上一个输入和数无关,重置和数相关的所有状态位和暂存数
  524.           {
  525.         negative = 0;
  526.         point = 0;
  527.         pl = 0;
  528.         tmp = 0;//不知为何出错-----------旧版本编译器缺少处理浮点数的c51fs.lib文件----------------------------------------------------
  529.           }
  530.   }

  531.   /*********************获取状态类别函数*********************/
  532.   uchar getClass(uchar inp)
  533.   {
  534.   if(inp>=0&&inp<=9)
  535.           return 1;

  536.   else if(inp=='+'||inp=='-'||inp=='*'||inp=='/')
  537.           return 2;

  538.   else if(inp=='(')
  539.           return 3;

  540.   else if(inp==')')
  541.           return 4;

  542.   else if(inp=='~')
  543.           return 5;

  544.   else if(inp=='.')
  545.           return 6;

  546.   else if(inp=='=')
  547.           return 7;

  548.   return 0;
  549.   }
  550.   /*********************压栈函数*********************/
  551.   void push_st(uchar inp)
  552.   {
  553.           if(current==1)//压数,注意考虑和数相关的negative,point,pl,tmp----------------------------------
  554.         {
  555.                 getTmp(inp);//有效输入到当前为止的数是tmp
  556.                 if(state!=1&&state!=6)//当上一次输入的不是数字,说明上一次没存数,入栈
  557.                 {
  558.                         topd++;
  559.                         std[topd] = tmp;
  560.                 }
  561.                 else //当上一次输入的是数字,则覆盖上次的数
  562.                         std[topd] = tmp;
  563.         }
  564.         else if(current==2||current==3||current==4)//压符号[=-*/][(][)]
  565.         {
  566.                 if(inp != ')')//右括号需要特殊处理
  567.                 {
  568.                         topr++;
  569.                         str[topr] = inp;
  570.                 }

  571.                 /*if(str[topr] ==')'&&str[topr-1]=='(')//当栈顶是右括号,并且临近为左括号,两者一起出栈
  572.                 {
  573.                         topr--;
  574.                         topr--;
  575.                 }*/
  576.         }
  577.                
  578.   }
  579.   /*********************压栈函数*********************/
  580.   void getTmp(uchar inp)//考虑负号,点,点位置
  581.   {
  582.           uchar i = 1;
  583.           double base = 1;
  584.           char tpch[MAX_LEN*2];

  585.           //tmp = abs(tmp);//可能有副作用------舍去---------------------------------
  586.           sprintf(tpch, "%g", tmp);//判断栈顶数正负的准备
  587.           if(point==0)//当不存在小数
  588.           {
  589.                         if(tpch[0]>='0'&&tpch[0]<='9')
  590.                                   tmp = tmp*10+inp;
  591.                         else
  592.                                 tmp = tmp*10-inp;
  593.                                
  594.           }
  595.           else//当存在小数
  596.           {
  597.                   //获取小数部分
  598.                   for(i=1; i<=pl; ++i)
  599.                 {
  600.                         base = base/10*1.0;
  601.                 }
  602.                         if(tpch[0]>='0'&&tpch[0]<='9')
  603.                                 tmp = tmp+base*inp;
  604.                         else
  605.                                 tmp = tmp-base*inp;
  606.                 //test-----fixed--------
  607.           }

  608.           if(negative == 1)//存在负号
  609.           {
  610.                   if(tpch[0]>='0'&&tpch[0]<='9')
  611.                         tmp = (-1.0)*tmp;//abs副作用可能----确实,小数点后消失-----------------------
  612.           }
  613.                  

  614.                 //test
  615.                 //if(topd == 0+0x30)
  616.                 test

  617.                 //test('*');
  618.                
  619.                  
  620.   }
  621.   /*********************显示答案函数*********************/
  622.   void showAns()
  623.   {
  624.     char bun[MAX_LEN*2];
  625.         uint m = 0;
  626.         tmp *= 1.0;//如果不乘以1.0,会出现小数点后面消失的情况

  627.           sprintf(bun,"%g",tmp);
  628.         while(1)
  629.         {
  630.               if(bun[m] == '\0')
  631.           break;
  632.               else
  633.                   {
  634.                         if(bun[m] == '.'||bun[m] == '-')
  635.                                 print(bun[m]);       
  636.                         else       
  637.                                   print(bun[m]-0x30);
  638.                                m++;
  639.               }
  640.          }
  641.   }
  642.   /*********************显示答案函数*********************/
  643.   void last_cal(double op2, double op1, uchar opr)
  644.   {
  645.     //计算
  646.           if(opr == '+')
  647.                 tmp = op2 + op1;
  648.         else if(opr == '-')
  649.                 tmp = op2 - op1;
  650.         else if(opr == '*')
  651.                 tmp = op2 * op1;
  652.         else if(opr == '/')
  653.                 tmp = op2 / op1 * 1.0;
  654.         //结果入栈
  655.         topd++;
  656.         std[topd] = tmp;
  657.   }



发表于 2025-6-30 16:24 | 显示全部楼层
代码已实现了按键输入、LCD 显示和基本状态机框架
发表于 2025-6-30 23:35 | 显示全部楼层
边界情况处理
除零错误:在除法运算时检查除数是否为零
括号匹配:确保左右括号数量一致
运算溢出:检测运算结果是否超出范围
输入长度限制:限制表达式最大长度
您需要登录后才可以回帖 登录 | 注册

本版积分规则

332

主题

11196

帖子

13

粉丝
快速回复 返回顶部 返回列表