题目要求
计算点到直线的距离。首先设计一个点类Point,它有2 个私有数据成员x和y,表示点的坐标。另一个类为直线类Line,它有3 个私有数据成员a,b和c,表示直线方程ax+by+c= 0。这两个类中都说明了一个友元函数dist,用于计算一个点到直线的距离。点(x.y)到直线ax+by+c=0的距离d的计算公式如下:
语法要点: 友元函数的特点。
这是一个编程题模板。请在这里写题目描述。例如:本题目要求读入2个整数A和B,然后输出它们的和。
输入格式:
输入两行,第一行输入两个整数,表示点坐标x,y的值
在第二行中输入直线三个参数,表示直线方程的三个洗漱a,b,c.
输出格式:
计算点到直线的距离保留两位小数。
输入样例:
在这里给出一组输入。例如:
5 5
2 4 3
输出样例:
在这里给出相应的输出。例如:
The distance is: 7.38
解题思路
- 定义 Point 和 Line 两个类,其中 Point 表示平面上的一个点,包含坐标 x 和 y;Line 表示平面上的一条直线,包含参数 a,b,c (对应直线方程 ax+by+c=0 中的系数)。
- 在 Point 中定义友元函数 dist(Line &, Point &) 和 Line 中定义友元函数 dist(Line &, Point &),它们分别用于计算一个点到直线的距离。
这两个友元函数其实是同一个函数,只是参数顺序不同,可以根据需要选择其中一个进行使用。
在 Point 中定义的友元函数 dist(Line &, Point &) 的作用是:
- 将参数 Point &P 带入直线方程 ax+by+c=0,求出点 P 到直线 L 垂足的坐标 H(x0,y0):
- 计算 PH 的长度,即为点 P 到直线 L 的距离:
在 Line 中定义的友元函数 dist(Line &, Point &) 的作用与上述类似,将参数 Line &L 带入直线方程求出直线 L 到点 P 垂足的坐标 H(x0,y0),再计算 PH 的长度。
- 在主函数中,首先通过输入获取参数 A,B,a1,b1,c1,分别表示点 P 的坐标、直线 L 的系数。然后创建一个 Point 对象 P 和一个 Line 对象 L。
- 调用 dist 函数计算 P 点到 L 直线的距离,根据测试要求使用 setprecision 控制输出精度,最后输出结果。
代码
#include<iostream> #include<cmath> #include<iomanip> //用于控制输出精度 using namespace std; class Line; //提前声明 Line 类,因为 Point 中的友元函数要用到它 class Point { int x, y; public: //构造函数,用于初始化 Point 对象 Point(int X = 0, int Y = 0) { x = X; y = Y; } //公有成员函数,获取 x 坐标 int getx() { return x; } //公有成员函数,获取 y 坐标 int gety() { return y; } //友元函数,计算点到直线的距离 friend double dist(Point&, Line&); }; class Line { int a, b, c; public: //构造函数,用于初始化 Line 对象 Line(int A = 1, int B = 1, int C = 1) { a = A; b = B; c = C; } //公有成员函数,获取 a 系数 int geta() { return a; } //公有成员函数,获取 b 系数 int getb() { return b; } //公有成员函数,获取 c 系数 int getc() { return c; } //友元函数,计算点到直线的距离 friend double dist(Point&, Line&); }; //友元函数,计算点到直线的距离 double dist(Point& P, Line& L) { double s; //计算直线上垂足的坐标 double x0 = (L.b*L.b*P.x - L.a*L.b*P.y - L.a*L.c) / (L.a*L.a + L.b*L.b); double y0 = (-L.a*L.b*P.x + L.a*L.a*P.y - L.b*L.c) / (L.a*L.a + L.b*L.b); //计算距离 s = abs((L.a*P.x + L.b*P.y + L.c) / sqrt(L.a*L.a + L.b*L.b)); return s; } int main() { int A, B, a1, b1, c1; cin >> A >> B; //输入点 P 的坐标 cin >> a1 >> b1 >> c1; //输入直线 L 的系数 Point P(A, B); //创建 Point 对象 P Line L(a1, b1, c1); //创建 Line 对象 L //调用 dist 函数计算 P 点到 L 直线的距离,并输出结果 if (dist(P, L) == 0) //判断距离是否为 0,下同 cout << "The distance is: 0"; else cout << fixed << setprecision(2) << "The distance is: " << dist(P, L); return 0; }
总结
该题考察C++ 类的基本定义和使用,包括类的构造函数、公有成员函数和私有成员变量等。
同时考察了友元函数的定义和使用,注意:友元函数可以访问类的私有成员变量,但并不是类的成员函数。
我是秋说,我们下次见。