C # массив печати

1

Я пытаюсь добиться следующего:

Пользователь вводит 100 номеров, а затем цифры печатаются в 3 столбцах.

Это то, что у меня есть до сих пор, оно работает, но оно не печатает последнее значение массива.

Что я делаю не так?

    static void Main(string[] args)
    {
        int digit = 0;
        const int LIMIT = 100;
        int[] row = new int[LIMIT];

        for (int i = 0; i < row.Length; i++)
        {
            Console.WriteLine("Geef getal nummer " + (i + 1) + " in: ");
            digit = int.Parse(Console.ReadLine());

            row[i] = digit;
        }

        for (int i = 0; i < row.Length - 2; i+=3)
        {               
           Console.WriteLine(row[i] + "\t" + row[i + 1] + "\t" + row[i + 2]);
        }
    }
Теги:
arrays

8 ответов

1

Используйте эту печать вместо

for (int i = 0; i < row.Length; i++)
{
   Console.Write(row[i] + "\t");
   if (i % 3 == 2)
       Console.WriteLine();
}
  • 0
    Эй, спасибо, это работает. Могу ли я спросить, почему вы используете я% 3 == 2 здесь
  • 1
    @Sam i % 3 выдает номер текущего столбца (начиная с 0 для первого столбца). Если есть 3 столбца, то последним столбцом будет столбец 2, и вы должны добавлять новую строку каждый раз, когда достигнете последнего столбца. Лично я бы рекомендовал хранить число столбцов как константу const int numCols = 3 и вместо i % 3 == 2 использовать i % numCols == numCols - 1 .
0

Ваша проблема в том, что вы не просто используете Console.Write и пытаетесь написать свои строки одним выстрелом.

На самом деле, здесь было бы чище использовать StringBuilder.

замещать

for (int i = 0; i < row.Length - 2; i+=3)
{               
   Console.WriteLine(row[i] + "\t" + row[i + 1] + "\t" + row[i + 2]);
}

от

StringBuilder sb = new StringBuilder();
int count = 0;
for (int i = 0; i < row.Length; i++)
{
    count++;
    if (count == 3)
    {
        sb.AppendLine(row[i])
        count = 0;
    }
    else
        sb.Append(row[i]).Append('\t');
}

Console.WriteLine(sb.ToString());

Я думаю, что это довольно ясно, но если вам нужны разъяснения, не стесняйтесь спрашивать. Конечно, использование count здесь довольно ученое, реальная программа может использовать% оператора, как показано в других ответах.

0

Похоже, у вас в распоряжении много вариантов. Здесь используется подход с использованием вложенных циклов:

int numCols = 3;
for (int i = 0; i < row.Length; i += numCols)
{               
    for (int j = i; j < i + numCols && j < row.Length; j++)
    {
        Console.Write(row[j] + "\t");
    }
    Console.WriteLine();
}
  • 0
    Спасибо @JLRishe этот тоже работает
0

Он не печатает его, потому что 100 не равномерно делится на 3, а ваш for-loop увеличивает переменную на 3 на каждой итерации, поэтому последний элемент wil пропускается.

Возможно, это после цикла:

int rest = row.Length % 3;
if(rest > 0)
   Console.WriteLine(row[row.Length - rest] + "\t" + row.ElementAtOrDefault(row.Length - rest + 1));
  • 1
    Это вызовет исключение, если LIMIT делится на 3.
  • 0
    @JLRishe: конечно, хороший улов. Я добавил, if .
0

Попробуйте этот код.

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

    static void Main(string[] args)
    {
        int digit = 0;
        const int LIMIT = 10;
        const int COLS = 3;
        int[] row = new int[LIMIT];

        for (int i = 0; i < row.Length; i++)
        {
            Console.WriteLine("Geef getal nummer " + (i + 1) + " in: ");
            // Re-try until user insert a valid integer.
            while (!int.TryParse(Console.ReadLine(), out digit))
                Console.WriteLine("Wrong format: please insert an integer number:");
            row[i] = digit;
        }

        PrintArray(row, COLS);

        // Wait to see console output.
        Console.ReadKey();
    }

    /// <summary>
    /// Print an array on console formatted in a number of columns.
    /// </summary>
    /// <param name="array">Input Array</param>
    /// <param name="columns">Number of columns</param>
    /// <returns>True on success, otherwise false.</returns>
    static bool PrintArray(int[] array, int columns)
    {
        if (array == null || columns <= 0)
            return false;
        if (array.Length == 0)
            return true;

        // Build a buffer of columns elements.
        string buffer = array[0].ToString();
        for (int i = 1; i < array.Length; ++i)
        {
            if (i % columns == 0)
            {
                Console.WriteLine(buffer);
                buffer = array[i].ToString();
            }
            else
                buffer += "\t" + array[i].ToString();
        }

        // Print the remaining elements
        if (array.Length % columns != 0)
            Console.WriteLine(buffer);

        return true;
    }

Только для полноты

Обратите внимание, что int.Parse(Console.ReadLine()) может генерировать исключение, если набираются неожиданные символы. Лучше использовать int.TryParse() как int.TryParse() здесь. Этот метод не генерирует исключение, но возвращает логическое значение, сообщающее об успешном преобразовании.

while (!int.TryParse(Console.ReadLine(), out digit))
    Console.WriteLine("Wrong format: please insert an integer number:");

Этот код сообщает пользователю, что типизированная строка не может быть интерпретирована как целое и повторить запрос до тех пор, пока не будет выполнено успешное преобразование.

  • 0
    Хотя это крайний случай, я бы предложил использовать эту ручку для случая, когда LIMIT равен 0. В настоящее время в этой ситуации возникнет исключение.
  • 0
    Когда запрашивается LIMIT , это константа, поэтому это значение известно априори кодеру. LIMIT 0 сделать весь код unneded. По этой причине я не проверял значение LIMIT . Опять же, это явно упражнение по кодированию, и я хотел ответить самым ясным способом.
Показать ещё 8 комментариев
0

Это из-за вашего индекса. Ваш текущий индекс i идет от

0,      3,      6,      9,       ...   96,       99

Таким образом, это выводит позиции массива:

0,1,2   3,4,5   6,7,8   9,10,11  ...   96,97,98  99,100,101 (index out of bounds)

row.Length equals 100, so your loop-condition (i < row.Length - 2) is correct, but even better would be (i < row.Length - 3).

Поэтому ваша проблема заключается в том, как напечатать последний номер... Понимаете, у вас есть 3 столбца на 100 цифр. Это составляет 33 строки, и остается одна цифра.

Возможно, вы просто добавили Console.WriteLine(row[row.Length-1]); выпейте свою петлю.

0

У вас неправильное условие для цикла. Если вы не возражаете против LINQ, вы можете использовать следующее:

foreach (string s in row.Select((n, i) => new { n, i })
                        .GroupBy(p => p.i / 3)
                        .Select(g => string.Join("\t", g.Select(p => p.n))))
    Console.WriteLine(s);

Если вы не в порядке с LINQ, вы можете сделать это:

int colIndex = 0;
foreach (int n in row)
{
    Console.Write(n);
    if (colIndex == 2)
        Console.WriteLine();
    else
        Console.Write('\t');
    colIndex = (colIndex + 1) % 3;
}
0

jonavo является правильным. после 96 + 3 = 99, и вы сделали row.length-2, измените его на строку. длина + 2. и в печати не печатайте, if the i+1 or I+2 >= max

  • 0
    Я сделал, но это не работает
  • 0
    for (int i = 0; i <row.Length - 2; i + = 3) {Console.WriteLine (row [i] + "\ t" + row [i + 1] + "\ t" + row [i +] 2]); }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню