1、数据结构与算法实验课表安排数据结构与算法分析课程设计报告课题名称:拓扑排序 打印输出计算机本科专业4年每学期的课表 提交文档学生姓名: 提交文档学生学号: 同组 成 员 名 单: 指导 教 师 姓 名: 指导教师评阅成绩: 指导教师评阅意见: 提交报告时间: 2010 年 12 月 日1.实验题目: 拓扑排序打印输出计算机本科专业4年每学期的课表2.实验的目的和要求:(1)采用C+实现;(2)熟练掌握图的应用;(3)熟练掌握图的邻接矩阵存储结构以级拓扑排序的基本思想;(4)上机调试程序,掌握查错,排错使程序能正确运行。3.实验的环境: (1)硬件环境:联想G450笔记本电脑 (2)软件环境:W
2、indowsXP,MicrosoftVisualC+6.04.算法描述:程序流程图类的层次结构,每个类的设计, 包括数据成员和成员函数组成.class Graphpublic: virtual int n()=0; virtual int e()=0; virtual int first(int)=0; virtual int next(int,int)=0; virtual void setEdge(int,int,int)=0; virtual void delEdge(int,int)=0; virtual int weight(int,int)=0; virtual int getMa
3、rk(int)=0; virtual void setMark(int,int)=0;class Graphm:public Graphpublic: Graphm(int numVert); Graphm(); int n(); int e(); int first(int); int next(int,int); void setEdge(int,int,int); void delEdge(int,int); int weight(int,int); int getMark(int); void setMark(int,int);private: int numVertex,numEdg
4、e; int *matrix; int *mark;class Linkpublic: Link(); Link(string code,string name,int period,int semester,string precondition); string getCode(); void setCode(string str); string getName(); void setName(string str); int getPeriod(); void setPeriod(int p); int getSemaster(); void setSemester(int s); s
5、tring getPrecondition(); void setPredition(string str); Link* getNext(); void setNext(Link*);private: string code; string name; int period; int semester; string precondition; Link *next;class Listpublic: List(); void addCourse(Link* course); void insertCourse(Link* course); Link* getHead(); Link* ge
6、tTail(); void printlist();private: Link *head; Link *tail;测试程序说明int main() readFromFile();/从文件读取课程信息 Graphm graph(38); buildGraph(list,&graph);/做课程信息图 topsort(&graph);/对图进行拓扑排序 sortedlist.printlist();/打印排序后的结构 cout=0&ch=0&ch=9&(index=0&ch=9&(index0) Link*courselink=newLink(courCode,courName,courperi
7、od, coursemester,courPrecondition);/读取一次完整的信息即可将它生成一个Link节点 list.addCourse(courselink);/将Link节点加入List courCode.erase();/清除string中的内容,用于下一行次读取文件 courName.erase(); courPrecondition.erase(); /while input.close();/建图,添加有先决条件的结点之间的边void buildGraph(List &courseList,Graph* courseGraph) Link* courselink=cou
8、rseList.getHead(); int v1=0; while(courselink!=NULL) string str=courselink-getPrecondition(); for(int i=0;stri!=0;) if(stri=c)/课程以c开头,由此分辨先决条件 char ch1=str+i; char ch2=str+i; int v2=10*(ch1-48)+(ch2-48)-1;/将课程号转换为整型数据,图的下标用int表示的 courseGraph-setEdge(v2,v1,1); else i+; v1+; courselink=courselink-getN
9、ext(); void tophelp(Graph* G, int v)/ Process v G-setMark(v, 0); for (int w=G-first(v); wn();w = G-next(v,w) if (G-getMark(w) = 1) tophelp(G, w); Link* courselink=list.getHead(); for(int i=0;igetNext(); sortedlist.insertCourse(courselink);/将拓扑排序的正序存入sortedlist中,用于课程的安排void topsort(Graph* G) / Topolo
10、gical sort int i; for (i=0; in(); i+) / Initialize G-setMark(i,1); for (i=0; in(); i+) / Do vertices if (G-getMark(i) = 1) tophelp(G, i); / Call helpervoid courseArrange()/安排课表 Link* temp=sortedlist.getHead(); int count8; for(int i=0;i8;i+) counti=0; for(;count0getNext()/优先安排已经预设学期的课程 if(temp-getSem
11、aster()=1) count0+; else if(temp-getSemaster()=2) count1+; else if(temp-getSemaster()=3) count2+; else if(temp-getSemaster()=4) count3+; else if(temp-getSemaster()=5) count4+; else if(temp-getSemaster()=6) count5+; else if(temp-getSemaster()=7) count6+; else if(temp-getSemaster()=8) count7+; temp=so
12、rtedlist.getHead();/再按学期顺序安排已经安排学期的课程,srtedlist中的先后顺序对应了学期的先后顺序 for(;temp!=NULL;temp=temp-getNext() if(count0getSemaster()=0) temp-setSemester(1); count0+; else if(count1getSemaster()=0) temp-setSemester(2); count1+; else if(count2getSemaster()=0) temp-setSemester(3); count2+; else if(count3getSemas
13、ter()=0) temp-setSemester(4); count3+; else if(count4getSemaster()=0) temp-setSemester(5); count4+; else if(count5getSemaster()=0) temp-setSemester(6); count5+; else if(count6getSemaster()=0) temp-setSemester(7); count6+; else/semter8 if(temp-getSemaster()=0) temp-setSemester(8); count7+; void print
14、SchoolTimeTable()/打印课表 Link* temp=sortedlist.getHead();/semter1 coutcourses of semester 1 :endl; fstream output; output.open(course_table.txt); output第一学期课程: getNext() if(temp-getSemaster()=1) outputgetCode() getName()endl; coutgetCode() getName()endl; temp=sortedlist.getHead();/semter2 coutcourses
15、of semester 2 :endl; output第二学期课程: getNext() if(temp-getSemaster()=2) outputgetCode() getName()endl; coutgetCode() getName()endl; temp=sortedlist.getHead();/semter3 coutcourses of semester 3 :endl; output第三学期课程: getNext() if(temp-getSemaster()=3) outputgetCode() getName()endl; coutgetCode() getName(
16、)endl; temp=sortedlist.getHead();/semter4 coutcourses of semester 4 :endl; output第四学期课程: getNext() if(temp-getSemaster()=4) outputgetCode() getName()endl; coutgetCode() getName()endl; temp=sortedlist.getHead();/semter5 coutcourses of semester 5 :endl; output第五学期课程: getNext() if(temp-getSemaster()=5)
17、 outputgetCode() getName()endl; coutgetCode() getName()endl; temp=sortedlist.getHead();/semter6 coutcourses of semester 6 :endl; output第六学期课程: getNext() if(temp-getSemaster()=6) outputgetCode() getName()endl; coutgetCode() getName()endl; temp=sortedlist.getHead();/semter7 coutcourses of semester 7 :
18、endl; output第七学期课程: getNext() if(temp-getSemaster()=7) outputgetCode() getName()endl; coutgetCode() getName()endl; temp=sortedlist.getHead();/semter8 coutcourses of semester 8 :endl; output第八学期课程: getNext() if(temp-getSemaster()=8) outputgetCode() getName()endl; coutgetCode() getName()endl; output.c
19、lose();6.运行结果:测试数据选择(课程编码,课程名称,开课学时,预设开课学期,先决条件) (c01,程序设计基础,5,0,) (c02,离散数学,6,0,c01)(c03,数据结构,4,0,c01 c02) (c04,汇编语言,5,0,c01)(c05,算法设计,4,0,c03 c04) (c06,计算机组成原理,6,0,) (c07,微机原理,4,0,c03) (c08,单片机应用,3,0,c03)(c09,编译原理,5,0,c03) (c10,操作系统原理,4,0,c03)(c11,数据库原理,5,0,c03) (c12,高等数学,6,0,)(c13,线性代数,6,0,) (c14,数值分析,6,0,c12)(c15,普通物理,6,0,c12) (c16,计算机文化,3,0,) (c17,计算机系统结构,6,0,c06) (c18,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1