教学计划编制(新)_第1页
教学计划编制(新)_第2页
教学计划编制(新)_第3页
教学计划编制(新)_第4页
教学计划编制(新)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、所谓的光辉岁月,并不是以后,闪耀的日子,而是无人问津时,你对梦想的偏执。教学计划编制问题问题描述:大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等,每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门, 也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。基本要求:(1)输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串卜学分和直接先修课的课程号。(2)允许用户指定下列两种编排策略之一:一是使学生在各学期中的学

2、习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。(3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。计划的表格格式自行设计。测试数据:学期总数:6;学分上限:10;该专业共开设12门课,课程号从 C01到C12,学分顺序为 234,323,4,4,7,523。先修关系如下:课程编号课程名称先决条件C1程序设计基础无C2离散数学C1C3数据结构C1, C2C4,匚编语百C1C5语百的设计和分 析C3, C4C6计算机原理C11C7编译原理C5, C3C8操作系统C3, C6C9高等数学无C10线性代数C9C11普通物理C9C12数值分析C9, C10,

3、C1实现提示可设学期总数不超过 12,课程总数不超过100。如果输入的先修课程号不在该专业开设的课 程序列中,则作为错误处理。应建立内部课程序号与课程号之间的对应关系。#include<string.h>#include<stdio.h>#include<stdlib.h>#define null 0#define MAXNODE 64 / 最大课程个数typedef structchar c3;cid; / 课程号typedef struct Coursecid id3; / 课程号char name30; /课程名float xf; / 学分Course

4、; / 课程typedef struct PreCourseint adjvex; /课程在数组中的下标struct PreCourse *pre; /指向下一先修的课程节点PreCourse;/ 先修的课程节点typedef structCourse course;课程PreCourse *firstnext; / 指向第一个先修的课程节点CourseNode;/ 课程节点typedef structCourseNode coursesMAXNODE; / 邻接表int xqs;/学期总数int num; / 课程的数目float xfsx;/ 学分上限AlGraph;/ 课程图typede

5、f structint dataMAXNODE;/ 队中元素int f,r;/ 队头 r 队尾 fqueue;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;in

6、t queueout(queue *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);

7、/ 清空输入流int i,j,n;/ 临时变量PreCourse *p,*q;/ 临时变printf("n 建立先修关系:n");printf("n 请输入每一门课程号的编号:");for(i=0;i<CGraph->num;i+) if(i%4=0)printf("n");printf("%d) ",i+1);printf("%st",CGraph->coursesi.course.id);printf("n 请根据以上的编号,输入每一门课程的先修课程(输入0 表示

8、没有或结束)n");for(i=0;i<CGraph->num;i+)printf("%s 的先修课程:",CGraph->coursesi.course.id);scanf("%d",&j);n=0;while(j) while(j<1|j>CGraph->num|j=i+1)if(j=i+1)printf(" 先修课程号不能是本课程号");elseprintf(" 输入的先修课程号不在该专业开设的课程序列中");fflush(stdin);/ 清空输入流 p

9、rintf(" 重新输入:");scanf("%d",&j);p=(PreCourse *)malloc(sizeof(PreCourse);p->adjvex=j-1;p->pre=null;if(n=0) CGraph->coursesi.firstnext=p;q=CGraph->coursesi.firstnext; n+;elseq->pre=p;q=p;n+; scanf("%d",&j);printf(" 1) 重新建立先修关系2)确定n");printf

10、(" 请选择 :");scanf("%d",&choice);if(choice=1)creatpre(CGraph);jxq=0;AlGraph input()/ 输入并建立课程图AlGraph CGraph;int xqzs=0,kczs=0;/ 学期总数:xqzs 专业共开设课程数:kczsint i,j;/ 临时变量float xf,xfsx=0;/ 临时变量xf 学分上限:xfsxprintf(" 教学计划编制nn");printf(" 输入参数:n");printf("1 、学期总数:

11、");scanf("%d",&xqzs);CGraph.xqs=xqzs;printf("2 、专业共开设课程数:");scanf("%d",&kczs);CGraph.num=kczs;/ 课程数printf("3 、学分上限(每个学期的学分上限都一样):");scanf("%f",&xfsx);CGraph.xfsx=xfsx;printf("4 、每门课的课程号(固定占3 位的字母数字串)、课程名、学分:n");for(i=0;i<

12、;kczs;i+)j=0;fflush(stdin);/ 清空输入流printf(" 课程号 :");scanf("%s",CGraph.coursesi.course.id);fflush(stdin);/ 清空输入流printf(" 课程名 :");scanf("%s",CG);fflush(stdin);/ 清空输入流 printf(" 学分 :");scanf("%f",&xf);fflush(stdin);/

13、 清空输入流while(xf>xfsx|xf<=0)printf(" 本课程学分大于学期学分上限或小于等于零,请重新输入学分:");fflush(stdin);/ 清空输入流 scanf("%f",&xf);CGraph.coursesi.course.xf=xf;CGraph.coursesi.firstnext=null;creatpre(&CGraph);/ 建立先修关系return CGraph;void output(AlGraph CGraph)/ 输出先修关系int i,j,n;/ 临时变量PreCourse *

14、p;/ 临时变量printf(" 先修关系如下:nn");printf("课程编号t课程名称tt先决条件n");for(i=0;i<CGraph.num;i+)printf("%stt%stt",CGraph.coursesi.course.id,CG);j=0;p=CGraph.coursesi.firstnext;while(p)n=p->adjvex;printf("%s ",CGraph.coursesn.course.id);p=p->p

15、re;j+;if(j=0)printf(" 无 ");printf("n");void findoutdegree(AlGraph *CGraph,int outdegree)/ 找出度数,即找出每一门课程的先修课数int i;PreCourse *p;for(i=0;i<CGraph->num;i+)outdegreei=0;p=CGraph->coursesi.firstnext;while(p)outdegreei+;p=p->pre; void judgingcricle(AlGraph *CGraph,queue *q2

16、)/ 判断是否有环int outdegreeMAXNODE;/ 出度int i,m,j,pd=0;float xf=0;PreCourse *p;queue q;queueinit(&q);/ 队初始化findoutdegree(CGraph,outdegree);/ 找出度for(i=0;i<CGraph->num;i+)if(outdegreei=0&&(xf+CGraph->coursesi.course.xf)<=CGraph->xfsx)/ 出 度 为零的,并且学分还没达到学分上限的入队,即没有先修课的课程入队queuein(&a

17、mp;q,i);outdegreei-;xf+=CGraph->coursesi.course.xf;m=0;xf=0;queuein(&q,-1);jxq+;while(1) i=queueout(&q);queuein(q2,i);if(i!=-1)m+;for(j=0;j<CGraph->num;j+) if(j!=i) if(outdegreej=0&&(xf+CGraph->coursesj.course.xf)<=CGraph->xfsx)/ 将 之 前 因 学分上限受制的出度为零的入队,即没有先修课的课程入队qu

18、euein(&q,j);outdegreej-;xf+=CGraph->coursesj.course.xf;elsep=CGraph->coursesj.firstnext;while(p) if(p->adjvex=i) outdegreej-;if(outdegreej=0&&(xf+CGraph->coursesi.course.xf)<=CGraph->xfsx)/ 出 度 为 零 的入队queuein(&q,j);outdegreej-;pd=1;xf+=CGraph->coursesi.course.xf;

19、 p=p->pre; else if(pd)pd=0;queuein(&q,-1);jxq+;xf=0;else break;if(jxq>CGraph->xqs)printf("n 错 误 报 告 : n 在 %d 学 期 内 是 无 法 修 完 这 些 课 程 n",CGraph->xqs);exit(0);if(m<CGraph->num)printf("n 错误报告:n");for(i=0;i<CGraph->num;i+)if(outdegreei>0)printf("%s

20、 ",CGraph->coursesi.course.id);printf(" 存在循环,因此课程安排不了n");IsCricle=1;void layout1(AlGraph *CGraph,queue *q)/printf("n 学生在各学期中的学习负担尽量均匀int i,j,xq=1,cxq=CGraph->xqs-jxq,ck20;float xf,m=CGraph->num/CGraph->xqs*1.0f;/mqueue q1=*q;/while(!queueempty(&q1)for(i=0;i<20;

21、i+)cki=-1;for(i=0;i<m+1;i+)j=queueout(&q1);if(j=-1)break;cki=j;if(ck0!=-1)编排 1/:nn");是每学期要学的课程数printf("n 第 %d 学期学:",xq+);xf=0;i=0;doj=cki;printf("%s",CGraph->coursesj.course.id);i+;xf+=CGraph->coursesj.course.xf; while(cki!=-1); printf(" 获得学分是%.2fn",xf

22、);void layout2(AlGraph *CGraph,queue *q)/ 编排 2printf("n 课程尽可能地集中在前几个学期中:nn");int i,j,xq=1;float xf;printf("n 第 %d 学期学:",xq+);xf=0;queue q1=*q;/for(i=0;i<CGraph->num;)j=queueout(&q1);if(j!=-1)printf(" %s ",CGraph->coursesj.course.id);i+;xf+=CGraph->coursesj.course.xf;else printf(" 获得学分是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论