《C语言大学教程(第八版)》第四章 课后习题 4.25 参考答案

前言
  最近在复习C语言,把大学时期落下的东西,重新弥补起来。
  使用的学习教材是《C语言大学教程 (第八版)》,在学习完第四章,遇到了课后练习题4.25,如下图所示:
在这里插入图片描述
  对于,十进制数转八进制数和十六进制数,书中已经给出了提示:可使用转换说明符%o和%X来分别打印。对于十进制数转二进制数,当时小小卡了一下。特此,总结一篇文档,一方面记录,一方面希望可以帮助到有需要的同学。
  注意:本篇文档,建立在,了解不同数制之间的转换规律的基础之上。如果,你还不了解不同数制之间的转换规律,正如书中习题所讲,请先查阅附录C。切记,这一步至关重要!对于学习计算机相关知识,附录C必须静下心来,不要浮躁的学习并完成一遍,要保证相关的讲解都理解了。
  学习附录C的过程中,要咬文爵字,一字一句的啃,不能浮躁,把附录C中的概念叙述文字,一字一句的清楚理解并牢记在心,把例子和附录对C应的练习题,必须每道题都自己动手练习,题做对的基础上,必须理解其中的原因。俗话说得好,磨刀不误砍柴工,工欲善其事必先利其器,没有那金刚钻儿,别揽那瓷器活儿。
  千万别嫌麻烦,只有把附录C作为前提条件,回过头来,才能去解决第四章课后习题4.25。这里,不得不说,作者对这本书的学习节奏安排的非常精妙。在第三章课后习题3.35,,作者第一次引出了二进制数和十进制数的相关习题,如下图所示:
在这里插入图片描述
  当时,在第一次遇到第三章课后习题3.35时,心中就有些迷茫,因为不知道不同进制数之间的转换关系,好在3.35课后习题,给出了详细的说明,没有太多卡壳的完成了。可是,在心中留下了对于不同进制数之间转换关系的注意。到了第四章的课后习题4.25,把心中对于不同进制数之间转换关系的疑问彻底放大了,必须要摆在桌面上正视,仔细弄明白了。其实,学习相关知识就是这样,如果太早给你涉入,可能程度还不到。可如果太晚给你涉入,就显得太晚了。时机很重要,现在就刚刚好。因此,附录C一定要认真仔细的学习一遍。
  接下来,我们开始步入正题。

思考
  首先,我在遇到这个问题时,先去学习附录C并把习题也做了。可是,回过头来,看到这道题目,依然一脸懵。当时,根据附录C,已经知道了十进制转换为二进制的方法,如下图:
在这里插入图片描述
  当时,困扰我的问题是:我要如何设计for循环语句,把1~256每个数对应的位值数找出来。因为,一时半会儿实在没有思路,就去百度,甚至询问了chat gpt。结果,无论是百度还是chat gpt给出的答案,虽然可以正常运行并得出答案,可是给出的解题方法,都使用了超出本书前四章所讲的知识。
  为什么我会有这样的疑问呢,很简单啊,因为,我尽可能的抱着严谨的态度,把自己当成一个第一次接触C语言编程的小白。在这种假设成立的情况下,我目前只学习了前四章的内容,这道课后习题也出现在第四章后,那理所应当,我需要使用前四章所学习的知识来解决这道课后习题。如果,在这个时候,使用了超出前四章的知识来解决这道题目,总会觉得有些投机取巧,这不是我想要的对自己高标准的要求。
  于是,我静下心来,重新审视了书籍的目录,我发现,第四章主要讲解了循环控制语句,如下图所示:
在这里插入图片描述
  想到这里,我甚至一度癫狂的以为,我是不是可以使用switch语句来解决。接着,我重新找到了书籍中对于switch语句的一段描写,如下图所示:
在这里插入图片描述
  仔细研读和思考之后,我发现我想多了,switch语句并不能像我想的那样工作。就在这时,我尝试使用do while语句。结果,显而易见,我没有使用do while语句尝试出解决办法。
  接着,想来想去,结合前面三章的学习以及课后习题大量针对for循环语句的练习。最终,决定使用for循环语句来解决该问题。

解决

第一步:
  按照附录C所讲的规则,先使用for循环语句找出1~256每个数最接近的二进制位值。
在这里插入图片描述  代码如下:
在这里插入图片描述
  这里,我们先声明三个整型变量a,b,c。在for循环语句中,最外层的循环我们先设置为最大为8,先缩小一下打印的数字范围,这样方便我们查看输出的结果和查找错误。
  内层嵌套的for循环语句,以a作为循环的判断条件,不断的进行乘2操作,直到找到最接近的二进制位值。
  这里选择把变量b赋值给变量c,是因为方便后续的使用。
  在下方的控制台,我们看到了相关输出,都是符合附录C中十进制转换为二进制的规则。
  至此,第一步,已经完成了,它是按照附录C中的规则来设计的。
在这里插入图片描述

第二步:
  我们在第一步的基础上,继续处理得到的数据即可。先新增声明三个整型变量d,e,f,把外层for循环语句中的变量a赋值给变量d。在这里插入图片描述
  这一步,为什么要把变量a赋值给变量d,因为后续会对该值进行修改操作,而书中在本章已经讲解过,不能在循环内对for循环语句头中的变量进行修改,不然会引发错误,经证实,确实如此,会导致无限循环。
在这里插入图片描述
  接下来嵌套的第二个for循环语句中,首先,for循环语句头中,将对变量c不断循环除2。for循环体内的语句e = d / c;这是在计算商值。语句f = d % c;是在计算对应的余数。语句d = f;每次相除后的余数替换为下一次相除的被除数,这也是按照附录C中所讲的规则来设计的。
在这里插入图片描述
  不知道被除数、除数、商的关系,可以参考如下图。
在这里插入图片描述
  最后,我们要在两个内嵌for循环语句的逻辑后面加上语句puts(“”);来进行换行操作,因为逻辑到这里,已经完成了1~256中一个数的十进制转换为二进制。如果,不加这一行语句,会导致所有的数字都打印在同一行。
  我们此时运行一下程序,看一下控制台的输出结果,如下图:
在这里插入图片描述
  经过比对验证,得到的结果正确。最后的最后,把外层for循环语句头的条件从a <= 8改为a <= 256即可。
  说明:本文档中所讲解的方法,仅代表我个人,它并不是唯一解,更加不是最优解,有比我的方法更好的方法。正如我在开篇所讲,一方面记录,一方面希望可以帮到有需要的同学。加油~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值