学生成绩管理系统设计

这篇文章描述了一个使用C++编程实现的学生成绩管理系统,利用面向对象编程的概念,如继承、抽象类、虚函数等,设计了添加、查询、显示、编辑、删除等功能,并涉及文件的输入/输出,用于存储和读取学生记录,同时支持统计和排序功能。
  • 问题描述

学生信息包括:学号、姓名、性别、年龄、班级等信息。
小学生除了包括学生所有信息外,还包括英语、数学和语文成绩。中学生除了包括小学生所有信息外,还包括地理、历史成绩。
大学生除了包括学生所有信息外,还包括专业、英语、程序设计和高等数学等课程。设计一程序能够对学生成绩进行管理,应用到继承、抽象类、虚函数、虚基类、多态和文件的输入/输出等内容。

  • 功能要求

(1)添加功能:程序能够添加不同学生的记录,提供选择界面供用户选择所要添加的类别,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:可根据学号、姓名等信息对已添加的学生记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
(3)显示功能:可显示当前系统中所有学生的记录,每条记录占据一行。
(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意学号的唯一性。
(5)删除功能:主要实现对已添加的学生记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。
(6)统计功能:能根据多种参数进行统计。能统计学生人数、总分、单科的平均分等。
(7)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。
(8)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。
(9)排序功能:可按总分和单科成绩排名次。

  • 问题的解决方案

根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告。

  • 思路介绍:

    根据问题描述的功能要求,我们可以设计一个学生成绩管理系统。下面是该系统的解决方案及代码思路:

    1. 创建基类(BaseClass):包含学号(id)、姓名(name)、性别(gender)、年龄(age)和班级(class)等基本信息。

    2. 创建派生类:
       - 小学生(PrimaryStudent):继承自基类,额外包括英语成绩(englishScore)、数学成绩(mathScore)和语文成绩(chineseScore)。
       - 中学生(MiddleStudent):继承自小学生类,额外包括地理成绩(geographyScore)和历史成绩(historyScore)。
       - 大学生(CollegeStudent):继承自基类,额外包括专业(major)、英语成绩(englishScore)、程序设计成绩(programmingScore)和高等数学成绩(mathScore)。

    3. 实现添加功能:
       - 提供选择界面,让用户选择要添加的学生类别(小学生、中学生、大学生)。
       - 用户输入学生信息并检查学号是否唯一。
       - 根据选择的类别创建对应的学生对象,并将学生对象添加到系统中的学生记录列表。

    4. 实现查询功能:
       - 提供界面让用户选择查询条件(学号、姓名等)。
       - 根据用户选择的条件从学生记录列表中查找匹配的学生对象。
       - 如果找到匹配的学生对象,显示相应的记录信息;如果未找到,给出提示信息。

    5. 实现显示功能:
       - 遍历学生记录列表,逐个显示学生对象的信息。

    6. 实现编辑功能:
       - 提供界面让用户选择要编辑的学生记录(可以根据查询结果选择)。
       - 用户修改学生信息,注意学号的唯一性检查。

    7. 实现删除功能:
       - 提供界面让用户选择要删除的学生记录(可以根据查询结果选择)。
       - 从学生记录列表中删除选定的学生对象。

    8. 实现统计功能:
       - 统计学生人数:计算学生记录列表的长度。
       - 统计总分:遍历学生记录列表,累加各个学生对象的成绩。
       - 统计单科平均分:遍历学生记录列表,根据类别判断所需计算的科目,并计算平均分。

    9. 实现保存和读取功能:
       - 将学生记录列表存储到文件中,可以使用任意的存储方式(如文本文件、二进制文件等)。
       - 从文件中读取保存的学生记录信息,重新构建学生记录列表。

    10. 实现排序功能:
        - 按照总分排序:对学生记录列表进行排序,可以使用快速排序、冒泡排序等算法。
        - 按照单科成绩排序:根据类别判断所需排序的科目,对学生记录列表进行排序。

    通过以上步骤,可以设计出一个能够对学生成绩进行管理的程序。
     

    #include<iostream>
    #include<fstream>
    #include<vector>
    
    using namespace std;
    
    class Student {
    protected:
        string studentNumber;
        string name;
        string gender;
        int age;
        string className;
    
    public:
        Student(string studentNumber, string name, string gender, int age, string className)
            : studentNumber(studentNumber), name(name), gender(gender), age(age), className(className) {}
    
        void display() {
            cout << "Student Number: " << studentNumber << endl;
            cout << "Name: " << name << endl;
            cout << "Gender: " << gender << endl;
            cout << "Age: " << age << endl;
            cout << "Class: " << className << endl;
        }
    
        string getStudentNumber() {
            return studentNumber;
        }
    };
    
    class ElementaryStudent : public Student {
    private:
        int englishGrade;
        int mathGrade;
        int chineseGrade;
    
    public:
        ElementaryStudent(string studentNumber, string name, string gender, int age, string className,
            int englishGrade, int mathGrade, int chineseGrade)
            : Student(studentNumber, name, gender, age, className),
            englishGrade(englishGrade), mathGrade(mathGrade), chineseGrade(chineseGrade) {}
    
        void display() {
            Student::display();
            cout << "English Grade: " << englishGrade << endl;
            cout << "Math Grade: " << mathGrade << endl;
            cout << "Chinese Grade: " << chineseGrade << endl;
        }
    
        int calculateTotalGrade() {
            return englishGrade + mathGrade + chineseGrade;
        }
    };
    
    class MiddleStudent : public ElementaryStudent {
    private:
        int geographyGrade;
        int historyGrade;
    
    public:
        MiddleStudent(string studentNumber, string name, string gender, int age, string className,
            int englishGrade, int mathGrade, int chineseGrade, int geographyGrade, int historyGrade)
            : ElementaryStudent(studentNumber, name, gender, age, className, englishGrade, mathGrade, chineseGrade),
            geographyGrade(geographyGrade), historyGrade(historyGrade) {}
    
        void display() {
            ElementaryStudent::display();
            cout << "Geography Grade: " << geographyGrade << endl;
            cout << "History Grade: " << historyGrade << endl;
        }
    
        int calculateTotalGrade() {
            return ElementaryStudent::calculateTotalGrade() + geographyGrade + historyGrade;
        }
    };
    
    class CollegeStudent : public Student {
    private:
        string major;
        int englishGrade;
        int programDesignGrade;
        int advancedMathGrade;
    
    public:
        CollegeStudent(string studentNumber, string name, string gender, int age, string className,
            string major, int englishGrade, int programDesignGrade, int advancedMathGrade)
            : Student(studentNumber, name, gender, age, className),
            major(major), englishGrade(englishGrade), programDesignGrade(programDesignGrade), advancedMathGrade(advancedMathGrade) {}
    
        void display() {
            Student::display();
            cout << "Major: " << major << endl;
            cout << "English Grade: " << englishGrade << endl;
            cout << "Program Design Grade: " << programDesignGrade << endl;
            cout << "Advanced Math Grade: " << advancedMathGrade << endl;
        }
    
        int calculateTotalGrade() {
            return englishGrade + programDesignGrade + advancedMathGrade;
        }
    };
    
    class GradeManager {
    private:
        vector<Student*> students;
    
    public:
        void addStudent(Student* student) {
            string studentNumber = student->getStudentNumber();
    
            for (Student* s : students) {
                if (s->getStudentNumber() == studentNumber) {
                    cout << "Duplicate student number! Cancel adding." << endl;
                    return;
                }
            }
    
            students.push_back(student);
            cout << "Student added successfully." << endl;
        }
    
        void displayAllStudents() {
            int count = 1;
    
            for (Student* s : students) {
                cout << "Student " << count++ << ":" << endl;
                s->display();
                cout << endl;
            }
        }
    
        Student* searchStudent(string studentNumber) {
            for (Student* s : students) {
                if (s->getStudentNumber() == studentNumber) {
                    return s;
                }
            }
    
            return nullptr;
        }
    
        void editStudent(string studentNumber) {
            Student* student = searchStudent(studentNumber);
    
            if (student == nullptr) {
                cout << "Student not found." << endl;
                return;
            }
    
            // Edit the student's information
            // ...
    
            cout << "Student edited successfully." << endl;
        }
    
        void deleteStudent(string studentNumber) {
            for (auto it = students.begin(); it != students.end(); ++it) {
                if ((*it)->getStudentNumber() == studentNumber) {
                    students.erase(it);
                    cout << "Student deleted successfully." << endl;
                    return;
                }
            }
    
            cout << "No matching student found." << endl;
        }
    
        int calculateTotalStudents() {
            return students.size();
        }
    
        int calculateTotalGrade() {
            int totalGrade = 0;
    
            for (Student* s : students) {
                totalGrade += s->calculateTotalGrade();
            }
    
            return totalGrade;
        }
    
        double calculateAverageGrade() {
            int totalGrade = calculateTotalGrade();
            int totalStudents = calculateTotalStudents();
    
            if (totalStudents != 0) {
                return static_cast<double>(totalGrade) / totalStudents;
            }
            else {
                return 0;
            }
        }
    
        void saveToFile(string filename) {
            ofstream outFile(filename);
    
            if (outFile.is_open()) {
                for (Student* s : students) {
                    // Write student information to the file
                    outFile << s->getStudentNumber() << endl;
                    outFile << s->name << endl;
                    outFile << s->gender << endl;
                    outFile << s->age << endl;
                    outFile << s->className << endl;
    
                    // Write additional information based on student type
                    ElementaryStudent* eS = dynamic_cast<ElementaryStudent*>(s);
                    if (eS != nullptr) {
                        outFile << "elementary" << endl;
                        outFile << eS->englishGrade << endl;
                        outFile << eS->mathGrade << endl;
                        outFile << eS->chineseGrade << endl;
                    }
    
                    MiddleStudent* mS = dynamic_cast<MiddleStudent*>(s);
                    if (mS != nullptr) {
                        outFile << "middle" << endl;
                        outFile << mS->geographyGrade << endl;
                        outFile << mS->historyGrade << endl;
                    }
    
                    CollegeStudent* cS = dynamic_cast<CollegeStudent*>(s);
                    if (cS != nullptr) {
                        outFile << "college" << endl;
                        outFile << cS->major << endl;
                        outFile << cS->englishGrade << endl;
                        outFile << cS->programDesignGrade << endl;
                        outFile << cS->advancedMathGrade << endl;
                    }
                }
    
                outFile.close();
                cout << "Data saved to file." << endl;
            }
            else {
                cout << "Error opening file." << endl;
            }
        }
    
        void readFromFile(string filename) {
            ifstream inFile(filename);
    
            if (inFile.is_open()) {
                students.clear();
    
                string studentNumber, name, gender, className;
                int age;
                string type;
    
                while (!inFile.eof()) {
                    getline(inFile, studentNumber);
                    getline(inFile, name);
                    getline(inFile, gender);
                    inFile >> age;
                    inFile.ignore();
                    getline(inFile, className);
                    getline(inFile, type);
    
                    if (type == "elementary") {
                        int englishGrade, mathGrade, chineseGrade;
                        inFile >> englishGrade >> mathGrade >> chineseGrade;
                        inFile.ignore();
    
                        ElementaryStudent* eS = new ElementaryStudent(studentNumber, name, gender, age,
                            className, englishGrade, mathGrade, chineseGrade);
                        students.push_back(eS);
                    }
                    else if (type == "middle") {
                        int englishGrade, mathGrade, chineseGrade, geographyGrade, historyGrade;
                        inFile >> englishGrade >> mathGrade >> chineseGrade >> geographyGrade >> historyGrade;
                        inFile.ignore();
    
                        MiddleStudent* mS = new MiddleStudent(studentNumber, name, gender, age, className,
                            englishGrade, mathGrade, chineseGrade, geographyGrade, historyGrade);
                        students.push_back(mS);
                    }
                    else if (type == "college") {
                        string major;
                        int englishGrade, programDesignGrade, advancedMathGrade;
                        inFile >> major >> englishGrade >> programDesignGrade >> advancedMathGrade;
                        inFile.ignore();
    
                        CollegeStudent* cS = new CollegeStudent(studentNumber, name, gender, age, className,
                            major, englishGrade, programDesignGrade, advancedMathGrade);
                        students.push_back(cS);
                    }
                }
    
                inFile.close();
                cout << "Data read from file." << endl;
            }
            else {
                cout << "Error opening file." << endl;
            }
        }
    };
    
    int main() {
        GradeManager gradeManager;
        string filename = "students.txt";
    
        // Add some sample students
        ElementaryStudent* elementary1 = new ElementaryStudent("001", "John Doe", "Male", 10, "Grade 1",
            80, 90, 85);
        gradeManager.addStudent(elementary1);
    
        MiddleStudent* middle1 = new MiddleStudent("002", "Jane Smith", "Female", 13, "Grade 7",
            75, 82, 78, 90, 85);
        gradeManager.addStudent(middle1);
    
        CollegeStudent* college1 = new CollegeStudent("003", "Tom Johnson", "Male", 18, "Major 1",
            "Computer Science", 80, 90, 85);
        gradeManager.addStudent(college1);
    
        int choice;
    
        do {
            cout << "********** Grade Management System **********" << endl;
            cout << "1. Add Student" << endl;
            cout << "2. Search Student" << endl;
            cout << "3. Display All Students" << endl;
            cout << "4. Edit Student" << endl;
            cout << "5. Delete Student" << endl;
            cout << "6. Calculate Statistics" << endl;
            cout << "7. Save Data to File" << endl;
            cout << "8. Read Data from File" << endl;
            cout << "9. Exit" << endl;
            cout << "********************************************" << endl;
            cout << "Enter your choice: ";
            cin >> choice;
            cin.ignore();
    
            switch (choice) {
            case 1:
                // Add Student
                string studentNumber, name, gender, className, major;
                int age, englishGrade, mathGrade, chineseGrade, geographyGrade, historyGrade,
                    programDesignGrade, advancedMathGrade;
    
                cout << "Enter student number: ";
                getline(cin, studentNumber);
                cout << "Enter name: ";
                getline(cin, name);
                cout << "Enter gender: ";
                getline(cin, gender);
                cout << "Enter age: ";
                cin >> age;
                cin.ignore();
                cout << "Enter class name: ";
                getline(cin, className);
    
                cout << "*********************" << endl;
                cout << "Select student type:" << endl;
                cout << "1. Elementary Student" << endl;
                cout << "2. Middle Student" << endl;
                cout << "3. College Student" << endl;
                cout << "*********************" << endl;
                cout << "Enter your choice: ";
                int typeChoice;
                cin >> typeChoice;
                cin.ignore();
    
                switch (typeChoice) {
                case 1:
                    // Elementary Student
                    cout << "Enter English Grade: ";
                    cin >> englishGrade;
                    cout << "Enter Math Grade: ";
                    cin >> mathGrade;
                    cout << "Enter Chinese Grade: ";
                    cin >> chineseGrade;
    
                    ElementaryStudent* elementary = new ElementaryStudent(studentNumber, name, gender, age,
                        className, englishGrade, mathGrade, chineseGrade);
                    gradeManager.addStudent(elementary);
                    break;
                case 2:
                    // Middle Student
                    cout << "Enter English Grade: ";
                    cin >> englishGrade;
                    cout << "Enter Math Grade: ";
                    cin >> mathGrade;
                    cout << "Enter Chinese Grade: ";
                    cin >> chineseGrade;
                    cout << "Enter Geography Grade: ";
                    cin >> geographyGrade;
                    cout << "Enter History Grade: ";
                    cin >> historyGrade;
    
                    MiddleStudent* middle = new MiddleStudent(studentNumber, name, gender, age, className,
                        englishGrade, mathGrade, chineseGrade, geographyGrade, historyGrade);
                    gradeManager.addStudent(middle);
                    break;
                case 3:
                    // College Student
                    cout << "Enter major: ";
                    getline(cin, major);
                    cout << "Enter English Grade: ";
                    cin >> englishGrade;
                    cout << "Enter Program Design Grade: ";
                    cin >> programDesignGrade;
                    cout << "Enter Advanced Math Grade: ";
                    cin >> advancedMathGrade;
    
                    CollegeStudent* college = new CollegeStudent(studentNumber, name, gender, age, className,
                        major, englishGrade, programDesignGrade, advancedMathGrade);
                    gradeManager.addStudent(college);
                    break;
                default:
                    cout << "Invalid choice." << endl;
                    break;
                }
    
                break;
            case 2:
                // Search Student
                cout << "Enter student number to search: ";
                getline(cin, studentNumber);
    
                Student* result = gradeManager.searchStudent(studentNumber);
    
                if (result != nullptr) {
                    result->display();
                }
                else {
                    cout << "Student not found." << endl;
                }
    
                break;
            case 3:
                // Display All Students
                gradeManager.displayAllStudents();
                break;
            case 4:
                // Edit Student
                cout << "Enter student number to edit: ";
                getline(cin, studentNumber);
                gradeManager.editStudent(studentNumber);
                break;
            case 5:
                // Delete Student
                cout << "Enter student number to delete: ";
                getline(cin, studentNumber);
                gradeManager.deleteStudent(studentNumber);
                break;
            case 6:
                // Calculate Statistics
                cout << "Total students: " << gradeManager.calculateTotalStudents() << endl;
                cout << "Total grade: " << gradeManager.calculateTotalGrade() << endl;
                cout << "Average grade: " << gradeManager.calculateAverageGrade() << endl;
                break;
            case 7:
                // Save Data to File
                gradeManager.saveToFile(filename);
                break;
            case 8:
                // Read Data from File
                gradeManager.readFromFile(filename);
                break;
            case 9:
                // Exit
                cout << "Exiting program..." << endl;
                break;
            default:
                cout << "Invalid choice." << endl;
                break;
            }
    
            cout << endl;
    
        } while (choice != 9);
    
        return 0;
    }
一、课程设计题目 ① 基本要求题目:矩阵乘法。 ② 综合训练:学生成绩管理系统 二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结果。 学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计学生成绩管理系统,使之能提供以下功能: (1)主菜单 (2)各菜单项功能 ① 成绩录入:输入学生的学号、姓名及三门课的成绩; ② 成绩查询:(至少一种查询方式)。  按学号查询学生记录。  查询不及格学生的记录。 ③成绩统计:  计算学生的平均分;  根据学生的平均分高低,对学生的数据进行排序后输出;  对学生单科成绩排序,输出学生姓名与该科成绩; ④退出系统:退出整个系统(即主菜单)。 (3)结构体数组: #define N 30struct student {int num; /* 定义学号*/ char name[20]; /* 定义姓名*/ float score[3]; /* 定义存贮三门课成绩的数组*/ float average; /* 定义平均成绩*/ };struct student stu[N];  /* 定义结构体数组,存贮多个学生的记录*/ 三、数据结构设计描述 系统功能描述 1能够输入学生的学号、姓名、三科成绩并且计算出平均成绩。 2能够以表格的形式输出学生记录 3能够按照学生三科的平均成绩进行排序 4能够按照学生的单科成绩进行排序 5能够按照学号查询学生记录 6往表中插入学生记录 7从表中删除学生记录 8存储记录到文件中 9从文件中读取记录 10退出 数据字典 1数据流条目 数据流名称:全部记录 别名:无 简述:最新更新后所有关于学生成绩的记录 来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号+姓名+SC1+SC2+SC3+平均成绩 组织方式:索引文件,以学学号为关键字 查询要求:要求能立即查询 2数据项条目 数据项名称:学号 别名:无 简述:所有学校学生的学号 类型:字符串 3加工条目 加工名:更改的记录 激发条件:学生成绩记录被改动 优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项0,回车; 按提示输入数据 3、回到主菜单; 输入选项8,回车; 输入文件名:data,回车; 出现成功提示,则读入文件操作成功。 4、回到主菜单,输入1,回车 每10个暂停显示数据 5、回到主菜单,输入2,回车 出现排序成功信息。 6、回到主菜单,输入3,回车 出现排序成功信息。 7、回到主菜单,输入5,回车 按提示插入一组数据 8、回到主菜单,输入6,回车 按提示输入姓名,删除数据 出现删除成功的信息 9、回到主菜单,输入4,回车 输入学号进行查询 10、回到主菜单,输入1,回车 出现统计信息 11、回到主菜单,输入7,回车 输入result,回车 出现成功写入文件的信息 12、回到主菜单,输入9,回车退出系统
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值