C# 使用二维数组C创建表矩阵#

C# 使用二维数组C创建表矩阵#,c#,arrays,multidimensional-array,2d,C#,Arrays,Multidimensional Array,2d,我正在尝试创建一个程序,在这个程序中,您可以向用户请求一个数字,创建一个尽可能接近正方形的数组,并用1填充用户指定的数字。您必须使用二维阵列。下面是一个示例,展示了它的外观: 用户输入:16 输出:1234 5 6 7 8 9 10 11 12 13 14 15 16 我曾尝试通过循环运行它来实现这一点,但没有成功,我希望有人能指导我如何实现这一点。首先,让我们获取用户输入: int num; while(!int.TryParse(Console.ReadLine(), out num

我正在尝试创建一个程序,在这个程序中,您可以向用户请求一个数字,创建一个尽可能接近正方形的数组,并用1填充用户指定的数字。您必须使用二维阵列。下面是一个示例,展示了它的外观:

用户输入:16

输出:
1234
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 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;
    }
}
现在打印阵列:

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:
输入:14

输出:

01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16
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:
int-num;
而(!int.TryParse(Console.ReadLine(),out num))
{
Console.WriteLine(“无效号码!”);
}
var sideLength=(int)数学上限(Math.Sqrt(num));
var format=新字符串('0',num.ToString().Length);
对于(int row=0;row数值)
{
控制台。写线(“”);
二者皆去;
}
Write($“{value.ToString(format)}”);
}
控制台。写线(“”);
}
两者兼而有之:

这段代码做同样的事情,但没有2d数组。

问题是什么?你想让别人写这样的程序吗?我试着通过运行循环来实现,但没有成功,所以我请求帮助将你尝试过的代码循环添加到问题中,这样我们就可以看到可能的错误。这绝对是有道理的,“数学上限”是什么函数do?@vanquish_vi它将平方根函数的结果取整。将
double
转换为
int
将其向下舍入,这意味着除非它是一个平方数(当平方根函数的结果是一个整数时),否则无法得到整个表。通过四舍五入,您可以得到整个输出,但它并不总是正方形(例如,输入为14)。我建议您删除它,并尝试它自己与不同的投入。
01 02 03 04
05 06 07 08
09 10 11 12
13 14
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: