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

news/2024/12/18 19:37:05/文章来源:https://www.cnblogs.com/yyysin/p/18613001

1、实验任务一

Complex.hpp

#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();
}

 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;
}

测试结果运行:

 

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;
}

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();
}

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();
}

 

测试结果运行:

 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));
}

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();
}

 

测试结果运行:

 

4、实验任务4

 Vector.hpp

#pragma once
#include<iostream>
#include<stdexcept>
using namespace std;
template <typename T>
class Vector{private:int size;T *data;template<typename T1>friend void output(const Vector<T1> &v) ;public:Vector(int n){if(n<0)throw length_error("Size cannot be negative");data =new T[n];size=n;}Vector(int n,T value){if(n<0)throw length_error("Size cannot be negative");data =new T[n];size=n;for(int i=0;i<n;i++)data[i]=value;}Vector(const Vector<T>& other) {size = other.size;data = new T[size];for (int i = 0; i < size; i++) {data[i] = other.data[i];}}~Vector() {delete[] data;}int get_size()const{return size;     };T& at(int i) const {if(i<0||i>=size)throw out_of_range(" index out of range");return data[i];};T& operator[](int i){if(i>size)throw out_of_range(" index out of range");return data[i];}};template<typename T1>
void output(const Vector<T1> &v) 
{for(int i=0;i<v.size;i++)cout<<v.at(i)<<","<<" ";cout<<endl;
}

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();
}

测试结果运行:

5、实验任务5

Count.hpp

#pragma once
#include<iostream>
#include<iomanip>
#include<string>
#include<vector>
#include<fstream> using namespace std;class Count{private:string No;string name;string major;int score;public:Count()=default;~Count()=default;int get_score()const;string get_major()const;friend ostream& operator<<(ostream &out,const Count &c);friend istream& operator>>(istream &in,Count &c);};int Count::get_score()const{return score;}string Count::get_major() const{return major;}ostream& operator<<(ostream &out,const Count &c){out << setiosflags(ios_base::left);out<<setw(15)<<c.No<<setw(15)<<c.name<<setw(15)<<c.major<<setw(5)<<c.score;return out;}istream& operator>>(istream &in, Count &c){in>>c.No>>c.name>>c.major>>c.score;return in;}bool compare(const Count &c1,const Count &c2){if(c1.get_major() < c2.get_major())return true;if(c1.get_major() == c2.get_major())return c1.get_score()>c2.get_score();return false;}void output(ostream &out,const vector<Count> &v){for(auto &i: v)out << i << endl;}void load(const string &filename,vector<Count> &v){ifstream in(filename);if(!in.is_open()){cout << "fail to open file to read\n";return ;}string title_line;getline(in,title_line);Count c;while(in>>c)v.push_back(c);in.close();
}
void save(const string &filename,vector<Count> &v){ofstream out(filename);if(!out.is_open()){cout << "fail to open fele to write\n";return ;}output(out,v);out.close(); 
}

task5.cpp

#include "Count.hpp"
#include<iostream>
#include<vector>
#include<algorithm>int main(){vector<Count> v;load("data5.txt",v);sort(v.begin(),v.end(),compare);output(cout,v);save("ans5.txt",v);
}

测试结果运行:

 

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

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

相关文章

免费设计Logo的新神器Slea.ai

使用Slea.ai,你可以在几分钟内设计出专业、高质量的Logo,支持多种场景应用,免费下载,实现自定义设计。品牌打造从未如此轻松!作为一名注重品牌形象的创作者或企业主,你是否苦于设计一款专业又独特的Logo?今天我要向大家推荐一个超级实用的网站——Slea.ai,它是一款免费的…

MOS管的寄生电容

我们经常看到,在电源电路中,功率MOS管的G极经常会串联一个小电阻,几欧姆到几十欧姆不等,那么这个电阻用什么作用呢? 这个电阻的作用有2个作用:限制G极电流,抑制振荡。 限制G极电流MOS管是由电压驱动的,是以G级电流很小,但是因为寄生电容的存在,在MOS管打开或关闭的时…

配置CentOS 7阿里yum源

备份yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bakvi /etc/yum.repos.d/CentOS-Base.repo# CentOS-Base.repo # # The mirror system uses the connecting IP address of the client and the # update status of each mirror to …

源码信息收集

引子:上一篇主要介绍了与Web架构相关的信息收集,而在Web架构中有一至关重要的一环,那就是源码。Web应用中美观的ui、特色的功能全靠源码来实现,但同样的,几乎绝大多数与Web相关的漏洞都也都与其源码有关。而本篇则介绍几种常见的源码信息收集方式。附:完整笔记目录~ ps:…

标定和定位的关系

手眼标定手眼标定可以利用某真值位置和传感器观测位置对比得到外参。 关联本质上是外参不同引起的看同一外接参照物,认为自身运动轨迹的不同。位置如上观测同一建筑(三角形,上顶点是北方),真实轨迹(左图):是向北直行是在向正前方走世界坐标系->偏置传感器轨迹(中间图…

12.13

实验2 熟悉常用的HDFS操作1.实验目的 (1)理解HDFS在Hadoop体系结构中的角色; (2)熟练使用HDFS操作常用的Shell命令; (3)熟悉HDFS操作常用的Java API。 2. 实验平台 (1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04); (2)Hadoop版本:3.1.3; (3)JDK版本:1.…

12.10

实验八:随机森林算法实现与测试一、实验目的 深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容 (1)从 scikit-learn 库中加载 iris 数据集,使用留出法…

Tengine:Nginx二次开发-高性能进化

前言:在当今的互联网时代,Web 服务器的性能和稳定性对于网站的成功至关重要。Nginx 以其高性能和可扩展性而闻名,但有时候,我们需要更多的特性来满足特定的业务需求。Tengine,作为一个由淘宝网发起的 Nginx 二次开发版本,不仅继承了 Nginx 的所有特性,还添加了许多高级功…

【亲测能用】专业科学图形和数据分析软件:OriginPro 2024(附绿色补丁+安装教程)

软件介绍 OriginPro 2024是一款先进的数据分析和图形绘制工具,它在科研、工程、商业和生物医学等多个领域中被广泛采用。这款软件支持导入和导出多种数据格式,例如Excel、CSV和文本文件,使得数据处理变得简单快捷。它不仅提供数据清洗、转换和统计分析功能,以提升数据的准确…

Spring MVC与Swagger常用注解

Swagger工作原理 Swagger的核心功能之一就是通过注解来描述接口和模型,从而生成文档。 Swagger基于springfox-swagger2和springfox-swagger-ui依赖库,进行自动扫描Spring框架,并生成相应的API文档‌。 Spring MVC是Spring框架主要重要的部分,专门用于构建web应用,遵循MVC设…