C语言I博客作业11

| |
---|:--😐---:
|这个作业属于那个课程| C语言程序设计II
|这个作业要求在哪里| https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/10131
|我在这个课程的目标是| 精通c语言
|这个作业在那个具体方面帮助我实现目标| 学会了循环的嵌套
|参考文献 |c语言程序设计

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.\n", a);
    if (is(b)) printf("%d is counted.\n", 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的两道编程题上,
我发现使用百度时还是获取了很多无用信息,以致浪费了很多时间,因此我在提问技巧方面还有待提高,但这次通过这次的编程题还是
学到了不少知识,总之还需继续加油。
posted @ 2019-12-03 17:32  尭蔕  阅读(410)  评论(1编辑  收藏  举报