zoukankan      html  css  js  c++  java
  • C语言I博客作业11

    这个作业属于那个课程
    这个作业要求在哪里
    我在这个课程的目标是
    这个作业在那个具体方面帮助我实现目标
    参考文献

    1.PTA实验作业(20分/题)

    从PTA题目集中选出2个你最满意的题目完成以下内容,选择题目难度越大,分值越高,每题20分(每项5分),内容要求如下:

    1.1 题目名1

    6-2 统计各位数字之和是5的数 (20分)
    本题要求实现两个函数:一个函数判断给定正整数的各位数字之和是否等于5;另一个函数统计给定区间内有多少个满足上述要求的整数,并计算这些整数的和。

    函数接口定义:
    int is( int number );
    void count_sum( int a, int b );
    函数is判断number的各位数字之和是否等于5,是则返回1,否则返回0。

    函数count_sum利用函数is统计给定区间[a, b]内有多少个满足上述要求(即令is返回1)的整数,并计算这些整数的和。最后按照格式

    count = 满足条件的整数个数, sum = 这些整数的和
    进行输出。题目保证0<a≤b≤10000。

    裁判测试程序样例:
    #include <stdio.h>

    int is( int number );
    void count_sum( int a, int b );
    
    int main()
    {
        int a, b;
    
        scanf("%d %d", &a, &b);
        if (is(a)) printf("%d is counted.
    ", a);
        if (is(b)) printf("%d is counted.
    ", b);
        count_sum(a, b);
    
        return 0;
    }
    

    /* 你的代码将被嵌在这里 */
    输入样例:
    104 999
    输出样例:
    104 is counted.
    count = 15, sum = 3720

    1.1.1数据处理

       int is(int number)判断各个位数加起来是否=5的函数
    {
        int n, sum = 0;
        n = number;
        while (n)
        {
    	    sum += n % 10;拆成各个位的数
    	    n /= 10;拆成各个位的数
        }
        if (sum == 5)
        {
    	     return 1;      =5返回1
        }
        return 0;   !=5返回0
    }
    void count_sum(int a, int b)判断给定区间的数有多少满足=5条件的函数
    {
        int count = 0, sum = 0;
        for (int i = a; i <= b; i++)给定区间
        {
    	    if (is(i))
    	    {
    		    count++;满足条件就加1
    		    sum += i;将满足条件的数字加起来
    	    }
        }
        printf("count = %d, sum = %d", count, sum);
    }
    

    1.1.2实验代码截图

    1.1.3 造测试数据

    输入数据 输出数据 说明
    104 999 104 is counted. count = 15, sum = 3720 题目所给
    100 200 count = 5, sum = 610 区间小一点
    0 50 50 is counted. count = 6, sum = 165 随机数值

    1.1.4 PTA提交列表及说明

    编译错误:for循环结构的大括号没括回来
    解决方法:将大括号括回来
    

    1.2 题目2

    7-1 解一元二次方程(*) (10分)
    请编写程序,解一元一次方程 ax
    ​2
    ​​ +bx+c=0 。

    要求:

    若a=0,则解一元一次方程。
    若方程有唯一解,则输出方程的根;
    若方程无解,则输出“无解”;
    若方程有无穷多解,则输出“无穷多解”。
    若a≠0,则解一元二次方程。
    若Δ>0,则输出方程的两个不等的实根;
    若Δ=0,则输出方程的两个相等的实根;
    若Δ<0,则输出方程的两个共轭的虚根。
    所有实数均以%g输出。

    输入样例1
    0 4.5 -3.6
    输出样例1
    x = 0.8
    输入样例2
    0 0 3.6
    输出样例2
    无解
    输入样例3
    0 0 0
    输出样例3
    无穷多解
    输入样例4
    -2 0.8 -0.06
    输出样例4
    x1 = 0.1, x2 = 0.3
    输入样例5
    -3 1.2 -0.12
    输出样例5
    x1 = x2 = 0.2
    输入样例6
    -0.2 0.04 -0.01
    输出样例6
    x1 = 0.1-0.2i, x2 = 0.1+0.2i
    提示:注意实数的负零问题和误差问题。

    1.2.1 数据处理

                                                   这个代码是可以直接用的哦d=====( ̄▽ ̄*)b   #define不知道是什么的可以先看这题的提交列表                                   
                                             PS:fabs()是精度浮点型变量取绝对值的意思,整型的为abs()
    #include <stdio.h>
    #include <math.h>
    
    #define EPS 0.000001                             //EPS = 0.000001
    #define Result(A) (-b + A) / (2 * a)          //Result(A) = (-b + A) / (2 * a)  这里的作用相当于一个函数,相当于给A赋值后进行计算并将值返回
    
    int main()
    {
        double a, b, c;   //定义变量a,b,c
        double x, x1, x2;  //用于输出答案
        double m, n;   //m是多余的,请忽略谢谢(。・∀・)ノ,n是用来表示复数中的虚数的
        scanf("%lf %lf %lf", &a, &b, &c);
    
        if (-EPS <= a && a <= EPS)   //效果等同于a=0,大家可以仔细想想是为什么
    	    b != 0 ? printf("x = %g", fabs(-c / b)) : (c != 0 ? printf("无解") : printf("无穷多解"));   
                               //b不等于0吗?是的话输出。。。:否则(c不等于0吗?是的话就输出。。。:否则输出。。。)
        else
        {
    	    double Discriminant = b * b - 4 * a * c;   公式法计算德尔塔
    	    if (Discriminant > EPS)                                                        //效果等同于Discriminant>0
    	    {
    		    printf("x1 = %g, x2 = %g", fabs(Result(sqrt(Discriminant))), Result(-sqrt(Discriminant)));
    	    }
    	    else if (-EPS <= (Discriminant) && (Discriminant) <= EPS)  //效果等同于Discriminant=0
    	    {
    		    printf("x1 = x2 = %g", fabs((-b) / (2 * a)));
    	    }
    	    else                                                                                   //效果等同于Discriminant<0
    	    {
    		    n = fabs(sqrt(-Discriminant) / (2 * a));
    		    printf("x1 = %g+%gi, x2 = %g-%gi", fabs(Result(0)), n, fabs(Result(0)), n);
    	    }
        }
        return 0;
    }
                                本题的误差主要是精度如果你double a=0;的话,a会等于0.000000...0241(后面的数字是我乱打的)所以a不等于0
    

    1.2.2 实验代码截图

    1.2.3 造测试数据

    此处数据均为题目所给





    1.2.4 PTA提交列表及说明


    部分正确:输入输出都与答案一至,那么我就来谈一谈我为了解这一题做了什么吧。
    解决方法:1.自己将已知的一元二次方程的代码写出来
    2.通过https://zhidao.baidu.com/question/502025981489608244.html?word=%E4%B8%80%E5%85%83%E4%BA%8C%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%A4%8D%E6%95%B0%E6%B1%82%E6%A0%B9%E5%85%AC%E5%BC%8F&qq-pf-to=pcqq.c2c
    了解了一元二次方程复数求根公式(链接太长,请复制粘贴到浏览器上浏览)
    3.应题目要求注意实数的负零问题和误差问题,而进行了搜索,了解了c语言中浮点数的精度问题:https://blog.csdn.net/suyy_hui/article/details/80213018
    并且了解到在浮点数的精度问题中-0!=0,而是-0==一个很小很小的负数(然后我试图用(int)将其转换成整型来消除误差,虽然输入输出跟题目还是一样的,但通过的测试点并没有多)然后用
    #define EPS 0.000001 (EPS=0.000001)
    #define Result(A) (-b + A) / (2 * a) ((-b + A) / (2 * a)=Result(A))
    #define http://c.biancheng.net/view/446.html 链接内容将为大家解释#define是什么意思
    大家也发现了,如果我们用#define的话是不用定义int或double数据类型的

    2.代码互评(5分)

    找2份同学代码,和自己代码比较,建议互评代码尽量找代码风格差异较大。

    同学代码截图

    同学1

    同学2

    自己代码截图

    同学1:while循环的条件为N!=0与我的循环条件效果相同,int的几个变量可以写一起,显得更简洁
    同学2:也是int的变量写一起的问题
    我:将int出的变量写在了一起,我的while循环条件为n,也是判断是否为0
    

    3.学习总结(15分)

    3.1 学习进度条(5分)

    周/日期 这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
    第一周 2h 72 输出 对于输出的符号还不熟
    第二周 3.5h 57 计算 算法陌生
    第三周 3.5h 81 分支结构 分支的逻辑理不清
    第四周 1.5h 180 for循环,+= 终止条件理不清
    第五周 2h 600 函数结构 对于算法的处理比较迷惑
    第六周 2h 1000 嵌套 对于嵌套的结构过多会解读的很吃力
    第七周 2h 1246 switch结构 switch结构里的case最后若是不加break会怎么样
    第八周 3h 1102 while结构 字符的运用不熟
    第九周 3h 1002 循环嵌套 代码思维不够
    第十周 3h 999 对于嵌套结构运用不熟练
    第十一周 4h 420 变量的声明、定义 知识点掌握的不够,解题显得困难,特别是一元二次方程的那题

    3.2 累积代码行和博客字数(5分)

    3.3 学习内容总结和感悟(5分)

    3.3.1 学习内容总结

    3.3.2 学习体会

    经过本周的学习,我发现了自己在C语言的了解方面还有很多的不足,还有很多我没掌握的知识,特别是在这次的pta的两道编程题上,
    我发现使用百度时还是获取了很多无用信息,以致浪费了很多时间,因此我在提问技巧方面还有待提高,但这次通过这次的编程题还是
    学到了不少知识,总之还需继续加油。
  • 相关阅读:
    安装MySQL
    Apache安装与重启、启动失败
    MySQL重启
    数据库查询乱码
    MySQL数据表操作、查看mysql表的信息等
    rust学习之一:基本语法
    llvm clang的编译和安装
    Linux 性能分析60秒初步排除手段
    pahole编译过程libbpf: failed to find valid kernel BTF
    ipmitool常用指令测试大全
  • 原文地址:https://www.cnblogs.com/czynb/p/11978266.html
Copyright © 2011-2022 走看看