将文本框的输入与变量进行比较

时间:2017-10-30 18:18:37

标签: c# .net

我的程序要求用户将答案输入到文本框中以随机生成问题。问题计算了存储在变量中的答案。将文本框的输入与该变量进行比较无法正常工作,因此我就在这里。

enum elements { lithium, beryllium, sodium, magnesium };

public void Moles()
    {
        string elementName;
        int elementsLength = Enum.GetNames(typeof(elements)).Length;          
        double moles, mass, roundedMoles, Mr = 0;

        Random random = new Random();
        elementName = (Enum.GetNames(typeof(elements))[random.Next(0, elementsLength)]);
        mass = random.Next(1, 100);

        switch (elementName)
        {
            case "lithium":
                Mr = 7;
                break;
            case "beryllium":
                Mr = 9;
                break;
            case "sodium":
                Mr = 23;
                break;
            case "magnesium":
                Mr = 24;
                break;
        }

        moles = mass / Mr;
        roundedMoles = Math.Round(moles);

        label1.Text = ("How many moles in " + mass + "g" + " of " + elementName + "?");
        string input = textBox1.Text.ToString();

        if (input == roundedMoles.ToString())
        {
            MessageBox.Show("Good");
            textBox1.Clear();
        }
        else
        {
            MessageBox.Show("Bad");
            textBox1.Clear();
        }

private void button1_Click(object sender, EventArgs e)
    { 
        Moles();
    }

如您所见,程序将计算一定数量的摩尔数并将其四舍五入到最接近的整数。然后将它存储在一个变量'roundedMoles'中 - 这个变量与文本框的输入进行比较。

但是,无论输入是否正确,消息框都会随机显示“好”或“坏”。请记住,这个代码在控制台应用程序中工作正常,所以我不知道这是我做错了还是不想工作。

很抱歉,如果此代码不是高标准的话。我不擅长编程。

3 个答案:

答案 0 :(得分:1)

你有两个问题。

不要将字符串比作数字

比较数值时,切勿将字符串与字符串进行比较。始终转换为数字变量。否则,“0.00”将不等于“0”,“1234”(末尾有空格)将不等于“1234”(没有空格)。此外,如果您使用的是使用,作为小数点的文化,您将遇到严重问题。

所以,而不是:

string input = textBox1.Text.ToString();
if (input == roundedMoles.ToString())
{
    MessageBox.Show("Good");
    textBox1.Clear();

使用类似的东西:

string input = textBox1.Text;
double inputAsDouble;
bool ok = double.tryParse(out inputAsDouble);
if (!ok)
{
    MessageBox.Show("Please enter a numeric value.");
    return;
}
if (inputAsDouble == roundedMoles)
{
    MessageBox.Show("Good");
    textBox1.Clear();

不要将浮点值与精确值

进行比较

比较浮点值时,请勿使用==。相反,计算差异并确保它低于某个容差。你必须这样做,因为浮点变量只是近似值。

所以而不是

if (inputAsDouble == roundedMoles)

使用

const double Tolerance = 0.00001;
if (inputAsDouble - roundedMoles < Tolerance)

答案 1 :(得分:0)

您可能会遇到与文化相关的问题。比较转换为Double的{​​{1}}值时务必小心。框架可能会根据您的区域设置将“1,5”转换为“1.5”。 我要建议你的第一件事就是不要将其作为String进行比较,而是将其作为String进行比较。如果你这样做,请确保用逗号或其他方式替换点。

Double

答案 2 :(得分:0)

好的,这就是答案......

控制台工作的原因是您写入控制台询问问题。然后你做console.Readline(),它会在看到问题之后捕获答案的输入。

在表单版本上。您将标签设置为问题并立即捕获文本框值。用户没有机会输入答案,或者它仍然是最后一次的答案(因此它为什么随机地从#34; Good&#34;到#34; Bad&#34;因为有时答案是同样的。)

一种简单的方法是让你的变量位于Moles()方法的顶部,表单上的类变量然后有2个按钮,其中2个方法可以获取问题并设置你的答案变量然后是第二个按钮然后是用户可以在他们输入答案时按下。

查看此代码粘贴https://www.pastebucket.com/564406

(您需要在表单中添加button2才能实现此功能)

编辑:我在那里快速剪切并粘贴了代码。你不应该只是复制它并使用它。看看我做了什么并正确应用并尝试理解其工作原理