【期末作业】成绩管理系统(C/C++实现)

目录

成绩管理系统--C/C++实现

一、功能概述

二、功能详细说明

三、代码实现 

 四、总结


成绩管理系统--C/C++实现

  • 项目内容基本满足要求,且有诸多改进,总体上没有问题
  • 项目采用C++,需要掌握类、文件操作、各种数据结构等基本知识。
  • 希望能对入门的程序猿一点帮助

一、功能概述

使用C++完成该系统的开发,通过该系统可以实现用户信息和学生信息的创建、查询、修改、删除,用户权限的判断,以及数据保存、读取等功能

二、功能详细说明

  • 学生管理

    • 增加学生 (addStudent)
    • 显示学生信息 (displayStudents)
    • 修改学生信息 (modifyStudent)
    • 删除学生 (deleteStudent)
    • 添加学生成绩 (addStudentgrade)
    • 显示学生成绩 (displayStudentsgrade)
    • 修改学生成绩 (modifyStudentgrade)
    • 删除学生成绩 (deleteStudentgrade)
    • 计算学生成绩 (calculateGrade)
  • 用户管理

    • 用户注册 (registerUser)
    • 用户登录 (loginUser)
    • 删除用户 (delete_user)
  • 文件操作

    • 保存学生信息到文件 (saveToFile)
    • 从文件中加载学生信息 (loadFromFile)
    • 备份数据 (backupData)
    • 恢复数据 (restoreData)
    • 保存注册信息 (saveregister)
    • 从文件中导入注册信息 (loadFromFile_rg)
    • 删除文件中的注册信息 (deFromFile_rg)
  • 权限管理

    • 根据不同角色(管理员、教师、学生、家长)设置不同的权限 (initRolePermissions)
    • 检查当前用户是否有权限执行某个操作 (hasPermission)
  • 主菜单

    • 系统主菜单 (mainMenu)
    • 登录前的主界面 (main)

三、代码实现 

#include <bits/stdc++.h>
using namespace std;

// 学生类
class Student {
public:
    int id;
    string name;
    string gender;
    int age;
    map<string, double> grades; // map of course name and grade
    double totalGrade;
    int failedSubjects;
    int coursesTaken;
    string remarks;
    //初始化学生
    Student(int id, string name, string gender, int age)
        : id(id), name(name), gender(gender), age(age), totalGrade(0), failedSubjects(0), coursesTaken(0),remarks("无") {}
    //计算总成绩
    void calculateTotalGrade() {
        totalGrade = 0;
        failedSubjects = 0;
        for (auto& course : grades) {
            totalGrade += course.second;//map的对应
            if (course.second < 60) failedSubjects++;
        }
        if (!grades.empty()) totalGrade /= grades.size();
    }
    //计算GPA
    double getGPA() const {
        if (totalGrade - 50 < 0)return 0;
        return (totalGrade - 50) / 10;
    }
    //评级
    string getGradeEvaluation() const {
        if (totalGrade >= 90) return "优";
        else if (totalGrade >= 80) return "良";
        else if (totalGrade >= 70) return "中等";
        else if (totalGrade >= 60) return "不佳";
        else return "不及格";
    }
    void saveGradesToFile() const {
        ofstream outFile(to_string(id) + "_grades.txt");
        for (const auto& grade : grades) {
            outFile << grade.first << " " << grade.second << endl;
        }
        outFile.close();
    }
    //从文件加载科目成绩
    void loadGradesFromFile() {
        ifstream inFile(to_string(id) + "_grades.txt");
        if (inFile.is_open()) {
            grades.clear();
            string subject;
            double grade;
            while (inFile >> subject >> grade) {
                grades[subject] = grade;
            }
            inFile.close();
            calculateTotalGrade();
        }
    }
};

// 用户类
class User {
public:
    string username;
    string password;
    string role;
    //初始化用户
    User(string username, string password, string role)
        : username(username), password(password), role(role) {}
};

// 学生管理系统类
class StudentManagementSystem {
private:
    vector<Student> students;
    vector<User> users;
    User* currentUser;
    map<string, vector<string>> rolePermissions;

public:
    StudentManagementSystem() {
        currentUser = nullptr;

        initRolePermissions();
    }
    //设置不同角色不同权限
    void initRolePermissions() {
        rolePermissions["admin"] = { "addStudent", "displayStudents", "modifyStudent", "deleteStudent", "saveToFile", "loadFromFile", "backupData", "restoreData", "feedback", "testModule", "logout" ,"calculateGrade" };
        rolePermissions["teacher"] = { "addStudent", "displayStudents", "saveToFile", "loadFromFile", "calculateGrade", "logout" };
        rolePermissions["student"] = { "calculateGrade", "feedback", "logout" };
        rolePermissions["parent"] = { "displayStudents","calculateGrade", "logout" };
    }
    //注册
    void registerUser() {
        string username, password, role;
        cout << "Enter username: ";
        cin >> username;
        cout << "Enter password: ";
        cin >> password;
        cout << "Enter role (admin/teacher/student/parent): ";
        for (auto& user : users) {
            if (user.username == username && user.password == password) {
                cout << "此人已经存在,此人是" << user.role << endl;
                return;
            }
        }
        cin >> role;
        users.push_back(User(username, password, role));
        cout << "Registration successful!" << endl;
    }
    //保存注册信息
    void saveToFile_rg() {
        if (!hasPermission("saveToFile")) return;
        ofstream outFile("register.txt");
        for (const auto& user : users) {
            outFile << user.username << " " << user.password << " " << user.role << endl;
        }
        outFile.close();
        cout << "Data saved successfully!" << endl;
    }
    //从文件中导入注册信息
    void loadFromFile_rg() {

        ifstream inFile("register.txt");
        if (inFile.is_open()) {
            string username, password, role;
            while (inFile >> username >> password >> role) {
                User user1(username, password, role);

                users.push_back(user1);
            }
            inFile.close();

            cout << "Data loaded successfully!" << endl;
        }
        else {
            cout << "Unable to open file!" << endl;
        }
    }
    //删除注册信息
    void deFromFile_rg() {
        string file = "register.txt";
        ofstream file_writer(file, ios_base::out);
    }
    void deFile(string s) {
        string file = s;
        ofstream file_writer(file, ios_base::out);
    }
    //删除用户
    void delete_user() {
        while (1) {
            string username1;
            cout << "请输入username" << endl;
            cin >> username1;

            for (vector<User>::iterator it = users.begin(); it != users.end(); ) {
                if (it->username == username1) {
                    cout << "delete successful! 此用户为 " << it->role << endl;
                    it = users.erase(it);

                    break;
                }
                else it++;
            }
            cout << "继续请按非零数字";
            int f; cin >> f;
            if (!f)return;

        }
    }

    //登录
    bool loginUser() {
        string username, password;
        cout << "Enter username: ";
        cin >> username;
        cout << "Enter password: ";
        cin >> password;
        for (auto& user : users) {
            if (user.username == username && user.password == password) {
                currentUser = &user;
                cout << "Login successful! Welcome, " << user.role << endl;
                return true;
            }
        }
        cout << "Login failed! Please try again." << endl;
        return false;
    }
    //增加学生
    void addStudent() {
        if (!hasPermission("addStudent")) return;
        while (1) {
            int id, age;
            string name, gender, remark;
            cout << "Enter student ID: ";
            cin >> id;
            if (id < 0) {
                cout << "Invalid id! Please try again." << endl;
                return;
            }
            for (auto& student : students)
                if (student.id == id) {
                    cout << "此人存在" << endl; return;
                }

            cout << "Enter student name: ";
            cin >> name;
            cout << "Enter student gender: ";
            cin >> gender;
            cout << "Enter student age: ";
            cin >> age;
            if (age < 0) {
                cout << "Invalid age! Please try again." << endl;
                return;
            }
            students.push_back(Student(id, name, gender, age));
            cout << "Student added successfully!" << endl;
            cout << "按非零键继续";
            int f; cin >> f; if (!f)return;
        }
    }

    //显示学生信息
    void displayStudents() {
        if (!hasPermission("displayStudents")) return;
        for (const auto& student : students) {
            cout << "ID: " << student.id << ", Name: " << student.name << ", Gender: " << student.gender
                << ", Age: " << student.age <<" 反馈: "<<student.remarks<<" 不及格数  " <<student.failedSubjects<<" 已选科目数量  "<<student.coursesTaken << endl;
        }
    }

    //修改学生信息
    void modifyStudent() {
        if (!hasPermission("modifyStudent")) return;
        int id;
        cout << "Enter student ID to modify: ";
        cin >> id;
        for (auto& student : students) {
            if (student.id == id) {
                string name, gender, remark;
                int age;
                cout << "Enter new name: ";
                cin >> name;
                cout << "Enter new gender: ";
                cin >> gender;
                cout << "Enter new age: ";
                cin >> age;
                if (age < 0) {
                    cout << "Invalid age! Please try again." << endl;
                    return;
                }
                cout << "Enter new remark: ";
                cin >> remark;
                student.name = name;
                student.gender = gender;
                student.age = age;
                student.remarks = remark;
                cout << "Student modified successfully!" << endl;
                cout << "按非零键继续" << endl;
                int f; cin >> f; if (!f)return; modifyStudent();
                return;
            }
        }
        cout << "Student not found!" << endl;

    }
    //删除学生信息
    void deleteStudent() {
        if (!hasPermission("deleteStudent")) return;
        int id;
        cout << "Enter student ID to delete: ";
        cin >> id;
        for (auto it = students.begin(); it != students.end(); ++it) {
            if (it->id == id) {
                students.erase(it);
                cout << "Student deleted successfully!" << endl;
                cout << "按非零键继续" << endl;
                int f; cin >> f; if (!f)return; deleteStudent();
                return;
            }
        }
        cout << "Student not found!" << endl;
    }
    //添加学生成绩
    void addStudentgrade() {
        if (!hasPermission("addStudent")) return;

        int id;
        string subject;
        double grade;
        cout << "Enter student subject: ";
        cin >> subject;
        cout << "Enter student grade: ";
        cin >> grade;
        if (grade < 0 || grade > 100) {
            cout << "Invalid grade! Grade must be between 0 and 100." << endl;
            return;
        }
        cout << "Enter student ID to modify: ";
        cin >> id;
        for (auto& student : students) {
            if (student.id == id) {
                student.grades.insert(pair<string, double>(subject, grade));
                cout << "Student grade added successfully!" << endl;
                student.calculateTotalGrade();
                cout << "Student added successfully!" << endl;
                cout << "按非零键继续" << endl;
                int f; cin >> f; if (!f)return;
                addStudentgrade(); return;
            }
        }

        cout << "Student not found!" << endl;
    }
    //显示学生成绩
    void displayStudentsgrade() {
        if (!hasPermission("displayStudents")) return;
        for (const auto& student : students) {
            cout << "ID: " << student.id << ", Name: " << student.name << ", Gender: " << student.gender
                << ", Age: " << student.age << ", Total Grade: " << student.totalGrade << ", GPA: " << student.getGPA()
                << ", Grade Evaluation: " << student.getGradeEvaluation();
           
            cout << endl;
        }
    }
    //修改学生成绩
    void modifyStudentgrade() {
        if (!hasPermission("modifyStudent")) return;
        int id;
        cout << "Enter student ID to modify: ";
        cin >> id;
        for (auto& student : students) {
            if (student.id == id) {
                string subject;
                double grade;
                cout << "Enter student subject: ";
                cin >> subject;
                cout << "Enter student grade: ";
                cin >> grade;
                student.grades.insert(pair<string, double>(subject, grade));
                cout << "Student modified successfully!" << endl;
                student.calculateTotalGrade();
                cout << "按非零键继续" << endl;
                int f; cin >> f; if (!f)return;
                modifyStudentgrade(); return;
            }
        }
        cout << "Student not found!" << endl;
    }
    //删除学生成绩
    void deleteStudentgrade() {
        if (!hasPermission("deleteStudent")) return;
        int id;
        cout << "Enter student ID to delete: ";
        cin >> id;
        for (auto& student : students) {
            if (student.id == id) {


                student.grades.clear();

                cout << "Student modified successfully!" << endl;
                cout << "按非零键继续" << endl;
                int f; cin >> f; if (!f)return; deleteStudentgrade();
                return;
            }
        }
        cout << "Student not found!" << endl;
    }

    //保存到文件中
    void saveToFile() {
        if (!hasPermission("saveToFile")) return;
        deFile("students.txt");

        ofstream outFile("students.txt");
        for (const auto& student : students) {
            outFile << student.id << " " << student.name << " " << student.gender << " " << student.age << " "
                << student.totalGrade << " " << student.failedSubjects << " " << student.coursesTaken << " "
                << student.remarks << endl;
        }
        outFile.close();
        for (const auto& student : students) {
            student.saveGradesToFile();
        }
        cout << "Data saved successfully!" << endl;
    }
    //从文件中导入
    void loadFromFile() {
        if (!hasPermission("loadFromFile")) return;
        ifstream inFile("students.txt");
        if (inFile.is_open()) {
            students.clear();
            int id, age;
            string name, gender;
            double totalGrade;
            int failedSubjects, coursesTaken;
            string remarks;
            while (inFile >> id >> name >> gender >> age >> totalGrade >> failedSubjects >> coursesTaken >> remarks) {
                Student student(id, name, gender, age);
                student.totalGrade = totalGrade;
                student.failedSubjects = failedSubjects;
                student.coursesTaken = coursesTaken;
                student.remarks = remarks;
                student.loadGradesFromFile();
                students.push_back(student);
            }
            inFile.close();
            cout << "Data loaded successfully!" << endl;
        }
        else {
            cout << "Unable to open file!" << endl;
        }
    }
    //备份数据
    void backupData() {
        if (!hasPermission("backupData")) return;
        deFile("backupData");
        ofstream backupFile("backup.txt");
        for (const auto& student : students) {
            backupFile << student.id << " " << student.name << " " << student.gender << " " << student.age << " "
                << student.totalGrade << " " << student.failedSubjects << " " << student.coursesTaken << " "
                << student.remarks << endl;
        }
        backupFile.close();
        for (const auto& student : students) {
            student.saveGradesToFile();
        }
        cout << "Data backup successfully!" << endl;
    }
    //恢复数据
    void restoreData() {
        if (!hasPermission("restoreData")) return;
        ifstream backupFile("backup.txt");
        if (backupFile.is_open()) {
            students.clear();
            int id, age;
            string name, gender;
            double totalGrade;
            int failedSubjects, coursesTaken;
            string remarks;
            while (backupFile >> id >> name >> gender >> age >> totalGrade >> failedSubjects >> coursesTaken >> remarks) {
                Student student(id, name, gender, age);
                student.totalGrade = totalGrade;
                student.failedSubjects = failedSubjects;
                student.coursesTaken = coursesTaken;
                student.remarks = remarks;
                student.loadGradesFromFile();
                students.push_back(student);
            }
            backupFile.close();
            cout << "Data restored successfully!" << endl;
        }
        else {
            cout << "Unable to open backup file!" << endl;
        }
    }
    //计算成绩
    void calculateGrade() {
        if (!hasPermission("calculateGrade")) return;
        int id;
        cout << "Enter student ID to calculate grade: ";
        cin >> id;
        for (auto& student : students) {
            if (student.id == id) {
                student.calculateTotalGrade();
                cout << "Total Grade: " << student.totalGrade << ", GPA: " << student.getGPA()
                    << ", Grade Evaluation: " << student.getGradeEvaluation(); int i = 1;
                for (auto& t : student.grades) {
                    cout << "  科目" <<i<<":" << t.first << " 分数:" << t.second << " "; i++;
                }cout << endl;
                return;
            }
        }
        cout << "Student not found!" << endl;
    }
    //保存注册信息
    void saveregister() {
        if (!hasPermission("saveToFile")) return;
        deFromFile_rg();
        saveToFile_rg();
    }
    //反馈
    void feedback() {
        if (!hasPermission("feedback")) return;
        int id;
        string feedback;
        cout << "Enter student ID to give feedback: ";
        cin >> id;
        for (auto& student : students) {
            if (student.id == id) {
                cout << "Enter feedback: ";
                cin.ignore();
                getline(cin, feedback);
                student.remarks = feedback;
                cout << "Feedback added successfully!" << endl;
                return;
            }
        }
        cout << "Student not found!" << endl;
    }
    //测试
    void testModule() {
        if (!hasPermission("testModule")) return;
        cout << "Testing module..." << endl;
        //待添加
    }
    //检查
    bool hasPermission(const string& action) {
        if (currentUser == nullptr) {
            cout << "You need to login first!" << endl;
            return false;
        }
        if (find(rolePermissions[currentUser->role].begin(), rolePermissions[currentUser->role].end(), action) == rolePermissions[currentUser->role].end()) {
            cout << "You do not have permission to perform this action!" << endl;
            return false;
        }
        return true;
    }
    //主界面
    void mainMenu() {
        while (true) {
            cout << "\nMain Menu\n";
            cout << "1. Add Student\n";
            cout << "2. Display Students\n";
            cout << "3. Modify Student\n";
            cout << "4. Delete Student\n";
            cout << "5. Save to File\n";
            cout << "6. Load from File\n";
            cout << "7. Backup Data\n";
            cout << "8. Restore Data\n";
            cout << "9. single Grade\n";
            cout << "10. Feedback\n";
            cout << "11. save_regiser\n";
            cout << "12. add_Student_grade\n";
            cout << "13. display_Students_grade\n";
            cout << "14. modify_Student_grade\n";
            cout << "15. delete_Student_grade\n";
            cout << "16. Logout\n";
            cout << "Enter your choice: ";
            int choice;
            cin >> choice;
            switch (choice) {
            case 1:
                addStudent();
                break;
            case 2:
                displayStudents();
                break;
            case 3:
                modifyStudent();
                break;
            case 4:
                deleteStudent();
                break;
            case 5:
                saveToFile();
                break;
            case 6:
                loadFromFile();
                break;
            case 7:
                backupData();
                break;
            case 8:
                restoreData();
                break;
            case 9:
                calculateGrade();
                break;
            case 10:
                feedback();
                break;
            case 11:
                saveregister();
                break;
            case 12:
                addStudentgrade();
                break;
            case 13:
                displayStudentsgrade();
                break;
            case 14:
                modifyStudentgrade();
                break;
            case 15:
                deleteStudentgrade();
                break;
            case 16:
                currentUser = nullptr;
                return;
            case 17:
                testModule(); break;
            default:
                cout << "Invalid choice! Please try again." << endl;
            }
        cout << "是否保存,保存请按非零数";
        int f; cin >> f;
        if (f)backupData();
        }
        
    }
};
#include<Windows.h>
int main() {
    StudentManagementSystem sms;
    //画爱心
    /* system(" color 01");//设计程序颜色
     printf("                       成绩管理系统\n");//打印文字
     system(" color 0c");
     float x, y, a;//定义变量x,y,a
     for (y = 1.5f; y > -1; y -= 0.1f)
     {
         for (x = -1.5f; x < 1.5f; x += .05f) {
             a = x * x + y * y - 1;
             putchar(a * a * a - x * x * y * y * y < 0.0f ? 'x' : ' ');
         }
         Sleep(150);//停顿函数(1.5秒钟)
         putchar('\n'); //换行
     }
     system(" color 01");
     */
    sms.loadFromFile_rg();
    while (true) {
        cout << "\nWelcome to Student Management System\n";
        cout << "1. Register\n";
        cout << "2. Login\n";
        cout << "3. Exit\n";
        cout << "4.delete_user\n";
        cout << "Enter your choice: ";
        int choice;
        cin >> choice;//选择
        switch (choice) {
        case 1:
            sms.registerUser();
            break;
        case 2:
            if (sms.loginUser()) {
                sms.mainMenu();
            }
            break;
        case 3:
            return 0;
        case 4:
            sms.delete_user(); break;
        default:
            cout << "Invalid choice! Please try again." << endl;
        }
        
    }
}

 四、总结

以上就是今天要讲的内容,本文介绍了学生管理系统的开发,提供了完整有序的撰写思路,先前的思路仅供参考,最终以源码为准。如果对你有帮助,还请点点关注,我会继续发布其他有价值的内容。 

 

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值