首页 > 编程语言 >实验六 C++

实验六 C++

时间:2024-12-21 18:19:48浏览次数:3  
标签:std major int C++ Vector 实验 include size

任务四:

Vector.hpp:

#pragma once
#ifndef VECTOR_HPP
#define VECTOR_HPP

#include <iostream>
#include <stdexcept> // 为异常类提供支持
#include <memory>    // 为 std::unique_ptr 提供支持

template <typename T>
class Vector {
private:
    std::unique_ptr<T[]> data; // 使用智能指针管理动态数组的内存
    int size; // 数组的大小

public:
    // 构造函数
    Vector(int n) : size(n) {
        if (n < 0) {
            throw std::length_error("Size cannot be negative.");
        }
        data = std::make_unique<T[]>(n); // 使用智能指针分配内存
    }

    // 重载构造函数,初始化所有项为指定值
    Vector(int n, T value) : size(n) {
        if (n < 0) {
            throw std::length_error("Size cannot be negative.");
        }
        data = std::make_unique<T[]>(n);
        for (int i = 0; i < n; ++i) {
            data[i] = value; // 初始化数组元素
        }
    }

    // 深复制构造函数
    Vector(const Vector<T>& other) : size(other.size) {
        data = std::make_unique<T[]>(size);
        for (int i = 0; i < size; ++i) {
            data[i] = other.data[i]; // 复制数据项
        }
    }

    // 获取数组的大小
    int get_size() const {
        return size;
    }

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

    // 运算符重载 []
    T& operator[](int index) {
        if (index < 0 || index >= size) {
            throw std::out_of_range("Index is out of range.");
        }
        return data[index];
    }

    // 友元函数,用于输出 Vector 中的数据项
    friend void output(const Vector<T>& vec) {
        for (int i = 0; i < vec.size; ++i) {
            std::cout << vec.data[i] << " ";
        }
        std::cout << std::endl;
    }

    // 析构函数(智能指针会自动释放内存)
};

#endif // VECTOR_HPP

  

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); // 创建并初始化所有项为 42 的数组
    const Vector<int> x3(x2); // 深复制 x2 到 x3

    cout << "x2: "; output(x2);
    cout << "x3: "; output(x3);

    x2.at(0) = 77; // 修改 x2 中的值
    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() {
    using namespace std;
    cout << "测试1: 模板类接口测试\n";
    test1();

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

    return 0;
}

  

实验结果截图:

 

任务五:

task5.cpp:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

// 学生信息结构体
struct Student {
    int id;            // 学号
    string name;      // 姓名
    string major;     // 专业
    int score;        // 分数

    // 构造函数
    Student(int _id, string _name, string _major, int _score)
        : id(_id), name(_name), major(_major), score(_score) {}
};
// 比较函数,用于按专业和分数排序
bool compare(const Student& a, const Student& b) {
    if (a.major == b.major) {
        return a.score > b.score; // 专业相同按分数降序
    }
    return a.major < b.major; // 按专业字典序升序
}

// 读取数据并处理排序
void processStudents(const string& inputFile, const string& outputFile) {
    vector<Student> students; // 存储学生信息

    // 读取文件
    ifstream inFile(inputFile);
    if (!inFile) {
        cerr << "无法打开文件: " << inputFile << endl;
        return;
    }

    int id, score;
    string name, major;

    // 读取数据
    while (inFile >> id >> name >> major >> score) {
        students.emplace_back(id, name, major, score); // 将数据存入 vector
    }
    inFile.close();

    // 排序
    sort(students.begin(), students.end(), compare);

    // 输出到屏幕和文件
    ofstream outFile(outputFile);
    if (!outFile) {
        cerr << "无法打开文件: " << outputFile << endl;
        return;
    }

    cout << "学号\t姓名\t专业\t分数" << endl; // 打印表头
    outFile << "学号\t姓名\t专业\t分数" << endl; // 写入文件表头

    for (const auto& student : students) {
        cout << student.id << "\t" << student.name << "\t"
            << student.major << "\t" << student.score << endl;
        outFile << student.id << "\t" << student.name << "\t"
            << student.major << "\t" << student.score << endl; // 写入文件
    }

    outFile.close();
}
int main() {
    string inputFile = "data5.txt";  // 输入文件名
    string outputFile = "ans5.txt";   // 输出文件名

    processStudents(inputFile, outputFile); // 处理学生信息

    return 0;
}

  

实验结果截图:

 

标签:std,major,int,C++,Vector,实验,include,size
From: https://www.cnblogs.com/gzry/p/18621022

相关文章

  • 【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】
    【华为OD-E卷-寻找关键钥匙100分(python、java、c++、js、c)】题目小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。每个箱子中都有一个字符串s,字符串由大写字母、小写字母、数字、标点符号......
  • 【华为OD-E卷-最多提取子串数目 100分(python、java、c++、js、c)】
    【华为OD-E卷-最多提取子串数目100分(python、java、c++、js、c)】题目给定[a-z],26个英文字母小写字符串组成的字符串A和B,其中A可能存在重复字母,B不会存在重复字母,现从字符串A中按规则挑选一些字母,可以组成字符串B。挑选规则如下:同一个位置的字母只能挑选一次......
  • 大型数据库应用技术:实验1 熟悉常用的Linux操作和Hadoop操作
    实验1熟悉常用的Linux操作和Hadoop操作1.实验目的Hadoop运行在Linux系统上,因此,需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作,为顺利开展后续其他实验奠定基础。2.实验平台(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);(2)Hadoop版本:3.1.3。3.......
  • 实验6
    任务一1#include<stdio.h>2#include<string.h>3#defineN34typedefstructstudent{5intid;6charname[20];7charsubject[20];8doubleperf;9doublemid;......
  • 实验6 模板类、文件I/O和异常处理
    实验任务41#ifndefVECTOR_HPP2#defineVECTOR_HPP34#include<iostream>5#include<stdexcept>67template<typenameT>8classVector{9private:10T*data;11size_tsize;1213public:14//构造函数,动态指定大小15......
  • 百度机器翻译SDK实验
    软件构造实验作业实验名称:班级:信2205-3    学号:20223753    姓名:邓睿智 实验一:百度机器翻译SDK实验一、实验要求实验一:百度机器翻译SDK实验(2024.11.15日完成)  任务一:下载配置百度翻译Java相关库及环境(占10%)。    任务二:了解百度翻译相关功能并进行总结......
  • JFinal极速开发框架实验
    实验三:JFinal极速开发框架实验一、实验要求实验三:JFinal极速开发框架实验 (2023.12.13日完成)根据参考资料,学习JFinal极速开发框架的使用并如下任务:任务一:了解Maven及其使用方法,总结其功能作用(占20%)任务二:学习JFinal框架,基于Maven建立JFinal工程,并对JFinal框架功能进行总结介......
  • 机器学习实验六:朴素贝叶斯算法实现与测试
    实验六:朴素贝叶斯算法实现与测试一、实验目的深入理解朴素贝叶斯的算法原理,能够使用Python语言实现朴素贝叶斯的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。  二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测试集(注......
  • 机器学习实验七:K 均值聚类算法实现与测试
    实验七:K均值聚类算法实现与测试一、实验目的深入理解K均值聚类算法的算法原理,进而理解无监督学习的意义,能够使用Python语言实现K均值聚类算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法......
  • 机器学习实验八:随机森林算法实现与测试
    实验八:随机森林算法实现与测试一、实验目的深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用Python语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的......