0

我有以下非常基本的代码:

静态无效主要(字符串 [] 参数)
{
    int n = Convert.ToInt32(Console.ReadLine());

    for (int i = 0; i < n*3; i++)
    {
        字符串[] 数字 = Console.ReadLine().Split();
        Console.WriteLine();
        Console.WriteLine(数字[i]);
    }
}

它应该采用以下数据:

3  
11 9 1  
14 90 232  
111 15 111  

它使用第一个数字来确定它们的数据行数(这是有原因的,但超出了这个问题的范围。
循环应该采用第 2、3 和 4 行并填充 numbers 数组,拆分数据向上所以 numbers[0] = 11, numbers[1] = 9, numbers[2] = 1 ... 等等。我看到的是它将第一个数字放入数组中并移动上。这是它目前正在做的事情的预览:

3  
11 9 1

11  
14 90 232

90  
111 15 111

我希望输出是:

3  
11 9 1

11 9 1  
14 90 232

14 90 232  
111 15 111

111 15 111

我可能正在做一些完全愚蠢和明显的事情,但我仍在努力学习 C#。

4

2 回答 2

1

让我们一步一步来

  1. 你输入 3 所以n = 3for 循环中的代码将运行 3 * 3 = 9 次。
  2. 11 9 1这样输入string[] numbers = { "11", "9", "1" };
  3. 然后它将打印一个空行。
  4. i = 0现在开始,它将打印numbers[0]哪个是"11"(它将打印11)。

此时的输出如下:

3
11 9 1

11
  1. 你进入14 90 232,所以string numbers = { "14", "90", "232" };
  2. 空行
  3. 现在这是我们第二次通过循环和i = 1. 所以它会打印numbers[1]哪个是"90".

此时的输出如下:

3
11 9 1

11
14 90 232

90
  1. 你进入111 15 111,所以string numbers = { "111", "15", "111" };
  2. 空行
  3. 现在这是我们第三次通过循环和i = 2. 所以它会打印numbers[2]哪个是"111".

此时的输出如下:

3
11 9 1

11
14 90 232

90
111 15 111

111

如果您输入类似1 2 3包含三个数字的内容,您将遇到错误,因为这将是我们第四次通过循环,i = 3并且由于numbers包含三个元素,您将看到以下内容:

System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

在此处输入图像描述

我推荐string.Join()来获得您的预期结果。

以下是解决方案:

静态无效主要(字符串 [] 参数)
{
    int n = Convert.ToInt32(Console.ReadLine());

    for (int i = 0; i < n*3; i++)
    {
        字符串[] 数字 = Console.ReadLine().Split();
        Console.WriteLine();
        Console.WriteLine(string.Join(" ", numbers));
    }
}
于 2020-06-23T12:27:29.863 回答
0

如我所见,您的 numbers 数组在循环内,因此每次循环进行迭代时,数组都会重新初始化,所以是的 - 您的程序确实将所有数字放入数组中,但只打印第i个元素,甚至如果它运行 9 次,它将初始化数组 9 次(虽然这是一件大事)。下面是一个更简单、更容易的代码。

static void Main(string[] args)
{
    int n = Convert.ToInt32(Console.ReadLine());
    string numbers[3];

    // read n lines, one by one
    for (int i = 0; i < n; i++)
    {
        numbers = Console.ReadLine().Split();
        Console.WriteLine();

        // print the 3 numbers, either using a smaller loop or simply indexing        
        // I use a loop here to make it more dynamic

        for (int j = 0; j < 3; j++) {
            Console.WriteLine(numbers[j] + " ");
        }
    }
}

虽然我不完全理解您的预期输出。是否要再次显示最后打印的行?如果是,您可以在将新数字读入之前简单地打印数字数组(确保它不为空,使用布尔标志或其他东西)。

于 2020-06-23T12:21:10.207 回答