用C++ STL 实现成绩管理系统

#include <iostream>
#include <sstream> //字符串转换类型
#include <list>    
#include <string>
#include <vector>
#include <fstream> //登录,打印成绩 

using namespace std;

class Student
{
private:
    string m_strNO;         //学号
    string m_strName;       //姓名
    string m_strUniversity; //大学
    int    m_nTotal;        //成绩
public:
    Student()
    {
        m_strNO = "0";
        m_strName = "0";
        m_strUniversity = "0";
        m_nTotal = 0;
    }
    Student(string strNO , string strName, string strUniversity, int nTotal) :
        m_strNO(strNO), m_strName(strName),
        m_strUniversity(strUniversity), m_nTotal(nTotal)
    {
    }
    bool operator < (Student& s)
    {
        return m_strNO < s.GetNO();
    }
    bool operator == (Student& s)
    {
        return m_strNO == s.GetNO();
    }
    string GetNO() { return m_strNO; }
    string GetName() { return m_strName; }
    string GetUniversity() { return m_strUniversity; }
    int    GetTotal() { return m_nTotal; }
};

class Log
{
private:
    int m_type;                 //学生登录或者老师登录
    string m_strUser;           //账号
    string m_strPassword;       //密码

public:
    Log()
    {
        m_type = 0;
        m_strUser = "0";
        m_strPassword = "0";
    }
    Log(int type,string strUser, string strPassword) : m_type(type),
        m_strUser(strUser), m_strPassword(strPassword){}

    bool operator < (Log& s)
    {
        return m_strUser < s.GetUser();
    }
    bool operator == (Log& s)
    {
        return m_strUser == s.GetUser();
    }
    int GetType() { return m_type; }
    string GetUser() { return m_strUser; }
    string GetPassword() { return m_strPassword; }
};

ostream& operator << (ostream& os, Student& s)
{
    os << s.GetNO() << "\t" << s.GetName() << "\t" << s.GetUniversity() << "\t" << s.GetTotal();
    return os;
}
ostream& operator << (ostream& os, Log& s)
{
    os << s.GetType() << "\t" << s.GetUser() << "\t" << s.GetPassword();
    return os;
}

typedef list<Student> LISTSTUD;
typedef LISTSTUD::iterator iterator;
typedef vector<Log> VECTORLOG;

class StudManage
{
private:
    VECTORLOG m_LogVector;   //登录容器
    LISTSTUD m_stlList;      //学生链表
    string strNO;            //学号
    string strName;          //姓名
    string strUniversity;    //大学
    int    nTotal;           //成绩
    int    type;             //学生登录或者老师登录
    string strUser;          //账号
    string strPassword;      //密码
public:
    void Log_init()
    {
        /*将文件的类型、账号和密码插入容器中*/
        ifstream All_user;
        All_user.open("Alluser.txt");
        if (!All_user)
        {
            cout << "打开文件失败" << endl;
        }
        while (All_user >> type >> strUser >> strPassword)
        {
            const Log s(type, strUser, strPassword);
            m_LogVector.push_back(s);
        }
        //for (VECTORLOG::iterator it = m_LogVector.begin(); it != m_LogVector.end(); it++)
        //{
        //  cout << *it << endl;
        //}//单元测试是否加入了登录的库
        All_user.close();

    }
    bool Log_In(int type,string strUser,string strPassword)
    {
        /*从容器中查找是否有匹配的值*/
        stringstream m_ctoi;
        int m_1;
        int m_2;
        int m_3;
        int m_4;
        VECTORLOG::iterator it = m_LogVector.begin();
        while (it != m_LogVector.end())
        {
            Log& s = *it;
            m_ctoi << s.GetUser();
            m_ctoi >> m_1;
            m_ctoi.clear();

            m_ctoi << strUser;
            m_ctoi >> m_2;
            m_ctoi.clear();

            m_ctoi << s.GetPassword();
            m_ctoi >> m_3;
            m_ctoi.clear();

            m_ctoi << strPassword;
            m_ctoi >> m_4;
            m_ctoi.clear();

            if (type == s.GetType() && m_1 == m_2 && m_3 == m_4)
            {
                    return true;
            }
            ++it;
        }
        if (it == m_LogVector.end())
        {
            return false;
        }
        return true;
    }
    bool Add()    //从  Allstudent表  中添加学生
    {
        ifstream All_student;
        All_student.open("Allstudent.txt");
        if (!All_student)
        {
            cout << "打开文件失败" << endl;
        }
        while (All_student >> strNO >> strName >> strUniversity >> nTotal)
        {
            const Student s(strNO, strName, strUniversity, nTotal);
            m_stlList.push_back(s);
        }
        All_student.close();
        return true;
    }
    bool Merge(StudManage& stud) // 如果有两张表可以进行合并
    {
        m_stlList.sort();
        stud.m_stlList.sort();
        //将两张表分别排序
        m_stlList.merge(stud.m_stlList);//归并排序
        m_stlList.unique();//去重
        return true;
    }
    void Merge()                //插入之后进行排序(去重)
    {
        fstream Merge_student;
        Merge_student.open("Allstudent.txt", ios::in | ios::out | ios::trunc);
        if (!Merge_student)
        {
            cout << "打开文件失败" << endl;
        }
        m_stlList.sort();//排序
        m_stlList.unique();//去重
        for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
        {
            Merge_student << *it << endl;
        }
        Merge_student.close();
    }
    void Show_All()               //显示学生(教师功能)
    {

        for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
        {
            cout << *it << endl;
        }

    }
    void Add_Student() //添加学生(教师功能)
    {
        fstream Add_student;
        Add_student.open("Allstudent.txt", ios::in | ios::out | ios::trunc);
        if (!Add_student)
        {
            cout << "打开文件失败!!" << endl;
        }
        cin>> strNO >> strName >> strUniversity >> nTotal;
        const Student s(strNO,strName,strUniversity,nTotal);
        m_stlList.push_back(s);

        for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
        {
            Add_student << *it << endl;
        }
        Add_student.close();

        cout << "插入成功!" << endl; 
    }
    void Delete_Student()             //删除学生(教师功能)
    {
        string Delete_student_No;
        /*  按学号删除  */
        cin >> Delete_student_No;
        stringstream m_ctoi;
        bool bFind = false;
        int m_1;
        int m_2;
        fstream Delete_stu;
        Delete_stu.open("Allstudent.txt", ios::in | ios::out | ios::trunc);
        if (!Delete_stu)
        {
            cout << "打开文件失败!!" << endl;
        }
        LISTSTUD::iterator it = m_stlList.begin();
        while (it != m_stlList.end())
        {
            Student& s = *it;
            m_ctoi << s.GetNO();
            m_ctoi >> m_1;
            m_ctoi.clear();
            m_ctoi << Delete_student_No;
            m_ctoi >> m_2;
            m_ctoi.clear();

            if (m_1 == m_2)              // 字符串转换一下
            {
                bFind = true;
                m_stlList.erase(it);
                cout << " 已经成功删除! " << endl;
                Delete_stu.close();
                break;
            }
            ++it;
            if (it == m_stlList.end())
            {
                cout << " 对不起,没有要删除的同学信息 " << endl;
            }
        }

        for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
        {
            Delete_stu << *it << endl;
        }
    }
    void Show_Student(string strNO)         //学生查询个人成绩(学生功能)
    {
        stringstream m_ctoi;
        bool bFind = false;
        int m_1;
        int m_2;

        LISTSTUD::iterator it = m_stlList.begin();
        while (it != m_stlList.end())
        {
            Student& s = *it;
            m_ctoi << s.GetNO();
            m_ctoi >> m_1;
            m_ctoi.clear();
            m_ctoi << strNO;
            m_ctoi >> m_2;
            m_ctoi.clear();

            if (m_1 == m_2)              // 字符串转换一下
            {
                bFind = true;
                cout << *it << endl;
                break;
            }
            ++it;
        }
        if(it == m_stlList.end())
        {
            system("cls");
            cout << " 没有这个同学 " << endl;
        }
    }
    void Printf_Grade()//打印所有人的成绩(教师功能)
    {
        fstream printf_grade;
        printf_grade.open("Allstudent.txt", ios::in | ios::out | ios::trunc);
        if (!printf_grade)
        {
            cout << "打开文件失败!!" << endl;
        }
        for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
        {
            printf_grade << *it << endl;
        }
        printf_grade.close();
        cout << "打印成功!!" << endl;
    }//打印成绩

};

int main()
{
    stringstream ctoi;
    stringstream itoc;
    int Log_in = 0;
    int Teacher_n = 0;
    int Student_n = 0;
    int Log_num = 0;
    string Student_No;

    string Log_Str_User;
    string Log_Str_Password;
    cout << "****************************************************" << endl;
    cout << "|****************学校成绩管理系统******************|" << endl;
    cout << "|                                                  |" << endl;
    cout << "|     1.老师登录      2.学生登录        其他.退出  |" << endl;
    cout << "|                                                  |" << endl;
    cout << "|                                                  |" << endl;
    cout << "|     请输出(1 或 2)  :                          | "<< endl;
    cout << "****************************************************" << endl;
/****************************创建原始表***********************************/
    StudManage sm1;
    sm1.Add();
    sm1.Merge();
    sm1.Log_init();
/***************************************************************************/
    while (1) {
        cin >> Log_in;
        switch (Log_in)
        {
        case 1:

            system("cls");
            if(Log_num == 0)
            { 
                for (Log_num = 1; Log_num < 4; Log_num++)
                {
                    cout << "请输入第" << Log_num << "次密码(只能输入3次):"<< endl ;
                    cin >> Log_Str_User >> Log_Str_Password;
                    if (sm1.Log_In(Log_in, Log_Str_User, Log_Str_Password))
                    {
                        break;
                    }
                }//(Log_num = 1; Log_num < 4; Log_num++)
                if (Log_num > 3)
                {
                    cout << "对不起输入超过限制,稍后重试!!" << endl;
                    system("pause");
                    return 0;
                }
            }//(Log_num == 0)
            while (1) {
                system("cls");
                cout << "*************************学校成绩管理系统*************************" << endl;
                cout << "|                        欢迎教师登录                            |" << endl;
                cout << "|****************************************************************|" << endl;
                cout << "|1.插入成绩 2.删除成绩 3.查询成绩 4.修改成绩 5.打印成绩 其他.退出|" << endl;
                cout << "|                                                                |" << endl;
                cout << "|                                                                |" << endl;
                cout << "|    请输出(1 、2 、3、 4 或 5: )  :                          |" << endl;
                cout << "******************************************************************" << endl;
                cin >> Teacher_n;
                switch (Teacher_n)
                {
                    case 1:
                        system("cls");
                        cout << "*****************学校成绩管理系统***************" << endl;
                        cout << "************************************************" << endl;
                        cout << " 请输入学生的信息(学号,姓名,学校,总分) :" << endl;
                        sm1.Add_Student();
                        sm1.Merge();
                        Teacher_n = 0;
                        system("pause");
                        break;
                    case 2:
                        system("cls");
                        cout << "******************学校成绩管理系统**************" << endl;
                        cout << "************************************************" << endl;
                        cout << " 请输入要删除的学生(学号) :" << endl;
                        sm1.Delete_Student();
                        Teacher_n = 0;
                        system("pause");
                        break;
                    case 3:
                        system("cls");
                        cout << "****************学校成绩管理系统***************" << endl;
                        cout << "************************************************" << endl;
                        sm1.Show_All();
                        Teacher_n = 0;
                        system("pause");
                        break;
                    case 4:
                        break;
                    case 5:
                        system("cls");
                        sm1.Printf_Grade();
                        Teacher_n = 0;
                        system("pause");
                        break;
                    default:
                        system("cls");
                        Teacher_n = 0;
                        cout << "程序退出!!" << endl;
                        system("pause");
                        return 0;
                }//while (1) 
            }
            break; //case 1:
        case 2:

            system("cls");
            if (Log_num == 0)
            {
                for (Log_num = 1; Log_num < 4; Log_num++)
                {
                    cout << "请输入第" << Log_num << "次密码(只能输入3次):" << endl;
                    cin >> Log_Str_User >> Log_Str_Password;
                    if (sm1.Log_In(Log_in, Log_Str_User, Log_Str_Password))
                    {
                        break;
                    }
                }//(Log_num = 1; Log_num < 4; Log_num++)
                if (Log_num > 3)
                {
                    cout << "对不起输入超过限制,稍后重试!!" << endl;
                    system("pause");
                    return 0;
                }
            }//(Log_num == 0)
            while (1) {
                system("cls");
                cout << "*************************学校成绩管理系统***********************" << endl;
                cout << "|                                                              |" << endl;
                cout << "|                         欢迎学生登录                         |" << endl;
                cout << "|**************************************************************|" << endl;
                cout << "|                                                              |" << endl;
                cout << "|  1.查询成绩  其他.退出                                       |" << endl;
                cout << "|                                                              |" << endl;
                cout << "|  请输出数字 1 :                                             |" << endl;
                cout << "****************************************************************" << endl;
                cin >> Student_n;
                switch (Student_n)
                {
                case 1:
                    cout << "请输入查询学号" << endl;
                    cin >> Student_No;
                    system("cls");
                    sm1.Show_Student(Student_No);
                    Student_n = 0;
                    system("pause");
                    break;
                default:
                    Student_n = 0;
                    system("pause");
                    return 0;
                }
            }//  while (1)
            break; // case 2:
        default:
            cout << "程序退出!!" << endl;
            system("pause");
            return 0;
        } // switch (n)
    }//while (1)
    cout << "程序退出!!" << endl;
    system("pause");
    return 0;
}

Allstudent.txt

1   1   1   1
10  hexin   shan    100
2   2   2   2
3   3   3   3
5   5   5   5
6   6   6   6
7   7   77  7
8   8   8   88

Alluser.txt

1 1 1
2 2 2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值