小小熊学C故事版第六章啰嗦的怪老

前情大概:在前面的故事里,小伙伴们遇到了一个有多条岔路的森林迷宫,被要求完成各种分支结构语句的题目,从答案中寻找正确的道路。小伙伴们耐心地寻找解题方案,完成了答案,找到了正确的路,走出了迷宫。

大家高高兴兴地走在大路上,刚才那个森林迷宫真是既惊险又有趣,通过完成测试找到答案,大家又学到了很多知识。正走着,朱迪突然喊道:“咦,前面的树下好像有个人呢。”

大家望了望,前面不远的一棵大树下面的确坐着个人,衣衫褴褛。走近看,原来是一个老野人,正在地上画着什么,神情投入,心无旁骛。大家再看看地下,原来老野人正在运算从1+3+5+…+99=?这个算术题。看起来,老野人已经算了很长时间了,地上写满了数字和运算符号:1+3=4,4+3=7,7+5=12…,但是还是没有结果。

“要不,我们帮帮他吧,怎么样?”朱迪说。

“嗯,仅仅使用加法运算,这也太啰嗦了!得加很多次。”本说。

小艾听了,笑着说:“本说的对,本有这种想法是很好的现象,说明我们学会思考了。实际上C++对这种问题有很好的解决方案,就是循环结构。比如我们输出1、2、3…、99、,就可以这样写。”

说着,小艾给出了一段程序:

这样就输出了1、2、3…、99、这个数字。

“怎么样,很简单吧!这就是C++的循环结构,用的是while语句。总结下循环结构的特点,它应该包含四个部分:(1)初始化表达式;(2)循环成立条件判断表达式;(3)迭代表达式;(4)循环体语句;”

画个流程图就是这样:

“那么对应到前面这段代码,代码里面的语句都对应着这四个部分的哪个表达式呢?你们能不能指出来?”小艾说。

“还是小奥来试试吧。”本说。

“好吧,我试试看。”奥卡试着把(1)、(2)、(3)、(4)这四个标记放到代码里去。

i=1要先执行,以便让i有个初始值;i=是循环的成立条件判断表达式,只有i在小于的情况下,才会继续执行循环;coutiendl;是循环要执行的内容,也就是循环体语句;这时候千万别忘了i++;这个迭代表达式,如果i的值不变化,那么i=就会永远为真,循环就会成为“死循环”,就是说会永远循环下去!所以一定要改变这个i值。总的来说,循环语句的执行次序是这样的:(如图所示)

奥卡完成之后,小艾看了下,表示很满意:“好,接下来大家完成这个题目吧,从1+2+3+…+99+=?完成从1加到的和。”

小伙伴们聚在一起研究,现在从1到的这些数字都可以输出了,如果需要求和,那应该怎么办呢?看来需要把和放在一个变量里才行。假设这个变量为sum,那么只要把每次i的值(1、2、3、…、99、)都累加到这个sum变量里就可以了。小伙伴们把程序稍微改动了下完成了这个求和运算。

小艾微笑着说:“完成得很好,sum=sum+i;就是累加器程序。你们已经完成了1+2+3+…+99+=?的累加求和,那么其中求奇数的和1+3+5+…+99=?该如何做呢,你们现在已经有能力完成了,记得使用前面我们学过的运算符和分支语句的知识。”

有了前面的经验,三个小伙伴很快就完成了这个求奇数的和题目,代码如下:(你是不是也一样完成了呢?把空白处填上吧。参考答案6-1)

大家对老野人说:“老人家,别算了,这道题的结果是,我们已经帮你算出来啦。”

“哦,是吗?!咳咳,不过答案真的是,你们真棒!”老野人说,“可是我们部落里还有一道题是1×2×3×…×=?这道题很难,因为直到现在我们部落里也没有人算出来!”

“是吗,不过看起来似乎也不是很难啊?”

小艾说:“这道题的确很特别,你们可以试一试看。”

“好啊,”小伙伴们都跃跃欲试。

小艾说:“给你们个程序模板吧,再学习一个新的语法,for循环。”

这段程序是这样的:

对照while循环的四个部分,for循环也不例外,也有这四个部分,但是for循环比while循环书写更简洁。

小艾说:“我已经把for循环的基本结构写出来了,剩下的部分需要你们来填写。”

本说:“这个简单啦,累加器程序是sum=sum+i,那么累乘器就是p=p*i喽,就是这样呗。”

说着,本写了段程序如下:

“不对,不对!”大家异口同声地说。

“什么?”本挠挠头,“有什么不对的呀,感觉没问题啊!?”

朱迪说:“本,你也太马虎了!你把这段循环程序运算下看看,循环两次就发现问题了。”

“是吗!?”本试着把自己写的这段代码运算了下,果然发现了问题(聪明的你也发现了错误所在吗?),没错,一个经常容易忽略的问题,累乘器的起始值P应该为1(而不是0)。

但是,本把这段程序修改完毕后再运行,却发现了一个奇怪的结果,例如下面:

为什么会出现这种奇怪的结果值呢?小伙伴们都很迷惑。

小艾提示说:“你们考虑下p的取值范围,就明白为什么会出现这种情况了。p是整型数,占4个字节,4×8=32位的存储空间,也就是说p的取值范围是(-2-31~-1)之间,那么到底是多大的值呢?你们可以用科学计算器计算出来,也可以使用下面这段程序计算。”

(用windows里面的计算器--gt;科学型计算

(用windows里面的计算器--科学型计算器来计算的结果)

引入一个数学函数pow(2,31)就可以了(它在math.h库里),结果是:

结果与科学计算器的完全一致(注意:int型数据的上限是-1)。

“哇,这个pow()函数太神奇了!这样一来,计算幂就简单多啦,”小伙伴们说。

“是啊,现在再来看看原来那段求1×2×3×…×=?的题为什么会出错,原因很明显了吧!”小艾说。

“超出了p的整型取值范围!”大家异口同声地回答。

“正确!”小艾笑了,“正因为1×2×3×…×的结果太大,超出了整型取值范围,所以野人部落才总是得不到正确的结果!”

“那怎么办呢?”本问。

朱迪说:“本,你能不能开动下脑筋啊!?找个大点的取值范围的数据类型就行啦。”

本不好意思地说:“对啊,找个大点的类型,那就long?可能还是不太够,那就double吧,取值到E的次方,应该可以了。那就修改成这样。”

终于完成了答案,老野人也很高兴地说:“其实,我是野人部落的酋长。听说你们帮助小野人完成了测试,所以在这里再考考你们,现在你们帮助我解答了部落的难题,我十分感谢你们!野人部落永远是你们的朋友,”说着老野人拿出了一个骨头刻成的哨子递给小伙伴们,“朋友们,如果你们遇到了麻烦,就吹响这个哨子,我们野人部落的人如果在附近,就一定会赶来帮助你们!”

小伙伴们收起了哨子,向老野人表示了感谢。老野人就弯腰行了个礼,退入森林中转眼间就消失了。

“野人部落的人真是行踪诡秘啊!好在他们现在成了我们的朋友,在这个神秘的荒岛上多一个朋友总是好事。”

“现在分支和循环都学会了,我怎么感觉我似乎强大了很多呀!”本说着,拍了拍脑袋,“是这里呀!”

大家哈哈大笑。

//--------------

(版权所有微博

小小熊爸比,分享或转载前请标明出处!)

故事后记:

1)学会循环了,练练手吧:

问题描述:开始有一对小兔子,过两个月后长成一对大兔子,从出生后第3个月起每个月都生一对小兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?

程序分析:兔子对数的规律为数列(斐波那契数列)1,1,2,3,5,8,13,21....

用c++编写一个程序,输出以内的兔子数列?

2)十进制转二进制,用代码如何实现?




转载请注明:http://www.aierlanlan.com/rzdk/4632.html