计算机1-4班第02次作业思维总结

 

如果看完还有疑问的在评论区评论即可。如果有必要我会详细回复的。不过这个文章没有程序实例答案,想要答案的请绕行。

个人认为,本次作业由于新加入的选择语句和条件语句因而难度相对增加(除了几个弱智到仅用4行语句的题)。于是此次思维总结相对来说还是比较重要的。

(注:凡是此篇提到的所有问题,包括与之相关的一系列问题,我将不再现场讲解,请勿频繁打扰)

PART 0章前补充&总结

1、关于上次作业的a=x/100*y之类的WA问题,我思考了好长时间(不是大神,水平有限),现共享一下个人看法。仅供参考:

我们知道adouble,而x,yint,则根据左结合性,当OJcomplier在计算x/100*y这个表达式时是以int来计算的,即如果x55y3时,则x/100*y的值为1而不是所求的1.65。这就需要我们在此题和以后的编程中定要注意所计算的值的精度问题(若要x*y/100以及x*1.0却没有问题,为什么?你能解释吗?)

2、关于条件表达式(或选择操作符、条件操作符)的赋值问题。有一部分同学在上次以及此次作业中不能熟练运用if条件语句就运用了条件表达式。结果在条件表达式写出了如下语句(仅供示例):

x>y?x=2:x=y;

此句有问题?没错,对于条件表达式的赋值操作上我们一定要注意不要写成以上形式,而是写成如下格式:

x=x>y? 2:y;

为什么?首先我想说,条件表达式在C系中规定的用法就是“x=<表达式1>?<表达式2>:<表达式3>”。其次,如果真想问为什么,我只能这么解释:

这里我们可以将表达式23看成一个整体,一个什么整体呢?一个只有表达式的不完整赋值语句。如果有一个完整赋值语句是这样的:a=b+c;,那么表达式23仅仅是作为此语句的右侧部分“b+c”,即使你的语句写成了a=b+c。那这样的话,我们可以想象这个整体并没有把值赋给任何变量,而是存在内存等待消亡。于是,这样的不是问题的问题便成了问题。

3#define的格式是#define <常量名> <常量值>而不是#define <常量名>=<常量值>。这个问题是我在01作业思维总结博文里面说的(还记得我脑残写的那个#definePI=3.14159265358么?),不是同学们犯的错误,是我犯的错误……::>_<::……当时就觉得宏定义常量值写错了,结果后来查看资料时猛然发现#define定义时并没有等号。不过很奇葩的是当时我加等号在cb上竟然运行成功了!于是这就让我深知不要迷信任意一款complier,否则你会死的很惨……还是需要靠自己严格按照国际标准来编译并检查程序啊。(或者说,OJ平台太过于严苛?)

4、我需要补充一点的是关于运算符%,我们可以叫他取余符号,但更多的是叫其为取模符号。在以后我可能说题讲题的时候说着说着就取模了,各位也不要在意,知道即可。

PART 1 Problem 1013/1014

基础运用,1013是除数和数据类型的巧用,1014直接没技术含量,不再赘述。

PART 2 Problem 1015/1016

两个题目很巧妙的考察了数据类型的类型种类及其表示范围,尤为1015明显,不仅仅需要long long int,而且还要unsigned定义,并且在等差数列求和时应考虑如何在保证精度的情况下缩小所输入数据的大小再进行加或乘的计算,以防止程序溢出报错。(同理,想一想为什么在计算等差数列求和时需要分奇偶?)

1016是一道奇葩的题,下面HINT所说的“IEEE-754标准的浮点数存储格式”是什么?为此我特意翻看了相关文档,并摘录重组了如下文字:

在计算机中,浮点数一般由三部分组成:数值的符号位、阶码和尾数。这种浮点数是用科学记数法来表示的,即:浮点数=符号位.尾数×2阶码,而根据根据IEEE-754国际标准,常用的浮点数有两种格式:(1)单精度浮点数(32位),阶码8位,尾数24位(内含1位符号位),(2) 双精度浮点数(64位),阶码11位,尾数53位(内含1位符号位)。当然,还有一种叫临时浮点数(80位)的东西,它的阶码15位,尾数65位(内含1位符号位)。而且,在单精度和双精度等浮点数溢出时,IEEE-754也可以运用其规则处理表示,即使用非规格化数。这时阶码为0(即移码-127),尾数没有隐含位,最高位是0(但这种处理方法的结果虽然扩大了表示范围,但也同时降低精度,。如原来规格化单精度最小值是1.0x2-126,而非规格化单精度最小值是2-23 x2-126=2-149(只有1位有效位)。

所以,对于实数的表示,浮点类数据类型是相对可靠的。如果有需要深究IEEE-754国际标准的同学可以下载我提供的CSDN资源来详细阅读一下这些文档:http://download.csdn.net/detail/u011482204/6433935(需要注册CSDN账号,不过注册一个CSDN账号对一个理工科信息类专业的学生是必要的,乖~~~~)

不过对于此1016题的代码却令人哭笑不得,最简程序行数与1014一样,对此我只能说一句:呵呵。不,再加一句:我只能帮到这里了。

PART 3 Problem 1020/1021/1022/1023

四个题作为杭电OJ-ACM Steps的原题或变式出现在此次作业上让我一阵窃喜,这里有几个题用到了EOF这个未来经常用的转义字符以及循环退出break;的特殊条件以及用法。具体各位可以探究一下,四个程序的语句基本不过6句,所以很简单,慢慢来吧。

PART 4 Problem 1017/1018/1019/1024

四个题相对复杂,不过还是基础题。

1017字符串的长度比对,如果看看参考书很快就能解出这个问题,这就需要我们养成“现学现卖”的本领。而对于“gets()scanf("%s")读入字符串的不同之处”,我又查阅了相关文档,现共享如下:

scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hihello",则应该使用gets函数。

gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。

char string[15]; gets(string); /*遇到回车认为输入结束*/

scanf("%s",string); /*遇到空格认为输入结束*/

所以在输入的字符串中包含空格时,应该使用gets输入。

scanf和gets获取字符串时的区别

在C语言中,能构获取字符串的函数至少有两个:

1.scanf()

所在头文件:stdio.h

语法:scanf("格式控制字符串",变量地址列表);

接受字符串时:scanf("%s",字符数组名或指针);

2.gets()

所在头文件:stdio.h

语法:gets(字符数组名或指针);

两者在接受字符串时:

1.不同点:

scanf不能接受空格、制表符Tab、回车等;

而gets能够接受空格、制表符Tab和回车等;

2.相同点:

字符串接受结束后自动加'\0'。

于是有些事我们就清楚了。

1018三个数比较大小的问题可能是需要费脑子的第一个题,具体来说此题的关键是如何用尽量少的条件语句来输出所要的结果。很多时候我们并不需要依次比较出最大值中间值和最小值才能出结果。可能仅仅比较一下最大值的情况,自然而然的就完成排序了。另外此题还可以需要一个“空杯变量”来实现变量之间的置换。很神奇吧~

1019的要求比1018还要深一点,对于所符合条件的数的运算,我们需要通过数学逻辑判断后再翻译为程序高级语言。这里我们需要考虑的是公倍数的要求,可以是mn的公倍数但不是mn的公倍数,需要怎么运用逻辑运算符撰写条件?当然这个问题考虑的很简单(这是数学问题啊!不要问我!不会问你们的数学老师吧!)。而那个临界值输出空格的问题的确是需要考虑一阵的。我们可以说临界值这个问题是一个非常纠结的问题。目前此题我想到的方法是限制首个输出要求的数,后面的数按照循环批量输出即可。而对于限制最后一个输出要求的数我目前还未找到有效方法,可能别人又很好的方法我不知道吧,如果有做出来的希望能跟我说一声,我们共同探讨共同进步!

1024这个题对于我来说,重点在于for语句的条件的使用,一旦使用不好会出现死循环或者出现不应该出现的数的。而且这个题对于前面某些细节的考察是比较多的。这个题目前问的人不多,看来比较好想,如果有问题可以向我讨论,此题本文就不再赘述了,如果有很严重或者深入的问题我将在下一次思维总结中补充的。

PART 5术后语

我已经放弃治疗好长时间了,所以能看到这里说明你很有毅力。

这一段时间问题的人数明显下降,我也可以抽空补充点知识了。对于这周内发生的一些事情,我想说的是:只要我自己能做到的,就不要求别人。

可问题是,我们有的时候很有惰性,或者说,我们被身边的人浇灌一种思想叫做“不会不懂就问别人”。可能在人情世故、社会百象之中这是一条亘古不变的法则,但是,在学习一门技术,或者放缩范围,学习一门编程语言时,这个思想可能会害人害己。

也就是我上篇文章所说,你浪费了他人的时间——假如他在思考一件事或者干着某件需要紧急完成的事,或者说……失恋了,心情不好喝闷酒——同时,自己如果不吸取经验,问别人照样无果。我这里不是说不赞成问别人,一开始学习必须有臭不要脸的精神去问人,哪怕别人已然不耐烦。但是呢,随着学习的深入,我觉得还是靠自己为好。

我上篇文章就谈到过:“求人不如求己,求己不如求书,求书不去求Google(非百度)”。这不是吹的,搜索引擎是一切知识的月老,你想搜的一切知识肯定能从这里找到它的归宿的。所以再碰到问题时,先找搜索引擎是相对好的,如果身边有课本之类的查课本也未尝不可。最后才问人,也就是说你的程序如果没憋到一个小时,那你问人是印象不深刻的。

就拿我来说,现在情况是向上问不到老师——搞科研的搞科研,顾家的顾家。向下没法问,刚刚来大学认识的大神又少,只能靠自己在网上搜索些知识或者看相关算法书来充实自己了。唉……我不是大神,我只是看书看得巧罢了……

还有说一点个人问题,我最近心情不大稳,主要原因……不想说了,很心痛。所以如果问问题的话,如果我能控制住心情的话我尽量会讲的,如果不请找别人吧……在此提前跟各位说声抱歉。

同时我想说一下,最近我想看下算法之类的,与此同时看C/C++。好长时间不写C++确实手生了。不过就这样吧,希望能进步的更多一些。加油!如果有同志向的同仁,欢迎加入哦~

好晚了,就写到这吧,有什么补充的我下次再补充。

写于 20131023日凌晨

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值