C语言I博客作业09
问题 | 答案 |
---|---|
这个作业属于那个课程 | C语言程序设计II |
这个作业要求在哪里 | C语言I博客作业09 |
我在这个课程的目标是 | 熟练掌握C语言 |
这个作业在哪个具体方面帮助我实现目标 | 学会了如何去使用for嵌套来做编程题,熟悉了break、continue的使用方法,了解了字符型的输入 |
参考文献 | Markdown基本语法 |
一.PTA实验作业
1. 换硬币
题目内容描述:将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
输入样例:
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
(1)数据处理
数据表达:
用了整形变量x,fen5,fen2,fen1,count=0
x是用户传入的要求计算零钱数额
fen5,fen2,fen1,count=0分别用来保存用户要求输出的5分硬币数量,2分硬币数量,1分硬币数量和换法个数
数据处理:伪代码
定义整型变量x,fen5,fen2,fen1,count=0; x为输入的钱数,fen5为5分钱的个数,fen2为2分钱的个数,fen1为1分钱的个数,count为多少种换法。
输入用户要求的钱数x;
for(fen5=x/5; fen5>=1; fen5--)
for(fen2=x/2; fen2>=1; fen2--)
计算出一分硬币的个数
if(fen1>=1)
输出5分,2分,1分硬币的个数和硬币总数
count换法累加
end for
end for
输出换法个数
(2)实验代码截图
(3)造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
9 | fen5:1, fen2:1, fen1:2, tatal:4 count : 1 | 最小x |
99 | 最大x | |
88 | 随机试验 | |
20 | 随机试验 |
(4)PTA提交列表及说明
提交列表说明
1.答案错误:误将total打为tatal,开始没有看出来,以为是像第一题一样要左对齐在d前加了一个-2
2.答案错误:误将total打为tatal,不应该将%d改为%-2d,将total改为tatal,将%d改回来后答案正确
刚开始做的时候定义了一个x1用来保存输入钱数减去8后的数,后来发现这样定义太麻烦还要定义其他的数来储存减去8后即每个方法中的每种硬币的个数减一的数,而且完全没有必要这样子做,后面做博客园的时候发现变量x1忘记删除了,后来将x1删除又提交了一次截的图。
2. 找完数
题目内容描述:所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
输入样例:
2 30
输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
(1)数据处理
数据表达:
用了整形变量n,m,i,j,sum,flag=0
n,m是用户传入的要求找完数的范围
i用来保存在n、m范围内的每一位数
j用来保存从2开始每一个小于i的数,用来找因子
sum用来保存一个数的所有因子和,用来判断数的因子和是否等于这个数
flag立一个flag用来判断该数是否属于完数
数据处理:伪代码
定义变量n,m,i,j,sum,flag=0,n和m为用户输入的数,i和j用于循环,sun用来保存数的因子和,flag用来判断该数是否属于完数
输入m和n
for(i=m;i<=n;i++)
对sum初始化为1
for(j=2;j<i;j++)
if(i%j==0) Then
对sum加上j并赋值给sum
end for
if(sum==i) Then
输出“sum = 1”
for(j=2;j<i;j++)
if(i%j==0) Then
输出“ + 因子”
end for
输出\n用来换行
将1赋值给flag
end for
if(flag==0) Then
输出None
(2)实验代码截图
(3)造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
6 28 | 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 | 取完数为边界 |
2 9999 | 最大范围 | |
10 20 | None | 空集 |
6 6 | 6 = 1 + 2 + 3 | 6==6 |
(4)PTA提交列表及说明
提交列表说明
一次性正确,第一次提交的代码多加了一个if(i==1) contiune;用来判断i是否等于1,如果i=1则结束本次循环,后来做博客园的时候发现题目中说了1<m≤n≤10000,所以if(i==1) contiune;完全多余,后来将这个去掉重新提交了一次截的图。
二.代码互评
同学(柏朝晖)代码 | 同学(杨宇)代码 | 自己代码 |
---|---|---|
比较
(1)第一份代码用了三层循环嵌套,第一层用来处理5分硬币个数,第二层用来处理2分硬币个数,第三层处理1分的;而我的代码是用两个for循环嵌套处理fen5和fen2,然后再根据剩余的钱计算出fen1的个数,再判断fen1>=1是否成立来确定是否能构成题目要求的一种分硬币的方法。相对来说他的代码因为第三层for使编译时间比我的长,相比较之下,我的代码更好一些。
(2)第一份定义变量用的是数字5、2、1的英文字母而我自己用了题目输出示例的字母来定义变量,相对来说我的更容易见名知意。第二份的定义的变量也有点奇怪
(3)第二份跟我最开始的思路一样,先将输入的钱数减去8,即减去每种硬币一个加起来的钱数。然后就可以只用两层for循环分别了处理5分的和2分的,1分的就可以直接用`x-5*i-2*m+1`来解决,而我的代码还用了一个if(fen1>=1)来判断是否能构成题目要求的一种分硬币的方法。相比较之下,她的代码思路比较好。
三.学习总结
1.学习进度条
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
第四周 | 7小时 | 100行 | 在屏幕上显示Hello World! | 暂无 |
第五周 | 8小时 | 100行 | 求华氏温度对应的摄氏温度 | 暂无 |
第六周 | 30小时 | 200行 | 如何用 MinGW-w64 来编译C程序 | 暂无 |
第七周 | 24小时 | 300行 | 运用if语句完成各种数学程序 | 对于&&的用法不了解 |
第八周 | 24小时 | 300行 | 学会了for循环语句 | 暂无 |
第九周 | 24小时 | 300行 | 学会了如何去自定义一个函数 | 暂无 |
第十周 | 30小时 | 400行 | 学会了if-else语句的嵌入 | 对“(Y%100)这个表达式意味着当Y不能整除4时(Y%100的余数不等于0时)表达式为真”这句话不是很懂 |
第十一周 | 24小时 | 450行 | 学会了如何去使用switch语句来做编程题 | 暂无 |
第十二周 | 24小时 | 450行 | 学会了如何去使用while循环来做编程题 | 对字符型的输入不太了解 |
第十三周 | 26小时 | 372行 | 学会了如何去使用for嵌套来做编程题,学会了continue的使用方法 | 对字符型的输入和输出不太了解,对数组完全不了解 |
2. 累积代码行和博客字数
时间 | 博客字数 | 代码行数 |
---|---|---|
第四周 | 510 | 100 |
第五周 | 510 | 200 |
第六周 | 1149 | 400 |
第七周 | 2027 | 700 |
第八周 | 3791 | 1000 |
第九周 | 5294 | 1300 |
第十周 | 6900 | 1700 |
第十一周 | 8614 | 2150 |
第十二周 | 10495 | 2600 |
第十三周 | 13019 | 2972 |
3 .学习内容总结和感悟
(1)学习内容总结
(2) 学习体会
现在我的学习进度完全是跟着老师走的,而且老师上课讲的东西有时候还不能熟练运用,而别人早已经走到前面去了。对别人来说一个小时就能将PTA做完而我有时候做一个题目想3、4个小时还没有思路最后只能求助百度,我觉得我应该反思一下了。
以后尽量多刷点题目扩展一下逻辑思维能力,有剩余时间的话提前预习一下数组,感觉很多题目都要用到这个东西。
感觉调试有点难搞,每次机课作业都很赶,需要多练习一下,学好了调试以后就好找代码出现的错误了。