C语言I博客作业09
这个作业属于那个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/10027 |
我在这个课程的目标是 | 熟练地掌握运用C语言,锻炼思维逻辑能力,为以后其他语言的学习打好基础. |
这个作业在那个具体方面帮助我实现目标 | 学习for循环的嵌套以及了解break语句和continue语句的用法和区别 |
参考文献 | 《C语言程序设计》《C Primer Plus》百度百科 伪代码基本写法 |
1.PTA实验作业
1.1找完数
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:输入在一行中给出2个正整数m和n(1<m≤n≤10000)中间以空格分隔。
输出格式:逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
1.1.1数据处理
数据表达:用了变量m,n,i,j,sum,count.m,n通过直接输入得到,其他的通过赋值得到.类型全为整型.
数据处理:m,n表示输入的两个正整数,i和j表示循环起始变量,sum表示因子累加和,count表示完数的个数.
所用表达式:count=0;sum=0;m%i0;sum=sum+i;summ;m%j0;count0;count++;
流程结构:Begin
输入两个正整数m和n
count←0
for m←m to n
{
sum←0
for i←1 to m
{
if(m%i0)
then[sum←sum+i]
}
if(summ)
then[printf("%d = 1",m)
for j←2 to m
{
if(m%j0)
printf(" + %d",j)
}
printf("\n")
count++;]
}
if(count0)
then[printf("None");]
End
1.1.2实验代码截图
1.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
2 30 | 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 | sample等价 |
2 28 | 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 | 取完数为边界 |
2 3 | None | 没有完数 |
2 1000 | 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 | 随机值 |
2 10000 | 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064 | 最大范围 |
1.1.4 PTA提交列表及说明
1.编译错误:for语句用逗号分开的,我的语句是for(i=1;i<m,i++)正确的应该是for(i=1;i<m;i++).
2.部分正确:我将sum=0放在for循环之前,导致每次循环开始sum值不同,部分正确,应该讲sum=0放在for(i=1;i<m;i++)的内部.
1.2换硬币
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
1.2.1数据处理
数据表达:用了变量x,count,total,a,b,c;x通过直接输入得到,其他的通过赋值得到,类型全为整型.
数据处理:x表示输入的零钱数额,count表示换法个数,total表示硬币总数量,a,b,c分别表示5分、2分和1分硬币的数量.
所用表达式:count=total=0;a=(x-8)/5;b=(x-8-a5)/2;c=x-8-a5-b2;count++;
流程结构:Begin
输入零钱数额x
count←0
total←0
a←(x-8)/5
for a←0 to a-1
{
b←(x-8-a5)/2
for b←0 to b-1
{
c←x-8-a5-b2
printf("fen5:%d, fen2:%d, fen1:%d, total:%d",a+1,b+1,c+1,a+b+c+3)
count←count+1
printf("\n")
}
}
printf("count = %d",count)
End
1.2.2试验代码截图
1.2.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 | sample 一般小x |
9 | fen5:1, fen2:1, fen1:2, total:4 | count = 1 |
15 | fen5:2, fen2:2, fen1:1, total:5 fen5:2, fen2:1, fen1:3, total:6 fen5:1, fen2:4, fen1:2, total:7 fen5:1, fen2:3, fen1:4, total:8 fen5:1, fen2:2, fen1:6, total:9 fen5:1, fen2:1, fen1:8, total:10 | count = 6 |
11 | fen5:1, fen2:2, fen1:2, total:5 fen5:1, fen2:1, fen1:4, total:6 | count = 2 |
1.2.4PTA提交列表及说明
1.答案错误:忽视了题目要求每种硬币至少有一枚,导致一分钱的硬币可能为0,将a=x/5;b=(x-a5)/2;修改为a=(x-8)/5;b=(x-8-a5)/2;并且将 printf("fen5:%d, fen2:%d, fen1:%d, total:%d",a,b,c,a+b+c+);修改为printf("fen5:%d, fen2:%d, fen1:%d, total:%d",a+1,b+1,c+1,a+b+c+3);先保证每种硬币都有一枚.
2.代码互评
我的代码:
同学(1)的代码:
代码差异:
1.代码整体思路一致,但同学(1)运用了数组长度为1000的数组number.
2.第二个for语句循环次数不一样,我的是for(i=1;i<m;i++),而同学(1)的是for(j=2;j<i;j++).
3.count的初始赋值不同,导致机构出现差异.
我的代码:
同学(2)的代码:
代码差异:
1.定义变量不同,他比多定义了一个起始变量.
2.我定义了一个flag=0,而同学(2)定义的是count=0;当m到n中有完数时,我的flag=1;而同学(2)count++.
3.判断区间m到n是否有完数的条件不同,我的是flag0,而同学(2)是count0.
3.学习总结
3.1学习进度条
周数/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较疑惑的问题 |
---|---|---|---|---|
第三周(10/08--10/12) | 12个小时 | 300行左右 | 定义函数,if-else,for循环语句 | 输入与输出格式,空语句 |
第四周(10/14--10/18) | 15个小时 | 250行左右 | for循环语句,基础的循环程序设计,数据的输出宽度 | 数据的输出宽度概念不太清晰,表达式的定义,空语句的定义 |
第五周(10/23--10/26) | 12个小时 | 350行左右 | 自定义函数的声明与调用,break跳出循环,while()循环语句 | 自定义函数的应用 |
第六周(10/30--11/01) | 18个小时 | 500行左右 | if-else的嵌套,学习逻辑运算,条件语句,字符类型以及字符型数据的输入与输出 | 对字符型数据的输入与输出了解太少,缺乏练习,没有理解到getchar()字符输入函数与putchar()字符输出函数以及它们的运用 |
第七周(11/05--11/07) | 24个小时 | 720行左右 | 使用switch语句的三种情况,在switch语句中使用break语句,数组的定义与使用 | continue语句的使用,for语句的嵌套循环 |
第八周(11/12--11/15) | 19个小时 | 810行左右 | 学习使用while和do-while语句实现次数不确定的循环,使用break语句处理多循环条件,以及了解while,do-while,for三种语句的差异 | ASCII码和char类型和int类型的转换,进制数转化的多种方式 |
第九周(11/19--11/21) | 16个小时 | 600行左右 | 学习了for循环的嵌套以及了解break语句和continue语句的用法和区别 | 静态数组和动态数组的区别 |
3.2累积代码行和博客字数
3.3学习内容总结和感悟
3.3.1学习内容总结
3.3.2学习体会
这个学期的学习已经临近尾声了,但我发现我还存在很多的问题,做题目没法很快的找到思路与问题的本质,写完代码就提交,出错了再去找错误点,一个一个慢慢地试,感觉效率很低.学习c语言越到后面感到困难,问题也越来越多,自我认识原因是之前的学习中没有及时巩固,可能那个时候明白了,但是没有深入挖掘与思考,在之后的学习中又慢慢遗忘了.所以,温故而知新是非常重要的,只有这样,才能在计算机学习方面越来越远,越飞越高.不经一番寒彻骨,怎得梅花扑鼻香.