C语言博客作业02--循环结构
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1.1.1 循环结构
-
for循环
- 定义初始值时,先判断是否满足条件,如果满足,则运行for 语句内的程序,周而复始,直到不满足条件。如果不满足,则退出for 循环
- 定义初始值时,先判断是否满足条件,如果满足,则运行for 语句内的程序,周而复始,直到不满足条件。如果不满足,则退出for 循环
-
while循环
- while 语句类似for,只是运行语句内程序后不再有其他运算,而是直接判断是否满足条件,若满足,则再次运行语句内程序,判断是否满足条件。直到不满足条件时,退出while 语句
- while 语句类似for,只是运行语句内程序后不再有其他运算,而是直接判断是否满足条件,若满足,则再次运行语句内程序,判断是否满足条件。直到不满足条件时,退出while 语句
-
do-while循环
- do while ,与while 的区别是多了一个do ,效果就是运行到do while 时,不先判断是否满足条件,而是先运行一遍do while内的语句,再判断,剩下的就和while 相同了 注意:while后面的分号一定不要忘记了!!
- do while ,与while 的区别是多了一个do ,效果就是运行到do while 时,不先判断是否满足条件,而是先运行一遍do while内的语句,再判断,剩下的就和while 相同了 注意:while后面的分号一定不要忘记了!!
-
嵌套循环
- 顾名思义,就是在一个循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算
- 顾名思义,就是在一个循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算
-
continue&break
- continue:是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。
- break:是打破的意思,(破了整个循环)所以看见break就退出一层循环。
1.1.2 字符
- 大小写字符的转换
- 小写转换为大写:定义一个字符型变量op,则op+'A'-'a'的结果即为大写
- 大写转换为小写:定义一个字符型变量op,则op-'A'+'a'的结果即为小写
- 转义字符
- 一般转义字符:
\n(换行)、\'(单引号)、\"(双引号)、\\(反斜杠)、\t(横向跳格)
- 八进制转义字符:
\ddd(1~3位八进制整数所代表的字符)
- 十六进制转义字符:
\xhh(1~2位十六进制整数所代表的字符)
- 一般转义字符:
1.2 本章学习体会
1.2.1 学习感受
- 这两周学习进度开始变快了,PTA题目集的难度也在增加,有很多题目刚拿到手的时候是懵懵的无从下手,经过老师的课堂讲解后开始理清思路,终于能够解决出来啦
- 初步认识了函数的运用,感觉用上函数之后整体代码变得更加简洁容易阅读,但是函数的使用我还是不太熟练,需要多加练习
- 经历第一次上机考试,我觉得平常还是要多多写代码才能从容应对,要不然上机还是会脑袋空空呜呜呜
- 有几道PTA题目一直解不出来,总有那么一两个测试点没过,然后我就拿去问同学,
结果同学快被我的代码搞自闭了最后修改完看到答案正确的时候真的超开心!!希望今后还能保持对C语言的热情继续努力学习 耶
1.2.2 代码量总结
PTA题集 | 单循环结构 | 嵌套循环 | 总计 |
---|---|---|---|
代码量 | 515 | 412 | 927 |
2.PTA实验作业
2.1 PTA题目1
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
2.1.1 伪代码
定义整型变量change为待换的零钱;digit5为5分硬币个数;digit2为2分硬币个数;digit1为1分硬币个数;count为总的换法,初始值设为0;total为总的硬币个数;rest为5分硬币换完之后剩下的钱;left5为5分硬币的最多数量;left2为2分硬币的最多数量
输入change
left5 = change / 5; /*算出5分硬币最多的数量,然后从最多的开始往下递减*/
for (digit5 = left5;digit5>=1;digit5--)
rest = change -(5*digit5);
left2 = rest / 2;
算出2分硬币最多的数量,然后从最多的开始往下递减
算出1分硬币的数量
输出各硬币个数及硬币总数
count++;
end for
输出总共的换法;
2.1.2 代码截图
2.1.3 造测试数据
- 由于该题输出答案较多,我在这里只输出最终count的结果
输入数据 | 输出数据 | 说明 |
---|---|---|
13 | 4 | 题目所给数据 |
15 | 6 | rest能够整除2的数据 |
100 | 461 | 最大值数据 |
2.1.4 提交列表及说明
1.部分正确:一开始我把printf("fen5:%d, ", digit5);放在第一层for循环,发现输出后5fen会少掉,只剩下2fen和1fen的数据
2.编译错误:修改之后从vs复制过来时操作失误没删掉原来的错误代码直接在它的下面粘贴了...
3.答案正确:把printf("fen5:%d, ", digit5);放在第二层循环里面,这样就不会少输出了
2.2 PTA题目2
给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。
首先在屏幕上显示以下菜单:
[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。
2.1.1 伪代码
定义函数listMenu为屏幕显示菜单
定义整型变量time为查询的次数,choice为用户的选择
listMenu();
for (time = 1;time <= 5;time++)/*限制查询次数*/
输入用户选择choice;
输出1~4编号对应的水果单价
else if (choice == 0) break;/*若用户输入0则直接跳出循环*/
end else if
else
printf("price = 0.00\n");/*输入其他不合法字符则显示0.00*/
end else
end for
void listMenu()
{
/*显示菜单*/
}
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
-1 0 2 | price=0.00 | 不合法数据 |
1 2 3 3 4 4 | price = 3.00 price = 2.50 price = 4.10 price = 4.10 price = 10.20 | 超过5次查询的数据 |
1 3 | price = 3.00 price = 4.10 | 合法数据 |
2.2.4 提交列表及说明
1.部分正确:其中一个测试点是格式错误,是有一个price输出等号两边忘记打空格了
2.部分正确:另外一个测试点纠结了很久,后来发现是因为我在最后else输出后打了个break,其实输入非法数据没要求跳出程序
2.3 PTA题目3
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。
2.3.1 伪代码
定义整型变量number为输入数据,mask用于计算最高位数,初始值为1,t用于存放number,bit用于存放每一位数字
输入number
当number为负数,设置number=-number,并输出"fu "
t = number;/*t用于存放number并带入下面运算*/
while (t >= 10)
算出输入的number有几位数
再算出最大的十百千万单位 在下面用来除余取值
end while
do
输出各个位数
switch(bit)
输出对应数字的拼音并break;
end switch
设置空格以符合格式
取余降位并进入下一次运算
while (mask > 0);
end do-while
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
-600 | fu liu ling ling | sample负数 |
0 | ling | 零 |
9 | jiu | 个位数 |
123456789 | yi er san si wu liu qi ba jiu | 九位数 |
120 | yi er ling | 零结尾 |
2.3.4 提交列表及说明
1.格式错误:在最后if(mask>=10)的条件判断中,我将10打成了0,导致总会输出空格,将其修改完毕之后便正确了
3.代码互评
3.1 龟兔赛跑
-
同学代码截图
-
我的代码截图
-
代码异同
1.两段代码都能实现题目要求的功能
2.我的方法偏向数学化,因为我只能想到数学方法首先用for循环累加每一分钟的奔跑距离,计算出兔子和乌龟开始到第一次平局的时间是90min,然后加入到if语句的条件判断中来控制兔子的里程累加情况,最后用选择结构来输出结果
3.同学也是使用累加的方法来计算每一分钟兔子和乌龟的奔跑距离,定义一个rest来存储兔子的休息时间30分钟,再用选择结构输出结果
4.我和该同学的代码在某种程度上有相似之处,都运用了for循环累加分钟数,并用选择结构输出结果,但是我的会更偏向数学化,自己先算出平局时间以及每个时间段兔子的奔跑情况,而该同学更偏向还原题目,自主运算较少
3.2 换硬币
- 同学代码截图
- 我的代码截图
-
代码异同
1.两段代码都能实现题目要求的功能
2.我的方法是用for循环递减5分硬币的个数,再嵌套一个for循环递减2分硬币的个数,每次循环后换法总数加一,然后分开输出各个面额硬币的个数及硬币总数
3.同学的方法是先计算出5分硬币最多的情况,然后依次递减,将结果一次性输出
4.我和该同学的代码在某种程度上有相似之处,都运用了循环来解决题目要求的递减格式,不过我是所有情况都放在循环里面输出,该同学则是先计算出第一种情况再进行循环运算