0
点赞
收藏
分享

微信扫一扫

教师信息管理系统

往复随安_5bb5 2022-03-11 阅读 25
c++c语言

       本文是笔者的期末课程设计作业,所以篇幅较长。笔者的编程能力弱,很多代码有待改进,初次发文,希望大家可以见谅,多多包涵;有优化意见者欢迎在评论区与大家分享!希望此文能够帮助到有需要的同学!

注:本文篇幅较长,完整代码在文末,不想看文字的同学可以直接点击目录跳转!】 

1、目的和要求:

目的:

(1)熟悉并巩固C程序设计语言的基本概念和知识。

(2)培养学生自主学习,独立思考的能力,学会查找资料并善于分析资料的能力。

(3)培养学生独立设计一个完整系统、独立调试程序的能力。

要求:

(1)设计一个主函数和多个子函数,每个子函数完成一个相对独立的子功能。

(2)程序运行时,首先进行口令检查,再显示菜单。并能根据菜单调用相应的函数功能。

 口令程序段的功能要求:

 1)提示用户输入一个口令。

 2)用户输入口令后,若口令对,则提示用户通过,可执行后续程序;否则不通过。

 3)可对用户的口令输入进行次数限制(如:重复输入3次都不对),则自动退出系统。

(3)显示数据时,一页显示不下,可分页显示。

2、主要内容:

教师信息包括教师号、姓名、性别、年龄、学历、职称、工资、住址、电话等(教师号不重复)。试设计一教师信息管理系统,使之能提供以下功能:

(1)系统以菜单方式工作。

(2)教师信息录入功能。

(3)教师信息删除功能。

(4)教师信息浏览功能。

(5)查询和排序功能:(至少一种查询方式) 

          1)按教师号查询。

          2)按职称查询等。

目录

一.课程设计目的

1.1熟悉并巩固C程序设计语言的基本概念和知识。

1.2培养学生自主学习,独立思考的能力,学会查找资料并善于分析资料的能力。

1.3培养学生独立设计一个完整系统、独立调试程序的能力。

二、课程设计内容

2.1系统以菜单方式工作

2.2教师信息录入功能

2.3教师信息删除功能

2.4教师信息浏览功能

2.5查询功能

2.6排序功能

三、课程设计要求

3.1设计一个主函数和多个子函数,每个子函数完成一个相对独立的子功能。

3.2程序运行时,首先进行口令检查,再显示菜单。并能根据菜单调用相应的函数功能。

3.3显示数据时,一页显示不下,可分页显示。

四、课程设计分析及实现

4.1数据结构

4.2初始化教师信息系统

4.3教师信息录入功能

4.4教师信息删除功能

4.5教师信息浏览功能

4.6教师信息查询功能

4.7教师信息排序功能

4.8保存文件功能

4.9读取文件功能

五、系统调试和测试

5.1开始界面

5.2登录操作

5.3开始菜单

5.4【1】录入功能

5.5【2】删除功能

5.6【3】浏览功能

5.7【4】按教师号查询

5.8【5】按职称查询

5.9【6】按教师号排序

5.10【7】按名字排序

5.11【8】保存文件

5.12【0】关闭菜单

六、完整代码


项目二:教师信息系统

一.课程设计目的

1.1熟悉并巩固C程序设计语言的基本概念和知识。

1.2培养学生自主学习,独立思考的能力,学会查找资料并善于分析资料的能力。

1.3培养学生独立设计一个完整系统、独立调试程序的能力。

二、课程设计内容

教师信息包括教师号、姓名、性别、年龄、学历、职称、工资、住址、电话等(教师号不重复)。试设计一教师信息管理系统,使之能提供以下功能:

2.1系统以菜单方式工作

2.2教师信息录入功能

2.3教师信息删除功能

2.4教师信息浏览功能

2.5查询功能

2.5.1按教师号查询

2.5.2按职称查询

2.6排序功能

2.6.1按教师号排序

2.6.2按名字排序

三、课程设计要求

3.1设计一个主函数和多个子函数,每个子函数完成一个相对独立的子功能。

3.2程序运行时,首先进行口令检查,再显示菜单。并能根据菜单调用相应的函数功能。

口令程序段的功能要求:

3.2.1提示用户输入一个口令。

3.2.2用户输入口令后,若口令对,则提示用户通过,可执行后续程序;否则不通过。

3.2.3可对用户的口令输入进行次数限制(如:重复输入3次都不对),则自动退出系统。

3.3显示数据时,一页显示不下,可分页显示。

四、课程设计分析及实现

    由于教师系统在正常使用时,需要保存文件和读取文件,所以在实现课程设计要求的功能的基础上增加了保存和读取文件的功能函数。

图1 思维导图

4.1数据结构

数据结构设置为结构体Teacher,所包含的数据类型大多数都是字符型,虽然年龄和薪资可以选择整型和浮点型,但是为了输入方便以及统一格式,这里将全部数据元素类型都设置为字符型数组。

此项目选择用链表的形式作为存储结构,因此设置了一个结点的结构体和连接各个结点的链表结构。

typedef struct Teacher  //Teacher结构体
{
    char number[20];    //教师号
    char name[15];  //名字
    char sex[5];    //性别
    char age[5];    //年龄
    char degree[10];    //学历
    char title[10]; //职称
    char income[10];   //工资
    char add[20];   //住址
    char tel[15];   //电话
}Teacher;

typedef struct Node //Teacher的结点
{
    struct Teacher teacher;
    struct Node* next;
}Node;

typedef struct List //Teacher的链表
{
    Node* first; //头结点,方便排序操作
    Node* last;
    int sum;    //教师总数
}List;

4.2初始化教师信息系统

在主函数定义一个List型变量T,通过初始化函数来生成一个指向空的头结点,然后读取文件中已有的内容。

//初始化教师系统
void Init(List* T)
{
    T->first = T->last = (Node*)malloc(sizeof(Node));
    T->first->next = NULL;
    T->sum = 0;
    Read(T);    //初始化时读入文件内容
    cout << "请按回车键进入系统……" << endl;
    getchar();  //将此行注释掉则此函数直接跳到下一操作(主函数中)
    system("cls");  //清空屏幕
}

4.3教师信息录入功能

录入信息的时候采用的是while循环,旨在方便录入多个教师信息,而当录入完成时,输入0即可退出录入操作。在录入的同时会有sum在统计教师人数,可以方便后续功能的操作。

//录入信息
void Insert(List* T)
{
    Node* p, * q;
    p = T->first;
    while (p->next != NULL)
    {
        p = p->next;
    }

    while (1)
    {
        q = (Node*)malloc(sizeof(Node));
        cout << "-----------------------------------录入信息------------------------------------" << endl;
        cout << "                请分别输入以下信息,或者输入0并回车以选择返回:" << endl;
        cout << "教师号\t姓名\t性别\t年龄\t学历\t职称\t工资\t住址\t电话" << endl;
        cin >> q->teacher.number;
        if (strcmp(q->teacher.number, "0") == 0)
        {
            break;
        }

        cin >> q->teacher.name >> q->teacher.sex >> q->teacher.age >> q->teacher.degree >> q->teacher.title >> q->teacher.income >> q->teacher.add >> q->teacher.tel;
        q->next = NULL;
        p->next = T->last = q;
        p = q;
        T->sum++;
    }
}

4.4教师信息删除功能

当sum等于0时,说明系统中未有教师信息,因此返回提示语句。当系统不空时,提示用户输入所要删除的教师号进行删除操作,倘若要删除的教师号不存在系统中,提示用户。删除操作成功时,sum--,更新系统中的教师数量。

//删除操作
void Delete(List* T)
{
    Node* p, * q;
    char n[20];
    p = T->first->next;
    if (T->sum == 0)
    {
        cout << "错误!无可删除教师信息!返回!" << endl;
        return;
    }

    cout << "请输入要删除的教师号:";
    cin >> n;
    while (p!= NULL)
    {
        if (strcmp(p->teacher.number, n) == 0)
        {
            break;
        }
        p = p->next;
    }
    if (p != NULL)
    {
        q = T->first;
        while (q->next != p)
        {
            q = q->next;
        }
        q->next = q->next->next;
        free(p);
        T->sum--;
        cout << "删除成功!" << endl;
    }
    else
    {
        cout << "查无此人,无法删除!" << endl;
        return;
    }

}

4.5教师信息浏览功能

按照课程设计要求,当显示数据过多时,需要分页显示。因此,这里在浏览函数里实现分页显示的功能:假设一页显示十个老师的信息(实际上可以定义一个MAXNUM,然后根据实际需求更改),当只有一页时,提示用户输入【o】返回菜单;当有一页以上,在第一页时,提示“下一页”和“返回”;在最后一页时,提示“上一页”和“返回”;在中间时提示“上一页”、“下一页”和“返回”。

//可分页浏览功能
void Browser(List* T)
{
    int i = 0, j = 0, k = 0, _page = 0;
    char ch;
    Node* page[20];
    Node* p = T->first->next;
    Node* q;
    page[0] = T->first->next;//
    q = (Node*)malloc(sizeof(Node*));

    while (p != NULL)
    {
        p = p->next;
        i++;
        j = 10 - i;
        if (j == 0 && p != NULL)
        {
            j++;
            page[j] = p;
            _page++;
            //system("cls");
            i = 0;//
        }
    }
    i = 1;
    cout << "----------------------------------浏览菜单------------------------------------" << endl;
    while (i)//
    {
        j = 10;//
        q = page[k];
        cout << "教师号\t姓名\t性别\t年龄\t学历\t职称\t工资\t住址\t电话" << endl;
        while (q != NULL && j > 0)//
        {
            j--;
            cout << q->teacher.number << "\t" << q->teacher.name << "\t" << q->teacher.sex << "\t" << q->teacher.age <<
                "\t" << q->teacher.degree << "\t" << q->teacher.title << "\t" << q->teacher.income << "\t" << q->teacher.add << "\t" << q->teacher.tel << endl << endl;
            q = q->next;
        }
        cout << "------------------------------------------------------------------------------" << endl;
        if (_page == 0)
        {
            cout << "输入【o】返回上一级菜单。" << endl;
            cin >> ch;
            break;
        }
        else if (k > 0 && k < _page)//
        {
            cout << "输入【<】选择查看上一页,输入【o】返回上一级菜单,输入【>】选择查看下一页。" << endl;
            cin >> ch;
            switch (ch)
            {
            case '<':
                k--;
                break;
            case 'o':
                i = 0;
                break;
            case '>':
                k++;
                break;
            }
        }

        else if (k == _page)
        {
            cout << "输入【<】选择查看上一页,输入【o】返回上一级菜单。" << endl;
            cin >> ch;
            switch (ch)
            {
            case '<':
                k--;
                break;
            case 'o':
                i = 0;
                break;
            }
        }
        else if (k == 0)
        {
            cout << "输入【>】选择查看下一页,输入【o】返回上一级菜单。" << endl;
            cin >> ch;
            switch (ch)
            {
            case 'o':
                i = 0;
                break;
            case '>':
                k++;
                break;
            }
        }
        system("cls");
    }
    //cout << "------------------------------------------------------------------------------" << endl;
}

4.6教师信息查询功能

查询有两种查询方式,即按教师号或职称。查询过程高度相似,为了节省篇幅,只放出一个完整代码,另外一个只给出更换的内容。

这里采用顺序遍历的方法进行查询,逐个对比教师号,若成功匹配则返回该教师信息,否则提示用户查找失败。其中用到头文件<string.h>中的strcmp函数。(同理只需将代码第16行的p->teacher.number改成p->teacher.title即可实现按职称查询功能)

//按教师号查询
void Check_Num(List* T)
{
    char num[20];
    Node* p = T->first;
    cout << "请输入要查询的教师号:";
    cin >> num;

    if (p == NULL)
    {
        cout << "系统为空,无教师信息!" << endl;
        return;
    }
    while (p != NULL)
    {
        if (strcmp(p->teacher.number, num) == 0)
        {
            cout << "---------------------------------------教师号查询结果-----------------------------------------" << endl;
            cout << "教师号\t姓名\t性别\t年龄\t学历\t职称\t工资\t住址\t电话" << endl;
            cout << p->teacher.number << "\t" << p->teacher.name << "\t" << p->teacher.sex << "\t" << p->teacher.age << "\t" << p->teacher.degree << "\t"
                << p->teacher.title << "\t" << p->teacher.income << "\t" << p->teacher.add << "\t" << p->teacher.tel << endl;
            break;
        }
        p = p->next;
    }
    if (p == NULL)
    {
        cout << "查询的教师信息不存在!" << endl;
        return;
    }
}
//按职称查询
void Check_Title(List* T)
{
    char t[10];
    Node* p = T->first;
    cout << "请输入要查询的职称:";
    cin >> t;

    if (p == NULL)
    {
        cout << "系统为空,无教师信息!";
        return;
    }
    while (p != NULL)
    {
        if (strcmp(p->teacher.title, t) == 0)
        {
            cout << "---------------------------------------职称查询结果-----------------------------------------" << endl;
            cout << "教师号\t姓名\t性别\t年龄\t学历\t职称\t工资\t住址\t电话" << endl;
            cout << p->teacher.number << "\t" << p->teacher.name << "\t" << p->teacher.sex << "\t" << p->teacher.age << "\t" << p->teacher.degree <<
                "\t" << p->teacher.title << "\t" << p->teacher.income << "\t" << p->teacher.add << "\t" << p->teacher.tel << endl;
            //break;
        }
        p = p->next;
    }
    if (p == NULL)
    {
        //cout << "查询教师信息不存在!" << endl;
        return;
    }
}

4.7教师信息排序功能

因为采用的是链表的存储方式,所以选择快速排序方法,排序大致过程如下图所示

图2 排序示意图

同查询功能一般,排序功能也有按教师号和名字两种排序方法。排序过程也是高度相似,所以只给出其中一个完整函数。(只需将代码第20行的strcmp(s->teacher.number, p->next->teacher.number) > 0改成strcmp(s->teacher.name, p->next->teacher.name) > 0即可实现按名字排序功能)

//按教师号排序
void Sort_Num(List* T)
{
    if (T->sum == 0 || T->sum == 1)
    {
        cout << "无教师信息或只有一个信息,无需排序!" << endl;
        return;
    }
    Node* s = T->first->next;
    Node* q = s->next;
    T->last = s;
    T->last->next = NULL;

    while (q != NULL)
    {
        s = q;
        q = q->next;

        Node* p = T->first;
        while (p->next != NULL && strcmp(s->teacher.number, p->next->teacher.number) > 0)
        {
            p = p->next;
        }
        if (p->next == NULL)
        {
            T->last = s;
        }

        s->next = p->next;
        p->next = s;
    }
}
//按名字排序
void Sort_Name(List* T)
{
    if (T->sum == 0 || T->sum == 1)
    {
        cout << "无教师信息或只有一个信息,无需排序!" << endl;
        return;
    }
    Node* s = T->first->next;
    Node* q = s->next;
    T->last = s;
    T->last->next = NULL;

    while (q != NULL)
    {
        s = q;
        q = q->next;

        Node* p = T->first;
        while (p->next != NULL && strcmp(s->teacher.name, p->next->teacher.name) > 0)
        {
            p = p->next;
        }
        if (p->next == NULL)
        {
            T->last = s;
        }

        s->next = p->next;
        p->next = s;
    }
}

4.8保存文件功能

将List型变量T中的数据如数保存到“教师信息管理系统.txt”文件上,方便下次操作读取。保存成功后给用户显示保存成功的信息。保存操作采取覆盖式保存,因为在一开始初始化的时候就会读取文件内容,所以无需担心数据丢失问题。

//保存文件
void Save(List* T)
{
    ofstream outfile;
    Node* p = T->first;

    if (p == NULL)
    {
        cout << "系统为空!" << endl;
        return;
    }
    else
    {
        p = p->next;
    }
    outfile.open("教师信息管理系统.txt");
    while (p != NULL)
    {
        outfile << p->teacher.number << " " << p->teacher.name << " " << p->teacher.sex << " " << p->teacher.age << " " << p->teacher.degree << " " <<
            p->teacher.title << " " << p->teacher.income << " " << p->teacher.add << " " << p->teacher.tel << endl;
        p = p->next;
    }
    cout << "----------文件保存成功!----------" << endl;
    outfile.close();
}

4.9读取文件功能

读取文件在初始化时默认读取,导入教师信息,因此为了防止信息重复的情况,在功能菜单中不显示文件读取功能。

//读取文件
void Read(List* T)
{
    ifstream infile;

    Node* p, * q;
    p = T->first;
    while (p->next != NULL)
    {
        p = p->next;
    }
    infile.open("教师信息管理系统.txt");

    while (1)
    {
        q = (Node*)malloc(sizeof(Node));
        infile >> q->teacher.number;
        if (infile.peek() == EOF)
            break;

        infile >> q->teacher.name >> q->teacher.sex >> q->teacher.age >> q->teacher.degree >>
            q->teacher.title >> q->teacher.income >> q->teacher.add >> q->teacher.tel;

        q->next = NULL;
        p->next = T->last = q;
        p = q;
        T->sum++;
    }
    cout << "----------文件读取成功!----------" << endl;
    infile.close();
}

五、系统调试和测试

5.1开始界面

       程序运行时,显示开始界面如图所示,按下回车键即可进入下一个操作

图3

5.2登录操作

       (1)代码中所给的登录密码为:123456,当输入密码错误时,如图4所示,提示用户还有几次登录机会。

图4

(2)当四次机会全部用完,密码仍然错误时,退出系统,显示如下界面

图5

(3)当密码正确时,提示进入下一个操作

图6

5.3开始菜单

       当输入密码正确进入菜单如图7所示,每个功能都有相对应的选择号码,输入数字按下回车键即可进入对应的功能。

图7

5.4【1】录入功能

       当录入完毕时,根据系统提示操作,输入【0】并回车,即可结束录入功能,重新进入菜单选择后续操作。如果不能确定是否成功录入,可输入【3】进行浏览查看。

图8

图9   图10

5.5【2】删除功能

       输入要删除的教师号并回车,若所删除的教师号存在于系统,则可完成删除操作。

图11

图12   图13  删除前

图14   图15  删除后

       若删除的教师号不存在系统中,则提示用户查无此人。

图16

5.6【3】浏览功能

       一页显示十个老师的信息,当只有一页时,提示用户输入【o】返回菜单;当有一页以上,在第一页时,提示“下一页”和“返回”;在最后一页时,提示“上一页”和“返回”;在中间时提示“上一页”、“下一页”和“返回”。

    这里从文件读取的刚好有11位老师,因此分两页显示。

图17   图18  浏览信息

5.7【4】按教师号查询

       倘若要查询的教师在系统中,返回该教师信息。

图19

       若不存在,则提示用户不存在。

图20

5.8【5】按职称查询

       当信息存在,如图21所示

图21

       当职称不存在,如图22所示,直接返回菜单

图22

5.9【6】按教师号排序 

按教师号排序后如图23和图24所示

图23   图24 按教师号排序后

5.10【7】按名字排序

       按名字排序后如图25和26所示

图25  图26 按名字排序后

5.11【8】保存文件

图27

5.12【0】关闭菜单

       输入【0】时,关闭菜单,退出系统,显示如下界面:

图28

六、完整代码

   

#include<iostream>
#include<string.h>
#include<assert.h>
#include<fstream>

using namespace std;

typedef struct Teacher  //Teacher结构体
{
    char number[20];    //教师号
    char name[15];  //名字
    char sex[5];    //性别
    char age[5];    //年龄
    char degree[10];    //学历
    char title[10]; //职称
    char income[10];   //工资
    char add[20];   //住址
    char tel[15];   //电话
}Teacher;

typedef struct Node //Teacher的结点
{
    struct Teacher teacher;
    struct Node* next;
}Node;

typedef struct List //Teacher的链表
{
    Node* first; //头结点,方便排序操作
    Node* last;
    int sum;    //教师总数
}List;

void Read(List* T);

//初始化教师系统
void Init(List* T)
{
    T->first = T->last = (Node*)malloc(sizeof(Node));
    T->first->next = NULL;
    T->sum = 0;
    Read(T);    //初始化时读入文件内容
    cout << "请按回车键进入系统……" << endl;
    getchar();  //将此行注释掉则此函数直接跳到下一操作(主函数中)
    system("cls");  //清空屏幕
}

//开始时显示界面
void Begin()
{
    cout << "当前时间:";
    system("date/t");   //显示当前日期
    //system ( "time/t");   //当前时刻
    cout << "*********************************************" << endl;
    cout << "* ----------------------------------------- *" << endl;
    cout << "*|                                         |*" << endl;
    cout << "*|                                         |*" << endl;
    cout << "*|       欢迎访问教师信息管理系统!         |*" << endl;
    cout << "*|                                         |*" << endl;
    cout << "*|           ---------------               |*" << endl;
    cout << "*|                                         |*" << endl;
    cout << "* ----------------------------------------- *" << endl;
    cout << "*********************************************" << endl;
    cout << endl;
    cout << "请按回车键进入登录……" << endl;
    getchar();  //将此行注释掉则此函数直接跳到下一操作(主函数中)
    system("cls");  //清空屏幕
}

//结束时显示界面
void End()
{
    system("cls");
    cout << "当前时间:";
    system("date/t");
    cout << "*****************************************************" << endl;
    cout << "* ------------------------------------------------- *" << endl;
    cout << "*|                                                 |*" << endl;
    cout << "*|                                                 |*" << endl;
    cout << "*|     感谢访问教师信息管理系统!欢迎下次再来!      |*" << endl;
    cout << "*|                                                 |*" << endl;
    cout << "*|                                                 |*" << endl;
    cout << "* ------------------------------------------------- *" << endl;
    cout << "*****************************************************" << endl;
    cout << endl;
}

//录入信息
void Insert(List* T)
{
    Node* p, * q;
    p = T->first;
    while (p->next != NULL)
    {
        p = p->next;
    }

    while (1)
    {
        q = (Node*)malloc(sizeof(Node));
        cout << "-----------------------------------录入信息------------------------------------" << endl;
        cout << "                请分别输入以下信息,或者输入0并回车以选择返回:" << endl;
        cout << "教师号\t姓名\t性别\t年龄\t学历\t职称\t工资\t住址\t电话" << endl;
        cin >> q->teacher.number;
        if (strcmp(q->teacher.number, "0") == 0)
        {
            break;
        }

        cin >> q->teacher.name >> q->teacher.sex >> q->teacher.age >> q->teacher.degree >> q->teacher.title >> q->teacher.income >> q->teacher.add >> q->teacher.tel;
        q->next = NULL;
        p->next = T->last = q;
        p = q;
        T->sum++;
    }
}

//删除操作
void Delete(List* T)
{
    Node* p, * q;
    char n[20];
    p = T->first->next;
    if (T->sum == 0)
    {
        cout << "错误!无可删除教师信息!返回!" << endl;
        return;
    }

    cout << "请输入要删除的教师号:";
    cin >> n;
    while (p!= NULL)
    {
        if (strcmp(p->teacher.number, n) == 0)
        {
            break;
        }
        p = p->next;
    }
    if (p != NULL)
    {
        q = T->first;
        while (q->next != p)
        {
            q = q->next;
        }
        q->next = q->next->next;
        free(p);
        T->sum--;
        cout << "删除成功!" << endl;
    }
    else
    {
        cout << "查无此人,无法删除!" << endl;
        return;
    }

}

//可分页浏览功能
void Browser(List* T)
{
    int i = 0, j = 0, k = 0, _page = 0;
    char ch;
    Node* page[20];
    Node* p = T->first->next;
    Node* q;
    page[0] = T->first->next;//
    q = (Node*)malloc(sizeof(Node*));

    while (p != NULL)
    {
        p = p->next;
        i++;
        j = 10 - i;
        if (j == 0 && p != NULL)
        {
            j++;
            page[j] = p;
            _page++;
            //system("cls");
            i = 0;//
        }
    }
    i = 1;
    cout << "----------------------------------浏览菜单------------------------------------" << endl;
    while (i)//
    {
        j = 10;//
        q = page[k];
        cout << "教师号\t姓名\t性别\t年龄\t学历\t职称\t工资\t住址\t电话" << endl;
        while (q != NULL && j > 0)//
        {
            j--;
            cout << q->teacher.number << "\t" << q->teacher.name << "\t" << q->teacher.sex << "\t" << q->teacher.age <<
                "\t" << q->teacher.degree << "\t" << q->teacher.title << "\t" << q->teacher.income << "\t" << q->teacher.add << "\t" << q->teacher.tel << endl << endl;
            q = q->next;
        }
        cout << "------------------------------------------------------------------------------" << endl;
        if (_page == 0)
        {
            cout << "输入【o】返回上一级菜单。" << endl;
            cin >> ch;
            break;
        }
        else if (k > 0 && k < _page)//
        {
            cout << "输入【<】选择查看上一页,输入【o】返回上一级菜单,输入【>】选择查看下一页。" << endl;
            cin >> ch;
            switch (ch)
            {
            case '<':
                k--;
                break;
            case 'o':
                i = 0;
                break;
            case '>':
                k++;
                break;
            }
        }

        else if (k == _page)
        {
            cout << "输入【<】选择查看上一页,输入【o】返回上一级菜单。" << endl;
            cin >> ch;
            switch (ch)
            {
            case '<':
                k--;
                break;
            case 'o':
                i = 0;
                break;
            }
        }
        else if (k == 0)
        {
            cout << "输入【>】选择查看下一页,输入【o】返回上一级菜单。" << endl;
            cin >> ch;
            switch (ch)
            {
            case 'o':
                i = 0;
                break;
            case '>':
                k++;
                break;
            }
        }
        system("cls");
    }
    //cout << "------------------------------------------------------------------------------" << endl;
}

//按教师号查询
void Check_Num(List* T)
{
    char num[20];
    Node* p = T->first;
    cout << "请输入要查询的教师号:";
    cin >> num;

    if (p == NULL)
    {
        cout << "系统为空,无教师信息!" << endl;
        return;
    }
    while (p != NULL)
    {
        if (strcmp(p->teacher.number, num) == 0)
        {
            cout << "---------------------------------------教师号查询结果-----------------------------------------" << endl;
            cout << "教师号\t姓名\t性别\t年龄\t学历\t职称\t工资\t住址\t电话" << endl;
            cout << p->teacher.number << "\t" << p->teacher.name << "\t" << p->teacher.sex << "\t" << p->teacher.age << "\t" << p->teacher.degree << "\t"
                << p->teacher.title << "\t" << p->teacher.income << "\t" << p->teacher.add << "\t" << p->teacher.tel << endl;
            break;
        }
        p = p->next;
    }
    if (p == NULL)
    {
        cout << "查询的教师信息不存在!" << endl;
        return;
    }
}

//按职称查询
void Check_Title(List* T)
{
    char t[10];
    Node* p = T->first;
    cout << "请输入要查询的职称:";
    cin >> t;

    if (p == NULL)
    {
        cout << "系统为空,无教师信息!";
        return;
    }
    while (p != NULL)
    {
        if (strcmp(p->teacher.title, t) == 0)
        {
            cout << "---------------------------------------职称查询结果-----------------------------------------" << endl;
            cout << "教师号\t姓名\t性别\t年龄\t学历\t职称\t工资\t住址\t电话" << endl;
            cout << p->teacher.number << "\t" << p->teacher.name << "\t" << p->teacher.sex << "\t" << p->teacher.age << "\t" << p->teacher.degree <<
                "\t" << p->teacher.title << "\t" << p->teacher.income << "\t" << p->teacher.add << "\t" << p->teacher.tel << endl;
            //break;
        }
        p = p->next;
    }
    if (p == NULL)
    {
        //cout << "查询教师信息不存在!" << endl;
        return;
    }
}

//按教师号排序
void Sort_Num(List* T)
{
    if (T->sum == 0 || T->sum == 1)
    {
        cout << "无教师信息或只有一个信息,无需排序!" << endl;
        return;
    }
    Node* s = T->first->next;
    Node* q = s->next;
    T->last = s;
    T->last->next = NULL;

    while (q != NULL)
    {
        s = q;
        q = q->next;

        Node* p = T->first;
        while (p->next != NULL && strcmp(s->teacher.number, p->next->teacher.number) > 0)
        {
            p = p->next;
        }
        if (p->next == NULL)
        {
            T->last = s;
        }

        s->next = p->next;
        p->next = s;
    }
}

//按名字排序
void Sort_Name(List* T)
{
    if (T->sum == 0 || T->sum == 1)
    {
        cout << "无教师信息或只有一个信息,无需排序!" << endl;
        return;
    }
    Node* s = T->first->next;
    Node* q = s->next;
    T->last = s;
    T->last->next = NULL;

    while (q != NULL)
    {
        s = q;
        q = q->next;

        Node* p = T->first;
        while (p->next != NULL && strcmp(s->teacher.name, p->next->teacher.name) > 0)
        {
            p = p->next;
        }
        if (p->next == NULL)
        {
            T->last = s;
        }

        s->next = p->next;
        p->next = s;
    }
}

//保存文件
void Save(List* T)
{
    ofstream outfile;
    Node* p = T->first;

    if (p == NULL)
    {
        cout << "系统为空!" << endl;
        return;
    }
    else
    {
        p = p->next;
    }
    outfile.open("教师信息管理系统.txt");
    while (p != NULL)
    {
        outfile << p->teacher.number << " " << p->teacher.name << " " << p->teacher.sex << " " << p->teacher.age << " " << p->teacher.degree << " " <<
            p->teacher.title << " " << p->teacher.income << " " << p->teacher.add << " " << p->teacher.tel << endl;
        p = p->next;
    }
    cout << "----------文件保存成功!----------" << endl;
    outfile.close();
}

//读取文件
void Read(List* T)
{
    ifstream infile;

    Node* p, * q;
    p = T->first;
    while (p->next != NULL)
    {
        p = p->next;
    }
    infile.open("教师信息管理系统.txt");

    while (1)
    {
        q = (Node*)malloc(sizeof(Node));
        infile >> q->teacher.number;
        if (infile.peek() == EOF)
            break;

        infile >> q->teacher.name >> q->teacher.sex >> q->teacher.age >> q->teacher.degree >>
            q->teacher.title >> q->teacher.income >> q->teacher.add >> q->teacher.tel;

        q->next = NULL;
        p->next = T->last = q;
        p = q;
        T->sum++;
    }
    cout << "----------文件读取成功!----------" << endl;
    infile.close();
}

//密码登录功能
bool Log_in()
{
    int n = 3;
    char key[15];
    char password[15] = { "123456" };
    cout << "请输入登录密码:";
    cin >> key;
    while (n > 0 && strcmp(key, password) != 0)
    {
        cout << "你还有" << n << "次机会,请重新输入正确密码:";
        cin >> key;
        n--;
    }
    system("cls");
    if (n <= 0)
    {
        cout << "机会已用完,程序结束运行!" << endl;
        return false;
    }
    else
    {
        cout << "密码正确,请继续选择操作!" << endl;
        return true;
    }
}

int main()
{
    List T;
    int select = 1; //控制循环的进行
    Begin();    //显示开始界面
    //密码登录
    int L = Log_in();
    if (L == 0)
    {
        return 0;
    }
    getchar();
    //初始化链表,载入文件信息
    Init(&T);
    //功能选择菜单
    while (select)
    {
        cout << "***********************************************" << endl;
        cout << "* ------------------菜单--------------------- *" << endl;
        cout << "*|                                           |*" << endl;
        cout << "*|   【0】关闭菜单     【1】录入功能         |*" << endl;
        cout << "*|   【2】删除功能     【3】浏览功能         |*" << endl;
        cout << "*|   【4】按教师号查询 【5】按职称查询       |*" << endl;
        cout << "*|   【6】按教师号排序 【7】按名字排序       |*" << endl;
        cout << "*|   【8】保存文件                           |*" << endl;
        cout << "*|                                           |*" << endl;
        cout << "* ------------------------------------------- *" << endl;
        cout << "***********************************************" << endl;
        cout << "请选择:";
        cin >> select;

        if (select == 0)
        {
            break;
        }
        switch (select)
        {
        case 1:
            Insert(&T);
            break;
        case 2:
            Delete(&T);
            break;
        case 3:
            Browser(&T);
            break;
        case 4:
            Check_Num(&T);
            break;
        case 5:
            Check_Title(&T);
            break;
        case 6:
            Sort_Num(&T);
            break;
        case 7:
            Sort_Name(&T);
            break;
        case 8:
            Save(&T);
            break;
        case 9:
            Read(&T);
            break;
        }//switch
    }//while
    End();  //显示结束界面
    return 0;
}
举报

相关推荐

0 条评论