一 .由此问题引入我自己的解题思路
关于这道题:
老师的做法是,因为总数只有100个数,符合条件的数一定小于一百,所以定义一个含有100个空间的数组。再定义变量n,这里的n表示数组的下标,每遇到符合条件的数就填入到数组的空间里,并使下标+1,如果没遇到就不填入(if语句)
但这样做有一个很大的缺点,就是数组中剩下的位置并没有被填满,都是空白的。这样,数组的空间就被浪费了
这就让我想到了变长数组:
在事先不知道元素个数的情况下定义一个数组。在程序运行时精准分配数组的长度:
这里需要注意VS集成的是MSVC编译器,这个编译器不支持变长数组的创建。而集成gcc编译器的软件如Dev C++和小熊猫C++才可以创建变长数组。
于是,我下载了Dev C++来进行实践操作。
二. 为解决此问题经历的失败
然而我前几次定义变长数组,都以失败告终。一个学长告诉我需要把变量n初始化,预留一个初始的数组空间出来,等之后再通过代码去变化这个空间。
这与我学到的只是相悖。我所学的变长数组,是不能够给变量初始化的,并且程序一旦运行起来,数组空间就是不变的。
于是,我打算继续尝试,我相信实践出真知。
我尝试给数组初始化:
但如果是这样定义一个变长数组(给数组初始化足够的空间),仍是和直接定义一个含有一百个元素的数组没有区别:
然而,不给n初始化 或者 给n初始化为0 的结果都是只会打印一部分,程序运行一半会终止
不给n初始化:
n初始化为0:
难道跟n初始化的值有关?
我一个个尝试,发现果然,当n等于0,4,8 这些相差4的数时,打印出来的元素就会慢慢变多,每次多出来的也都是4个元素。直到n=16,能装满所有元素,才会接着运行下面的代码(计算sz1,sz2的那个)。
对这个问题,我衍生出了自己的猜想,详情见标题四。
经过不断的尝试、更新、对比,我发现解决这个问题的方法是在if语句里加上n=m的限制条件才能在屏幕上输出所有数据。
三. 一次偶然的尝试让我走上了正确的方向
这其中又包含了多次的失败:
//第一次在屏幕上输出成功,让我看到了成功的希望:
//第一次在屏幕上输出所有符合条件的数,但结尾却出现了一个乱码——最后的问题
最后,改n=m+1为n=m才终于成功:
至此,这个困扰了我许久的代码终于被完整的写了出来。这本是老师上课布置的一次拓展任务,但我当时并不能很好的解决。很多问题还不懂,于是我把这个问题留下了,等到日后学习得更深入再回头来看这个代码的解决方案·。直到昨天,我在完整地数组和调试之后,终于重新审视了这个问题。
虽然我解决了这个代码所要实现的问题,但还遗留下来几个问题等待我去解决。
四. 遗留下来的、目前没能解决的 问题和思考
第一个问题是:为什么要在if语句里的末尾加上n=m,代码才能完整运行,打印出需要的数据?换句话说,没有加上这一行代码的时候,屏幕上输出的数据个数为什么会与n的初始化的值有关?
对于这个问题,我对此做出了一种自己的解释:n=m的作用是给数组创建一个能容纳n个元素的空间,如果没有这个赋值的过程,数组就是没有创建它的空间,自然容纳不了全部数据。而那个初始化的过程就是给数组开辟一个存放数组元素的空间。
但我不能解释n不初始化和初始化为0的区别为什么是图示情况。我观察到初始化n的值每+1,存储的数据就能增加4个,我在想,这和整型int能存放四个字节会有什么关联吗?
第二个问题是:n为什么要等于m?
在之前的错误中,我发现如果是n=m+1会多出来一个乱码;
但m的初始值为0,所以m应该是从零开始 递增到 m取值为21的时候结束,而这之间应该是有21+1个元素的。所以n不应该是等于m+1=22吗?(我在代码中表达的是:m表示下标,而n表示元素个数)。这个问题我还没有搞清楚。
以上问题欢迎各位道友一起探讨、恳求各位大佬帮忙解惑,在这里对大家的参与表示感激!!!
五. 其中的插曲
在标题三中,我偶然下对代码进行更改最后成功运行。起初,我认为这是printf的位置不同造成的偏差。但因为我不了解在Dev C++环境下的调试观察代码,只能在VS里重新创建一个类似的代码进行调试和观察。在VS里又不能创建变长数组,所以我重新写了一个代码,创建了一个新的具有100个空间的数组。
在VS环境中,我把printf函数分别放在for的外面和里面对比打印,发现输出的结果是一样的,这才让我从头到尾重新对比Dev C++中两次运行的代码,最终发现问题所在——n=m需要放在循环里,给数组创建相应的空间。