使用 C++设计一个程序,功能如下: 从文件“input.txt”中读入数据(一组二维坐标(x,y)),文件格式如下: 大 34.1 45,44 -323.67 493.56 42.55 -89.22 34.11 99.56 ...... 每行第一个数为 x,第二个数为y。 读取数据后,通过按键控制程序: 1.输入字符为's’时,在屏幕上显示所有坐标; 2.输入字符为'x’时,依据x对所有坐标进行排序并输出到屏幕; 3.输入字符为'y’时,依据y对所有坐标进行排序并输出到屏幕; 4.输入字符为'n’时,在屏幕上输出坐标数目; 5.输入字符为'c’时,在屏幕上输出所有点的质心位置(假设每个点质量相同); 6.输入字符为'l’时,对坐标进行最小二乘法拟合,输出拟合的斜率、截距 和误差; 7.输入字符为'i’时,要求用户再输入一个整数 n,输入后屏幕显示第n个 发给 坐标值; 8.输入字符为'v’时,所有坐标沿x轴进行镜像变换,并将变换后的坐标屏幕上输出; 9.输入字符为'h’时,所有坐标沿y轴进行镜像变换,并将变换后的坐标在屏幕上输出; 10.输入字符为'r’时,要求用户再输入一个数 a,输入后所有坐标绕原点旋转a度; 11.输入字符为'm’时,要求用户再输入两个数 x0,y0,输入后将所有坐标沿 x和y轴分别平移 x0,y0,并在屏幕上输出所有坐标;12.输入字符为'e’时,退出程序。

时间: 2024-03-18 22:41:56 浏览: 25
好的,以下是 C++ 实现程序的代码,注释中有详细说明: ```c++ #include <iostream> #include <fstream> #include <vector> #include <algorithm> #include <math.h> using namespace std; // 定义坐标点类 class Point { public: double x, y; Point() {} Point(double a, double b) { x = a; y = b; } // 重载小于符号,用于排序 bool operator<(const Point& rhs) const { return x < rhs.x; } }; // 定义文件读取函数 vector<Point> readFile(string filename) { vector<Point> points; ifstream fin(filename); if (!fin) { cerr << "Failed to open file: " << filename << endl; exit(1); } double x, y; while (fin >> x >> y) { points.push_back(Point(x, y)); } fin.close(); return points; } // 定义输出所有坐标函数 void printPoints(vector<Point>& points) { for (int i = 0; i < points.size(); i++) { cout << "(" << points[i].x << ", " << points[i].y << ")" << endl; } } // 定义按 x 排序输出函数 void sortByX(vector<Point>& points) { sort(points.begin(), points.end()); printPoints(points); } // 定义按 y 排序输出函数 void sortByY(vector<Point>& points) { sort(points.begin(), points.end(), [](const Point& a, const Point& b) { return a.y < b.y; }); printPoints(points); } // 定义输出坐标数目函数 void printNumOfPoints(vector<Point>& points) { cout << "Number of points: " << points.size() << endl; } // 定义输出质心位置函数 void printCenterOfGravity(vector<Point>& points) { double cx = 0, cy = 0; for (int i = 0; i < points.size(); i++) { cx += points[i].x; cy += points[i].y; } cx /= points.size(); cy /= points.size(); cout << "Center of gravity: (" << cx << ", " << cy << ")" << endl; } // 定义最小二乘法拟合函数 void leastSquaresFitting(vector<Point>& points) { double sumX = 0, sumY = 0, sumXY = 0, sumXX = 0; for (int i = 0; i < points.size(); i++) { sumX += points[i].x; sumY += points[i].y; sumXY += points[i].x * points[i].y; sumXX += points[i].x * points[i].x; } double n = points.size(); double a = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX); double b = (sumY - a * sumX) / n; double err = 0; for (int i = 0; i < points.size(); i++) { err += pow(points[i].y - a * points[i].x - b, 2); } err = sqrt(err / n); cout << "Slope: " << a << endl; cout << "Intercept: " << b << endl; cout << "Error: " << err << endl; } // 定义按序号输出函数 void printPointByIndex(vector<Point>& points) { int index; cout << "Please enter the index: "; cin >> index; if (index < 1 || index > points.size()) { cerr << "Invalid index." << endl; return; } cout << "(" << points[index - 1].x << ", " << points[index - 1].y << ")" << endl; } // 定义 x 轴镜像变换函数 void mirrorByXAxis(vector<Point>& points) { for (int i = 0; i < points.size(); i++) { points[i].y = -points[i].y; } printPoints(points); } // 定义 y 轴镜像变换函数 void mirrorByYAxis(vector<Point>& points) { for (int i = 0; i < points.size(); i++) { points[i].x = -points[i].x; } printPoints(points); } // 定义旋转函数 void rotate(vector<Point>& points) { double angle; cout << "Please enter the angle (in degrees): "; cin >> angle; double rad = angle * M_PI / 180; for (int i = 0; i < points.size(); i++) { double x = points[i].x * cos(rad) - points[i].y * sin(rad); double y = points[i].x * sin(rad) + points[i].y * cos(rad); points[i].x = x; points[i].y = y; } printPoints(points); } // 定义平移函数 void translate(vector<Point>& points) { double x, y; cout << "Please enter the x and y translation: "; cin >> x >> y; for (int i = 0; i < points.size(); i++) { points[i].x += x; points[i].y += y; } printPoints(points); } int main() { // 读取文件 vector<Point> points = readFile("input.txt"); char command; while (true) { cout << "Please enter a command: "; cin >> command; switch (command) { case 's': printPoints(points); break; case 'x': sortByX(points); break; case 'y': sortByY(points); break; case 'n': printNumOfPoints(points); break; case 'c': printCenterOfGravity(points); break; case 'l': leastSquaresFitting(points); break; case 'i': printPointByIndex(points); break; case 'v': mirrorByXAxis(points); break; case 'h': mirrorByYAxis(points); break; case 'r': rotate(points); break; case 'm': translate(points); break; case 'e': return 0; default: cerr << "Unknown command." << endl; break; } } return 0; } ```

相关推荐

最新推荐

recommend-type

C++从文本文件读取数据到vector中的方法

主要给大家介绍了利用C++如何从文本文件读取数据到vector中,文章通过实例给出示例代码,相信会对大家的理解和学习很有帮助,有需要的朋友们下面来一起看看吧。
recommend-type

OpenCV中的cv::Mat函数将数据写入txt文件

主要介绍了OpenCVcv::Mat中的数据按行列写入txt文件中,需要的朋友可以参考下
recommend-type

C++中进行txt文件读入和写入的方法示例

主要给大家介绍了C++中进行txt文件读入和写入的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
recommend-type

C++通过自定义函数找出一个整数数组中第二大数的方法

主要介绍了C++通过自定义函数找出一个整数数组中第二大数的方法,涉及C++针对数组的遍历操作相关技巧,需要的朋友可以参考下
recommend-type

OpenCV cv.Mat与.txt文件数据的读写操作

主要介绍了OpenCV cv.Mat 与 .txt 文件数据的读写操作,现在分享给大家,也给大家做个参考
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解答下列问题:S—>S;T|T;T—>a 构造任意项目集规范族,构造LR(0)分析表,并分析a;a

对于这个文法,我们可以构造以下项目集规范族: I0: S -> .S S -> .T T -> .a I1: S -> S. [$ T -> T. [$ I2: S -> T. I3: S -> S.;S S -> S.;T T -> T.;a 其中,点(.)表示已经被扫描过的符号,;$表示输入串的结束符号。 根据项目集规范族,我们可以构造出LR(0)分析表: 状态 | a | $ ---- | - | - I0 | s3| I1 | |acc I2 | | 其中s3表示移进到状态3,acc表示接受。在分析字符串a;a时,我们可以按照以下步骤进行
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。