莲华呵 2021-09-02 15:27 采纳率: 100%
浏览 54
已结题

用c#写的计算器,不知为何会出现越界问题,但放在c++里就能完美运行

vs2019,有没有猛男知道啊,重金悬赏5块大洋。



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 超级无敌宇宙第一无上至尊金光霹雳计算器___
{
    

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public class zijixiedezhan
        {
            private int size = -1;
            private double[] sss = new double[1000];
            public bool mypush(double x)
            {
                sss[++size] = x;
                return true;
            }
            public void mypop()
            {
                size--;
            }
            public void myclear()
            {
                size = -1;
            }
            public double mytop()
            {
                return sss[size];
            }
            public bool myempty()
            {
                if (size == -1)
                    return true;
                else return false;
            }
        }
        
        zijixiedezhan s = new zijixiedezhan();
        double num1, num2;
        private void button1_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="";
            textDisplay.Text += "0";
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="1";
            else
                textDisplay.Text += "1";
        }

        private void button2_Click_1(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="9";
            else
                textDisplay.Text += "9";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            string shizi = textDisplay.Text;//利用中缀转后缀进行计算
            double linshizhi = 0;
            double jieguo = 0;
            double[] houzhui = new double[500];
            int ii = 0;
            for (int i=0;i<shizi.Length;i++)//中缀转后缀
            {
                
                if (shizi[i] > 47 && shizi[i] < 58 || shizi[i] == '.')//判断是否是数字
                {
                    houzhui[ii++] = shizi[i];
                    if (i == shizi.Length - 1)
                        houzhui[ii++] = '|';
                }
                else//是操作符
                {
                    houzhui[ii++] = '|';
                    if (s.myempty())
                    {
                        s.mypush(shizi[i]);
                    }
                    else
                    {
                        if (shizi[i] == '(')
                            s.mypush(shizi[i]);
                        else if (shizi[i] == ')')
                        {
                            while (s.mytop() != '(')
                            {
                                houzhui[ii] = s.mytop();
                                ii++;
                                s.mypop();
                            }
                            s.mypop();
                        }
                        else if(shizi[i]=='+'||shizi[i]=='-')
                        {
                                while (s.mytop()=='+'|| s.mytop() == '-' || s.mytop() == '×' || s.mytop ()== '÷' )
                            {
                                houzhui[ii] = s.mytop();
                                ii++;
                                s.mypop();
                                if (s.myempty())
                                    break;
                            }
                            s.mypush(shizi[i]);
                        }
                        else if (shizi[i] == '×' || shizi[i] == '÷')
                        {
                                while ( s.mytop() == '×' || s.mytop() == '÷' ) 
                            {
                                houzhui[ii] = s.mytop();
                                ii++;
                                s.mypop();
                                if (s.myempty())
                                    break;
                            }
                            s.mypush(shizi[i]);
                        }
                    }
                }
            }
            while(!s.myempty())//将栈里剩余的操作符放入后缀表达式
            {
                houzhui[ii] = s.mytop();
                ii++;
                s.mypop();
            }
            for(int i=0;i<houzhui.Length;i++)//后缀表达式计算求值
            {
                if (houzhui[i] > 47 && houzhui[i] < 58)//判断是否是数字
                {
                    linshizhi = linshizhi * 10 + houzhui[i] - 48;
                }
                else if (houzhui[i] == '.')
                {
                    double point = 10;
                    i++;
                    while (houzhui[i] > 47 && houzhui[i] < 58)
                    {
                        linshizhi += (houzhui[i] - 48) / point;
                        point *= 10;
                        i++;
                    }
                    i--;
                }
                else if (houzhui[i] == '|')
                {
                    s.mypush(linshizhi);
                    linshizhi = 0;
                }
                else
                {
                    num2 = s.mytop();
                    s.mypop();
                    num1 = s.mytop();
                    s.mypop();
                    if (houzhui[i] == '×')
                    {
                        jieguo = num1 * num2;
                        s.mypush(jieguo);
                    }
                    else if (houzhui[i] == '÷')
                    {
                        jieguo = num1 / num2;
                        s.mypush(jieguo);
                    }
                    else if (houzhui[i] == '+')
                    {
                        jieguo = num1 + num2;
                        s.mypush(jieguo);
                    }
                    else if (houzhui[i] == '-')
                    {
                        jieguo = num1 - num2;
                        s.mypush(jieguo);
                    }
                }
            }
            jieguo = s.mytop();
            s.myclear();
            textDisplay.Text = jieguo.ToString();
        }

        private void b2_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="2";
            else
                textDisplay.Text += "2";
        }

        private void b3_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="3";
            else
                textDisplay.Text += "3";
        }

        private void b4_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="4";
            else
                textDisplay.Text += "4";
        }

        private void b5_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="5";
            else
                textDisplay.Text += "5";
        }

        private void dian_Click(object sender, EventArgs e)
        {
            if(string.IsNullOrEmpty(textDisplay.Text))
                textDisplay.Text += "0.0";
            else if(!textDisplay.Text.Contains("."))
                textDisplay.Text += ".";
        }

        private void jia_Click(object sender, EventArgs e)
        {
            textDisplay.Text += "+";
        }

        private void jian_Click(object sender, EventArgs e)
        {
            textDisplay.Text += "-";
        }

        private void cheng_Click(object sender, EventArgs e)
        {
            textDisplay.Text += "×";
        }

        private void chu_Click(object sender, EventArgs e)
        {
            textDisplay.Text += "÷";
        }

        private void tui_Click(object sender, EventArgs e)
        {
            try
            {
                textDisplay.Text = textDisplay.Text.Substring(0, textDisplay.Text.Length - 1);
            }
            catch(Exception)
            {
                MessageBox.Show("笨蛋,已经空了,退不了了啊", "重大错误", MessageBoxButtons.OK);
            }
        }

        private void qing_Click(object sender, EventArgs e)
        {
            textDisplay.Text = "";
            s.myclear();
        }

        private void zuokuohao_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="(";
            else
                textDisplay.Text += "(";
        }

        private void youkuohao_Click(object sender, EventArgs e)
        {
            textDisplay.Text += ")";
        }

        private void b6_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="6";
            else
                textDisplay.Text += "6";
        }

        private void b7_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="7";
            else
                textDisplay.Text += "7";
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void b8_Click(object sender, EventArgs e)
        {
            if (textDisplay.Text == "0")
                textDisplay.Text ="8";
            else
                textDisplay.Text += "8";
        }
    }
}
  • 写回答

3条回答 默认 最新

  • baidu_30233079 2021-09-02 15:47
    关注

    在C++里面不是完美运行,只是没有崩溃而已。C++指针不检测越界,即使越界了也一样运行,只要你越界的地方没有被其它模块用到,或者即使用到了但逻辑上没有问题,那么你看到的结果还是正确的。
    C#就不一样了,有越界检测和保护,一旦越界就直接报错了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月25日
  • 已采纳回答 10月17日
  • 创建了问题 9月2日

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?