C#阵列打印

时间:2014-05-28 08:10:19

标签: c# arrays

我正在努力实现以下目标:

用户输入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]);
        }
    }

8 个答案:

答案 0 :(得分:1)

请改用此印刷品

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

答案 1 :(得分:0)

它不打印它,因为100不能被3整除,并且你的for循环在每次迭代时将变量增加3,所以最后一个元素将被跳过。

这可能是在循环之后:

int rest = row.Length % 3;
if(rest > 0)
   Console.WriteLine(row[row.Length - rest] + "\t" + row.ElementAtOrDefault(row.Length - rest + 1));

答案 2 :(得分: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是一个非常学者,一个真正的程序可以使用%运算符,如其他答案中所示。

答案 3 :(得分:0)

for循环中的条件错误。如果您不介意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;
}

答案 4 :(得分:0)

jonavo是对的。 在96 + 3 = 99之后 你已经完成了row.length-2,把它改成了行。长度+ 2。  并且在打印中不要打印if the i+1 or I+2 >= max

答案 5 :(得分: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]);

答案 6 :(得分: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();
}

答案 7 :(得分: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() as documented here。此方法不会抛出异常,但会返回报告成功转换的布尔值。

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

此代码告诉用户键入的字符串不能被解释为整数并再次提示,直到转换成功完成。