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

news/2024/12/22 0:23:27/文章来源:https://www.cnblogs.com/andongni51/p/18612946

一、实验目的

 练习编写模板函数,模板类,从多态角度理解模板函数和模板类(类型作为参数)

体验标准I/O流类,文件I/O流类,字符串I/O流类的用法,能正确使用

针对问题场景,使用流类库对I/O数据进行格式化和读写操作

体验异常处理的基础用法,能解释异常处理的机制和流程

训练综合应用类的封装,继承,多态特性及现代C++标准库编写正确,高效,安全代码

二、实验准备

 函数模板和函数类

流类库与输入输出

异常处理

 

三、实验内容

 

4. 实验任务4

代码:

头文件

 1 #pragma once
 2 #include<iostream>
 3 #include<stdexcept>
 4 using namespace std;
 5 template <typename T>
 6 class Vector {
 7 public:
 8     
 9     //构造函数  
10     //支持在创建抽象数据类型T类型数组对象时,动态指定其大小
11     Vector(int size) :size{ size } {
12         if (size < 0)
13             throw length_error("negative size");//异常抛出
14 
15 
16         else
17         {
18             ptr = new T[size];//申请内存
19 
20         }
21             
22         }
23     //构造函数
24     //支持在创建T类型数组对象时,指定其大小,并将数组对象中每个数据项初始化到T类型的值value
25     
26 
27     Vector(int s, T value) :size(s) {
28         if (s < 0)
29             throw length_error("negative size");//异常抛出
30         else
31         {
32             ptr = new T[size];
33             for (int i = 0; i < s; i++)
34                 *(ptr + i) = value;
35         }
36     }
37 
38     //支持用已经存在的 Vector<T> 数组对象x,来构造新的对象y(要求实现深复制)
39     Vector(const Vector<T>& x) :size(x.size), ptr(new T[size]) {
40         for (int i = 0; i < size; i++) {
41             ptr[i] = x.ptr[i];
42         }
43     }
44 
45     //析构函数
46     ~Vector() { delete[]ptr; }
47 
48     //接口
49 
50 
51     //1
52     int get_size()const {
53         return size;
54     }
55 
56     //2
57     T& at(int val) {
58         if (val >= size)throw out_of_range("index out of range");
59         else return ptr[val];
60 
61     }
62 
63     //3重载[]
64     T& operator[](int val) {
65         if (val < 0 || val >= size)throw out_of_range("index out of range");
66         else return ptr[val];
67     }
68 
69 //友元函数
70 
71     //output()
72     friend void output(const Vector<T>& x) {
73         for (int i = 0; i < x.get_size(); i++) {
74             cout << x.ptr[i] << ", ";//遍历输出
75         }
76         cout << endl;
77 
78     }
79 
80 
81     
82 private:
83     int size;
84     T* ptr;
85 };

测试代码:

 1 #include <iostream>
 2 #include "Vector.hpp"
 3 using namespace std;
 4 
 5 void test1() {
 6    
 7     int n;
 8     cout << "Enter n: ";
 9     cin >> n;
10 
11     Vector<double> x1(n);
12     for (auto i = 0; i < n; ++i)
13         x1.at(i) = i * 0.7;
14 
15     cout << "x1: "; output(x1);
16 
17     Vector<int> x2(n, 42);
18     const Vector<int> x3(x2);
19 
20     cout << "x2: "; output(x2);
21     cout << "x3: "; output(x3);
22 
23     x2.at(0) = 77;
24     x2.at(1) = 777;
25     cout << "x2: "; output(x2);
26     cout << "x3: "; output(x3);
27 }
28 
29 void test2() {
30     using namespace std;
31 
32     int n, index;
33     while (cout << "Enter n and index: ", cin >> n >> index) {
34         try {
35             Vector<int> v(n, n);
36             v.at(index) = -999;
37             cout << "v: "; output(v);
38         }
39         catch (const exception& e) {
40             cout << e.what() << endl;
41         }
42     }
43 }
44 
45 int main() {
46     cout << "测试1: 模板类接口测试\n";
47     test1();
48 
49     cout << "\n测试2: 模板类异常处理测试\n";
50     test2();
51 }

 

 

运行截图:

 

 

 

 

 

 

5. 实验任务5

代码:

 

 1 #include <iostream>
 2 #include <fstream>
 3 #include <sstream>
 4 #include <vector>
 5 #include <algorithm>
 6 #include <string>
 7 
 8 // 自定义学生结构体
 9 struct Student {
10     int id;              // 学号
11     std::string name;    // 姓名
12     std::string major;   // 专业
13     int score;           // 成绩
14 };
15 
16 // 重载小于运算符,以便根据专业和成绩排序
17 bool operator<(const Student& a, const Student& b) {
18     return (a.major == b.major) ? (a.score > b.score) : (a.major < b.major);
19 }
20 
21 // 从文件读取学生信息
22 std::vector<Student> readStudentsFromFile(const std::string& filename) {
23     std::vector<Student> students;
24     std::ifstream file(filename);
25     std::string line;
26 
27     // 跳过第一行
28     std::getline(file, line);
29     
30     // 逐行读取学生信息
31     while (std::getline(file, line)) {
32         std::istringstream iss(line);
33         Student student;
34         iss >> student.id >> student.name >> student.major >> student.score;
35         students.push_back(student);
36     }
37     
38     return students;
39 }
40 
41 // 将学生信息写入文件
42 void writeStudentsToFile(const std::vector<Student>& students, const std::string& filename) {
43     std::ofstream file(filename);
44     for (const auto& student : students) {
45         file << student.id << "\t" << student.name << "\t" << student.major << "\t" << student.score << '\n';
46     }
47 }
48 
49 // 主函数
50 int main() {
51     // 读取学生信息
52     auto students = readStudentsFromFile("data5.txt");
53     
54     // 按照自定义规则排序
55     std::sort(students.begin(), students.end());
56     
57     // 输出排序后的学生信息
58     std::cout << "学号\t姓名\t专业\t分数" << std::endl;
59     for (const auto& student : students) {
60         std::cout << student.id << "\t" << student.name << "\t" << student.major << "\t" << student.score << std::endl;
61     }
62     
63     // 写入结果到文件
64     writeStudentsToFile(students, "ans5.txt");
65     return 0;
66 }

 

 

运行截图:

 

 

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

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

相关文章

【IM专题】服务治理,是在谈什么?

先说交通治理。 没有交通治理,会是怎样的场景?见下图。交通没有治理,车流效率会大大降低,尤其是在十字路口这种有资源竞争的路段,交通很容易陷入瘫痪。 如果引入交通治理,会是怎样的场景?见下图。交通治理,通过使用信号灯或是建造立交桥,在即使有资源冲突的路口段,通…

[题解]AtCoder Beginner Contest 385(ABC385) A~F

A - Equally 显然分组情况一定是\(1+1+1\)或\(1+2\),直接判定即可。点击查看代码 #include<bits/stdc++.h> using namespace std; int a,b,c; signed main(){cin>>a>>b>>c;if((a+b==c)||(a+c==b)||(b+c==a)||(a==b&&b==c)) cout<<"…

【AI+模型】RAG 架构图解:从基础到高级的7种模式

RAG 技术通过在 AI 生成过程中引入外部知识检索,从基础的文档查询发展到多模态、Multi-Agent 体协同的智能架构,让 AI 回答更准确、更全面。 核心组件 嵌入模型: 将文本转换为向量表示 生成模型: 负责最终的内容生成 重排序模型: 优化检索结果的相关性 向量数据库:…

浅聊web前端性能测试

最近正好在做web前端的性能测试,这次就来聊聊关于这个的测试思路~最近正好在做web前端的性能测试,这次就来聊聊关于这个的测试思路~ 首先从用户的思维去思考,关于web前端性能,用户最看重的是什么...... 其实就是下面三个点:1. 加载性能(即页面加载时间+资源加载时间)2. …

使用magic-api实现增删改查分页

创建项目结构 pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apach…

【安全评审】“2024网络安全100强-行业应用”评分全流程细则

一 指标理解1.1 “行业应用”的核心优势是什么?1.2 评估维度有哪些?二、评审专家筛选2.1 对专家所在单位有什么要求?2.2 对专家所在行业有什么要求?2.3 对专家个人能力有什么要求?2.4 对专家组有什么要求?2.5 对专家个人价值观有什么要求?三、评分规则制定3.1 “典型案例…

《计算机组成及汇编语言原理》阅读笔记:p9-p27

《计算机组成及汇编语言原理》学习第 2 天,p9-p27 总结,总计 19 页。 一、技术总结 1.quantum physics(量子物理学) (1)quantum(量子) quantum的本意是:c. the smallest amount of sth(量子)。 In physics, a quantum is the minimum amount of any physical entity (physi…

第4章 C#的高级特性

第4章 C#的高级特性 4.1 委托 4.1.2 多播委托 对值为 null 的委托变量进行 + ​或 += ​操作,等价于为变量指定一个新值: SomeDelegate d = null; d += SomeMethod1; // 等价于 d = SomeMethod1委托是 不可变 的,因此调用 += ​和 -= ​的实质是 创建一个新的委托实例 ,…

使用frida分析白盒aes,DFA攻击

这次分析的app是:五菱汽车(8.2.1) 登录,抓包发现请求体只有sd字段,看见加密的时候,可以先使用算法助手hook java层所有加解密方法发现我们所需要的sd加密字段在java层hook不到,那加密算法应该是写在了so层,因为这个app是bb加固企业,得有脱壳机才能脱。 jadx加载dex,直接…

2024 golang安装使用详细教程以及常见问题处理(附激活至2099年)

GoLand 简介 GoLand 是一款非常强大的 Go 语言集成开发环境,由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 为了方便,也可以去链接取 点击获取安装包开始安装下载完成…

Infinite Pixels(无限像素)第五次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 小组成员分工完成选题的软件设计组长 祝方略-2022329301131组员1 娄涵格-2022329301112组员2 颜宇航-2022329301125组员3 常佳鑫-2022329301071一、团队介绍团队名称:Infinite Pixels(无限像素…

CMake构建学习笔记19-OpenSSL库的构建

详细介绍了在Windows和Linux环境下构建OpenSSL库的方法,并且如何通过CMake的方式被主程序调用。1. 概述 OpenSSL是一个开源的加密工具包和库,主要实现了安全套接字层(SSL)和传输层安全(TLS)协议,以及各种加密算法、数字签名、消息摘要、加密证书等功能。这个库可以说是W…