我正在努力实现以下目标:
用户输入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]);
}
}
答案 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:");
此代码告诉用户键入的字符串不能被解释为整数并再次提示,直到转换成功完成。