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语言实现2D赛车游戏的示例代码

    下面我将详细讲解如何实现一个简单的2D赛车游戏。 1. 实现思路 首先,我们需要了解游戏的基本组成部分: 游戏场景 赛车模型 道路模型 背景音乐 操作控制 根据以上组成部分,我们可以总体将实现思路分为以下几个步骤: 创建画布:使用某种绘图库创建基础画布,用于绘制游戏场景。 绘制游戏场景:在基础画布上绘制游戏所需的场景元素,包括道路和赛车模型。 添加背景音乐:…

    C 2023年5月23日
    00
  • 让PHP以ROOT权限执行系统命令的方法

    为了让PHP以ROOT权限执行系统命令,我们可以采用以下几种方法: 方法一:利用sudo命令 首先需要确保服务器上已经安装sudo,并且已经配置好了sudoers文件,即在sudoers文件中添加了允许PHP执行特定命令的规则,例如: www-data ALL=(ALL:ALL) NOPASSWD: /usr/bin/command 其中,www-data是…

    C 2023年5月22日
    00
  • Python机器学习之AdaBoost算法

    Python机器学习之AdaBoost算法 简介 AdaBoost(Adaptive Boosting)是一个非常流行的机器学习算法,它能够提高弱分类算法的准确性。其中,“自适应”指的是每个分类器的权重会随着准确率的变化而动态调整,而“增量”则表示每个分类器都是基于之前分类器的结果进行训练的。 原理 AdaBoost的基本算法如下: 初始化数据集权重 $w_…

    C 2023年5月23日
    00
  • JS中的Error对象及使用JSON.stringify()序列化Error问题

    JS中的Error对象是用于处理和抛出错误的一种内置类型,它有以下几个属性: name:Error对象的名称,默认为“Error”。 message:错误消息,通常是人类可读的信息。 stack:当前调用栈的字符串表示,用于调试目的。 当发生错误时,可以使用以下语法创建一个Error对象: throw new Error(‘错误消息’); 这会把错误消息作为…

    C 2023年5月23日
    00
  • 6个变态的C语言Hello World程序

    当我们学习一门新的编程语言时,最基础的就是编写一个简单的“Hello World”程序。而C语言的“Hello World”程序在使用中可能会涉及到一些变态的写法,下面就来介绍一下六个变态的C语言“Hello World”程序和详细的编写攻略。 1. hello.c中没有main函数 这个程序的奇妙之处在于,它根本没有main函数,却可以输出“Hello, …

    C 2023年5月30日
    00
  • c++ 内联函数和普通函数的区别

    C++中内联函数和普通函数都是函数的两种实现方式。内联函数是C++特有的一种函数实现方式,主要把函数的内容直接嵌入到调用语句中,而不是像普通函数那样调用函数。 内联函数和普通函数的区别 内联函数的调用时间和执行时间比普通函数更快。这是因为内联函数会把函数的内容嵌入到调用语句中,避免了函数调用的开销。而普通函数调用则需要跳转到函数执行的地址去执行。这样一来,在…

    C 2023年5月22日
    00
  • 浅析C语言中assert的用法

    浅析C语言中assert的用法 什么是assert? assert是一个宏定义,一般用于程序调试时,验证程序中的某些假设,并在假设为false时终止程序执行。一般情况下,assert被用于测试函数的参数是否正确,或者程序是否处于正确的状态。 assert的使用方法 assert头文件在C语言中是,调用assert需要两个参数,第一个参数是需要验证的假设表达式…

    C 2023年5月23日
    00
  • C语言中如何进行泛型编程?

    在C语言中进行泛型编程有多种方式,其中比较常用的方法是通过宏定义和结构体实现,下面分别介绍这两种方法的具体实现。 通过宏定义实现泛型编程 在C语言中,可以使用宏定义实现泛型函数的定义和调用。具体实现方式如下: 定义泛型函数的宏定义,例如下面定义了一个泛型的swap函数宏: #define SWAP(type, a, b) { type temp = a; a…

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