【课设大作业】基于C语言的教学信息管理系统

  1. 课程设计题目与要求

教学信息管理系统

题目描述:

根据教师的授课信息对教学信息进行管理。每一条记录包括一位教师的职工号、姓名、职称、性别、3 门主讲课程(课程名称、开课学期、课程性质(学位与非学位课)和教学效果),教学效果综合评分。

功能要求:

(1) 输入功能:可以一次完成若干条记录的输入。

(2) 显示功能:完成全部教师记录的显示。

(3) 查找功能:完成按姓名或课程查找教师的相关记录,并显示。

(4) 排序功能:按职工号或教学效果综合评分进行排序。

(5) 插入功能:按教学效果综合评分高低插入一条教师记录。

题目要求:

(1) 按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。

(2) 为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。

输入要求:

(1) 应用程序运行后在屏幕上显示一个菜单。用户可以根据需求,选定相应的操作项目。进入个操作后,根据应用程序的提示信息,从键盘输入相应的信息。程序根据用户输入的信息完成相应的处理,实现要求的功能。

(2) 能对输入的数据进行简单的校验,例如,职工号的唯一性,性别只能输入“男”或者“女”等。

输出要求:

(1) 应用程序运行后,要在屏幕上显示一个菜单。

(2) 要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式以及结束方式等。

(3) 在程序完成处理后,要清楚地给出程序的处理结果。例如,在给定删除信息时,如果该信息不存在,要提示没能删除,如果删除成功要提示删除成功。

实现要求:

采用模块化程序设计的方法,将程序中的各项功能用函数实现。

提示:

使用结构体表示教师教学信息,一个结点保存一条教师教学信息。

扩展功能:

(1) 提供统计功能。比如统计所有教师教学效果综合评分的平均分,最高分,最低分等。

(2) 教师教学信息从文件读入。

(3) 将教师教学信息保存到文件中。

  1. 系统设计
    1. 系统功能模块划分
      1. 系统功能模块划分说明

教学信息管路系统由主菜单、输入、显示、查找、排查、排序、插入、统计、文件读入、信息保存、退出这些部分组成。

1、主菜单页面。

2、输入功能,可以一次完成若干条记录的输入。

3、显示功能,完成全部教师记录的显示。

4、查找功能,完成按姓名或课程查找教师的相关记录,并显示。

5、排序功能,按职工号或教学效果综合评分进行排序。

6、插入功能,按教学效果综合评分高低插入一条教师记录。

7、提供统计功能。比如统计所有教师教学效果综合评分的平均分,最高分,最低分等。

8、教师教学信息从文件读入。

9、将教师教学信息保存到文件中。

    1. 数据结构设计
      1. 结构体

程序要求文档中要求使用结构体数组完成设计,每一条记录包括一位教师的职工号、姓名、职称、性别、 3 门主讲课程(课程名称、开课学期、课程性质(学位与非学位课)和教学效果),教学效果综合评分。数据结构设计如下:

typedef struct Course{ // 课程的定义与描述  

 char  courseName [40]; // 课程名称

 int semester; // 开课学期

 char type[8]; // 课程性质

 char  teceff ; // 教学效果  

}Course ;

typedef struct Teacher{ // 教师的定义与描述  

 char name[8]; // 姓名  

 int num; // 职工号

 char sex[2]; // 性别

 int  tecscore ; // 教学效果综合评分

 char position[8]; // 职称  

 Course course[3]; //3 门主讲课程  

}Teacher ;

      1. 单链表

(1)输入记录模块。完成将数据存入单链表的工作。记录可以从以二进制形式存储的数据文件中读入,也可从键盘逐个输入教师信息记录。教师记录由教师的基本信息构成。当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。

(2)显示记录模块。完成在单链表中需要显示的教师信息记录。显示出教师的职工号、姓名、职称、性别、3 门主讲课程(课程名称、开课学期、课程性质(学位与非学位课)和教学效果),教学效果综合评分等全部信息。

(3)查找记录模块。完成在单链表中查找满足相关条件的教师记录。在此教师信息管理系统中,用户可以按照教师的工号或姓名在单链表中进行查找。若找到该教师的记录,则返回指向该教师的记录的指针。否则返回一个值为NULL的空指针。

(4)排序记录模块。完成在单链表中需要排序的教师信息记录。在此教师信息管理系统中,用户可以按职工号或教学效果综合评分进行排序。

(5)插入记录模块。完成在单链表中所需插入的教师信息记录。在此教师信息管理系统中,用户可以按教学效果综合评分高低插入一条教师记录。

(6)统计记录模块。完成对所有教师教学效果综合评分的平均分,最高分,最低分等的统计。在此教师信息管理系统中,用户可以对教师教学效果综合评分以不同形式的再计算,然后对其进行统计。

(7)教师教学信息从文件读入。

(8)将教师教学信息保存到文件中,实现对教师教学信息记录的存盘,

    1. 函数的规划与设计

首先对主函数进行设计,使其以图片的形式输出全部教学信息 ,主要利用 printf ,如下所示:

void  PrintInfor (Teacher T[]){ // 输出全部教师信息(以卡片形式)  

printf ("--------------------------------------------------------------------------------");

  printf ("|  所有教师记录  |");

  printf ("-------------------------------------------------------------------------------+");

  printf ("|  全院现有在职教师 %d 名,全部信息如下  |", TeacherNum );

  printf ("-------------------------------------------------------------------------------+\ n\n");

  for( int  i =0;i< TeacherNum ;++ i ){

  printf ("+------+---------------+----+------------+----+------+------+------------------+");

  printf ("| 职工号 | %3d | 姓名 | %8s | 性别 | %s | 职称  | %8s |",T[ i ]. num,T [ i ]. name,T [ i ]. sex,T [ i ].position);

  printf ("+------+---+-----------+----+------------+----+------+------+------------------+");

  printf ("| 主讲课程 1 |  课程名  | %-40s |",T[ i ].course[0]. courseName );

  printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("|  学期  | %d | 课程性质  | %8s |  教学效果  | %c |",T[i].course[0].semester,T[i].course[0].type,T[i].course[0].teceff);

  printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("| 主讲课程 2 |  课程名  | %-40s |",T[ i ].course[1]. courseName );

  printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("|  学期  | %d | 课程性质  | %8s |  教学效果  | %c |",T[i].course[1].semester,T[i].course[1].type,T[i].course[1].teceff);

  printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("| 主讲课程 3 |  课程名  | %-40s |",T[ i ].course[2]. courseName );

    printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("|  学期  | %d | 课程性质  | %8s |  教学效果  | %c |",T[i].course[2].semester,T[i].course[2].type,T[i].course[2].teceff);

  printf ("+----------+-----+-----+----------+------------------+------------+------------+");

  printf ("| 教学效果综合评分 | %3d |",T[ i ]. tecscore );

  printf ("+----------------+-------------------------------------------------------------+\n\n");

 system("PAUSE"); // 输完一个教师信息,等待用户查看确认,确认无误后再打印下 一教师 的相关信息  

 }//for  

}// PrintInfor

然后逐个完成子函数,其中排序函数利用冒泡法,如下:

void  Sort_ N ( Teacher T[],int n){

 // 当 n=1 时按职工号排序,当 n=2 时按教学效果综合评分排序  

 if(n==1){ // 按职工号排序  

   Teacher temp;

   for(int  i =0;i<TeacherNum-1;i++){ // 冒泡法排序  

      for( int j=0;j<TeacherNum-1-i;j++)

     if(T[j+1].num<T[j]. num){

       temp=T[j];

     T[j]=T[j+1];

     T[j+ 1]= temp;

     }//if

   }//for

    printf (" 排序结果如下: \n");

    for( int  i =0;i< TeacherNum;i ++){

      printf ( " %8s[%d] ",T[ i ]. name,T [ i ].num);

   }//for

    printf ("\n");  

 }//if

 else{ // 按教学效果综合评分排序  

 Teacher temp;

   for(int  i =0;i<TeacherNum-1;++ i ){ // 冒泡法排序  

      for( int j=0;j<TeacherNum-1-i;++j)

     if(T[j+1 ]. tecscore <T[j]. tecscore ){

       temp=T[j];

     T[j]=T[j+1];

     T[j+ 1]= temp;

     }//if

   }//for

    for( int  i =0;i< TeacherNum;i ++){

      printf ("\t\t\t 第 %d 名 : %-8s  分数: %3d\n",i+1,T[ i ]. name,T [ i ]. tecscore );

   }//for

 }//else

}// Sort_N

而信息插入函数要考虑信息插入的位置,先完成一次排序,在将信息插入指定位置,详情参考源程序。

函数列表和调用关系:

void  InputClassInfor (Course c)   // 课程输入函数

void  InputInfor (Teacher T[MAXTEACHERNUM])   // 教师信息输入函数

void  PrintInfor (Teacher T[])   // 输出函数

void  Search_N (Teacher T[], int n)       // 查找函数

void  SearchInfor (Teacher T[])     // 查找教师信息(总函数)

void  Sort_N (Teacher T[], int n)   // 排序函数

void  InsertInfor (Teacher T[])   // 插入函数

void  SaveFile (Teacher T[])   // 文件保存函数

void  OpenFile (Teacher T[])   // 文件打开函数

int main(int  argc , char*  argv [])   // 菜单函数

构建数据结构

typedef struct Course{ // 课程的定义与描述  

 char  courseName [40]; // 课程名称

 int semester; // 开课学期

 char type[8]; // 课程性质

 char  teceff ; // 教学效果  

}Course ;

typedef struct Teacher{ // 教师的定义与描述  

 char name[8]; // 姓名  

 int num; // 职工号

 char sex[2]; // 性别

 int  tecscore ; // 教学效果综合评分

 char position[8]; // 职称  

 Course course[3]; //3 门主讲课程  

}Teacher ;
    1. 主函数流程分析与设计
      1. 主函数设计说明
void  InputClassInfor (Course c)   // 课程输入函数

void  InputInfor (Teacher T[MAXTEACHERNUM])   // 教师信息输入函数

void  PrintInfor (Teacher T[])   // 输出函数

void  Search_N (Teacher T[], int n)       // 查找函数

void  SearchInfor (Teacher T[])     // 查找教师信息(总函数)

void  Sort_N (Teacher T[], int n)   // 排序函数

void  InsertInfor (Teacher T[])   // 插入函数

void  SaveFile (Teacher T[])   // 文件保存函数

void  OpenFile (Teacher T[])   // 文件打开函数

int main(int  argc , char*  argv [])   // 菜单函数

主函数设计,主要利用 printf ,如下所示

void  PrintInfor (Teacher T[]){ // 输出全部教师信息(以卡片形式)  

printf ("--------------------------------------------------------------------------------");

  printf ("|  所有教师记录  |");

  printf ("-------------------------------------------------------------------------------+");

  printf ("|  全院现有在职教师 %d 名,全部信息如下  |", TeacherNum );

  printf ("-------------------------------------------------------------------------------+\ n\n");

  for( int  i =0;i< TeacherNum ;++ i ){

  printf ("+------+---------------+----+------------+----+------+------+------------------+");

  printf ("| 职工号 | %3d | 姓名 | %8s | 性别 | %s | 职称  | %8s |",T[ i ]. num,T [ i ]. name,T [ i ]. sex,T [ i ].position);

  printf ("+------+---+-----------+----+------------+----+------+------+------------------+");

  printf ("| 主讲课程 1 |  课程名  | %-40s |",T[ i ].course[0]. courseName );

  printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("|  学期  | %d | 课程性质  | %8s |  教学效果  | %c |",T[i].course[0].semester,T[i].course[0].type,T[i].course[0].teceff);

  printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("| 主讲课程 2 |  课程名  | %-40s |",T[ i ].course[1]. courseName );

  printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("|  学期  | %d | 课程性质  | %8s |  教学效果  | %c |",T[i].course[1].semester,T[i].course[1].type,T[i].course[1].teceff);

  printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("| 主讲课程 3 |  课程名  | %-40s |",T[ i ].course[2]. courseName );

    printf ("+----------+-----------+----------+------------------+------------+------------+");

  printf ("|  学期  | %d | 课程性质  | %8s |  教学效果  | %c |",T[i].course[2].semester,T[i].course[2].type,T[i].course[2].teceff);

  printf ("+----------+-----+-----+----------+------------------+------------+------------+");

  printf ("| 教学效果综合评分 | %3d |",T[ i ]. tecscore );

  printf ("+----------------+-------------------------------------------------------------+\n\n");

 system("PAUSE"); // 输完一个教师信息,等待用户查看确认,确认无误后再打印下 一教师 的相关信息  

 }//for  

}// PrintInfor

    1. 主要功能模块的流程分析与设计
      1. 功能模块的设计说明

教学信息管理系统功能分为管理学生证信息和查询学生证信息两大部分,其中管理学生证信息包括录入教师信息,显示教师信息,查找教师信息,插入教师信息,统计教师信息和保存教师信息。查询教师教学信息可以通过查询教师姓名和查询教师的课程安排。排序教师教学信息可以通过教师职工号和教师的教学评分。

教学信息管理系统开始时,在主菜单界面中会出现输入信息,显示信息,查找信息,插入信息,排序信息和统计信息等可供选择。当选择查找功能时,便可通过教师的姓名或者所教的课程,对教师的相关记录进行查询。当选择排序功能时,便可以按找教师职工号或者教学效果综合评分对教师进行排序。当选择排序功能时,便可按照如统计所有教师教学效果综合评分的平均分,最高分,最低分等,对教师的教学信息进行统计。当选择输入功能时,便可对教师的教学星系一次性完成若干条输入。当选择保留功能是,教师的信息便可保留到文件中。

      1. 流程图
  1. 程序测试与运行结果
#include <iostream>

#include <cstdio>

#include <string>

#include <cstdlib>



using namespace std;



typedef struct//课程信息

{

    string class_name;

    string class_date;

    string class_type;

    string class_effect;



}Class;



typedef struct//教师信息

{

    string num;

    string name;

    string pos;

    string sexul;

    Class class1;

    Class class2;

    int sumscore;



}Teacher;



typedef struct teacher_xinxi//创建链表节点

{

    Teacher teacher;

    struct teacher_xinxi *next;



}Linklist;



//创建链表

Linklist * creatlinklist(int num)

{

    Linklist *head_node , *temp_node, *end_node;

    head_node = new Linklist;

    if(head_node == NULL){

        //cout<<"内存分配失败"<<endl;

        return NULL;

    }

    end_node = head_node;//刚开始没有存数据的是时候,头节点就是尾节点

    //开始输入学生数据

    for(int i = 1; i <= num; i++){

        temp_node = new Linklist;

        cin>>temp_node->teacher.num>>temp_node->teacher.name>>temp_node->teacher.pos>>temp_node->teacher.sexul;

        cin>>temp_node->teacher.class1.class_name>>temp_node->teacher.class1.class_date>>temp_node->teacher.class1.class_type>>temp_node->teacher.class1.class_effect;

        cin>>temp_node->teacher.class2.class_name>>temp_node->teacher.class2.class_date>>temp_node->teacher.class2.class_type>>temp_node->teacher.class2.class_effect;

        cin>>temp_node->teacher.sumscore;

        end_node->next = temp_node;

        end_node = temp_node;

    }

    end_node->next = NULL;

    return head_node;

}



//输出链表中的内容

void display_Linklist(Linklist *h)

{

    while(h->next != NULL){

        h = h->next;

        cout<<h->teacher.num<<" "<<h->teacher.name<<" "<<h->teacher.pos<<" "<<h->teacher.sexul<<" ";

        cout<<h->teacher.class1.class_name<<" "<<h->teacher.class1.class_date<<" "<<h->teacher.class1.class_type<<" "<<h->teacher.class1.class_effect<<" ";

        cout<<h->teacher.class2.class_name<<" "<<h->teacher.class2.class_date<<" "<<h->teacher.class2.class_type<<" "<<h->teacher.class2.class_effect;

        cout<<" "<<h->teacher.sumscore<<endl;

    }

}



//查找链表中的内容

int Search_teacher(string flag,Linklist *h)

{

    int res = 0;//记录已经找到的符合条件的教师数量;

    while(NULL != h->next){

        h = h->next;

        if(flag == h->teacher.name||flag == h->teacher.class1.class_name||flag == h->teacher.class2.class_name){

            cout<<h->teacher.num<<" "<<h->teacher.name<<" "<<h->teacher.pos<<" "<<h->teacher.sexul<<" ";

            cout<<h->teacher.class1.class_name<<" "<<h->teacher.class1.class_date<<" "<<h->teacher.class1.class_type<<" "<<h->teacher.class1.class_effect<<" ";

            cout<<h->teacher.class2.class_name<<" "<<h->teacher.class2.class_date<<" "<<h->teacher.class2.class_type<<" "<<h->teacher.class2.class_effect;

            cout<<" "<<h->teacher.sumscore<<endl;

            res++;

        }

    }

    return res;

}



//修改系统中某教师信息

int Change_Linklist(string flag_num,Linklist *h)

{

    while(NULL != h->next){

        h = h->next;

        if(flag_num == h->teacher.num){

            cin>>h->teacher.num>>h->teacher.name>>h->teacher.pos>>h->teacher.sexul;

            cin>>h->teacher.class1.class_name>>h->teacher.class1.class_date>>h->teacher.class1.class_type>>h->teacher.class1.class_effect;

            cin>>h->teacher.class2.class_name>>h->teacher.class2.class_date>>h->teacher.class2.class_type>>h->teacher.class2.class_effect;

            cin>>h->teacher.sumscore;

            return 1;

        }

    }

    return 0;

}



//系统教师信息的删除

int delete_Linklist(string name,Linklist *h)

{

    Linklist *temp = h, *t;

    int if_delete = 0;

    while(NULL != temp->next){

        t = temp;

        temp = temp->next;

        if(temp->teacher.name == name){

            if_delete = 1;

            break;

        }

    }

    //如果是头节点后的第一个元素,只需要将头节点连接至第一个元素后面的信息即可

    if(temp == h->next){

        h->next = temp->next;

    }

    //普通节点的情况

    else{

        t->next = temp->next;

    }

    delete(temp);

    return if_delete;

}



//插入数据

void List_insert(Linklist *h)

{

    Linklist *temp = new Linklist;

    cin>>temp->teacher.num>>temp->teacher.name>>temp->teacher.pos>>temp->teacher.sexul;

    cin>>temp->teacher.class1.class_name>>temp->teacher.class1.class_date>>temp->teacher.class1.class_type>>temp->teacher.class1.class_effect;

    cin>>temp->teacher.class2.class_name>>temp->teacher.class2.class_date>>temp->teacher.class2.class_type>>temp->teacher.class2.class_effect;

    cin>>temp->teacher.sumscore;



    /*

    //从头结点插入数据

    temp->next = h->next;

    h->next = temp;*/

    //从尾结点插入数据

    Linklist *end_node = h;

    while(NULL != end_node->next){

        end_node = end_node->next;

    }

    end_node->next = temp;

    temp->next = NULL;

}



//获取链表存储长度

int get_List_len(Linklist *h)

{

    int count = 0;

    while(NULL != h->next){

        h = h->next;

        count++;

    }

    return count;

}



//冒泡排序对列表数据进行排序

void sort_List(Linklist *h,int sort_type)

{

    int length = get_List_len(h);

    Linklist *p = h->next;

    Teacher temp;

    //p,是为了防止排序过程中h被改变,temp做排序交换时的中间变量

    for(int i = 0; i < length - 1; i++){

        p = h->next;//保证每次排序都是从头节点开始

        if(sort_type){//如果输入的是1则按照教学效果综合评分排序

            for(int j = 0; j <length - 1 - i; j++){

                if(p->teacher.sumscore < p->next->teacher.sumscore){

                    temp = p->teacher;

                    p->teacher = p->next->teacher;

                    p->next->teacher = temp;

                }

                p = p->next;

            }

        }

        else{

            for(int j = 0; j <length - 1 - i; j++){

                if(p->teacher.num < p->next->teacher.num){

                    temp = p->teacher;

                    p->teacher = p->next->teacher;

                    p->next->teacher = temp;

                }

                p = p->next;

            }

        }

    }

}



//链表的内存释放

void delete_all_Linklist(Linklist * h)

{

    while(NULL != h){

        Linklist *p = h;

        delete(p);

        h = h->next;

    }

}



int main()

{

    Linklist  *p;

    int tnum;//起始输入系统教师数量

    while(1){

        string oper;

        cin>>oper;

        //起始输入教师信息

        if(oper == "input"){

            cin>>tnum;

            p = creatlinklist(tnum);

        }

        //通过输入的教师姓名或者课程名称查找教师

        if(oper == "search"){

            string flag;

            cin>>flag;

            int ans = Search_teacher(flag,p);

            if(!ans){

                cout<<"NO match!"<<endl;

            }

        }

        //修改系统中教师信息

        if(oper == "change"){

            string flag_num;

            cin>>flag_num;

            int if_change = Change_Linklist(flag_num,p);

        }

        //删除输入教师名信息

        if(oper == "delete"){

            string name;

            cin>>name;

            int if_delete = delete_Linklist(name,p);

            /*if(!if_delete){

                cout<<"删除失败"<<endl;

            }*/

        }

        //插入老师信息,由于这里没有说明每次插入信息的位置,所以默认从头结点插入

        if(oper == "insert"){

            List_insert(p);

        }

        //对系统中的老师按要求进行排序

        //0按照职工号排序,1按照教学效果综合评分排序

        if(oper == "sort"){

            int sort_type;//判断应该按哪种方式进行排序的标识符

            cin>>sort_type;

            sort_List(p,sort_type);

        }

        //输出系统中教师信息

        if(oper == "display"){

            display_Linklist(p);

        }

        //退出程序

        if(oper == "quit"){

            break;

        }

    }

    delete_all_Linklist(p);//释放内存

    return 0;

}

图1

界面演示:输出功能:

图2

图3

4

查找功能:按教学效果:

图5

图6

7

按教学效果综合评分排序:

图8

  1. 课程总结

C语言实训和平时上课所接触的程序是有很大不同的,所经受的考验和克服的困难是平时所无法比拟的。好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了C语言实训的复杂程序。在这里,我作为其中的参与者,感触良多。

在这次实训中,我对对C语言有了一个更深的了解认识,也对这个学期学的知识得到巩固,还尝试运行编程,每次运行程序成功,让我对下面的项目就充满信心。通过自己与同学合作编写程序,最终把最初的理论知识转化基本技能。这次的实训,使我对C语言的学习产生浓厚的兴趣在实训中,我们认识到自己还有很多的知识没学好,基础知识没理清,而且许多东西还要去翻书,去上网搜索。而且遇到一些小错误运行不出来,就会烦躁不安,觉得有些自暴自弃或者抱怨项目的变态,以后要克服,尽量保持一颗良好的心态,学好C语言,也学好用C语言编写一个按要求的系统。

  1. 程序源代码
#include <iostream>

#include <cstdio>

#include <string>

#include <cstdlib>



using namespace std;



typedef struct//课程信息

{

    string class_name;

    string class_date;

    string class_type;

    string class_effect;



}Class;



typedef struct//教师信息

{

    string num;

    string name;

    string pos;

    string sexul;

    Class class1;

    Class class2;

    int sumscore;



}Teacher;



typedef struct teacher_xinxi//创建链表节点

{

    Teacher teacher;

    struct teacher_xinxi *next;



}Linklist;



//创建链表

Linklist * creatlinklist(int num)

{

    Linklist *head_node , *temp_node, *end_node;

    head_node = new Linklist;

    if(head_node == NULL){

        //cout<<"内存分配失败"<<endl;

        return NULL;

    }

    end_node = head_node;//刚开始没有存数据的是时候,头节点就是尾节点

    //开始输入学生数据

    for(int i = 1; i <= num; i++){

        temp_node = new Linklist;

        cin>>temp_node->teacher.num>>temp_node->teacher.name>>temp_node->teacher.pos>>temp_node->teacher.sexul;

        cin>>temp_node->teacher.class1.class_name>>temp_node->teacher.class1.class_date>>temp_node->teacher.class1.class_type>>temp_node->teacher.class1.class_effect;

        cin>>temp_node->teacher.class2.class_name>>temp_node->teacher.class2.class_date>>temp_node->teacher.class2.class_type>>temp_node->teacher.class2.class_effect;

        cin>>temp_node->teacher.sumscore;

        end_node->next = temp_node;

        end_node = temp_node;

    }

    end_node->next = NULL;

    return head_node;

}



//输出链表中的内容

void display_Linklist(Linklist *h)

{

    while(h->next != NULL){

        h = h->next;

        cout<<h->teacher.num<<" "<<h->teacher.name<<" "<<h->teacher.pos<<" "<<h->teacher.sexul<<" ";

        cout<<h->teacher.class1.class_name<<" "<<h->teacher.class1.class_date<<" "<<h->teacher.class1.class_type<<" "<<h->teacher.class1.class_effect<<" ";

        cout<<h->teacher.class2.class_name<<" "<<h->teacher.class2.class_date<<" "<<h->teacher.class2.class_type<<" "<<h->teacher.class2.class_effect;

        cout<<" "<<h->teacher.sumscore<<endl;

    }

}



//查找链表中的内容

int Search_teacher(string flag,Linklist *h)

{

    int res = 0;//记录已经找到的符合条件的教师数量;

    while(NULL != h->next){

        h = h->next;

        if(flag == h->teacher.name||flag == h->teacher.class1.class_name||flag == h->teacher.class2.class_name){

            cout<<h->teacher.num<<" "<<h->teacher.name<<" "<<h->teacher.pos<<" "<<h->teacher.sexul<<" ";

            cout<<h->teacher.class1.class_name<<" "<<h->teacher.class1.class_date<<" "<<h->teacher.class1.class_type<<" "<<h->teacher.class1.class_effect<<" ";

            cout<<h->teacher.class2.class_name<<" "<<h->teacher.class2.class_date<<" "<<h->teacher.class2.class_type<<" "<<h->teacher.class2.class_effect;

            cout<<" "<<h->teacher.sumscore<<endl;

            res++;

        }

    }

    return res;

}



//修改系统中某教师信息

int Change_Linklist(string flag_num,Linklist *h)

{

    while(NULL != h->next){

        h = h->next;

        if(flag_num == h->teacher.num){

            cin>>h->teacher.num>>h->teacher.name>>h->teacher.pos>>h->teacher.sexul;

            cin>>h->teacher.class1.class_name>>h->teacher.class1.class_date>>h->teacher.class1.class_type>>h->teacher.class1.class_effect;

            cin>>h->teacher.class2.class_name>>h->teacher.class2.class_date>>h->teacher.class2.class_type>>h->teacher.class2.class_effect;

            cin>>h->teacher.sumscore;

            return 1;

        }

    }

    return 0;

}



//系统教师信息的删除

int delete_Linklist(string name,Linklist *h)

{

    Linklist *temp = h, *t;

    int if_delete = 0;

    while(NULL != temp->next){

        t = temp;

        temp = temp->next;

        if(temp->teacher.name == name){

            if_delete = 1;

            break;

        }

    }

    //如果是头节点后的第一个元素,只需要将头节点连接至第一个元素后面的信息即可

    if(temp == h->next){

        h->next = temp->next;

    }

    //普通节点的情况

    else{

        t->next = temp->next;

    }

    delete(temp);

    return if_delete;

}



//插入数据

void List_insert(Linklist *h)

{

    Linklist *temp = new Linklist;

    cin>>temp->teacher.num>>temp->teacher.name>>temp->teacher.pos>>temp->teacher.sexul;

    cin>>temp->teacher.class1.class_name>>temp->teacher.class1.class_date>>temp->teacher.class1.class_type>>temp->teacher.class1.class_effect;

    cin>>temp->teacher.class2.class_name>>temp->teacher.class2.class_date>>temp->teacher.class2.class_type>>temp->teacher.class2.class_effect;

    cin>>temp->teacher.sumscore;



    /*

    //从头结点插入数据

    temp->next = h->next;

    h->next = temp;*/

    //从尾结点插入数据

    Linklist *end_node = h;

    while(NULL != end_node->next){

        end_node = end_node->next;

    }

    end_node->next = temp;

    temp->next = NULL;

}



//获取链表存储长度

int get_List_len(Linklist *h)

{

    int count = 0;

    while(NULL != h->next){

        h = h->next;

        count++;

    }

    return count;

}



//冒泡排序对列表数据进行排序

void sort_List(Linklist *h,int sort_type)

{

    int length = get_List_len(h);

    Linklist *p = h->next;

    Teacher temp;

    //p,是为了防止排序过程中h被改变,temp做排序交换时的中间变量

    for(int i = 0; i < length - 1; i++){

        p = h->next;//保证每次排序都是从头节点开始

        if(sort_type){//如果输入的是1则按照教学效果综合评分排序

            for(int j = 0; j <length - 1 - i; j++){

                if(p->teacher.sumscore < p->next->teacher.sumscore){

                    temp = p->teacher;

                    p->teacher = p->next->teacher;

                    p->next->teacher = temp;

                }

                p = p->next;

            }

        }

        else{

            for(int j = 0; j <length - 1 - i; j++){

                if(p->teacher.num < p->next->teacher.num){

                    temp = p->teacher;

                    p->teacher = p->next->teacher;

                    p->next->teacher = temp;

                }

                p = p->next;

            }

        }

    }

}



//链表的内存释放

void delete_all_Linklist(Linklist * h)

{

    while(NULL != h){

        Linklist *p = h;

        delete(p);

        h = h->next;

    }

}



int main()

{

    Linklist  *p;

    int tnum;//起始输入系统教师数量

    while(1){

        string oper;

        cin>>oper;

        //起始输入教师信息

        if(oper == "input"){

            cin>>tnum;

            p = creatlinklist(tnum);

        }

        //通过输入的教师姓名或者课程名称查找教师

        if(oper == "search"){

            string flag;

            cin>>flag;

            int ans = Search_teacher(flag,p);

            if(!ans){

                cout<<"NO match!"<<endl;

            }

        }

        //修改系统中教师信息

        if(oper == "change"){

            string flag_num;

            cin>>flag_num;

            int if_change = Change_Linklist(flag_num,p);

        }

        //删除输入教师名信息

        if(oper == "delete"){

            string name;

            cin>>name;

            int if_delete = delete_Linklist(name,p);

            /*if(!if_delete){

                cout<<"删除失败"<<endl;

            }*/

        }

        //插入老师信息,由于这里没有说明每次插入信息的位置,所以默认从头结点插入

        if(oper == "insert"){

            List_insert(p);

        }

        //对系统中的老师按要求进行排序

        //0按照职工号排序,1按照教学效果综合评分排序

        if(oper == "sort"){

            int sort_type;//判断应该按哪种方式进行排序的标识符

            cin>>sort_type;

            sort_List(p,sort_type);

        }

        //输出系统中教师信息

        if(oper == "display"){

            display_Linklist(p);

        }

        //退出程序

        if(oper == "quit"){

            break;

        }

    }

    delete_all_Linklist(p);//释放内存

    return 0;

}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2018年软件学院C++课程设计 课程设计目的: 1、熟悉利用面向对象的方法以及C++的编程思想来完成系统的设计; 2、锻炼学生在设计的过程中,建立清晰的类层次,应用继承和多态等面向对象的编程思想; 3、通过本课程设计,加深对面向对象程序设计课程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规范,深刻体会面向对象的编程思想,掌握使用面向对象程序设计语言C++,学会编写结构清晰、风格良好的C++语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。 课程设计题目:模拟即时通信系统实现 一、题目描述 基于社交的即时通信是腾*公司的主要业务,先后有QQ、微信、微博等服务,可能还将继续推出微商、微唱、微走、微笑等产品。这些软件既可以独立提供服务,又互相辉映关联。腾*公司希望对各系统进行整合形成统一的立体社交软件平台。现请完成该平台的设计并实现。要求如下: 1、用户基本信息: 号码ID,昵称,出生时间,T龄(号码申请时间)、所在地、好友列表、群列表。 微博与QQ共享ID,微信采用独立ID,但是可以与QQ号码绑定对应。其他微X产品也分为这两种情况。 2、好友管理 (1)实现各功能好友信息的添加、修改、删除、查询的功能。 (2)可以查询微X之间各自共同好友。如微信可以添加QQ推荐好友。 3、群管理 (1)设定每个微X功能已有1001、1002、1003、1004、1005、1006等群号。 (2)加入群、退出群、挨T、查询群成员等。 (3)不同微X之间群的理念不同,比如:QQ群可以申请加入,而微信群则只能推荐加入;QQ群允许设置临时讨论组(子群),微信群则不允许;QQ群有以群主为核心的管理员制度,而微信群仅有群主为特权账号。 4、开通管理 用户可以选择自己开通该平台的N个微X服务。 5、登录管理 各微X之间只要有一个服务登录,则其它服务简单确认后视为自动登录。 6、功能展示要求(main函数) (1)设计约定。开通服务情况、群成员信息和好友信息可以预先保存到文件中,在系统启动时将这些信息加载到内存中; (2)一个服务登录后,本人开通的其它所有服务均进入开通状态。 (3)服务之间可以依据本人开通的任意另外一个服务的好友添加好友。 (4)展示一个服务当前群的特色功能;在群成员数据不受伤害的前提下,动态变换为其他类型群的管理特色。 (5)实现QQ的点对点的TCP通信的收发功能。(选做)提示: a)需要加载ws2_32.lib静态库,打开头文件winsock.h。 b)百度IP地址、端口等概念; c)百度socket编程,关注bind、listen、accept、connect、send、receive等函数用法。 二、技术层次要求及说明 1、基本层次。 完成上述功能要求,所采用技术不限,比如采用纯面向过程思想实现; 2、支持对象层次。 正确完成了类的切割,利用对象技术实现。 (1)容器类主要包括:例如,微X成员管理。 (2)其它主要类包括:例如,微X信息、群信息、好友信息。 3、抽象、封装层次 采用了继承或者组合实现复用,对数据成员提供了必要的接口保护; (1)抽象出了基础类,并被其它功能复用; (2)如好友维护、群信息维护等操作均应该提供接口形式; 4、面向对象层次 支持多态功能,支持依据设计原则的优化。 好友管理、群管理等; 5、优化提高层次 (1)提供简便菜单,以1、2等数字区分几类功能,并允许返回菜单; (2)I/O操作支持。基本功能中,已有设定信息,在初始化时候可以固化在程序代码中,也可以存放在文件中,每次容器实例化时读入,析构时写回文件中,以实现断电保存。 (3)可扩展性支持,需要考虑群、好友等与主要服务之间的关系; (4)灵活性支持。群的管理模式动态可变; (5)程序有必要的注释; (6)可以采用UML工具画出简单类图 (7)为防止不诚信行为,要求类的设计均以独立文件存在,且所有的类名称后面应有自己的姓名缩写,如张三设计的QQ信息类名称:TencentZhS。 三、设计步骤(参考 ): 在清楚上述系统功能要处理是什么的基础上,考虑用如下方式来设计 1、确定所需的类及其相互间的关系。 (1)要从问题中归纳出一个概念或实体,从这些概念或实体出发建立相应的类。 (2)尽量使类小而简单,以使其看起来容易理解。 (3)充分利用封装以增加类的可靠性,以便使用时保证更加可靠。 (4)通过继承建立类族,以方便使用多态性。 2、确定每个类的实现。 (1)考虑类的对象应该如何构造和析构。 (2)考虑类的成员函数的建立。 (3)综合考虑各个类在命名和功能方面有哪些共性。 3、细化有关的类,描述他们之间的相互关系,即类关系和对象关系。 4、描述本系统的界面,通过分别定义成员的不同属性,为抽象和实现提供分离的接口。 四、设计工具 1、设计工具:建议使用.net 系列中的C++ 编译器,但不局限于此。 2、不提倡使用MFC和可视化开发技术。 五、设计报告 (报告的具体格式附后) 六、考核方式 1、在设计结束前的最后一天检查程序并接受质疑。 2、检查程序前须提交设计报告(按提交报告的先后顺序检查程序)。 七、考核标准: 参照5个技术层次划分。 八、课程设计后作业(不考核) 引入可视化设计,在本课程设计基础上实现可视化QQ即时通信功能,包括: 多人聊天;聊天记录查询。需要涉及知识如下: 1、网络通信编程; 2、可视化编程; 3、多线程编程; 4、数据库编程;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值