学生管理系统

学生管理系统

  1. 问题描述

改写已有的学生信息管理系统为良好程序风格,要求有必要的文档注释,函数注释,语句注释。补充程序的功能:基于文件处理,刷新和保存功能。将学生信息改为更好的数据组织,而非离散形式(结构体)。其他不足等可根据在自己理解完善。

  1. 解题思路

原程序中已经有了较完整的功能,说明查询修改增加删除显示退出几项功能,但程序不能完成刷新和保存信息功能,输入的数据就不能存储下来。首先是刷新功能,这个功能应该是在保存数据后进行的,主要用了这两行代码FILE *file; file=fopen(“1.txt”,“w”);打开1.txt文件后,将文件中存储的数据全部删除重写。保存功能的实现主要用到了fopen和fclose函数。打开文件后,for循环遍历整个输入的数据并将其写入,然后关闭文件。

  1. 算法构造

    程序总体流程图:
    在这里插入图片描述
    在这里插入图片描述
    按学号排序的流程图:
    在这里插入图片描述
    盒图:
    在这里插入图片描述

  2.  #include<stdio.h>   
    
     #include<stdlib.h>  
    
     #include<string.h>  
    
     #define LEN 15                /* 学号和姓名最大字符数,实际请更改*/
    
     #define N 50            /* 最大学生人数,实际请更改*/
    
     char* code[N];        /* 学号*/
     
     char* name[N];      
    
     int age[N];                        
    
     char sex[N];    
    
     float score[N][3];     /* 3门课程成绩*/
    
     int k=1,n=0, m=0; /* n代表当前记录的学生人数*/   
    
     void seek();
    
     void modify();
    
     void insert();
    
     void del();
    
     void display();
    
     void menu(); 
    
     //让功能菜单只出现一次,避免麻烦
    
     int main()
    
     { 
    
     	   printf("\n\n                  \n\n");
    
      	   printf(" ******************************************************\n\n");
    
     	   printf("  *                学生信息管理系统                    *\n \n");
    
     	   printf(" ******************************************************\n\n"); 
    
     	   printf("*********************系统功能菜单*************************       \n");
    
    	   printf("     ----------------------   ----------------------   \n");
    
     	   printf("    *********************************************     \n");
    
      	   printf("     * 0.系统帮助及说明  * *  1.刷新学生信息   *    \n");
    
     	   printf("    *********************************************     \n"); 
    
    	   printf("     * 2.查询学生信息    * * 3.修改学生信息   *     \n");
    
      	   printf("    *********************************************     \n");
    
    	    printf("     * 4.增加学生信息    * * 5.按学号删除信息 *     \n");
    
     	    printf("    *********************************************     \n");
    
      	    printf("     * 6.显示当前信息    * * 7.保存当前学生信息*     \n");
    
    	    printf("     ********************************************     \n");
    
    	    printf("     * 8.退出系统        *                            \n");
    
     	    printf("     **********************                            \n");
    
      	    printf("     ----------------------   ----------------------                           \n");
    
     	 while(k)
    
    	  {
    
             	  menu();
    
                 }
    
     	 system("pause");
    
     	 return 0;
    
     } 
    
     void help() //系统帮助及说明
    
     { 
    
      	printf("\n0.欢迎使用系统帮助!\n");
    
     	 printf("\n1.初次进入系统后,请先选择增加学生信息;\n");
    
    	  printf("\n2.按照菜单提示键入数字代号;\n");
    
     	   printf("\n3.增加删除修改学生信息后,切记保存;\n");
    
     	   printf("\n4.谢谢您的使用!\n");
    
     } 
    
     void update()  //更新学生信息
    
     {
    
    	  FILE *file;
    
    	  file=fopen("1.txt","w");
    
     	   printf("更新完毕!");
    
     }
    
     void seek() //查找
    
     {
    
    	  int i,item,flag;
    
     	   char s1[21]; /* 以姓名和学号最长长度+1为准*/
    
      	   printf("------------------\n");
    
      	   printf("-----1.按学号查询-----\n");
    
     	   printf("-----2.按姓名查询-----\n");
    
    	   printf("-----3.退出本菜单-----\n");
    
    	   printf("------------------\n");
    
      	 while(1)
    
      	{
    
               printf("请选择子菜单编号:");
    
               scanf("%d",&item);
    
               flag=0;
    
               switch(item)
    
               {
    
                case 1:
    
                       printf("请输入要查询的学生的学号:\n");
    
                       scanf("%s",s1);
    
                       for(i=0;i<n;i++)
    
                       {
    
                                if(strcmp(code[i],s1)==0)
    
                                {
    
                                         flag=1;
    
                                         printf("学生学号    学生姓名  年龄   性别  C语言成绩  高等数学  大学英语成绩\n");                                   
    
                                         printf("--------------------------------------------------------------------\n");
    
                                         printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",code[i],name[i],a[i],sex[i],score[i][0],score[i][1],score[i][2]);
    
                                }
    
                                if(0==flag)
    
                                         printf("该学号不存在!\n");
     			break;
                       }
    
           	    case 2:
    
                       printf("请输入要查询的学生的姓名:\n");
    
                       scanf("%s",s1);
    
                       for(i=0;i<n;i++)
    
                       {
                                 if(strcmp(name[i],s1)==0)
    
                                {
    
                                         flag=1;
    
                                         printf("学生学号    学生姓名  年龄   性别  C语言成绩  高等数学  大学英语成绩\n");                                   
    
                                         printf("--------------------------------------------------------------------\n");
    
                                         printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",code[i],name[i],a[i], sex[i],score[i][0],score[i][1],score[i][2]);
    
                                }
    
                                         if(0==flag)
    
                                                  printf("该姓名不存在!\n");
     					break;
    
                     	  }
    
               case 3:
    
                       return;
    
               default:
    
                       printf("请在1-3之间选择\n");                          
               }
               
         }
      
     }	 
    
     void modify() //修改信息
    
     {
    
     	  int i,item,num;
    
      	  char sex1,s1[LEN+1],s2[LEN+1]; /* 以姓名和学号最长长度+1为准*/
    
      	   float score1;
    
      	   printf("请输入要要修改的学生的学号:\n");
    
     	 scanf("%s",s1);
    
              for(i=0;i<n;i++)
    
    	  {
    
         	      if(strcmp(code[i],s1)==0)/*比较字符串是否相等*/
    
                       num=i;
    
               printf("------------------\n");
    
               printf("1.修改姓名\n");
    
               printf("2.修改年龄\n");
    
               printf("3.修改性别\n");
    
               printf("4.修改C语言成绩\n");
    
               printf("5.修改高等数学成绩\n");
    
               printf("6.修改大学英语成绩\n");
    
               printf("7.退出本菜单\n");
    
               printf("------------------\n");
    
               while(1)
    
               {
    
                       printf("请选择子菜单编号:");
    
                       scanf("%d",&item);
    
                       switch(item)
    
                       {
    
                       case 1:
    
                                printf("请输入新的姓名:\n");
    
                                scanf("%s",s2);
    
                                strcpy(name[num],s2);
                                
     			    break;
    
                       case 2:
    
                                printf("请输入新的年龄:\n");
    
                                scanf("%d",age[num]);break;
    
                       case 3:
    
                                printf("请输入新的性别:\n");
    
                                scanf("%c",&sex1);
    
                                sex[num]=sex1;
                                
     			    break;
    
                       case 4:
    
                                printf("请输入新的C语言成绩:\n");
    
                                scanf("%f",&score1);
    
                                score[num][0]=score1;
                                
     			    break;
    
                       case 5:
    
                                printf("请输入新的高等数学成绩:\n");
    
                                scanf("%f",&score1);
    
                                score[num][1]=score1;
                                
     			    break;
    
                       case 6:
    
                                printf("请输入新的大学英语成绩:\n");
    
                                scanf("%f",&score1);
    
                                score[num][2]=score1;
                                
     			    break;
    
                       case 7:  return;
    
                       default: printf("请在1-7之间选择\n");
    
                       }
    
               }
    
      }
    
      printf("请再次保存修改后的数据!");
     } 
    
     void sort() //按学号排序
    
     {
    
     	 int i,j,k,*p,*q,s;
     	 
      	 char temp[LEN+1],ctemp;
    
      	 float ftemp;
    
    	  for(i=0;i<n-1;i++)
    
     	   {
    
             	  for(j=n-1;j>i;j--)
    
             	  {
    
                     	  if(strcmp(code[j-1],code[j])>0)
    
                     	  {
    
                                strcpy(temp,code[j-1]);
    
                                strcpy(code[j-1],code[j]);
    
                                strcpy(code[j],temp);
    
                                strcpy(temp,name[j-1]);
    
                                strcpy(name[j-1],name[j]);
    
                                strcpy(name[j],temp);
    
                                ctemp=sex[j-1];
    
                                sex[j-1]=sex[j];
    
                                sex[j]=ctemp;
    
                                p=&age[j-1];
    
                                q=&age[j];
    
                                s=*q;
    
                                *q=*p;
    
                                *p=s;
    
                                for(k=0;k<3;k++)
    
                                {
    
                                         ftemp=score[j-1][k];
    
                                         score[j-1][k]=score[j][k];
    
                                         score[j][k]=ftemp;
    
                                }
    
                       }
    
               }
    
      }
    
     } 
    
     void insert() //插入函数
    
     {
    
    	  int j=n;
    
      	 printf("请输入待增加的学生数:\n");
    
    	  scanf("%d",&m);
    
    	  do
    
     	  {
     	code[j]=(char *)malloc(10);
    
    
     	name[j]=(char *)malloc(15);
    
         	 printf("请输入第%d 个学生的学号:\n",j-n+1);
    
            scanf("%s",code[j]);
    
               printf("请输入第%d 个学生的姓名:\n",j-n+1);
    
               scanf("%s",name[j]);
    
               printf("请输入第%d 个学生的年龄:\n",j-n+1);
    
               scanf("%d",&age[j]);
    
    
     	printf("请输入第%d 个学生的性别:\n",j-n+1);
    
               scanf("%s",&sex[j]);
    
               printf("请输入第%d 个学生的C语言成绩:\n",j-n+1);
    
               scanf("%f",&score[j][0]);
    
               printf("请输入第%d 个学生的高等数学成绩:\n",j-n+1);
    
               scanf("%f",&score[j][1]);
    
               printf("请输入第%d 个学生的大学英语成绩:\n",j-n+1);
    
               scanf("%f",&score[j][2]);
    
             
    	 j++;
    
      }while(j<n+m);
    
      n+=m;
    
      printf("信息增加完毕!\n\n");
    
      sort();
    
     } 
    
     void del() //按学号删除信息
    
     {
    
      int i,j,flag=0;
    
      char s1[LEN+1];
    
      printf("请输入要删除学生的学号:\n");
    
      scanf("%s",s1);
    
      for(i=0;i<n;i++)
    
               if(strcmp(code[i],s1)==0)
    
               {
    
                       flag=1;
    
                       for(j=i;j<n-1;j++)
    
                              code[j]=code[j+1];
    
                     	  name[j]=name[j+1];
    
                           	age[j]=age[j+1];     
    
                     	  sex[j]=sex[j+1];       
    
                          	 score[j][0]=score[j+1][0];
    
        			     score[j][1]=score[j+1][1];
    
                                score[j][2]=score[j+1][2];
    
                               
               }
    
               if(flag==0)
    
                       printf("该学号不存在!\n");
    
               if(flag==1)
    
               {
    
                       printf("删除成功,显示结果请选择菜单\n");
    
                       n--;
    
               }
    
     } 
    
    
     void display() //显示所有学生的信息
    
     {
    
      int i;
    
      printf("共有%d位学生的信息:\n",n);
    
      if(0!=n)
    
      {
    
               printf("学生学号  学生姓名 年龄  性别  C语言成绩  高等数学  大学英语成绩\n");                                   
    
               printf("--------------------------------------------------------------------\n");
    
               printf("%d",n);
    
               for(i=0;i<n;i++)
    
               {
               
                       printf("%7s %7s %6d %6s %9.1f %10.1f%10.1f\n",code[i],name[i],age[i],&sex[i],score[i][0],score[i][1],score[i][2]);
    
               }
    
      }
    
     } 
    
    
     void save() //保存信息
    
     {
    
      FILE*fp;
    
      int i;
    
      fp=fopen("1.txt","w");
    
      for(i=0;i<n;i++)
    
      {
    
               fprintf(fp,"%s%s%d%s%f%f%f\n",code[i],name[i],age[i],&sex[i],score[i][0],score[i][1],score[i][2]);
    
      }
    
      fclose(fp);
    
      printf("信息保存完毕,可在文本文档中进行查看!\n");
    
     }
    
     void menu()/* 界面*/
    
     {
    
      int num;
    
      printf("请选择菜单编号:");
    
      scanf("%d",&num);
    
      switch(num)
    
      {
    
    
      case 0:help();break;
    
      case 1:update();break;
    
      case 2:seek();break;
    
      case 3:modify();break;
    
      case 4:insert();break;
    
     case 5:del();break;
    
     case 6:display();break;
    
      case 7:save();break;
    
      case 8:k=0;break;
    
      default:printf("请在0-8之间选择\n");
    
      }
    
     }
    

5 测试结果
在这里插入图片描述
增加学生信息

在这里插入图片描述
显示学生信息
在这里插入图片描述
修改学生的性别
在这里插入图片描述
在这里插入图片描述
修改后保存学生信息
在这里插入图片描述
再次查询信息
在这里插入图片描述
根据学生学号删除信息
在这里插入图片描述
在这里插入图片描述
更新函数运行后记事本中原本的信息被清空

  1. 调试结果

    以修改学生高数成绩为例:
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7. 经验归纳

此次代码大部分都是作业文件本来提供的,按照要求我完成的部分不是特别多,主要是更新函数,保存函数,实现将数据写入一个文件的功能。更新学生信息并不难,用到了这几行代码:
FILE file;
file=fopen(“1.txt”,“w”);
printf(“更新完毕!”);
只需要打开数据保存所在的1.txt文件,然后将文件内已存数据全部清除即可。至于保存函数也比较简单,数据写入一个指定文件
FILE
fp;
int i;
fp=fopen(“1.txt”,“w”);
for(i=0;i<n;i++)
{
fprintf(fp,"%s%s%d%s%f%f%f\n",code[i],name[i],age[i],&sex[i],score[i][0],score[i][1],score[i][2]);
}
fclose(fp);
printf(“信息保存完毕,可在文本文档中进行查看!\n”);
相比跟新函数,保存函数多了将数据存入的步骤,以for循环循环将n个学生信息写入文件,最后用fclose关闭文件。
期间遇到了性别输入显示总是不正确的问题,最后发现这个问题与性别数据的定义有关,性别定义为字符数组,不像姓名和学号是指针数组,有指针。在display函数中最后for循环中
for(i=0;i<n;i++)
{
printf("%7s %7s %6d %6s %9.1f %10.1f%10.1f\n",code[i],name[i],age[i],&sex[i],score[i][0],score[i][1],score[i][2]);
}
Sex[i]加上取地址符&并将前面%6c改为%6s即可正常输出,这个问题最终还是没有特别好的解决,因为是请教别人,还需要自己继续弄清楚。
最后解决了一个小问题,将原本menu函数中的功能菜单一系列代码调整到了main函数中,使得功能菜单只在最开始出现一次,节省空间。

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值