学生排课系统
用户输入一个数字(1~8),代表要在多少个学期内修完所有给出的课程,程序根据“lessonlist.txt”中的课程,对每个学期的课程合理地分配,并输出每个学期的课程表。
所作的工作
根据各个课程必修的前后顺序,用拓扑序方法,得出上课的先后顺序,再分配每个学期要上多少节课,输出每个学期的课程表。
程序源码及注释
#include
#include
#include
#include
/*****定义邻接表的表结点*****/
typedef struct arcnode
{
int adjvex;
struct arcnode *nextarc;
}arcnode;
/*******定义邻接表的头结点*******/
typedef struct vnode
{
int date;
arcnode *firstarc;
}vnode;
/*********定义邻接表***********/
typedef struct
{
int vexnum,arcnum;
vnode vertices[50];
}ljb;
/***********定义堆栈********/
typedef struct
{
int *base;
int *top;
int *next;
int stacksize;
}sqstack;
ljb g;
sqstack s;
int num[50],j;
int pp[30]; /*用来存放从文本文件输入的信息*/
char name[30][30];
int next[50][7]={0};
/*******读科目信息文件的函数********/
void read()
{
arcnode *p,*q;
FILE *fp;
int i;
if((fp=fopen("lessonlist.txt","r"))==NULL) /*打开文件*/
{
printf("无法读取文件!\n");
exit(0);
}
for(i=1;i<21;i++) /*输入课程信息*/
{
fscanf(fp,"%d %s %d %d ",&num[i],name[i],&next[i][1],&next[i][2] );
}
g.arcnum=20;
/*********构造邻接表*********/
for(i=1;i<21;i++)
{
g.vertices[i].date=num[i];
g.vertices[i].firstarc=NULL;
for(j=1;j<6;j++)
{
if(next[i][j]!=0)
{
p=(arcnode *)malloc(sizeof(arcnode)); /*构造邻接表的结点*/
p->adjvex=next[i][j];
p->nextarc=NULL;
if( g.vertices[i].firstarc==NULL)
g.vertices[i].firstarc=p;
else
q->nextarc=p;
q=p;
}
}
}
}
/********堆栈初始化********/
void initstack( )
{
s.base=NULL;
s.base=(int *)malloc(50*sizeof(int));
if(!s.base)
{exit(0);
}
s.top=s.base;
s.stacksize=50;
}
/********定义入栈*****/
void push( int e)
{
if(s.top-s.base==s.stacksize)
{
s.base=(int *)realloc(s.base,100*sizeof(int));
if(!s.base)
exit(0);
s.top=s.base+50;
s.stacksize;
}
s.next=s.top;
while(s.next!=s.base) /*入栈是在底部的,而不是在顶部*/
{
*s.next=*(s.next-1);
s.next--;
}
*(s.next)=e;
s.top++;
}
/*******定义出栈******/
int pop()
{
int e;
if(s.top==s.base)
return -1;
e=*--s.top;
return e;
}
/*******判断是否是空栈*********/
int stackempty( )
{
if(s.base==s.top)
return 1;
else
return 0;
}
/***********找各顶点的入度********/
void finddegree( int indegree[])
{
int i,k;
struct arcnode *p;
for(i=1;i<g.arcnum+1;i++)
{
for(p=g.vertices[i].firstarc;p;p=p->nextarc)
{
k=p->adjvex;
indegree[k]++;
}
}
}
/**********拓扑排序函数*********/
void sort( )
{
int i,k,e,y=1;
struct arcnode *p;
int indegree[50]={0};
finddegree(indegree); /*找各顶点的入度*/
initstack( ); //初始化堆栈
for(i=1;i<g.arcnum+1;++i)
{
if(!indegree[i]) /*入度为0的结点入栈*/
{
push(i);
}
}
while(!stackempty())
{
e=pop();
pp[y++]=e; /*按出栈的顺序存在pp[]数组中*/
for(p=g.vertices[e].firstarc;p;p=p->nextarc)
{
k=p->adjvex; /*刚出栈顶点的后一个顶点入度减1*/
if(!(--indegree[k]))
push(k);
}
}
}
/**********结果输出函数*************/
void print(){
int i,d,k=1 ,flag=0;
int numm[20][20]={{0},{0,20},{20,10,0},{20,13,6,0},{20,15,10,5,0},{20,16,12,8,4,0},{20,17,13,9,6,3,0},{20,18,15,12,9,6,3,0},{20,18,15,12,9,6,4,2,0}};/*对8类修法进行分配(分别位用1,2,3,4……学期学完20个科目)*/
Sleep(100); printf("\n\n 【〓〓〓〓〓〓〓数据结构课程设计〓〓〓〓〓〓〓】 \n");
Sleep(200); printf(" 【 】 \n");
Sleep(200); printf(" 【 姓名:piikee 】 \n");
Sleep(200); printf(" 【 】 \n");
Sleep(200); printf(" 【 学号: **************** 】 \n");
Sleep(200); printf(" 【 】 \n");
Sleep(200); printf(" 【 班别:*********** 】 \n");
Sleep(200); printf(" 【 】 \n");
Sleep(200); printf(" 【●●●●●●●●●●●●●●●●●●●●●●】 \n");
do{
flag=0;
printf("\n 总共要多少学期上完这些课(1~8):");
scanf("%d",&d);
if(d<1||d>8)
{
printf(" \n 最多只能8个学期学完这些课.请重新输入.\n\n");
flag=1;
getchar();
}
}while(flag);
Sleep(100); printf("\n\n正");Sleep(100);printf("在");Sleep(100);printf("排");Sleep(100);printf("课");Sleep(100);printf("中");Sleep(100);printf(",");Sleep(100);printf("请");Sleep(100);printf("稍");Sleep(100);printf("侯");Sleep(500);printf(".");Sleep(500);printf(".");Sleep(500);printf(".");
Sleep(100);printf(".");Sleep(100);printf(".");Sleep(100);printf(".");Sleep(100);printf(".");Sleep(100);printf(".");
printf("\n\n∷∷∷∷∷∷∷∷∷∷∷∷∷∷课程安排如下∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷\n");
Sleep(2000);printf("\n 第 %d学期的课程表是:\n\n",k);
printf(" ---------------------------------------------------------------\n");
for(i=20;i>0;i--)
{
printf(" || %-5d || %-20s ||\n",num[pp[i]],name[pp[i]]);
printf(" || || || \n");
if(i==numm[d][k])
{
printf(" ===============================================================\n");
printf("\n\n\n\n\n\n №№№№№№№№№№№№№№№№№№№№№№№№№№№№№\n");
Sleep(2000);printf("\n 第 %d学期的课程表是:\n\n",k+1);
printf(" ---------------------------------------------------------------\n");
printf(" || 科目编号 || 课程名 || \n");
printf(" || || || \n");
printf(" || || || \n");
k++;
}
}
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\n 要退出请输入按任意键然后按enter\n");
}
/*********主函数**************/
void main()
{
int u;
int indegree[50]={30};
read( );
sort();
print();
scanf("%s",&u);
}
版权所有,请勿用于商业用途!