首页 > 用户发贴区 > 编程问题提问区 > 大虾们救救我!C语言课程设计
2006
05-21

大虾们救救我!C语言课程设计

脑子都想破了,还是做不出,大虾们帮帮我!


学生档案及简明信息生成。
 菜单信息为:
                 *  *   *  * * * * * * * * *
                 * *    1.输入数据* * * *
                 * *    2.显示原始数据 *
                 * *    3.制作简明数据 *
                 * *    4.删除男生数据 *

要求如下:
l 建立学生数据结构,l 结构包含有学生学号、姓名l 、性别、英语和数学信息。
l 输入10个学生的信息。
l 建立一简明数据结构,l 结构只包含姓名l 和总分,l 总分=英语+数学。
l 从学生数据结构中删除所有男生的数据,l 如果数组中没有要删除的学生,l 则输出没有男生的信息。

tang704938858.7363425926


大虾们救救我!C语言课程设计》有 1 条评论

  1. zk_safin 说:

    /*—–学生成绩管理系统——–
      
    —————————–*/
    #include <stdio.h>
    #include <process.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>

    #include <conio.h>
    #define ST struct student
    #define NULL 0
    ST
    {
     char sno[10];
     char name[10];
     float gra_chin;
     float gra_math;
     float gra_eng;
     ST * next;
    };

    FILE *fp;
    /*————————————————————————
    函数功能描述:
      从文件中读出数据形成一个链表,并返回链表头指针。
    ————————————————————————*/

    ST *load(char *fname)//load file to reform a link
    {
     ST *head,*tail,*p;
     int count=0;
     static sign=1;

     ST stunode;
     head=(ST *)malloc(sizeof(ST));
        head=tail=NULL;
     fp=fopen(fname,”r”);
     if (fp==NULL)
      return head;
     else

     {while(!feof(fp))
     {
      if (fread(&stunode,sizeof(ST),1,fp))
         {
       p=(ST *)malloc(sizeof(ST));
          strcpy(p->sno,stunode.sno);
       strcpy(p->name,stunode.name);
       p->gra_chin=stunode.gra_chin;
       p->gra_math=stunode.gra_math;
       p->gra_eng=stunode.gra_eng;
       if (head==NULL)
       {head=p;tail=head;}
       else
       {tail->next=p;tail=p;}
       count=count+1;

      }
      
          //if( ferror(fp) ){
    //         perror(“Read error”);
            // break;
         // }

     tail->next=NULL;
     }
     if(sign==1)
     {
      printf(” %d 个记录被加载!”,count);
      sign=0;
     }

     
     return head;
     }

    }

    /*————————————————————————
    函数功能描述:
      判断输入的学号是否合法,是否在文件中已有同号
    ————————————————————————*/

    int legalsno(char *string,char *fname)//tell a sno is legal or not
    {

     ST *p;
        p=load(fname);

     if(strlen(string)!=8)
      return 0;
     while (p!=NULL)    //if the file has the sno,then the sno is not unique
     {
      
      if(strcmp(p->sno,string)==0)
       return 0;
      p=p->next;
     }
     
      return 1;
      
     

    }

    /*————————————————————————
    函数功能描述:
         接收传来的链表的头指针,将此链表写入文件保存,
      并返回头指针。
    ————————————————————————*/
    ST * save(ST *head,char *fname)//save the modified file
    {
     ST *p;
     ST stu;
     if((fp=fopen(fname,”w+”))==NULL)
     {printf(“文件无法写入”);exit(1);}
     else
     {p=head;
      while(p!=NULL)
      {
       strcpy(stu.sno,p->sno);
       strcpy(stu.name,p->name);
       stu.gra_chin=p->gra_chin;
       stu.gra_math=p->gra_math;
       stu.gra_eng=p->gra_eng;
       if(fwrite(&stu,sizeof(ST),1,fp)!=1)
       {
        printf(“文件不能写入数据,评估检查后重新运行.\n”);
                  if( ferror( fp ) )   
           
                      break;
        exit(1);
       }
       p=p->next;
           
         
      }
     

      fclose(fp);
      return head;
     
     }

     

    }

    /*————————————————————————
    函数功能描述:
      将新输入的若干个结点建一个链表,并返回链表头指针。
    ————————————————————————*/

    ST * create(char *fname) 
    {
     char tellsno[10];
     int count=0;
     ST *head,*tail,*p;
     head=tail=NULL;
     printf(“\n\n\t\t\t当输入学号为0时退出输入!”);
     printf(“\n\n\t\t\t请输入学号:”);
     scanf(“%s”,tellsno);
     while(strcmp(tellsno,”0″)!=0)
     {
      p=(ST *)malloc(sizeof(ST));
      
     
      if (legalsno(tellsno,fname)!=1)// if sno is illegal,reinput;
      {
       printf(“\n学号输入非法或累同!请重新输入8位学号:”);
       
                 scanf(“%s”,tellsno);
       continue;
      }
      
      strcpy(p->sno,tellsno);
      printf(“\n\t\t\t请输入姓名:”);
      scanf(“%s”,p->name);
      printf(“\n\t\t\t请输入语文成绩:”);
      scanf(“%f”,&p->gra_chin);
         if(p->gra_chin<0||p->gra_chin>100)
      {
       printf(“\n分数应为1~100间的数,请重新输入语文分数:”);
       scanf(“%f”,&p->gra_chin);
      }  
      printf(“\n\t\t\t请输入数学成绩:”);
      scanf(“%f”,&p->gra_math);
            if(p->gra_math<0||p->gra_math>100)
      {
       printf(“\n分数应为1~100间的数,请重新输入数学分数:”);
       scanf(“%f”,&p->gra_math);
      }  

      
            printf(“\n\t\t\t请输入英语成绩:”);
      scanf(“%f”,&p->gra_eng);
      if(p->gra_eng<0||p->gra_eng>100)
      {
       printf(“\n分数应为1~100间的数,请重新输入英语分数:”);
       scanf(“%f”,&p->gra_eng);
      }  
      p->next=NULL;
      if(head==NULL)
       head=tail=p;
      else
      {
       tail->next=p;
       tail=p;
      }  
      count=count+1;
            printf(“\n\t\t\t请输入学号:”);
         scanf(“%s”,tellsno);
      
     }
     //free(p);
     printf(“\n\n\t\t%d个记录被添加!”,count);
     return head;

    }

    /*————————————————————————
    函数功能描述:
      输入每个学生的成绩,判断学生成绩文件是否存在,
    若存在则将输入的内容追加到文件,若不存在,则新建立,
    若无法建立则退出。
    ————————————————————————*/
    ST *data_input(ST * head,char *fname)
    {
     ST *p,*q;
     system(“cls”);

        p=head;
     while (p)
     {
      if(p->next==NULL)
       break;
      p=p->next;

     }
        if (head==NULL)
      head=create(fname);
     else
            p->next=create(fname);
     q=head;
        head=save(q,fname);
     return head;
     

     
     
    }

    void show_rec(ST *rec)  //show a record in link
    {
     printf(“\n\n\n\t*————————————- ————————*”);
     printf(“\n\t学      号   姓     名  语文成绩  数学成绩  英语成绩  平均成绩”);
     printf(“\n\t%10s”,rec->sno);
     printf(“%10s”,rec->name);
     printf(“%11.1f”,rec->gra_chin);
     printf(“%11.1f”,rec->gra_math);
     printf(“%10.1f”,rec->gra_eng);
     printf(“%10.0f”,(rec->gra_chin+rec->gra_math+rec ->gra_eng)/3);
        printf(“\n\t*———————————————– ————–*”);
     return;
    }

    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中按学号查询满足条件的结点
    ————————————————————————*/
    void sno_query(ST * head,char * fname)  
    {
     char selsno[10];
     
     char ch;
     ST *p;
     system(“cls”);

     
     while(1)
     {
        p=head;
        printf(“\n\n\n\t请输入要查询的学生学号:”);
        scanf(“%s”,selsno);
        while(p!=NULL)
        {
        if(strcmp(p->sno,selsno)!=0)
         p=p->next;
        else
        {   
         show_rec(p);
         return;
        }
        }
        if (p==NULL)
        {
      printf(“\n\n\t\t\t查无此人!是否继续查找?y/n:”);
            getchar();
      scanf(“%c”,&ch);
               if(ch==’n'||ch==’N')
          return;
        }
     }
      

    }

    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中按姓名查询满足条件的结点
    ————————————————————————*/
    void name_query(ST *head,char *fname)
    {char selname[10];
     char ch;
     ST *p,*q;
     system(“cls”);
     int sign=0;
     
     int count=0;
     while(1)
     {
        p=q=head;
        printf(“\n\n\n\t请输入要查询的学生姓名:”);
        scanf(“%s”,selname);
        while(p!=NULL)
        {
        if(strcmp(p->name,selname)==0)
       
        {   q=p;
            sign=1;
         show_rec(q);//if there are two student have the same name,find
         count=count+1;//them all
         p=p->next;
        }
        else
        p=p->next;
      
        }
       
        if (p==NULL)
        {  
         if(sign==1)
         {
          printf(“\n\n\t\t%d个学生被找到!”,count);
          return;
         }

         else
         {
            printf(“\n\n\t\t\t查无此人!是否继续查找?y/n:”);
                   getchar();
            scanf(“%c”,&ch);
                   if(ch==’n'||ch==’N')
             return;
         }
        }
     }

    }
    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中查询平均分最高的学生
    ————————————————————————*/

    void max_aver(ST *head,char *fname)
    {

     int max,ave,count=0;
     
     ST *p,*fore,*q,*behind;
     system(“cls”);
     
     p=head;
     max=(int)(p->gra_chin+p->gra_math+p->gra_eng) /3;//calculate the average of three course
     while(p!=NULL)
     {
      ave=(int)(p->gra_chin+p->gra_math+p->gr a_eng)/3;//calculate the max average
      if(max<ave)
      {
       max=ave;
      
      }  
      p=p->next;

       
        }

     p=head; 
     fore=(ST * )malloc(sizeof(ST));
     fore=behind=NULL;
     while(p!=NULL)//form a new link from the all max averagegraders.
     {
      ave=(int)(p->gra_chin+p->gra_math+p->gr a_eng)/3;
      if (ave==max)
      {
       q=(ST * )malloc(sizeof(ST));
                 strcpy(q->sno,p->sno);
       strcpy(q->name,p->name);
       q->gra_chin=p->gra_chin;
       q->gra_math=p->gra_math;
       q->gra_eng=p->gra_eng;
       fore=q;q->next=behind;behind=fore;
       count=count+1;
       
      }
            p=p->next;

     }
     
        printf(“\n\n\t\t\t平均成绩最大的学生情况如下:”);
     while(fore!=NULL)
     {
            show_rec(fore);
      fore=fore->next;
      if (fore==NULL)
       break;
     }
     printf(“\n\t%d个学生符合条件!”,count);
     free(fore);
     return;
           
     
     

    }
    /*————————————————————————
    函数功能描述:
        接收链表头指针,在链表中按学号查询平均分不及格
      的结点
    ————————————————————————*/
    void not_pass(ST *head,char *fname ) 
    {

        int ave;
     int sign=0,count=0;
     
     ST *p;
     system(“cls”);
     
     p=head;
     printf(“\n\t\t\t不及格学生名单:”);
     //max=(p->gra_chin+p->gra_math+p->gra_eng)/3; //calculate the average of three course
     while(p!=NULL)
     {
      ave=(int)(p->gra_chin+p->gra_math+p->gr a_eng)/3;//calculate the max average
      if(ave<60)
      {
       show_rec(p);
       count=count+1;
       sign=1;
       if (p->next==NULL)
       {
        printf(“\n %d个记录被找到! “,count);
        return;
       }
      
      }  
      p=p->next;

       
        }
     if (sign==1)
     {
      printf(” \n%d个记录被找到! “,count);
      return;
     }
     if (p==NULL)
        printf(“\n\t\t所有同学都及格!”);

    }
    void data_query(ST *head,char *fname)//查询子系统
    {
     int cho_req=1;
     char ch;
     
     do
     {
      system(“cls”);
      
      printf(“\n\n\n\t\t\t\t查询子菜单”);
         printf(“\n\t\t\t===============================”);
      printf(“\n\t\t\t1.按学生学号查询成绩”);
      printf(“\n\t\t\t2.按学生姓名查询成绩”);
      printf(“\n\t\t\t3.查询平均分最高的学生姓名”);
      printf(“\n\t\t\t4.查询平均分不及格的学生姓名”);
      printf(“\n\t\t\t0.返回主菜单”);
      printf(“\n\t\t\t===============================” );
      printf(“\n\t\t\t请选择(0~4):”);
        
      scanf(“%d”,&cho_req);
      switch(cho_req)
      {
      case 1: sno_query(head,fname);break;
      case 2: name_query(head,fname);break;
      case 3: max_aver(head,fname);break;
      case 4: not_pass(head,fname);break;
      case 0: return;break;
      default : printf(“\n\n\t\t\t\t输入错误,请重新输入”);
      }
     
      printf(“\n\n\t\t\t\t是否返回查询菜单:y/n:”);
      getchar();
      scanf(“%c”,&ch);
               if(ch==’n'||ch==’N')
          return;
      

     } while(cho_req);
    }

    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中按学号删除满足条件的结点
    ————————————————————————*/
    void sno_del(ST *head,char *fname)  //按学号删除记录
    {
        char snodel[10];
     char ch;
     //int count=0;
     int delsign=0;   //define a sign for sign,if the link has been del ,then save it
     ST *p,*q;
     system(“cls”);
     while(1)
     {
      p=q=head;
      printf(“\n\t\t请输入要删除的学生学号:”);
      scanf(“%s”,snodel);
      while(p!=NULL)
      {
       if (strcmp(p->sno,snodel)!=0)
       {   q=p;
        p=p->next;
       }

       else
       {
        printf(“\n\n\t\t%s 同学将被删除,确认删除吗?y/n:”,p->name);
              getchar();
              scanf(“%c”,&ch);
                     if(ch==’n'||ch==’N')
        {
         if(delsign==1)
          save(head,fname);
         //printf(” %d个记录被删除! “,count);
         return;
        }
        else
        {
         //count=count+1;
         delsign=1;
         if(head==p)
             head=p->next;
         else
          q->next=p->next;
         free(p);
         break;

        }

                    
       }
                
      }
      if(p==NULL)
         printf(“\n\n\t\t查无此人!”);

         printf(“\n\n\t\t是否继续删除:y/n:”);
            getchar();
         scanf(“%c”,&ch);
            if(ch==’n'||ch==’N')
      {
       save(head,fname);
             //printf(” %d个记录被删除! “,count);
       return;
      }
      
     }

    }
    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中按群名删除满足条件的结点
    ————————————————————————*/

    void name_del(ST *head,char *fname)   //按姓名删除记录
    {
    char namedel[10];
     char ch;
     int delsign=0;   //define a sign for sign,if the link has been del ,then save it
     ST *p,*q,*k;
     system(“cls”);
     while(1)
     {
      p=q=head;
      printf(“\n\t\t请输入要删除的学生姓名:”);
      scanf(“%s”,namedel);
      while(p!=NULL)
      {
       if (strcmp(p->name,namedel)!=0)
       {   q=p;
        p=p->next;
       }

       else
       {
        printf(“\n\n\t学号:%s %s 同学将被删除,确认删除吗?y/n:”,p->sno,p->name);
              getchar();
              scanf(“%c”,&ch);
                     if(ch==’n'||ch==’N')
        {
         if(delsign==1)
         {
          save(head,fname);
             return;
         }
         p=p->next;//deal with the problem that more than one student have the same name
         continue;
         
        }
        else
        {
         delsign=1;
         k=p;
         if(head==p)
             head=p->next;
         else
          q->next=p->next;
        // printf(“错”);
         k=p->next;
         free(p);
         p=k;
        // p=p->next;

         

        }

                    
       }
                
      }
      if(p==NULL&&delsign==0)
         printf(“\n\n\t\t没有你要删除的人!”);

         printf(“\n\n\t\t是否继续删除:y/n:”);
            getchar();
         scanf(“%c”,&ch);
            if(ch==’n'||ch==’N')
      {
       save(head,fname);
       return;
      }
      
     }

    }
    void data_del(ST *head,char *fname)
    {

     
     int choice=1;
     //char ch;
       
     do
     {
      system(“cls”);
      
      printf(“\n\n\n\t\t\t\t\t删除子菜单”);
         printf(“\n\t\t\t=================================”);
      printf(“\n\t\t\t\t1.按学生学号删除记录”);
      printf(“\n\t\t\t\t2.按学生姓名删除记录”);
      
      printf(“\n\t\t\t\t0.返回主菜单”);
      printf(“\n\t\t\t================================ =”);
      printf(“\n\t\t\t请选择(0~2):”);
        
      scanf(“%d”,&choice);
      switch(choice)
      {
      case 1: sno_del(head,fname);break;
      case 2: name_del(head,fname);break;
      case 0: return;break;
      default : printf(“\n\n\t\t输入错误,请重新输入”);
      }
     
     // printf(“\n\n\t\t是否继续删除:y/n:”);
     // getchar();
     // scanf(“%c”,&ch);
          //     if(ch==’n'||ch==’N')
      //    return;
      

     } while(choice);
    }
    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中按学号修改满足条件的结点
    ————————————————————————*/

    void sno_modi(ST *head,char *fname)  
    {
     char snomodi[10];
     char ch;
     int sign=0;
     ST *p;
     system(“cls”);

     while(1)
     {
      p=head;
      printf(“\n\t\t请输入要修改的学生学号:”);
      scanf(“%s”,snomodi);
      while(p!=NULL)
      {
       if(strcmp(p->sno,snomodi)!=0)
        p=p->next;
       else
       {
        printf(“\n\t\t\t姓  名:%s的原各科成绩:”,p->name);
        printf(“\n\n\t\t\t语文:%8.0f  数学:%8.0f  英语:%8.0f “,p->gra_chin,p->gra_math,p->gra_eng);
        printf(“\n\t\t请修改:”);
        printf(“\n\t\t\t语  文:”);
        scanf(“%f”,&p->gra_chin);
                     if(p->gra_chin<0||p->gra_chin>100)
        {
               printf(“\n分数应为1~100间的数,请重新输入语文分数:”);
                scanf(“%f”,&p->gra_chin);
        }  
        printf(“\n\t\t\t数  学:”);
        scanf(“%f”,&p->gra_math);
                     if(p->gra_math<0||p->gra_math>100)
        {
               printf(“\n分数应为1~100间的数,请重新输入数学分数:”);
               scanf(“%f”,&p->gra_math);
        }  
                     printf(“\n\t\t\t英  语:”);
        scanf(“%f”,&p->gra_eng);
                    if(p->gra_eng<0||p->gra_eng>100)
          {
               printf(“\n分数应为1~100间的数,请重新输入英语分数:”);
               scanf(“%f”,&p->gra_eng);
          } 
          sign=1;
                     printf(“\n\n\t\t是否继续修改:y/n:”);
              getchar();
              scanf(“%c”,&ch);
                     if(ch==’n'||ch==’N')
        {
            save(head,fname);
         return;
        }

        else
          break;
       }
       if (p==NULL)
       {
        printf(“\n\t\t查无此人!是否继续修改:y/n:”);
                     getchar();
              scanf(“%c”,&ch);
                     if(ch==’n'||ch==’N')
        {if (sign==1)
          save(head,fname);
         return;
        }
        else
           break;
       }    
      }
     }

    }

    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中按学生姓名修改成绩

    ————————————————————————*/
    void name_modi(ST *head,char * fname)  //
     { 
     char namemodi[10];
     char ch;
     int sign=0;
     ST *p;
     system(“cls”);

     while(1)
     {
      p=head;
      printf(“\n\t\t请输入要修改的学生姓名:”);
      scanf(“%s”,namemodi);
      while(p!=NULL)
      {
       if(strcmp(p->name,namemodi)!=0)
        p=p->next;
       else
       {
        printf(“\n\n\t\t学号:%s 姓  名:%s的原各科成绩:”,p->sno,p->name);
        printf(“\n\n\t\t\t语文:%8.0f  数学:%8.0f  英语:%8.0f “,p->gra_chin,p->gra_math,p->gra_eng);
        printf(“\n\t\t是否是修改此学生?y/n:”);//if there are more than one student have the
                     getchar();                               //same name,you should ensure modify which one
              scanf(“%c”,&ch);
                     if(ch==’n'||ch==’N')
        {
         p=p->next;
         continue;
        }
        else
        {
           printf(“\n\n\t\t请修改:”);
           printf(“\n\t\t\t语  文:”);
           scanf(“%f”,&p->gra_chin);
                        if(p->gra_chin<0||p->gra_chin>100)
           {
                   printf(“\n分数应为1~100间的数,请重新输入语文分数:”);
                   scanf(“%f”,&p->gra_chin);
           } 
           printf(“\n\t\t\t数  学:”);
           scanf(“%f”,&p->gra_math);
                        if(p->gra_math<0||p->gra_math>100)
           {
                   printf(“\n分数应为1~100间的数,请重新输入数学分数:”);
                   scanf(“%f”,&p->gra_math);
           } 
                        printf(“\n\t\t\t英  语:”);
           scanf(“%f”,&p->gra_eng);
                        if(p->gra_eng<0||p->gra_eng>100)
           {
                   printf(“\n分数应为1~100间的数,请重新输入英语分数:”);
                   scanf(“%f”,&p->gra_eng);
           } 
           sign=1;
        }

                     printf(“\n\n\t\t是否继续修改:y/n:”);
              getchar();
              scanf(“%c”,&ch);
                     if(ch==’n'||ch==’N')
        {
            save(head,fname);
         return;
        }

        else
        { 
     
          break;
        }
       }
       if (p==NULL)
       {
        printf(“\n\t\t没有你要查找的人!是否继续修改:y/n:”);
                     getchar();
              scanf(“%c”,&ch);
                     if(ch==’n'||ch==’N')
        {if(sign==1)
          save(head,fname);
         return;
        }
        else
           break;
       }    
      }
     }

    }
    void data_modi(ST *head,char *fname)//修改子菜单
    {
     int choice=1;
     //char ch;
       
     do
     {
      system(“cls”);
      
      printf(“\n\n\n\t\t\t\t\t修改子菜单”);
         printf(“\n\t\t\t=================================”);
      printf(“\n\t\t\t\t1.按学生学号修改成绩”);
      printf(“\n\t\t\t\t2.按学生姓名修改成绩”);
      
      printf(“\n\t\t\t\t0.返回主菜单”);
      printf(“\n\t\t\t================================ =”);
      printf(“\n\t\t\t请选择(0~2):”);
        
      scanf(“%d”,&choice);
      switch(choice)
      {
      case 1: sno_modi(head,fname);break;
      case 2: name_modi(head,fname);break;
      case 0: return;break;
      default : printf(“\n\n\t\t\t\t输入错误,请重新输入”);
      }
      
      //printf(“\n\n\t\t\t\t是否继续修改:y/n:”);
      //getchar();
      //scanf(“%c”,&ch);
              // if(ch==’n'||ch==’N')
       //   return;
      

     } while(choice);

    }

    /*————————————————————————
    函数功能描述:
      接收链表头指针,打印链表中所有结点
    ————————————————————————*/
    void print_show(ST *head)
    {
     ST *p;
     p=head;
        printf(“\n\n\n\t*——————————————- ——————-*”);
     printf(“\n\t学      号   姓     名  语文成绩  数学成绩  英语成绩  平均成绩”);
        printf(“\n\t*———————————————– —————*”);
     while(p!=NULL)
     {
           printf(“\n\t%10s”,p->sno);
        printf(“%10s”,p->name);
        printf(“%11.1f”,p->gra_chin);
        printf(“%11.1f”,p->gra_math);
        printf(“%10.1f”,p->gra_eng);
        printf(“%10.0f”,(p->gra_chin+p->gra_math+p->gra_eng )/3);
           printf(“\n\t*———————————————– —————*”);
        p=p->next;  
       
     }
     getchar();
     return;

    }

    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中按学号排序显示
    ————————————————————————*/
    void prin_all(ST *head)
    {
     ST *q,*t,*shead,*k;
     
        ST *p;
     p=NULL;
    // int count,i,j;
        //int count=1;
     system(“cls”);
     
     shead=k=p=t=q=NULL;
     
     //q->next=stail;
     for (p=head;p!=NULL;p=p->next)
     { 
      t=(ST *)malloc(sizeof(ST));
      strcpy(t->sno,p->sno);
      strcpy(t->name,p->name);
      t->gra_chin=p->gra_chin;
      t->gra_math=p->gra_math;
      t->gra_eng=p->gra_eng;
      if(shead==NULL)
      {shead=t;shead->next=NULL;p=p->next;contin ue;}
      
      for(q=shead;q!=NULL;q=q->next)
      {   
       
                 
       if (strcmp(t->sno,q->sno)>0)
       {
        k=q;
        //q=q->next;
        //printf(“ok”);

       }
       else
       {
        if(q==shead)
        { 
            t->next=shead;shead=t;break;
        }
        else
        {
         t->next=q;
         k->next=t;
         break;

        }
       }

      }
            if(k==NULL)
      {
       p=p->next;
       continue;
      }
            else
      if (k->next==NULL)
      {
       t->next=k->next;
       k->next=t;
       
      }

      
     }

     print_show(shead);
     getchar();
     return;

    }

    /*————————————————————————
    函数功能描述:
      接收链表头指针,在链表中按平均成绩排序显示
    ————————————————————————*/
    void sort_gra(ST *head)
    {
        ST *q,*t,*shead,*k;
     int avet,aveq;
        ST *p;
     p=NULL;
    // int count,i,j;
        //int count=1;
     system(“cls”);
     
     shead=k=p=t=q=NULL;
     
     //q->next=stail;
     for (p=head;p!=NULL;p=p->next)
     { 
      t=(ST *)malloc(sizeof(ST));
      strcpy(t->sno,p->sno);
      strcpy(t->name,p->name);
      t->gra_chin=p->gra_chin;
      t->gra_math=p->gra_math;
      t->gra_eng=p->gra_eng;
      if(shead==NULL)
      {shead=t;shead->next=NULL;p=p->next;contin ue;}
      
      for(q=shead;q!=NULL;q=q->next)
      {   
       avet=(int)(t->gra_chin+t->gra_math+t ->gra_eng)/3;
          aveq=(int)(q->gra_chin+q->gra_math+q->gra_eng)/3;
                 
       if (avet<=aveq)
       {
        k=q;
        //q=q->next;
        //printf(“ok”);

       }
       else
       {
        if(q==shead)
        { 
            t->next=shead;shead=t;break;
        }
        else
        {
         t->next=q;
         k->next=t;
         break;

        }
       }

      }
            if(k==NULL)
      {
       p=p->next;
       continue;
      }
            else
      if (k->next==NULL)
      {
       t->next=k->next;
       k->next=t;
       
      }

      
     }
     print_show(shead);
     getchar();
     return;

    }

    void data_prin(ST * head)
    {
     
     int choice=1;
     //char ch;
       
     do
     {
      system(“cls”);
      
      printf(“\n\n\n\t\t\t\t打印子菜单”);
         printf(“\n\t\t\t=================================”);
      printf(“\n\t\t\t1.按学号顺序打印所有学生情况”);
      printf(“\n\t\t\t2.按平均成绩高低顺序打印学生成绩”);  
      printf(“\n\t\t\t0.返回主菜单”);
      printf(“\n\t\t\t================================ =”);
      printf(“\n\t\t\t请选择(0~2):”);
        
      scanf(“%d”,&choice);
      switch(choice)
      {
      case 1: prin_all(head);break;
      case 2: sort_gra(head);break;
      case 0: return;break;
      default : printf(“\n\n\t\t\t\t输入错误,请重新输入”);
      }
      
      
      //printf(“\n\n\t\t\t\t是否继续修改:y/n:”);
      //getchar();
      //scanf(“%c”,&ch);
              // if(ch==’n'||ch==’N')
       //   return;
      

     } while(choice);
    }

     
     
     

    void login()  //系统登录界面
    {
     int i,times;

     char usr[10],pwd[10];
     for(times=0;times<3;times++)
     {
      //system(“cls”);
      printf(“\n\n\n\n\n\t\t\t用户名:”);
      
      gets(usr);
      printf(“\n\n\t\t\t密  码:”);
      
      for(i=0;i<10;i++)
      {
          pwd=_getch();
       if(pwd==8&&i>0)
       {
        //pwd[i-2]=’ ‘;
        printf(“\b \b”);
            
        i=i-2;

        continue;
       }
       if(pwd!=13)
           printf(“*”);
       
       else
       {
        pwd=’\0′;
        break;
       }
      }
      if (strcmp(usr,”123″)==0&&strcmp(pwd,”123″)==0)
       
       return ;
      else
      {
       printf(“\n\n\t\t\t\t\t用户名或密码错误!请重输!”);
       continue;
      }
      
     }
     printf(“\n\n\n\t\t您无权进入系统!”);
     exit(1);

       

    }
    void main()
    {
     char choice=’1′;
     char ch;
     char fname[30];
     ST *head;
        system(“color 3f”);
     login();
     system(“cls”);
        printf(“请输入要建立或找开的文件名(*.txt):”);
     gets(fname);
       
     

       
     do
     {
      system(“cls”);
      
      head=load(fname);
      printf(“\n\n\n\t\t\t\t   主菜单”);
         printf(“\n\t\t\t=================================”);
      printf(“\n\t\t\t\t1.输入学生成绩”);
      printf(“\n\t\t\t\t2.查询学生成绩”);
      printf(“\n\t\t\t\t3.删除学生成绩”);
      printf(“\n\t\t\t\t4.修改学生成绩”);
      printf(“\n\t\t\t\t5.打印输出成绩”);
     
      printf(“\n\t\t\t\t0.退出系统”);
      printf(“\n\t\t\t================================ =”);
      printf(“\n\t\t\t请选择(0~5):”);
        
      scanf(“%c”,&choice);
      switch(choice)
      {
      case ’1′: head=data_input(head,fname);break;
      case ’2′: data_query(head,fname);break;
      case ’3′: data_del(head,fname);break;
      case ’4′: data_modi(head,fname);break;
      case ’5′: data_prin(head);break;
      case ’0′: printf(“\n\n\t\t\t\t谢谢使用”);break;
      default : printf(“\n\n\t\t\t\t输入错误,请重新输入”);
      }
      if(choice==’0′)
      {
       fclose(fp);
       break;
      }
      
      getchar();
      scanf(“%c”,&ch);
               if(ch==’n'||ch==’N')
          break;
      

     } while(choice);
      
    }

留下一个回复