实验6 模板类、文件I/O和异常处理

news/2024/12/16 15:27:51/文章来源:https://www.cnblogs.com/wxdyyds/p/18609502

1.实验任务1

运行代码:

Complex.h:

#pragma once#include <iostream>
#include <stdexcept>// 声明
////////////////////////////////////////////////////
// 复数模板类声明
template<typename T>
class Complex {
public:Complex(T r = 0, T i = 0);Complex(const Complex<T>& c);T get_real() const;T get_imag() const;// 重载+=为成员函数Complex<T>& operator+=(const Complex<T>& c);// 重载<<、>>为友元函数template<typename T1>friend std::ostream& operator<<(std::ostream& out, const Complex<T1>& c);template<typename T1>friend std::istream& operator>>(std::istream& in, Complex<T1>& c);private:T real, imag;
};// 普通函数声明
// 重载+用于Complex类型
template<typename T>
Complex<T> operator+(const Complex<T>& c1, const Complex<T>& c2);// 重载==用于Complex类型
template<typename T>
bool operator==(const Complex<T>& c1, const Complex<T>& c2);// 实现
////////////////////////////////////////////////////
// 成员函数模板实现
template<typename T>
Complex<T>::Complex(T r, T i) : real{ r }, imag{ i } {
}template<typename T>
Complex<T>::Complex(const Complex<T>& c) : real{ c.real }, imag{ c.imag } {
}template<typename T>
T Complex<T>::get_real() const {return real;
}template<typename T>
T Complex<T>::get_imag() const {return imag;
}// 重载+=为成员函数
template<typename T>
Complex<T>& Complex<T>::operator+=(const Complex<T>& c) {real += c.real;imag += c.imag;return *this;
}///////////////////////////////////////
// 友元函数模板实现
template<typename T1>
std::ostream& operator<<(std::ostream& out, const Complex<T1>& c) {if (c.imag >= 0)out << c.real << " + " << c.imag << "i";elseout << c.real << " - " << -c.imag << "i";return out;
}template<typename T1>
std::istream& operator>>(std::istream& in, Complex<T1>& c) {in >> c.real >> c.imag;return in;
}///////////////////////////////////////
// 普通函数模板实现
// 重载+用于Complex类型
template<typename T>
Complex<T> operator+(const Complex<T>& c1, const Complex<T>& c2) {return Complex<T>(c1.get_real() + c2.get_real(),c1.get_imag() + c2.get_imag());
}// 重载==用于Complex类型
template<typename T>
bool operator==(const Complex<T>& c1, const Complex<T>& c2) {return c1.get_real() == c2.get_real() &&c1.get_imag() && c2.get_imag();
}
View Code

task1.cpp:

#include "Complex.hpp"
#include <iostream>
#include <fstream>
#include <stdexcept>void test1();
void test2();int main() {using namespace std;cout << "测试1: 复数模板类测试" << endl;test1();cout << "\n测试2: 文件I/O测试" << endl;test2();
}void test1() {using namespace std;Complex<double> c1{ 3.5, 2 }, c2;cout << "Enter c2: ";cin >> c2;cout << "c1 = " << c1 << endl;cout << "c2 = " << c2 << endl;cout << "c1 == c2: " << boolalpha << (c1 == c2) << endl;cout << "c1 + c2 = " << c1 + c2 << endl;c1 += c2;cout << "c1.real = " << c1.get_real() << endl;cout << "c1.imag = " << c1.get_imag() << endl;cout << "c1 == c2: " << boolalpha << (c1 == c2) << endl;
}void test2() {using namespace std;Complex<int> c1{ 1, 2 }, c2{ 9, -7 };ofstream out("ans.txt");if (!out.is_open()) {cout << "fail to open file ans.txt to write\n";return;}out << "c1 = " << c1 << endl;out << "c2 = " << c2 << endl;out << "c1 + c2 = " << c1 + c2 << endl;out << "(c1 == c2) = " << boolalpha << (c1 == c2) << endl;out.close();cout << "测试ok!" << endl;
}
View Code

运行截图:

 

2.实验任务2

运行代码:

Contestant.hpp:

#pragma once#include <iostream>
#include <iomanip>
#include <string>using std::string;
using std::ostream;
using std::istream;
using std::setw;
using std::setprecision;
using std::setiosflags;
using std::ios_base;// Contestant类声明
class Contestant {
public:Contestant() = default;~Contestant() = default;int get_num() const { return num; }float get_time_usage() const { return time_usage; }friend ostream& operator<<(ostream& out, const Contestant& c);friend istream& operator>>(istream& in, Contestant& c);private:string no;          // 学号string name;        // 姓名string major;       // 专业int num;            // 解题数float time_usage;   // 总用时
};// 友元函数实现
// 重载流插入运算符<<
ostream& operator<<(ostream& out, const Contestant& c) {out << setiosflags(ios_base::left);out << setw(15) << c.no<< setw(15) << c.name<< setw(15) << c.major<< setw(5) << c.num<< setprecision(2) << c.time_usage;return out;
}// 重载流提取运算符>>
istream& operator>>(istream& in, Contestant& c) {in >> c.no >> c.name >> c.major >> c.num >> c.time_usage;return in;
}
View Code

utils.hpp:

#include "Contestant.hpp"
#include <fstream>
#include <iostream>
#include <string>
#include <vector>// 排序函数
// 按解题数比较,解题数相同的情况下,按总用时比较,总用时越少,排名越靠前
bool compare_by_solutionInfo(const Contestant& c1, const Contestant& c2) {if (c1.get_num() > c2.get_num())return true;if (c1.get_num() == c2.get_num())return c1.get_time_usage() < c2.get_time_usage();return false;
}// 把vector<Constestant>对象中的元素插入到输出流out
void output(std::ostream& out, const std::vector<Contestant>& v) {for (auto& i : v)out << i << std::endl;
}// 把vector<Contestant>对象中的元素写到filename文件中
void save(const std::string& filename, std::vector<Contestant>& v) {using std::ofstream;ofstream out(filename);if (!out.is_open()) {std::cout << "fail to open file to write\n";return;}output(out, v);out.close();
}// 从文件filename读取参赛选手信息到vector<Contestant>对象
void load(const std::string& filename, std::vector<Contestant>& v) {using std::ifstream;ifstream in(filename);if (!in.is_open()) {std::cout << "fail to open file to read\n";return;}std::string title_line;getline(in, title_line);     // 跳过标题行int first_column;Contestant t;while (in >> first_column >> t)v.push_back(t);in.close();
}
View Code

task2.cpp:

#include "Contestant.hpp"
#include "utils.hpp"
#include <iostream>
#include <vector>
#include <algorithm>void test() {using namespace std;vector<Contestant> v;load("data2.txt", v);   // 从文件加载选手信息到对象vsort(v.begin(), v.end(), compare_by_solutionInfo);  // 按解题情况排序output(cout, v);    // 输出对象v中信息到屏幕save("ans.txt", v); // 把对象v中选手信息保存到文件
}int main() {test();
}
View Code

运行截图:

 

3.实验任务3

运行代码:

Triangle.hpp:

#include <iostream>
#include <stdexcept>
#include <cmath>using namespace std;class Triangle {
public:Triangle(double s1, double s2, double s3);~Triangle() = default;double area() const;private:double a, b, c;
};Triangle::Triangle(double s1, double s2, double s3) : a{ s1 }, b{ s2 }, c{ s3 } {if (a <= 0 || b <= 0 || c <= 0)throw invalid_argument("边长出现负值");if (a + b <= c || b + c <= a || a + c <= b)throw invalid_argument("不满足任意两边之和大于第三边");
}double Triangle::area() const {double s = (a + b + c) / 2;return sqrt(s * (s - a) * (s - b) * (s - c));
}
View Code

task3.cpp:

#include "Triangle.hpp"
#include <iostream>
#include <fstream>void test() {using namespace std;cout << "从文件读入三角形三边边长,计算面积" << endl;ifstream in("data3.txt");if (!in.is_open()) {cout << "fail to open file to read\n";return;}double a, b, c;do {cout << "三角形边长: ";in >> a >> b >> c;cout << a << " " << b << " " << c << endl;try {Triangle t(a, b, c);cout << "三角形面积: " << t.area() << endl << endl;}catch (const exception& e) {cout << "error: " << e.what() << endl << endl;}if (in.peek() == EOF)break;} while (1);in.close();
}int main() {test();
}
View Code

运行截图:

 

4.实验任务4

运行代码:

Vector.hpp:

#include <iostream>
#include <stdexcept>
using namespace std;
template <typename T>
class Vector {
private:T* data;int n;
public:Vector(int n, int element = 0) :n(n) {if (n < 0) {throw length_error("Vector constructor:negative size");}else {data = new T[n];for (int i = 0; i < n; i++) {data[i] = element;}}}Vector(const Vector<T>& x) :n(x.n), data{ new T[n] } {for (int i = 0; i < n; i++) {data[i] = x.data[i];}}int get_size()const {return n;}T& at(int i) {if (i < 0 || i >= n) {throw out_of_range("Vector:index out of range");}return data[i];}friend void output(const Vector<T>& x){for (int i = 0; i < x.get_size(); i++) {if (i == x.get_size() - 1) {cout << x.data[i];}else{cout << x.data[i] << ",";}}cout << endl;}T& operator[](int i)const {if (i < 0 || i >= n) {throw out_of_range("Vector:index out of range");}return data[i];}
};
View Code

task4.cpp:

#include <iostream>
#include "Vector.hpp"void test1() {using namespace std;int n;cout << "Enter n: ";cin >> n;Vector<double> x1(n);for (auto i = 0; i < n; ++i)x1.at(i) = i * 0.7;cout << "x1: "; output(x1);Vector<int> x2(n, 42);const Vector<int> x3(x2);cout << "x2: "; output(x2);cout << "x3: "; output(x3);x2.at(0) = 77;x2.at(1) = 777;cout << "x2: "; output(x2);cout << "x3: "; output(x3);
}void test2() {using namespace std;int n, index;while (cout << "Enter n and index: ", cin >> n >> index) {try {Vector<int> v(n, n);v.at(index) = -999;cout << "v: "; output(v);}catch (const exception& e) {cout << e.what() << endl;}}
}int main() {cout << "测试1: 模板类接口测试\n";test1();cout << "\n测试2: 模板类异常处理测试\n";test2();
}
View Code

 运行截图:

 

5.实验任务5

运行代码:

contestant.hpp:

#pragma once
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
class contestant {
private:string no;string name;string major;int grades;
public:contestant() = default;~contestant() = default;string get_major() {return major;}int get_grades() {return grades;}friend ostream& operator<<(ostream& out, const contestant& c) {out << setiosflags(ios_base::left);out << setw(15) << c.no<< setw(15) << c.name<< setw(15) << c.major<< setw(15) << c.grades;return out;}friend istream& operator>>(istream& in, contestant& c) {in >> c.no >> c.name >> c.major >> c.grades;return in;}
};
View Code

utils.hpp:

#include "contestant.hpp"
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool compared( contestant& c1,  contestant& c2) {if (c1.get_major() < c2.get_major()) {return true;}if (c1.get_major() == c2.get_major()) {return c1.get_grades() > c2.get_grades();}return false;
}
void output(ostream& out, const vector<contestant>& v) {for (auto& i : v) {out << i << endl;}
}
void save(const string& filename, vector<contestant>& v) {ofstream out(filename);if (!out.is_open()) {cout << "fail to open file to write\n";return;}output(out, v);out.close();
}
void load(const string& filename, vector<contestant>& v) {ifstream in(filename);if (!in.is_open()) {cout << "fail to open file to read\n";return;}string title_line;getline(in, title_line);contestant t;while (in>>t) {v.push_back(t);}in.close();
}
View Code

task5.cpp:

#include "contestant.hpp"
#include "utils.hpp"
#include <iostream>
#include <vector>
#include <algorithm>
int main() {vector<contestant>v;load("data5.txt", v);sort(v.begin(), v.end(), compared);output(cout, v);save("ans.txt", v);return 0;
}
View Code

 运行截图:

 注意:

在VS中运行时,要将data5的编码格式由utf-8改为anis才可以在控制台上显示出内容,但这样改动,ans.txt文件上的内容出现乱码

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人员乘坐皮带识别智慧矿山一体机:矿山达到智能化最终要求需要哪些AI算法及关键因素?

在数字化转型的大潮中,非煤矿山行业正站在智能化升级的风口浪尖。随着人工智能、大数据、物联网等技术的飞速发展,矿山智能化已成为提升行业竞争力、保障作业安全、优化资源利用的关键路径。 本文将深入探讨实现矿山智能化所需的AI算法及其应用,并分析在构建智能化矿山生态系…

容器与虚拟机的区别与关系

什么是虚拟机技术? 传统的虚拟机技术(VMware)将一组硬件虚拟化,在其上安装并运行一个完整的操作系统,然后在该系统上运行所需的应用进程;虚拟机就像一台主机。 什么是容器? 容器是一个应用层面的抽象,用于将代码和依赖资源打包在一起。本文分享自天翼云开发者社区《容器…

数理统计中的分位数

目录上分位数和下分位数的定义下分位数的直观理解上分位数的直观理解常用分布中的分位数正态分布卡方分布 上分位数和下分位数的定义 设连续型随机变量 \(X\) 的分布函数为 \(F(x)\),概率密度函数为 \(f(x)\),则:对于任意正数 \(\alpha(0<\alpha<1)\),称满足条件\[F(…

SWD下载口的端口状态

1、关于SWD SWD是MCU下载程序和调试的端口,分为四线制和五线制 四线制:VCC GND SWDIO SWCKL 五线制:VCC GND SWDIO SWCLK RESET 四线制没有留出RESET引脚,没有RESET引脚,下载完程序,会自动运行。SWDIO是双向数据线,实现数据的输入和输出。SWCLK是 时钟信号线。 2、SWD电…

工作睡觉监测识别摄像机

工作睡觉监测识别摄像机是一种用于监测员工是否在工作时间内偷懒、打瞌睡或者进行其他不合规行为的智能监控设备。这种摄像机利用先进的人工智能和图像识别技术,能够实时监测员工的工作状态,发现异常行为并采取相应的措施。工作睡觉监测识别摄像机是一种用于监测员工是否在工…

FMC子卡设计方案:202-基于TI DSP TMS320C6678、Xilinx K7 FPGA XC7K325T的高速数据处理核心板

基于TI DSP TMS320C6678、Xilinx K7 FPGA XC7K325T的高速数据处理核心板一、板卡概述 该DSP+FPGA高速信号采集处理板由我公司自主研发,包含一片TI DSP TMS320C6678和一片Xilinx FPGA K7 XC72K325T-1ffg900。包含1个千兆网口,1个FMC HPC接口。可搭配使用AD FMC子卡、图像FMC子…

VMware Workstation 整理磁盘碎片失败: 指定的虚拟磁盘需要进行修复。

问题: VMware Workstation 整理磁盘碎片报错: 整理磁盘碎片失败: 指定的虚拟磁盘需要进行修复。 解决办法: (1)找到vmware的安装目录 (可以直接用everything搜索vmware-vdiskmanager查看目录),在目录框下执行cmd命令(C:\Windows\System32\cmd.exe)运行 注:如果没有在安…

必学!定位模组Air201通话功能详解!

希望这篇文章能帮助你掌握定位模组Air201的通话功能,感兴趣的朋友一起来学。 VoLTE通话功能示例 Air201模组的4G通信功能,通过VoLTE技术实现高清语音通话,支持音频编解码、硅麦输入和喇叭输出。在通话过程中,声音信号通过MIC捕捉并转换为数字音频数据,经4G网络实时传输至对…

跨境电商新利器:看板软件解锁圣诞节消费者心理

看板软件通过整合多源数据、实时监控销售数据、分析历史数据、挖掘消费者行为数据、优化供应链管理以及提高决策效率等方面的功能,为跨境电商提供了有力的支持。这些功能有助于跨境电商更准确地把握圣诞节消费者倾向,制定更精准的营销策略和产品定价策略,从而提升销售业绩和…

DB-GBP功能使用探索

目录1.DBGPT支持的功能2.配置StarRocks数据库3. ChatBI4. APP创建使用5. 元数据库配置6. API 调用探索6.1 app6.2 datasources6.3 Knowledge7. 问题总结8. 贡献的PR 1.DBGPT支持的功能2.配置StarRocks数据库支持多种数据库链接 但是只支持一个库访问查询3. ChatBI数据准确性不够…

Vue 前端学习路线

一、基础阶段(1 - 2 个月)HTML/CSS/JavaScript 基础巩固复习 HTML 标签语义、结构,熟练掌握常见标签如 div、span、input、button 等的用法,理解块级元素与行内元素的区别与应用场景。 深入学习 CSS 选择器、盒模型、浮动、定位等布局技术,能够实现复杂页面布局,如响应式…

Hyperledger Fabric 2.x 环境搭建

Hyperledger Fabric 是一个开源的企业级许可分布式账本技术(Distributed Ledger Technology,DLT)平台,专为在企业环境中使用而设计,与其他流行的分布式账本或区块链平台相比,它有一些主要的区别。 环境准备: Git 客户端 Golang 1.17.5以上版本 Docker 18.03以上版本 版本…