首页 > 其他分享 >实验6 模板类、文件I/O和异常处理

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

时间:2024-12-17 16:09:28浏览次数:3  
标签:文件 const index int Vector 实验 template 模板 size

实验任务4

代码

Vector.hpp

 1 #pragma once
 2 #include <iostream>
 3 #include <stdexcept>
 4 
 5 template <typename T>
 6 class Vector {
 7 public:
 8     // 构造函数
 9     Vector(int size);
10     Vector(int size, T value);
11     Vector(const Vector<T>& other); // 拷贝构造函数
12     ~Vector();                      // 析构函数
13 
14     // 成员函数
15     int get_size() const;           // 返回数组大小
16     T& at(int index);               // 访问元素,带边界检查
17     const T& at(int index) const;   // 访问元素(常量版本)
18 
19     // 重载运算符[]
20     T& operator[](int index);
21     const T& operator[](int index) const;
22 
23     // 友元函数
24     template <typename U>
25     friend void output(const Vector<U>& v);
26 
27 private:
28     int size;   // 数组大小
29     T* data;    // 动态数组指针
30 };
31 
32 // 构造函数:创建指定大小的数组
33 template <typename T>
34 Vector<T>::Vector(int size) : size(size) {
35     if (size < 0) throw std::length_error("Vector constructor: negative size");
36     data = new T[size]{}; // 初始化数组
37 }
38 
39 // 构造函数:创建指定大小并初始化为value的数组
40 template <typename T>
41 Vector<T>::Vector(int size, T value) : size(size) {
42     if (size < 0) throw std::length_error("Vector constructor: negative size");
43     data = new T[size];
44     for (int i = 0; i < size; ++i) data[i] = value;
45 }
46 
47 // 拷贝构造函数:实现深拷贝
48 template <typename T>
49 Vector<T>::Vector(const Vector<T>& other) : size(other.size) {
50     data = new T[size];
51     for (int i = 0; i < size; ++i) data[i] = other.data[i];
52 }
53 
54 // 析构函数:释放动态分配的内存
55 template <typename T>
56 Vector<T>::~Vector() {
57     delete[] data;
58 }
59 
60 // 获取数组大小
61 template <typename T>
62 int Vector<T>::get_size() const {
63     return size;
64 }
65 
66 // 访问元素,带边界检查
67 template <typename T>
68 T& Vector<T>::at(int index) {
69     if (index < 0 || index >= size) throw std::out_of_range("Vector: index out of range");
70     return data[index];
71 }
72 
73 // 访问元素(常量版本)
74 template <typename T>
75 const T& Vector<T>::at(int index) const {
76     if (index < 0 || index >= size) throw std::out_of_range("Vector: index out of range");
77     return data[index];
78 }
79 
80 // 重载运算符[]
81 template <typename T>
82 T& Vector<T>::operator[](int index) {
83     return at(index);
84 }
85 
86 template <typename T>
87 const T& Vector<T>::operator[](int index) const {
88     return at(index);
89 }
90 
91 // 友元函数:输出Vector对象
92 template <typename U>
93 void output(const Vector<U>& v) {
94     for (int i = 0; i < v.size; ++i) {
95         std::cout << v.data[i] << " ";
96     }
97     std::cout << std::endl;
98 }

task4.cpp

 1 #include <iostream>
 2 #include "Vector.hpp"
 3 
 4 using namespace std; 
 5  
 6 void test1() {
 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

代码

task5.cpp

  1 #include <iostream>
  2 #include <fstream>
  3 #include <string>
  4 #include <vector>
  5 #include <algorithm>
  6 #include <iomanip>
  7 
  8 using namespace std;
  9 
 10 // 学生成绩类
 11 class Student {
 12 public:
 13     int id;          // 学号
 14     string name;     // 姓名
 15     string major;    // 专业
 16     double score;    // 分数
 17 
 18     // 重载输入运算符,读取学号、姓名、专业、分数
 19     friend istream& operator>>(istream& in, Student& s);
 20     // 重载输出运算符,格式化输出学号、姓名、专业、分数
 21     friend ostream& operator<<(ostream& out, const Student& s);
 22 };
 23 
 24 // 输入运算符重载
 25 istream& operator>>(istream& in, Student& s) {
 26     in >> s.id >> s.name >> s.major >> s.score;
 27     return in;
 28 }
 29 
 30 // 输出运算符重载
 31 ostream& operator<<(ostream& out, const Student& s) {
 32     out << left << setw(10) << s.id
 33         << setw(10) << s.name
 34         << setw(10) << s.major
 35         << fixed << setprecision(2) << s.score;
 36     return out;
 37 }
 38 
 39 int main() {
 40     vector<Student> students;
 41 
 42     // 输入和输出文件路径
 43     const string input_file = "C:\\Users\\陈昕\\Desktop\\实验6文档部分代码和数据文件\\task5\\data5.txt";
 44     const string output_file = "C:\\Users\\陈昕\\Desktop\\实验6文档部分代码和数据文件\\task5\\ans5.txt";
 45 
 46     ifstream infile(input_file);
 47     ofstream outfile(output_file);
 48 
 49     // 检查输入文件是否打开成功
 50     if (!infile.is_open()) {
 51         cerr << "Error: Unable to open input file at " << input_file << endl;
 52         return 1;
 53     }
 54 
 55     cout << "Reading data from " << input_file << "..." << endl;
 56 
 57     // 跳过文件的第一行(表头)
 58     string header;
 59     getline(infile, header);  // 读取并丢弃表头
 60 
 61     // 读取数据到 vector
 62     Student temp;
 63     while (infile >> temp) {
 64         students.push_back(temp);
 65     }
 66     infile.close();
 67 
 68     // 检查是否读取到数据
 69     if (students.empty()) {
 70         cerr << "Error: No data found in file " << input_file << endl;
 71         return 1;
 72     }
 73 
 74     // 排序规则:按专业字典序排序,同专业内按分数降序排序
 75     sort(students.begin(), students.end(), [](const Student& a, const Student& b) {
 76         if (a.major == b.major) return a.score > b.score; // 分数降序
 77         return a.major < b.major; // 专业字典序
 78     });
 79 
 80     // 输出标题行
 81     cout << left << setw(10) << "ID" 
 82          << setw(10) << "Name" 
 83          << setw(10) << "Major" 
 84          << "Score" << endl;
 85 
 86     // 输出到屏幕
 87     for (const auto& s : students) {
 88         cout << s << endl;
 89     }
 90 
 91     // 输出到文件
 92     if (outfile.is_open()) {
 93         outfile << left << setw(10) << "ID" 
 94                 << setw(10) << "Name" 
 95                 << setw(10) << "Major" 
 96                 << "Score" << endl;
 97 
 98         for (const auto& s : students) {
 99             outfile << s << endl;
100         }
101         outfile.close();
102         cout << "Sorted results have been written to " << output_file << endl;
103     } else {
104         cerr << "Error: Unable to open output file at " << output_file << endl;
105         return 1;
106     }
107 
108     return 0;
109 }

运行结果

 

标签:文件,const,index,int,Vector,实验,template,模板,size
From: https://www.cnblogs.com/chenziming114514/p/18612545

相关文章

  • webbroker从本地HTML文件导入
    a01.rarprocedureTWebModule1.WebModule1DefaultHandlerAction(Sender:TObject;Request:TWebRequest;Response:TWebResponse;varHandled:Boolean);varFileContent:TStringList;beginFileContent:=TStringList.Create;//假设你的HTML文件位于Web......
  • 好,我们以你的 `euclidolap.proto` 文件为例,调整代码结构,让服务逻辑更清晰,同时将 `eucl
    好,我们以你的euclidolap.proto文件为例,调整代码结构,让服务逻辑更清晰,同时将euclidolap模块分离到独立文件中。假设文件结构调整我们将euclidolap.proto生成的代码放到src/euclidolap模块中,同时将服务端逻辑分开组织。最终文件结构如下:project/├──build.rs......
  • 分布式文件系统HDFS
    HDFS简介HDFS(HadoopDistributedFileSystem)是一个分布式文件系统,是Hadoop生态系统的核心组件之一。它被设计用来在廉价的硬件设备上存储大规模的数据,并且能够提供高容错性和高吞吐量的数据访问。例如,在一个大型的互联网公司,每天会产生海量的用户行为数据,如浏览记录、购买记......
  • 实验6 模板类、文件I/O和异常处理
    1.实验任务4Vector.hpp源代码:点击查看代码#pragmaonce#include<iostream>#include<stdexcept>#include<algorithm>//forstd::copytemplate<typenameT>classVector{private:T*data;size_tsize;public://构造函数Vecto......
  • mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
    mfc140.dll是MicrosoftFoundationClasses(MFC)库中的一个动态链接库(DLL)文件,它是微软基础类库的一部分,为Windows应用程序的开发提供了丰富的类库和接口。MFC库旨在简化Windows应用程序的开发过程,提供了一系列预定义的C++类,这些类封装了WindowsAPI函数,使得开发者可以更方便地创......
  • Keil uVision5生成bin文件
    使用KeiluVision5将程序代码生成bin格式文件的方法1.点击魔术棒(OptionsforTarget...)2.选择User界面,勾选上AfterBuild、Rebuild的Run#1在UserCommand中填入下面的指令。fromelf--bin-o"$L@L.bin""#L"......
  • msvcp100.dll文件缺失的修复方法分享,全面分析msvcp100.dll的修复方法
    msvcp100.dll是一个动态链接库(DLL)文件,属于MicrosoftVisualC++2010RedistributablePackage的一部分。这个文件对于运行使用MicrosoftVisualC++2010编译器编译的应用程序至关重要。msvcp100.dll包含了C++标准库的实现,提供了应用程序运行时所需的核心功能,如输入/......
  • 实验6 模板类、文件I/O和异常处理
    task4源码:1#include<iostream>2#include<stdexcept>3#include<algorithm>45template<typenameT>6classVector{7private:8T*data;9size_tsize;//无符号整数类型1011public:12Vector(in......
  • 实验6
    task.4代码:#include<stdio.h>#defineN10typedefstruct{charisbn[20];//isbn号charname[80];//书名charauthor[80];//作者doublesales_price;//售价intsales_count;//销售册数}Book;v......
  • MongoDB|TOMCAT定时切割日志文件的脚本
    MongoDB用过一段时间后,日志较大,需要定时进行日志切割。一、切割bash:splitlogmongo.sh#!/bin/bashlog_dir="/home/mongodb/logs"file_name="/home/mongodb/logs/mongodb.log"if[!-d$log_dir];thenmkdir-p$log_dirfiif[!-f$file_name];thentouch$file_name......