




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、教学计划编制问题 问题描述: 大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学 期,每学期的时间长度和学分上限值均相等, 每个专业开设的课程都是确定的, 而且课程在 开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门, 也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。 基本要求: (1)输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占 3 位的字母数 字串 )、学分和直接先修课的课程号。 (2)允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀; 二是使课程尽可能地集中在前
2、几个学期中。 (3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的 文件中。计划的表格格式自行设计。 测试数据: 学期总数: 6;学分上限: 10;该专业共开设 12 门课,课程号从 C01 到 C12,学分顺序为 2,3,4,3,2,3,4,4,7,5,2,3。先修关系如下: 课程编号 课程名称 先决条件 C1 程序设计基础 无 C2 离散数学 C1 C3 数据结构 C1,C2 C4 汇编语言 C1 C5 语言的设计和分 析 C3,C4 C6 计算机原理 C11 C7 编译原理 C5,C3 C8 操作系统 C3,C6 C9 高等数学 无 C10 线性代数 C9 C
3、11 普通物理 C9 C12 数值分析 C9,C10,C1 实现提示 可设学期总数不超过 12,课程总数不超过 100。如果输入的先修课程号不在该专业开设的课 程序列中,则作为错误处理。应建立内部课程序号与课程号之间的对应关系。 #include #include #include #define null 0 #define MAXNODE 64 / 最大课程个数 typedef struct char c3; cid; / 课程号 typedef struct Course cid id3; / 课程号 char name30; / 课程名 float xf; / 学分 Course; /
4、 课程 typedef struct PreCourse int adjvex; / 课程在数组中的下标 struct PreCourse *pre; / 指向下一先修的课程节点 PreCourse;/ 先修的课程节点 typedef struct Course course;/课程 PreCourse *firstnext; / 指向第一个先修的课程节点 CourseNode;/ 课程节点 typedef struct CourseNode coursesMAXNODE; / 邻接表 int xqs;/ 学期总数 int num; / 课程的数目 float xfsx;/ 学分上限 AlGr
5、aph;/ 课程图 typedef struct int dataMAXNODE;/ 队中元素 int f,r;/队头 r 队尾 f queue; int IsCricle=0;/ 判断是否环 1 表示是 0 表示不是 int jxq;/ 用于计算学期的 / void queueinit(queue *q)/ 队初始化 q-f=q-r=0; void queuein(queue *q,int x)/ 入队 if(q-r+1)%MAXNODE=q-f) printf( 队满 n); exit(0); q-r=(q-r+1)%MAXNODE; q-dataq-r=x; int queueout(q
6、ueue *q)/ 出队 if(q-f=q-r) printf( 队空 n); exit(0); q-f=(q-f+1)%MAXNODE; return q-dataq-f; int queueempty(queue *q)/ 队判空 1 为空 if(q-f=q-r) return 1; else return 0; void creatpre(AlGraph *CGraph)/ 建立先修关系 system(cls);/ 用来清屏 int choice; fflush(stdin);/ 清空输入流 int i,j,n;/ 临时变量 PreCourse *p,*q;/ 临时变 printf(n
7、建立先修关系 :n); printf(n 请输入每一门课程号的编号: ); for(i=0;inum;i+) if(i%4=0)printf(n); printf(%d) ,i+1); printf(%st,CGraph-coursesi.course.id); printf(n 请根据以上的编号,输入每一门课程的先修课程(输入 0 表示没有或结束) n); for(i=0;inum;i+) printf(%s 的先修课程 :,CGraph-coursesi.course.id); scanf(%d, n=0; while(j) while(jCGraph-num|j=i+1) if(j=i+
8、1) printf( 先修课程号不能是本课程号 ); else printf( 输入的先修课程号不在该专业开设的课程序列中 ); fflush(stdin);/ 清空输入流 printf( 重新输入 :); scanf(%d, p=(PreCourse *)malloc(sizeof(PreCourse); p-adjvex=j-1; p-pre=null; if(n=0) CGraph-coursesi.firstnext=p; q=CGraph-coursesi.firstnext; n+; else q-pre=p; q=p; n+; scanf(%d, printf( 1) 重新建立先
9、修关系 2)确定n); printf( 请选择 :); scanf(%d, if(choice=1) creatpre(CGraph); jxq=0; AlGraph input()/ 输入并建立课程图 AlGraph CGraph; int xqzs=0,kczs=0;/ 学期总数 :xqzs 专业共开设课程数 :kczs int i,j;/ 临时变量 float xf,xfsx=0;/ 临时变量 xf 学分上限 :xfsx printf( 教学计划编制 nn); printf( 输入参数 :n); printf(1 、学期总数 :); scanf(%d, CGraph.xqs=xqzs;
10、printf(2 、专业共开设课程数 :); scanf(%d, CGraph.num=kczs;/ 课程数 printf(3 、学分上限 ( 每个学期的学分上限都一样 ):); scanf(%f, CGraph.xfsx=xfsx; printf(4 、每门课的课程号 (固定占 3 位的字母数字串 )、课程名、学分 :n); for(i=0;ixfsx|xf=0) printf( 本课程学分大于学期学分上限或小于等于零,请重新输入学分 :); fflush(stdin);/ 清空输入流 scanf(%f, CGraph.coursesi.course.xf=xf; CGraph.course
11、si.firstnext=null; creatpre(/ 建立先修关系 return CGraph; void output(AlGraph CGraph)/ 输出先修关系 int i,j,n;/ 临时变量 PreCourse *p;/ 临时变量 printf( 先修关系如下: nn); printf( 课程编号 t 课程名称 tt 先决条件 n); for(i=0;iadjvex; printf(%s ,CGraph.coursesn.course.id); p=p-pre; j+; if(j=0)printf( 无 ); printf(n); void findoutdegree(AlG
12、raph *CGraph,int outdegree)/ 找出度数,即找出每一门课程的先 修课数 int i; PreCourse *p; for(i=0;inum;i+) outdegreei=0; p=CGraph-coursesi.firstnext; while(p) outdegreei+; p=p-pre; void judgingcricle(AlGraph *CGraph,queue *q2)/ 判断是否有环 int outdegreeMAXNODE;/ 出度 int i,m,j,pd=0; float xf=0; PreCourse *p; queue q; queueini
13、t(/ 队初始化 findoutdegree(CGraph,outdegree);/ 找出度 for(i=0;inum;i+) if(outdegreei=0outdegreei-;xf+=CGraph-coursesi.course.xf; m=0;xf=0;queuein(jxq+; while(1) i=queueout( queuein(q2,i); if(i!=-1) m+; for(j=0;jnum;j+) if(j!=i) if(outdegreej=0outdegreej-;xf+=CGraph-coursesj.course.xf; else p=CGraph-courses
14、j.firstnext; while(p) if(p-adjvex=i) outdegreej-; 出度为零 if(outdegreej=0outdegreej-;pd=1;xf+=CGraph-coursesi.course.xf; p=p-pre; else if(pd)pd=0;queuein(jxq+;xf=0;else break; if(jxqCGraph-xqs)printf(n 错误报告:n 在%d 学期内是无 法修完这些课程 n,CGraph-xqs);exit(0); if(mnum) printf(n 错误报告: n); for(i=0;inum;i+) if(outde
15、greei0) printf(%s ,CGraph-coursesi.course.id); printf( 存在循环,因此课程安排不了 n); IsCricle=1; void layout1(AlGraph *CGraph,queue *q)/ 编排 1/ :nn); 是每学期要学的课程数 printf(n 学生在各学期中的学习负担尽量均匀 int i,j,xq=1,cxq=CGraph-xqs-jxq,ck20; float xf,m=CGraph-num/CGraph-xqs*1.0f;/m queue q1=*q;/ while(!queueempty(i20;i+)cki=-1;
16、for(i=0;icoursesj.course.id);i+;xf+=CGraph-coursesj.course.xf; while(cki!=-1); printf( 获得学分是 %.2fn,xf); void layout2(AlGraph *CGraph,queue *q)/ 编排 2 printf(n 课程尽可能地集中在前几个学期中 :nn); int i,j,xq=1;float xf; printf(n 第 %d 学期学: ,xq+);xf=0; queue q1=*q;/ for(i=0;inum;) j=queueout( if(j!=-1) printf( %s ,CGr
17、aph-coursesj.course.id);i+;xf+=CGraph-coursesj.course.xf; else printf( 获得学分是 %.2fn 第 %d 学期学: ,xf,xq+);xf=0; while(xqxqs)printf( 获得学分是 %.2fn 第 %d 学期学:无 t,xf,xq+);xf=0; printf( 获得学分是 %.2fn); void main() int choice; queue q;/用来存放已编排好的课程 queueinit(/ 队初始化 AlGraph CGraph;/ 课程图 fflush(stdin);/ 清空输入流 CGraph=input();/ 输入并建立课程图 system(cls);/ 用来清屏 output(CGra
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 集团植树活动方案
- 公关相关考试题及答案
- 各种宠物考试题及答案
- 客户服务问题反馈处理系统
- 生活中的一次转折议论文4篇范文
- 房产广告考试题及答案
- 返修技师考试题及答案
- (正式版)DB15∕T 3677-2024 《大兴安岭林区白桦树汁采集技术规程》
- 对联考试题及答案
- 吊装指挥考试题及答案
- 装配式建筑施工技术在建筑工程中的应用
- 《大客户管理和销售》
- 公司VI、SI设计内容选项
- YY/T 0698.2-2022最终灭菌医疗器械包装材料第2部分:灭菌包裹材料要求和试验方法
- 沪教牛津版小学英语五年级上册全册集体备课含教学计划及进度表
- 全国统一建筑安装工程工期定额
- 5.《秋天的怀念》课件+教学设计+视频朗读
- 上海破产管理人扩容考试参考题库(含答案)
- 涉河建设项目审查管理体会及探讨课件-涉河建设项目管理及建设方案审查技术标准课件
- DB44∕T 1168-2013 轮扣式钢管脚手架构件
- NMR有机氟谱课件
评论
0/150
提交评论