1、计算机原理C11C7编译原理C5,C3C8操作系统C3,C6C9高等数学C10线性代数普通物理C12数值分析C9,C10,C1实现提示可设学期总数不超过12,课程总数不超过100。如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。应建立内部课程序号与课程号之间的对应关系。#include stdio.hstdlib.h#define null 0#define MAXNODE 64 /最大课程个数typedef struct char c3; cid; /课程号typedef struct Course cid id3; char name30; /课程名 float xf; /
2、学分 Course; /课程typedef struct PreCourse int adjvex; /课程在数组中的下标 struct PreCourse *pre; /指向下一先修的课程节点PreCourse;/先修的课程节点typedef struct Course course;/课程 PreCourse *firstnext; /指向第一个先修的课程节点CourseNode;/课程节点 CourseNode coursesMAXNODE; /邻接表 int xqs;/学期总数 int num; /课程的数目 float xfsx;/学分上限AlGraph;/课程图 int dataM
3、AXNODE;/队中元素 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); r=(q-r+1)%MAXNODE;dataq-r=x;int queueout(queue *q)/出队 if(q-f=q-r)队空nf=(q-f+1)%MAXNODE; return q-f;i
4、nt queueempty(queue *q)/队判空 1为空 return 1; else return 0;void creatpre(AlGraph *CGraph)/建立先修关系 system(cls/用来清屏 int choice; fflush(stdin);/清空输入流 int i,j,n;/临时变量 PreCourse *p,*q;/临时变 printf(n建立先修关系:nn请输入每一门课程号的编号: for(i=0;inum;i+) if(i%4=0)printf(%d) ,i+1);%st,CGraph-coursesi.course.id);n请根据以上的编号,输入每一门
5、课程的先修课程(输入0 表示没有或结束):%s的先修课程: scanf(%d,&j); n=0; while(j) while(jnum|j=i+1) if(j=i+1) printf(先修课程号不能是本课程号 else 输入的先修课程号不在该专业开设的课程序列中 fflush(stdin); printf(重新输入: scanf( p=(PreCourse *)malloc(sizeof(PreCourse); p-adjvex=j-1;pre=null; if(n=0) CGraph-coursesi.firstnext=p; q=CGraph-coursesi.firstnext; n+
6、; else q-pre=p; q=p; scanf( 1)重新建立先修关系 2)确定n请选择: scanf(choice); 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教学计划编制nn输入参数:1、学期总数:xqzs); CGraph.xqs=xqzs;2、专业共开设课程数:kczs); CGraph.num=k
7、czs;/课程数3、学分上限(每个学期的学分上限都一样):%fxfsx); CGraph.xfsx=xfsx;4、每门课的课程号(固定占3位的字母数字串)、课程名、学分:kczs; j=0; fflush(stdin);课程号:%s,CGraph.coursesi.course.id);课程名:,CGraph.coursesi.course.name);学分:xf); while(xfxfsx|xfadjvex;%s ,CGraph.coursesn.course.id); p=p-pre; j+; if(j=0)printf(无void findoutdegree(AlGraph *CGra
8、ph,int outdegree)/找出度数,即找出每一门课程的先修课数 int i; outdegreei=0; p=CGraph- outdegreei+;void judgingcricle(AlGraph *CGraph,queue *q2)/判断是否有环 int outdegreeMAXNODE;/出度 int i,m,j,pd=0; float xf=0; queue q; queueinit(&q);/队初始化 findoutdegree(CGraph,outdegree);/找出度 if(outdegreei=0&(xf+CGraph-coursesi.course.xf)xf
9、sx)/出度为零的,并且学分还没达到学分上限的入队,即没有先修课的课程入队 queuein(&q,i);outdegreei-;xf+=CGraph-coursesi.course.xf; m=0;xf=0;queuein(&q,-1);jxq+; while(1) i=queueout(& queuein(q2,i); if(i!=-1) m+; for(j=0;jj+) if(j!=i) if(outdegreej=0&coursesj.course.xf)coursesj.firstnext; while(p) if(p-adjvex=i) outdegreej-; if(outdegr
10、eej=0&xfsx)/出度为零的入队 queuein(&pd=1; p=p- else if(pd)pd=0;else break; if(jxqxqs)printf(n错误报告:n在%d学期内是无法修完这些课程nxqs);exit(0); if(m0)存在循环,因此课程安排不了n IsCricle=1;void layout1(AlGraph *CGraph,queue *q)/编排1/n学生在各学期中的学习负担尽量均匀: int i,j,xq=1,cxq=CGraph-xqs-jxq,ck20; float xf,m=CGraph-num/CGraph-xqs*1.0f;/m是每学期要学
11、的课程数 queue q1=*q;/ while(!queueempty(&q1)20;i+)cki=-1;m+1; j=queueout(&q1); if(j=-1)break; cki=j; if(ck0!n第%d学期学:,xq+); xf=0;i=0; do j=cki; %s coursesj.course.id);i+; while(cki!=-1);获得学分是%.2fn,xf);void layout2(AlGraph *CGraph,queue *q)/编排2n课程尽可能地集中在前几个学期中: int i,j,xq=1;float xf;) j=queueout(& if(j!
12、printf( else printf(获得学分是%.2fn第%d学期学:,xf,xq+); while(xq无tvoid main() /用来存放已编排好的课程/课程图 CGraph=input();/输入并建立课程图 output(CGraph);/输出先修关系 judgingcricle(&CGraph,&/判断是否有环 if(!IsCricle)请选择编排策略:1.使学生在各学期中的学习负担尽量均匀;2.使课程尽可能地集中在前几个学期中。 / scanf( / fflush(stdin); / if(choice=1) layout1(&/编排1 / else layout2(&/编排2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1