一、表格

问题 答案
这个作业属于那个课程 C语言程序设计II
这个作业要在哪里 C语言I博客作业09
我在这个课程的目标是 深入了解C语言,争取掌握更多的数据类型及结构,熟练地编译有效代码
这个作业在那个具体方面帮助我实现目标 学习到了循环的嵌套,深入学习了循环,更加提升使用循环的能力
参考文献 C语言程序设计、百度
二、本周作业
=============
1. PTA实验作业

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 数据处理

定义整型变量x,count=0,a,b,c。其中x是输入的数值、count是用来计数(有多少中方法)的,给其赋值为0、a,b,c分别表示五分、两分、一份的个数
输入数值
for(a=20;a>=1;a--)
题目中有输入的值有范围,所以五分钱的硬币最多不到20个,运用循环依此减一
for(b=50;b>=1;b--)
则两分钱硬币的个数不会到50个,循环减一
for(c=100;c>=1;c--)
一分钱的不会到100个,循环减一
if(x==5*a+2*b+c)
printf("fen5:%d, fen2:%dfen1:%d,total:%d\n",a,b,c,a+b+c);
如果x,a,b,c满足条件则输出
count++;
进行计数,即输出了多少次
printf("count = %d",count);
输出次数,即有多少种方法

1.1.2 实验代码截图

1.1.3 造测试数据

输入 输出 说明
13 fen5:2, fen2:1, fen1:1, total:4/nfen5:1, fen2:3, fen1:2, total:6/nfen5:1, fen2:2, fen1:4, total:7/nfen5:1, fen2:1, fen1:6, total:8/ncount = 4 验证题目数据
9 fen5:1, fen2:1, fen1:2, total:4/ncount = 1 取最小数

1.1.4 PTA提交列表及说明

说明:这道题不是很难,先在DEV上编写测试过才放在PTA上提交的。重点就是三个嵌套的循环和循环终止的条件。


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 数据处理

定义整型变量m,n,i,j,s,k,x=0。其中m,n是输入的值、i,j是用来控制变量、s代表所给范围中的数、k代表完数的因子、x用于计数(所给范围有多少完数)给其赋值为0
输入m,n
for(i=m;i<=n;i++)
给i赋值给m,循环到n,用于寻找完数
s=0;
因为下面s会累加,所以给s赋初始值为0
for(j=1;j<i;j++)
给j赋初始值为1,循环到i但不能等于i,用于寻找因子
if(i%j==0)
s=s+j;
如果i于j满足条件,s开始累加                
if(s==i)
printf("%d = 1",i);
如果满足条件,说明s是完数,先输出完数的第一个因子1
for(k=2;k<j;k++)
从2开始循环,寻找该完数的其他因子
if(i%k==0)
printf(" + %d",k);
满足条件的k即为其他因子,输出其他因子
printf("\n");
在循环结束,即因子寻找完毕后,输出换行
x++;
每输出一个换行,x从0开始累加,来计算有多少个完数 
if(x==0)
printf("None");
如果x等于0,说明没有完数,则输出None
    

1.2.2 实验代码截图


1.2.3 造测试数据

输入 输出 说明
2 30 6 = 1 + 2 + 3\n28 = 1 + 2 + 4 + 7 + 14 验证题目数据
2 5 None 没有完数
7 30 28 = 1 + 2 + 4 + 7 + 14 有一个完数

1.2.4 PTA提交列表及说明

部分正确:在没有完数的情况下是错误的,发现我把是空集的情况和正常输出的情况放在了一起,导致错误。后把他挪到整个for语句后可以正常输出。


2. 代码互评

自己代码①

同学代码①

评论:

  • 这两份代码思路是一样的,但是其中的表达式不同
  • 我的代码是用a,b,c来代表三种硬币的个数,并且初始值分别是20,50,100.该同学的代码是用x,y,z来表示是三个硬币的数量,其初始值是x=(a-2-1)/5,y=(a-5-1)/2,z=a-5x-2y.
  • 很明显该同学的代码会更具体一些,但运行上应该没啥差别。

自己代码②

同学代码②

评论:

  • 这道题我比这位同学多用了一个变量x用于存放行数。这位同学是直接在for语句中表示具体行数。
  • 我是判断n是偶数就直接除以二赋值给x,奇数的话除以二再加一。
  • 该同学是让j=0开始循环一直到j<(N*5)。
  • 综上,我多用了一个if-else语句没有这位同学简单,但我的代码更好理解一些吧。

3. 学习总结

3.1 学习进度条

周/日期 这周所花的时间 代码行 学到的知识点简介 目前比较困惑的问题
1/9-21 2天 30 初步接触编程,学习编译Hello,World!
2/9-30 2天 20 学习了浮点型变量,及温度转换
3/9-15 3天 76 使用分段函数了解到if-else语句以及数据类型 对于定义数值还是不太清楚
4/10-16 3天 100 for语句 for循环进行中不清楚循环的细节
5/10-24 3 天 155 学习到了自定义函数 自定义函数的具体定义过程,实参形参有些迷惑
6/11-1 3天 250 学习使用if-else与for语句的嵌套,初步了解了字符型变量 对于字符型变量不是很懂,不明白其作用
7/11-7 2天 200 这周学习了新的分支结构switch结构,这也适用于选择的情况,其作用类似于if-else。 switch后面的变量表达式和case后的常量表达式弄不清。
8/11-15 3天 150 学习了新的循环结构while语句和do-while语句,和for语句有不一样的地方,但其作用是一样的,他们循环的条件不一样。 不能熟练运用while语句去解决实际问题
9/11-22 3天 151 这周学习了循环的嵌套,可以多次循环。可以解决行与列这种类型的题、以及需要多次循环一个数一个数来的题型等等 感觉知识掌握的还行,但是运用的时候弄不清循环的次数和条件

3.2 累计代码行和博客字数

3.3 学习内容总结

3.4 学习体会

  1. 这周主要学习了两个知识点:① continue语句和break语句的使用和区别,continue只能用于循环结构中,其作用是跳出后面语句继续循环;break可用于循环语句以及switch语句中,其作用是终止循环或终止语句。② 循环的嵌套,可用于多次循环,解决行与列的问题、以及依次输入数等等较复杂的问题。
  2. 这周学习到的知识还是很具体化,知识是可以理解的但是在运用上存在着问题。主要是在做pta时有复杂的问题会搞不清怎样使用循环能表达题目的意思。
  3. 随着学习的知识越来越复杂,题目也越来越复杂,感觉到自己能力的确是不够。有些题目不知道该怎末用学到的知识去表达、用程序的方式来表达计算的过程。感觉自己的思维太固化,不能以计算机所理解的方式去思考。还是要加油学习,但也不能死学,主要是需要改变思考问题的方式。