• 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(sum
    m)
    then[printf("%d = 1",m)
    for j←2 to m
    {
    if(m%j0)
    printf(" + %d",j)
    }
    printf(" ")
    count++;]
    }
    if(count
    0)
    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-a
    5)/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(" ")
    }
    }
    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语言越到后面感到困难,问题也越来越多,自我认识原因是之前的学习中没有及时巩固,可能那个时候明白了,但是没有深入挖掘与思考,在之后的学习中又慢慢遗忘了.所以,温故而知新是非常重要的,只有这样,才能在计算机学习方面越来越远,越飞越高.不经一番寒彻骨,怎得梅花扑鼻香.

  • 相关阅读:
    Three.js入门和搭建HelloWorld
    CentOS中使用Docker来部署Tomcat
    CentOS中使用Docker来部署Nginx
    Windows中通过bat定时执行命令和mysqldump实现数据库备份
    Geoserver在Linux上的安装(图文教程)
    Linux上怎样停止服务(jar包)、查看进程路径、关闭指定端口
    Java中怎样监测局域网内ip是否互通,类似ping
    Android和JS之间互相调用方法并传递参数
    Android中使用WebView加载本地html并支持运行JS代码和支持缩放
    ARC072C
  • 原文地址:https://www.cnblogs.com/wllrky/p/11897439.html
Copyright © 2020-2023  润新知