算法提高 12-1三角形 【error:no type named iterator_category in struct】

支付宝搜索"534165486"领个小红包吧
支付宝搜索"534165486"领个小红包吧

问题描述

为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小数点后2位数字。

样例输入

0 0
0 1
1 0

样例输出

3.41
0.50
0.50 0.50
0.33 0.33

数据规模和约定

输入数据中每一个数的范围。
例:doule型表示数据

特别注意

函数不能和系统已有函数重名,我就是这个被坑连好久,distance是STL中求迭代器距离的一个函数,如果重名会有【error:no type named iterator_category in struct】

参考代码

#include <iostream>//数据输入输出流
#include <string.h>//字符串操作函数
#include <stdio.h>//C的输入输出
#include <stdlib.h>//定义杂项函数及内存分配函数
#include <math.h>//C中的数学函数
#include <vector>//STL vetor容器
#include <list>//STL list
#include <map>// STL map
#include <queue>// STL queue
#include <stack>//sTL stack
#include <algorithm>//STL各种算法 比如 swap sort merge max min 比较
#include <numeric>//常用数字操作 一般和algorithm搭配使用
#include <malloc.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int maxn = 100;

struct Point{/*用横纵坐标表示一点*/
	double x,y;
}; 
struct Triangle{/*用三个点表示一个三角形*/
	struct Point a,b,c;
}; 

double Distance(Point a,Point b){/*求两点之间的距离*/
	double xx,yy;
	xx=(a.x-b.x)*(a.x-b.x);
	yy=(a.y-b.y)*(a.y-b.y);
	return sqrt(xx+yy);
}
int main(){
	Triangle t;
	//t=(Triangle *)malloc(sizeof(struct Triangle));
	scanf("%lf%lf%lf%lf%lf%lf",&t.a.x,&t.a.y,&t.b.x,&t.b.y,&t.c.x,&t.c.y); 
	double Perimeter,Area,FocusX,FocusY,x,y;
	Perimeter=Distance(t.a,t.b)+Distance(t.a,t.c)+Distance(t.b,t.c);
	double x1,y1,x2,y2;
	x1=t.a.x-t.c.x; y1=t.a.y-t.c.y;
	x2=t.b.x-t.c.x; y2=t.b.y-t.c.y;
	/**
	令a、b为三角形的两个相邻的边向量 
	a(x1, y1),b(x2, y2)
	列成矩阵形式
	|x1 y1|
	|x2 y2|
	这个 2*2 矩阵的行列式的绝对值就是 |x1y2-x2y1|,
	这就是以 a,b 为两条边的平行四边形的面积,
	自然以 a,b 为两条边的三角形面积就是 |(x1y2-x2y1)|/2了
	*/
	Area=fabs(x1*y2-x2*y1)/2.0;
	FocusX=(t.a.x+t.b.x+t.c.x)/3.0;
	FocusY=(t.a.y+t.b.y+t.c.y)/3.0;
	//外心算法-外心到三角形任意一点的距离都相同性质+克拉默法则(行列式求解)
	//(x-a1)^2+(y-b1)^2=(x-a2)^2+(y-b2)^2
	//化简:2(a2-a1)x+2(b2-b1)y=a2^2+b2^2-a1^2-b1^2 ①
	//同理也有:2(a3-a1)x+2(b3-b1)y=a3^2+b3^2-a1^2-b1^2 ②
	/*
		两个式子简化:A1*x+B1*y=C1 ①,A2*x+B2*y=C2 ②
		转型化为行列式:[A1 B1] 记为D.计算D=A1*B2-B1*A2
			     [A2 B2]  
		根据克拉默法则:x=D1/D,D1=[C1 B1] =C1*B2-B1*C2 [用C1,C2替代D的第一列数变为D1]
				       [C2 B2]
				 y=D2/D,D2=[A1 C1]=A1*C2-C1*A2
					   [A2 C2]
	注:本段来自https://blog.csdn.net/qq_39574690/article/details/76855971 
	*/
	double A1,B1,A2,B2,C1,C2,D,D1,D2;
	A1=2*(t.b.x-t.a.x);
	B1=2*(t.b.y-t.a.y);
	A2=2*(t.c.x-t.a.x);
	B2=2*(t.c.y-t.a.y);
	C1=t.b.x*t.b.x+t.b.y*t.b.y-t.a.x*t.a.x-t.a.y* t.a.y; 
	C2=t.c.x*t.c.x+t.c.y*t.c.y-t.a.x*t.a.x-t.a.y* t.a.y;
	D=A1*B2-A2*B1; 
	D1=C1*B2-C2*B1;
	D2=A1*C2-A2*C1; 
	x=D1/D;
	y=D2/D;
	printf("%.2lf\n%.2lf\n%.2lf %.2lf\n%.2lf %.2lf\n",Perimeter,Area,x,y,FocusX,FocusY);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值