学生管理系统
学生管理系统
- 问题描述
改写已有的学生信息管理系统为良好程序风格,要求有必要的文档注释,函数注释,语句注释。补充程序的功能:基于文件处理,刷新和保存功能。将学生信息改为更好的数据组织,而非离散形式(结构体)。其他不足等可根据在自己理解完善。
- 解题思路
原程序中已经有了较完整的功能,说明查询修改增加删除显示退出几项功能,但程序不能完成刷新和保存信息功能,输入的数据就不能存储下来。首先是刷新功能,这个功能应该是在保存数据后进行的,主要用了这两行代码FILE *file; file=fopen(“1.txt”,“w”);打开1.txt文件后,将文件中存储的数据全部删除重写。保存功能的实现主要用到了fopen和fclose函数。打开文件后,for循环遍历整个输入的数据并将其写入,然后关闭文件。
-
算法构造
程序总体流程图:
按学号排序的流程图:
盒图: -
#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 测试结果
增加学生信息
显示学生信息
修改学生的性别
修改后保存学生信息
再次查询信息
根据学生学号删除信息
更新函数运行后记事本中原本的信息被清空
-
调试结果
以修改学生高数成绩为例:
7. 经验归纳
此次代码大部分都是作业文件本来提供的,按照要求我完成的部分不是特别多,主要是更新函数,保存函数,实现将数据写入一个文件的功能。更新学生信息并不难,用到了这几行代码:
FILE file;
file=fopen(“1.txt”,“w”);
printf(“更新完毕!”);
只需要打开数据保存所在的1.txt文件,然后将文件内已存数据全部清除即可。至于保存函数也比较简单,数据写入一个指定文件
FILEfp;
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函数中,使得功能菜单只在最开始出现一次,节省空间。