首页 > 编程语言 >[C++/PTA] 计算点到直线的距离一一友元函数的应用

[C++/PTA] 计算点到直线的距离一一友元函数的应用

时间:2023-06-14 19:57:52浏览次数:41  
标签:友元 直线 函数 Point int PTA C++ Line

题目要求

计算点到直线的距离。首先设计一个点类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

解题思路

  1. 定义 Point 和 Line 两个类,其中 Point 表示平面上的一个点,包含坐标 x 和 y;Line 表示平面上的一条直线,包含参数 a,b,c (对应直线方程 ax+by+c=0 中的系数)。

  2. 在 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 的长度。

  1. 在主函数中,首先通过输入获取参数 A,B,a1,b1,c1,分别表示点 P 的坐标、直线 L 的系数。然后创建一个 Point 对象 P 和一个 Line 对象 L。

  2. 调用 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++ 类的基本定义和使用,包括类的构造函数、公有成员函数和私有成员变量等。

同时考察了友元函数的定义和使用,注意:友元函数可以访问类的私有成员变量,但并不是类的成员函数。

我是秋说,我们下次见。

标签:友元,直线,函数,Point,int,PTA,C++,Line
From: https://www.cnblogs.com/qiushuo/p/17481199.html

相关文章

  • [C++/PTA] 队列操作
    题目要求请实现一个MyQueue类,实现出队,入队,求队列长度.实现入队函数voidpush(intx);实现出队函数intpop();实现求队列长度函数intsize();输入格式:每个输入包含1个测试用例。每个测试用例第一行给出一个正整数n(n<=10^6),接下去n行每行一个数字,表示一种操作:1x:......
  • [C++/PTA] 表彰优秀学生(多态)
    题目要求学期结束,班主任决定表彰一批学生,已知该班学生数在6至50人之间,有三类学生:普通生,特招运动员,学科专长生,其中学科专长生不超过5人。主函数根据输入的信息,相应建立GroupA,GroupB,GroupC类对象。GroupA类是普通生,有2门课程的成绩(均为不超过100的非负整数);GroupB类是特招运......
  • [C++/PTA] 2017Final进位与借位
    题目要求凤湖小学二年级的陈老师吃惊地发现班上的同学竟然可以分成三类,一类总是可以正确地完成三位整数加减法(GroupA);一类总是可以正确地完成三位整数的加法,但对于减法运算来说,总是忘记借位的处理(GroupB);剩下的人总是忘记加法的进位,也总是忘记减法的借位(GroupC)。现在请给出......
  • [C++] 什么是vertor容器?
    基本概念C++中的vector是一种顺序容器,是一个封装了动态大小数组的顺序容器,可以存放任意类型的数据。vector可以随着元素的加入自动扩充其大小,并且支持在中间插入或删除元素。vector的声明方式为:vector<元素类型>数组名;例如,声明一个储存整数的vector变量可以这样写:......
  • [C++/PTA] 虚函数的应用
    题目要求补充下列代码,使得程序的输出为:A:3A:15B:53155类和函数接口定义:参见裁判测试程序样例中的类和函数接口。裁判测试程序样例:#include<iostream>usingnamespacestd;classCMyClassA{intval;public:CMyClassA(int);voidvirtualprint();......
  • [C++/PTA] 学生成绩快速录入
    题目要求现在需要录入一批学生的成绩(学号,成绩)。其中学号是正整数,并且录入时,后录入学生的学号会比前面的学号大;成绩分两等,通过(Pass,录入时用1代表),不通过(Fail,录入时用0代表)。由于很多学号都是相邻的,并且学号相邻的学生成绩常常相同。所以在录入时,适当地加了速。如果当前学生......
  • [C++/PTA] 我的支付宝和余额宝
    题目要求支付宝AliPay和余额宝AliFund是一对好兄弟,他们来自同一个父类Account。已知类Account是支付宝AliPay和余额宝AliFund的虚基类,包括两个protected成员数据:longID;//账号stringname;//用户名支付宝AliPay是类Account的保护派生类,包括两个新增protected成员数据:double......
  • C/C++中的变长结构体
    1.问题来源首先看下如下的一段代码:#include<stdlib.h>#include<stdio.h>#include<string.h>#defineMAX_LEN1024typedefstructKDtree{doubledata[MAX_LEN];//数据intdim;//选择的维度structKDtree*left;//左子树structKDtree*right;......
  • C/C++——排序
    在C/C++中的排序,使用到的函数主要有:sort()qsort()下面详细分析sort()函数和qsort()函数。1、sort()函数sort()是STL中提供的算法,头文件为:#include<algorithm>usingnamespacestd;函数原型如下:template<classRandomAccessIterator>voidsort(RandomAccessIteratorfirst,Ran......
  • C/C++——map的基本操作总结
    标准库map类型是一种以键-值(key-value)存储的数据类型。以下分别从以下的几个方面总结:map对象的定义和初始化map对象的基本操作,主要包括添加元素,遍历等1、pair类型1.1、pair类型的定义和初始化pair类型是在有文件utility中定义的,pair类型包含了两个数据值,通常有以下的一些定义和初......