中北大学程序设计实训说明书学院、系:软件学院专业:软件工程学生姓名:学号:1314010xxx设计题目:某学院教学信息管理系统起迄日期:2014年11月21日~2015年1月17日指导教师:何志英2015年1月10日1一、选题要求题目一:某学院教学信息管理系统功能:1、每一条记录包括一位教师的职工号、姓名、职称、性别、3门主讲课程(课程名称、开课学期、课程性质(学位与非学位课)和教学效果),教学效果综合评分。2、输入功能:可以一次完成若干条记录的输入。3、显示功能:完成全部教师记录的显示。4、查找功能:完成按姓名或课程查找教师的相关记录,并显示。5、排序功能:按职工号或教学效果综合评分进行排序。6、插入功能:按教学效果综合评分高低插入一条教师记录。7、将教师记录存在文件中。8、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!要求:1、用C语言实现系统;2、利用结构体数组实现教学信息的数据结构设计;3、系统具有增加,查询,插入,排序等基本功能;4、系统的各个功能模块要求用函数的形式实现;5、将教学信息存在文件中。考试题目要求:1、按教师性别统计统计评分的总算2、删除一个函数,程序仍能正常运行二、程序设计方法及主要函数介绍程序设计方法1.数据结构的设计:程序要求文档中要求使用结构体数组完成设计,每一条记录包括一位教师的职工号、姓名、职称、性别、3门主讲课程(课程名称、开课学期、课程性质(学位与非学位课)和教学效果),教学效果综合评分。数据结构设计如下:typedefstructCourse{//课程的定义与描述charcourseName[40];//课程名称2intsemester;//开课学期chartype[8];//课程性质charteceff;//教学效果}Course;typedefstructTeacher{//教师的定义与描述charname[8];//姓名intnum;//职工号charsex[2];//性别inttecscore;//教学效果综合评分charposition[8];//职称Coursecourse[3];//3门主讲课程}Teacher;2.主函数与其他函数的关系:3.结构化的程序设计方法将实用功能封装在每一个子函数中,主函数通过调用子函数来实现相对应的功能。体现了“自顶向下,逐步求精”的结构化程序设计思想。4.“高内聚,低耦合”的程序设计原则将各个使用功能封装在函数中来让主函数调用,而不是将所有实用功能聚集在主函数中,使得各个模块相对独立,耦合性得以降低,有利于程序的维护。3主要函数介绍:1.以卡片形式输出全部教师信息注:由于版面原因,输出函数显得有些乱,但是这并不影响程序的运行结果,真实的运行结果是很整齐的。(下图是DevC++V5.5.3版本下的编码界面)voidPrintInfor(TeacherT[]){//输出全部教师信息(以卡片形式)printf(--------------------------------------------------------------------------------);printf(|所有教师记录|);printf(-------------------------------------------------------------------------------+);printf(|全院现有在职教师%d名,全部信息如下|,TeacherNum);printf(-------------------------------------------------------------------4------------+\n\n);for(inti=0;iTeacherNum;++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);5printf(+----------+-----------+----------+------------------+------------+------------+);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}//PrintInfor2.对教师信息排序voidSort_N(TeacherT[],intn){//当n=1时按职工号排序,当n=2时按教学效果综合评分排序if(n==1){//按职工号排序Teachertemp;for(inti=0;iTeacherNum-1;i++){//冒泡法排序for(intj=0;jTeacherNum-1-i;j++)if(T[j+1].numT[j].num){6temp=T[j];T[j]=T[j+1];T[j+1]=temp;}//if}//forprintf(排序结果如下:\n);for(inti=0;iTeacherNum;i++){printf(%8s[%d],T[i].name,T[i].num);}//forprintf(\n);}//ifelse{//按教学效果综合评分排序Teachertemp;for(inti=0;iTeacherNum-1;++i){//冒泡法排序for(intj=0;jTeacherNum-1-i;++j)if(T[j+1].tecscoreT[j].tecscore){temp=T[j];T[j]=T[j+1];T[j+1]=temp;}//if}//forfor(inti=0;iTeacherNum;i++){printf(\t\t\t第%d名:%-8s分数:%3d\n,i+1,T[i].name,T[i].tecscore);}//for}//else}//Sort_N3.按教学效果综合评分高低插入一条教师记录由于程序要求要按照教学效果综合评分高低进行插入操作,故教师信息必须按一定顺序排列,但是在执行该操作之前不能保证用户已经执行了相应的排序操作,故需要再执行一次7排序操作,以保证接下来的程序能够正常运行插入信息的算法大致描述如下:在操作之前,教师的教学效果综合评分已经按照从小到大的顺序排列。先确定插入位置,如需对数据移动则进行移动操作,最后将待插记录复制到插入位置。插入位置有两种:A.在所有教师信息之后插入:当该教师分数大于所有教师的分数时,直接将该教师信息复制在最后一个教师后面的结构体中,无需进行移动,此时的基本操作为数据的复制。B.在开头或者其他教师之前插入:当该教师分数满足以下表达式:min=tecscoremax时,使用for循环找到其插入位置的数组元素下标i,然后将该位置及其后面的元素全部后移一位,将待插入教师的信息复制到插入位置。此时的基本操作是数据的移动与复制(移动的过程本质上也是数据的复制)。voidInsertInfor(TeacherT[]){if(TeacherNum==MAXTEACHERNUM){printf(容量已满,请扩充后再使用!\n);return;}//ifTeacherTB;//先从键盘接收待插入教师的相关信息,存放于一个临时的结构体变量TB中printf(-请按要求输入教师信息:\n);printf(-请输入教师的职工号(3位数字):);scanf(%d,&TB.num);printf(-请输入教师的姓名:);scanf(%s,TB.name);printf(-请输入教师的性别(男或女):);scanf(%s,TB.sex);printf(-请输入教师的职称:);scanf(%s,TB.position);for(intj=0;j3;j++){printf(-请输入该教师第%d门主讲课程的信息:\n,j+1);InputClassInfor(TB.course[j]);8printf(\n);}//forprintf(-请输入教师的教学效果综合评分(0-100):);scanf(%d,&TB.tecscore);printf(-为保证结果正确,程序将对您的教师按教学效果综合评分进行排序:\n);Teachertemp;for(inti=0;iTeacherNum-1;++i){//冒泡法排序for(intj=0;jTeacherNum-1-i;++j)if(T[j+1].tecscoreT[j].tecscore){temp=T[j];T[j]=T[j+1];T[j+1]=temp;}//if}//forintflag=-1;for(inti=0;iTeacherNum;i++){if(TB.tecscore=T[i].tecscore){flag=i;}//if}//forprintf(插入位置:%d\n,flag);if(flag==-1)flag=TeacherNum;//在末尾插入else{for(inti=TeacherNum-1;i=flag;i--){//移动插入位置后面的所有数据strcpy(T[i+1].n