C博客作业02--循环结构
0.展示PTA总分
1.本章学习总结
1.1学习内容总结
1.1.1循环语句:
- 1.while语句
一般形式:while(表达式){
循环体语句;} - 2.do-while语句
一般形式:do{
循环体语句;
}while(表达式); - 3.两者差别:
while语句先判断条件,条件满足才会进入循环,do-while语句先执行一次循环,后判断循环条件。 - 4.。嵌套循环指大循环中嵌套了小循环,用于处理更复杂的计算。
1.1.2break语句和continue语句
- 1.break语句:break语句强调循环结束,一旦使用了break语句,循环提前结束。多适合于if语句一起使用。
- 2.continue语句:跳过循环体中continue后面的语句继续下一次循环。
1.2本章学习总结
- 基本的算法写法都清楚了解,对其中的运行流程也十分清楚,但每次写代码的细节点总会出错,循环语句和分支结构中“==”与“=”的区别,经常容易出错使无限循环或者结果错误,但代码量训练却十分充足,面对复杂的题目我写的代码量就会十分的多,想不出简便的方法就只能一步步的填充自己的程序来使各种情况的运行都能正确,这往往需要我花费近一个小时来处理我的代码,不断修补订正,比起代码的不断书写,我更希望能锻炼简便算法的能力,提高我写代码的速度。
- 代码量:2000
2.PTA实验作业
2.1龟兔赛跑
2.1.1伪代码
‘’‘定义s1,s2分别作为乌龟和兔子跑的路程,定义T作为一共要跑的时间,定义i作为跑步过程的时间,定义count作为兔子休息的次数
输入要跑的时间T
for(i=1;i<=T;I++)开始循环
乌龟跑的路程为速度乘以时间,而兔子跑的路程为速度乘以时间减去休息的次数乘以休息的时间乘以速度
if 当时时间i除以10为0,且当时兔子的路程s2比乌龟的路程s1多,兔子休息次数count加1,当时时间加30
直到循环结束
用乌龟速度乘以总时间T与兔子速度乘以总时间T减去休息的次数乘以休息的时间乘以速度重新计算两者路程
如果s1大于s2 printf("@@ %d", s2);
如果s2大于s1 printf("_ %d", s1);
如果s1等于s2 printf("-- %d", s2);
return 0;
'''
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
7 | _ 54 | 时间小于10 |
120 | -_- 360 | 平局 |
170 | @_@ 510 | 乌龟胜利 |
2.1.4 PTA提交列表及说明
部分正确:一开始直接用T成以兔子的速度减去休息的次数乘以休息的时间乘以速度,发现最后一次休息减的路程可能不到270,所以换成s2 = 9 * i - count * 270;
部分正确:i结束时自己加一又改为s2 = 9 * (i - 1) - count * 270;
部分正确:i直接加30跳过T的时候乌龟的路程会少算,便直接在循环结束的时候再次赋值乌龟总路程s1=T*3;
其中几次是修改错误再次提交导致的答案错误。
2.2于龙遇见日期,又哭了!
2.2.1伪代码
'''定义year month day作为年月日,定义max为其中最大值作为月份,定义secoond,third作为除最大值后按输入顺序排列的两个值
将year month day 比较大小找出其中的最大值赋值给max
if 月份month大于12天day小于12则month赋值给third day赋值给second
if 月份month和天day大于12 printf("Invalid Date!");
if month小于12则则month赋值给second day赋值给third
while(second= )时判断third的值决定printf("Invalid Date!");或者printf("%04d-%02d-%02d", max, second, third);
’‘’
2.2.2代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
11 11 11 | 0011-11-11 | 三个一样打的数 |
2000 2 29 | 2000-02-29 | 闰年2月29日 |
1900 2 29 | Invalid Date! | 整百非闰年2月29日 |
2.2.4 PTA提交列表及说明
由于自己写的代码太过繁琐,虽然一开始的方向正确但细节还是很欠缺
运行超时:前面大多时因为刚学习while语句写的代码很多if语句都用while语句写,然后发现有些情况会运行超时便找该语句多写break,写了好几次才全部换成if语句
之后的运行超时:因为答案一直部分正确,但自己测试都没什么问题,因为代码冗长,便在一个个if情况加个while(1){printf(“1”)};语句去试测试点输入的值
部分正确:很多情况时有些分支存在一些情况能使这些分支都满足导致重复输出,最严重的是3个一样大的小等于12的值一直卡我开头的语句,之前if语句后没跟else而是直接再打if,后面试出来情况才改完。
2.3猜算式?2*7?=3848中的数字
2.3.1伪代码
‘’‘定义digit1 ten1 digit2 ten2作为第一第二个数的个位十位,定义number1,number2作为第一第二个数,定义product作为乘积
给乘积product第一个数个位digit1第二个数十位ten2赋值
for(ten1=1;ten1<=9;ten++)开始循环
for(digit2=0;digit2<=9;digit++)开始循环
number=digit+ten10来给两个数赋值
if number1number2=product printf("%d*%d=%d", number1, number2, product);结束循环
return 0;
2.3.2代码截图
2.3.3 造测试数据
该题无输入
2.3.4 PTA提交列表及说明
编译错误只是修改的时候一点小细节错误;
答案错误:该题没有输入,以为有输入便编了个算法可以给一个十位和个位还有乘积求出这两个数,却一直答案错误,之后细看和确认之后才发现没有输入。
3代码互评
该题为于龙遇见日期,又哭了!代码在2.2.2
- 1为确认最大值后其他两个数按顺序输出我特意使用的second与third太繁琐没有必要。
- 2只需要先确认month的值是否大于12之后可交由是否符合合法日期来处理,我提前拿出来处理反而是代码某些地方需要过分重复,解读的性质也极低。