使用二维数组 C# 创建一个 table 矩阵
Create a table matrix with 2d arrays C#
我正在尝试创建一个程序,您可以在其中向用户询问一个数字,创建一个尽可能接近正方形的数组,并用 1 填充到用户指定的数字。您必须使用二维数组。这是它的外观示例:
用户输入:16
输出:1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
我试过 运行 通过循环来做到这一点,但没有奏效,我希望有人能指导我如何做到这一点
首先让我们获取用户输入:
int num;
while(!int.TryParse(Console.ReadLine(), out num) || num < 1)
{
Console.WriteLine("Invalid number!");
}
之后计算正方形的边:
var sideLength = (int)Math.Ceiling(Math.Sqrt(num));
然后创建二维数组:
var array = new int[sideLength, sideLength];
并将数字写入其中:
for (int row = 0; row < sideLength; row++)
{
for (int column = 0; column < sideLength; column++)
{
var value = row * sideLength + (column + 1);
if (value > num)
break;
array[row, column] = value;
}
}
但是不要写任何高于用户输入的东西,这会让他们 0
,这很好,因为你想从 1
显示它,所以你可以使用 0
检测结束以防用户输入不是平方数。
现在让我们准备一个字符串来格式化数字。如果您希望所有数字的长度完全相同,您可以将其格式化为 int.ToString("0")
,其中 0
的数量将设置长度。让我们创建一个字符串,使所有数字的长度相同。用户输入的是最长的数字,因此您可以使用它来创建字符串:
var format = new string('0', num.ToString().Length);
现在打印数组:
for (int row = 0; row < sideLength; row++)
{
for (int column = 0; column < sideLength; column++)
{
var value = array[row, column];
if (value == 0)
{
Console.WriteLine("");
goto breakBoth;
}
Console.Write($"{value.ToString(format)} ");
}
Console.WriteLine("");
}
breakBoth:
这会将相同数量的数字放在一行中,并且会有相同数量的行,除非它找到 0
,然后它会停止并且最后一行不会是完整的行,如果输入不是平方数,就会发生这种情况。
让我们看看输出:
输入:16
输出:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16
输入:14
输出:
01 02 03 04
05 06 07 08
09 10 11 12
13 14
如果你想显示 0
s 如果它不是一个完整的行,你可以从打印部分删除 0 检查。
这个可以优化吗?
是的!该数组是无用的,它只包含递增的数字。如果二维数组不是必需的,你可以完全删除它并对打印函数进行一些修改。
int num;
while(!int.TryParse(Console.ReadLine(), out num))
{
Console.WriteLine("Invalid number!");
}
var sideLength = (int)Math.Ceiling(Math.Sqrt(num));
var format = new string('0', num.ToString().Length);
for (int row = 0; row < sideLength; row++)
{
for (int column = 0; column < sideLength; column++)
{
var value = row * sideLength + (column + 1);
if (value > num)
{
Console.WriteLine("");
goto breakBoth;
}
Console.Write($"{value.ToString(format)} ");
}
Console.WriteLine("");
}
breakBoth:
此代码做同样的事情,但没有二维数组。
我正在尝试创建一个程序,您可以在其中向用户询问一个数字,创建一个尽可能接近正方形的数组,并用 1 填充到用户指定的数字。您必须使用二维数组。这是它的外观示例:
用户输入:16
输出:1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
我试过 运行 通过循环来做到这一点,但没有奏效,我希望有人能指导我如何做到这一点
首先让我们获取用户输入:
int num;
while(!int.TryParse(Console.ReadLine(), out num) || num < 1)
{
Console.WriteLine("Invalid number!");
}
之后计算正方形的边:
var sideLength = (int)Math.Ceiling(Math.Sqrt(num));
然后创建二维数组:
var array = new int[sideLength, sideLength];
并将数字写入其中:
for (int row = 0; row < sideLength; row++)
{
for (int column = 0; column < sideLength; column++)
{
var value = row * sideLength + (column + 1);
if (value > num)
break;
array[row, column] = value;
}
}
但是不要写任何高于用户输入的东西,这会让他们 0
,这很好,因为你想从 1
显示它,所以你可以使用 0
检测结束以防用户输入不是平方数。
现在让我们准备一个字符串来格式化数字。如果您希望所有数字的长度完全相同,您可以将其格式化为 int.ToString("0")
,其中 0
的数量将设置长度。让我们创建一个字符串,使所有数字的长度相同。用户输入的是最长的数字,因此您可以使用它来创建字符串:
var format = new string('0', num.ToString().Length);
现在打印数组:
for (int row = 0; row < sideLength; row++)
{
for (int column = 0; column < sideLength; column++)
{
var value = array[row, column];
if (value == 0)
{
Console.WriteLine("");
goto breakBoth;
}
Console.Write($"{value.ToString(format)} ");
}
Console.WriteLine("");
}
breakBoth:
这会将相同数量的数字放在一行中,并且会有相同数量的行,除非它找到 0
,然后它会停止并且最后一行不会是完整的行,如果输入不是平方数,就会发生这种情况。
让我们看看输出:
输入:16
输出:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16
输入:14
输出:
01 02 03 04
05 06 07 08
09 10 11 12
13 14
如果你想显示 0
s 如果它不是一个完整的行,你可以从打印部分删除 0 检查。
这个可以优化吗?
是的!该数组是无用的,它只包含递增的数字。如果二维数组不是必需的,你可以完全删除它并对打印函数进行一些修改。
int num;
while(!int.TryParse(Console.ReadLine(), out num))
{
Console.WriteLine("Invalid number!");
}
var sideLength = (int)Math.Ceiling(Math.Sqrt(num));
var format = new string('0', num.ToString().Length);
for (int row = 0; row < sideLength; row++)
{
for (int column = 0; column < sideLength; column++)
{
var value = row * sideLength + (column + 1);
if (value > num)
{
Console.WriteLine("");
goto breakBoth;
}
Console.Write($"{value.ToString(format)} ");
}
Console.WriteLine("");
}
breakBoth:
此代码做同样的事情,但没有二维数组。