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

可接各类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";
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL实现排名

数据准备 Create table If Not Exists Scores (id int, score DECIMAL(3,2)) Truncate table Scores insert into Scores (id, score) values (1, 3) insert into Scores (id, score) values (2, 3) insert into Scores (id, score) values (3, 4.0) insert into Scores (id, …

虾皮平台API:获取商品买家评论数据

一、接口核心功能 在电商领域&#xff0c;买家评论对于商品的销售和商家的口碑至关重要。虾皮作为东南亚地区知名的电商平台&#xff0c;为商家提供了丰富的商品买家评论数据。为了方便商家获取这些数据&#xff0c;我们的API接口服务其核心功能就是获取商品买家评论数据信息。…

使用pip2pi和nginx搭建私有pip镜像源方法

在内网环境下部署python开发环境&#xff0c;安装python第三方库比较麻烦&#xff0c;特别是安装需要多个依赖的库。一种比较好的解决方案是搭建一个本地的私有pip镜像源&#xff0c;有多个方案可以选择&#xff0c;比如pypiserver、pip2pi等&#xff0c;本文介绍使用python的p…

vue3轮播图怎么做

先看效果 实现代码 <n-carouseleffect"card"dot-type"line"draggable:autoplay"!isHovered":current-index"currentIndex"prev-slide-style"transform: translateX(-150%) translateZ(-450px);opacity:1"next-slide-st…

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

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

Spring学习笔记(九)简单的SSM框架整合

实验目的 掌握SSM框架整合。 实验环境 硬件&#xff1a;PC机 操作系统&#xff1a;Windows 开发工具&#xff1a;idea 实验内容 整合SSM框架。 实验步骤 搭建SSM环境&#xff1a;构建web项目&#xff0c;导入需要的jar包&#xff0c;通过单元测试测试各层框架搭建的正确…

Rewrite the Stars

文章目录 摘要1、引言2、相关工作3、重写星操作3.1、单层中的星操作3.2、扩展到多层3.3、特殊情况3.4、实证研究3.4.1、星操作的实证优越性3.4.2、决策边界对比3.4.3、扩展到无激活函数的网络 3.5、开放讨论与更广泛的影响 4、概念验证&#xff1a;StarNet4.1、StarNet架构4.2、…

用于云医疗图像的缩略图保持加密方案

论文标题&#xff1a;《Data hiding with thumbnail-preserving encryption for cloud medical images》&#xff0c;作者提出了一种用于云医疗图像的可逆数据隐藏方案&#xff0c;同时保留了缩略图。下面是论文的创新点和算法过程的总结。 一、缩略图保持加密与传统图像加密 …

PCL 计算点云的形心

目录 一、形心二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、形心 面的形心就是截面图形的几何中心,质心是针对实物体而言的,而形心是针对抽象几何体而言的,对于密度均匀的实物体,…

Axios基础用法

目录 Axios简介&#xff1f; json-server 下载json-server 创建模拟数据json文件 运行json-server ​编辑​编辑 安装Axios Axios基础用法 创建Vue项目 get请求 post请求 put请求 delete请求 并发请求 总结 Axios简介&#xff1f; Axios是一个基于Promise的HTTP库&#xf…

存储器的性能指标以及层次化存储器

存储器的性能指标 存储器有三个性能指标&#xff1a;速度、容量和位价&#xff08;每位价格&#xff09; 1.存储速度 &#xff08;1&#xff09;存取时间 想衡量存储速度&#xff0c;最直观的指标就是完成一次存储器读写操作所需要的时间&#xff0c;这叫做存取时间&#x…

nginx+tomcat+nfs →web集群部署

nginxtomcatnfs →web集群部署 一.安装前介绍 NGINX是一个高性能的Web服务器和反向代理服务器。它能够处理静态内容&#xff0c;缓存请求结果&#xff0c;以及将请求转发给后端服务器。通过反向代理&#xff0c;NGINX能够实现请求的负载均衡、安全性增强、SSL加密等功能。此外…

RabbitMQ实践——利用随机交换器做负载均衡

大纲 启用Random Exchange创建Exchange绑定队列测试 在《RabbitMQ实践——利用一致性Hash交换器做负载均衡》中&#xff0c;我们使用了Consistent Hash Exchange实践了消息路由的负载均衡。本文我们将使用一种更简单的交换器来实现该功能&#xff0c;这就是“随机交换器”&…

Linux初识地址空间

前言 上一期我们对进程优先级、命令行参数以及环境和变量做了介绍&#xff01;以前我们就提到过一个问题有了运行队列为什么还要有优先级&#xff1f;本期将带你揭晓&#xff01; 本期内容介绍 虚拟地址空间的引入 虚拟地址空间的介绍 如何理解地址空间 为什么要有地址空间 如…

3DMAX卷曲修改器Roller插件使用方法详解

3DMAX卷曲修改器Roller插件使用教程 3DMAX卷曲修改器Roller&#xff0c;用于创建卷曲形状建模&#xff0c;并可生成卷曲和展开动画。使创建诸如卷起和打开毯子、旗帜这样的动画变得非常简单。 【适用版本】 适用于3ds Max 2012及更高版本 【安装方法】 3DMAX卷曲修改器Roller…

QT

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) ,Gcancle(new QPushButton("取消",this)) ,EmmEdit(new QLineEdit(this)) { ui->setupUi(this);…

UDS——诊断三要素

文章目录 诊断三要素一、请求1.1 带子功能的服务1.2 不带子功能的服务二、正响应(肯定响应)2.1 带子功能诊断请求的肯定响应格式2.2 不带子功能诊断请求的肯定响应格式三、负响应(否定响应)否定响应码诊断三要素 诊断主要包含请求、肯定响应和否定响应三个要素 “请求”由…

浙大版PTA Python程序设计 题目与知识点整理(综合版)

目录 第一章 一、高级语言程序的执行方式 二、变量赋值与内存地址 三、字符编码 3.1 Unicode 3.2 ASCII&#xff08;American Standard Code for Information Interchange&#xff09; 四、编程语言分类按照编程范式分类 4.1 面向过程语言 4.2 面向对象语言 五、原码…

【LeetCode最详尽解答】42-接雨水 Trapping-Rain-Water

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 链接: 42-接雨水 直觉 通过可视化图形来解决这个问题会更容易理解和解决。 给定输入: height [0,1,…

力扣231. 2 的幂(位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.若为0和负数则直接返回false&#xff1b; 2.利用一个标志数mask令其为一&#xff0c;不断的算术左移同时和n做与&#xff08;&&#xff09;运算&#xff0c;统计n中二进制位为1的个数&a…