数据的间距问题(函数模板) 类point有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干构造函数和一个重载-(减号,计算两点距离)的成员函数。 要求设计一个函数模板
时间: 2023-11-05 09:24:25 浏览: 113
用于计算任意两个类型为point的对象之间的距离,并返回距离值。
可以按照以下方式设计函数模板:
```c++
template<typename T>
double distance(const T& a, const T& b) {
double dx = a.getX() - b.getX();
double dy = a.getY() - b.getY();
return sqrt(dx * dx + dy * dy);
}
```
其中,T代表任意类型,a和b是两个T类型的对象。函数中调用了point类的getX()和getY()成员函数,分别返回x和y坐标,计算两点距离的公式为勾股定理,最后用sqrt()函数求根号。
使用函数模板的示例代码如下:
```c++
point a(1, 2);
point b(3, 4);
double d = distance(a, b);
cout << d << endl;
```
输出结果为:
```
2.82843
```
相关问题
数据的间距问题(函数模板) 类point有三个数据成员:x、y和z, 分别代表x坐标、y坐标和z坐标,并有若干构造函数和一个重载-(减号,计算两点距离)的成员函数。 要求设计一个函数模板, template < class T> double dist(T a, T b) 对int,float,point或者其他类型的数据,返回间距。 输入格式: 每一行为一个操作,每行的第一个数字为元素类型,1为整型元素,2为浮点型元素,3为point类型,若为整型元素,接着输入两个整型数据,若为浮点型元素,接着输入两个浮点型数据,若为point型元素,输入两个point型数据(x1 y1 z1 x2 y2 z2),输入0时标志输入结束。 输出格式: 对每个输入,每行输出一个间距值。
实现代码如下:
```cpp
#include <iostream>
#include <cmath>
using namespace std;
class point {
public:
double x, y, z;
point() {}
point(double a, double b, double c) : x(a), y(b), z(c) {}
double operator-(const point& p) {
return sqrt((x - p.x)*(x - p.x) + (y - p.y)*(y - p.y) + (z - p.z)*(z - p.z));
}
};
template <class T>
double dist(T a, T b) {
return a - b;
}
int main() {
int type;
while (cin >> type && type) {
if (type == 1) {
int a, b;
cin >> a >> b;
cout << dist(a, b) << endl;
}
else if (type == 2) {
double a, b;
cin >> a >> b;
cout << dist(a, b) << endl;
}
else if (type == 3) {
double x1, y1, z1, x2, y2, z2;
cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
point p1(x1, y1, z1), p2(x2, y2, z2);
cout << dist(p1, p2) << endl;
}
}
return 0;
}
```
用C++实现以下功能。由基类Point公有派生出Line、Circle 类,其结构如下: 需要对Line、Circle 类新增加保护数据成员 Line::int x1,y1; // 直线的另外一个点 Circle::int x2,y2; // 圆的另外一个点,两点间距作为圆直径 Line、Circle 类的构造函数实现对基类的参数传递 重载成员函数设置点的坐标值 void Line::SetXY(int m,int n,int l, int k); void Circle::SetXY(int m,int n,int l, int k); 成员函数绘制当前图形 void Line::Draw( ); //输出字符串“Line : (x,y)——(x1,y1)”表示当前图形是直线 void Circle::Draw( ); //输出字符串“Circle : (x,y)——(x1,y1)”表示当前图形是圆
以下是C++实现代码:
```c++
#include <iostream>
using namespace std;
class Point {
protected:
int x, y;
public:
Point(int x = 0, int y = 0) : x(x), y(y) {}
void SetXY(int x, int y) { this->x = x; this->y = y; }
int GetX() { return x; }
int GetY() { return y; }
};
class Line : public Point {
protected:
int x1, y1;
public:
Line(int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0) : Point(x2, y2), x1(x1), y1(y1) {}
void SetXY(int x1, int y1, int x2, int y2) { this->x1 = x1; this->y1 = y1; Point::SetXY(x2, y2); }
void Draw() { cout << "Line: (" << x << "," << y << ")---(" << x1 << "," << y1 << ")" << endl; }
};
class Circle : public Point {
protected:
int x2, y2;
public:
Circle(int x = 0, int y = 0, int x2 = 0, int y2 = 0) : Point(x, y), x2(x2), y2(y2) {}
void SetXY(int x, int y, int x2, int y2) { Point::SetXY(x, y); this->x2 = x2; this->y2 = y2; }
void Draw() { cout << "Circle: (" << x << "," << y << ")---(" << x2 << "," << y2 << ")" << endl; }
};
int main() {
Line line;
line.SetXY(1, 2, 3, 4);
line.Draw();
Circle circle;
circle.SetXY(5, 6, 7, 8);
circle.Draw();
return 0;
}
```
在以上代码中,我们定义了一个基类Point,其中包含了点的坐标信息,并且我们将其定义为protected,以便派生类可以继承和使用。
然后我们定义了两个派生类Line和Circle,它们都包含了两个另外一个点的坐标信息。我们在派生类中新增加了两个保护数据成员,分别为Line的x1和y1,Circle的x2和y2。
接着我们对Line和Circle的构造函数进行了重载,并且在构造函数中实现了对基类Point的参数传递。
然后我们重载了SetXY函数,以便派生类可以设置自己的坐标信息。
最后我们在派生类中实现了Draw函数,用于绘制当前的图形,并且输出相应的字符串表示当前图形是直线还是圆。
在主函数中,我们定义了一个Line对象和一个Circle对象,并且分别设置它们的坐标信息。然后分别调用它们的Draw函数,输出相应的字符串。
阅读全文