在数组中的两个数字之间存储数字

时间:2018-05-19 13:16:40

标签: c# .net visual-studio

你可以从标题中读到我试图将两个数字之间的所有数字存储在一个数组中。 例如,将数字存储在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();

    }
}

5 个答案:

答案 0 :(得分:10)

  

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

这个问题会吸引答案,为您提供六种解决方案,您可以剪切并粘贴以完成任务。

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

我已经给你一个最近答案的链接,我在那里详细解释,所以研究一下。

特别是,在您的情况下,您必须阅读您编写的程序,就像您没有编写它一样。好像你对其他人写的程序感到满意,并试图找出它的作用。

我要做的第一件事就是看内循环并对自己说'#34;这是什么用语言?&#34;

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

那是&#34;将值i放在数组的每个插槽中。现在看一下外循环:

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

现在使用的技术是逻辑上&#34;展开&#34;循环。循环只是做了多次,所以写出来。它从较低的开始,它变为更高的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

现在你知道为什么它打印最多的数字减去一次多次。因为是程序的作用。我们只是推理出来了。

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

你有一种技术可以理解为#34;对数组的每个成员做一些事情,那就是:

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;
}

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

答案 1 :(得分:2)

每次循环遍历i时,都会将该数字放在数组的每个插槽中。内循环是造成问题的原因。更好的解决方案是:

int higher = 43;
int lower = 21;
int[] numbers = new int[21]; 

int index = 0;
for (int i = lower + 1; i < higher; i++) // if you want to store everything 
                                         // between 21 and 43, you need to 
                                         // start with 22, thus lower + 1
{
    numbers[index] = i;
    index++;
}
for (int c = 0; c < 21; c++)
{
    Console.WriteLine(numbers[c]);
}
Console.ReadLine();

答案 2 :(得分:0)

将a替换为i

的直接翻译
for (int i = lower; i < higher;i++)
{
  numbers[i-lower] = i;
}

答案 3 :(得分:0)

使用以下

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

        for (int i = lower+1; i < higher; i++)
        {

                numbers[i-lower] = i;



        }
        for (int c = 1; c < 21; c++)
        {
            Console.WriteLine(numbers[c]);
        }
        Console.ReadLine();

答案 4 :(得分:0)

  

我认为更高和更高较低的是变量,因此以下将给出输出   任何更高和更低的数字

class Program
{
    static void Main(string[] args)
    {
        int higher = 43;
        int lower = 21;
        int numDiff = higher - lower - 1;
        int[] numbers = new int[numDiff]; //the numbers between 21 and 43 are 22
        for(int i = 0; i<numbers.Length; i++)
        {
            numbers[i] = numDiff + i + 1;
        }
        for(int b = 0; b<numbers.Length; b++)
        {
            Console.WriteLine(numbers[b]);
        }
        Console.ReadLine();
    }
}