学生信息管理系统c代码.docx
- 文档编号:17377663
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:24
- 大小:564.49KB
学生信息管理系统c代码.docx
《学生信息管理系统c代码.docx》由会员分享,可在线阅读,更多相关《学生信息管理系统c代码.docx(24页珍藏版)》请在冰点文库上搜索。
学生信息管理系统c代码
学员信息管理系统
(C语言项目制作)
由于NCAE考试发的是全国信息化工程师“岗位技能”证书,比较重视项目制作能力和动手能力,要求学生必须做一个项目,该项目要有一定实用价值,本文讲述“学员信息管理系统”地制作,学完该项目后,关于用C语言编写、与数据管理有关的项目,大家应该都就会做了。
一、软件需求分校
1、任务描述
随着学校规模不断扩大,学生数量急剧增加,有关学生的各种信息量也成倍增长,学生信息管理工作变得更加复杂,需要规范的学生信息管理系统来提高工作效率。
2、功能模块
图1
3、功能演示
3.1、启动软件,进入程序主界面(图2)
图2
按屏幕提示“按任意键初始化学员信息…”:
(图3)
图3
“按任意键进入主目录”:
(图4)
图4
3.2、键入“1”,选择“显示”命令,可以显示所有学生信息:
(图5)
图5
3.3、返回主目录“图4”,键入“2”,选择“查找”命令,查找指定学号的信息:
(图6是查找“002”号学员后,返回的学员信息):
图6
3.4、返回主目录“图4”,键入“3”,选择“录入”命令,录入新的学员信息:
(图7是录入“007”号学员信息的步骤和结果):
图7
3.5、返回主目录“图4”,键入“4”,选择“修改”命令,可修改学员信息:
(图8是录入“002”号学员信息的步骤和结果):
图8
3.6、返回主目录“图4”,键入“5”,选择“删除”命令,可删除指定学员信息:
(图9是成功删除“005”号学员信息的步骤和结果):
图9
图10是删除“002”号学员不成功的步骤和结果:
图10
3.7、返回主目录“图4”,键入“6”,选择“排序”命令,可按学号排序:
(图11是“按学号降序”的步骤和结果):
图11
图12是“按学号升序”的步骤和结果
图12
二、程序设计
1、界面设计
1.1、在软件开发中,程序界面有两种,如图13所示:
图13
第一种界面:
提示用户如何操作,指令如下:
printf("欢迎进入========学员信息管理系统========\n");
printf("\n\t\t\t按任意键初始化学员信息...\n\n");
第二种界面:
返回程序运算的结果,会在后面“算法”中介绍。
1.2、如何实现主目录界面?
system("cls");
printf("以下是程序主目录,请选择功能\n\n");
printf("1)显示\n2)查找\n3)录入\n4)修改\n5)删除\n6)排序\n0)退出\n\n");
printf("键入功能前的数字后,按\"Enter\"键:
");
图14
1.3、如何实现“键入功能前的数字后”,就能选择相应的命令?
do
{select=getchar();
switch(select)
{case'1':
display();break;//显示所有学员信息
case‘2’:
query();break;//查询学员信息
case'3':
input();break;//录入新学员信息
case'4':
update();break;//修改学员信息
case'5':
del();break;//删除学员信息
case'6':
sort();break;//对学员进行排序
case'0':
break;//退出
default:
printf("请选择功能前的数字\n");break;
}
}while(select!
='0');
说明:
“select=getchar()”中,select代表输入的数字字符;用switch-case语句实现选择对应的命令;“display()”函数实现“显示所有学员信息”;“
1.4、如何实现“按任意键回到主目录”?
printf("\n\n\t\t\t按任意键进入主目录...");
getch();//从键盘收任一个字符即返回,该函数在conio.h中
1.5、如何实现图15中“输出格式化”?
图15
printf("\n%-8s%-10s%-10s%-10s%-10s\n","学号","姓名","语文","数学","英语");
printf("%-8s%-10s%-10s%-10s%-10s\n","====","====","====","==","==");
printf("%-8s%-10s%-10.1f%-10.1f%-10.1f",“001”,“li1”,68,87,63);
printf("%-8s%-10s%-10.1f%-10.1f%-10.1f",“001”,“Li2”,68,78,74);
在在printf中,“-”表示数据左对齐,“10.1”中的10表示输出宽度,“.1”表示输出1位小数。
2、数据结构的设计
2.1、如何表示学生信息的数据类型
在本项目中,学生信息包括“学号、姓名、三门课的成绩”可以用结构体数据类型来表示:
typedefstruct//定义学生信息结构体类型
{charno[10];//学号
charname[16];//姓名
floatscore[3];//定义成绩数组
}STU;
2.2、关于文件包含
在项目中用到了很多库函数,因此在程序起始位置,需要用到文件包含:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
2.3、关于“全局变量”
由于程序中用到大量的函数,因此可以设置全局变量。
intscount;//定义数据库实际学生数量
STUstu[10000];//声明代表学生的结构体数组,假设最多有10000条数据
2.4、关于“函数声明”
程序中用到大量的自定义函数,它们可能是主调函数,也可能是被调函数,为了扩展它们的作用域,最好在程序前面加上函数声明。
//函数声明部分
voidreaddb();//初始化学员信息,把外存中学生数据读入到内存中
voidsavedb();//把内存中结构体数组中的学生数据保存到外存中
voidzhumulu();//显示程序主目录
voiddisplay();//显示所有学员信息
voidinput();//录入新学员信息
intfind(charstr[80]);//查找指定学号的学员,若找到返回该学员在数组中的下标,若没找到返回-1,str代表指定学号;在多个模块中用到该函数
voidquery();//根据学号查找,并显示学员信息
voidupdate();//修改学员信息
voiddel();//删除学员信息
voidsort();//对学员进行排序
2.5、关于“数据文件”
图16
上面显示的是所有学生信息,这些学生数据在内存中的表现形式是常量、变量、数组和链表的方式,在外存中的表现形式是文件。
由于断电后,内存信息会全部清空,因此,内存信息需要经常存放到外存中。
2.5.1、文件操作的步骤
(1)打开文件:
fopen
(2)对文件读写操作:
fscanf、fprintf
(3)关闭文件:
fclose
2.5.2、从外存文件中读数据至内存数组stu
FILE*fp=fopen(“studb.txt”,"r”);
i=0;//i是数据库中实际学生数量,其全局变量scount
while(!
feof(fp))//stu是代表学生的结构体数组
{fscanf(fp,"%s%s%f%f%f",
stu[i].no,stu[i].name,//no学号,name姓名
&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
i++;//score是三门课成绩的数组
}
scount=i;fclose(fp);
2.5.3、把内存数组中数据输出到外存文件
FILE*fp=fopen(“studb.txt”,“w”);
i=0;
For(i=0;i {fprintf(fp,"%-8s%-10s%-10.1f%-10.1f%-10.1f\n" stu[i].no,stu[i].name, stu[i].score[0],stu[i].score[1],stu[i].score[2]); }//”%-10.1f”中,“-”左对齐,“10”宽度,“.1”小数位数 fclose(fp); 3、主要算法的实现 3.1、显示所有学员的信息(如图17) 图17 方法: 遍历数组,用printf函数显示数据。 for(i=0;i printf(“%-8s%-10s%-10.1f%-10.1f%-10.1f\n”, stu[i].no,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]); 其中,scount是“实际学生数量”;stu“代表学生信息的结构体数组”,no“学号”,name“姓名”,score“三门课成绩的数组”。 3.2、查找指定学号 方法: 遍历数组,查找指定学号的学员,函数返回值是找到后的学号的下标,如果指定学号不存在,返回-1; intfind(charstr[80])//str代表要查找的学号 {inti; for(i=0;i if(strcmp(str,stu[i].no)==0)returni;//stu是表示学生信息的结构体数组名 return-1; } 3.3、插入新的学员信息 图18 方法: (1)依次输入新学员信息,并赋值给新变量s; (2)把s添加到数组中;(3)把内存数据保存至外存。 voidinput()//录入新学员信息 {STUs;//代表新学员信息 //下面输入新学员信息 printf("\n\n\n请输入\"学号\",\"学号\"不允许为空字符串: "); scanf("%s",&s.no); printf("\n请输入\"姓名\",注意\"姓名\"里不能加空格: "); scanf("%s",&s.name); printf("\n请输入\"语文成绩\": "); scanf("%f",&s.score[0]); printf("\n请输入\"数学成绩\": "); scanf("%f",&s.score[1]); printf("\n请输入\"英语成绩\": "); scanf("%f",&s.score[2]); //把s添加到结构体数组中;同时把表示学员数量的变量scount增加1 stu[scount++]=s; savedb();//savedb函数把内存中结构体数组中的学生数据保存到外存中 } 3.4、修改学员信息 方法: (1)查找到指定学员的数组下标n; (2)输入修改后的学员信息,存贮到临时变量s中;(3)把s临时变量赋值给stu[n],即stu[n]=s;(4)保存数据到外存文件。 voidupdate()//修改学员信息 {intn;charstr[80];STUs;//s作为临时变量,临时存放修改后的学生信息 printf("\n请输入要修改的学生的学号: "); scanf("%s",str); n=find(str);//find函数返回要查找的学号的下标 printf("\n\n\n请输入修改后的\"学号\",\"学号\"不允许为空字符串: "); scanf("%s",&s.no); printf("\n请输入修改后的\"姓名\",注意\"姓名里\"不能加空格: "); scanf("%s",&s.name); printf("\n请输入修改后的\"语文成绩\": "); scanf("%f",&s.score[0]); printf("\n请输入修改后的\"数学成绩\": "); scanf("%f",&s.score[1]); printf("\n请输入修改后的\"英语成绩\": "); scanf("%f",&s.score[2]); stu[n]=s;//把修改后的值保存到内存数组中 savedb();//把内存数据保存到外存数据文件中 } 3.5、删除某学员信息 方法: (1)查找到指定学员的数组下标n; (2)把后续数据前移,实现删除操作;(3)保存数据到外存文件。 voiddel()//删除学员信息 {intn,i;charstr[80];charch; printf("\n请输入要删除的学生的学号: "); scanf("%s",str); n=find(str); for(i=n;i<=scount-2;i++)stu[i]=stu[i+1];//删除指定学号 scount--; savedb();//把内存数据保存到外存数据文件中 } 3.6、对学员排序 下面是升序排序: for(i=0;i<=scount-2;i++) for(j=i+1;j<=scount-1;j++) if(strcmp(stu[i].no,stu[j].no)>0) {t=stu[i];stu[i]=stu[j];stu[j]=t;} 三、对本项目的拓展 1、本程序是用结构体数组实现,您可以用结构体链表来实现所有的算法; 2、结构体的成员发生改变,本结构体成员有: 学号、姓名、三门课成绩。 您可以增加成员,如性别、年龄、或更多门课的成绩; 3、把系统改为“教师信息管理系统”、“档案信息管理系统”、“订单管理系统”等。 四、附完整的程序代码 //========学员信息管理系统======== //==TXT文本文件实时存储数据,运用结构体数组 #include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" intscount;//定义数据库实际学生数量 typedefstruct//定义学生信息结构体类型 {charno[10];//学号 charname[16];//姓名 floatscore[3];//定义成绩数组 }STU; STUstu[10000];//声明结构体数组,假设最多10000条信息 //函数声明部分 voidreaddb();//初始化学员信息,把外存中学生数据读入到内存中 voidsavedb();//把内存中结构体数组中的学生数据保存到外存中 voidzhumulu();//显示程序主目录 voiddisplay();//显示所有学员信息 voidinput();//录入新学员信息 intfind(charstr[80]);//查找指定学号的学员,找到返回该学员在数组中的下标,没找到返回-1,str代表指定学号;在多个模块中用到该函数 voidquery();//根据学号查找,并显示学员信息 voidupdate();//修改学员信息 voiddel();//删除学员信息 voidsort();//对学员进行排序 //函数定义 voidmain() {//程序进入“欢迎界面” printf("\n\n\n\n\n\t\t欢迎进入========学员信息管理系统========\n"); //按任意键初始化学员信息 printf("\n\t\t\t按任意键初始化学员信息...\n\n"); getch();//从键盘收任一个字符即返回,该函数在conio.h中 readdb();//初始化学员信息,把外存中学生数据读入到内存中 printf("\t\t\t共有%d条学员信息",scount);//scount是实际学生数量 printf("\n\n\t\t\t按任意键进入主目录..."); getch();//从键盘收任一个字符即返回,该函数在conio.h中 zhumulu();//调出“程序主目录” } //显示和返回到程序主目录 voidzhumulu() {charselect;//代表用户所选择的子目录号 do {system("cls"); printf("========学员信息管理系统========\n\n"); printf("以下是程序主目录,请选择功能\n\n"); printf("1)显示\n2)查找\n3)录入\n4)修改\n5)删除\n6)排序\n0)退出\n\n"); printf("键入功能前的数字后,按\"Enter\"键: "); select=getchar(); switch(select) { case'1': //显示所有学员信息 system("cls"); display(); //显示完毕,提示用户返回主程序 printf("\n\n\t\t\t按任意键进入主目录..."); getch();//从键盘收任一个字符即返回,该函数在conio.h中 break; case'2': query();break;//查询学员信息 case'3': input();break;//录入新学员信息 case'4': update();break;//修改学员信息 case'5': del();break;//删除学员信息 case'6': sort();break;//对学员进行排序 case'0': break;//退出 default: printf("请选择功能前的数字\n");break; } }while(select! ='0'); } voidreaddb()//初始化学员信息,把外存中学生数据读入到内存中 { FILE*fp; if((fp=fopen("studb.txt","r"))==NULL) {printf("文件有错误程序不能运行\n");return;} scount=0;//scount是数据库中实际学生数量,是全局变量 while(! feof(fp))//no是学号,name是姓名,)core是成绩 {//stu是学生结构体数组,全局变量 fscanf(fp,"%s%s%f%f%f",stu[scount].no,stu[scount].name, &stu[scount].score[0],&stu[scount].score[1],&stu[scount].score[2]); if(strcmp(stu[scount].no,"")! =0)scount++;//去掉学号为空字符串 } fclose(fp); } //把内存中结构体数组中的学生数据保存到外存中 voidsavedb() {inti;FILE*fp; if((fp=fopen("studb.txt","w"))==NULL)//以写的方式打开文件,覆盖原文件 {printf("文件有错误程序不能运行\n");return;} //stu是学生结构体数组,全局变量 for(i=0;i if(strcmp(stu[i].no,"")! =0)//去掉学号为空字符串的信息 fprintf(fp,"%-8s%-10s%-10.1f%-10.1f%-10.1f\n",stu[i].no,stu[i].name, stu[i].score[0],stu[i].score[1],stu[i].score[2]); fclose(fp); } voiddisplay()//显示所有学员信息 {inti; printf("\n%-8s%-10s%-10s%-10s%-10s\n","学号","姓名","语文","数学","英语"); printf("%-8s%-10s%-10s%-10s%-10s\n",====","====","====","====","===="); for(i=0;i //“-”表示数据左对齐,“10.1”中的10表示宽度,“.1”表示1位小数 printf("%-8s%-10s%-10.1f%-10.1f%-10.1f\n",stu[i].no,stu[i].name, stu[i].score[0],stu[i].score[1],stu[i].score[2]); } //find查找指定学号的学员,代表指定学号(str)的下标,如果指定学号不存在,返回-1;在多个模块中用到该函数 intfind(charstr[80]) {inti;//stu是表示学生信息的结构体数组名 for(i=0;i if(strcmp(str,stu[i].no)==0)returni; return-1; } voidquery()//根据学号查找,并显示学员信息 { charstr[80];intn; system("cls"); printf("\n请输入要查询的学生的学号: "); scanf("%s",str); n=find(str); if(n==-1) printf("\n对不起,您要查找的学员不存在\n"); else {printf("\n%-8s%-10s%-10s%-10s%-10s\n","学号","姓名","语文","数学","英语"); printf("%-8s%-10s%-10s%-10s%-10s\n","===","===","===","===","==="); printf("%-8s%-10s%-10.1f%-10.1f%-10.1f\n",stu[n].no,stu[n].name, stu[n].score[0],stu[n].score[1],stu[n].score[2]); } //显示完毕,提示用户返回主程序 printf("\n\n\t\t\t按任意键进入主目录..."); getch();//从键盘收任一个字符即返回,该函数在conio.h中 } voidinput()//录入新学员信息 {STUs;//代表新学员信息 inti; //先显示已有学员信息 system("cls"); printf("当前学员信息如下: \n"); printf("\n%-8s%-10s%-10s%-10s%-10s\n","学号","姓名","语文","数学","英语"); pri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 信息管理 系统 代码