Входной массив уникальных значений из заданного диапазона - PullRequest
0 голосов
/ 05 апреля 2020

Я заполняю массив значений с помощью пользовательского ввода. Код, который у меня есть, делает большую часть этого, но я хочу показать явное сообщение, если пользовательский ввод отклонен (проверка диапазона / уникальности), прежде чем запрашивать его снова.

В частности

  1. Я хочу для отображения сообщения об ошибке, когда пользователь вводит значение int меньше 1 или больше 25 в один массив.
  2. Я хочу отобразить сообщение об ошибке, если пользователь уже ввел то же значение, что и раньше.

Код, который я только что неоднократно запрашивал для одной и той же строки до получения приемлемого значения:

int[] vektor = new int[4];

//take input from user
for (int i = 0; i < vektor.Length; i++)
{
    // as long as value not beetween 1 or 25
    while (!(vektor[i] >= 1 && vektor[i] <= 25))
    {
        // Entry row number
        int x = i + 1;
        //ready input and store in array called vektor
        Console.Write("row number:{0}: Enter one integer:", x);
        vektor[i] = Convert.ToInt32(Console.ReadLine());

    }    
}

Я понимаю, что мне нужно добавить что-то вроде следующего if, но я ' Я не уверен, где его разместить.

if (userInput <= 0 || userInput => 26)
{
   Console.WriteLine("You entered wrong value, try again")
}

, а также некоторая форма vektor.Contains(?) для проверки наличия входных данных в массиве.

В конце мне нужно добиться что-то вроде

row 1: -3
You entered wrong value, try again
row 1: 10
row 2: 10
You entered dupicate value, try again
row 2: 5
....

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Попробуйте это

//create one array named vektor with 4 zero values.
int[] vektor = new int[4]; 

//take input from user
for (int i = 0; i < vektor.Length; i++)
{
    int userInput = 0;
    var numberInValid = true;
    do
    {
        Console.Write("row number:{0}: Enter one integer:", i + 1);
        userInput = Convert.ToInt32(Console.ReadLine());

        // as long as value not beetween 1 or 25
        if (userInput < 1 || userInput > 25)
        {
            Console.WriteLine("You entered wrong value, try again");
        }

        //Check if user has already entered them same value before
        // NOTE that initialized arrays has all 0, but we do not allow 
        // 0 in above checks, so scanning whole array is fine in this case
        // if 0 allowed you need to scan only first "filled" part of the array.
        else if (vektor.Contains(userInput))
        {
            Console.WriteLine("Number already entered, try again");
        }
        else
        {
            numberInValid = false;
        }
    }
    while (numberInValid);
    vektor[i] = userInput;
}
2 голосов
/ 05 апреля 2020

Вы можете сделать это за один while loop. Только не подсчитывайте increase, если ввод неправильный

using System;
namespace learn_c_
{

    class Program
    {
        static void Main(string[] args)
        {
            int[] vektor = new int[4];
            int counter = 0;
            while (counter < vektor.Length)
            {
                Console.Write("row number:{0}: Enter one integer: ", counter + 1);
                int number = Convert.ToInt32(Console.ReadLine());

                // Note that only part of array is "filled" so limiting search 
                // to only items we already filled out
                int indexOfNum = Array.IndexOf(vektor, number, 0, counter);
                // [Range] check
                if (number < 1 || number > 25)
                {
                    Console.WriteLine("You entered wrong value, try again");
                    continue;
                }
                //[Duplicate] value check
                else if (indexOfNum != -1)
                {
                    Console.WriteLine("You entered duplicate value as {0}, try again", vektor[indexOfNum]);
                    continue;
                }
                else
                {
                    vektor[counter++] = number;
                }
            }
        }
    }
}

Обратите внимание, что при использовании Enumerable.Contains для массива это опция, он будет искать весь массив. Для массивов проще использовать IndexOf , тем более что он позволяет указать, какую часть массива искать. Это важная часть упражнения, поскольку только часть массива (в данном случае до counter) «заполнена» значениями, остальные имеют значение по умолчанию 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...