===========================================================================================================================================================================
一、系统概述
学生信息的管理是每个学校必须具有的管理功能,主要是对学生的基本情况进行管理。该系统模拟一个简单的学生信息管理系统,要求该系统对学生信息的进行增、删、改、查。
二、功能模块
功能模块图如下:
!
三、数据结构说明
学生信息管理系统需要一个数据文件info.dat,它用来存储学生信息,包含8个字段如下:
四、函数设计
(1)main()函数:将多个函数组合起来;
(2)Menu()函数:显示菜单选项;
(3)Show()函数:显示info.dat中的学生信息;
(4)Lookfor_num(int *n)函数:按学号查询学生信息;指针参数用于存放查询找到的位置;
(5)Lookfor_name(int *n)函数:按姓名查找学生信息;
(6)Lookfor()函数:查询学生信息子菜单,分为学号或者姓名查询;
(7)Update()函数:按学号查找要修改的学生信息;
(8)Insert()函数:添加学生信息;
(9)Delete()函数:删除学生信息;
(10)Conpos()函数:按照学号对学生信息进行排序并显示。
五、代码展示
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
struct Student{
int num; //学号
char name[7]; //姓名
char sex[3]; //性别
char birth[8]; //出生年月
char native_p[5]; //籍贯
char tel[13]; //电话
char prof[7]; //专业
char hobby[30]; //爱好
}stu[100]; //存放学生信息
int total; //信息总数
char Menu(){ //主菜单
FILE *fp;
char choice;
if((fp=fopen("info.dat","rb"))!=NULL){
rewind(fp);
for(total=0;fread(&stu[total],sizeof(struct Student),1,fp)!=0;total++);
fclose(fp);
}
printf("\n 学生管理系统 \n");
printf(" =============\n");
printf(" S-显示学生信息\n");
printf(" L-查询学生信息\n");
printf(" U-修改学生信息\n");
printf(" D-删除学生信息\n");
printf(" I-插入学生信息\n");
printf(" C-按学号排序\n");
printf(" Q-退出系统\n");
printf(" ==================\n");
do{
scanf("%c",&choice);
} while(choice!='s'&&choice!='S'&&choice!='l'&&choice!='L'&&choice!='u'
&&choice!='U'&&choice!='i'&&choice!='I'&&choice!='d'
&&choice!='D'&&choice!='c'&&choice!='C'&&choice!='q'
&&choice!='Q');
return choice;
}
void Show(){ //显示学生信息
FILE *fp;
int i,j;
if((fp=fopen("info.dat","rb"))==NULL){
system("cls");
printf("信息文件为空!按回车键返回!\n");
getchar();
getchar();
system("cls");
return;
}
rewind(fp);
system("cls");
printf("\n 学生管理系统\n\n");
printf("\n 显示学生信息\n");
for(i=0;fread(&stu[i],sizeof(struct Student),1,fp)!=0;i++);
fclose(fp);
printf("-------------------------------------\n");
printf("\n学号 姓名 性别 出生年月 籍贯 专业 电话 爱好 \n");
for(j=0;j<i;j++){
printf("%-6d%-8s%-6s%-10s%-7s%-7s%-13s%s\n",stu[j].num,stu[j].name,
stu[j].sex,stu[j].birth,stu[j].native_p,stu[j].prof,stu[j].tel,stu[j].hobby);
}
printf("--------------------------------------\n");
printf("共有%d条记录!按回车键返回!\n",i);
getchar();
getchar();
system("cls");
}
int Lookfor_num(int *n){ //按学号查询
int lookfornum,i,k=0;
printf("\n请输入学号:");
scanf("%d",&lookfornum);
system("cls");
for(i=0;i<total;i++)
if(lookfornum==stu[i].num){
if(k==0){
*n=i;
printf("\n学号 姓名 性别 出生年月 籍贯 专业 电话 爱好 \n");
printf("%-6d%-8s%-6s%-10s%-7s%-7s%-13s%s\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].birth,stu[i].native_p,stu[i].prof,stu[i].tel,stu[i].hobby);
}
printf("------------------------------------------------------\n");
k++;
}
return k;
}
int Lookfor_name(int *n){ //按姓名查询
char lookforname[7];
int i,k=0;
printf("\n请输入姓名:");
scanf("%s",&lookforname);
system("cls");
for(i=0;i<total;i++)
if(!strcmp(lookforname,stu[i].name)){
*n=i;
if(k==0){
printf("\n学号 姓名 性别 出生年月 籍贯 专业 电话 爱好 \n");
printf("%-6d%-8s%-6s%-10s%-7s%-7s%-13s%s\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].birth,stu[i].native_p,stu[i].prof,stu[i].tel,stu[i].hobby);
}
printf("----------------------------------------------------\n");
k++;
}
return k;
}
void Lookfor(){ //查询学生信息
FILE *fp;
int k,i;
char chose;
if((fp=fopen("info.dat","rb"))==NULL){
system("cls");
printf("信息文件为空!按回车键返回!\n");
getchar();
getchar();
system("cls");
return;
}
rewind(fp);
for(total=0;fread(&stu[total],sizeof(struct Student),1,fp)!=0;total++);
fclose(fp);
system("cls");
do{
printf("\n 学生管理系统\n\n");
printf("====================\n");
printf(" A-按学号查找\n");
printf(" B-按姓名查找\n");
printf(" Q-返回\n");
printf("=================================\n");
do{
chose=getchar();
} while(chose!='a'&&chose!='A'&&chose!='b'&&chose!='B'&&chose!='e'
&&chose!='E'&&chose!='q'&&chose!='Q');
switch(chose){
case 'a' : case 'A':
if((k=Lookfor_num(&i))==0)
printf("无相关信息!按回车键返回!\n");
else{
printf("共找到%d条信息!按回车键返回!\n,k");
}
getchar();
getchar();
system("cls");
break;
case 'b' : case 'B':
if((k=Lookfor_name(&i))==0)
printf("无相关信息!按回车键返回!\n");
else{
printf("共找到%d条信息!按回车键返回!\n,k");
}
getchar();
getchar();
system("cls");
break;
case 'q': case 'Q':
system("cls");
return;
default: break;
}
}while(1);
}
void Update(){ //修改学生信息
FILE *fp;
char choseyn,chose4,newname[7],newsex[3],newbirth[8],newdegr[5];
char newduty[7],newtel[13],newaddr[30];
int n,chosenum,newnum,i;
while(1){
system("cls");
printf("\n 学生管理系统\n\n");
printf("\n 修改学生信息\n");
printf("===========================================\n\n\n");
if((Lookfor_num(&n))==0){
printf("没有找到你要修改的信息!按回车键返回!\n");
getchar();
getchar();
system("cls");
return;
}
else
while(1){
printf("\n\n1-学号 2-姓名 3-性别 4-生日 5-籍贯 6-专业 7-电话 8-爱好 0-返回\n");
printf("\n 请输入修改内容的编号:");
do{
scanf("%d",&chosenum);
}while(chosenum<0||chosenum>8);
switch(chosenum){
case 1:
printf("\n请输入新学号:");
scanf("%d",&newnum);
stu[n].num=newnum;
break;
case 2:
printf("\n请输入新姓名:");
scanf("%s",newname);
strcpy(stu[n].name,newname);
break;
case 3:
printf("\n请输入新性别:");
scanf("%s",newsex);
strcpy(stu[n].sex,newsex);
break;
case 4:
printf("\n请输入新生日:");
scanf("%s",newbirth);
strcpy(stu[n].birth,newbirth);
break;
case 5:
printf("\n请输入新籍贯:");
scanf("%s",newdegr);
strcpy(stu[n].native_p,newdegr);
break;
case 6:
printf("\n请输入新专业:");
scanf("%s",newduty);
strcpy(stu[n].prof,newduty);
break;
case 7:
printf("\n请输入新电话:");
scanf("%s",newtel);
strcpy(stu[n].tel,newtel);
break;
case 8:
printf("\n请输入新爱好:");
scanf("%s",newaddr);
strcpy(stu[n].hobby,newaddr);
break;
default:
break;
}
printf(" 修改成功!是否继续修改该学生信息?(y/n)\n");
do{
choseyn=getchar();
}while(choseyn!='y'&&choseyn!='Y'&&choseyn!='n'&&choseyn!='N');
if(choseyn=='n'||choseyn=='N')
if((fp=fopen("info.dat","wb+"))==NULL){
printf("打开信息文件失败!\n");
exit(0);
}else{
rewind(fp);
for(i=1;i<total;i++)
fwrite(&stu[i],sizeof(struct Student),1,fp);
fclose(fp);
system("cls");
break;
}
}
printf("\n\n 是否修改其他学生的信息?(y/n)\n");
do{
chose4=getchar();
}while(chose4!='y'&&chose4!='Y'&&chose4!='n'&&chose4!='N');
if(chose4!='n'||chose4!='N'){
system("cls");
return;
}
}
}
void Insert(){ //插入学生信息
FILE *fp;
char chose_IQ;
int i=-1;
while(1){
system("cls");
printf("\n 学生管理系统\n\n");
printf(" 插入学生信息\n");
printf("=========================================\n");
if((fp=fopen("info.dat","ab+"))==NULL){
printf("打开信息文件失败!\n");
exit(0);
}
i++;
printf("\n请输入学号:");
scanf("%d",&stu[i].num);
printf("\n请输入姓名:");
scanf("%s",&stu[i].name);
printf("\n请输入性别(男/女):");
scanf("%s",&stu[i].sex);
printf("\n请输入生日(如2000.02):");
scanf("%s",&stu[i].birth);
printf("\n请输入籍贯:");
scanf("%s",&stu[i].native_p);
printf("\n请输入专业:");
scanf("%s",&stu[i].prof);
printf("\n请输入电话(如0002225556):");
scanf("%s",&stu[i].tel);
printf("\n请输入爱好:");
scanf("%s",&stu[i].hobby);
fwrite(&stu[i],sizeof(struct Student),1,fp);
printf(" 添加成功!\n\n");
fclose(fp);
printf("\n继续插入信息吗?(Y/N)\n");
do{
chose_IQ=getchar();
}while(chose_IQ!='y'&&chose_IQ!='Y'&&chose_IQ!='n'&&chose_IQ!='N');
if(chose_IQ=='n'||chose_IQ=='N')
break;
}
system("cls");
}
void Delete(){ //删除学生信息
FILE *fp;
char chose2;
int deletnum,i,j,k=32767;
char choseyn;
while(1){
system("cls");
printf("\n 学生管理系统\n\n");
printf(" 删除学生信息\n");
printf("========================================\n");
printf("\n请输入学号:");
scanf("%d",&deletnum);
system("cls");
for(i=0;i<total;i++)
if(deletnum==stu[i].num){
k=i;
break;
}
if(k>=total){
printf("没有找到学生%d的信息!按回车键返回!\n",deletnum);
getchar();
getchar();
system("cls");
return;
}
else{
printf("\n学号 姓名 性别 出生年月 籍贯 专业 电话 爱好 \n");
printf("%-6d%-8s%-6s%-10s%-7s%-7s%-13s%s\n",stu[k].num,stu[k].name,
stu[k].sex,stu[k].birth,stu[k].native_p,stu[k].prof,stu[k].tel,stu[k].hobby);
printf("----------------------------------------------------------\n");
printf("这是学号%d的信息!确定删除嘛?(Y/N)\n",stu[k].num);
do{
choseyn=getchar();
}while(choseyn!='y'&&choseyn!='Y'&&choseyn!='n'&&choseyn!='N');
if(choseyn=='y'||choseyn=='Y'){
for(j=k;j<total;j++)
stu[j]=stu[j+1];
if((fp=fopen("info.dat","wb+"))==NULL){
printf("打开信息文件失败!\n");
exit(0);
}
for(i=0;i<total-1;i++)
fwrite(&stu[i],sizeof(struct Student),1,fp);
fclose(fp);
printf("\n删除成功!\n");
Sleep(2000);
}
}
printf("\n继续删除信息吗?(y/n)\n");
do{
chose2=getchar();
}while(chose2!='y'&&chose2!='Y'&&chose2!='N'&&chose2!='n');
if(chose2=='n'||chose2=='N')
break;
}
system("cls");
}
void Compos(){ //按关键字排序
FILE *fp;
char chose1;
int i,j,k=0,min=32767;
system("cls");
printf("\n学号 姓名 性别 出生年月 籍贯 专业 电话 爱好 \n");
printf("---------------------------------------------------------------------\n");
for(j=0;j<total;j++){
for(i=0;i<total;i++)
if(stu[i].num<min){
min=stu[i].num;
k=i;
}
min=32767;
printf("%-6d%-8s%-6s%-10s%-7s%-7s%-13s%s\n",stu[k].num,stu[k].name,
stu[k].sex,stu[k].birth,stu[k].native_p,stu[k].prof,stu[k].tel,stu[k].hobby);
stu[k].num=32767;
}
if((fp=fopen("info.dat","rb+"))==NULL){
printf("打开文件信息失败!\n");
exit(0);
}
for(i=0;fread(&stu[i],sizeof(struct Student),1,fp)!=0;i++);
//重新初始化数组下标,否则第二次排序的时候显示的学号全是32767
printf("\n排序完毕!按Y键返回!\n");
do{
chose1=getchar();
}while(chose1!='y'&&chose1!='Y');
system("cls");
}
int main(){
char choseyn;
do{
switch(Menu()){
case 's': case 'S': Show(); break;
case 'l': case 'L': Lookfor(); break;
case 'u': case 'U': Update(); break;
case 'i': case 'I': Insert(); break;
case 'd': case 'D': Delete(); break;
case 'C': case 'c': Compos(); break;
case 'q': case 'Q': printf("真的要退出吗?(Y/N)\n");
do{
choseyn=getchar();
}while(choseyn!='y'&&choseyn!='Y'&&choseyn!='N'&&choseyn!='n');
if(choseyn=='y'||choseyn=='Y'){
printf("谢谢使用!拜拜!\n");
Sleep(2000);
return 0;
}
} defalut: break;
}while(1);
return 0;
}
六、结束语
1、在参考本系统时,若发现有错误或者疑问,可以提出;
2、还请各位大佬提出不足与建议,谢谢!
3、感谢各位大佬的观看,谢谢!