2
if (getchar == '+') {
    answer = getnum1+getnum2;   // if the random operation is add, it will add
    addtemp++;                 // <---- disregard this
    if (answer == getanswer)   //  the answer from my textbox which is
    {                         //  user-input it is stored on "getanswer"
        correct++;            // it is compared if its correct or wrong
        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++; }
}

C# プログラミング ヘルプ! ボタン「SCORES」を押すたびに MessageBox.Show(correct or wrong) になり、値が間違っています。それは時々修正されますが、1回か2回だけです.私のコードに何か問題がありますか?

/////////////////////////////////////////////// ///////// @boncodigo のコード全体

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);
        }




        }
    }
4

2 に答える 2

1

事前に1つ:あなたのバグがどこにあるのかわかりません。将来同様のバグを回避するために、それらについて考えると理にかなっていると思うヒントをいくつか紹介します。

このコードを確認する必要がある場合、私の主な問題は、非常によく似た複数行の長いパターンが何度もコピーされる、繰り返されるコードの量にあります。コード全体では、メソッドを呼び出さないで、イベントハンドラーにすぐに実装することで、繰り返してバグの可能性を増やしていると思います。このコードを見てみましょう:

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

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

select-arrayに複数の演算子を追加した場合のカウントのバグは別として、このコードは数回繰り返されます。コードをメソッドに抽出し、変更するビットをパラメーター化可能にしましょう。

void AddOrRemoveOperator(bool isChecked, char operatorChar) {
  if (isChecked) {
    select[count] = operatorChar;
    count++;
  }
  else {
    Array.Clear(select, 0, select.Length);
    count--;
  }
}

これで、そのメソッドを何度も呼び出すことができます。たとえば、次のようになります。

AddOrRemoveOperator(chkboxSub.Checked, '-');

次のポイントは、.NET基本クラスライブラリの知識(BCL)の欠如です。たとえば、List<T>配列の代わりに使用する方が簡単ではないでしょうか。

上記の方法は次のようになります。

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

観察:add oneを除くすべての演算子は、値nextValue、nextValue1を使用し、add oneはgetnum1および2を使用します。これは意図されたものですか?

コードブロックをbttnanswer_Click独自のクラスに抽出する以外に、繰り返しコードをメソッドに抽出することもできます。

 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);
}

コードをより簡単にテストおよび保守(リファクタリング)できるフォームにモーフィングするための多くの手法がありますが、これまでは抽出メソッドのみを使用してきました。その他のテクニックについては、「リファクタリング:既存のコードの設計を改善する」という本を強くお勧めします。

于 2012-11-25T15:04:31.137 に答える
0

浮動小数点精度の問題である可能性があります (ユーザーが 3 を入力し、プログラムが 2.9999999 を計算している可能性があります)。コードをデバッグし、正しく追加されていないケースを 1 つ特定します。

于 2012-11-25T13:15:54.083 に答える