【问题标题】:Float parsing in C#C#中的浮点解析
【发布时间】:2019-02-15 21:14:31
【问题描述】:

在 C# 中,我在 main() 中声明了一个浮点数组

float[] notas = new float[8];

在main()中调用方法并通过引用传递数组

PopulateArray(ref notas);

这里是PopulateArray(ref float[] arr1)方法的实现

static void PopulateArray(ref float[] arr1)
    {
        bool vakid;

        for (int i = 0; i < arr1.Length; i++)
        {
            do
            {
                do
                {
                    Console.Write($"Insira nota {i + 1}  ==>");
                    vakid = float.TryParse(Console.ReadLine(), out arr1[i]);
                    if ((arr1[i] > 20.0) || (arr1[i] < 0.0))
                    {
                        Console.Write("\n\n\t\tAs notas só vão de 0 a 20\n\nPrima uma tecla para continuar");
                        Console.ReadKey();
                    }
                    Console.Clear();

                }while (!((arr1[i] <= 20) && (arr1[i] >= 0)));

            } while (!vakid); 
        }


    }

使用了两个循环,一个确保输入的值在 [0, 20] 之间,另一个确保任何输入都是十进制数(浮点数)。在此实施之前,数组 notasinteger 并且一切正常,只允许 integers 并且介于 [ 0, 20]。当我决定将数据类型更改为 float 时,每当我输入一个十进制数(即 3.0)时,它都不会通过外循环,就像我输入一个数字以外的字符一样,与我键入字母时的方式非常相似。 那么如何输入十进制数字以存储在我的数组中?类型

【问题讨论】:

  • 我不清楚您所说的“它不经过外循环”是什么意思。您有三个嵌套循环。哪个不符合您的预期?当您在调试器中单步执行时,代码首先在哪里执行了一些意想不到的操作?
  • 在您的计算机上有效的区域设置(国际号码格式设置)?
  • 值得注意的是,这里不需要ref 关键字。数组是 c# 中的对象,通过引用传递。仅当您想更改调用方法中的引用时才需要 ref 关键字,而您并没有这样做。
  • 不要不要忽略有效变量。完成您的 SO 个人资料,以便我们可以看到您住在哪里,我的水晶球说您需要输入“3,0”,逗号而不是句号。你可以从你的杂货账单上看到。
  • @mxajd 您正在为数组赋值。您没有分配新的数组引用。 ref 关键字不需要

标签: c# parsing tryparse


【解决方案1】:

我提出了这个替代实现:

static void PopulateArray(float[] arr1)
{

    for (int i = 1; i <= arr1.Length; i++)
    {
        float nota;

        Console.Write($"Insira nota {i}  ==> \n");

        while(! float.TryParse(Console.ReadLine(), out nota) || nota > 20.0f || nota < 0 )
        {
           // Bad input message
            Console.Write("\n\n\t\tAs notas só vão de 0 a 20\n\nPrima uma tecla para continuar");
        }

        arr1[i] = nota;
    }
}

请注意,您不需要通过引用传递数组。它是一个引用类型,因此传递了引用的副本并且方法可以对其进行处理。

【讨论】:

  • 谢谢。真的很喜欢你的目的,如果我可以这么说的话,它非常“干净”。刚刚向另一位用户解释说,我已经离开编程超过 5 年了。只是通过阅读 cmets 和答案,它现在就回到了我的身边。非常感谢
【解决方案2】:

除了文化问题(., 的小数分隔符),我会摆脱这样的 do 循环之一:

    static void PopulateArray(float[] arr1)
    {
        bool vakid;
        for (int i = 0; i < arr1.Length; i++)
        {
            do
            {
                Console.Write($"Insira nota {i + 1}  ==>");
                vakid = float.TryParse(Console.ReadLine(), out arr1[i]);
                if (vakid)
                {
                    if ((arr1[i] > 20.0) || (arr1[i] < 0.0))
                    {
                        vakid = false;
                        Console.Write("\n\n\t\tAs notas só vão de 0 a 20\n\nPrima uma tecla para continuar");
                        Console.ReadKey();
                    }
                }
                else
                {
                    Console.Write("\n\n\t\tInvalid Entry\n\nPrima uma tecla para continuar");
                    Console.ReadKey();
                }                 
                Console.Clear();
            } while (!vakid);
        }
    }

【讨论】:

  • 相信我,我确实试图摆脱其中一个循环,很可能我的控制表达式不正确。我所做的是在一个表达式中聚合所有 3 个条件(就像它们在代码中一样),但现在我意识到一个数字不能同时小于 0 和大于 20。这确实表明我已经远离编程现在5年多了。感谢您的意见
猜你喜欢
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多