64,648
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cassert>
// 定义类来表述每一行数据
class Point {
friend Point multiply(const Point& pt1, const Point& pt2);
friend std::ostream& operator<<(std::ostream& os, const Point& pt);
public:
Point() : _x(0), _y(0), _z(0) {}
Point(double x, double y, double z) : _x(x), _y(y), _z(z) {}
// 根据需要重载运算符
Point& operator-=(const Point& rh) {
_x -= rh._x;
_y -= rh._y;
_z -= rh._z;
return (*this);
}
Point& operator/=(double n) {
_x /= n;
_y /= n;
_z /= n;
return (*this);
}
Point operator+(const Point& pt) const {
double x = _x + pt._x;
double y = _y + pt._y;
double z = _z + pt._z;
return Point(x, y, z);
}
private:
double _x;
double _y;
double _z;
};
// 定义函数对象,减操作
class Minus_value {
public:
Minus_value(Point val) : _val(val) {}
void operator()(Point& elem) {
elem -= _val;
}
private:
Point _val;
};
// 乘操作
Point multiply(const Point& pt1, const Point& pt2)
{
double x = pt1._x * pt2._x;
double y = pt1._y * pt2._y;
double z = pt1._z * pt2._z;
return Point(x, y, z);
}
// 输出Point对象
std::ostream& operator<<(std::ostream& os, const Point& pt)
{
os << "(" << pt._x << ", " << pt._y << ", " << pt._z << ")";
return os;
}
int main(int, char**)
{
std::ifstream infile1("1.txt");
std::ifstream infile2("2.txt");
if (!infile1 || !infile2) {
std::cout << "cann't open file." << std::endl;
return -1;
}
std::string tmp_str;
// 读取文件1内容
std::vector<Point> dvec1;
while (std::getline(infile1, tmp_str)) {
std::istringstream is(tmp_str);
double x, y, z;
is >> x >> y >> z;
dvec1.push_back(Point(x, y, z));
}
// 读取文件2内容
std::vector<Point> dvec2;
while (std::getline(infile2, tmp_str)) {
std::istringstream is(tmp_str);
double x, y, z;
is >> x >> y >> z;
dvec2.push_back(Point(x, y, z));
}
infile1.close();
infile2.close();
assert(11 == dvec1.size() && 11 == dvec2.size());
// 第一组数据的前10行,每一行减去第11行
std::for_each(dvec1.begin(), dvec1.begin() + 10,
Minus_value(dvec1[10]));
// 第二组数据的前10行,每一行减去第11行
std::for_each(dvec2.begin(), dvec2.begin() + 10,
Minus_value(dvec2[10]));
// 以上结果相乘,结果存入multi_result
std::vector<Point> multi_result;
std::transform(dvec1.begin(), dvec1.begin() + 10, dvec2.begin(),
std::back_inserter(multi_result), multiply);
// 求和
Point sum;
sum = std::accumulate(multi_result.begin(), multi_result.end(), Point());
// 求平均值
Point avg = sum /= 10;
// 输出结果
std::cout << avg << std::endl;
return 0;
}