C语言--第2次作业
1.本章学习总结
1.1思维导图
1.2本章学习体会及本章代码量
1.2.1学习体会
不同于前几周简单的条件语句等,这一周开始学习循环结构for,while语句,甚至是多种语句嵌套使用,让我直接感受到编程的难度,嵌套要求的不仅是基础代码的熟练使用、各个语句的掌握到位,更是对于思维的锻炼,在这一章的练习中,我发觉自己在循环嵌套方面十分生疏,有的题目很难得到思路,容易直接下笔,明白部分题需要动脑思考去简化进而提高代码质量,慢慢加油鸭,不能惧怕去写较为复杂的程序!
首次接触continue和break语句以及flag变量的使用,方便将程序分为几种情况,不失为一种好工具。随着代码量的越来越大,程序调试为代码纠错提供了非常大的便利,调试十分有用的同时也十分有趣,林丽老师推荐的printf调试法也十分实用,在每一次错误之后,不要立马去问别人,而是学会自己调试,发现错误,自己思考,改正错误,养成独立思考的习惯;
除去代码学习,这章还接触了在我看来如同列草稿的伪代码,写程序前使用伪代码将思路写下,进行算法分析十分有效,可以养成好习惯。
不懂的地方:部分循环语句需要scanf两次
1.2.2代码量
2.PTA总分
2.1循环结构题集1+2
2.2我的总分
总分:290
3.PTA实验作业
3.1题目一
龟兔赛跑比赛
乌龟每分钟前进3米,兔子每分钟9米;
兔子每跑10分钟回头看一下乌龟,若发现自己超过乌龟就休息30分钟,否则继续跑10分钟,而乌龟不休息;
假定乌龟与兔子在同一起点同一时刻开始起跑,比较T分钟后乌龟和兔子谁跑得快.
3.1.1算法分析
- 定义兔子路程distance1,乌龟路程distance2,休息时间restTime,(皆初始化为0),运动时间runTime=10,规定时间time;
- 在规定时间范围内循环输入时间
for from i=0 to i= time i++
- 从开始每十分钟做一次判断
if(runTime==0) then runTime=10 ; if(restTime==0) then runTime--
- if distance1>distance2 休息30分钟(即restTime=30),restTime--, distance2+=3
else restTime=0 distance1+=9,distance2+=3
end for
- if(distance1<distance2)
printf("@_@ %d",tortoise);
else if(distance1>distance2)
printf("^_^ %d",rabbit);
else printf("-_- %d",rabbit);
end if
3.1.2代码截图
3.1.3测试数据
3.1.4PTA提交列表及说明
说明: 这道题是在Devc上做了很多次,测试多组数据后放到PTA上所以提交结果只出现一次错误;
错误原因: 多个if分类讨论不清晰,造成答案错误,经过重新分析题目,列草稿,得出正确答案;
值得汲取经验:描述较长的题目划出重点,即化文字直接转化为代码,运用多个条件语句时注意每一部分的逻辑是否清晰,括号的一一对应,注意休息时间和运动时间的特殊化,进而按情况赋予初始值。
3.2题目二
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,计算有几种不同的换法
3.2.1算法分析
- 定义硬币种类:fen5,fen2,fen1(注意每一种都要有),初始化为零只是方便后面语句,零钱为x,硬币个数count=0;
- 三种硬币同时存在,互不干扰但是各种可能互相搭配,故采用三个for循环嵌套,极限思想,
for from fen5=1 to fen5=x/5,fen5++ {for from fen2=1 to fen2=x/2,fen2++ {for from fen1=1 to fen1=x,fen1++}
- 当满足条件
if fen55+fen22+fen1=x then printf(“”)count++ 最后输出count的值
3.2.2代码截图
3.2.3测试数据
3.2.4PTA提交列表及说明
说明:老师在课堂上详细讲解了一道类似的题,所以这一段代码非常顺畅,之所以记下来是因为解法较为特殊,值得记下来;
值得汲取经验:本题要求算出各种可能的解,较为抽象,思路非常重要,首先要明白各种硬币的取数互不干扰但互相配合,应将各种硬币所有可取数自由组合,再从中挑选符合题意的,即根据极限思想,算出只用某一种硬币,需要的最大数量,嵌套循环,保证各种可能性
3.3题目三
输入一段文本,统计每个单词的字母数,以句号为结束标志(单词中的字符也算一个字母),每个单词之间以空格隔开
3.3.1算法分析
- 定义num为字母数,blank判断是否有空格 ,word是否存在单词,flag判断是否为单词,皆初始化为0;
- 情况一:输入一句话,句末存在句号结束输入 while(ch!=“.”)
是单词 if(ch!=“ ”)then flag=1,num++,word=1;
第一个结果前无空格 if flag==1&&ch==' ' &&blank==0,直接输出字母数,
之后的即在前加一个空格,printf(“ %d”)
每一次循环末端将flag和num归零便于下一次判断统计
输入最后一个单词, if(word==1&&num!=0) blank!=0 printf(“ %d”)
- 只输入一个单词,if(word==1&&num!=0) blank==0 printf(“%d”)
3.3.2代码截图
3.3.3数据测试
3.3.4PTA提交列表
说明:这道题不是非常难,但是由于考虑欠缺,在Devc上尝试了很多次加上同学的建议才做出来,值得记下来
第一次做的时候忽略了flag和num的归零问题,改过来之后,发现自己还忽略了如果只输入一个单词的情况,应该记录下来,提醒自己以后要仔细 分析每一种情况,理清逻辑,内外for循环的变量名相同会导致程序错误!
4.代码互评
4.1代码截图
同学代码
我的代码
4.2代码对比
相同点:1.均采用for循环输入数据;
2.采用五个for循环分别输出每一种结果的 *;
不同点:1.对于每一种结果的统计方式:他采用数组的方式,不用输入每一种情况,对于整个程序来说较为简洁,我还没有接触数组,只能老老实 实将每一个情况输入,代码量太大,质量不高;
2.对于结果的输出方式:他依旧借助数组,省去麻烦,不用编写五个for循环,整个程序简洁明了,代码质量较高,易于编写
值得学习这位同学的提前学习,自主学习意识,有简化程序的意识,勤于思考,但是数组在一定程度上没有for语句清晰明了![]