C++实现学生成绩管理系统

C++实现学生成绩管理系统攻略

系统功能介绍

学生成绩管理系统是一个用于管理学生信息和成绩的软件系统。它能够实现以下功能:

  • 添加、删除、修改学生基本信息,如姓名、学号、性别等;
  • 添加、删除、修改学生课程信息,如课程名称、成绩等;
  • 查询学生基本信息和课程信息;
  • 统计每个学生的成绩绩点、课程平均成绩等信息;
  • 实现各种排序和筛选功能等。

实现步骤

1. 设计数据结构

首先需要确定学生信息和成绩的数据结构。在本系统中,我们将采用结构体来表示学生和课程信息:

struct Student {
    string name; // 姓名
    string id; // 学号
    string gender; // 性别
    vector<Course> courses; // 所修课程
};

struct Course {
    string name; // 课程名称
    double score; // 成绩
};

其中,Course结构体表示一个学生所修的一门课程,包括课程名称和成绩。而Student结构体则表示一个学生的基本信息和所修课程信息,包括姓名、学号、性别和所修课程。其中,courses是一个存放Course结构体的向量。

2. 实现功能模块

根据系统功能介绍,需要实现多个功能模块,包括学生信息管理、课程信息管理、查询、统计、排序和筛选等。下面简要介绍每个模块的实现方法:

学生信息管理

学生信息管理包括添加、删除和修改学生信息。其中,添加学生信息可以通过向一个存储学生信息的向量中添加一个Student结构体实现:

void addStudent(vector<Student>& students, Student student) {
    students.push_back(student);
}

删除和修改学生信息可以通过遍历向量并查找目标学生实现:

void deleteStudent(vector<Student>& students, string id) {
    for (auto it = students.begin(); it != students.end(); it++) {
        if (it->id == id) {
            students.erase(it);
            break;
        }
    }
}

void updateStudent(vector<Student>& students, string id, Student student) {
    for (auto& s : students) {
        if (s.id == id) {
            s = student;
            break;
        }
    }
}

课程信息管理

课程信息管理包括添加、删除和修改学生所修的课程信息。其中,添加课程信息可以通过向目标学生的courses向量中添加一个Course结构体实现:

void addCourse(vector<Student>& students, string id, Course course) {
    for (auto& s : students) {
        if (s.id == id) {
            s.courses.push_back(course);
            break;
        }
    }
}

删除和修改课程信息可以通过遍历目标学生所修课程信息的向量并查找目标课程实现:

void deleteCourse(vector<Student>& students, string id, string name) {
    for (auto& s : students) {
        if (s.id == id) {
            for (auto it = s.courses.begin(); it != s.courses.end(); it++) {
                if (it->name == name) {
                    s.courses.erase(it);
                    break;
                }
            }
            break;
        }
    }
}

void updateCourse(vector<Student>& students, string id, string name, Course course) {
    for (auto& s : students) {
        if (s.id == id) {
            for (auto& c : s.courses) {
                if (c.name == name) {
                    c = course;
                    break;
                }
            }
            break;
        }
    }
}

查询

查询模块可以实现按学号或姓名查询学生信息,以及查询指定学生所修的课程信息。其中,查询学生信息可以通过遍历向量并筛选目标学生信息实现:

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

查询课程信息可以通过遍历目标学生所修课程信息的向量并查找目标课程实现:

vector<Course> searchCourse(vector<Student>& students, string id, string name) {
    for (auto& s : students) {
        if (s.id == id) {
            for (auto& c : s.courses) {
                if (c.name == name) {
                    return {c};
                }
            }
            return {};
        }
    }
    return {};
}

统计

统计模块可以实现统计所有学生的平均成绩、个人绩点和课程平均成绩等信息。其中,平均成绩和课程平均成绩可以通过遍历计算实现:

double getAverageScore(vector<Student>& students) {
    double totalScore = 0.0;
    int count = 0;
    for (auto& s : students) {
        for (auto& c : s.courses) {
            totalScore += c.score;
            count++;
        }
    }
    return totalScore / count;
}

unordered_map<string, double> getAverageCourseScore(vector<Student>& students) {
    unordered_map<string, double> result;
    unordered_map<string, int> count;
    for (auto& s : students) {
        for (auto& c : s.courses) {
            result[c.name] += c.score;
            count[c.name]++;
        }
    }
    for (auto& [name, score] : result) {
        score /= count[name];
    }
    return result;
}

个人绩点可以通过将成绩转化为绩点进行计算实现:

double getGPA(double score) {
    if (score >= 90.0) {
        return 4.0;
    } else if (score >= 80.0) {
        return 3.0;
    } else if (score >= 70.0) {
        return 2.0;
    } else if (score >= 60.0) {
        return 1.0;
    } else {
        return 0.0;
    }
}

double getPersonalGPA(vector<Course>& courses) {
    double totalGPA = 0.0;
    double totalCredit = 0.0;
    for (auto& c : courses) {
        double gpa = getGPA(c.score);
        totalGPA += gpa * 1.0; // 1.0表示课程学分
        totalCredit += 1.0;
    }
    return totalGPA / totalCredit;
}

排序和筛选

排序和筛选模块可以实现按成绩、绩点等信息排序和筛选学生信息。其中,排序可以通过调用STL算法库中的sort函数实现。需要注意的是,如果要按照某个成员变量排序,需要自定义一个比较器(比如按照成绩从高到低排序的比较器代码如下所示):

bool cmpScore(const Student& a, const Student& b) {
    double scoreA = 0.0;
    double scoreB = 0.0;
    for (auto& c : a.courses) {
        scoreA += c.score;
    }
    for (auto& c : b.courses) {
        scoreB += c.score;
    }
    return scoreA > scoreB;
}

void sortStudentByScore(vector<Student>& students) {
    sort(students.begin(), students.end(), cmpScore);
}

筛选可以通过遍历向量并筛选满足条件的目标信息实现,如筛选成绩大于某个阈值的学生信息代码如下所示:

vector<Student> filterStudentByScore(vector<Student>& students, double threshold) {
    vector<Student> result;
    for (auto& s : students) {
        double score = 0.0;
        for (auto& c : s.courses) {
            score += c.score;
        }
        if (score >= threshold) {
            result.push_back(s);
        }
    }
    return result;
}

3. 示例说明

下面以添加学生信息和添加课程信息为例,给出具体实现的示例说明。

示例1:添加学生信息

假设有一个名为students的向量存储学生信息。要想向其中添加一个名为“张三”的学生信息,可以按照如下代码进行操作:

Student zhangsan;
zhangsan.name = "张三";
zhangsan.id = "20210001";
zhangsan.gender = "男";
addStudent(students, zhangsan);

其中,Student结构体的成员变量分别为“姓名”、“学号”、“性别”,addStudent函数用于将新的学生信息添加到students向量中。

示例2:添加课程信息

假设有一个名为students的向量存储学生信息,需要向其中添加一个学号为“20210001”、课程名为“计算机导论”、成绩为90.0的成绩信息。可以按照如下代码进行操作:

Course jisuanjidao;
jisuanjidao.name = "计算机导论";
jisuanjidao.score = 90.0;
addCourse(students, "20210001", jisuanjidao);

其中,Course结构体的成员变量分别为“课程名称”、“成绩”,addCourse函数用于将新的课程信息添加到目标学生的courses向量中,目标学生的学号为“20210001”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现学生成绩管理系统 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C/C++的文件IO函数你知道吗

    C/C++的文件IO函数攻略 什么是文件IO? 文件IO(Input/Output)指的是使用程序对文件进行读写的操作。对于C/C++语言而言,文件IO是一个非常基础和常用的操作。 文件IO函数 fopen函数 用于打开一个文件,并返回一个文件指针(FILE*)。如果打开成功,则返回指向文件指针的地址,否则返回NULL。 FILE *fopen(const …

    C 2023年5月23日
    00
  • Windows 2008 R2服务管理器刷新失败的解决方法

    Windows 2008 R2服务管理器刷新失败的解决方法 在Windows Server 2008 R2操作系统中,你可能会遇到服务管理器刷新失败的问题。在本篇文章中,我们将讨论此问题的原因以及如何解决它。 问题原因 当服务管理器尝试刷新时,它将读取注册表中的服务配置信息。 如果服务配置已损坏,服务管理器将无法正确刷新服务列表。 解决方法 以下是一些方法,…

    C 2023年5月23日
    00
  • 战地4出现0xc000007b错误怎么办 具体解决方法分享

    战地4出现0xc000007b错误怎么办?——具体解决方法分享 问题描述 在运行战地4时,可能会遇到“0xc000007b”错误,导致游戏无法启动或崩溃。这种错误通常是由多个因素引起的,包括操作系统、软件与驱动程序的错误等。 解决方法 以下提供几种解决“0xc000007b”错误的方法。 方法一:安装最新的操作系统更新 在Windows 10上,您可以打开“…

    C 2023年5月23日
    00
  • U盘双击后无法打开并提示找不到应用程序的原因及解决

    针对“U盘双击后无法打开并提示找不到应用程序”的问题,我们可以进行以下的解决攻略: 原因分析 U盘病毒感染:一些恶意病毒会将U盘上的文件属性进行篡改,导致无法打开并提示找不到应用程序; 应用程序被误删或损坏:在使用U盘的过程中,如果应用程序被误删或者损坏,也会导致U盘双击后无法打开并提示找不到应用程序; U盘上的文件格式不受系统识别:如果U盘上的文件格式不被…

    C 2023年5月23日
    00
  • C++实现对RGB图片进行编码的示例代码

    首先,对于RGB图片的编码,我们需要将RGB颜色空间中的每个像素点转换为对应的YUV颜色空间中的亮度值Y和色度值U、V。这一步可以通过计算公式进行:Y = 0.299R + 0.587G + 0.114B,U = 0.492(B – Y),V = 0.877(R – Y),其中R、G、B分别是像素点在RGB颜色空间中的红、绿、蓝值。 示例代码1:将RGB图片…

    C 2023年5月24日
    00
  • C语言实现简易计算器功能

    C语言实现简易计算器功能 简介 计算器是程序员开发中常用的功能之一。实现计算器功能可以提高自己的编程能力,同时也是开发其它应用程序的基础。在本文中,我们将讲解如何使用C语言实现一个简单的计算器。 实现步骤 以下是实现计算器功能的步骤: 获取用户输入的算式; 分解算式,将每个操作数和运算符都存储到相应的变量中; 根据运算符计算结果; 输出结果。 代码示例 下面…

    C 2023年5月23日
    00
  • C程序 二进制字符串求和

    “C程序 二进制字符串求和”是一道简单的计算机编程题目,通过该程序可以计算两个输入的二进制字符串的和。下面是该程序的完整使用攻略。 1. 程序准备 在使用该程序前,需要在计算机上安装C编译器,例如gcc或者clang。编译器的具体安装方法可以参考不同操作系统的安装指南。 安装完编译器之后,需要下载并解压缩本程序的源代码压缩包,进入解压缩后的目录,找到main…

    C 2023年5月9日
    00
  • C语言中字符串的两种定义方式详解

    C语言中字符串的两种定义方式详解 什么是字符串? 字符串(string)是由一串字符(character)组成的序列,其中每个字符占据一个字节。在C语言中,字符串以null字符(\0)结尾,因此任何一个字符串都都包含了一个null字符。null字符不是可打印字符,而是一个表示字符串结尾的特殊符号。 直接定义字符串 在C语言中,我们可以直接定义一个字符串,定义…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部