C语言博客作业02--循环结构
0.展示PTA总分(0----2)
1.本章学习总结
1.1 学习内容总结
- 1.while语句:
while语句用于循环,而且它的适用范围比for更广,一般形式为:
while(判断表达式)
{
循环体语句;
}
while语句的执行流程如图所示:
- 2.do-while语句:
for语句和while语句都是在循环前先判断条件,只有条件满足才会进入循环,如果一开始条件就不满足,则循环一次都不执行。
而do-while语句与上述两种语句略有不同,它会先执行循环体,后判断循环条件。所以无论循环条件的值如何,至上会执行一次循环体。
其执行流程如图所示:
- 3.break语句:
break语句强制循环结束,一旦执行了break语句,循环将提前结束,不在执行循环体中位于其后的其他语句。break语句应该与if语句配合使用,即条件满足时,才执行break语句跳出循环,否则,若break语句无条件执行,意味着永远不会执行break后面的其他语句。 - 4.continue语句:
continue语句的作用是跳出循环体中continue后面的语句,继续下一次循环。
continue语句和break语句的区别:break语句结束循环,而continue只能跳过后面语句继续循环。break除了可以中止循环外,还用于switch语句,而continue只能用于循环。
1.2.本章学习体会
- 学习感受:又过去来2周,又收获了许多知识。知识,总是令人向往的。现在pta难度上升了,要破解一道题,就需要比以前多花费很多的时间了。所以就需要更丰富的知识,更需要绞尽脑汁了=.=。想想就刺激。
- 代码量:758行(仅计算pta正确的代码量)。
2.PTA实验作业
2.1任务06-02-02 于龙又又遇见日期,叕哭了!
- 2.1.1伪代码:
int num1,num2,num3,temp;//num1、2、3用于输入3跟数字的储存,temp用于中间变量给3个数排序 ,从小到大
char ch1,ch2;
int leapyear=0;//判断是否闰年
int count=0;//数数,累加合法日期的数量。
从小到大排序3个数字,if最大的数小于12,则count=6;
if第二个数小于等于12,第三个数大于12,则继续判断2种情况:
if第一个数是年,第二个数是月,判断是否闰年,如果第三个数在第2个数的日期内,则count++;
if第二个数的年,第一个数是月,判断是否闰年,如果第三个数在第1个数的日期内,则count++;
因为年,日互换后(日小于等于12)日永远符合,所以count=count+2;
if第一个数小于等于12,第二个数大于12,(第1个数一定是月份)则继续判断2种情况:
if第二个数是年,第三个数是日,判断是否闰年,如果第三个数在第1个数的日期内,则count++;
if第三个数是年,第二个数是日,判断是否闰年,如果第二个数在第一个数日期内,则count++;
if第一个数大于12,这样就没有一个合法的月份了,则count=0。
if(count==0)就printf(“Invalid Date!”);
-
2.1.2代码截图:
-
2.1.3造数据测试
输入数据 | 输出数据 | 说明 |
---|---|---|
2016-2-29 | 1 | 闰年2月极限 |
5-560-25 | 1 | 普通的唯一数据 |
7-6-8 | 6 | 3个数据都可以当年月日的数据 |
2015-29-2 | Invalid Date! | 非闰年二月非法数据 |
31-7-8 | 4 | 多种可能性的普通数据 |
2.1.4 PTA提交列表及说明:
咳咳,怎么肥事?这道题第一次见是在第一次上机考试上,所以:
1.部分正确:闰年二月错误。于是补充二月判断条件。
2.部分正确:忽略第二种大情况中第一次小情况年日互换后合法的情况。补充count=count+1。
3.部分正确:忽略第二种大情况中第二次小情况年日互换后合法的情况。故将count=count+1变成count=count+2.并写在第二种大情况的最下面。
2.2 7-9 单词长度
- 2.2.1伪代码:
char ch;//储存字符
int count = 0;//计数
int word = 0;//判断是否有字母长度,0是没有,1是有。有字母长度遇空格输出count
int flag = 0;判断是不是第一个”单词“,0是第一次单词,输出count,不是第一个单词的话,则输出 count(这里前面有一个空格)
while ((ch = getchar()) != '.') 设置循环条件,遇‘.’退出循环,
if ch不是空格,则count++;有单词长度了,word=1;
if ch是空格并且word=1(有单词长度,排除多空格情况),则令word=0,if(flag==0)(第一个单词)输出count;else 输出(空格)count;
count=0;(清空单词计数)
flag=1;(下面的单词都不是首单词)
- 2.2.2代码截图:
- 2.2.3造数据测试
|输入数据 | 输出数据 | 说明 |
|-----|---------|-----------|
| It's great to see you here.|4|一个完整的普通标准句子|
| qwer qww .|4 3|多空格情况|
| qwer qw .|2|句首多空格情况| - 2.2.4PTA提交列表及说明:
1.部分正确:第一次没有word=0清除上一次单词长度的缓存,于是补上;
2.部分正确:printf(“%d ”count);输出的是数字+空格,但是题目要求最后没有空格,于是改为输出空格+count。尝试了一下,错了=.=。
3.部分正确:于是引入flag;判断单词是否是第一个,如果是第一个单词则输出count不加空格,后面的输出空格+count;解决。
2.3换硬币
- 2.3.1伪代码:
int fen5, fen2, fen1;//定义5分钱,2分钱,1分钱的数目
int money;//定义钱数
int count = 0;//定义count储存所以的可能性
for(fen5 = money的5分之1; fen5>0; fen5--)(初始fen5的时候用最大值,使硬币数从小到大排列)
{
for(fen2 = (money - fen5*5) / 2; fen2>0 ; fen2--)(循环嵌套,考虑fen2的数目)
{
于是fen1=money - fen5 * 5 - fen2 * 2;
如果fen1不等于0,则输出fen5,fen2,fen1,fen5+fen2+fen1,同时count++
}
}
- 2.3.2代码截图:
- 2.3.3造数据测试
|输入数据 | 输出数据 | 说明 |
|-----|---------|-----------|
| 13|fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4 |题给数据,普通数据|
| 8|fen5:1, fen2:1, fen1:1, total:3
count = 1|最小值| - 2.3.4 PTA提交列表及说明
1.在VS上答案错误:一开始是for(fen5=1;...)给fen5和fen2的初始值是1(即最小值),与题意不符,修改成fen5=money/5;fen2=(money-fen5*5)/2;
2.在VS上答案错误:用3个for枚举fen5,fen2,fen1,这个程序太过复杂,于是将fen1直接赋值money与硬币相减后的结果,并讨论是否是0的情况;验证,答案似乎成功了。
3.格式错误:原来fen5与fen2之间有一个空格啊,补上。
3.代码互评
龟兔赛跑:
同学代码截图:
自己代码截图:
这位同学在龟兔赛跑问题中,聪明的找到了随着时间变化中乌龟和兔子赛跑路程变化的规律,类似解一个数学问题。没有应用到for循环。
而我则是利用for循环分析每分钟每分钟,分析乌龟和兔子赛跑的路程,最后判断谁大谁小。
这令我想到,在分析一个问题的时候,是不是应该先考虑一下它的规律,好构思更精妙的程序。
于龙遇见日期,又哭了!
同学代码截图:
自己代码截图:
- 这位同学厉害,利用了数组解决了这道题,并且思路清晰简单;有一个输入语句,两个for循环结构,三个if-else嵌套判断结构,三个输出出口。
而我是铁憨憨的把全部情况都枚举出来,并且没有把那些相同情况判断的合并在一起,导致程序篇幅过长,使程序过于复杂。
这令我学到,要使代码尽量简化,使更易阅读。并使我懂得:
我的不同的选择,将决定我的程序的优劣,我的程序运行的速度,我程序占用内存的大小,等等。这都是我们衡量程序的标志。