目录
11-0. 平面向量加法(10)
本题要求编写程序,计算两个二维平面向量的和向量。
输入格式:
输入在一行中按照“x1 y1 x2 y2”的格式给出两个二维平面向量V1=(x1, y1)和V2=(x2, y2)的分量。
输出格式:
在一行中按照“(x, y)”的格式输出和向量,坐标输出小数点后1位(注意不能输出-0.0)。
#include<stdio.h>
typedef struct point {
double x;
double y;
}Point;
Point* getp(Point *p);
void output(Point);
int main(){
Point p1={0.0,0.0};
Point p2={0.0,0.0};
getp(&p1);
getp(&p2);
Point p3={0.0,0.0};
Point *p=&p3;
p->x=p1.x+p2.x;
p->y=p1.y+p2.y;
output(p3);
//output(p1);
//output(p2);
}
Point* getp(Point *p){
scanf("%lf",&p->x);//double类型用lf读 用f输出
scanf("%lf",&p->y);
return p;
}
void output(Point p) {
printf("(%.1f,%.1f)\n",p.x,p.y);
//坐标输出小数点后1位
}
结构的输入输出
方法1:直接使用scanf
方法2:get out函数
他人答案
#include <stdio.h>
#include <math.h>
#define EPSILON 0.05
struct Vector {
double x;
double y;
};
int main(void)
{
struct Vector v1, v2, v3;
scanf("%lf%lf%lf%lf", &v1.x, &v1.y, &v2.x, &v2.y);
v3.x = v1.x + v2.x;
v3.y = v1.y + v2.y;
if(fabs(v3.x) < EPSILON)
v3.x = fabs(v3.x);
if(fabs(v3.y) < EPSILON)
v3.y = fabs(v3.y);
printf("(%.1f, %.1f)\n", v3.x, v3.y);
return 0;
}
if(fabs(v3.x) < EPSILON)
指路:浮点类型的比较_浮点数比较方法_菜花籽的博客-优快云博客
由于浮点数存储的特殊性,在比较时容易出现【精度丢失的情况】:
因此浮点数的比较不能用==直接比较
解决方法:
- 设定一个范围,只要两浮点数相减的值在一个范围内,那么就可以判断这两浮点数相等
- 这里我们自定义了一个精度EPS,只要误差在EPS内,那么判断就成立
- 其实可以看出这样的判断很麻烦,那么我们是否能直接取绝对值,如果我们判断x-0.9是否等于0.1,这样只需要|x-0.9-0.1|<EPS就可以了,接下来介绍一个函数fabs
fabs()函数(math.h)
- 这个函数就是专门用来取浮点数的绝对值,它的返回值就是这个浮点数的绝对值
- 像上文中的EPS,是我们自己设定的精度,
- 其实系统自己有一个精度DBL_EPSILON从定义中可以看到,这个精度很小,是一个最小精度,也是系统给出的精度可以直接使用。在使用时别忘了加上头文件float.h哟
结论:如果以后判断两个浮点数相等的话,只需要它们两个数相减的值的绝对值小于DBL_EPSILON就可以啦
插入一个小知识,如果要比较浮点数和0的大小
只需要fabs(x)<DBL_EPSILON就可以了,具体原因参考上文