Разбор поплавков в C # - PullRequest
       29

Разбор поплавков в C #

0 голосов
/ 16 февраля 2019

В 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], и другой, чтобы гарантировать, что любой ввод является десятичным числом (плавать).До этой реализации массив notas имел целое число , и все работало просто отлично, допускались только целые числа , а также между интервалами [0, 20].Когда я решил изменить тип данных на float , всякий раз, когда я набираю десятичное число (т. Е. 3,0), оно не проходит через внешний цикл, как если бы я печатал символ, отличный от числа,так же, как когда я печатаю письмо.Так как же я могу ввести десятичные числа для хранения в моем массиве?Ty

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Я предлагаю эту альтернативную реализацию:

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

Обратите внимание, что вам не нужно передавать массив по ссылке. Это ссылочный тип, поэтому копия ссылкипрошло, и метод может работать на нем.

0 голосов
/ 16 февраля 2019

Помимо вопроса о культуре (десятичный разделитель . против ,), я бы избавился от одного из циклов 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);
        }
    }
...