1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
这两周主要学习了循环结构。包括三种比较基本的循环,while、do-while、for,再通过一些嵌套,解决一些更为复杂的数学问题,需要对于循环条件有更清晰的认识与把控;同时学习通过引入一些中间变量,如flag来控制输出;再者还学习了break&continue两种特殊的语句,便于控制循环。总的来讲学习的内容需要更灵活地运用到题目的计算当中。但是也出现了不少的问题,如对于变量的初始化的不注意,可能会导致错误答案的输出或者死循环。因此在进入循环结构之后,更需要养成手动调试程序判断程序错误的好习惯。除了最基本的调试方式,还学习了printf的调试方式,通过一次性地输出循环的全部答案,便于找出循环量较大时的问题所在。在本周尝试更正自己的做题步骤,先分析题目,通过伪代码来缕清思路,写出基本的代码框架,再逐步进行调试。因为代码量较上周更多,更复杂,就需要通过注释的形式,增强阅读性。本周的刷题速度较慢,正确率较低,望下周能扎实基础,复习巩固
1.2.2 代码累计
2.PTA总分
2.1截图PTA中循环结构2次题目集的排名得分
2.2 我的总分:
总分:290
3.PTA实验作业
3.1 PTA题目1
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
3.1.1 算法分析
定义 num被猜数,guessNumber猜数,i可猜的次数,n已猜的次数,flag控制循环
输入 num被猜数,guessNumber猜数
do
{
输入guessNumber
if guessNumber<0 输出游戏结束
else if guessNumber==num
{
flag=1
if(n==1)输出Bingo!\n
else if(n==2||n==3)输出Lucky you!\n
else 输出 Good Guess!\n
}
else if guessNumber>num&&flag==0&&i<n未猜中
输出Too big!\n
else
if n<=i&&flag==0偏小 输出Too small!\n
if n>i&&flag==0 //超出次数 未猜中 输出游戏结束
} while(guessNumbe>=0);
end while
3.1.2 代码截图
3.1.3 测试数据
3.1.4 PTA提交列表及说明
- Q:第n次输入错误后,直接gameover 答案错误
- A:题意的理解出现偏差,在第n次输入数据,如判断错误,仍要输出偏大偏小,而第n+1次无论正确与否,都输出gameover。
- Q:猜中后,直到输入一个负值结束循环,其他数值正常输入不输出。出现输入其他数值,还会判断是否偏大偏小。
- A:引入flag,控制输出条件,如输出正确后,给flag赋值,再用if语句控制输出条件,即可解决问题。
3.2 PTA题目2
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。
3.2.1 算法分析
定义 length=0单词长度,blank=0有无空格(区分第一个单词和后面单词的区别)exsit=0存在单词,用于输'.'前的最后一个单词长度,flag=0计入非空格字符,ch字符
while ch!='.'//输入句号前的所有字符
if ch!=' ' length++,exsit=1,flag=1//开始计数过滤空格
if flag==1&&ch==' '
if blank==0 输出长度 blank=1//自此后的数字前面要输出空格
else 输出 长度 length=flag=0
end if
ch=getchar()//循环输入
end while
if exsit==1&&length!=0 输出 长度 //单独判断最后一个单词
3.2.2 代码
3.2.3 测试数据
3.2.4 PTA提交列表及说明
- Q:while条件为(ch!=’.’)时,最后一个单词的长度无法输出
- A:在测试数据时发现这个问题,因此增加了一个变量exsit,单独控制最后一个单词长度的输出。
- Q:对于多空连续空格的过滤出现问题
- A:在这个问题解决上花费了比较长的时间,听取同学的建议,多设置了一个变量flag,来控制if条件语句,当输入为空格时,flag=0,避免空格的重复计数,当真正输入字符后,flag=1,在遇到下一个空格前进行length++,计算长度,实现了空格的过滤。
3.3 PTA题目3
3.3.1 算法分析
定义 time时间,rabbit兔子跑过的路程,tortoise乌龟跑过的路程,i经过的时间,rest休息时间,run跑步时间
输入 time时间,定义rest=0,run=10
for i=0;i<time;i++ 每分钟循环一次
tortoise+=3;乌龟 一直跑 3m/min
if run==0;run=10;
if rabbit>tortoise rest=30//跑10分钟做一次比较,判断是否休息
if rest==0//非休息时间
rabbit+=9;run--;end if// 兔子跑 跑步时间减少
if rest>0 rest--;
end for
if(rabbit<tortoise)
printf("@_@ %d",tortoise);
else if(rabbit>tortoise)
printf("^_^ %d",rabbit);
else printf("-_- %d",rabbit);
end if
3.3.2 代码
3.3.3 测试数据
3.3.4 PTA提交列表及说明
- Q:对于休息时间和跑步时间的划块。
- A:这道题在dev c上尝试了两种做法,一种是老师上课说的利用time%10来划块,一种是上述代码,利用时间的递减循环来判断。在代码量上,第一种方法会简便些;但是直观上,第二种方法便更具可读性。
4.代码互评
4.1 代码截图
-
同学代码截图via.范华
-
自己的代码截图
4.2 二者的异同
- 相同: 两段代码唯一的相同点,在于算法思路的相同。都是先统计各分数段打分的人数,再通过for循环逐个输出
- 不同:范华同学采用了数组(我还不会)简便了代码,而我采用了比较基础的for循环对于人数进行累加;在控制输出时,范华同学直接使用嵌套的for循环,逐个输出1.2.3.4.5.对应的人数,在这个地方我选择的是更为直观的手动输出。
- 范华同学:嵌套循环和数组的结合使代码简洁,变量少。
- 我:代码量多,但是思路在现阶段更为明朗,在最后a手动输出则使代码有些赘余,可以学习范华同学的for循环