学生管理系统

学生管理系统

  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函数中,使得功能菜单只在最开始出现一次,节省空间。

相关推荐
安卓学生管理系统 学生管理系统需求分析报告 ——移动互联网开发一班第七小组一:需求背景学生信息管理系统是具有统计,管理学生和老师各种在校相关信息,方便学校对于学生信息的统一管理的系统。 随着高校的扩招,需要处理的学生信息日趋加大,不仅花费大量的教师资源,处理的效率还十分低下。为提高学生管理的管理水平,优化资源,尽可能降低管理成本成为学生管理的新课题,学生管理系统是从学生管理现状出发,根据学生管理的新要求进行开发设计的,它解决了学生管理数据信息量大,修改不方便,对一系列数据进行分析时花费时间长等问题,帮助学生管理人员有效管理学生信息,成为管理高校中必不可少的管理工具。二:需求概述(1)目标学生信息管理系统的目标是为方便学校教务处系统的管理学生信息并学校和学生间提供一个信息共享的平台(2)需求学生管理系统的管理用户国分为三大类,分别是管理员登录功能,教师登录功能以及学生登录功能需求分析*管理员对功能的需求管理员权限最大,可以对学生的班级,课程,情况进行统一的管理,细分如下:超级管理员可增加,修改,删除普通管理员有关学生信息的浏览,,学生信息的添加修改和删除学校基本课程的浏览,学校基本课程的添加修改和删除学生课程的浏览与统计,可按成绩范围对成绩进行统计学生选课信息的管理,包括查询,修改与删除*学生对功能的需求学生利用此系统进行与自己有关的信息查询与输入,细分如下:浏览个人基本信息修改登录密码浏览课程信息浏览在校期间的奖惩情况浏览个人学分信息利用个人账户进行查询选修课程基本信息与选修课程的选择和退出浏览个人选课情况*教师对功能的需求教师对所带班级学生的信息查询与修改,细分如下:教师可利用此系统查询所带班级的基本信息查询所带班级的学生在校期间的奖惩录入与修改所带班级学生的成绩信息查询所带班级学生的成绩信息查询班级学生的选课情况功能模块(一)学生用户功能主要包括以下部分:(1)注册 (2)登录 (3)修改密码 (4)查询个人信息 (5)选课(退课) (6)查询成绩具体功能介绍如下:(1)注册实现功能:创建一条学生记录,由学生自己填写个人信息并保存,实现统一管理个人信息内容:学号,姓名,性别,出生年月,籍贯,民族,学院,班级,宿舍号,个人联系电话,父母联系电话,家庭住址(2)用户登录 实现功能:用户注册后可直接登录,使用查询信息,选课,退课等功能(3)修改密码 实现功能:输入旧密码,输入两次新密码,如旧密码正确且两次新密码一致则用新密码覆盖旧密码,否则重新输入旧密码或者两次新密码不一致重新输入新密码(4)查询个人信息实现功能:在此显示学生的个人信息内容:学号,姓名,性别,出生年月 籍贯 民族 学院 班级 宿舍 联系电话(只可查询不可修改)(5)查询成绩 实现功能:显示入学以来所修课程的所有成绩和学分等信息(6)选课(退课) 实现功能:在学校规定时间内为学生提供网上选课及退课功能以及查看个人选课信息 约束:1.只能选择人数未满的课程及未修的课程 2.只能退已选课程(二)教师学生用户功能主要包括以下部分:(1)注册 (2)登录(3)查看个人信息(4)查看全校学生信息(5)录入成绩 (6)修改密码具体功能介绍如下:注册实现功能:常见一条教师记录,由老师自己填写并保存,实现统一管理个人信息内容:教师编号 姓名 性别 出生年月 籍贯 民族 学院 联系电话用户登录实现功能:用户注册后可直接登录用于查看个人信息 查看学生信息 以及实现录入学生成绩等功能(3)修改密码实现功能:输入旧密码,输入两次新密码,如旧密码正确且两次新密码一致则用新密码覆盖旧密码,否则重新输入旧密码或者两次新密码不一致重新输入新密码(4)查询个人信息实现功能:显示教师的个人信息显查询内容:教师编号 姓名 性别 出生年月 籍贯 民族 学院 联系方式(5)查看学生成绩信息实现功能:查询所有学生的课程成绩信息查询流程:选择学生所属院系—>专业—>班级—>学年(6)录入成绩实现功能:教师录入所带班级学生成绩信息(三)管理员用户功能主要包括以下部分:(1)登录学生/教师端信息管理 (2)登录课程信息管理 (3)宿舍信息管理具体功能介绍如下:登录实现功能:管理员身份验证,学生信息管理 教师信息管理 宿舍信息管理学生/教师信息管理实现功能:对在校学生/教师的信息的增删改查等功能实现流程:学生:选择个人信息或成绩信息,输入相应学号进行相应的查询与更新功能教师:输入教师编号查询教师信息并进行相应的操作课程信息管理实现功能:创建课程信息 包括课程编号 课程名称 学时 学分 等相应字段宿舍信息管理实现功能:对学生住宿情况进行统筹管理数据库设计创建学院数据库创建表创建院系信息表 字段有 院系编号 院系名称 院系人数 院系简介 创建专业信息表 字段有 专业编号 专业名称 专业人数 所属院系 院系简介创建辅导
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页