#思考:“//输出1~100中所有能被7或11整除的数,存放在数组a中,并统计其个数 ”

一 .由此问题引入我自己的解题思路

关于这道题:

 

老师的做法是,因为总数只有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需要放在循环里,给数组创建相应的空间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皎月西落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值