教学计划编制文档格式.docx
《教学计划编制文档格式.docx》由会员分享,可在线阅读,更多相关《教学计划编制文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
计算机原理
C11
C7
编译原理
C5,C3
C8
操作系统
C3,C6
C9
高等数学
C10
线性代数
普通物理
C12
数值分析
C9,C10,C1
实现提示
可设学期总数不超过12,课程总数不超过100。
如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。
应建立内部课程序号与课程号之间的对应关系。
#include<
string.h>
stdio.h>
stdlib.h>
#definenull0
#defineMAXNODE64//最大课程个数
typedefstruct
{
charc[3];
}cid;
//课程号
typedefstructCourse
{
cidid[3];
charname[30];
//课程名
floatxf;
//学分
}Course;
////////////////////////////////////////////////课程
typedefstructPreCourse
{
intadjvex;
//课程在数组中的下标
structPreCourse*pre;
//指向下一先修的课程节点
}PreCourse;
/////////////////////////////////////////////////先修的课程节点
typedefstruct
Coursecourse;
//课程
PreCourse*firstnext;
//指向第一个先修的课程节点
}CourseNode;
////////////////////////////////////////////////////////////课程节点
CourseNodecourses[MAXNODE];
//邻接表
intxqs;
//学期总数
intnum;
//课程的数目
floatxfsx;
/////学分上限
}AlGraph;
///////////////////////////////////////////////////////////////课程图
intdata[MAXNODE];
//队中元素
intf,r;
//队头r队尾f
}queue;
intIsCricle=0;
//判断是否环1表示是0表示不是
intjxq;
//用于计算学期的
/////////////////////////////////////////////////////////////////////////
voidqueueinit(queue*q)///////////////队初始化
q->
f=q->
r=0;
}
voidqueuein(queue*q,intx)//入队
if((q->
r+1)%MAXNODE==q->
f)
printf("
队满\n"
);
exit(0);
}
r=(q->
r+1)%MAXNODE;
data[q->
r]=x;
intqueueout(queue*q)//出队
if(q->
f==q->
r)
队空\n"
f=(q->
f+1)%MAXNODE;
returnq->
f];
intqueueempty(queue*q)///////////////队判空1为空
return1;
elsereturn0;
voidcreatpre(AlGraph*CGraph)///////////////建立先修关系
system("
cls"
//用来清屏
intchoice;
fflush(stdin);
/////////////////////////////////////////////清空输入流
inti,j,n;
//////临时变量
PreCourse*p,*q;
//////临时变
printf("
\n建立先修关系:
\n"
\n请输入每一门课程号的编号:
"
for(i=0;
i<
CGraph->
num;
i++)
if(i%4==0)printf("
%d)"
i+1);
%s\t"
CGraph->
courses[i].course.id);
\n请根据以上的编号,输入每一门课程的先修课程(输入0表示没有或结束):
%s的先修课程:
scanf("
%d"
&
j);
n=0;
while(j)
{
while(j<
1||j>
num||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->
courses[i].firstnext=p;
q=CGraph->
courses[i].firstnext;
n++;
else
{
q->
pre=p;
q=p;
scanf("
}
1)重新建立先修关系2)确定\n"
请选择:
scanf("
choice);
if(choice==1)
creatpre(CGraph);
jxq=0;
AlGraphinput()//////////////////////////////////输入并建立课程图
AlGraphCGraph;
intxqzs=0,kczs=0;
////////////////学期总数:
xqzs专业共开设课程数:
kczs
inti,j;
floatxf,xfsx=0;
//////临时变量xf学分上限:
xfsx
教学计划编制\n\n"
输入参数:
1、学期总数:
xqzs);
CGraph.xqs=xqzs;
2、专业共开设课程数:
kczs);
CGraph.num=kczs;
///////////////////////////////////课程数
3、学分上限(每个学期的学分上限都一样):
%f"
xfsx);
CGraph.xfsx=xfsx;
4、每门课的课程号(固定占3位的字母数字串)、课程名、学分:
kczs;
j=0;
fflush(stdin);
课程号:
%s"
CGraph.courses[i].course.id);
课程名:
CGraph.courses[i].course.name);
学分:
xf);
while(xf>
xfsx||xf<
=0)
printf("
本课程学分大于学期学分上限或小于等于零,请重新输入学分:
fflush(stdin);
CGraph.courses[i].course.xf=xf;
CGraph.courses[i].firstnext=null;
creatpre(&
CGraph);
///////////////建立先修关系
returnCGraph;
voidoutput(AlGraphCGraph)///////////////输出先修关系
PreCourse*p;
\n\n"
课程编号\t课程名称\t\t先决条件\n"
CGraph.num;
%s\t\t%s\t\t"
CGraph.courses[i].course.id,CGraph.courses[i].course.name);
p=CGraph.courses[i].firstnext;
while(p)
n=p->
adjvex;
%s"
CGraph.courses[n].course.id);
p=p->
pre;
j++;
if(j==0)printf("
无"
voidfindoutdegree(AlGraph*CGraph,intoutdegree[])/////////找出度数,即找出每一门课程的先修课数
inti;
outdegree[i]=0;
p=CGraph->
outdegree[i]++;
voidjudgingcricle(AlGraph*CGraph,queue*q2)////////判断是否有环
intoutdegree[MAXNODE];
/////////出度
inti,m,j,pd=0;
floatxf=0;
queueq;
queueinit(&
q);
///////////////队初始化
findoutdegree(CGraph,outdegree);
/////////找出度
if(outdegree[i]==0&
&
(xf+CGraph->
courses[i].course.xf)<
=CGraph->
xfsx)/////////出度为零的,并且学分还没达到学分上限的入队,即没有先修课的课程入队
{queuein(&
q,i);
outdegree[i]--;
xf+=CGraph->
courses[i].course.xf;
m=0;
xf=0;
queuein(&
q,-1);
jxq++;
while
(1)
i=queueout(&
queuein(q2,i);
if(i!
=-1)
m++;
for(j=0;
j<
j++)
if(j!
=i)
if(outdegree[j]==0&
courses[j].course.xf)<
xfsx)/////////将之前因学分上限受制的出度为零的入队,即没有先修课的课程入队
{queuein(&
q,j);
outdegree[j]--;
courses[j].course.xf;
else{
p=CGraph->
courses[j].firstnext;
while(p)
{
if(p->
adjvex==i)
{
outdegree[j]--;
if(outdegree[j]==0&
xfsx)/////////出度为零的入队
{queuein(&
pd=1;
}
p=p->
}
}
else
{if(pd){pd=0;
}elsebreak;
if(jxq>
xqs){printf("
\n错误报告:
\n在%d学期内是无法修完这些课程\n"
xqs);
exit(0);
if(m<
num)
for(i=0;
if(outdegree[i]>
0)
存在循环,因此课程安排不了\n"
IsCricle=1;
voidlayout1(AlGraph*CGraph,queue*q)////////////////编排1/////
\n学生在各学期中的学习负担尽量均匀:
inti,j,xq=1,cxq=CGraph->
xqs-jxq,ck[20];
floatxf,m=CGraph->
num/CGraph->
xqs*1.0f;
//m是每学期要学的课程数
queueq1=*q;
////
while(!
queueempty(&
q1))
20;
i++)ck[i]=-1;
m+1;
j=queueout(&
q1);
if(j==-1)break;
ck[i]=j;
if(ck[0]!
\n第%d学期学:
xq++);
xf=0;
i=0;
do{
j=ck[i];
%s"
courses[j].course.id);
i++;
}while(ck[i]!
=-1);
获得学分是%.2f\n"
xf);
voidlayout2(AlGraph*CGraph,queue*q)////////////////编排2
\n课程尽可能地集中在前几个学期中:
inti,j,xq=1;
floatxf;
)
j=queueout(&
if(j!
{printf("
else{printf("
获得学分是%.2f\n第%d学期学:
xf,xq++);
while(xq<
无\t"
voidmain()
{
//用来存放已编排好的课程
//课程图
CGraph=input();
//输入并建立课程图
output(CGraph);
///////////////输出先修关系
judgingcricle(&
CGraph,&
////////判断是否有环
if(!
IsCricle)
请选择编排策略:
1.使学生在各学期中的学习负担尽量均匀;
2.使课程尽可能地集中在前几个学期中。
//scanf("
//fflush(stdin);
//if(choice==1)
layout1(&
////////////////编排1
//else
layout2(&
////////////////编排2