C语言学生选课系统

来源:互联网 发布:yum 缓存目录 编辑:程序博客网 时间:2024/04/29 19:50

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

//课程结构体
typedef  struct cou
{
    char name[40];//课程名
 float sco;//成绩
 struct cou* next;
}cou;


//学生结构体
typedef  struct stu
{
 int    num;//学号
 char   name[40];//姓名
 float  ave;//平均分
 int    cnum;//课程数目
    cou    *chead;//课程结构体的头指针
    cou    *ctail;//课程结构体的尾指针
 struct stu *next;
}stu;


//全局指针
stu *head=NULL;//指向学生链表的第一个结构体
stu *tail=NULL;//指向学生链表的最后一个

/***************************************************************************
功能:用于加载文件内容到结构体链表:  void  ini();
***************************************************************************/
void  ini()
{
FILE  *fp;
fp=fopen("stu.txt","r");

if (fp==NULL)
{
 printf("/n提示:学生文件不存在!");
 return ;
}

int n=0;
fread(&n,sizeof(int),1,fp);

for (int i=0; i<n; i++)
{
 stu *p=(stu*)malloc(sizeof(stu));
    fread(p,sizeof(stu),1,fp);
 p->next=NULL;
 p->chead=NULL;
 p->ctail=NULL;
// printf("/n初始化学生%s信息成功!",p->name);
   //-----------------------
    for (int j=0;j<p->cnum;j++)
    {
      cou *q=(cou*)malloc(sizeof(cou));
      fread(q,sizeof(cou),1,fp);
   q->next=NULL;
      if (p->chead==NULL)
      {
    p->chead=q;
    p->ctail=q;
      }
   else
   {
    p->ctail->next=q;
    p->ctail=q;
   }
     
//   printf("/n        |--->初始化学生%s的%s课程信息成功!",p->name,q->name);
    }
   //--------------------------
    
 if (head==NULL)
 {
  head=p;
  tail=p;
 }
 else
 {
  tail->next=p;
  tail=p;
 }
   

}
fclose(fp);

}
/******************************************************************************
功能:增加一个学生到学生结构体链表 :  void  addstu()
******************************************************************************/
void  addstu()
{
printf("/n/n/n[ 增 加 学 生 ]     ");
printf("/n/n请输入学号(整数):    ");

loop:

 int num=0;
 scanf("%d",&num);

//---------------------
//检查学号是否重复
stu *h=head;
while (h)
{
 if (h->num==num)
 {
        printf("/n提示:学号已存在!/n请重新输入学号:    ");
  goto loop;
 }
 h=h->next;
}
//---------------------
 stu *p=(stu*)malloc(sizeof(stu));
 p->ave=0.0;
 p->cnum=0;
 p->chead=NULL;
 p->ctail=NULL;
 p->next=NULL;
 p->num=num;
 printf("/n请输入学生姓名:    ");
 scanf("%s",p->name);
 if (head==NULL)
 {
  head=p;
  tail=p;
 }
 else
 {
  tail->next=p;
  tail=p;
 }
  printf("/n增加学生信息成功!");
}

/******************************************************************************
功能: 从学生链表中删除一个学生结构体  :void   delstu()
******************************************************************************/
void   delstu()
{
 printf("/n/n/n[ 删 除 学 生 ]     ");

   if (head==NULL)
   {
 printf("/n/n提示:学生信息为空! ");
 return ;
   }
  

    printf("/n/n请输入要删除学号:    ");
    int num=0;
 scanf("%d",&num);
 bool y=1;
    stu *tem=NULL;

  if (head->num==num)
 {
  y=0;
      tem=head;
        head=head->next;
 }
 else
 { 
  stu *p=head;
        while (p->next)
  {
      if (p->next->num==num)
   {
   y=0;
   tem=p->next;
   p->next=p->next->next;
   break;
   }
      p=p->next;
  }
 }

 
 if (y)
   {
  printf("/n/n错误:删除学生的学号不存在!");
   }
 else
 {
 
   printf("/n/n删除学号%d的学生成功 !",tem->num);    
       //---------------------
        cou *q=tem->chead;
  cou *qq=NULL;
  while (q)
  {
   qq=q->next;
        printf("/n         |--->删除课程%s成功 !",q->name);
   delete  q;
   q=qq;
  }
       //---------------------
      delete tem; 
 }

 
}

/******************************************************************************
功能: 从一个学生结构体中删除一个或者所有课程  :void   delcou()
******************************************************************************/
void   delcou()
{
 printf("/n/n/n[ 删 除 课 程 ]     ");

   if (head==NULL)
   {
 printf("/n/n提示:学生信息为空! ");
 return ;
   }
  

    printf("/n/n请输入要删除学号:    ");
    int num=0;
 scanf("%d",&num);
 bool y=1;
    stu *tem=NULL;

   stu *p=head;
   while (p)
   {//1----------
 
      if (p->num==num)
   {//2----------
         

    y=0;
             if (p->chead==NULL)
    {
                   printf("/n错误:该学生并没有选修课程!");
    }
    else//3-------------
    {

                   printf("/n请输入删除的课程名(全部删除请输入all): "); 
       char a[40];
       scanf("%s",a);

       if (strcmp(a,"all")==0)//如果是删除所有
       {
        cou *q=p->chead,*t;
        while (q)
        {
         t=q->next;
         printf("/n删除学号%d删除课程%s成功 !",p->num,q->name);
         delete  q;
         q=t;
        }
        p->chead=NULL;
        p->ctail=NULL;
        p->cnum=0;//课程数为0
       }
       else//删除单个课程
       { //4----------------------              
        bool b=0;
        cou *q=p->chead,*t;
               

        if (strcmp(q->name,a)==0)//如果第一个就是
        {
         b=1;
                        t=q;
      p->chead=p->chead->next;
        }
        else
        {
      
        while (q->next)
        {
         if (strcmp(q->next->name,a)==0)
         {
          b=1;
          t=q->next;
          if (t->next==NULL)//如果是最后一个
          {
           p->ctail=q;//改变尾指针
          }
          q->next=q->next->next;
          break;
         }
                              q=q->next;
        }
       
       
        }
                    


        if (b)
        {
                            printf("/n删除学号%d的课程%s成功 !",p->num,t->name);
             --(p->cnum);//课程数减1
            delete  t;      
        }
        else
        {
                              printf("/n错误,您没有选修该课程!");
        }
    

         
       }//4-------   

 

 

    } //3------
   

   break;


   }//2-----------
   
      p=p->next;
 
 }//1-------

 
 if (y)
   {
  printf("/n/n错误:删除学生的学号不存在!");
   }
 


}
/******************************************************************************
功能: 修改学生结构体的信息  :void   modifystu()
******************************************************************************/
void   modifystu()
{
 printf("/n/n/n[ 修 改 学 生 ]     ");

   if (head==NULL)
   {
 printf("/n/n提示:学生信息为空! ");
 return ;
   }
  

    printf("/n/n请输入要修改的学号:    ");
    int num=0;
 scanf("%d",&num);
 bool y=1;
    stu *tem=NULL;

   stu *p=head;
   while (p)
   {
       if (p->num==num)
    {
  y=0;
     printf("/n|-------------------------------------------------------------------|");
  printf("/n 学号:%-4d   姓名:%-8s  平均分:%5.2f  课程数:%4d",p->num,p->name,p->ave,p->cnum);
     printf("/n|-------------------------------------------------------------------|");
  printf("/n请输入新姓名: ");
  scanf("%s",p->name);
     printf("/n修改成功,新的学生信息如下:");
  printf("/n|-------------------------------------------------------------------|");
  printf("/n 学号:%-4d   姓名:%-8s  平均分:%5.2f  课程数:%4d",p->num,p->name,p->ave,p->cnum);
     printf("/n|-------------------------------------------------------------------|");
  break;
    }
  
    p=p->next;
   }
 
 if (y)
   {
  printf("/n/n错误:修改学生的学号不存在!");
   }
 
}


/******************************************************************************
功能: 从一个学生结构体中修改课程信息  :void   modifycou()
******************************************************************************/
void   modifycou()
{
 printf("/n/n/n[ 修 改 课 程 ]     ");

   if (head==NULL)
   {
 printf("/n/n提示:学生信息为空! ");
 return ;
   }
  

    printf("/n/n请输入要修改的学号:    ");
    int num=0;
 scanf("%d",&num);
 bool y=1;
    stu *tem=NULL;

   stu *p=head;
   while (p)
   {//1----------
 
      if (p->num==num)
   {//2----------
         

    y=0;
             if (p->chead==NULL)
    {
                   printf("/n错误:该学生并没有选修课程!");
    }
    else//3-------------
    {

                      printf("/n请输入要修改的课程名: "); 
          char a[40];
          scanf("%s",a);
             
        bool b=1;
        cou *q=p->chead;
               
                        while (q)
        {
         if (strcmp(q->name,a)==0)
         {
          b=0;
              printf("/n|--------------------------------------------|"); 
              printf("/n   课程名:%5s   成绩: %5.2f ",q->name,q->sco);
              printf("/n|--------------------------------------------|");
        printf("/n请输入新的课程名:");
        scanf("%s",q->name);
        printf("/n请输入新的成绩:");
        scanf("%f",&q->sco);


           printf("/n修改成功,新的课程信息如下:");
        printf("/n|--------------------------------------------|"); 
        printf("/n   课程名:%5s   成绩: %5.2f ",q->name,q->sco);
              printf("/n|--------------------------------------------|");
          break;
         }
                              q=q->next;
        }
       
   
                       if (b)
        {
                              printf("/n错误,您没有选修该课程!");
        }
           
    } //3------
   

   break;


   }//2-----------
   
      p=p->next;
 
 }//1-------

 
 if (y)
   {
  printf("/n/n错误:修改学生的学号不存在!");
   }
 


}

/******************************************************************************
功能: 为一个学生结构体录入课程成绩  :void   setsco()
******************************************************************************/
void   setsco()
{
 printf("/n/n/n[ 录 入 成  绩 ]     ");

   if (head==NULL)
   {
 printf("/n/n提示:学生信息为空! ");
 return ;
   }
  

    printf("/n/n请输入要录入成绩的学生的学号:    ");
    int num=0;
 scanf("%d",&num);
 bool y=1;
    stu *tem=NULL;

   stu *p=head;

   while (p)
   {//1----------
 
      if (p->num==num)
   {//2----------
         
          y=0;
             if (p->chead==NULL && p->cnum==0)
    {
                   printf("/n错误:该学生并没有选修课程!");
    }
    else//3-------------
    {                     
                      printf("/n该学生选修了如下%d门课程:",p->cnum);

         cou *q=p->chead ;
      int n=0;
      float sum=0;
                        while (q)
        {
         
              printf("/n|--------------------------------------------|"); 
              printf("/n  [%d]课程名:%5s   成绩: %5.2f ",++n,q->name,q->sco);
              printf("/n|--------------------------------------------|");
        printf("/n请录入成绩:");
        scanf("%f",&q->sco); 
                          printf("/n课程%s录入成绩%.2f成功!",q->name,q->sco);
        sum+=q->sco;
                              q=q->next;
        }
                       
      p->ave=sum/n;
                      
    } //3------
   

   break;


   }//2-----------
   
      p=p->next;
 
 }//1-------

 
 if (y)
   {
  printf("/n/n错误:学生的学号不存在!");
   }
 


}

 

/******************************************************************************
功能:加入N个课程结构体到一个学生结构体中:  void  addcou()
******************************************************************************/
void  addcou()
{
printf("/n/n/n[ 学 生 选 课 ]     ");
printf("/n/n请输入你的学号:   ");
int num=0;
bool  y=1;
scanf("%d",&num);

stu *p=head;
while (p)
{
 if (p->num==num)
 {
  y=0;
    printf("/n|------------------------------------------------------|");
 printf("/n 学号:%5d   姓名:%8s   已选课程数:%4d",p->num,p->name,p->cnum);
    printf("/n|------------------------------------------------------|");
    if (p->cnum>=10)
    {
       printf("/n您已经修满了10门课程,请不要选课!  ");
       return ;
    }
    printf("/n请输入选修的课程的数目(每个学生最多选10门课程):  ");
   loop:
 int n=0;
 scanf("%d",&n);
 if (n<0 || p->cnum+n>10)
 {
   printf("/n错误:请重新输入课程的数目:  ");
  goto loop;
 }

    for (int j=0;j<n;j++)
    {
       cou *q=(cou*)malloc(sizeof(cou));
    q->next=0;
    q->sco=0;
    printf("/n请输入选修第%d门课程名:  ",j+1);
    scanf("%s",q->name);
 
    if (p->chead==NULL)
    {
     p->chead=q;
     p->ctail=q;
    }
    else
    {
     p->ctail->next=q;
     p->ctail=q;
    }
    }


     
   p->cnum+=n;
   printf("/n选修%d门课程成功! ",p->cnum);
      break;
 }
 p=p->next;
}
     if (y)
     {
   printf("/n你输入的学号不存在,选课失败 !");
     }
}

 

/******************************************************************************
功能:显示学生信息及课程结构体  :void   show()
******************************************************************************/

void   show()
{
   if (head==NULL)
   {
    printf("/n提示:学生信息为空!");
    return ;
   }
   stu *p=head;
   printf("/n/n/n                   学生选课情况信息总表                      ");
   printf("/n|---------------------------------------------------------------------|");
   while (p)
   {
    printf("/n 学号:%-4d   姓名:%-8s  平均分:%5.2f  课程数:%4d",p->num,p->name,p->ave,p->cnum);
    printf("/n|---------------------------------------------------------------------|");
     //------------------------------
    
     cou *q=p->chead;
     int n=0;
     while (q)
     {
    printf("/n                         |-->课程名%d:%5s   成绩: %5.2f ",++n,q->name,q->sco);
    printf("/n                         |--------------------------------------------|");
     q=q->next;
  
     }
  //------------------------------
    printf("/n|---------------------------------------------------------------------|");
    p=p->next;
   }
 

}


/******************************************************************************
功能:排序显示学生信息  :void   order()
******************************************************************************/

void   order()
{
   if (head==NULL)
   {
    printf("/n提示:学生信息为空!");
    return ;
   }

 //计算出结构体个数
 stu *p=head;
 int n=0;
 while (p)
 {
  n++;
  p=p->next;
 }

 

 stu **pp=new stu *[n];
 p=head;
 for (int i=0;i<n;i++)
 {
  pp[i]=p;
  p=p->next;
 }


 //下面用冒泡法进行排序
 for (i=0;i<n-1;i++)
 for (int j=0;j<n-1-i;j++)
{
if (pp[j]->ave<pp[j+1]->ave)
{
stu *tem;
tem=pp[j] ;
pp[j]= pp[j+1];
pp[j+1]=tem;
}

}

   printf("/n/n                      学生成绩排名一览表");
   printf("/n|---------------------------------------------------------------------|");
for (i=0;i<n;i++)
{
 printf("/n [%d]平均分:%5.2f  学号:%-4d   姓名:%-8s   课程数:%4d",i+1,pp[i]->ave,pp[i]->num,pp[i]->name,pp[i]->cnum);
    printf("/n|---------------------------------------------------------------------|");
}

}


/******************************************************************************
功能:查找学生信息及课程结构体  :void   look()
******************************************************************************/

void   look()
{
   if (head==NULL)
   {
    printf("/n提示:学生信息为空!");
    return ;
   }

   printf("/n/n请输入要查找的学号:    ");
   int num=0;
   scanf("%d",&num);
   bool y=1;
  
   stu *p=head;
   while (p)
   {
   if (p->num==num)
   {
    y=0;
    printf("/n查找成功,信息如下:");
    printf("/n|---------------------------------------------------------------------|");
    printf("/n 学号:%-4d   姓名:%-8s  平均分:%5.2f  课程数:%4d",p->num,p->name,p->ave,p->cnum);
    printf("/n|---------------------------------------------------------------------|");
    //------------------------------
   
    cou *q=p->chead;
    int n=0;
    while (q)
    {
     printf("/n                         |-->课程名%d:%5s   成绩: %5.2f ",++n,q->name,q->sco);
     printf("/n                         |--------------------------------------------|");
     q=q->next;
    
    }
  //------------------------------

   }
   p=p->next;   
   }
     
   if (y)
   {
    printf("/n错误:查找学生的学号不存在!");
   }
 
 

}


/******************************************************************************
功能:保存学生信息及课程结构体  :void   save()
******************************************************************************/
void save()
{
 FILE *fp;
 fp=fopen("stu.txt","w");
 stu *p=head;
 int n=0;
 while (p)
 {
  n++;
  p=p->next;
 }
 fwrite(&n,sizeof(n),1,fp);
 
  p=head;
  while(p)
  {
 //printf("/n保存学生%s信息成功!",p->name);
 fwrite(p,sizeof(stu),1,fp);
 
   cou*q=p->chead;
   while (q)
   {
 //   printf("/n           |--->保存课程%s信息成功!",q->name);
    fwrite(q,sizeof(cou),1,fp);
    q=q->next;
   }
   p=p->next;

  }

fclose(fp);
}

/******************************************************************************
功能: 清空所有信息 :void   release()
******************************************************************************/
void   release()
{
 printf("/n/n/n[ 清 空 信  息 ]     ");

   if (head==NULL)
   {
 printf("/n/n提示:文件信息为空! ");
 return ;
   }
  
      stu *p=head;
   stu *pp;
   while (p)
   {
     pp=p->next;
//--------------------------------
  cou *q=p->chead;
  cou *qq=NULL;
  while (q)
  {
   qq=q->next;
   delete  q;
   q=qq;
  }
//--------------------------------
  delete  p;
  p=pp;
   }
head=NULL;
tail=NULL;
printf("/n清空系统成功!");
}

 

/********************************************************************
以下为菜单显示函数
********************************************************************/

void show1()
{
printf("/n/n|-----------------------|");
printf("/n|      主  菜   单      |");
printf("/n|-----------------------|");
printf("/n| A   增  加  学  生    |");
printf("/n|-----------------------|");
printf("/n| B   学  生  选  课    |");
printf("/n|-----------------------|");
printf("/n| C   成  绩  录  入    |");
printf("/n|-----------------------|");
printf("/n| D   信  息  查  询    |");
printf("/n|-----------------------|");
printf("/n| E   系  统  维  护    |");
printf("/n|-----------------------|");
printf("/n| F   退  出  系  统    |");
printf("/n|-----------------------|");
}


void show2()
{
 printf("/n/n|---------------------|");
 printf("/n|       查询菜单      |");
 printf("/n|---------------------|");
 printf("/n| A    所有学生信息   |");
 printf("/n|---------------------|");
 printf("/n| B    单个学生信息   |");
 printf("/n|---------------------|");
 printf("/n| C    成绩排名信息   |");
 printf("/n|---------------------|");
 printf("/n| D    退  出  菜 单  |");
 printf("/n|---------------------|");
 
}

 

void show3()
{
 printf("/n/n|---------------------|");
 printf("/n|       维护菜单      |");
 printf("/n|---------------------|");
 printf("/n| A    修改学生信息   |");
 printf("/n|---------------------|");
 printf("/n| B    修改课程信息   |");
 printf("/n|---------------------|");
 printf("/n| C    删除学生信息   |");
 printf("/n|---------------------|");
 printf("/n| D    删除课程信息   |");
 printf("/n|---------------------|");
 printf("/n| E    清  空  系 统  |");
 printf("/n|---------------------|");
 printf("/n| F    退  出  菜 单  |");
 printf("/n|---------------------|");
 
}

 

void  main(int argc, char *argv[])
{
  ini(); 
printf("/n   欢迎进入学生选课系统!!!");

 char c1;
 do
 {
  show1();
  c1=getch();
  putchar(c1);

  switch (c1)
  {
  case 'A':
  case 'a':addstu(); break;

  case 'B':
  case 'b':addcou(); break;

  case 'C':
  case 'c':setsco(); break;

 

  case 'D':
  case 'd':
   {

     char c2;
    do
   {  
        show2();
      c2=getch();
   putchar(c2);

    switch (c2)
    {
   
  case 'A':
  case 'a':show(); break;
  
  case 'B':
  case 'b':look(); break;
  
  case 'C':
  case 'c':order(); break;
    }

   } while (c2!='D' &&   c2!='d');

    }
     break;

 


  case 'E':
  case 'e':
   {
 
    char c3;
        do
    {  
     show3();
     c3=getch();
             putchar(c3);
     switch (c3)
     {   
  case 'A':
  case 'a':modifystu(); break;
  
  case 'B':
  case 'b':modifycou(); break;
  
  case 'C':
  case 'c':delstu(); break;

  case 'D':
  case 'd':delcou(); break; 
  
  case 'E':
  case 'e':release(); break;     
     }

    } while (c3!='F' &&   c3!='f');
      
   }
   break;


  default:break;
  }
 
  save();

 } while (c1!='F' && c1!='f');
 
 printf("/n谢谢您的使用!");
 
}

原创粉丝点击