⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xscjgl.c

📁 一般的学生成绩管理
💻 C
📖 第 1 页 / 共 3 页
字号:
 }STUDENT;
/*菜单函数,返回值为整数*/
menu_select()
{
   char *menu[]={"         ***************管理***************",  /*定义菜单字符串数组*/
   "             0. 初始化",                                  /*初始化*/
   "             1. 输入记录",                                 /*输入记录*/
   "             2. 显示表中所有记录 ",                                /*显示单链表中所有记录*/
   "             3. 排序",                                              /*排序*/
   "             4. 按姓名查找",                                     /*按照姓名查找记录*/
   "             5. 插入记录 ",                                      /*插入记录到表中*/
   "             6. 从表中删除记 ",                               /*将单链表中记录保存到文件中*/
   "             7. 保存记录到表中",                                 /*从表中删除记录*/
   "             8. 从文件中读入记录",                              /*从文件中读入记录*/
   "             9. 退出",                                       /*退出*/
   "        ",
   "        ",                                                   /*屏幕调节,没有实际意义*/
   "        ",
   "         ***********************************",
   "        ",
   "        ",};
   char s[3];                                      /*以字符形式保存选择号*/
   int c,i;
    textbackground(YELLOW);                           /*设置背景颜色为红色*/
   gotoxy(1,25);                                   /*移动光标*/
   printf("按任一键进入主菜单......\n");     /*压任一键进入主菜单*/
   getch();                                          /*定义整形变量*/ 
   /*输入任一键*/
   clrscr();                                       /*清屏*/
   for(i=0;i<16;i++)                               /*输出主菜单数组*/
   {  gotoxy(10,i+1);
      cprintf("%s",menu[i]);
   }

   window(1,1,80,25);                            /*恢复原窗口大小*/
   gotoxy(10,21);                                /*移动光标*/
   do{printf("\n     输入数字(0~9):");   /*在菜单窗口外显示提示信息*/
      scanf("%s",s);                             /*输入选择项*/
      c=atoi(s);                                 /*将输入的字符串转化为整形数*/
   }while(c<0||c>9);                             /*选择项不在0~9之间重输*/
   return c;                                     /*返回选择项,主程序根据该数调用相应的函数*/
}
/*初始化链表,可以实现对另一组数据的处理*/
STUDENT *init()                                  /*初始化链表*/
{ return NULL;}
/*创建链表,完成数据录入功能*/
STUDENT *create()
{  int i; int s;
   STUDENT *h=NULL,*info;                       /* STUDENT指向结构体的指针*/
   for(;;)
   {  info=(STUDENT *)malloc(sizeof(STUDENT));  /*申请空间*/
      if(!info)                                 /*如果指针info为空*/
      {
     printf("\n输出内存溢出");                 /*输出内存溢出*/
     return NULL;                               /*返回空指针*/
      }
      printf("输入学生资料.\n");
      printf("输入学号首字符为#则结束.\n");
      inputs("输入学号.:",info->no,11);         /*输入学号并校验*/
      if(info->no[0]=='#') break;               /*如果学号首字符为#则结束输入*/
      inputs("输入名字:",info->name,15);      /*输入姓名,并进行校验*/
      printf("输入分数 %d门 计算机,英语,数学\n",N);    /*提示开始输入成绩*/
      s=0;                                      /*计算每个学生的总分,初值为0*/
      for(i=0;i<N;i++)                          /*N门课程循环N次*/
      {
     do{
        printf("第%d:",i+1);                 /*提示输入第几门课程*/
        scanf("%d",&info->score[i]);            /*输入成绩*/
        if(info->score[i]>100||info->score[i]<0)/*确保成绩在0~100之间*/ 

   printf("输入错误从新输入\n");      /*出错提示信息*/
     }while(info->score[i]>100||info->score[i]<0);
     s=s+info->score[i];                        /*累加各门课程成绩*/
      }
      info->sum=s;               /*将总分保存*/
      info->average=(float)s/N;  /*求出平均值*/
      info->order=0;             /*未排序前此值为0*/
      info->next=h;              /*将头结点做为新输入结点的后继结点*/
      h=info;                    /*新输入结点为新的头结点*//*没排序前,后输入的数据将排在最上*/
   }
   return(h);                    /*返回头指针*/
}
/*自定义输入控制函数inputs*/
inputs(char *prompt, char *s, int count)
{
   char p[255];
   do{printf(prompt);                               /*显示提示信息*/
      scanf("%s",p);                                /*输入字符串*/
      if(strlen(p)>count)printf("\n 输入字符超长 \n"); /*进行长度校验,超过count值重输入*/
   }while(strlen(p)>count);
   strcpy(s,p);                                     /*将输入的字符串拷贝到字符串s中*/
}
/*显示模块*/
void print(STUDENT *h)
{  int i=0;               /* 统计记录条数*/
   STUDENT *p;            /*移动指针*/
   clrscr();              /*清屏*/
   p=h;                   /*初值为头指针*/
   printf("\n\n\n****************************学生************************************************\n");
   printf("|序号|学号     |      名字    |   计算机 | 英语 |数学   |   总分  |  平均分|名次   \n");
   printf("|---|----------|--------------|--------- |  ----|   ----|-------- |-------|----\n");
   while(p!=NULL)
   {     i++;
    if(i%15==0){getch();clrscr();
    printf("\n\n\n\n");}            /*否则什么也不做*/
    else;
   printf("|%2d |%-10s|%-15s|%4d   |%4d  |  %4d  |   %4.2f|  %4.2f |%3d \n", i, p->no,p->name,p->score[0],p->score[1],
p->score[2],p->sum,p->average,p->order);
       p=p->next;
   }
   printf("**********************************结束******************************************\n");
}
/*排序模块*/
STUDENT *sort(STUDENT *h)
{
   int i=0;                         /*用来保存名次*/
   STUDENT *p,*q,*t,*h1;            /*定义临时指针*/
   h1=h->next;                      /*将原表的头指针所指的下一个结点作头指针*/
   h->next=NULL;                    /*断开原来链表头结点与其它结点的连接*/
   while(h1!=NULL)                  /*当原表不为空时,进行排序*/
   {  t=h1;                         /*取原表的头结点*/
      h1=h1->next;                  /*原表头结点指针后移*/
      p=h;                          /*设定移动指针p,从头指针开始*/
      q=h;                          /*设定移动指针q做为p的前驱,初值为头指针*/
      while(t->sum<p->sum&&p!=NULL) /*作总分比较*/
      { q=p;                        /*待插入点值小,则新表指针后移*/
        p=p->next; 
     }
      if(p==q)                      /*p==q,上面的while没有执行,也即插入点大于头指针,此点应排在首位*/
      { t->next=p;                  /*待排序点的后继为p*/
        h=t;                        /*新头结点为待排序点*/
      }
      else                          /*待排序点应插入在q和p之间,如p为空则是尾部*/
      { t->next=p;                  /*t的后继是p*/
        q->next=t;                  /*q的后继是t*/
      }
   }
   p=h;                             /*已排好序的头指针赋给p*/
   while(p!=NULL)                   /*赋予各组数据排序号*/
   {
      i++;                          /*结点序号*/
      p->order=i;                   /*将名次赋值*/
      p=p->next;                    /*指针后移*/
   }
   printf("排序成功!!!\n");      /*排序成功*/
   return (h);                      /*返回头指针*/
}

/*查找记录模块*/
void search(STUDENT *h)
{  STUDENT *p;                      /*移动指针*/
   char s[15];                      /*存放姓名的字符数组*/
   clrscr();                        /*清屏幕*/
   printf("输入你要查找的姓名:\n");
   scanf("%s",s);                   /*输入姓名*/
   p=h;                             /*将头指针赋给p*/
   while(strcmp(p->name,s)&&p!=NULL)/*当记录的姓名不是要找的,并且指针不为空时*/
   p=p->next;                       /*移动指针,指向下一结点,继续查找*/
   if(p==NULL)                      /*指针为空,说明未能找到所要的结点*/
      printf("\n没有要查到的记录 %s\n",s);
   else                             /*显示找到的记录信息*/
   {  printf("\n\n*****************************信息*************************************\n");
      printf("|学号      |      姓名    | 计算机| 英语| 数学|   总分 | 平均分| 名次|\n");
      printf("|----------|--------------|----   |---- |---- |--------|-------|-----|\n");
      printf("|%-10s|%-15s| %4d |%4d | %4d | %4.2f | %4.2f| %3d |\n",
      p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
      printf("********************************结束************************************\n");
   }
}
/*插入记录模块*/
STUDENT  *insert(STUDENT *h)
{  STUDENT *p,*q,*info,*k;                   /*p指向插入位置,q是其前驱,info指新插入记录*/
   int s1,i,n=0;
   printf("\n插入新记录\n");
   info=(STUDENT *)malloc(sizeof(STUDENT));  /*申请空间*/
   if(!info)
   {  printf("\输出内存溢出");              /*如没有申请到,内存溢出*/
      return NULL;                           /*返回空指针*/
   }
   inputs("输入学号.:",info->no,11);         /*以下是待插入数据的录入和处理,具体同创建模块同*/
   inputs("输入名字:",info->name,15);


 printf("输入分数 %d门 计算机,英语,数学\n",N);
   s1=0;
   for(i=0;i<N;i++)
   {  do{
     printf("第%d:",i+1);
     scanf("%d",&info->score[i]);
     if(info->score[i]>100||info->score[i]<0)
        printf("输入错误从新输入\n");
      }while(info->score[i]>100||info->score[i]<0);
      s1=s1+info->score[i];                  
   }
   info->sum=s1;                             
   info->average=(float)s1/N;                
   info->next=NULL;                          /*设后继指针为空*/
   p=h;                                      /*将指针赋值给p*/
   q=h;                                      /*将指针赋值给q*/
   if(h==NULL)                               /*链表为空*/
     {h=info;info->next=NULL;}
   else
      {while((info->sum<p->sum)&&(p->next!=NULL))
        {q=p;                                /*使q指向p刚才的结点*/
         p=p->next;}                         /*使p后移一个结点*/
       if(info->sum>=p->sum)
         {if(h==p){h=info; info->next=p;}    /*info作为头指针,p作为info的后继指针*/
          else q->next=info;                 /*q的后继指针是info*/
               info->next=p;}                /*info的后继指针是p*/
       else
          {p->next=info;info->next=NULL;}}   /*p的后继指针是info,info的后继指针是空*/
    k=h;
    while(k!=NULL)                           /*重新赋予排序号(排序号因为被插入新数据而改变)*/
   {  n++;
      k->order=n;
      k=k->next;
   }
   printf("\n ----插入新数据%s----\n",info->name);
   return(h);                                /*返回头指针*/
}
/*删除记录模块*/
STUDENT *delete(STUDENT *h)
{  char k[5];      /*定义字符串数组,用来确认删除信息*/
   STUDENT *p,*q;  /*p为查找到要删除的结点指针,q为其前驱指针*/
   char s[11];     /*存放学号*/
   clrscr();       /*清屏*/
   printf("删除记录学号\n");      /*显示提示信息*/
   scanf("%s",s);  /*输入要删除记录的学号*/
   q=p=h;          /*给q和p赋初值头指针*/
   while(strcmp(p->no,s)&&p!=NULL)   /*当记录的学号不是要找的,或指针不为空时*/
   {  q=p;            /*将p指针值赋给q作为p的前驱指针*/
      p=p->next;      /*将p指针指向下一条记录*/
   }
   if(p==NULL)        /*如果p为空,说明链表中没有该结点*/
      printf("\n没有要找的记录%s\n",s);
   else               /*p不为空,显示找到的记录信息*/
   {  printf("*****************************显示记录***************************\n");
      printf("|学号      |     姓名     | 第一门 | 第二门| 第三门|  总分  |  平均分  |名次|\n");
      printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
      printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
       p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); 
  printf("********************************end*******************************\n");
     do{inputs("你确认要删除??(y/n)",k,5);
        }while(k[0]!='y'&&k[0]!='n');
     if(k[0]!='n')        /*删除确认判断*/
       {if(p==h)          /*如果p==h,说明被删结点是头结点*/
     h=p->next;           /*修改头指针指向下一条记录*/
      else
     q->next=p->next;     /*不是头指针,将p的后继结点作为q的后继结点*/
      free(p);            /*释放p所指结点空间*/
      printf("\n 已经删除该记录%s\n",s);
       }}
   return(h);             /*返回头指针*/
}
/*保存数据到文件模块*/
 void save(STUDENT *h)
{
   FILE *fp;                                      /*定义指向文件的指针*/
   STUDENT *p;                                    /* 定义移动指针*/
   char outfile[20];                              /*保存输出文件名*/
   printf("输入文件名,例如 G:\\f1\\score.txt:\n");
   scanf("%s",outfile);
   if((fp=fopen(outfile,"wb"))==NULL)             /*为输出打开一个二进制文件,如没有则建立*/
   {
      printf("不能打开文件\n");
      exit(1);
   }
   printf("\n保存中......\n");               /*打开文件,提示正在保存*/
   p=h;                                           /*移动指针从头指针开始*/
   while(p!=NULL)                                 /*如p不为空*/
   {
      fwrite(p,sizeof(STUDENT),1,fp);             /*写入一条记录*/
      p=p->next;                                  /*指针后移*/
   }
   fclose(fp);                                    /*关闭文件*/
   printf("-----保存成功!!-----\n");          /*显示保存成功*/
}
/*导入信息模块*/
STUDENT *load()
{  STUDENT *p,*q,*h=NULL;                         /*定义记录指针变量*/
   FILE *fp;                                      /* 定义指向文件的指针*/
   char infile[20];                               /*保存文件名*/
   printf("输入要查找的文件名例如 G:\\f1\\score.txt:\n");
   scanf("%s",infile);                            /*输入文件名*/
   if((fp=fopen(infile,"rb"))==NULL)              /*打开一个二进制文件,为读方式*/
   {  printf("不能打开文件\n");              /*如不能打开,返回头指针*/
     return h;
   }
   printf("\n -----导入文件!-----\n");
   p=(STUDENT *)malloc(sizeof(STUDENT));          /*申请空间*/
   if(!p)
   {  printf("输出内存溢出!\n");                 /*如没有申请到,则内存溢出*/
      return h;                                   /*返回空头指针*/
   }
   h=p;                
   while(!feof(fp))                               /*循环读数据直到文件尾结束*/
   {  if(1!=fread(p,sizeof(STUDENT),1,fp))
     break;                                       /*如果没读到数据,跳出循环*/
      p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*为下一个结点申请空间*/
      if(!p->next)
      {
     printf("输出内存溢出!\n");                  /*如没有申请到,则内存溢出*/
     return h;
      }
      q=p;                                        /*保存当前结点的指针,作为下一结点的前驱*/
      p=p->next;                                  /*指针后移,新读入数据链到当前表尾*/
   }
   q->next=NULL;                                  /*最后一个结点的后继指针为空*/
   fclose(fp);                                    /*关闭文件*/
   printf("导入成功!!!\n");
   return h;                                      /*返回头指针*/
}
/******主函数开始*******/
main()
  {int i;
   STUDENT *head;        /*链表定义头指针*/
   head=init();          /*初始化链表*/
   clrscr();             /*清屏*/
   randomize();
initgr();
boxshrink();
mingcheng();
chengyuan();
zx();
getch();
closegraph();
clrscr();

   clrscr();             /*清屏*/
   for(;;)               /*无限循环*/
   {switch(menu_select())               /*调用主菜单函数,返回值整数作开关语句的条件*/
      {
     case 0:head=init();break;          /*执行初始化*/
     case 1:head=create();break;        /*创建链表*/
     case 2:print(head);break;          /*显示全部记录*/
     case 3:head=sort(head);break;      /*排序*/
     case 4:search(head);break;         /*查找记录*/
     case 5:head=insert(head);  break;  /*插入记录*/
     case 6:head=delete(head);break;    /*删除记录*/
     case 7:save(head);break;           /*保存文件*/
     case 8:head=load(); break;         /*读文件*/
     case 9:exit(0);                    /*如菜单返回值为9程序结束*/
      }
   }
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -