C# 变量不';t在我的代码上递增/递减

C# 变量不';t在我的代码上递增/递减,c#,messagebox,C#,Messagebox,这可能是一个浮点精度问题(可能您的用户正在输入3,程序计算2.999999)。调试您的代码,并在代码添加不正确时确定其中一种情况。事先有一件事:我不知道您的错误在哪里。这里有几个提示,我认为如果您仔细考虑一下,这些提示是有意义的,以避免将来出现类似的错误: 如果我必须检查这段代码,我的主要问题是重复代码的数量,其中非常相似的多行长模式被反复复制。我认为,在整个代码中,您不调用任何方法,而是在事件处理程序中立即实现这些内容,从而重复您自己的操作,并增加出现错误的可能性。让我们看看这段代码: usi

这可能是一个浮点精度问题(可能您的用户正在输入3,程序计算2.999999)。调试您的代码,并在代码添加不正确时确定其中一种情况。

事先有一件事:我不知道您的错误在哪里。这里有几个提示,我认为如果您仔细考虑一下,这些提示是有意义的,以避免将来出现类似的错误:

如果我必须检查这段代码,我的主要问题是重复代码的数量,其中非常相似的多行长模式被反复复制。我认为,在整个代码中,您不调用任何方法,而是在事件处理程序中立即实现这些内容,从而重复您自己的操作,并增加出现错误的可能性。让我们看看这段代码:

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

namespace A1_ALS_Noroña
{
    public partial class Form1 : Form
    {
        int minV=0, maxV=0,ques=0,tempques=1;

        int addtemp, subtemp, multemp, divtemp, modtemp;
        int addcomp, subcomp, mulcomp, divcomp, modcomp;
        int answer,getanswer;
        int getnum1, getnum2;

        char getchar;
        char[] select = new char[5];
        int count=0;
        int correct, wrong;

        public Form1()
        {
            InitializeComponent();
        }



        private void bttnstart_Click(object sender, EventArgs e)
        {
            bttnanswer.Enabled = true;
            grpbox1.Enabled = false;
            bttnanswer.Enabled = true;
            lblnum1.Visible = true;
            lblnum2.Visible = true;
            lbloperator.Visible = true;
            bttnstop.Enabled = true;
            bttnscore.Enabled = true;
            bttnstart.Enabled = false;


            Random random = new Random();
            int nextValue = random.Next(minV, maxV);
            int nextValue1 = random.Next(minV, maxV);
            lblnum1.Text = nextValue.ToString();
            lblnum2.Text = nextValue1.ToString();

            var rand = new Random();

            char num = select[rand.Next(count)];
            lbloperator.Text = Convert.ToString(num);
        }

        private void txtboxmin_TextChanged(object sender, EventArgs e)
        {
            minV = Convert.ToInt32(txtboxmin.Text);
        }

        private void txtbxmax_TextChanged(object sender, EventArgs e)
        {
            maxV = Convert.ToInt32(txtbxmax.Text);
        }

        private void bttnexit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void bttnstop_Click(object sender, EventArgs e)
        {
            MessageBox.Show("APPLICATION STOP! The application will restart.");
            Application.Restart();
        }



        private void bttnanswer_Click(object sender, EventArgs e)
        {

            tempques++;
            Random random = new Random();
            int nextValue = random.Next(minV,maxV);
            int nextValue1 = random.Next(minV, maxV);
            lblnum1.Text = nextValue.ToString();

            var rand = new Random();
            char num = select[rand.Next(count)];
            lbloperator.Text = Convert.ToString(num);
            lblnum2.Text = nextValue1.ToString();
            getnum1 = Convert.ToInt32(lblnum1.Text);
            getnum2 = Convert.ToInt32(lblnum2.Text);
            getanswer = Convert.ToInt32(txtbxans.Text);
            getchar = Convert.ToChar(lbloperator.Text);

            if (getchar == '+')
            {

                answer = getnum1 + getnum2;
                addtemp++;              
                if (answer == getanswer)  
                {                      
                    correct++;            
                    addcomp++;
                }
                else
                {
                    wrong++;
                }
            }
            else if (getchar == '-')
            {
                subtemp++;
                answer = nextValue - nextValue1;
                if (answer == getanswer)
                {
                    correct++;
                    subcomp++;
                }
                else
                {
                    wrong++;
                }
            }
            else if (getchar == '*')
            {
                multemp++;
                answer = nextValue * nextValue1;
                if (answer == getanswer)
                {
                    correct++;
                    mulcomp++;
                }
                else
                {
                    wrong++;
                }
            }
            else if (getchar == '/')
            {
                divtemp++;
                answer = nextValue / nextValue1;
                if (answer == getanswer)
                {
                    correct++;
                    divcomp++;
                }
                else
                {
                    wrong++;
                }
            }
            else if (getchar == '%')
            {
                modtemp++;
                answer = nextValue % nextValue1;
                if (answer == getanswer)
                {
                    correct++;
                    modcomp++;
                }
                else
                {
                    wrong++;
                }
            }







        }

        private void txtbxques_TextChanged(object sender, EventArgs e)
        {
            ques = Convert.ToInt32(txtbxques.Text);

        }

        private void chkbxtimer_CheckedChanged(object sender, EventArgs e)
        {
            rdoeasy.Enabled = true;
            rdomed.Enabled = true;
            rdohard.Enabled = true;
        }

        private void chkboxAdd_CheckedChanged(object sender, EventArgs e)
        {

            if (chkboxAdd.Checked == true)
            {
                select[count] = '+';
                count++;
            }
            else if (chkboxAdd.Checked == false) 
            {
                Array.Clear(select, 0, select.Length);
                count--;
            }

        }

        private void chkboxSub_CheckedChanged(object sender, EventArgs e)
        {
            if (chkboxSub.Checked == true)
            {
                select[count] = '-';
                count++;

            }
            else if (chkboxSub.Checked == false)
            {
                Array.Clear(select, 0, select.Length);
                count--;
            }

        }

        private void chkboxMul_CheckedChanged(object sender, EventArgs e)
        {
            if (chkboxMul.Checked == true)
            {
                select[count] = '*';
                count++;

            }
            else if (chkboxMul.Checked == false)
            {
                Array.Clear(select, 0, select.Length);
                count--;
            }

        }

        private void chkboxDiv_CheckedChanged(object sender, EventArgs e)
        {
            if (chkboxDiv.Checked == true)
            {
                select[count] = '/';
                count++;

            }
            else if (chkboxDiv.Checked == false)
            {
                Array.Clear(select, 0, select.Length);
                count--;
            }
        }

        private void chkboxMod_CheckedChanged(object sender, EventArgs e)
        {
            if (chkboxMod.Checked == true)
            {
                select[count] = '%';
                count++;

            }
            else if (chkboxMod.Checked == false)
            {
                Array.Clear(select, 0, select.Length);
                count--;
            }
        }

        private void bttnscore_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Correct Answer"+correct);
        }




        }
    }
除了在select数组中添加多个运算符时出现count错误外,此代码还会重复几次。让我们将代码提取到方法中,并使更改的位可参数化:

if (chkboxSub.Checked == true)
{
    select[count] = '-';
    count++;

}
else if (chkboxSub.Checked == false)
{
    Array.Clear(select, 0, select.Length);
    count--;
}
现在您可以多次调用该方法,例如:

void AddOrRemoveOperator(bool isChecked, char operatorChar) {
  if (isChecked) {
    select[count] = operatorChar;
    count++;
  }
  else {
    Array.Clear(select, 0, select.Length);
    count--;
  }
}
下一点是缺乏.NET基类库知识(BCL)。例如,使用
列表
而不是数组不是更容易吗

上述方法变为:

AddOrRemoveOperator(chkboxSub.Checked, '-');
观察结果:除add-one之外的所有操作符都使用值nextValue、nextValue1,而add-one使用getnum1和2。这是有意的吗

除了将
bttnanswer\u单击
中的代码块提取到它们自己的类中之外,您还可以将重复代码提取到一个方法中:

void AddOrRemoveOperator(bool isChecked, char operatorChar) {
  if (isChecked) {
    select.Add(operatorChar);
  }
  else {
    select.Clear();
  }
}

有许多技术可以将代码变形为更易于测试和维护的形式(重构),到目前为止,我们只使用了extract方法。对于更多的技术,这本书仍然是非常值得推荐的。

你试过调试它吗?猜测一下,
getchar
从来不是
+-*/%
中的一个。告诉我们getchar是如何填充的,消息框是如何创建的。@JanDarrenNoroña-请讲英语。我不知道你在说什么。哇,我的圈复杂度表崩溃了……坦白说,我对代码有bug并不感到惊讶。试着把它重构成更小的部分,清楚地标明它们所做的事情。很有可能你自己很快就会发现这个错误。这可能吗?我所有的getnum1和getnum2都是整数。如果一切都是整数,则不应该是整数。你需要找到一个例子。
void AddOrRemoveOperator(bool isChecked, char operatorChar) {
  if (isChecked) {
    select.Add(operatorChar);
  }
  else {
    select.Clear();
  }
}
 void PerformComparison(Func<int> answerProvider, 
    ref int operatorCount, 
    ref int operatorSpecificCorrectCount)
 {
    var answer = answerProvider();
    operatorCount++;
    if (answer == getanswer) {
        correct++;
        operatorSpecificCorrectCount++;
    }
    else {
        wrong++;
    }
 }
if (getchar == '+')
{
  PerformComparison(()=>getnum1 + getnum2, ref addtemp, ref addcomp);
}