学生学籍管理说明书.docx
《学生学籍管理说明书.docx》由会员分享,可在线阅读,更多相关《学生学籍管理说明书.docx(31页珍藏版)》请在冰豆网上搜索。
学生学籍管理说明书
目录
摘要1
前言2
正文3
1.采用类c语言定义相关的数据类型3
2.各模块的伪码算法3
3.程序流程图5
4.调试分析6
5.测试结果7
6.源程序(带注释)9
总结26
参考文献27
致谢28
摘要
本设计---学生学籍信息管理系统是一项繁琐的业务,用计算机实现自动化管理既可以减轻人员的劳动强度,又可以提高学校管理效率。
此程序可以输入新的学生信息,输出所有学生的学号,姓名、性别、年龄、院系,专业,出生日期,籍贯等信息;修改学生信息内容;按号查找学生信息;增加新生的信息;退出学生信息管理系统。
通过此设计过程,可以加深理解线性表、查找表的逻辑结构、存储结构,掌握查找、排序等基本运算的实现。
关键词:
数据结构;线性表;学籍管理
前言
数据结构是一门专业技术基础课,它对学习者的的要求很明确:
学会分析、研究计算机加工的数据结构的特性,以便为应用设计所需的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术。
其次,该课程的学习过程也是复杂程序设计的训练过程,要求学习者编写的程序结构或设计的程序结构体清楚、正确、易读,符合软件工程的规范。
其过程使用链表或顺序表实现数据的录入、浏览(对于学生记录的整体浏览和逐一浏览)、添加(可以添加任何符合记录格式的学生档案记录)、删除(可以删除数据库中任一条学生记录)、修改(可以修改其中的任一条学生数据内容)、查找(可以根据学生学号,查找某学生信息,也可以查找具有相同特征的学生的集合等功能;
本设计在WindowsXP操作系统环境下使用VisualC++6.0软件开发工具,采用目前最通用的程序设计语言之一——C语言作为数据结构和算法的描述语言。
通过该题目的设计过程,可以加深理解线性表、查找表的逻辑结构、存储结构,掌握查找、排序等基本运算的实现。
正文
1.采用类c语言定义相关的数据类型
学生学籍的记录项用结构体structstudent表示,包括10个属性,stunum、name、zhuanye、classes
、sex、birth、age、nation、add、depar分别代表学生的学号、姓名、院系、专业、年级、性别、出生日期、年龄、民族和籍贯。
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include"string.h"
#defineN1000//N为可输入的学生总人数,可根据需要更改
structstudent//定义学生信息结构体数组
structstudent//定义学生信息结构体数组
{
charnum[9];//学号
charname[20];//姓名
chardepar[15];//院系
charzhuanye[15];//专业
charclasses[5];//班级
charsex[4];//性别
charage[3];//年龄
charnation[5];//民族
charbirth[9];//出生日期
charadd[10];//籍贯
};
2.各模块的伪码算法
1)程序包含9个模块
(1)主程序模块
voidmenu(structstudentstu[N])
函数功能:
在屏幕上显示主菜单,接收用户选择并响应用户相应操作。
(2)创建并录入信息木模块
found(structstudentstu[])
printf("请输入要录入的学生的信息:
\n");
scanf("%s",stu[i].信息);
getch();
此部分创建学生(学号,姓名,性别,民族,出生日期,入学日期,院系,班级)等信息。
(3)修改学生信息模块
voidmodify(structstudentstu[],intsum)
用来修改学生的姓名,学号,性别,名族,入学日期,院系,班级,籍贯等信息.
(4)查询学生信息模块
voidseek(structstudentstu[],intsum)
可通过学号和姓名来查看学生的个人信息。
(5)删除某学生信息模块
del(structstudentstu[],intsum)
通过学生学号来删除学生信息。
(6)显示打印已有学生信息模块
voidshow(structstudentstu[],intsum)
显示学生已有信息(学号,姓名,性别,民族,出生日期,入学日期,院系,班级)。
(7)添加学生信息模块
insert(structstudentstu[],intsum)
先输入要添加的个数,然后依次添加学生学号,姓名,性别,民族,出生日期,入学日期,院系,班级信息。
(8)对学生信息排序模块
voidrank(structstudentstu[],intsum)
(9)对班级的学生人数进行统计模块
voidcount(structstudentstu[],intsum)
此模块通过统计学生人数的学院,专业,班级信息,输出符合相应信息的学生人数。
3.函数的调用关系图
4.调试分析
a、调试中遇到的问题及对问题的解决方法
此次课程设计所研究的问题不是很难,只有一个核心算法,即进行学生学籍查询,所以总的高度比较顺利。
但在最初的设计过程中犯了一个致命的错误,即没有很好的进行整体布局,也没有定义统一的函数接口,以致程序的结构与函数的混乱。
当各模块组合在一起的时候更是无没进行调试。
故只有一切从头开始,重新分配任务,以及统一定义各函数的接口。
在调试的过程中发现当输入错误的时会发生想不到的错误,为了避免这样意外的发生,写了一个判断函数judge()以及输入函数input()对其进行改进。
当一段相同的代码在程序中多次使用并且功能相对单一时,有必要将其写成一个函数,以减少工作量,并且使程序具有更好的可读性。
在编写程序的过程中,及时对重要和难懂的程序段写注释是一个很好的习惯,无论是以后的测试还是以后的维护都能够节省相当多的时间。
调试时最先进行各函数的调试,确保无误时再进行各模块的调试,最后才是将各模块组合在一起测试完整的程序。
在调试的过程中不断地进行改进、完善。
在序能够正确运行的基础上,再对各函数进行格式的优化,加强程序的结构性,并增强程序的可读性,包括给运行界面增加相应的操作提示等,使操作界面简单而又美观。
b、算法的时间复杂度和空间复杂度。
本次课设采用使用链表或顺序表实现数据的录入,浏览,添加,修改,删除,查找。
建立一个测试的数据表,至少要有20个测试数据,算法对于这些合法的输入数据都能产生满足规格说明要求。
若假设学生的人数为N,则:
空间复杂度为:
O(N)
时间复杂度最大为:
O(N²)
5.测试结果
该程序运行结果如下
图3功能选择
图4查询学生信息
查询学生信息可以按照学生的姓名和学号分别查询
图5修改学生信息
图5可以看出修改学生信息可以从姓名、年龄、出生日期、籍贯、院系、专业、班级、民族几个方面来分别进行修改,从而能够更好的来管理学生学籍变化情况。
图6显示学生信息
图6可以看出,该同学(dzf)男,19891213出生,汉族,来自甘肃省,所在院系为据算计,专业为信计2班。
6.源程序(带注释)
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include"string.h"
#defineN1000//N为可输入的学生总人数,可根据需要更改
structstudent//定义学生信息结构体数组
{
charnum[9];//学号
charname[20];//姓名
chardepar[15];//院系
charzhuanye[15];//专业
charclasses[5];//班级
charage[3];//年龄
charsex[4];//性别
charnation[5];//民族
charbirth[9];//出生日期
charadd[10];//籍贯
};
//从文件读入数据
intread_file(structstudentstu[])
{
FILE*sp;
inti=0;
system("cls");
if((sp=fopen("学生学籍管理系统__学生信息.txt","rt"))==NULL)//读文件,若文件不存在,则需要创建一个新的文件(文件创建在save_file函数中完成)
{
printf("\n学生学籍管理系统__学生信息文件不存在,请创建!
\n");
getch();
system("cls");
return0;
}
while((fread(&stu[i],sizeof(structstudent),1,sp))==1)//判断文件是否处在结束位置
{
if(stu[i].num==0)//若文件内容为空,则跳出循环
break;
else//若文件内容不为空,i自加1。
i++;//i为文件内结构体数组的数量
}
fclose(sp);
returni;//返回i值,代表文件中学生的人数
}
//保存学生信息(保存在文件中)
voidsave_file(structstudentstu[],intsum)
{
FILE*sp;
inti;
if((sp=fopen("学生学籍管理系统__学生信息.txt","wb"))==NULL)//若不存在此TXT文档,则创建;
{
printf("读文件错误!
\n");//创建不成功,返回menu函数;
return;
}
for(i=0;iif(fwrite(&stu[i],sizeof(structstudent),1,sp)!
=1)//保存文件,sum为现有总学生人数,若未保存成功,提示"写文件错误!
";
printf("写文件错误!
\n");
fclose(sp);
return;
}
//创建并录入信息
intfound(structstudentstu[])
{
inti=0,x;
system("cls");
printf("请输入要录入的学生的个数:
\n");
scanf("%d",&x);
if(x==0)
return0;
do//输入信息
{
printf("\n请录入第%d个学生的信息:
\n",i+1);
printf("请录入学号:
");
scanf("%s",stu[i].num);
printf("\n请录入姓名:
");
scanf("%s",stu[i].name);
printf("\n请录入院系:
");
scanf("%s",stu[i].depar);
printf("\n请录入专业:
");
scanf("%s",stu[i].zhuanye);
printf("\n请录入班级:
");
scanf("%s",stu[i].classes);
printf("\n请录入性别:
");
scanf("%s",stu[i].sex);
printf("\n请录入年龄:
");
scanf("%s",stu[i].age);
printf("\n请录入出生日期(yyyymmdd):
");
scanf("%s",stu[i].birth);
printf("\n请录入民族:
");
scanf("%s",stu[i].nation);
printf("\n请录入籍贯:
");
scanf("%s",stu[i].add);
i++;
system("cls");
}while(i=x(用户要求创建学生的人数)时,跳出输入信息的for循环;
save_file(stu,x);//保存学生信息致文件
printf("录入完毕,请按任意键返回");
getch();
returni;//返回创建学生的人数
}
//修改学生信息
voidmodify(structstudentstu[],intsum)
{
inti,item,a=1;//i控制数组下标,item控制子菜单的选择
chars1[8];
FILE*sp;
system("cls");
do
{
printf("\n\n\n请输入你要修改的学号:
\n");
scanf("%s",s1);//要修改的学生学号
for(i=0;i{
if(strcmp(stu[i].num,s1)==0)//若找到该生,输出该生的信息
{
printf("该学生学号:
%s\n",stu[i].num);
printf("该学生姓名:
%s\n",stu[i].name);
printf("该学生院系:
%s\n",stu[i].depar);
printf("该学生专业:
%s\n",stu[i].zhuanye);
printf("该学生班级:
%s\n",stu[i].classes);
printf("该学生性别:
%s\n",stu[i].sex);
printf("该学生年龄:
%s\n",stu[i].age);
printf("该学生出生日期:
%s\n",stu[i].birth);
printf("该学生民族:
%s\n",stu[i].nation);
printf("该学生籍贯:
%s\n",stu[i].add);
a=0;//找到该生,a=0;
break;//出for循环
}
}
if(a==1)//若没有找到该生,a=1,输出提示语句
printf("\n\n该学号不存在!
请重新输入学号:
\n");
}while(a);//当a=0,即没有找到该生,则继续循环重新输入学生学号
printf("\t****************\n");
printf("\t你选择你要修改的选项:
\n");
printf("\t1.*修改姓名\n");
printf("\t2.*修改年龄\n");
printf("\t3.*修改性别\n");
printf("\t4.*修改出生日期\n");
printf("\t5.*修改籍贯\n");
printf("\t6.*修改院系名称\n");
printf("\t7.*修改专业名称\n");
printf("\t8.*修改班级\n");
printf("\t9.*修改民族\n");
printf("\t0.*退出菜单\n");
printf("\t****************\n");
while
(1)
{
printf("\n\t请选择你要进行的操作:
");
scanf("%d",&item);///item控制子菜单的选择
switch(item)
{
case1:
//修改姓名
printf("\t请输入新的姓名:
");
scanf("%s",stu[i].name);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case2:
//修改年龄
printf("\t请输入新的年龄:
");
scanf("%s",stu[i].age);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case3:
//修改性别
printf("\t请输入新的性别:
");
scanf("%s",stu[i].sex);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case4:
//修改出生日期
printf("\t请输入新的出生年月(yyyy.mm):
");
scanf("%s",stu[i].birth);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case5:
//修改籍贯
printf("\t请输入新的籍贯:
");
scanf("%s",stu[i].add);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case6:
//修改院系
printf("\t请输入新的院系:
");
scanf("%s",stu[i].depar);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case7:
//修改专业
printf("\t请输入新的专业名称:
");
scanf("%s",stu[i].zhuanye);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case8:
//修改班级
printf("\t请输入新的班级:
");
scanf("%s",stu[i].classes);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case9:
//修改民族
printf("\t请输入新的民族名称:
");
scanf("%s",stu[i].nation);
printf("\n\n\n修改成功!
\n");
save_file(stu,sum);
break;
case0:
return;//不修改,退出
default:
printf("\t请在0到9之间选择:
");//若输入的值不在0~9,则提示
}
}
}
//查询学生信息
voidseek(structstudentstu[],intsum)
{
inti,item,flag;//i控制数组下标,item控制子菜单的选择,flag为判断条件
chars1[11];
system("cls");
while
(1)
{
system("cls");
printf("\n\n\t\t------------------\n");
printf("\t\t1.按学号查询\n");
printf("\t\t2.按姓名查询\n");
printf("\t\t3.退出本菜单\n");
printf("\t\t------------------\n");
printf("\t\t请选择子菜单编号:
");
scanf("%d",&item);//选择子菜单
flag=0;
switch(item)
{
case1:
//按学号进行查找
printf("\t\t请输入要查询的学生的学号:
");
scanf("%s",s1);
for(i=0;iif(strcmp(stu[i].num,s1)==0)//判断学号是否存在
{//输出
flag=1;
printf("该学生学号:
%s\n",stu[i].num);
printf("该学生姓名:
%s\n",stu[i].name);
printf("该学生院系:
%s\n",stu[i].depar);
printf("该学生专业:
%s\n",stu[i].zhuanye);
printf("该学生班级:
%s\n",stu[i].classes);
printf("该学生性别:
%s\n",stu[i].sex);
printf("该学生年龄:
%s\n",stu[i].age);
printf("该学生出生日期:
%s\n",stu[i].birth);
printf("该学生民族:
%s\n",stu[i].nation);
printf("该学生籍贯:
%s\n",stu[i].add);
getch();
}
if(flag==0)//当上一个if条件不成立,flag=0,学生学号不存在,输出提示;
printf("\n\n\n\t\t该学号不存在!
\n");
getch();break;
case2:
//按姓名进行查找
printf("\n\n\t\t请输入要查询的学生的姓名:
");
scanf("%s",s1);
for(i=0;iif(strcmp(stu[i].name,s1)==0)//判断姓名是否存在
{//输出
flag=1;
printf("该学生学号:
%s\n",stu[i].num);
printf("该学生姓名:
%s\n",stu[i].name);
printf("该学生院系:
%s\n",stu[i].depar);
printf("该学生专业:
%s\n",stu[i].zhuanye);
printf("该学生班级:
%s\n",stu[i].classes);
printf("该学生性别:
%s\n",stu[i].sex);
printf("该学生年龄:
%s\n",stu[i].age);
printf("该学生出生日期:
%s\n",stu[i].birth);
printf("该学生民族:
%s\n",stu[i].nation);
printf("该学生籍贯:
%s\n",stu[i].add);
getch();
}
if(flag==0)//当上一个if条件不成立,flag