- 课程设计题目与要求
教学信息管理系统
题目描述:
根据教师的授课信息对教学信息进行管理。每一条记录包括一位教师的职工号、姓名、职称、性别、3 门主讲课程(课程名称、开课学期、课程性质(学位与非学位课)和教学效果),教学效果综合评分。
功能要求:
(1) 输入功能:可以一次完成若干条记录的输入。
(2) 显示功能:完成全部教师记录的显示。
(3) 查找功能:完成按姓名或课程查找教师的相关记录,并显示。
(4) 排序功能:按职工号或教学效果综合评分进行排序。
(5) 插入功能:按教学效果综合评分高低插入一条教师记录。
题目要求:
(1) 按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。
(2) 为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。
输入要求:
(1) 应用程序运行后在屏幕上显示一个菜单。用户可以根据需求,选定相应的操作项目。进入个操作后,根据应用程序的提示信息,从键盘输入相应的信息。程序根据用户输入的信息完成相应的处理,实现要求的功能。
(2) 能对输入的数据进行简单的校验,例如,职工号的唯一性,性别只能输入“男”或者“女”等。
输出要求:
(1) 应用程序运行后,要在屏幕上显示一个菜单。
(2) 要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式以及结束方式等。
(3) 在程序完成处理后,要清楚地给出程序的处理结果。例如,在给定删除信息时,如果该信息不存在,要提示没能删除,如果删除成功要提示删除成功。
实现要求:
采用模块化程序设计的方法,将程序中的各项功能用函数实现。
提示:
使用结构体表示教师教学信息,一个结点保存一条教师教学信息。
扩展功能:
(1) 提供统计功能。比如统计所有教师教学效果综合评分的平均分,最高分,最低分等。
(2) 教师教学信息从文件读入。
(3) 将教师教学信息保存到文件中。
- 系统设计
- 系统功能模块划分
- 系统功能模块划分说明
教学信息管路系统由主菜单、输入、显示、查找、排查、排序、插入、统计、文件读入、信息保存、退出这些部分组成。
1、主菜单页面。
2、输入功能,可以一次完成若干条记录的输入。
3、显示功能,完成全部教师记录的显示。
4、查找功能,完成按姓名或课程查找教师的相关记录,并显示。
5、排序功能,按职工号或教学效果综合评分进行排序。
6、插入功能,按教学效果综合评分高低插入一条教师记录。
7、提供统计功能。比如统计所有教师教学效果综合评分的平均分,最高分,最低分等。
8、教师教学信息从文件读入。
9、将教师教学信息保存到文件中。
-
- 数据结构设计
- 结构体
- 数据结构设计
程序要求文档中要求使用结构体数组完成设计,每一条记录包括一位教师的职工号、姓名、职称、性别、 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)输入记录模块。完成将数据存入单链表的工作。记录可以从以二进制形式存储的数据文件中读入,也可从键盘逐个输入教师信息记录。教师记录由教师的基本信息构成。当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。
(2)显示记录模块。完成在单链表中需要显示的教师信息记录。显示出教师的职工号、姓名、职称、性别、3 门主讲课程(课程名称、开课学期、课程性质(学位与非学位课)和教学效果),教学效果综合评分等全部信息。
(3)查找记录模块。完成在单链表中查找满足相关条件的教师记录。在此教师信息管理系统中,用户可以按照教师的工号或姓名在单链表中进行查找。若找到该教师的记录,则返回指向该教师的记录的指针。否则返回一个值为NULL的空指针。
(4)排序记录模块。完成在单链表中需要排序的教师信息记录。在此教师信息管理系统中,用户可以按职工号或教学效果综合评分进行排序。
(5)插入记录模块。完成在单链表中所需插入的教师信息记录。在此教师信息管理系统中,用户可以按教学效果综合评分高低插入一条教师记录。
(6)统计记录模块。完成对所有教师教学效果综合评分的平均分,最高分,最低分等的统计。在此教师信息管理系统中,用户可以对教师教学效果综合评分以不同形式的再计算,然后对其进行统计。
(7)教师教学信息从文件读入。
(8)将教师教学信息保存到文件中,实现对教师教学信息记录的存盘,。
-
- 函数的规划与设计
首先对主函数进行设计,使其以图片的形式输出全部教学信息 ,主要利用 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 ;
-
- 主函数流程分析与设计
- 主函数设计说明
- 主函数流程分析与设计
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
-
- 主要功能模块的流程分析与设计
- 功能模块的设计说明
- 主要功能模块的流程分析与设计
教学信息管理系统功能分为管理学生证信息和查询学生证信息两大部分,其中管理学生证信息包括录入教师信息,显示教师信息,查找教师信息,插入教师信息,统计教师信息和保存教师信息。查询教师教学信息可以通过查询教师姓名和查询教师的课程安排。排序教师教学信息可以通过教师职工号和教师的教学评分。
教学信息管理系统开始时,在主菜单界面中会出现输入信息,显示信息,查找信息,插入信息,排序信息和统计信息等可供选择。当选择查找功能时,便可通过教师的姓名或者所教的课程,对教师的相关记录进行查询。当选择排序功能时,便可以按找教师职工号或者教学效果综合评分对教师进行排序。当选择排序功能时,便可按照如统计所有教师教学效果综合评分的平均分,最高分,最低分等,对教师的教学信息进行统计。当选择输入功能时,便可对教师的教学星系一次性完成若干条输入。当选择保留功能是,教师的信息便可保留到文件中。
-
-
- 流程图
-
- 程序测试与运行结果
#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
- 课程总结
C语言实训和平时上课所接触的程序是有很大不同的,所经受的考验和克服的困难是平时所无法比拟的。好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了C语言实训的复杂程序。在这里,我作为其中的参与者,感触良多。
在这次实训中,我对对C语言有了一个更深的了解认识,也对这个学期学的知识得到巩固,还尝试运行编程,每次运行程序成功,让我对下面的项目就充满信心。通过自己与同学合作编写程序,最终把最初的理论知识转化基本技能。这次的实训,使我对C语言的学习产生浓厚的兴趣在实训中,我们认识到自己还有很多的知识没学好,基础知识没理清,而且许多东西还要去翻书,去上网搜索。而且遇到一些小错误运行不出来,就会烦躁不安,觉得有些自暴自弃或者抱怨项目的变态,以后要克服,尽量保持一颗良好的心态,学好C语言,也学好用C语言编写一个按要求的系统。
- 程序源代码
#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;
}