控制台Student Management System <C++>

#include "student.h"

CStu::CStu() 
{
    //链表头指针
    m_pHead = NULL;  
    //链表尾指针
    m_pEnd = NULL;

    m_stuCount = 0;
}

CStu::~CStu()
{
    while (m_pHead)
    {
        Student* pTemp = m_pHead;
        m_pHead = m_pHead->pNext;
        delete pTemp;
    }
}

//添加功能
void CStu::AddStudent()
{
    //输入学生信息
    char stuNum[15];
    cout << "输入学生学号: ";
    cin >> stuNum;
    //1、检测编号重复
    Student* pTemp = m_pHead;  
    while (pTemp)
    {
        if (strcmp (pTemp->stuNum , stuNum) == 0)
        {
            cout << "学号已存在,请重新添加\n";
            return ;
        }
        pTemp = pTemp->pNext;
    }

    //2、添加
    //创建节点
    Student *pTempStu = new Student;
    //节点成员赋值
    strcpy(pTempStu->stuNum,stuNum);
    cout << "\n输入学生名字: ";
    cin >> pTempStu->stuName;
    cout << "\n输入学生性别: ";
    cin >> pTempStu->stuSex;
    cout << "\n输入学生年龄: ";
    cin >> pTempStu->stuAge;
    cout << "\n输入学生系别: ";
    cin >> pTempStu->stuSystem;
    cout << "\n输入学生班级: ";
    cin >> pTempStu->stuClass;
    cout << "\n输入学生联系方式: ";
    cin >> pTempStu->stuTel;
    //指针赋值
    pTempStu->pNext = NULL;
    pTempStu->pPre = NULL;

    //链接到链表上
    if (NULL == m_pHead)
    {
        m_pHead = pTempStu;    
        m_pEnd = pTempStu;
    }
    else
    {
        m_pEnd->pNext = pTempStu;
        pTempStu->pPre = m_pEnd;
        m_pEnd = pTempStu;
    }

    m_stuCount++; //学生人数增加
}

//查询  根据名字 或者学号
void CStu::SCanStudentMsg()
{
    //判断 是否有学生, 没有学生就不用查了
    if (NULL == m_pHead)
    {
        cout << "没有学生,请添加学生再查询\n";
        return ;
    }

    //输入名字或者学号
    cout << "\n输入名字或者学号: ";
    char arrTemp[15];
    cin >> arrTemp;

    //判断下是学号还是名字
    Student* pTemp = m_pHead;  
    if (arrTemp[0] >= '0' && arrTemp[0] <= '9')
    {
        while (pTemp)
        {
            if (strcmp (pTemp->stuNum , arrTemp) == 0)
            {
                //输出学生信息
                ShowStu(pTemp);
                return ;
            }
            pTemp = pTemp->pNext;
        }
    }
    else
    {
        while (pTemp)
        {
            if (strcmp (pTemp->stuName , arrTemp) == 0)
            {
                //输出学生信息
                ShowStu(pTemp);
                return ;
            }
            pTemp = pTemp->pNext;
        }
    }

    cout << "\n查无此学生\n";
}

//删除指定学生
void CStu::DeleteStu()
{
    //判断 是否有学生, 没有学生就不用编辑
    if (NULL == m_pHead)
    {
        cout << "记录为空!\n";
        return ;
    }

    //输入名字或者学号
    cout << "\n输入需要删除的学生的学号: ";
    char arrTemp[15];
    cin >> arrTemp;

    //判断下是学号还是名字
    Student* pTemp = m_pHead;  
    while (pTemp)
    {
        if (strcmp (pTemp->stuNum , arrTemp) == 0)
        {
            //删除学生信息
            DeleteStu(pTemp);
            m_stuCount--; //学生人数减少一个
            return ;
        }
        pTemp = pTemp->pNext;
    }

    cout << "\n查无此学生\n";
}

//删除指定学生
void CStu::DeleteStu(Student* pTemp)
{
    //链表有一个几点
    if (m_pHead == m_pEnd)
    {
        delete m_pHead;
        m_pHead = NULL;
        m_pEnd = NULL;
    }
    else if(m_pHead->pNext == m_pEnd)  //有两个节点
    {
        if (pTemp == m_pHead)  //是头
        {
            delete m_pHead;
            m_pHead = m_pEnd;
            m_pEnd->pPre = NULL;
        }
        else  //是尾巴
        {
            delete m_pEnd;
            m_pEnd = m_pHead;
            m_pHead->pNext = NULL;
        }
    }
    else
    {
        if (pTemp == m_pHead)  //是头
        {
            m_pHead = m_pHead->pNext;
            m_pHead->pPre = NULL;
            delete pTemp;
        }
        else if (pTemp == m_pEnd) //是尾巴
        {
            m_pEnd = m_pEnd->pPre;
            m_pEnd->pNext = NULL;
            delete pTemp;
        }
        else  //中间节点
        {
            pTemp->pPre->pNext = pTemp->pNext;
            pTemp->pNext->pPre = pTemp->pPre;
            delete pTemp;
        }
    }
}


//编辑
void CStu::EditStuMsg()
{
    //判断 是否有学生, 没有学生就不用编辑
    if (NULL == m_pHead)
    {
        cout << "没有学生,请添加学生再查询\n";
        return ;
    }

    //输入名字或者学号
    cout << "\n输入需要修改的学生的名字或者学号: ";
    char arrTemp[15];
    cin >> arrTemp;

    //判断下是学号还是名字
    Student* pTemp = m_pHead;  
    if (arrTemp[0] >= '0' && arrTemp[0] <= '9')
    {
        while (pTemp)
        {
            if (strcmp (pTemp->stuNum , arrTemp) == 0)
            {
                //编辑学生信息
                EditStu(pTemp);
                return ;
            }
            pTemp = pTemp->pNext;
        }
    }
    else
    {
        while (pTemp)
        {
            if (strcmp (pTemp->stuName , arrTemp) == 0)
            {
                //编辑学生信息
                EditStu(pTemp);
                return ;
            }
            pTemp = pTemp->pNext;
        }
    }

    cout << "\n查无此学生\n";
}

//编辑指定学生信息
void CStu::EditStu(Student* pTemp)
{
    //输入学生信息
    char stuNum[15];
    cout << "输入修改后的学生学号: ";
    cin >> stuNum;
    //1、检测编号重复
    Student* pTemp1 = m_pHead;  
    while (pTemp1)
    {
        if (strcmp (pTemp1->stuNum , stuNum) == 0)
        {
            cout << "学号已存在,请重新添加\n";
            return ;
        }
        pTemp1 = pTemp1->pNext;
    }

    strcpy(pTemp->stuNum, stuNum);
    cout << "\n输入修改后的名字: ";
    cin >> pTemp->stuName;
    cout << "\n输入修改后的性别: ";
    cin >> pTemp->stuSex;
    cout << "\n输入修改后的年龄: ";
    cin >> pTemp->stuAge;
    cout << "\n输入修改后的系别: ";
    cin >> pTemp->stuSystem;
    cout << "\n输入修改后的班级: ";
    cin >> pTemp->stuClass;
    cout << "\n输入修改后的联系方式: ";
    cin >> pTemp->stuTel;
}

void CStu::ShowStu(Student* pTemp)
{
    cout << "学号   姓名   性别   年龄   系别   班级   联系方式\n";
    cout << pTemp->stuNum << "      " << pTemp->stuName << "   " << pTemp->stuSex << 
        "     " << pTemp->stuAge << "     " << pTemp->stuSystem
        << " " << pTemp->stuClass << "    " << pTemp->stuTel << "\n";
}

//显示
void CStu::ShowAllStuMsg()
{
    //没有人就不用显示了
    if (NULL == m_pHead)
    {
        cout << "没有学生\n";
        return ;
    }

    //循环显示
    cout << "学号   姓名   性别   年龄   系别   班级   联系方式\n";
    Student* pTemp = m_pHead;  
    while (pTemp)
    {
        //输出学生信息
        cout << pTemp->stuNum << "      " << pTemp->stuName << "   " << pTemp->stuSex << 
            "     " << pTemp->stuAge << "     " << pTemp->stuSystem
            << " " << pTemp->stuClass << "    " << pTemp->stuTel << "\n";

        pTemp = pTemp->pNext;
    }
}

//菜单


//1、统计学生总人数
int CStu::StuCount()
{
    cout << m_stuCount << endl;
    return m_stuCount;
}

//保存进文件
void CStu::SaveInFile()
{
    //打开文件,覆盖打开
    FILE* pFile = fopen("stu.txt", "w");

    Student* pTemp = m_pHead;  
    while (pTemp->pNext)
    {
        //写入文件
        fprintf(pFile, "%s %s %s %u %s %s %s\n",  pTemp->stuNum, pTemp->stuName, pTemp->stuSex, pTemp->stuAge, pTemp->stuSystem, pTemp->stuClass, pTemp->stuTel);
        pTemp = pTemp->pNext;
    }
    fprintf(pFile, "%s %s %s %u %s %s %s",  pTemp->stuNum, pTemp->stuName, pTemp->stuSex, pTemp->stuAge, pTemp->stuSystem, pTemp->stuClass, pTemp->stuTel);

    //关闭文件
    fclose(pFile);
}
//读取
void CStu::ReadFromFile()
{
    FILE* pFile = fopen("stu.txt", "r");

    while (!feof(pFile))
    {
        Student* pTemp = new Student;  
        //写入文件
        fscanf(pFile, "%s%s%s%u%s%s%s",  pTemp->stuNum, pTemp->stuName, pTemp->stuSex, &pTemp->stuAge, pTemp->stuSystem, pTemp->stuClass, pTemp->stuTel);
        pTemp->pNext = NULL;
        pTemp->pPre = NULL;

        //加入链表
        //链接到链表上
        if (NULL == m_pHead)
        {
            m_pHead = pTemp;    
            m_pEnd = pTemp;
        }
        else
        {
            m_pEnd->pNext = pTemp;
            pTemp->pPre = m_pEnd;
            m_pEnd = pTemp;
        }
    }

    //关闭文件
    fclose(pFile);
}

 

posted @ 2018-01-21 15:59  第二根杈  阅读(357)  评论(0编辑  收藏  举报