C语言I博客作业09
一、本周教学内容&目标
第4章 循环结构 4.1-4.2 熟悉使用while和do-while结构解决问题。
二、本周作业头
这个作业属于那个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | <C语言I作业09> |
我在这个课程的目标是 | <学会循环结构,了解并熟悉continue和break语句解决问题> |
这个作业在那个具体方面帮助我实现目标 | <在PTA中多次使用嵌套循环,熟练运用> |
参考文献 | <<集美大学林丽老师>> |
三、本周作业
1.PTA实验作业
2.代码互评
3.学习总结
四、作业格式
1.PTA实验作业(20分/题)
请再此处列出自己的排名图片
从PTA题目集中选出2个你最满意的题目完成以下内容,选择题目难度越大,分值越高,每题20分(每项5分),内容要求如下:
1.1 题目名1 (7-2 换硬币 (20 分))
题目内容描述:
将一笔零钱换成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.1.1数据处理
介绍实现本题过程中,你的数据表达、数据处理是怎么做的。注意:请务必按照以下方式书写。
数据表达:定义了整型变量fen5,fen2,fen1,money,total,count,分别表示money零钱数额,在循环中fen5用五分硬币的数量,fen2表示二分硬币的数量,fen1表示一份硬币的数量,total表示硬币总数量, count表示换法的总个数。
数据处理:
表达式:fen55+fen22+fen1==money
结构式:用了for循环语句以及使用嵌套内循环
伪代码:
#include<stdio.h> 开始
int main()
{
int fen5, fen2, fen1, money, total, count=0; //给出几个变量:fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数,money:输入的钱数”。
scanf("%d", &money);
for(fen5=money/5; fen5>0; fen5--) //(嵌套for循环语句) 循环找出能够用五分硬币的换法
{
for(fen2=money/2; fen2>0; fen2--) //(嵌套for循环语句) 循环找出能够用二分硬币的换法
{
for(fen1=money; fen1>0; fen1--) //(嵌套for循环语句) 循环找出能够用一分硬币的换法
{
if(fen5*5+fen2*2+fen1==money) //(嵌套if语句) ;判断 五分数的换法数量乘上5加上二分数的换法数量乘上2再加上一分硬币是否等于输入的钱数 ;
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", fen5, fen2, fen1, fen5+fen2+fen1); //打印输出一分硬币,二分硬币,五分硬币的换法,以及换法的总数
count++; // 所有换法进行累加
}
}
}
}
printf("count = %d", count); //输出换法总数
return 0; //结束
}
1.1.2实验代码截图
贴图展示代码,不要复制。请给出名字标识。
1.1.3 造测试数据
输出你的程序面向各种测试数据结果,除了题目给出的测试数据,可以自己再造其他临界数据,越多越好,并加上必要说明
输入数据 | 输出数据 | 说明 |
---|---|---|
20 | 有13种不同的换法 | |
30 | 有34种不同的换法 | |
40 | 有65种不同的换法 | |
50 | 有106种不同的换法 |
1.1.4 PTA提交列表及说明
根据PTA提交列表,简要描述调试程序碰到的问题及解决办法
答案错误:在for(fen5=money/5; fen5>0; fen5--) )加fen5--写成了fen5--
本题的难点就在于"fen5:%d, fen2:%d, fen1:%d, total:%d\n", fen5, fen2, fen1, fen5+fen2+fen1 这个条件,在这上面多花一点功夫就好。
1.2 题目2(7-3 找完数 (20 分)
题目内容描述
所谓完数就是该数恰好等于除自身外的因子之和。例如: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.2.1 数据处理
介绍实现本题过程中,你的数据表达、数据处理是怎么做的。注意:请务必按照以下方式书写。
数据表达:使用了n,m,i,j,sum,flag=0。m,n表示两个实验数据,i,j用于程序中的两个循环,sum表示因子之和,flag来判断是否有因子
数据处理:
数据类型:for循环和if-else循环以及嵌套的内循环
表达式:if(i==1) continue; //1不是完数
for(j=2;j<i;j++)
流程结构:if-else结构。
伪代码
#include<stdio.h>
int main()
{
int n,m,i,j,sum,flag=0; //定义7个变量和函数
scanf("%d %d",&n,&m);
for(i=n;i<=m;i++) //循环输入可能为完数的值
{
sum=1; //要注意因数为1的情况
if(i==1) continue; //判断1是否是完数
for(j=2;j<i;j++) //(嵌套for循环语句)
{
if(i%j==0) //(再嵌套if语句)判断该数是否为完数的因子 ;
{
sum=sum+j; //若yse → 放入sum中 ;
}
}
if(sum==i) //(嵌套if语句) ;判断 所有因子之和是否等于完数 ;
{
printf("%d = 1",sum); //若yse → 暂时输出完数 = 1 (方便后面输出,1是任何完数的因子) ;
for(j=2;j<i;j++) //(再嵌入for循环和if语句) ;判断后面的数是否是该完数的因子 ;
{
if(i%j==0) // 再嵌套if语句)判断该数是否为完数的因子 ;
{
printf(" + %d",j); //若yes → 输出 + 该因子
}
}
printf("\n"); //换行 ;
flag=1;
}
}
if(flag==0) //判断循环次数是否为0 ;
printf("None"); //若yes → 输出None ;
return 0; //结束,讲数值返回为0
}
1.2.2 实验代码截图
1.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
2 30 | [2,30]里有两个完数分别是6和28 | |
8 1000 | [8,100]里有两个完数分别是496和28 | |
6 2000 | [2,30]里有三个完数分别是6和28和496 | |
8 1000 | [2,30]里有两个完数分别是28和496 |
1.2.4 PTA提交列表及说明
根据PTA提交列表,简要描述调试程序碰到的问题及解决办法
1.编译错误:在第8行少了sum=1;,导致没有1的因数
2.答案错误:在第九行没有continue语句
2.代码互评(5分)
找2份同学代码,和自己代码比较,建议互评代码尽量找代码风格差异较大。
第一张 (7-2 换硬币 )
同学代码截图 |<C语言I作业09 窦淇>|
自己代码截图
答:我和同学的代码有很大的不同
1.我用的代码是传统方式先定义变量和函数,在利用变量解决问题
2.同学用代码的方式很不同,值得我学习
第二张 (7-3 找完数)
同学代码截图 |<C语言I作业09 我叫心机男>|
自己代码截图
答:第二个同学
1.同学的代码的思路是先解决输出None的文体,而我的代码是先从1开始的因数问题,最后才解决输出NONE的情况。
3.学习总结(15分)
$3.1 学习进度条(5分)
|周/日期 |这周所花的时间| |代码行 |学到的知识点简介 |目前比较迷惑的问题|
|-|-|-|-|-|
|第六周| 8小时 |300行 |常用的数学函数,if-else语句,for语句,自定义函数 |不会用自定义函数|
|第七周 |7小时 |400行 |二分支结构和用char输入字符 |对于字符型的代码有点看不懂|
|第八周| 10小时 |420行 |多分支结构,switch语句 |switch语句用得有点混乱|
|第九周 |13小时 |450行 |自定义函数的用法,怎样用一个算法来运算多个式子 |if语句的嵌套不明白是怎样分支的|
|第十周| 18小时 |500行 |多分支结构、字符型数据类型和逻辑运算符 |目前不太熟练并且字符型还没熟悉|
|第十一周|12小时|600行|熟悉多分支结构switch语句的使用|switch后的表达式是否有要求|
|第十二周|8小时 |620 |do-while语句和while,for语句的区别 |continue不知道怎么去用|
|第十三周|10小时|650|break、continue的用法以及它们之间的关系|为什么在for循环前都要m=1;|
3.2 累积代码行和博客字数(5分)
时间 | 博客字数 | 代码行数 |
---|---|---|
第六周 | 585 | 300 |
第七周 | 1366 | 400 |
第八周 | 2209 | 420 |
第九周 | 4100 | 400 |
第九周 | 6212 | 500 |
第十周 | 8133 | 550 |
第十一周 | 10510 | 600 |
第十二周 | 13031 | 620 |
第十三周 | 15899 | 630 |
3.3 学习内容总结和感悟(5分)
3.3.1 学习内容总结
3.3.2 学习体会
请回顾自己的本周的学习过程,描述学习感受,也可以提出你不理解的地方、对教师教学建议等。如果你有新的想法或者新的方法,请及时记录下来。
1.本周我们学习了continue语句,并且把break语句,continue语句的区别弄清楚了。
2.continue语句和break语句有很大的区别,continue语句是跳过continue后面的语句
3.do-while语句是不管怎样都会先执行一次循环体,再判断是否符合条件,再执行循环体
4.百度是个好东西,尤其是对于初学者来说!
5.希望自己多学一点,走在老师前面