首页 > 解决方案 > 在数组中存储两个数字之间的数字

问题描述

正如您从标题中看到的那样,我正在尝试将两个数字之间的所有数字存储在一个数组中。例如,将 21 到 43 之间的数字(22、23、24、25、26、27、28、29...)存储在一个数组中。

这是代码,我不知道为什么,但它只打印较高的数字减一。

class Program
{

    static void Main(string[] args)
    {

        int higher = 43;
        int lower = 21;
        int[] numbers = new int[22]; //the numbers between 21 and 43 are 22

        for (int i = lower; i < higher;i++)
        {
            for (int a = 0; a < 22; a++)
            {
                numbers[a] = i;
            }
        }
        for (int c = 0; c < 22; c++)
        {
            Console.WriteLine(numbers[c]);
        }
        Console.ReadLine();

    }
}

标签: c#.netvisual-studio

解决方案


这是代码,我不知道为什么,但它只打印较高的数字减一。

这个问题将吸引答案,为您提供六种解决方案,您可以剪切和粘贴以完成作业。

我注意到你没有在你的问题中提出问题——下一次,请以问题的形式格式化你的问题。这里要问的正确问题是我如何学习如何发现我编写的代码中的错误?因为那是你缺乏的重要技能。给你代码的答案不会回答这个问题。

我已经为您提供了一个指向最近答案的链接,我在其中详细解释了这一点,因此请研究一下。

特别是,在您的情况下,您必须阅读您编写的程序,就好像您没有编写它一样。就好像你对别人编写的程序很陌生,并试图弄清楚它的作用。

我要做的第一件事就是查看内部循环,然后对自己说“用文字来说这是做什么的?”

        for (int a = 0; a < 22; a++)
        {
            numbers[a] = i;
        }

那就是“将值i放入数组的每个插槽中。现在看一下外部循环:

    for (int i = lower; i < higher;i++)
    {
        put the value i in every slot of the array
    }

现在在这里使用的技术是在逻辑上“展开”循环。循环只是多次执行某些操作,因此将其写出来。它从 lower 开始,然后到 high-1,因此循环执行以下操作:

        put the value lower in every slot of the array
        put the value lower+1 in every slot of the array
        …
        put the value higher-1 in every slot of the array

第三个循环是做什么的?

        print every item in the array

现在您知道为什么它会多次打印最大数字减一。因为这就是程序所做的。我们只是推理出来的。


顺便说一句,到目前为止发布的答案是正确的,但有些不是最好的。

你有一种你理解的技术“对数组的每个成员做一些事情,那就是:

loop an indexer from 0 to the array size minus one
    do something to the array slot at the indexer

但是其他答案提出的解决方案是相反的:

loop an indexer from the lower to the higher value
    compute an index
    do something to the array slot at that index

了解两者都是正确的很重要,但我的感觉是,对于初学者来说,你应该坚持你知道的模式。我们将如何

loop an indexer from 0 to the array size minus one
    do something to the array slot at the indexer

你的问题?让我们首先为您提供一种更好的循环索引器的技术:

for (int i = 0; i < numbers.Length; ++i)

这是一种更好的技术,因为当您更改数组的大小时,您不必更改循环!您还可以保证阵列中的每个插槽都被覆盖。 设计您的循环,使它们对变化具有鲁棒性并具有良好的不变量

现在你必须弄清楚正确的循环体是什么:

{
    int number = i + lower;
    numbers[i] = number;
}

现在您知道您的循环不变量是“当循环完成时,数组中充满了从较低开始的连续数字”。


推荐阅读