c语言博客作业02--循环结构
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
循环结构
基本类型的形式
//for的一般形式:
for (表达式1; 表达式2; 表达式3)
{
循环体语句;
}
//while的一般形式:使用时需要另加初始化部分,循环体语句必须包含能最终改变条件真假性的操作
while (表达式)//
{
循环体语句;
}
//do-while的一般形式:使用时需要另加初始化部分,循环体语句必须包含能最终改变条件真假性的操作
do
{
循环体语句;
} while (表达式);
选择区别
一般来说,如果事先给定了循环次数,首选for语句,它看起来最清晰,循环的4个组成部分一目了然;若循环次数不明确,需要通过其他条件控制循环,通常选用while语句或do-while语句;如果必须先进入循环,经循环体运算得到循环控制条件后,在判断是否进行下一次循环,选用do-while语句最合适;而while语句的适用范围最广。(一定情况下三种形式的语句可以改写,互相转化)
嵌套循环
- 类型:其类型繁多,可for语句嵌套for语句,while语句嵌套for语句,do-while语句嵌套while语句等等。其中利用for语句嵌套for语句而进行穷举算法较为为经典。(循环次数多时需要考虑执行效率的问题)
- 注意点:较易出错地方就是循环初始化语句放错语句,混淆了外层循环和内层循环的初始化。
break语句和continue语句
- break语句强制循环结束,break语句应该与if语句配合使用。
- continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环。
- continue语句和break语句的区别在于,break结束循环,而continue只是跳过后面语句继续循环。break除了可以中止循环外,还用于switch语句,而continue只能用于循环。
拓展知识
- 恒真的while语句,利用if条件和break跳出循环
while (1)
{
if ()
{
break;
}
}
- 字符转成数字
int sum;
char ch;
sum = ch - '0';//将变量ch转化为数值并赋值给sum
- 大小写字母的相互转换
char ch;
ch = ch - 'a' + 'A';//小写转化为大写
ch = ch - 'A' + 'a';//大写转化为小写
- 造吸收符的三种方法
fflush(stdin);
getchar();
scanf(" %c", &ch) || scanf("\n%c", & ch);
- 前缀后缀表达式
int a = 0;
a++;//a值加1,而整个表达式为执行前的值
++a;//a值加1,整个表达式也为执行后的值
1.2 本章学习体会
- 老师上课进度明显加快,作业量也增大了,感觉平常要花更多时间预习听讲还有完成作业
- 感觉老师发的预习作业里面的一些代码也是值得记录学习的
- pta里有的题有时自己是真的解决不了,感觉只能问和学习别人解决方法,好比水仙花超时,怎样才能不超时。
- 本周代码量大概1000行
2.PTA实验作业
2.1 c03-单循环结构 -7-12 任务06-02-01 于龙遇见日期,又哭了!
2.1.1 伪代码
定义变量number1、2、3放输入的三个数,char1、2放任意输入的两个字符,max,medium,min放入输入的三个数判断大小后结果,year,month,day为大小排序后最终判断出来的年月日。
用if-else、else if判断语句将三个数排序并赋值给max,medium,min
if(当medium>31或者min>12)
{
输出错误;
}
else if(当min为小月份时,medium>30超出天数)
{
输出错误;
}
else if(当max为闰年时,且min为2,medium>29超出天数)
{
输出错误;
}
else if(当max不为闰年,且min为2,medium>28超出天数)
{
输出错误;
}
else if(min<12且medium<12)
{
根据顺序将min和medium赋值给月和日;
}
else
{
就按大小情况,将max赋值给year,min赋值给month,medium赋值给day;
}
return 0;
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
2/3-123 | 0123年02月03日 | 月日都小于12的排序 |
29,2,2019 | Invalid Date! | 非闰年二月 |
35.5.37 | Invalid Date! | 日超出范围 |
2000.29.2 | 2000年02月29日 | 闰年二月 |
78.13.29 | Invalid Date! | 月超出范围 |
2.1.4 PTA提交列表及说明
1.部分正确(两个测试点未过):刚开始排除情况时,注意了闰年非闰年二月问题,反倒忘了小月份超天数得问题。
2.部分正确(一个测试点未过):此项错误为月日均小于12时按照排序赋值问题。原本的判断条件过于想当然未能解决所有的情况,由代码截图可以看出,在vs上经过多次测试数据均正确,但 放在pta上发现仍解决不了问题,于是采取最直接办法,将不符合情况的条件都依次写出来。
3.答案正确
2.2 c04--嵌套循环-7-4 编程打印空心字符菱形
2.2.1 数据处理
用变量n储存应输出的总行数,变量ch储存第一个输出的字母,变量i为行数,变量blank1、blank2为两次需要输出空格数,变量changei存储菱形下半部分的函数相对应上部分的行数。
输入字母和行数
for (从第一行到最中间行)
{
for ()
{
输出第一部分空格
}
输出字母
if (当为第一行时)
{
;
}
else
{
for ()
{
输出第二部分空格
}
输出字母
}
}
for (下半部分行数)
{
将下半部分行数i转为其相对应的上半部分行数changei
其余部分与上面的for语句相同
}
return 0
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
a 1 | a | 最小奇数 |
b 3 | b \nc c\n b | 一般sample |
2.2.4 PTA提交列表及说明
1.部分正确:一开始是直接在第二个for语句最后中输出换行符,当我看图案与测试结果一致时就放到pta上测试,显示错误后,仔细观察发现,我的最后多了一个换行。因此,添加if条件语句,当不为最后一行时都输出换行符。
2.部分正确:解决换行问题后再次测试发现图形一致仍然错误,于是将用光标全选测试数据的正确图形时,发现每行最后的字母后的空格并未被选上,而我自己原本书写代码时更加复杂将每个字母后的空格都输出了后再换行。因此为了验证猜想,我将字母后部输出空格的代码删去,再次测试,测试成功。
3.答案正确.
2.3 c04--嵌套循环-7-7 换硬币
2.3.1 数据处理
变量money用于存储需要兑换金额,变量sum用于存储总的硬币个数,变量count用于计数兑换方法的总数,而变量i_five、i_twp、i_one分别为硬币五分,二分,一分的个数
输入需要兑换的金额
for(五分硬币从19到1)//由于题目已要求最大金额小于100,且每个硬币至少一枚,所以五分从19开始兑换,二分从49开始,而一分从99开始
{
for(二分硬币从49到1)
{
for(一分硬币从99到1)
{
if(当各硬币的数量乘以其面值等于需兑换的总金额时)
{
sum等于各硬币个数之和;
count计数加1;
按题要求输出各硬币个数及总个数
}
}
}
}
最后输出总方法数count的值
return 0;
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
8 | fen5:1, fen2:1, fen1:1, total:3 \n count=1 | 最小金额数 |
10 | fen5:1, fen2:2, fen1:1, total:4\nfen5:1, fen2:1, fen1:3, total:5 \n count=2 | 一般sample |
2.3.4 PTA提交列表及说明
1.部分错误:虽然仅有一次部分错误,但却并不简单。一开始根据测试数据及其正确答案,看到五分硬币不是从1开始输出而是从最多的开始,由于自己心里默认了硬币从数量从1开始逐增,由此
判断可能是五分硬币不应该在最外层嵌套,于是便将五分硬币的循环嵌套在最内层,而一分硬币循环在最内层。输出的格式实际上是与测试数据一致的,但却显示仅最小值正确。由此感到非常奇怪,询问室友解法之后才发现应当将五分硬币的循环放在最外层,而一分的放在最内层,因为这两种循环的过程截然不同。接着又想怎样解决从大到小输出?这时才想起来也可以逐渐递减,并且同时要注意考虑起始值,根据题目限制计算而得,由此改正后,提交测试便正确了。
2.答案正确
3.代码互评
题1-于龙题-同学代码截图
题1-于龙题-自己代码截图
1.首先我们两个定义的变量数量就不同,我的代码多增设了max,medium,min,从变量角度来看应当尽量减少增设变量。
2.在判断大小排序方面也大不相同,该同学是一边判断一边赋值年月日;虽然我多增设了变量,但是感觉这时我的代码的执行目的比较清晰好读,就是将三个数大小排序后,给大中小赋值,再对大中小进行判断赋值最后年月日。
3.在最后判断输出错误还是输出日期部分的判断也不大相同,我是一整个if else-if语句将错误情况逐一排除后,最后赋值并输出正确日期;而该同学则用if嵌套if-else语句,对各个情况分别判断输出错误还是输出正确日期。
题2-水仙花-同学代码截图
题2-水仙花-自己代码截图
1.为了解决超时问题,我之前从计算机学习群中偶然看到解决办法,尽量不要调用库函数,自己写函数。于是我自己写了x的n次幂的函数,并且在输入数值后,仅调用两次库函数计算循环的开始值和结束值。这样看来,我的代码可读性还算可以。
2.该同学为了解决超时问题,全程没有用到函数,仅用循环解决,虽然代码较复杂,但是也可看出该同学对循环结构掌握得很不错。