【C/C++】【学生成绩管理系统】深度剖析

news2024/10/6 4:04:07

可接各类C/C++管理系统课设

目录

实现功能

部分1:系统设置和主菜单

1. 引入头文件

2. 定义结构体

3. 函数声明

4. 主函数

部分2:添加学生信息

部分3:删除学生信息

部分4:修改学生信息

部分5:查询学生信息

部分6:显示信息列表

部分7:统计学生数据

部分8:清空系统数据

部分9: 退出系统函数

总结代码


该学生成绩管理系统是一个用C++实现的程序,通过控制台界面实现对学生信息的增删改查。系统包括以下功能:添加学生信息、删除学生信息、修改学生信息、查询学生信息、显示所有学生信息、统计学生成绩数据和清空系统数据。

实现功能

  1. 添加学生信息: 用户可以通过输入学生的ID、姓名、年龄、性别和成绩来添加学生信息。新添加的学生信息会被存储在一个向量中。

  2. 删除学生信息: 用户可以通过输入学生的ID来删除学生信息。程序会在向量中查找对应的学生ID,如果找到则删除该学生的信息。

  3. 修改学生信息: 用户可以通过输入学生的ID来修改学生信息。程序会在向量中查找对应的学生ID,如果找到则允许用户修改该学生的姓名、年龄、性别和成绩。

  4. 查询学生信息: 用户可以通过输入学生的ID来查询学生信息。程序会在向量中查找对应的学生ID,如果找到则显示该学生的详细信息。

  5. 显示信息列表: 程序会显示所有存储在向量中的学生信息列表,包括每个学生的ID、姓名、年龄、性别和成绩。使用格式化输出使信息更加整齐美观。

  6. 统计学生数据: 程序会计算并显示学生成绩的平均值、最高值和最低值。这有助于用户了解整体的学生成绩分布情况。

  7. 清空系统数据: 用户可以选择清空系统中所有学生的数据。这会删除向量中存储的所有学生信息。

  8. 退出系统: 用户选择退出系统时,程序会显示退出提示信息,并终止运行。

部分1:系统设置和主菜单

首先设置程序的基本结构和主菜单界面。

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

using namespace std;

// 定义一个结构体来保存学生信息
struct Student {
    int id;
    string name;
    int age;
    string gender;
    double grade;
};

// 函数声明
void addStudent(vector<Student>& students);
void deleteStudent(vector<Student>& students);
void modifyStudent(vector<Student>& students);
void queryStudent(const vector<Student>& students);
void displayStudents(const vector<Student>& students);
void statistics(const vector<Student>& students);
void clearData(vector<Student>& students);
void exitSystem();

int main() {
    vector<Student> students;
    int choice;

    while (true) {
        cout << "*****************欢迎来到学生成绩管理系统*****************\n";
        cout << "你可以进行以下操作:\n";
        cout << "1. 添加学生信息\n";
        cout << "2. 删除学生信息\n";
        cout << "3. 修改学生信息\n";
        cout << "4. 查询学生信息\n";
        cout << "5. 显示信息列表\n";
        cout << "6. 统计学生数据\n";
        cout << "7. 清空系统数据\n";
        cout << "0. 退出\n";
        cout << "请输入你的选择: ";
        cin >> choice;

        switch (choice) {
            case 1:
                addStudent(students);
                break;
            case 2:
                deleteStudent(students);
                break;
            case 3:
                modifyStudent(students);
                break;
            case 4:
                queryStudent(students);
                break;
            case 5:
                displayStudents(students);
                break;
            case 6:
                statistics(students);
                break;
            case 7:
                clearData(students);
                break;
            case 0:
                exitSystem();
                return 0;
            default:
                cout << "无效的选择,请重新输入。\n";
        }
    }
    return 0;
}

1. 引入头文件

首先,引入了C++标准库中的必要头文件:

#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
  • iostream:用于输入输出操作。
  • vector:用于动态数组(向量)的使用。
  • string:用于字符串操作。
  • iomanip:用于格式化输出。

2. 定义结构体

定义了一个结构体 Student,用于保存学生信息:

struct Student {
    int id;           // 学生ID
    string name;      // 学生姓名
    int age;          // 学生年龄
    string gender;    // 学生性别
    double grade;     // 学生成绩
};

3. 函数声明

main 函数之前,声明了一些函数,这些函数将在后续部分实现:

void addStudent(vector<Student>& students);
void deleteStudent(vector<Student>& students);
void modifyStudent(vector<Student>& students);
void queryStudent(const vector<Student>& students);
void displayStudents(const vector<Student>& students);
void statistics(const vector<Student>& students);
void clearData(vector<Student>& students);
void exitSystem();

4. 主函数

主函数包含了一个无限循环,用于显示菜单并处理用户的选择:

int main() {
    vector<Student> students;
    int choice;

    while (true) {
        cout << "*****************欢迎来到学生成绩管理系统*****************\n";
        cout << "你可以进行以下操作:\n";
        cout << "1. 添加学生信息\n";
        cout << "2. 删除学生信息\n";
        cout << "3. 修改学生信息\n";
        cout << "4. 查询学生信息\n";
        cout << "5. 显示信息列表\n";
        cout << "6. 统计学生数据\n";
        cout << "7. 清空系统数据\n";
        cout << "0. 退出\n";
        cout << "请输入你的选择: ";
        cin >> choice;

        switch (choice) {
            case 1:
                addStudent(students);
                break;
            case 2:
                deleteStudent(students);
                break;
            case 3:
                modifyStudent(students);
                break;
            case 4:
                queryStudent(students);
                break;
            case 5:
                displayStudents(students);
                break;
            case 6:
                statistics(students);
                break;
            case 7:
                clearData(students);
                break;
            case 0:
                exitSystem();
                return 0;
            default:
                cout << "无效的选择,请重新输入。\n";
        }
    }
    return 0;
}
  • vector<Student> students:定义一个用于存储学生信息的向量。
  • int choice:用于存储用户的选择。

部分2:添加学生信息

这个功能允许用户输入新的学生信息到系统中。

void addStudent(vector<Student>& students) {
    Student newStudent;
    cout << "请输入学生ID: ";
    cin >> newStudent.id;
    cout << "请输入学生姓名: ";
    cin >> newStudent.name;
    cout << "请输入学生年龄: ";
    cin >> newStudent.age;
    cout << "请输入学生性别: ";
    cin >> newStudent.gender;
    cout << "请输入学生成绩: ";
    cin >> newStudent.grade;

    students.push_back(newStudent);
    cout << "学生信息添加成功!\n";
}
  • 使用 cin 获取用户输入的学生信息,并存储在 newStudent 变量中。
  • newStudent 添加到 students 向量中。
  • 提示用户添加成功。

部分3:删除学生信息

这个功能允许用户根据学生ID删除学生信息。

void deleteStudent(vector<Student>& students) {
    int id;
    cout << "请输入要删除的学生ID: ";
    cin >> id;
    
    for (auto it = students.begin(); it != students.end(); ++it) {
        if (it->id == id) {
            students.erase(it);
            cout << "学生信息删除成功!\n";
            return;
        }
    }
    cout << "未找到该学生ID。\n";
}
  • 获取用户输入的学生ID。
  • 使用迭代器遍历 students 向量,找到匹配的学生ID并删除。
  • 提示用户删除成功或未找到该学生ID。

部分4:修改学生信息

这个功能允许用户修改现有的学生信息。

void modifyStudent(vector<Student>& students) {
    int id;
    cout << "请输入要修改的学生ID: ";
    cin >> id;
    
    for (auto& student : students) {
        if (student.id == id) {
            cout << "请输入新的学生姓名: ";
            cin >> student.name;
            cout << "请输入新的学生年龄: ";
            cin >> student.age;
            cout << "请输入新的学生性别: ";
            cin >> student.gender;
            cout << "请输入新的学生成绩: ";
            cin >> student.grade;
            cout << "学生信息修改成功!\n";
            return;
        }
    }
    cout << "未找到该学生ID。\n";
}
  • 获取用户输入的学生ID。
  • 遍历 students 向量,找到匹配的学生ID并获取新的学生信息进行修改。
  • 提示用户修改成功或未找到该学生ID。

部分5:查询学生信息

这个功能允许用户根据学生ID查询并显示学生信息。

void queryStudent(const vector<Student>& students) {
    int id;
    cout << "请输入要查询的学生ID: ";
    cin >> id;
    
    for (const auto& student : students) {
        if (student.id == id) {
            cout << "学生ID: " << student.id << "\n";
            cout << "学生姓名: " << student.name << "\n";
            cout << "学生年龄: " << student.age << "\n";
            cout << "学生性别: " << student.gender << "\n";
            cout << "学生成绩: " << student.grade << "\n";
            return;
        }
    }
    cout << "未找到该学生ID。\n";
}
  • 获取用户输入的学生ID。
  • 遍历 students 向量,找到匹配的学生ID并显示学生信息。
  • 提示用户未找到该学生ID。

部分6:显示信息列表

这个功能显示所有学生的信息列表。

void displayStudents(const vector<Student>& students) {
    cout << setw(10) << "学生ID" << setw(20) << "学生姓名" << setw(10) << "年龄" << setw(10) << "性别" << setw(10) << "成绩" << "\n";
    for (const auto& student : students) {
        cout << setw(10) << student.id << setw(20) << student.name << setw(10) << student.age << setw(10) << student.gender << setw(10) << student.grade << "\n";
    }
}
  • 使用 setw 设置输出格式,确保信息对齐。
  • 遍历 students 向量,显示每个学生的信息。

部分7:统计学生数据

这个功能提供学生成绩的基本统计信息。

void statistics(const vector<Student>& students) {
    if (students.empty()) {
        cout << "没有学生数据。\n";
        return;
    }

    double sum = 0;
    double maxGrade = students[0].grade;
    double minGrade = students[0].grade;
    
    for (const auto& student : students) {
        sum += student.grade;
        if (student.grade > maxGrade) {
            maxGrade = student.grade;
        }
        if (student.grade < minGrade) {
            minGrade = student.grade;
        }
    }
    
    double average = sum / students.size();
    cout << "学生成绩统计:\n";
    cout << "平均成绩: " << average << "\n";
    cout << "最高成绩: " << maxGrade << "\n";
    cout << "最低成绩: " << minGrade << "\n";
}
  • 计算并显示学生成绩的平均值、最高值和最低值。
  • 如果没有学生数据,提示用户。

部分8:清空系统数据

这个功能清除系统中的所有学生数据。

void clearData(vector<Student>& students) {
    students.clear();
    cout << "系统数据已清空。\n";
}
  • 清空 students 向量中的所有数据。
  • 提示用户数据已清空。

部分9: 退出系统函数

实现了退出系统时的提示功能:

void exitSystem() {
    cout << "感谢使用学生成绩管理系统,再见!\n";
}
  • 提示用户系统退出信息。

总结代码

将所有部分整合在一起,形成完整的学生成绩管理系统代码如下:

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

using namespace std;

struct Student {
    int id;
    string name;
    int age;
    string gender;
    double grade;
};

void addStudent(vector<Student>& students);
void deleteStudent(vector<Student>& students);
void modifyStudent(vector<Student>& students);
void queryStudent(const vector<Student>& students);
void displayStudents(const vector<Student>& students);
void statistics(const vector<Student>& students);
void clearData(vector<Student>& students);
void exitSystem();

int main() {
    vector<Student> students;
    int choice;

    while (true) {
        cout << "*****************欢迎来到学生成绩管理系统*****************\n";
        cout << "你可以进行以下操作:\n";
        cout << "1. 添加学生信息\n";
        cout << "2. 删除学生信息\n";
        cout << "3. 修改学生信息\n";
        cout << "4. 查询学生信息\n";
        cout << "5. 显示信息列表\n";
        cout << "6. 统计学生数据\n";
        cout << "7. 清空系统数据\n";
        cout << "0. 退出\n";
        cout << "请输入你的选择: ";
        cin >> choice;

        switch (choice) {
            case 1:
                addStudent(students);
                break;
            case 2:
                deleteStudent(students);
                break;
            case 3:
                modifyStudent(students);
                break;
            case 4:
                queryStudent(students);
                break;
            case 5:
                displayStudents(students);
                break;
            case 6:
                statistics(students);
                break;
            case 7:
                clearData(students);
                break;
            case 0:
                exitSystem();
                return 0;
            default:
                cout << "无效的选择,请重新输入。\n";
        }
    }
    return 0;
}

void addStudent(vector<Student>& students) {
    Student newStudent;
    cout << "请输入学生ID: ";
    cin >> newStudent.id;
    cout << "请输入学生姓名: ";
    cin >> newStudent.name;
    cout << "请输入学生年龄: ";
    cin >> newStudent.age;
    cout << "请输入学生性别: ";
    cin >> newStudent.gender;
    cout << "请输入学生成绩: ";
    cin >> newStudent.grade;

    students.push_back(newStudent);
    cout << "学生信息添加成功!\n";
}

void deleteStudent(vector<Student>& students) {
    int id;
    cout << "请输入要删除的学生ID: ";
    cin >> id;
    
    for (auto it = students.begin(); it != students.end(); ++it) {
        if (it->id == id) {
            students.erase(it);
            cout << "学生信息删除成功!\n";
            return;
        }
    }
    cout << "未找到该学生ID。\n";
}

void modifyStudent(vector<Student>& students) {
    int id;
    cout << "请输入要修改的学生ID: ";
    cin >> id;
    
    for (auto& student : students) {
        if (student.id == id) {
            cout << "请输入新的学生姓名: ";
            cin >> student.name;
            cout << "请输入新的学生年龄: ";
            cin >> student.age;
            cout << "请输入新的学生性别: ";
            cin >> student.gender;
            cout << "请输入新的学生成绩: ";
            cin >> student.grade;
            cout << "学生信息修改成功!\n";
            return;
        }
    }
    cout << "未找到该学生ID。\n";
}

void queryStudent(const vector<Student>& students) {
    int id;
    cout << "请输入要查询的学生ID: ";
    cin >> id;
    
    for (const auto& student : students) {
        if (student.id == id) {
            cout << "学生ID: " << student.id << "\n";
            cout << "学生姓名: " << student.name << "\n";
            cout << "学生年龄: " << student.age << "\n";
            cout << "学生性别: " << student.gender << "\n";
            cout << "学生成绩: " << student.grade << "\n";
            return;
        }
    }
    cout << "未找到该学生ID。\n";
}

void displayStudents(const vector<Student>& students) {
    cout << setw(10) << "学生ID" << setw(20) << "学生姓名" << setw(10) << "年龄" << setw(10) << "性别" << setw(10) << "成绩" << "\n";
    for (const auto& student : students) {
        cout << setw(10) << student.id << setw(20) << student.name << setw(10) << student.age << setw(10) << student.gender << setw(10) << student.grade << "\n";
    }
}

void statistics(const vector<Student>& students) {
    if (students.empty()) {
        cout << "没有学生数据。\n";
        return;
    }

    double sum = 0;
    double maxGrade = students[0].grade;
    double minGrade = students[0].grade;
    
    for (const auto& student : students) {
        sum += student.grade;
        if (student.grade > maxGrade) {
            maxGrade = student.grade;
        }
        if (student.grade < minGrade) {
            minGrade = student.grade;
        }
    }
    
    double average = sum / students.size();
    cout << "学生成绩统计:\n";
    cout << "平均成绩: " << average << "\n";
    cout << "最高成绩: " << maxGrade << "\n";
    cout << "最低成绩: " << minGrade << "\n";
}

void clearData(vector<Student>& students) {
    students.clear();
    cout << "系统数据已清空。\n";
}

void exitSystem() {
    cout << "感谢使用学生成绩管理系统,再见!\n";
}

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

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

相关文章

大众点评_token,mtgsig

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可禁止转载&#xff0…

以太网基础知识(三)—FEC概念以及编码原理介绍

1&#xff1a;前言 KR4(528,514) FEC表示的意思&#xff1a; KR4 RS(528,514) FEC 是一种以太网中使用的FEC&#xff08;Forward Error Correction&#xff09;编码方案。在这个方案中&#xff0c;采用的是Reed-Solomon (RS) 编码算法&#xff0c;它被设计用于提高数据传输的…

9M高速USB转接芯片CH347转双串口转I2C转SPI转JTAG转SWD

1、概述 CH347 TSSOP20封装和丝印 CH347 是一款高速 USB 总线转接芯片&#xff0c;通过 USB 总线提供异步串口、I2C 同步串行接口、SPI 同步串行接口和 JTAG 接口等。 在异步串口方式下&#xff0c;CH347 提供了 2 个高速串口&#xff0c;支持 RS485 串口收发使能控制、硬件流控…

论文阅读:基于谱分析的全新早停策略

来自JMLR的一篇论文&#xff0c;https://www.jmlr.org/papers/volume24/21-1441/21-1441.pdf 这篇文章试图通过分析模型权重矩阵的频谱来解释模型&#xff0c;并在此基础上提出了一种用于早停的频谱标准。 1&#xff0c;分类难度对权重矩阵谱的影响 1.1 相关研究 在最近针对…

SN74HC14+陶瓷振子做振荡器的试验初步

本想试验一下465khz用SN74HC14做振荡器&#xff0c;实验了很多次&#xff0c;无法起振。 用1M&#xff0c;4M的也无法起振&#xff0c;用到10Mhz时&#xff0c;能起振&#xff0c;用小频谱仪看&#xff0c;谐波相当丰富&#xff0c;从10M到300Mhz&#xff0c;当然我是通过实验在…

python14 字典类型

字典类型 键值对方式&#xff0c;可变数据类型&#xff0c;所以有增删改功能 声明方式1 {} 大括号&#xff0c;示例 d {key1 : value1, key2 : value2, key3 : value3 ....} 声明方式2 使用内置函数 dict() 创建1)通过映射函数创建字典zip(list1,list2) 继承了序列的所有操作 …

第零篇——数学到底应该怎么学?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 宏观讲解数学定位&#xff0c;数学学习方式方法&#xff0c;再次详细学习…

C# OpenCV 部署RecRecNet广角图像畸变矫正

C# OpenCV 部署RecRecNet广角图像畸变矫正 目录 说明 效果 模型信息 项目 代码 下载 说明 ICCV2023 - RecRecNet: Rectangling Rectified Wide-Angle Images by Thin-Plate Spline Model and DoF-based Curriculum Learning 参考&#xff1a; https://github.com/Kang…

Vue52-scoped样式

一、scoped样式的作用 1-1、scoped样式的作用 vue中组件的样式都是汇总到一起的。容易出现一个问题&#xff1a;类名冲突。 示例&#xff1a; school和student组件的类名都叫demo&#xff0c;则student的样式将覆盖school的样式&#xff0c;因为App.vue中&#xff0c;先引入的…

Spring事务管理、SpringAop

目录 ​编辑 Spring事务管理 注解:Transactional rollbackFor 事务属性-传播行为 propagation SpringAOP AOP核心概念 通知类型 通知顺序 切入点表达式 切入点表达式-execution 切入点表达式-annotation 连接点 ​编辑 将案例中 增、删、改 相关接口的操作日志记…

unity跑酷游戏(源码)

包括&#xff1a;触发机关&#xff0c; 优化 fog的调试 效果 碰到障碍物游戏时间暂停&#xff08;挂载到障碍物上&#xff09; 上面需要有碰撞体 游戏物体上需要有标签 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Barri…

【仿真建模-anylogic】FlowchartBlock原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-17 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数 函数功能FlowchartBlock(Engine engine ,Agent owner, AgentList population )构造函数&#xff…

C语言王国——深入自定义类型(结构体)

目录 一、引言 二、结构体 1. 结构体类型的声明 2. 结构体变量的创建和初始化 2.1 创建 2.2 初始化 2.3 typedef 2.4 特殊声明 2.5 自引用 3. 结构成员访问操作符 4. 结构体内存对齐 4.1 对齐规则 4.2 offsetof 4.3 为什么存在内存对齐 5. 结构体传参 6. 结构体实现…

仅靠独立网站也能赚到100万,真的太牛了

你听说过 Photopea 吗&#xff1f;这是一个免费的类似 Photoshop 的图像编辑器。 这个项目&#xff1a; 每月1300万访问量每月150万用户使用小时每月10万美元的广告收入 Photopea 项目的天才创造者是 Ivan Kutskir。 令人惊讶的是&#xff0c;他独自处理了每日50万用户&…

数组趣味玩法:在Java SE中尝试创新玩法

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

C++ | Leetcode C++题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA nullptr || headB nullptr) {return nullptr;}ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA nullptr ? headB : p…

【Vue3】插槽的使用及其分类

历史小剧场 后来我才明白&#xff0c;造反的宋江&#xff0c;和招安的宋江&#xff0c;始终是同一个人。 为什么要造反&#xff1f; 造反&#xff0c;就是为了招安。 ----《明朝那些事儿》 概念 在日常的项目开发中&#xff0c;当我们在编写一个完整的组件时&#xff0c;不可避…

款基于SpringBoot+Vue+ElementUI技术栈开发的自定义表单工具(已开源)

TDuck填鸭表单是一个开源的问卷调查系统&#xff0c;一款基于SpringBootVueElementUI技术栈开发的自定义表单工具&#xff0c;它不仅支持问卷调查&#xff0c;还能进行数据收集。TDuck团队经过两年的优化&#xff0c;使得社区版功能趋于稳定。2023年5月&#xff0c;团队推出了可…

flstudio怎么调中文

FL Studio设置中文的步骤如下&#xff1a; 打开FL Studio&#xff1a;首先&#xff0c;需要打开FL Studio编曲软件。 进入常规设置&#xff1a;在软件顶部菜单栏中&#xff0c;选择“OPTIONS”&#xff0c;然后点击“General setting”&#xff0c;进入常规设置窗口。 切换语言…

Centos部署openGauss6.0创新版本,丝滑的体验

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…