




免费预览已结束,剩余37页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南城建学院 软件工程 河 南 城 建 学 院 Henan University of Urban Construction面向对象程序设计课程设计报告学 号: 084412153 姓 名: 张世斌 专 业: 软件工程 题 目: 教师排课程序 指导老师: 周二强苏靖枫设计时间: 第十七周 计算机科学与工程系2013年06月目录一.设计目的2二.设计内容3三.概要设计4(一).功能模块图4(二).各个模块详细的功能描述4四.详细设计5(一).结点设计5(二).结构设计5(三).子类设计6(四).类设计6(五).算法设计6五.测试数据及运行结果8(一).正常数据测试8(二).非正常数据测试11六.设计技巧及体会12七.参考文献13八.源程序13一.设计目的此次课题主要是实现对教师排课信息的简易管理。首先定义两个链表,用于所有教师信息和课程信息的存储;其次再定义一个teacher类和一个course类用于存放教师信息和课程信息。最后通过函数调用,连表的使用实现教师课程的排列。而且在课程设计同时,我们应学会以下几点:(一) 通过C+语言的课程设计进一步的了解和掌握C+语言的有关知识和相关语法的使用方法。(二) 熟练掌握使用C+语言对一些简单常见问题进行解决,编译程序对问题进行解决。(三) 通过课程设计,进一步掌握C+语言中有关重要的数据结构,诸如类、链表、结构体、文件等在程序开发中的应用。(四) 通过课程设计,能根据实际问题的具体情况,结合面向对象的基本理论和基本技巧,正确分析问题,并能设计出解决问题的有效算法与程序。提高程序开发能力,能运用合理的控制流编写清晰高效的程序。(五) 通过课程设计,培养C+语言知识运用和自学能力,验证自己设计的算法和程序的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改,进一步提高程序设计水平。独立或合作设计和开发一个中小型系统,掌握系统研发全过程。(六) 通过此次课程设计发现自己在C+语言编程上的不足并进一步掌握C+语言,为以后课程打下基础。二.设计内容问题描述:每位教师都有教学工作量,教师对他所希望讲授的课程表达为一个期望值,1,2,n,其中1为最高的期望值。课程也有优先级,1,2,n,用来决定将课程分给教师的顺序,其中1是最高的优先级。设计一个程序针对某些课程给某些教师进行排课。基本要求:程序运行时,用户输入教师信息(姓名、教师号、工作量)、课程信息(课程名、课程号、周学时、总学时、优先级)、教师对所希望讲授课程的期望值以及教学工作量等相关信息,所有信息应保存在文件中,程序根据课程的优先级以及教师对课程的期望值进行排课。为了公平起见,程序随机分配课程,如果10门课程都有优先级1,程序以随机的顺序将这些课程分给教师,如果10位教师对某门课程的期望值为1,程序应从10位教师中随机选择一个。最后输出排课情况,即某位老师上某门课程,以及某位老师的工作量。测试数据:程序应能实现对不少于20门课和10个教师的排课,并且使每个教师的满意度达到最大,不存在工作量不满的教师以及未分配的课等情况。实现提示:可定义一个教师类存放教师信息,所有教师的信息可以用链表存储;定义一个课程类存放课程信息,所有课程的信息可以用链表存储;定义一个排课类进行排课,排课类可以访问课程和教师信息。选作内容:对两个同类班级安排一学期(20周)的课程,程序应能处理某些限制,如一个老师不能同时给两个班上课。 三.概要设计主菜单(一).功能模块0 退出提示按键选择操作信息载入6打印结果1教师信息2课程信息5教师排课3教师信息储存4课程信息储存是否继续退出系统信息存储(二).各个模块详细的功能描述a) 主菜单 主菜单的主要是为客户显示本程序的主要功能及相关操作,人性化的主菜单可以让客户很容易地使用程序相关功能。本程序主菜单设计简洁,界面简单,使用者可以根据相关提示进行操作,方便快捷。b) 信息载入 信息载入模块主要实现教师信息载入和课程信息载入,教师信息主要包括教师姓名,教师编号,工作量及对相应课程的期望值。课程信息主要包括课程名,课程号,周学时,总学时,优先级。此模块是使用者(客户)把相关信息载入数据库进行排课操作的前提,它提供了良好的交互界面,操作简单方便。c) 信息保存 信息保存模块主要实现教师信息和课程信息的保存功能。由于教师信息和课程信息载入量大,为以后查询方便最好存储在文件中,同时也算对数据的备份。此模块提供路径选择功能,客户可以根据自己的情况选择相应的路径存储信息文件,安全高效。d) 教师排课 教师排课模块主要实现根据课程优先级,教师对课程的期望值大小来安排课程情况的功能。此模块考虑到不同课程优先级可能相同及不同教师对某门课程期望值可能相同的情况,为了让教师达到最大满意度,本模块采用随机分配原则,通过生成伪随机数来安排期望值相同的课程,从而达到公平公正原则。同时本模块实现每门课都得到安排,不出现漏课,重复选择的功能,达到教师工作量得到满足且超出工作量,合理有效。e) 排课结果打印 此模块主要实现排课完成后相关信息的显示功能,主要显示教师姓名,工作量,教授课程。打印页面简单明了,易于查看。f) 系统保护 系统保护模块主要实现非法操作是对程序的损坏或恶意破坏。此模块主要应用于当操作人员(客户)没有事先载入教师信息和课程信息就进行保存及排课操作行为的保护,安全可靠。g) 退出 此模块只要事先操作完毕后的退出功能。退出时,此模块会显示一个感谢界面,并完成后台资源释放等功能,很人性化。四.详细设计(一).结点设计 本程序主要采用结构体存储相关结点信息,教师信息通过tlist结构体实现,其中包括教师姓名,教师号,工作量,相应课程期望值及预留缓存区空间。课程信息通过clist结构体实现,其中包括课程名,课程号,周学时,总学时,优先级,被选标记(是否已经分配)信息。tclist结构体存储教师期望值比较高的课程信息,包括课程名及教师对其期望值。(二).结构设计 本程序采用结构体存储结点信息,通过链表完成相关操作,如查询,删除等,链表添加删除结点灵活高效。(三).子类设计 本程序设计一个教师类和一个课程类,教师类在其内部主要实现初始化教师链表(教师信息),保存教师信息到文件功能。课程类主要实现初始化课程链表(课程信息),保存课程信息到文件功能。同时,在教师类中增加一个print友元函数,实现由给定字符串查找相信课程结点并返回指向该结点指针的功能。(四).类设计1. 教师类:数据成员 tlist* pt功能说明 pt为指向教师结点的指针,维持着整个教师链表,通过它可以动态添加删除教师信息成员函数 void initdata(); void save();friend void print(teacher&,ptlist);功能说明 initdata()初始化教师链表(教师信息),save()保存教师信息到文件。print(teacher&,ptlist)排课结果打印2. 课程类:数据成员 clist* pc功能说明 pc为指向课程结点的指针,维持着整个课程链表,通过它可以动态添加删除课程信息。成员函数 void initdata(); void save();friend pclist convert(course&,char* s)功能说明 initdata()初始化课程链表(课程信息)save()保存课程信息到文件。convert(course&,char* s)通过给定字符串查找指向课程名与该字符串相同的课程结点的指针。进而通过该指针操作相应课程结点中的数据。(五).算法设计1. 难点 问题描述;多个教师对某门课程具有相同期望值及多门课程具有相同优先级时的公平分配算法设计。解决方案:先将课程链表按优先级由高到低排序,依次从教师链表头结点开始处理,取出该结点所对应课程期望值最高者,扫描其余教师结点,查看是否其他结点对该课程有更高的期望,若有则取出该结点所对应课程较高者,则把该课程分配给它,并修改该课程被选标记,依次重复上述过程直到该教师结点工作量得到满足,然后按此过程处理其余教师结点,如果出现不同教师某门课程期望值相同。则使用伪随机数生成函数rand()实现随机分配,达到公平原则。函数实现 /*构建教师排课函数,为教师排课*/void sort(teacher& t,course& c) ptlist q=t.pt,n=t.pt,m=n; int sum=0,num=-1; srand(time(0); for(int i=0;inext; if(m=NULL) break; for(int j=0;jtci.ipri=n-tcj.ipri)&(0=strcmp(,) num=rand()%2; switch(num) case 0: (convert(c,)-mc=false; break; case 1: (convert(c,)-mc=false; break; default: break; n=n-next; while(q) for(int i=0;)-mc) sum+=(convert(c,)-all_time; (convert(c,)-mc=false; if(i=0) strcpy(q-cbuf,); else strcat(q-cbuf, ); strcat(q-cbuf,); if(sum=q-work_time) break; sum=0; q=q-next; cout课程已排好!endl;五.测试数据及运行结果(一).正常数据测试(二).非正常数据测试六.设计技巧及体会通过这次课程设计,我们从中受益匪浅,不仅让我们对C+语言程序设计这一门课程有了更深一步的认识,还让我对复杂程序的开发有了一个深刻的认识,使我进一步明白了模块化思想在程序开发中的重要性。另外,通过为期一周的C+课程设计实验课使我了解到了一个程序开发的过程,虽然规模不大,但为我以后的编程学习打下了基础。在编程的过程中,我们可以把这学期所学的理论知识和实践联系起来,在所要开发的项目中渐渐成长。虽然我们对这些C+语言知识运用得还不是很熟练,但是相信我们也在滴水穿石地成长起来。发现问题,提出问题,解决问题,使我们从不足之处出发,寻找新的学习方向。同时我也体会到了学习编程的辛苦,为了一个算法的实现而思考,为了一个小小的编译错误而花时间去寻找,这需要很大的毅力和耐心,而且要有比较清晰的思维。同时,我也发现自己的一些不足,良好的编程习惯的养成,坚定的毅力和耐心是我要加强的,同别人的交流也是必须的,这样才能不断使我进步,还要加强自己基础学科的学习 ,能把所学知识融会贯通。经过这一周的课程设计,我们把平时学到的知识充分的应用到这次实践中,同时我们也获得了许多在课堂上听而无法真正理解的知识。首先我们要感谢学校给我们安排的这次的C+课程设计,然后我要感谢老师们对我们热心的指导和帮助,是他们教会了我们怎样解决问题的方法,这样我们的软件设计才会更加顺利地进行,并且充分掌握了设计程序的方法。我们还要感谢许多同学的帮助,他们的帮助对于我们来说也是必不可少的。总之,是有了他们的帮助,我们才能顺利地完成这次的设计,在这里我们要向他们说一句:谢谢,非常感谢!你们辛苦了!七.参考文献1. 周二强 清华大学出版社2. 郑莉 董渊 何江舟 清华大学出版社八.源程序#include/输入输出头文件#include#include#include#define N 10/宏定义#define M 20/宏定义#define SIZE 40/宏定义using namespace std;/*构建课程结点,用于生成课程信息链表,存储课程信息*/typedef struct tcnode/组成课程链表的结点char name20;/课程名int ipri;/优先级tclist,*ptclist;/为结点取得名字/*构建教师结点,用于生成教师链表,存储教师信息*/typedef struct node/组成教师链表的结点char name20,num20,cbufSIZE;/教师名,教师号,期望值int work_time;/工作时间tclist tcM;/课程结点结构类型的数组 struct node *next; /结构指针tlist,*ptlist;/为结点取得名字/*构建最终排课结点,用于生成排课链表,存储排课信息*/typedef struct Node/组成最终排课链表的结点char name20, num20;/教师名,教师号int week_time,all_time,priority;/工作时间,工作总时间,优先级bool mc;/是否被选struct Node *next;/指向下一结点的指针clist,*pclist;/结点名/*构建教师类*/ class teacher/教师类public:/公有的类 teacher();/teacher函数 teacher();/删除函数void initdata();/建立函数void save();/保存函数friend void print(teacher&,ptlist);/友元函数,它必须在类中进行声明,在类外进行定义tlist* pt;/教师结构结点类型的指针;/*构建课程类*/class course/课程类public:/公有类型 course();/课程函数,类内定义,下面会有实现 course();/删除函数void initdata();/建立函数void save();/保存函数friend pclist convert(course&,char * s);/友元函数,下文会有实现private:/私有类型clist* pc;/具有排课结点结构的指针;/*构建teacher函数,实例化teacher类时将pt设为空*/ teacher:teacher()/在teacher类中定义,在这里进行实现,它的作用是实现pt为空,即pt指向的结点为空pt=NULL;/*构建教师删除函数,用于教师信息的删除*/ teacher:teacher()/实现教师删除函数,当pt不为空时,pt循环后移,逐个删除结点,直至pt为空,即,结点全部删除ptlist p;while(pt) p=pt; pt=pt-next; delete p;/删除结点p/*构建教师信息的生成函数,用于输入教师信息*/void teacher:initdata()/生成函数char tag;/一个用来判断选择的符合标志(当tag为y时,程序继续操作;当tag为n时,程序退出)ptlist p=pt,s;/定义具有教师结点结构两个指针p和s,其中p指向ptint t=0;cout请输入教师信息:endl姓名t教师号t工作量=1)/ cout请输入教师信息:endl姓名t教师号t工作量s-names-nums-work_time;/输入数据 cout请输入相应课程名及期望值:endl; for(int i=0;s-tci.ipri; fflush(stdin); s-next=NULL; if(!pt) pt=s; p=pt; else p-next=s; p=p-next; t+; cout是否继续输入信息:tag; system(cls); while(tag=y|tag=Y)&tN);/*构建教师保存函数,用于保存输入的教师信息*/void teacher:save()/保存函数,将老师的信息存储到文件中ptlist p=pt;char path20=D:teacher.txt,str50=0;/默认路径cout请选择保存教师信息文件的路径:path;ofstream outfile(path);/将路径信息从内存,写入硬盘保存if(!outfile)cerr保存失败,请检查所选路径是否正确!name,p-num,p-work_time);/将输入信息以字符串的形式写入字符串str中outfile.write(char*)str,strlen(str);sprintf(str,对相应课程的期望值:n);outfile.write(char*)str,strlen(str);for(int i=0;,p-tci.ipri); outfile.write(char*)str,strlen(str);sprintf(str,n); outfile.write(char*)str,strlen(str);p=p-next;outfile.close();cout保存成功!next;delete p;/*构建课程生成函数,用于输入课程信息*/void course:initdata()pclist p=pc;pclist s;char tag;int i=0;cout请输入课程信息:endl;cout课程名t课程号t周学时t总学时t优先级=1)cout请输入课程信息:endl; cout课程名t课程号t周学时t总学时t优先级s-names-nums-week_times-all_times-priority;fflush(stdin);s-mc=true;s-next=NULL;i+;if(!pc)pc=s;p=pc; else p-next=s; p=p-next; cout是否继续载入课程信息? y/ntag; system(cls);while(tag=y|tag=Y)&tM);/*构建课程保存函数,用于保存课程信息*/void course:save()char path20=D:course.txt,str100=0;/默认路径pclist p=pc;cout请输入文件保存路径:path;ofstream outfile(path);/将路径信息保存到文件中if(!outfile)cerrname,p-num,p-week_time,p-all_time,p-priority);outfile.write(char*)str,strlen(str);p=p-next;outfile.close();cout保存成功!endl;/*构建教师排课函数,为教师排课*/void sort(teacher& t,course& c) ptlist q=t.pt,n=t.pt,m=n; int sum=0,num=-1; srand(time(0); /srand函数是随机数发生器的初始化函数 for(int i=0;inext; if(m=NULL) break; for(int j=0;jtci.ipri=n-tcj.ipri)&(0=strcmp(,) num=rand()%2; switch(num) case 0: (convert(c,)-mc=false; break; case 1: (convert(c,)-mc=false; break; default: break; n=n-next; while(q) for(int i=0;)-mc) sum+=(convert(c,)-all_time; (convert(c,)-mc=false; if(i=0) strcpy(q-cbuf,); else strcat(q-cbuf, ); strcat(q-cbuf,); if(sum=q-work_time) break; sum=0; q=q-next; cout课程已排好!endl; /*建立打印函数,用于信息打印*/void print(teacher& t)ptlist p=t.pt;cout最终排课情况:endl;cout教师姓名t工作量t教授课程endl;while(p) coutnamettwork_timetcbufnext;/*匹配函数,用于查找符合需要的信息*/pclist convert(course& c,char * s)pclist p=c.pc;while(p)if(0=strcmp(p-name,s)/strcmp字符串比较函数,用来比较两字符串是否完全相同return p;elsep=p-next;cou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论