玩转学生信息管理系统——【c++】

news2024/12/24 20:11:02

设计一个管理系统实现对学生的基本信息(至少包括姓名、学号、性别、出生日期、宿舍号年龄(通过计算得到)的管理;),具有数据的录入、显示、保存、查询(按学号查查询或姓名查询)、修改和删除等功能。

一.问题描述

c++设计一个管理系统实现对学生基本信息(至少包括姓名,学号,性别,出生日期,宿舍号, 龄(通过计算得到) 的管理; 具有数据的录入、显示、保存、查询(按学号或姓名查询)、 修改和删除等功能。

二.基本要求

数据的录入:允许用户输入学生信息,包括姓名、学号、性别、出生日期、宿舍号等信息。

数据的显示:可以通过界面将学生信息以表格形式显示出来。

数据的保存:在录入或修改学生信息后,需要将信息保存到文件中,以便下次打开程序时可以继续使用。

查询功能:允许用户通过学号或姓名查询学生信息,并以表格形式显示查询结果。

修改功能:允许用户修改已有的学生信息,并将修改后的信息保存到文件中。

删除功能:允许用户删除已有的学生信息,并将删除后的信息保存到文件中。

需要注意的是,为了实现上述功能,本系统需要进行一些计算和处理。例如,需要根据出生日期计算学生的年龄,以及在录入或修改学生信息时要判断数据格式是否正确、数据是否合法等。

三.需求分析

在进行需求分析时,我们需要详细描述系统所需实现的功能和使用到的技术,确定系统的输入和输出,以及考虑可能出现的特殊情况和异常处理等。

本系统需要实现以下功能:

(1)数据的录入

用户可以通过界面输入学生信息,包括姓名、学号、性别、出生日期、宿舍号等信息,并进行合法性判断。若数据格式不正确或数据有误,则程序需要给出相应提示信息并要求用户重新输入。

(2)数据的显示

系统可以将已有的学生信息以表格形式显示出来,包括姓名、学号、性别、出生日期、宿舍号以及计算得到的年龄等信息。

(3)数据的保存

在录入或修改学生信息后,程序需要将信息保存到文件中。为了保证程序正确运行,保存的文件格式需要严格满足要求。

(4)查询功能

用户可以通过学号或姓名查询学生信息,并以表格形式显示查询结果。同时,程序还需要对查询结果进行合法性判断,如信息不存在时给出相应提示信息。

(5)修改功能

允许用户修改已有的学生信息,并将修改后的信息保存到文件中。

(6)删除功能

允许用户删除已有的学生信息,并将删除后的信息保存到文件中。

四.概要设计

在进行概要设计时,我们需要确定系统的组成结构和功能模块,设计必要的数据结构和算法,并规划程序的控制流程和操作流程等。

本系统可以分为以下几个模块:

数据输入模块:负责接收用户输入的学生信息,并进行验证和合法性判断。

数据处理模块:负责对输入的学生信息进行计算、处理和保存,包括年龄的计算、信息的录入、修改和删除等。

数据输出模块:负责将处理后的学生信息以表格形式输出,包括查询结果的显示和保存的文件格式处理。

在程序的框架设计中,可以采用面向对象的思想设计一个学生类,其中包括姓名、学号、性别、出生日期、宿舍号等属性及相应的操作函数。同时需要建立一个学生信息管理类,用于对学生信息进行管理、存储、读取和操作等。

五.详细设计

在进行详细设计时,我们需要进一步设计程序的模块间接口、数据结构和算法等,并进行模块的编码和单元测试。

(1)数据输入模块

输入模块需要定义一个函数,用于接收用户输入的学生信息,参数为学生信息管理类的对象。在函数内部,需要按照一定的格式提示用户输入学生信息,并进行数据格式验证和合法性判断等。如果输入数据有误,则需要返回相应的错误信息。如果输入数据正确,则需要将学生信息添加到学生信息管理类的实例中。

示例函数框架:

void InputStudentInfo(StudentManagement& management){

    //提示用户输入学生信息

    //接收用户输入学生信息

    //进行数据格式验证和合法性判断

    //如果输入数据有误,返回错误信息

    //将学生信息添加到学生信息管理类实例中

}

(2)数据处理模块

数据处理模块需要定义一个学生信息管理类,包括添加学生、修改学生、删除学生和查询学生等操作方法,同时还需要对学生的年龄进行计算和处理。

示例类框架:

class StudentManagement {

public:

    void AddStudent(Student student); //添加学生

    void ModifyStudent(Student student); //修改学生信息

    void DeleteStudent(Student student); //删除学生

    void QueryStudentByNum(std::string num); //按学号查询学生信息

    void QueryStudentByName(std::string name); //按姓名查询学生信息

    void ShowAllStudentInfo(); //显示所有学生信息

    void SaveToFile(std::string filename); //将学生信息保存到文件中

    void ReadFromFile(std::string filename); //从文件中读取学生信息

private:

    std::vector<Student> students; //存储学生信息的容器

};

class Student {

public:

    std::string name; //学生姓名

    std::string num; //学生学号

    std::string gender; //学生性别

    std::string birth; //学生出生日期(格式为yyyy-mm-dd)

    std::string room; //学生宿舍号

    int age; //学生年龄

};

//计算学生年龄的函数

int CalculateAge(std::string birth) {

    //计算学生年龄并返回

}

(3)数据输出模块

数据输出模块需要定义一个函数,用于将学生信息以表格形式输出,包括查询结果的显示和保存的文件格式处理。

示例函数框架:

void OutputStudentInfo(Student student){

    //将学生信息以表格形式输出

}

void SaveStudentInfoToFile(std::vector<Student> students, std::string filename){

    //将学生信息保存到文件中(可以先将学生信息转化为字符串格式,再写入文件中)

}

六.调试分析

在完成程序编写后,需要进行测试和调试,确保程序的正确性和稳定性。在测试和调试时,需要注意以下事项:

对于各个模块,需要进行单元测试,确保每个模块的功能正确无误。同时,需要进行集成测试和系统测试,测试整个程序的功能。

针对可能出现的特殊情况和异常情况,需要进行相应的处理和测试,例如非法输入、文件无法读取、文件不存在等。

建议使用调试工具对程序进行调试,遇到问题及时进行排查和解决。

七.用户使用说明

对于使用本系统的用户,需要提供相应的使用说明,包括如何使用各个功能模块、如何输入和处理数据、如何保存和读取文件等。

示例使用说明:

输入学生信息:

在主界面中,选择“输入学生信息”按钮即可进入输入界面,按照提示输入学生的姓名、学号、性别、出生日期、宿舍号等信息,并点击“确认”按钮,系统将自动将学生信息保存到文件中。

查询学生信息:

在主界面中,选择“查询学生信息”按钮即可进入查询界面,在查询界面中输入学生的学号或姓名,并点击“查询”按钮,系统将查询结果以表格形式显示出来。如果查询结果不存在,系统会给出相应的提示信息。

修改学生信息:

在主界面中,选择“修改学生信息”按钮即可进入修改界面,在修改界面中输入学生的学号或姓名,并输入需要修改的信息,最后点击“确认”按钮,系统将自动将修改后的学生信息保存到文件中。

删除学生信息:

在主界面中,选择“删除学生信息”按钮即可进入删除界面,在删除界面中输入学生的学号或姓名,并点击“删除”按钮,系统将自动将删除后的学生信息保存到文件中。

八.测试结果

测试结果表明,本系统具备良好的功能和用户体验,能够有效地管理学生信息,并在输入、查询、修改和删除等方面具有较高的准确性和稳定性。

九.程序设计总结

本程序采用了C++语言进行开发,使用了面向对象的思想,通过模块化设计和分层架构,实现了对学生信息的管理和操作。通过此次程序设计,我学习了C++的一些基础概念和语法,进一步提高了我的编程技能和实践能力。

十.参考文献

《C++ Primer》

《C++编程思想》

《C++程序设计》

《C++程序设计基础》

经过以上分析得到以下代码:

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

using namespace std;


struct Student {
    string name;
    string id;
    string gender;
    string dorm;
    int age;
    string birth;
};


const string fileName = "students.txt";


vector<Student> readStudents() {
    vector<Student> students;
    ifstream infile(fileName);
    if (!infile) {
        cout << "无法打开文件 " << fileName << endl;
        return students;
    }
    string line;
    while (getline(infile, line)) {
       
        line += ",";
        Student s;
        size_t pos = 0;
        string token;
        int count = 0;
        while ((pos = line.find(',')) != string::npos) {
            token = line.substr(0, pos);
            switch (count) {
            case 0: s.name = token; break;
            case 1: s.id = token; break;
            case 2: s.gender = token; break;
            case 3: s.dorm = token; break;
            case 4: s.age = stoi(token); break;
            case 5: s.birth = token; break;
            }
            line.erase(0, pos + 1);
            count++;
        }
        students.push_back(s);
    }
    infile.close();
    return students;
}


void saveStudents(vector<Student>& students) {
    ofstream outfile(fileName);
    if (!outfile) {
        cout << "无法打开文件 " << fileName << endl;
        return;
    }
    for (auto&& s : students) {
      
        outfile << s.name << ',' << s.id << ',' << s.gender << ',' << s.dorm
            << ',' << s.age << ',' << s.birth << endl;
    }
    outfile.close();
}

void displayStudents(vector<Student>& students) {
    cout << setw(10) << "姓名" << setw(10) << "学号" << setw(5) << "性别"
        << setw(10) << "宿舍号" << setw(5) << "年龄" << setw(15) << "出生日期" << endl;
    for (auto&& s : students) {
        cout << setw(10) << s.name << setw(10) << s.id << setw(5) << s.gender
            << setw(10) << s.dorm << setw(5) << s.age << setw(15) << s.birth << endl;
    }
}

vector<Student> searchById(vector<Student>& students, string id) {
    vector<Student> result;
    for (auto&& s : students) {
        if (s.id == id) {
            result.push_back(s);
        }
    }
    return result;
}


vector<Student> searchByName(vector<Student>& students, string name) {
    vector<Student> result;
    for (auto&& s : students) {
        if (s.name == name) {
            result.push_back(s);
        }
    }
    return result;
}


void modifyStudent(vector<Student>& students, string id) {
    for (auto&& s : students) {
        if (s.id == id) {
            cout << "请输入新的姓名:";
            getline(cin, s.name);
            cout << "请输入新的性别:";
            getline(cin, s.gender);
            cout << "请输入新的宿舍号:";
            getline(cin, s.dorm);
            cout << "请输入新的出生日期:";
            getline(cin, s.birth);
            s.age = 2023 - stoi(s.birth.substr(0, 4));
            cout << "修改成功!" << endl;
            return;
        }
    }
    cout << "没有找到学号为 " << id << " 的学生。" << endl;
}


void deleteStudent(vector<Student>& students, string id) {
    for (auto it = students.begin(); it < students.end(); it++) {
        if ((*it).id == id) {
            students.erase(it);
            cout << "删除成功!" << endl;
            return;
        }
    }
    cout << "没有找到学号为 " << id << " 的学生。" << endl;
}

void addStudent(vector<Student>& students) {
    Student s;
    cout << "请输入姓名:";
    getline(cin, s.name);
    cout << "请输入学号:";
    getline(cin, s.id);
    cout << "请输入性别:";
    getline(cin, s.gender);
    cout << "请输入宿舍号:";
    getline(cin, s.dorm);
    cout << "请输入出生日期(格式为YYYY-MM-DD):";
    getline(cin, s.birth);
    s.age = 2023 - stoi(s.birth.substr(0, 4));
    students.push_back(s);
    cout << "添加成功!" << endl;
}


void displayMenu() {
    cout << "请选择操作:" << endl;
    cout << "1. 查看所有学生信息" << endl;
    cout << "2. 按学号查询学生信息" << endl;
    cout << "3. 按姓名查询学生信息" << endl;
    cout << "4. 修改学生信息" << endl;
    cout << "5. 删除学生信息" << endl;
    cout << "6. 添加学生信息" << endl;
    cout << "0. 退出" << endl;
    cout << "请选择操作:";
}

int main() {
    vector<Student> students = readStudents();

    while (true) {
        displayMenu();
        int choice;
        cin >> choice;
        cin.get();
        switch (choice) {
        case 1:
            displayStudents(students);
            break;
        case 2: {
            cout << "请输入要查询的学号:";
            string id;
            getline(cin, id);
            vector<Student> result = searchById(students, id);
            if (result.size() == 0) {
                cout << "没有找到学号为 " << id << " 的学生。" << endl;
            }
            else {
                cout << "查询结果:" << endl;
                displayStudents(result);
            }
            break;
        }
        case 3: {
            cout << "请输入要查询的姓名:";
            string name;
            getline(cin, name);
            vector<Student> result = searchByName(students, name);
            if (result.size() == 0) {
                cout << "没有找到姓名为 " << name << " 的学生。" << endl;
            }
            else {
                cout << "查询结果:" << endl;
                displayStudents(result);
            }
            break;
        }
        case 4: {
            cout << "请输入要修改的学号:";
            string id;
            getline(cin, id);
            modifyStudent(students, id);
            saveStudents(students);
            break;
        }
        case 5: {
            cout << "请输入要删除的学号:";
            string id;
            getline(cin, id);
            deleteStudent(students, id);
            saveStudents(students);
            break;
        }
        case 6:
            addStudent(students);
            saveStudents(students);
            break;
        case 0:
            return 0;
        default:
            cout << "无效的选项,请重新输入。" << endl;
        }
    }

    return 0;

 代码可以添加更多功能,博主给大家一个参考,我们可以添加一些集体录入、宿舍人员查询、不分整体删除等等。希望大家可以完善。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASP.NET State Service服务无法启动解决方案

客户服务器ASP.NET State Service启动不起来&#xff0c;如下图所示&#xff1a; 在服务中右击属性查看基本信息&#xff0c;发现aspnet_state.exe在目录中不存在&#xff0c;如下图所示&#xff1a; 若想正常启动&#xff0c;需要重新指向有exe的目录中去&#xff0c;解决方案…

Linux之问件上传下载

目录 Linux之文件上传下载 sftp 定义 用法 常用操作 查看当前目的主机的路径 --- pwd 查看当前本地所在路径 --- lpwd 更改当前目的主机的路径 --- cd 更改当前本地所在路径 --- lcd 查看当前目的主机 --- ls ​编辑 查看当本地的主机目录 --- lls ​编辑 将Window…

08SQL基础知识

SQL知识点 1、SQL语言分类 SQL语言共分为四大类&#xff1a;数据查询语言DQL&#xff0c;数据操纵语言DML&#xff0c;数据定义语言DDL&#xff0c;数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句&#xff0c;FROM子句&#xff0c;WHERE子句组…

耗时122天,终于把牛客网点赞飙升的Java面试题(含答案)整理出来了

2023年就业形势不算好&#xff0c;大厂缩招裁员导致优质岗位竞争变得更加激烈&#xff0c;除了对面试者技术的要求变高&#xff0c;面试的深度和难度较去年也有所加大。为了让大家能够在 2023 金九银十跳槽黄金期脱颖而出&#xff0c;想拿个好 offer 说实话&#xff0c;现在准备…

企业上云,你做对了吗?

数字化转型是国家战略&#xff0c;各位估计眼睛看这几个字都看出茧了。所以&#xff0c;今天不聊数字化转型&#xff0c;今天聊企业上云。 随着云计算技术的日益成熟和云计算服务商的不断涌现&#xff0c;越来越多的企业将业务应用迁移到云端。但是&#xff0c;企业上云“坑”…

2023大唐杯学习笔记——人工智能与机器学习—决策树

决策树知识点 这个表也是一个数据集 问题&#xff1a;以什么作为划分呢&#xff1f;第一次是以年龄&#xff0c;还是以 工作 房子 信贷情况… 这里的熵与中文里的其他东西没有实际对应&#xff0c;就是一个定义H&#xff08;p&#xff09;1最大时&#xff0c;p0.5&#xff0c;这…

串口助手(串口发送接收数据, 定时, 清空, hex显示)

文章目录 前言一、串口接收数据1. 默认接收&#xff0c;换行&#xff0c;hex显示2. 清空接收区数据3. 保存接受区数据 二、串口发送数据1. 默认发送2. 定时发送 三、串口助手优化1. 设置组合框当前内容。2. 未检测到串口&#xff0c;弹出警告。3. 载入文件 总结 前言 这篇文章…

ESP32-S3 使用指定 key 来进行 secure boot 签名并进行 OTA 测试

文档说明 Secure Boot V2 测试准备&#xff1a; 硬件准备&#xff1a;ESP32-S3 开发板或模组软件准备&#xff1a;esp-idf v5.0 版本 SDK 测试步骤&#xff1a; 生成指定 secure boot 签名 key软件开启 secure boot 配置烧录被签名的固件对新的 app.bin 使用指定 key 进行…

【006 Linux内核】应用程序中open()在linux中执行过程中是如何从用户空间到内核空间?

一、前言 应用程序运行在用户空间&#xff0c;而 Linux 驱动运行于内核空间。当我们在用户空间想要实现对内核的操作&#xff0c;比如使用 open 函数打开/dev/led 这个驱动&#xff0c;由于用户空间不能直接对内核进行操作&#xff0c;因此必须使用一个叫做 “系统调用” 的方…

论文阅读 (90):Proposal-based Multiple Instance Learning (P-MIL, 2023CVPR)

文章目录 1 要点1.1 概述1.2 一些概念1.3 主要步骤 2 方法2.1 候选提案生成2.2 提案特征提取和分类2.2.1 周围对比特征提取2.2.2 分类头 2.3 提案微调2.3.1 提案完备性评估2.3.2 实例级秩一致性 2.4 网络训练和推理2.4.1 网络训练2.4.2推理 3 实验3.1 数据集即评估标准3.1.1 数…

一线大厂Java 面试题大全1100+ 面试题附答案详解(2023最新整理)

写在前面 今年的面试比往年要难得多&#xff0c;各个互联网企业对于 Java 岗位的要求越来越多&#xff0c;也越来越高&#xff0c;主要是初级岗位已经趋近饱和&#xff0c;但高级岗位又相对来说缺乏&#xff0c;这类的人才偏少&#xff0c;因此作为 Java 开发人员&#xff0c;…

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

&#x1f3c6;&#x1f3c6;时间过的真快&#xff0c;这是导师回顾新星计划学习的第四篇文章&#xff01; 最近这段时间非常忙&#xff0c;虽然导师首次参与新星计划活动已经在4月16日圆满结束&#xff0c;早想腾出时间来好好整理活动期间分享的知识点。 &#x1f3c6;&#x1…

【TiDB Future App Hackathon 2023 】TiDB 首届全球黑客马拉松,开发者的狂欢夏日盛会!快来一起 Coding 吧!...

作者&#xff1a; Billmay表妹 原文来源&#xff1a; https://tidb.net/blog/cf364859 2023 TiDB Future App Hackathon 来啦&#xff01;本届 Hackathon 的主题为&#xff1a;Code, Innovate & Build Amazing Data Applications —— 释放你的创造力、构建突破性的应用…

JS逆向之大众点评mtgsig

本教程仅限于学术探讨&#xff0c;也没有专门针对某个网站而编写&#xff0c;禁止用于非法用途、商业活动、恶意滥用技术等&#xff0c;否则后果自负。观看则同意此约定。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 目录 前言 一、先分析下接口参数 二、开导…

不懂这个118358-80-8甘露糖丝氨酸?看看Fmoc-Ser(Ac4Manα)-OH的全面解析吧!

Fmoc-Ser(Ac4Manα)-OH&#xff0c;甘露糖丝氨酸Product structure&#xff1a; Product specifications&#xff1a; 1.CAS No&#xff1a;118358-80-8 2.Molecular formula&#xff1a;C32H35NO14 3.Molecular weight&#xff1a;657.63 4.Packaging specification&#xff1…

浅谈响应式网页设计 —— 测试该知道的二三事

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

【LeetCode】每日一题 -- 1240. 铺瓷砖 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/tiling-a-rectangle-with-the-fewest-squares/ 1. 题解&#xff08;1240. 铺瓷砖&#xff09; 23.05.31 华为机试第二题 1.1 暴力深搜 – DFS NP-Complete 问题 题解参考&#xff1a;Java DFS暴力递归&#xff08;详细注释&…

LeetCode 2352. Equal Row and Column Pairs【模拟,哈希表,前缀树】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

100G QSFP28光模块类型和使用场景

100G QSFP28光模块是当前数据中心和通信网络中广泛应用的高速光模块之一。本文将详细介绍100G QSFP28光模块的类型、应用场景以及市场发展前景&#xff0c;并引用相关产品参数和行业统计数据&#xff0c;为读者提供全面的了解。 一、100G QSFP28光模块类型 100G QSFP28光模块…

开源 API 网关的访问策略(一)

许多企业和组织面临着网关访问控制的挑战&#xff0c;因为传统的访问控制方法往往过于笨重和繁琐。这些方法可能涉及复杂的规则集、繁琐的手动配置过程、缺乏灵活性和可扩展性等问题。此外&#xff0c;随着云计算和移动设备的广泛应用&#xff0c;访问控制的复杂性和挑战程度也…