




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验题目:教学计划编排班级:数学类2 姓名:史宝珠 学号:2011434066 日期:2011.12一、需求分析 1.程序的基本功能教学计划的制定就是合理的编排这些课程,使学生能够顺利的进行学习。这些课程中,有些课程是独立于其他课程的基础课,有些课程需要其他先行课程;一般4年制本科教学前7个学期(3年半)进行理论课程的学习,第8个学期实习;教学计划的编排必须充分考虑这些因素。2.输入输出要求假定学习年限是固定的,每学年包含两个学期,各专业开设的课程是确定的,每门课程是否有先修课、有几门先修课也是确定的。要求制定教学计划,合理的安排各学期开授的课程。要求各学期课程门数、学分的分布较均匀。二、概要
2、设计1)程序模块:(1)Void Information():输依次输入课程的总数,AOV网中边的条数;输入AOV网中各个顶点的信息;输入该课程的课程名;输入该课程的学分;输入该课程的课序号;输入该课程的入度;如果此课程需要多个学期修完,请输入1;如果不是请输入2;(2)float Aov(int p,AOVGraph AOV200,int b1,float sum2)建立(运用拓扑排序)AOV网,从而将所有的信息以课表形式存储和显示。其中有对各种信息的输入,并且有建表的操作,将所有的内容有条理的存储和显示出来,使读者一目了然。(3)int main()::主模块,通过对各个模块的调用实现教学
3、计划的安排。2)本程序所用的抽象数据类型的定义; typedef struct nodeint adjevx;struct node *next;EdgeNode;typedef struct vnodeint num;/课程号char name25;/课程名float chour;/学分int indegree;/入度char nature;/是否为选修课char a1;int a11;int a12; EdgeNode *firstedge;VNode;typedef structVNode AdjListMAX;int n,e;float sum;AOVGraph;3) 模块之间的层次关
4、系主 模 块mainjianliAov Information三、详细设计1.采用C+语言定义相关的数据类型;ifstream input_file;/文件输入流及对文件的建立ofstream output_file;/文件输出流及对文件的读取typedef struct nodeint adjevx;/*邻接点域*/struct node *next;/*指向下一个邻接点的指针域*/EdgeNode;/*边表结点*/typedef struct vnode/*顶点表结点*/int num;/*课程号*/char name25;/*课程名*/float chour;/*课程学分*/int in
5、degree;/*顶点的入度*/char vertex;/*顶点域*/char nature; /*是否为选修课*/char a1;int a11;int a12; EdgeNode *firstedge;VNode;/*边表的头指针*/typedef structVNode AdjListMAX;/*邻接表*/int n;/*顶点数*/int e;/*边数*/float sum;/*总学分*/AOVGraph;typedef structVNode AdjListMAX;int r;int f;Queue;Queue *p;2.写出各模块的伪码算法;Queue *Init_queue(Que
6、ue *p) /构建空的队列p=(Queue *)malloc(sizeof(Queue);p->f=p->r=-1; /运用头尾指针来判断队是否为空return p;int in_queue(Queue *p,VNode srMAX)if(p->r=MAX-1)cout<<"队满不可以进行入对操作"<<endl;return -1;elsep->r+;p->AdjListp->p->r=srp->p->r;p->AdjListp->r.num=srp->
7、r.num;p->AdjListp->r.chour=srp->r.chour;p->AdjListp->r.indegree=srp->r.indegree;p->AdjListp->r.firstedge=srp->r.firstedge;return 1;int out_queue(Queue *p,VNode *sr)if(p->r=-1)cout<<"队空不能出队"<<endl;return -1;else*sr=p->AdjListp->f;p->f+;retu
8、rn 1;void Information(AOVGraph AOV200,int b1)/*信息的输入*/b1=0;int k=0,i=0,j;EdgeNode *Q,*r;AOV->sum=0;cout<<"请依次输入课程的总数,AOV网中边的条数"<<endl;cin>>AOV->n>>AOV->e;for(i=0;i<AOV->n;i+)/*将信息依次输入*/cout<<"n请输入AOV网中第 "<<i+1<<" 个顶点的信
9、息,还有"<<AOV->n-i-1<<" 个顶点没有输入:n"<<endl;cout<<"n请输入该课程的课程名:nn"<<endl;cin>>AOV->AdjL;AOV->AdjListi.nature='M' b1+; cout<<"n请输入该课程的学分:nn"<<endl; cin>>AOV->AdjListi.chour; AOV->sum+=AO
10、V->AdjListi.chour; cout<<"n请输入该课程的课序号:nn"<<endl; cin>>AOV->AdjListi.num; cout<<"n请输入该课程的入度:nn"<<endl; cin>>AOV->AdjListi.indegree; AOV->AdjListi.firstedge=NULL;/*初始化邻接编表*/ AOV->AdjListi.a12=0; if(AOV->AdjListi.indegree=0) AOV-
11、>AdjListi.a11=0; else AOV->AdjListi.a11=1; cout<<"n以下为输入AOV网中各条边的信息:nn"<<endl;/*输入aov网的有关信息*/cout<<"n请输入边的信息(输入格式为: i:j。i,j分别表示AOV网中<vi,vj>的顶点对应的序号。):nn"<<endl;for(j=1;j<=AOV->e;k+)cout<<"第"<<j<<"条边的信息&quo
12、t;<<endl;cin>>i>>j;Q=(EdgeNode *)malloc(sizeof(EdgeNode);Q->adjevx=j-1;if(AOV->AdjListi-1.firstedge=NULL) AOV->AdjListi-1.firstedge=Q;else r=AOV->AdjListi-1.firstedge; while(r->next!=NULL) r=r->next; r->next=Q;Q->next=NULL;if(AOV->e=k)cout<<"n边
13、的信息输入结束。nn"float jianliAov(int p,AOVGraph AOV200,int b1,float sum2)/*运用拓扑排序建立AOV网的结构建立教学编排表*/int i;int k;float j;/,aEdgeNode *ptr;int b2=7,b3;VNode point1;sum2=0;char ch;ofstream outfile("n.txt",ios:out);/*对文件的操作进行打开文件操作*/for(i=0;i<AOV->n;i+)if(AOV->AdjListi.indegree=0&&a
14、mp;AOV->AdjListi.nature='M'&&AOV->AdjListi.a11=0&&AOV->AdjListi.a12=0)sum2+=AOV->AdjListi.chour;if(sum2-AOV->sum/b2<AOV->AdjListi.chour)/*将输入的信息有序的进行存入文件*/cout<<"课程号"<<"课程名 "<<"学分"<<"课程性质"<
15、;<endl;cout<<AOV->AdjListi.num <<" "<<AOV->AdjL<<" "<<AOV->AdjListi.chour<<" "<<AOV->AdjListi.nature<<endl;outfile<<"课程号"<<"课程名 "<<"学分"<<"课
16、程性质"<<endl;outfile<<AOV->AdjListi.num <<" "<<AOV->AdjL<<" "<<AOV->AdjListi.chour<<" "<<AOV->AdjListi.nature<<endl;AOV->AdjListi.a12=1;b1-;b3+;ptr=AOV->AdjListi.firstedge;while(ptr!=NUL
17、L)k=ptr->adjevx;AOV->AdjListk.indegree-;ptr=ptr->next;elsesum2-=AOV->AdjListi.chour;/*计算总学分*/ j=sum2;cout<<"第 "<<(p+2)/2<<" 学年第 "<<2-(p+1)%2<<" 学期所修学分为:"<<j<<",课程数为 "<<b3<<" 如果想修选修课,请输入1 ,否
18、则输入 2: nn"<<endl;outfile<<"第 "<<(p+2)/2<<" 学年第 "<<2-(p+1)%2<<" 学期所修学分为:"<<j<<",课程数为 "<<b3<<endl;/*输入某学期的信息并显示*/outfile.close();cin>>ch;if(ch='1') cout<<"请输入选修课的信息:"&
19、lt;<endl;cout<<"请输入该课程的课程名: "<<endl;cin>>;cout<<"请输入该课程的学分:"<<endl;cin>>point1.chour;j+=point1.chour; b3+;cout<<"n请输入该课程的课序号: "<<endl;cin>>point1.num; point1.nature='选修'cout<<"现在所修学分为
20、:"<<j<<",课程数为:"<<b3<<"继续输入选修课,请输入 1 ,否则输入 2: "<<endl;cin>>ch; return j;int main(AOVGraph AOV200,int b1,float sum2) b1=0; sum2=0;int i,j,a;EdgeNode *ptr;int b2,b3;int k;float sum4;AOV=(AOVGraph *)malloc(sizeof(AOVGraph);cout<<" &
21、quot;<<"*"<<endl;cout<<" "<<"*欢迎进入教学计划编排系统*"<<endl;cout<<" "<<"班级:数学类2"<<" "<<"学号:2011434066"<<" "<<"姓名:史宝珠"<<endl;cout<<" &quo
22、t;<<"*"<<endl;cout<<" 由AOV网生成课表nn"cout<<"n请输入修完课程总的学期数:nn"cin>>a;b2=a;cout<<"n请输入AOV网中课程的信息:nn" Information(AOV,b1);for(i=0;i<a;i+)cout<<"n第"<<(i+2)/2<<"学年第"<<2-(i+1)%2<<&
23、quot; 学期"<<endl;for(j=0;j<AOV->n;j+) if(AOV->AdjListj.indegree=0&&(AOV->AdjListj.a1='y'|AOV->AdjListj.a1='Y')&&AOV->AdjListj.a11=0&&AOV->AdjListj.a12=0) sum2+=AOV->AdjListj.chour; if(sum2-AOV->sum/b2<AOV->AdjListj.ch
24、our) AOV->AdjListj.a12=1; b1-; b3+; ptr=AOV->AdjListj.firstedge; while(ptr!=NULL) k=ptr->adjevx; AOV->AdjListk.indegree-; ptr=ptr->next; else sum2-=AOV->AdjListj.chour; sum4=jianliAov(i,AOV,b1,sum2);for(j=0;j<AOV->n;j+)if(AOV->AdjListj.indegree=0) AOV->AdjListj.a11=0;AO
25、V->sum=AOV->sum-sum2;sum2=0;b2-;b3=0;if(b1>0)/*对于特殊情况下的课程安排*/cout<<"有课程未修完"<<endl<<" 没修完的课程为"<<endl;cout<<"课程号"<<"课程名 "<<"学分"<<"课程性质"<<endl; for(i=0;i<AOV->n;i+)if(AOV->
26、;AdjListi.a12=0)cout<<AOV->AdjListi.num <<" "<<AOV->AdjL<<" "<<AOV->AdjListi.chour<<" "<<AOV->AdjListi.nature<<endl;cout<<"请增加学期数 "<<endl; else/*对课表的建立是观看更方便*/ cout<<"课
27、表已经生成"<<endl; return 0; 四、调试分析1.调试中遇到的问题与对于问题的解决方法:1).遇到的问题:(1)在定义头文件时,不是少了就是不知道用哪个,总之对于函数应用在哪个头文件不明确。(2)在执行译码操作时,不知什么原因,总是不能按顺序直接放在一起,视觉效果不是很好。(3)对于一开始的时候,因为平时很少接触对于文件写入、输出的操作,所以对它特别陌生,我的教学计划编排没有像老师要求的那样完成编一个文件的功能。2).解决方法:(1)在定义头文件时可多不可少,即我们可多写些头文件,肯定不会出错,但是若没有定义所引用的相关头文件,必定调试不通过,所以每次写时就
28、多写写经常用的出来。(2)在网上搜集了大量关于如何实现屏上输出的程序,经过参考写出了符合自己的对于译码在屏上的显示效果。(3)通过在网上搜索有关文件的应用,还有查看小学期的笔记,还找了大量有关文件输出、写入的书籍如精讲C+来查找关于文件的内容。2.对于这次编写程序的总结: 通过本次数据结构的课程设计,我学习了很多在上课没懂的知识,并对求教学计划编排的算法有了更加深刻的了解,更巩固了课堂中学习有关于编排的知识,真正学会一种算法了。当求解一个算法时,不是拿到问题就不加思索地做,而是首先要先对它有个大概的了解,接着再详细地分析每一步怎么做,无论自己以前是否有处理过相似的问题,只要按照以上的步骤,必定
29、会顺利地做出来。这次课程设计,我在编辑中犯了不应有的错误,对文件的操作也很生疏。在不断分析后明确并改正了错误和疏漏,我的程序有了更高的质量。 五、使用说明和测试结果1.进行测试:六、源程序代码:#include"stdio.h"#include<cstdlib>#include"search.h"#include"fstream.h"#include"string.h"#include"stdlib.h"#include"iostream.h"#define MA
30、X 100#define N 14/cstdlib:search#define M 100ifstream input_file;/文件输入流及对文件的建立ofstream output_file;/文件输出流及对文件的读取typedef struct nodeint adjevx;/*邻接点域*/struct node *next;/*指向下一个邻接点的指针域*/EdgeNode;/*边表结点*/typedef struct vnode/*顶点表结点*/int num;/*课程号*/char name25;/*课程名*/float chour;/*课程学分*/int indegree;/*顶
31、点的入度*/char vertex;/*顶点域*/char nature; /*是否为选修课*/char a1;int a11;int a12; EdgeNode *firstedge;VNode;/*边表的头指针*/typedef structVNode AdjListMAX;/*邻接表*/int n;/*顶点数*/int e;/*边数*/float sum;/*总学分*/AOVGraph;typedef structVNode AdjListMAX;int r;int f;Queue;Queue *p;Queue *Init_queue(Queue *p) /构建空的队列p=(Queue
32、*)malloc(sizeof(Queue);p->f=p->r=-1; /运用头尾指针来判断队是否为空return p;int in_queue(Queue *p,VNode srMAX)if(p->r=MAX-1)cout<<"队满不可以进行入对操作"<<endl;return -1;elsep->r+;p->AdjListp->p->r=srp->p->r;p->AdjListp->r.num=srp->r.num;p->AdjListp-&g
33、t;r.chour=srp->r.chour;p->AdjListp->r.indegree=srp->r.indegree;p->AdjListp->r.firstedge=srp->r.firstedge;return 1;int out_queue(Queue *p,VNode *sr)if(p->r=-1)cout<<"队空不能出队"<<endl;return -1;else*sr=p->AdjListp->f;p->f+;return 1;void Information(A
34、OVGraph AOV200,int b1)/*信息的输入*/b1=0;int k=0,i=0,j;EdgeNode *Q,*r;AOV->sum=0;cout<<"请依次输入课程的总数,AOV网中边的条数"<<endl;cin>>AOV->n>>AOV->e;for(i=0;i<AOV->n;i+)/*将信息依次输入*/cout<<"n请输入AOV网中第 "<<i+1<<" 个顶点的信息,还有"<<AOV-&
35、gt;n-i-1<<" 个顶点没有输入:n"<<endl;cout<<"n请输入该课程的课程名:nn"<<endl;cin>>AOV->AdjL;AOV->AdjListi.nature='M' b1+; cout<<"n请输入该课程的学分:nn"<<endl; cin>>AOV->AdjListi.chour; AOV->sum+=AOV->AdjListi.chour; c
36、out<<"n请输入该课程的课序号:nn"<<endl; cin>>AOV->AdjListi.num; cout<<"n请输入该课程的入度:nn"<<endl; cin>>AOV->AdjListi.indegree; AOV->AdjListi.firstedge=NULL;/*初始化邻接编表*/ AOV->AdjListi.a12=0; if(AOV->AdjListi.indegree=0) AOV->AdjListi.a11=0; els
37、e AOV->AdjListi.a11=1; cout<<"n以下为输入AOV网中各条边的信息:nn"<<endl;/*输入aov网的有关信息*/cout<<"n请输入边的信息(输入格式为: i:j。i,j分别表示AOV网中<vi,vj>的顶点对应的序号。):nn"<<endl;for(j=1;j<=AOV->e;k+)cout<<"第"<<j<<"条边的信息"<<endl;cin>&
38、gt;i>>j;Q=(EdgeNode *)malloc(sizeof(EdgeNode);Q->adjevx=j-1;if(AOV->AdjListi-1.firstedge=NULL) AOV->AdjListi-1.firstedge=Q;else r=AOV->AdjListi-1.firstedge; while(r->next!=NULL) r=r->next; r->next=Q;Q->next=NULL;if(AOV->e=k)cout<<"n边的信息输入结束。nn"float j
39、ianliAov(int p,AOVGraph AOV200,int b1,float sum2)/*运用拓扑排序建立AOV网的结构建立教学编排表*/int i;int k;float j;/,aEdgeNode *ptr;int b2=7,b3;VNode point1;sum2=0;char ch;ofstream outfile("n.txt",ios:out);/*对文件的操作进行打开文件操作*/for(i=0;i<AOV->n;i+)if(AOV->AdjListi.indegree=0&&AOV->AdjListi.nat
40、ure='M'&&AOV->AdjListi.a11=0&&AOV->AdjListi.a12=0)sum2+=AOV->AdjListi.chour;if(sum2-AOV->sum/b2<AOV->AdjListi.chour)/*将输入的信息有序的进行存入文件*/cout<<"课程号"<<"课程名 "<<"学分"<<"课程性质"<<endl;cout<<A
41、OV->AdjListi.num <<" "<<AOV->AdjL<<" "<<AOV->AdjListi.chour<<" "<<AOV->AdjListi.nature<<endl;outfile<<"课程号"<<"课程名 "<<"学分"<<"课程性质"<<endl;o
42、utfile<<AOV->AdjListi.num <<" "<<AOV->AdjL<<" "<<AOV->AdjListi.chour<<" "<<AOV->AdjListi.nature<<endl;AOV->AdjListi.a12=1;b1-;b3+;ptr=AOV->AdjListi.firstedge;while(ptr!=NULL)k=ptr->adjevx;AOV-
43、>AdjListk.indegree-;ptr=ptr->next;elsesum2-=AOV->AdjListi.chour;/*计算总学分*/ j=sum2;cout<<"第 "<<(p+2)/2<<" 学年第 "<<2-(p+1)%2<<" 学期所修学分为:"<<j<<",课程数为 "<<b3<<" 如果想修选修课,请输入1 ,否则输入 2: nn"<<
44、endl;outfile<<"第 "<<(p+2)/2<<" 学年第 "<<2-(p+1)%2<<" 学期所修学分为:"<<j<<",课程数为 "<<b3<<endl;/*输入某学期的信息并显示*/outfile.close();cin>>ch;if(ch='1') cout<<"请输入选修课的信息:"<<endl;cout<<
45、;"请输入该课程的课程名: "<<endl;cin>>;cout<<"请输入该课程的学分:"<<endl;cin>>point1.chour;j+=point1.chour; b3+;cout<<"n请输入该课程的课序号: "<<endl;cin>>point1.num; point1.nature='选修'cout<<"现在所修学分为:"<<j<<
46、;",课程数为:"<<b3<<"继续输入选修课,请输入 1 ,否则输入 2: "<<endl;cin>>ch; return j;int main(AOVGraph AOV200,int b1,float sum2) b1=0; sum2=0;int i,j,a;EdgeNode *ptr;int b2,b3;int k;float sum4;AOV=(AOVGraph *)malloc(sizeof(AOVGraph);cout<<" "<<"*"<<endl;cout<<" "<<"*欢迎进入教学计划编排系统*"<<endl;cout<<" "<<"班级:数学类2"<<" "<<"学号:2011434066"<<" "<<"姓名:史宝珠"<<e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息处理员的应对策略试题及答案
- 法学概论的演变过程试题及答案
- 风险管理过程中的沟通试题及答案
- 2025年网络管理员考试知识回顾试题及答案
- 2025年法学概论知识要点和试题及答案
- 法学概论课程目标的试题及答案
- 复盘法学概论考试试题及答案
- 结合英文学习的软件设计师考试试题及答案
- 2025年中国遥控童车市场调查研究报告
- 2025年中国超小型脉冲氩弧焊机市场调查研究报告
- 主力操盘手法揭秘
- 农耕文化视域下小学生劳动教育初探 论文
- 人教版六年级上册数学(新插图) 倒数的认识 教学课件
- 港口装卸工艺chap3-件杂货
- CJJ 36-2016 城镇道路养护技术规范
- 直臂式高空作业车安全管理培训课件-
- 之江实验室:生成式大模型安全与隐私白皮书
- 灵芝孢子油的作用
- 免疫组织化学检验技术(免疫学检验课件)
- 世界文明史学习通课后章节答案期末考试题库2023年
- 某石料厂年产10万吨石灰岩开采建设项目可行性研究报告
评论
0/150
提交评论