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的两道编程题上,
我发现使用百度时还是获取了很多无用信息,以致浪费了很多时间,因此我在提问技巧方面还有待提高,但这次通过这次的编程题还是
学到了不少知识,总之还需继续加油。