这个作业属于哪个课程 | C语言程序设计 |
---|---|
这个作业要求在哪里 | C语言I作业09:第十三周作业 |
我在这个课程的目标是 | 学会使用C语言,并做一个属于自己的小程序 |
这个作业在哪个具体方面帮助我实现目标 | 学会并熟练for循环以及if-else语句的嵌套,锻炼自己思考问题的能力 |
参考文献 | C语言程序设计(第三版);百度 |
1.PTA实验作业
1.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.1.1数据处理
数据表达:定义了六个整型变量,其中x代表零钱,通过scanf语句输入。f、t、o、分别代表五分、两分、一分的硬币的个数,结果由for循环计算得出。total代表硬币的总数,由表达式total=f+t+o得出。count代表循环次数,也就是代表几种不同的换法。
数据结构:
表达式:f * 5+t * 2+o == x;total=f+t+o
结构式:for循环的嵌套(其中还嵌入了if语句)
伪代码:
开始 ;
给出几个变量:零钱;三种不同分值的硬币个数(fen5、fen2、fen1);硬币的总数;循环次数 ;
输入零钱 ;
循环输入fen5 ;
(嵌套)循环输入fen2 ;
(嵌套)循环输入fen1 ;
判断是否fen5 * 5+fen2 * 2+fen1 等于零钱 ;
若yes →输出每种硬币的数量以及总数 ;
用计数器记录循环次数 ;
输出循环次数(输出不同换法的数量) ;
结束 ;
1.1.2实验代码截图
1.1.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 | 有四种不同的换法 |
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 | 有六种不同的换法 |
9 | fen5:1,fen2:1,fen1:2,total:4 count = 1 | 只有一种方法 |
1.1.4 PTA提交列表及说明
提交列表说明:
①因为习惯问题,下意识写成f++、t++、o++;
②没有判定f * 5+t * 2+o==x,以及后面想到后少写一个‘=’;
③忽略了一个硬币的总数total;
④输出硬币数量时,写成f+1,t+1,o+1,结果完全错误;
⑤输出count时,没有根据题意把“=”两边打上空格,以及输出硬币数量时,在fen5=××,后面没有打上空格。
1.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.2.1数据处理
数据表达:定义了七个整型变量,其中m、n代表输入的两个数,也就是需要输出的完数的范围,用scanf语句输入;x代表完数,首先给它赋值与m值相等,然后用for循环语句逐个数增加寻找满足条件的数;sum代表所有因子之和;i代表因子,主要用于判断该x数是否为完数,j代表除了1之外的因子。a代表循环次数,用于判断[m,n]里有没有完数。
数据结构:
表达式:x%i==0;
结构式:用了for循环的嵌套结构,其中参有多个if语句。
伪代码:
开始 ;
给出几个变量:能取的完数的范围;完数;因子;循环次数;因子之和 ;
输入完数的取值范围 ;
循环输入可能为完数的值 ;
(嵌套for循环语句)
给因子之和赋值0 ;
for循环输入可能为因子的值 ;
(再嵌套if语句)判断该数是否为完数的因子 ;
若yse → 放入sum中 ;
(嵌套if语句) ;
判断 所有因子之和是否等于完数 ;
若yse → 暂时输出完数 = 1 (方便后面输出,1是任何完数的因子) ;
(再嵌入for循环和if语句) ;
判断后面的数是否是该完数的因子 ;
若yes → 输出 + 该因子 ;
换行 ;
输出循环次数 ;
判断循环次数是否为0 ;
若yes → 输出None ;
结束 ;
1.2.2实验代码截图
1.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
3 36 | 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 | [3,36]里有两个完数分别是6和28 |
8 90 | 28 = 1 + 2 + 4 + 7 + 14 | [8,90]里有一个完数28 |
50 88 | None | [50,88]里没有完数 |
1.2.4 PTA提交列表及说明
提交列表说明:
①没有把sum=0也放入循环里,忽略了下一个完数判断时,因子之和应归零;
②没有给循环次数赋值为0;
③输出答案中的有些空格没有打;
④没有根据题意把输出结果换行;
⑤没有取完数为边界;
1.3 跟奥巴马一起画方块
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入格式:
输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。
输出格式:
输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。
输入样例:
10 a
输出样例:
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
1.3.1数据处理
数据表达:定义了四个变量,其中三个整型变量和一个字符型变量,i和j分别代表列和行的循环变量,n代表列和行的字符的数量,char op表示能接收字符。char op和n通过scanf语句输入。
数据结构:
结构式:使用了for循环的嵌套。
伪代码:
开始;
定义变量:控制行和列的数量循环变量以及该循环变量的取值限制n,和能接收字符的字符型变量op;
输入n和某字符;
开始列和行的循环叠加(列为行的一半)
输出字符;每输出一行输出一个换行;
结束;
1.3.2实验代码截图
1.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
10 a | 一行十个a,一列五个a | |
11 a | 一行十一个a,一列六个a | |
16 b | 一行十六个a,一列八个a |
1.3.4 PTA提交列表及说明
提交列表说明:
①一开始觉得该题和打印九九乘法表差不多,因此忽略了,输入数据为单数的情况,因为定义的n为整型变量,所以当它取单数/2时,结果是错误的。
②忽略了换行。
2.代码互评
同学代码截图
自己代码截图
代码比较
整体上,我和该同学的代码同样简洁又美观;
内容上,该同学多用了一个if语句判断i*j的结果是否是两位数,若是两位数便多数出一个空格。而我的是利用C语言的用法规则直接用了一个“%-4d”表示宽度为4且左对齐,简洁了代码也方便了自己。
该同学能够想到使用空格使宽度准确为四,这点值得表扬。
同学代码截图
自己代码截图
代码比较
我的代码较该同学的简洁许多,原因在于,该同学多操作了一步,若长为单数,宽就加一;而我用n/2.0,直接就达到了四舍五入的效果。
表扬自己能够在迷惑的时候查找资料弄懂问题。
表扬该同学,首先使m=n/2,然后在循环内添加一个判定,从而达到即使是单数也能输出正确。体现了他在解答过程时有明确的思路。
3.学习总结
3.1 学习进度条
周/日期 | 这周所花的时间 | 代码行 | 博客字数 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|---|
10/14-20 | 5h | 100行 | 918字 | for循环结构 | 不能够熟练for语句 |
10/20-27 | 7h | 120行 | 1194字 | 自定义函数 | 对定义和调用函数知识点上还是很模糊 |
10/28-3 | 8h | 380行 | 1290字 | char字符型 | 有些代码所用的格式 |
11/4-10 | 8h | 150行 | 1309字 | switch语句 | 怎么寻找到解题的正确思路 |
11/11-17 | 6h | 160行 | 1100字 | do-while语句和其他循环语句 | 怎么综合运用已学内容 |
11/18-24 | 16h | 260行 | 2453字 | break、continue的用法以及它们之间的关系 | 使用很多个for循环和if语句时容易混乱 |
3.2 累积代码行和博客字数
3.3 学习内容总结和感悟
3.3.1 学习内容总结
3.3.2 学习体会
首先,重点感谢某位同行者大佬给的思路指导,以及细节解说!
然后这次博客作业丰富了很多也改善了很多,从伪代码的改进和思维导图内容的丰富以及博客字数的增加上看,质量在逐渐提升,这也说明自己在慢慢进步着。老师经常用考试方式来提醒我们考试迫在眉睫,而在这种给我们制造学习压力的情景下,就我自己来说,是取到了非常大的成效。某位助教偷偷跟我说,这次pta上的四个题目他一个小时就做完了,这引起我深深的沉思,不知不觉中,自己和优秀学生的差距如此大了呢。我尽量说服自己不要方。坚持脚踏实地去的学习,每天进步一点就是收获。只要肯花时间,就没有难的事情。