学生成绩管理系统的设计和实现

本文详细描述了一款使用C++和面向对象技术构建的学生成绩管理系统,涵盖功能设计、目标、技术选型、测试案例及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、设计内容

实现了一个学生成绩管理系统,可以用来管理学生的基本信息和成绩信息。它提供了多种功能,包括录入学生信息、修改学生成绩、删除学生信息、增加学生信息、计算总分和平均分、查询学生信息、查询班级信息、成绩排序和统计班级不及格人数等。

二、设计目标

目标旨在实现一个功能完善、易于使用的学生成绩管理系统。它应该能够满足教师和学生对于成绩管理的各种需求,提供快捷、准确、可靠的服务。

三、设计技术

系统设计使用了C++ 语言和面向对象程序设计的方法来实现。它使用了类和对象来封装数据和操作,定义了 `Student` 类和 `StudentManager` 类来分别表示学生和学生管理器。这两个类都包含了数据成员和成员函数,用来存储数据和实现操作。

四、设计细节

细节使用了文件输入输出流来从文件中读取学生信息和将学生信息保存到文件中。它还使用了类和对象来封装数据和操作,提高代码的可读性和可维护性。在处理各种功能时,都遵循模块化、结构化的原则,将程序划分为若干个模块,每个模块负责实现一个特定的功能。

五、系统程序测试

(1)测试用例

测试用例应该覆盖程序的各个功能,包括录入学生信息、修改学生成绩、删除学生信息、增加学生信息、计算总分和平均分、查询学生信息、查询班级信息、成绩排序和统计班级不及格人数等。对于每个功能,都应该编写若干个测试用例,包括正常情况和异常情况。

l 录入学生信息:

这个功能可以从文件中读取学生信息,并将其存储到程序中。它使用了文件输入流来读取文件中的数据,并使用Student 类的构造函数来创建学生对象。

l 修改学生成绩:

这个功能可以修改指定学生的成绩。它首先根据用户输入的学号或姓名查找学生,然后调用Student 类的 updateScore 函数来修改学生的成绩。

l 删除学生信息:

这个功能可以删除指定学生的信息。它首先根据用户输入的学号或姓名查找学生,然后将其从程序中删除。

l 增加学生信息:

这个功能可以增加新的学生信息。它根据用户输入的数据创建一个新的学生对象,并将其添加到程序中。

l 计算总分和平均分:

这个功能可以计算所有学生的总分和平均分。它遍历所有学生,计算每个学生的总分和平均分,并输出结果。

l 查询学生信息:

这个功能可以查询指定学生的信息。它首先根据用户输入的学号或姓名查找学生,然后输出该学生的详细信息。

l 查询班级信息:

这个功能可以查询指定班级的信息。它遍历所有学生,找到属于指定班级的学生,并输出他们的详细信息。

l 成绩排序:

这个功能可以对所有学生的成绩进行排序。它根据用户输入的排序方式(升序或降序),使用冒泡排序算法对所有学生进行排序。

l 统计班级不及格人数:

这个功能可以统计指定班级中每门课程的不及格人数。它遍历所有属于指定班级的学生,统计每门课程的不及格人数,并输出结果。

(2)测试结果与分析

分析测试结果,可以分析程序的正确性,并对程序进行改进。如果发现程序存在错误或者不足之处,应该及时修改并重新测试。

系统测试运行界面:

功能1:文本录入(如下图所示)

成功查询到文件录入的学生信息和成绩。

功能2:修改成绩

(修改成绩前)

(修改成绩后)

功能3:删除成绩

删除该学生成绩信息后,未查询到该学生,说明功能3能成功运行。

功能4:增加成绩

实现查询一个未增加的学生的学号,结果自然是未查询到。然后开始增加该名学号的学生。

增加该名学号的学生后查询

成功查询到改名学号的学生,增加功能成功。

功能5:计算总分和平均分

计算总分和平均分运行成功。

功能6:查询成绩

成功查询到学号为6号的学生成绩信息,功能6查询可以运行。

功能7:查询班级信息

查询班级信息成功,说明功能7成功运行。

功能8:成绩排序

这个是升序排序,运行成功。

下面是运行按降序排序功能,看是否能正常运行。结果如下图:

结果显示能成功按降序进行学生成绩的排序,说明升序和降序排序都能运行成功。功能8没问题。

功能9:统计班级不及格人数

查询到5班每门专业课均有不及格人数,说明功能9能成功统计班级不及格人数。

功能0:退出系统

功能0成功退出了系统,说明该功能有效。

以上是系统的全部功能测试,均已测试完毕,都是没有问题的,能正常运行。程序测试部分已经结束。

六、完整系统代码展示

#include <iostream>
#include <cstring>
#include <fstream>
#include <sstream>
#include <algorithm>
using namespace std;
const int MAX_STUDENTS = 1000;

class Student
{
public:
    string id;
    string name;
    string gender;
    string classId;
    int scores[5];
    int totalScore;
    double averageScore;
public:
    Student();
    Student(string Id, string Name, string Gender, string ClassId, int Scores[]);
    void updateScore(int subjectIndex, int newScore);
};

Student::Student(string Id, string Name, string Gender, string ClassId, int Scores[])
{
    id = Id;
    name = Name;
    gender = Gender;
    classId = ClassId;
    totalScore = 0;
    averageScore = 0;
    for (int i = 0; i < 5; i++)
    {
        scores[i] = Scores[i];
        totalScore += Scores[i];
    }
    averageScore = totalScore / 5.0;
}

Student::Student()
{
    totalScore = 0;
    averageScore = 0;
    for (int i = 0; i < 5; i++)
    {
        scores[i] = 0;
    }
}

void Student::updateScore(int subjectIndex, int newScore)
{
    totalScore -= scores[subjectIndex];
    scores[subjectIndex] = newScore;
    totalScore += newScore;
    averageScore = totalScore / 5.0;
}

class StudentManager
{
private:
    Student students[MAX_STUDENTS];
    int studentCount;
public:
    StudentManager();
    void loadStudents();
    void saveStudents();
    void addStudent(Student student);
    void deleteStudent(string idOrName);
    void updateStudent(string idOrName, int subjectIndex, int newScore);
    void printStudent(Student student);
    void printStudents();
    void queryStudent(string idOrName);
    void queryClass(string classId);
    void sortStudents(int order);
    void countFailures(string classId);
};

StudentManager::StudentManager()
{
    studentCount = 0;
}

void StudentManager::loadStudents()
{
    ifstream file("students.txt");
    if (file.is_open())
    {
        string line;
        while (getline(file, line))
        {
            istringstream iss(line);
            string id, name, gender, classId;
            int scores[5] = { 0 };
            iss >> id >> name >> gender >> classId;
            for (int i = 0; i < 5; i++)
            {
                iss >> scores[i];
            }
            students[studentCount++] = Student(id, name, gender, classId, scores);
        }
        file.close();
    }
}

void StudentManager::saveStudents()
{
    ofstream file("students.txt");
    if (file.is_open())
    {
        for (int i = 0; i < studentCount; i++)
        {
            Student student = students[i];
            file << student.id << " " << student.name << " " << student.gender << " " << student.classId << " ";
            for (int j = 0; j < 5; j++)
            {
                file << student.scores[j] << " ";
            }
            file << endl;
        }
        file.close();
    }
}

void StudentManager::addStudent(Student student)
{
    students[studentCount++] = student;
}

void StudentManager::deleteStudent(string idOrName)
{
    int index = -1;
    for (int i = 0; i < studentCount; i++)
    {
        if (students[i].id == idOrName || students[i].name == idOrName)
        {
            index = i;
            break;
        }
    }
    if (index != -1)
    {
        for (int i = index; i < studentCount - 1; i++)
        {
            students[i] = students[i + 1];
        }
        studentCount--;
        cout << "删除成功" << endl;
    }
    else
    {
        cout << "未找到该学生" << endl;
    }
}

void StudentManager::updateStudent(string idOrName, int subjectIndex, int newScore)
{
    int index = -1;
    for (int i = 0; i < studentCount; i++)
    {
        if (students[i].id == idOrName || students[i].name == idOrName) 
        {
            index = i;
            break;
        }
    }
    if (index != -1)
    {
        students[index].updateScore(subjectIndex, newScore);
        cout << "修改成功" << endl;
    }
    else
    {
        cout << "未找到该学生" << endl;
    }
}

void StudentManager::printStudent(Student student)
{
    cout << "学号:" << student.id << " " << "姓名:" << student.name << " " << "性别:" <<
        student.gender << " " << "班级:" << student.classId;
    cout << " 各科成绩:";
    for (int i = 0; i < 5; i++)
    {
        cout << student.scores[i] << " ";
    }
    cout << "总成绩:" << student.totalScore << " " << "平均成绩:" << student.averageScore << endl;
}

void StudentManager::printStudents()
{
    for (int i = 0; i < studentCount; i++)
    {
        printStudent(students[i]);
    }
}

void StudentManager::queryStudent(string idOrName)
{
    int index = -1;
    for (int i = 0; i < studentCount; i++)
    {
        if (students[i].id == idOrName || students[i].name == idOrName)
        {
            index = i;
            break;
        }
    }
    if (index != -1)
    {
        Student student = students[index];
        cout << "学号:" << student.id << " " << "姓名:" << student.name << " " <<
            "性别:" << student.gender << " " << "班级:" << student.classId << " ";
        cout << " 各科成绩:";
        for (int i = 0; i < 5; i++) 
        {
            cout << student.scores[i] << " ";
        }
        cout << "总成绩:" << student.totalScore << " " << "平均成绩:" << student.averageScore << endl;
    }
    else
    {
        cout << "未找到该学生" << endl;
    }
}

void StudentManager::queryClass(string classId)
{
    for (int i = 0; i < studentCount; i++)
    {
        if (students[i].classId == classId)
        {
            printStudent(students[i]);
        }
    }
}

void StudentManager::sortStudents(int order)
{
    if (order == 1)
    {
        for (int i = 0; i < studentCount - 1; i++)
        {
            for (int j = 0; j < studentCount - i - 1; j++)
            {
                if (students[j].averageScore > students[j + 1].averageScore)
                {
                    swap(students[j], students[j + 1]);
                }
            }
        }
    }
    else if (order == 2)
    {
        for (int i = 0; i < studentCount - 1; i++)
        {
            for (int j = 0; j < studentCount - i - 1; j++)
            {
                if (students[j].averageScore < students[j + 1].averageScore)
                {
                    swap(students[j], students[j + 1]);
                }
            }
        }
    }
}

void StudentManager::countFailures(string classId)
{
    int failures[5] = { 0 };
    for (int i = 0; i < studentCount; i++)
    {
        if (students[i].classId == classId)
        {
            for (int j = 0; j < 5; j++)
            {
                if (students[i].scores[j] < 60)
                {
                    failures[j]++;
                }
            }
        }
    }
    for (int i = 0; i < 5; i++)
    {
        cout << "专业课" << i + 1 << "不及格人数:" << failures[i] << endl;
    }
}

void menu()
{
    cout << " 学生成绩管理 " << endl;
    cout << "               " << endl;
    cout << "===============" << endl;
    cout << "1.录入学生信息" << endl;
    cout << "2.修改学生成绩" << endl;
    cout << "3.删除学生信息" << endl;
    cout << "4.增加学生信息" << endl;
    cout << "5.计算总分和平均分" << endl;
    cout << "6.查询学生信息" << endl;
    cout << "7.查询班级信息" << endl;
    cout << "8.成绩排序" << endl;
    cout << "9.统计班级不及格人数" << endl;
    cout << "0.退出系统" << endl;
    cout << "===============" << endl;
}

int main()
{
    StudentManager studentManager;
    studentManager.loadStudents();
    while (true)
    {
        menu();
        cout << "请输入选择:";
        int choice;
        cin >> choice;
        switch (choice)
        {
            case 1:
            {
                studentManager.loadStudents();
                system("pause");
                system("cls");
                break;
            }
            case 2:
            {
                string idOrName;
                cout << "请输入学号或姓名:";
                cin >> idOrName;
                int subjectIndex;
                cout << "请输入要修改的专业课序号(1-5):";
                cin >> subjectIndex;
                subjectIndex--;
                int newScore;
                cout << "请输入新成绩:";
                cin >> newScore;
                studentManager.updateStudent(idOrName, subjectIndex, newScore);
                system("pause");
                system("cls");
                break;
            }
            case 3:
            {
                string idOrName;
                cout << "请输入学号或姓名:";
                cin >> idOrName;
                studentManager.deleteStudent(idOrName);
                system("pause");
                system("cls");
                break;
            }
            case 4:
            {
                string id, name, gender, classId;
                int scores[5] = { 0 };
                cout << "请输入学号:";
                cin >> id;
                cout << "请输入姓名:";
                cin >> name;
                cout << "请输入性别:";
                cin >> gender;
                cout << "请输入班级:";
                cin >> classId;
                cout << "请输入五门专业课成绩:";
                for (int i = 0; i < 5; i++)
                {
                    cin >> scores[i];
                }
                studentManager.addStudent(Student(id, name, gender, classId, scores));
                cout << "增加成功" << endl;
                system("pause");
                system("cls");
                break;
            }
            case 5:
            {
                studentManager.printStudents();
                system("pause");
                system("cls");
                break;
            }
            case 6:
            {
                string idOrName;
                cout << "请输入学号或姓名:";
                cin >> idOrName;
                studentManager.queryStudent(idOrName);
                system("pause");
                system("cls");
                break;
            }
            case 7:
            {
                string classId;
                cout << "请输入班级:";
                cin >> classId;
                studentManager.queryClass(classId);
                system("pause");
                system("cls");
                break;
            }
            case 8:
            {
                int order;
                cout << "请输入排序方式(1-升序,2-降序):";
                cin >> order;
                studentManager.sortStudents(order);
                studentManager.printStudents();
                system("pause");
                system("cls");
                break;
            }
            case 9:
            {
                string classId;
                cout << "请输入班级:";
                cin >> classId;
                studentManager.countFailures(classId);
                system("pause");
                system("cls");
                break;
            }
            case 0:
            {
                studentManager.saveStudents();
                system("pause");
                system("cls");
                return 0;
            }
            default:
                break;
        }
    }
    return 0;
}

七、系统设计总结

总结实现了一个功能完善、易于使用的学生成绩管理系统。它采用面向对象程序设计的方法,使用了类和对象来封装数据和操作。在实现过程中遇到了一些问题,但都得到了妥善解决。通过这个课题,学习者可以更好地掌握C++ 语言和面向对象程序设计的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值