Dec 24

学生排课系统 不指定

piikee , 23:33 , 计算机相关 » 我的开发 , 评论(0) , 引用(0) , 阅读(770) , 本站原创 | |
系统实现的功能
用户输入一个数字(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  {  
  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  {
    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);
}



版权所有,请勿用于商业用途!
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]