




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计报告设计题目:教务课程计划的辅助制定班 级 学 号 姓 名 成 绩 2013-2014 年 第1 学期一实习目的为用户编排课程,根据用户输入的信息来编排出每学期要学的课程.二问题描述(具体任务)问题描述扩展拓扑排序算法,进行课程学习计划的辅助制定。设计要求一个学生在一个学期可以同时学习多门课程,同一学期的各门课程之间不存在次序关系,制定课程计划使学生可以在最短时间内学完所有课程。三需求分析 1.程序的功能。大学的每个专业都要制订教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。本程序针对本科的学期内容,通过输入实际的课程及先后关系。结合每学期的学分及课程数,制定好学习计划。在输入相关数据后,程序会安排好每学期的课程。2.输入输出的要求。基本要求:a.输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。b.允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。c.若根据给定的条件问题无解,则报告适当的信息;否则,将教学计划输出到用户指定的文件中。计划的表格格式自行设计。四算法设计思想及流程图1.LocateVex():图的邻接表存储的基本操作。由初始条件: 图G存在,u和G中顶点有相同特征转而进行判断,若G中存在顶点u,则返回该顶点在图中位置;否则返回-1。图LocateVex() 图GreateGreaph() 图Display()2.CreateGraph():构造生成图。采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图)。3.Display():输出图的邻接矩阵。采用循环设置输出图的邻接矩阵。4.FindInDegree():求顶点的入度。 图FindInDegree() 图InitStack()5.InitStack():构造一个空栈。6.ClearStack():清空栈。7.StackEmpty():判断栈是否为空。若栈S为空栈,则返回TRUE,否则返回FALSE。8. Pop():出栈。若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。9. Push():入栈。插入元素e为新的栈顶元素。10.TopologicalSort():输出G顶点的拓扑排序结果。有向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK, 否则返回ERROR。五C语言源代码#include #include #include / malloc()等 #include / INT_MAX等 #include / EOF(=Z或F6),NULL #include / atoi()52 #include / eof() #include / floor(),ceil(),abs() #include / exit() / 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 typedef int Status; / Status是函数的类型,其值是函数结果状态代码,如OK等 typedef int Boolean; / Boolean是布尔类型,其值是TRUE或FALSE #define MAX_NAME 20 /* 顶点字符串的最大长度*/ #define MAXCLASS 100 int Z=0; int X=0; int xqzs,q=1,xfsx; typedef int InfoType; typedef char VertexTypeMAX_NAME; /* 字符串类型*/ /* 图的邻接表存储表示*/ #define MAX_VERTEX_NUM 100 typedef enumDGGraphKind; /* 有向图,有向网,无向图,无向网 */ typedef struct ArcNode int adjvex; /* 该弧所指向的顶点的位置*/ struct ArcNode *nextarc; /* 指向下一条弧的指针*/ InfoType *info; /* 网的权值指针)*/ ArcNode; /* 表结点*/ typedef struct VertexType data; /* 顶点信息*/ ArcNode *firstarc; /* 第一个表结点的地址,指向第一条依附该顶点的弧的指针*/ VNode,AdjListMAX_VERTEX_NUM; /* 头结点*/ typedef struct AdjList vertices,verticestwo; int vexnum,arcnum; /* 图的当前顶点数和弧数*/ int kind; /* 图的种类标志*/ ALGraph;/* 图的邻接表存储的基本操作*/ int LocateVex(ALGraph G,VertexType u) /* 初始条件: 图G存在,u和G中顶点有相同特征*/ /* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */ int i; for(i=0;iG.vexnum;+i) if(strcmp(u,G.verticesi.data)=0) return i; return -1;Status CreateGraph(ALGraph *G) /* 采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图) */ int i,j,k; VertexType va,vb; ArcNode *p; printf(请输入教学计划的课程数: ); scanf(%d,&(*G).vexnum); printf(请输入拓扑排序所形成的课程先修关系的边数: ); scanf(%d,&(*G).arcnum); printf(请输入%d个课程的代表值(%d个字符):n,(*G).vexnum,MAX_NAME); for(i=0;i(*G).vexnum;+i) /* 构造顶点向量*/ scanf(%s,(*G).verticesi.data); (*G).verticesi.firstarc=NULL; printf(请输入%d个课程的学分值(%d个字符):n,(*G).vexnum,MAX_NAME); for(i=0;i(*G).vexnum;+i) /* 构造顶点向量*/ scanf(%s,(*G).verticestwoi.data); printf(请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):n); for(k=0;kadjvex=j; p-info=NULL; /* 图*/ p-nextarc=(*G).verticesi.firstarc; /* 插在表头*/ (*G).verticesi.firstarc=p; return OK; void Display(ALGraph G) /* 输出图的邻接表G */ int i; ArcNode *p; switch(G.kind) case DG: printf(有向图n); printf(%d个顶点:n,G.vexnum); for(i=0;iG.vexnum;+i) printf(%s ,G.verticesi.data); printf(n%d条弧(边):n,G.arcnum); for(i=0;iadjvex.data); p=p-nextarc; printf(n); void FindInDegree(ALGraph G,int indegree) /* 求顶点的入度,算法调用*/ int i; ArcNode *p; for(i=0;iG.vexnum;i+) indegreei=0; /* 赋初值*/ for(i=0;iadjvex+; p=p-nextarc; typedef int SElemType; /* 栈类型*/ /*栈的顺序存储表示*/ #define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/ #define STACKINCREMENT 2 /* 存储空间分配增量*/ typedef struct SqStack SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */ SElemType *top; /* 栈顶指针*/ int stacksize; /* 当前已分配的存储空间,以元素为单位*/ SqStack; /* 顺序栈*/ /* 顺序栈的基本操作*/ Status InitStack(SqStack *S) /* 构造一个空栈S */ (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType); if(!(*S).base) exit(OVERFLOW); /* 存储分配失败*/ (*S).top=(*S).base; (*S).stacksize=STACK_INIT_SIZE; return OK;void ClearStack(SqStack *S) /清空栈的操作S-top=S-base;Status StackEmpty(SqStack S) /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ if(S.top=S.base) return TRUE; else return FALSE; Status Pop(SqStack *S,SElemType *e) /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */ if(*S).top=(*S).base) return ERROR; *e=*-(*S).top; return OK; Status Push(SqStack *S,SElemType e) /* 插入元素e为新的栈顶元素*/ if(*S).top-(*S).base=(*S).stacksize) /* 栈满,追加存储空间*/ (*S).base=(SElemType *)realloc(*S).base,(*S).stacksize+STACKINCREMENT)*sizeof(SElemType); if(!(*S).base) exit(OVERFLOW); /* 存储分配失败*/ (*S).top=(*S).base+(*S).stacksize; (*S).stacksize+=STACKINCREMENT; *(*S).top)+=e; return OK; typedef int pathoneMAXCLASS;typedef int pathtwoMAXCLASS;Status TopologicalSort(ALGraph G) /* 有向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK, */ /* 否则返回ERROR。*/ int i,k,j=0,count,indegreeMAX_VERTEX_NUM; bool has=false; SqStack S; pathone a; pathtwo b; ArcNode *p; FindInDegree(G,indegree); /* 对各顶点求入度indegree0.vernum-1 */ InitStack(&S); /* 初始化栈*/ for(i=0;iG.vexnum;+i) /* 建零入度顶点栈S */ if(!indegreei) Push(&S,i); /cout*G.verticesi.datanextarc) /* 对i号顶点的每个邻接点的入度减*/ k=p-adjvex; if(!(-indegreek) /* 若入度减为,则入栈*/ Push(&S,k);/cout*G.verticesi.dataendl; if(countG.vexnum) printf(此有向图有回路n); return ERROR; else printf(为一个拓扑序列。n);has=true; FindInDegree(G,indegree); /* 对各顶点求入度indegree0.vernum-1 */ ClearStack(&S); printf(=课程计划如下=n); int qq=1; /学期数 int xxf; while(qq=xqzs) int result20; int rtop=0; int nn=0; /int ccount=0; / 学期学分计算 xxf=0; for(i=0;ixfsx)break;indegreei-;for(p=G.verticesi.firstarc;p;p=p-nextarc) /* 对i号顶点的每个邻接点的入度减*/k=p-adjvex;indegreek-;/* if(!(-indegreek) 若入度减为,则入栈Push(&S,k);*/resultrtop=i;rtop+; printf(第%d个学期的课程为:n,qq); for(nn=0;nnrtop;nn+) printf(课程%sn,G.verticesresultnn.data); qq+; return OK;void main() ALGraph f; printf(教学计划编制问题的数据模型为拓扑排序AOV-网结构。n); printf(以下为教学计划编制问题的求解过程:n); printf(请输入学期总数:); scanf(%d,&xqzs); printf(请输入学期的学分上限:); scanf(%d,&xfsx); CreateGraph(&f); Display(f); TopologicalSort(f);六测试分析(运行结果)输入学期总数,学分上限,课程数,先修关系边数,课程代表值,输入课程学分值输入每条弧的弧尾和弧头得出课程计划:七总结(收获及体会)在这次课程设计中,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铁道机车专业试题及答案
- 审计专业考研试题及答案
- 通信专业试题及答案软件
- 企业店庆庆祝致辞模板
- 互联网内容服务协议的法律效力
- 2025年五年级第二学期期末质量检测试卷
- 井下电缆防腐施工方案
- 公司综合组组长工作总结
- 2024-2025学年江西省吉安市永新县七年级(上)期末数学试卷(含答案)
- 江西省南昌市新民外语学校2024-2025学年七年级上学期第一次月考道德与法治试卷(无答案)
- 2025未签合同劳动争议仲裁申请书
- 南航自动控制原理课件
- 胎盘早剥护理查房
- 脑梗死2025诊疗指南
- 耳前瘘管继发感染诊疗要点
- T-YNX 002-2025 葡萄组培脱毒快繁技术规程
- 2025年北京中考真题英语试题及答案
- 2025年浙江省中考社会试题卷(含答案)
- 衣服投标供货方案(3篇)
- 公司电脑补贴管理办法
- 中石化对供应商管理办法
评论
0/150
提交评论