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

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

时间:2024-12-17 14:56:53浏览次数:4  
标签:std 文件 const index Vector 实验 return 模板 size

1.实验任务4
Vector.hpp源代码:

点击查看代码
#pragma once

#include <iostream>
#include <stdexcept>
#include <algorithm> // for std::copy

template <typename T>
class Vector {
private:
    T* data;
    size_t size;

public:
    // 构造函数
    Vector(size_t n) : size(n), data(new T[n]) {}

    // 初始化构造函数
    Vector(size_t n, const T& value) : size(n), data(new T[n]) {
        std::fill(data, data + n, value);
    }

    // 拷贝构造函数
    Vector(const Vector& other) : size(other.size), data(new T[other.size]) {
        std::copy(other.data, other.data + other.size, data);
    }

    // 析构函数
    ~Vector() {
        delete[] data;
    }

    // 禁止拷贝赋值
    Vector& operator=(const Vector&) = delete;

    // 获取大小
    size_t get_size() const {
        return size;
    }

    // 通过索引访问元素
    T& at(size_t index) {
        if (index >= size) {
            throw std::out_of_range("Index out of range");
        }
        return data[index];
    }

    // 通过索引访问元素(const 版本)
    const T& at(size_t index) const {
        if (index >= size) {
            throw std::out_of_range("Index out of range");
        }
        return data[index];
    }

    // 重载 []
    T& operator[](size_t index) {
        return at(index);
    }

    // 重载 [](const 版本)
    const T& operator[](size_t index) const {
        return at(index);
    }
};

// 友元函数,用于输出 Vector 中的数据
template <typename T>
void output(const Vector<T>& v) {
    for (size_t i = 0; i < v.get_size(); ++i) {
        std::cout << v[i] << " ";
    }
    std::cout << std::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() {
    std::cout << "测试1: 模板类接口测试\n";
    test1();

    std::cout << "\n测试2: 模板类异常处理测试\n";
    test2();
}

运行测试截图:

2.实验任务5

task5.cpp源码:

点击查看代码
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>

using std::string;
using std::ostream;
using std::istream;
using std::setw;
using std::setprecision;
using std::setiosflags;
using std::ios_base;

class Contestant {
public:
    Contestant() = default;
    ~Contestant() = default;
    int get_num() const { return num; }
    string get_major() const { return major; }
    friend ostream& operator<<(ostream& out, const Contestant& c);
    friend istream& operator>>(istream& in, Contestant& c);
private:
    string no; // 学号
    string name; // 姓名
    string major; // 专业
    int num; // 分数
};

// 友元函数实现
// 重载流插入运算符<<
ostream& operator<<(ostream& out, const Contestant& c) {
    out << setiosflags(ios_base::left);
    out << setw(10) << c.no
        << setw(10) << c.name
        << setw(10) << c.major
        << setw(5) << c.num;
    return out;
}

// 重载流提取运算符>>
istream& operator>>(istream& in, Contestant& c) {
    in >> c.no >> c.name >> c.major >> c.num;
    return in;
}

bool compare(const Contestant& c1, const Contestant& c2) {
    if (c1.get_major() > c2.get_major()) {
        return false;
    }
    if (c1.get_major() == c2.get_major())
        return c1.get_num() >c2.get_num();

    return true;
}

void output(std::ostream& out, const std::vector<Contestant>& v) {
    for (const auto& i : v)
        out << i << std::endl;
}

void save(const std::string& filename, const std::vector<Contestant>& v) {
    std::ofstream out(filename);
    if (!out.is_open()) {
        std::cout << "fail to open file to write\n";
        return;
    }
    output(out, v);
    out.close();
}

void load(const std::string& filename, std::vector<Contestant>& v) {
    std::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); // 跳过标题行
    Contestant t;
    while (in >> t)
        v.push_back(t);
    in.close();
}

void test() {
    std::vector<Contestant> v;
    load("data5.txt", v); // 从文件加载选手信息到对象v
    std::sort(v.begin(), v.end(), compare); 
    output(std::cout, v); // 输出对象v中信息到屏幕
    save("ans5.txt", v); // 把对象v中选手信息保存到文件
}

int main() {
    test();
    return 0;
}

运行结果截图:

标签:std,文件,const,index,Vector,实验,return,模板,size
From: https://www.cnblogs.com/pic-riy/p/18610695

相关文章

  • 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......
  • python往windows系统的txt文件读取内容和写入内容
    继上一节windows系统打开命令行窗口,这一节开始讲述windows系统下读取txt文件内容和写入txt文件内容一、读取文件里面的内容:1、在python安装路径下创建一个文件pyfileio.txt文件,如下图所示,记录好pyfileio.txt文件的绝对路径C:\Users\Administrator\AppData\Local\Program......
  • 在CodeBolcks+Windows API下的C++面向对象的编程教程——给你的项目中添加头文件和菜
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:学习编程......
  • 提升生产力的秘密武器:VS Code 的多文件编辑与调试增强
    在软件开发的世界里,时间就是金钱。每一行代码的编写、每一次调试的尝试,都可能影响到项目的进度和质量。为了帮助开发者更高效地完成工作,VisualStudioCode(VSCode)在其11月发布的版本(v0.23)中,推出了一系列令人兴奋的生产力增强功能。这些新特性不仅提升了多文件编辑的效率,还......
  • Maven简单使用说明(在IDEA中创建一个基于POI的处理Excel文件的Maven项目)
    目录Maven简介(AI生成的内容)一、环境变量设置二、设置Maven的本地jar仓库位置三、设置maven配置文件settings.xml3.1配置本地仓库3.2配置镜像仓库URL3.3配置JDK版本四、在IDEA中配置maven并创建maven项目4.1设置IDEA的全局配置4.2在IDEA中创建maven项目4.3创建一个使用POI处......