Как заполнить массив из пользовательского ввода C #? - PullRequest
11 голосов
/ 23 октября 2008

Как лучше всего заполнить массив из пользовательского ввода?

Будет ли решение показывать сообщение с подсказкой, а затем получать значения от пользователя?

Ответы [ 9 ]

43 голосов
/ 23 октября 2008
string []answer = new string[10];
for(int i = 0;i<answer.length;i++)
{
    answer[i]= Console.ReadLine();
}
5 голосов
/ 23 октября 2008

Не могли бы вы немного прояснить вопрос? Вы пытаетесь получить фиксированное количество ответов от пользователя? Какой тип данных вы ожидаете - текст, целые числа, десятичные числа с плавающей точкой? Это имеет большое значение.

Если вы хотите, например, массив целых чисел, вы можете попросить пользователя ввести их через пробел или запятую, а затем использовать

string foo = Console.ReadLine();
string[] tokens = foo.Split(",");
List<int> nums = new List<int>();
int oneNum;
foreach(string s in tokens)
{
    if(Int32.TryParse(s, out oneNum))
        nums.Add(oneNum);
}

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

4 голосов
/ 23 октября 2008

Разумнее было добавить это как ответ на код Арина , чем продолжать делать это в комментариях ...

1) Подумайте об использовании десятичного числа вместо двойного. Это более вероятно, чтобы дать ответ, который ожидает пользователь. См. http://pobox.com/~skeet/csharp/floatingpoint.html и http://pobox.com/~skeet/csharp/decimal.html для объяснения причин. По сути, десятичная дробь работает намного ближе к тому, как люди думают о числах, чем двойная. Double работает больше похоже на то, как компьютеры «естественно» думают о числах, поэтому они быстрее, но здесь это не актуально.

2) Для пользовательского ввода обычно стоит использовать метод, который не выдает исключение при неправильном вводе - например, decimal.TryParse и int.TryParse. Они возвращают логическое значение, чтобы сказать, успешно ли выполнен анализ, и используют параметр out, чтобы дать результат. Если вы еще не начали изучать параметры out, возможно, на данный момент стоит игнорировать этот пункт.

3) Это всего лишь небольшой момент, но я думаю, что было бы разумно иметь скобки вокруг всех тел «for» / «if» (и т. Д.), Поэтому я бы изменил это:

for (int counter = 0; counter < 6; counter++)
    Console.WriteLine("{0,5}{1,8}", counter, array[counter]);

к этому:

for (int counter = 0; counter < 6; counter++)
{
    Console.WriteLine("{0,5}{1,8}", counter, array[counter]);
}

Это делает блок более четким и означает, что вы случайно не пишете:

for (int counter = 0; counter < 6; counter++)
    Console.WriteLine("{0,5}{1,8}", counter, array[counter]);
    Console.WriteLine("----"); // This isn't part of the for loop!

4) В вашем операторе switch не указан регистр default - поэтому, если пользователь вводит что-либо, кроме «да» или «нет», он просто игнорирует их и выходит Вы можете захотеть иметь что-то вроде:

bool keepGoing = true;
while (keepGoing)
{
    switch (answer)
    {
        case "yes":
            Console.WriteLine("===============================================");
            Console.WriteLine("please enter the array index you wish to get the value of it");
            int index = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("===============================================");
            Console.WriteLine("The Value of the selected index is:");
            Console.WriteLine(array[index]);
            keepGoing = false;
            break;

        case "no":
            Console.WriteLine("===============================================");
            Console.WriteLine("HAVE A NICE DAY SIR");
            keepGoing = false;
            break;

        default:
            Console.WriteLine("Sorry, I didn't understand that. Please enter yes or no");
            break;
    }
}

5) Когда вы начали изучать LINQ, вы можете захотеть вернуться к этому и заменить цикл for, который суммирует входные данные просто:

// Or decimal, of course, if you've made the earlier selected change
double sum = input.Sum();

Опять же, это довольно продвинутое - пока не беспокойтесь об этом!

2 голосов
/ 23 октября 2008

Попробуйте:

array[i] = Convert.ToDouble(Console.Readline());

Возможно, вы также захотите использовать double.TryParse (), чтобы убедиться, что пользователь не вводил фиктивный текст и как-то его обрабатывать.

2 голосов
/ 23 октября 2008

C # не имеет окна сообщения, которое будет собирать данные, но вместо этого вы можете использовать поле ввода Visual Basic.

Если добавить ссылку на «Microsoft Visual Basic .NET Runtime», а затем вставить:

using Microsoft.VisualBasic;

Вы можете сделать следующее:

List<string> responses = new List<string>();
string response = "";

while(!(response = Interaction.InputBox("Please enter your information",
                                        "Window Title",
                                        "Default Text",
                                        xPosition,
                                        yPosition)).equals(""))
{
   responses.Add(response);
}

responses.ToArray();
1 голос
/ 23 октября 2008

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

    static void Main()
    {
        double[] array = new double[6];
        Console.WriteLine("Please Sir Enter 6 Floating numbers");
        for (int i = 0; i < 6; i++)
        {
            array[i] = Convert.ToDouble(Console.ReadLine());
        }

        double sum = 0;

        foreach (double d in array)
        {
            sum += d;
        }
        double average = sum / 6;
        Console.WriteLine("===============================================");
        Console.WriteLine("The Values you've entered are");
        Console.WriteLine("{0}{1,8}", "index", "value");
        for (int counter = 0; counter < 6; counter++)
            Console.WriteLine("{0,5}{1,8}", counter, array[counter]);
        Console.WriteLine("===============================================");
        Console.WriteLine("The average is ;");
        Console.WriteLine(average);
        Console.WriteLine("===============================================");
        Console.WriteLine("would you like to search for a certain elemnt ? (enter yes or no)");
        string answer = Console.ReadLine();
        switch (answer)
        {
            case "yes":
                Console.WriteLine("===============================================");
                Console.WriteLine("please enter the array index you wish to get the value of it");
                int index = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("===============================================");
                Console.WriteLine("The Value of the selected index is:");
                Console.WriteLine(array[index]);
                break;

            case "no":
                Console.WriteLine("===============================================");
                Console.WriteLine("HAVE A NICE DAY SIR");
                break;
        }
    }
0 голосов
/ 07 октября 2009

readline для строки .. просто используйте чтение

0 голосов
/ 27 февраля 2009

конечно .... Console.ReadLine всегда возвращает строку .... поэтому вы должны преобразовать тип строки в double

массив [I] = double.Parse (Console.ReadLine ());

0 голосов
/ 23 октября 2008

Добавьте входные значения в список, и когда вы закончите, используйте List.ToArray (), чтобы получить массив со значениями.

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