当前位置:首页 > 计算机相关 > 我的开发 > 正文内容

学生排课系统

piikee14年前 (2008-12-24)我的开发271
系统实现的功能
用户输入一个数字(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);
}
版权所有,请勿用于商业用途!

扫描二维码推送至手机访问。

版权声明:本文由萍客小居发布,如需转载请注明出处。

本文链接:https://www.piikee.net/176.html

分享给朋友:

相关文章

U盘禁用小精灵

U盘禁用小精灵

C#.net开发的小工具,使用者电脑必须安装.net平台才可以使用。.net平台下载地址见:.NET Framework 微软官方地址 http://download.microsoft.com/download/3/F/0/3F0A922...

txt文件编码批量转换器

txt文件编码批量转换器

用于批量转换txt文本文档的编码格式。通常我们电脑里的txt文件都是ASNI编码,放到手机,MP3等设备里面,打开看到的都是乱码。所以我们必须先把它们转换为Unicode格式,才能够在手机和MP3上面打开。如果有大量的文件,一个一个打开另存...

windows7网卡MAC地址修改器测试版

1,只适用于windows7系统的网卡MAC地址修改。2,部分windows7下的无线网卡地址无法修改,理论上也可以使用本软件修改。3,修改MAC地址前,请先在开始菜单-运行,输入cmd打开控制台,输入getmac获取原来网卡MAC并记下来...

Discuz论坛批量发贴机

一、 Discuz论坛批量发贴机简介Discuz论坛批量发贴机,采用.net平台开发。该发贴机使用模块化开发,运用了多线程和xml存储技术。适用于通用的Discuz论坛程序的批量发帖。可以设置一个帖子发布到N个论坛,或者N个帖子发布到一个论...

月光宝盒

【基本介绍】"月光宝盒"是一款功能特别简单,容易上手的个人免费记账软件,它不需要用户了解深奥的财务知识,不用培训即会使用。该软件特别为月光一族开发,通过记录每日现金支出,收入的明细账,为个人使用者提供详细的收入支出明细等重要信息,同时软件提...

萍客asp网站自动更新插件

该插件属于SEO类型插件,插件根据日期,每天读取一个内容进行显示,使得网站每天有不同的内容从而促使网站百度快照更新。特别适合单页面的SEO。data和piikee.asp放入网站根目录。要使用插件的asp页面,随便地方加入 <!--...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。