资源描述
- .
学籍管理系统
一 、系统简介
设计一个基于构造体数组的学生学籍管理系统,能实现对学生学籍信息进展录入,修改,删除,查询和输出等根本操作。
二、 需求分析
学籍管理系统应该实现以下功能:
1、 能录入学生的根本信息,包括学号,XX,专业,年级,性别和出生日期信息,保存到构造体数组中。
2、 能根据输入的学号查询学生,进展信息的修改。
3、 能根据输入的学号从构造体数组中删除学生的记录。
4、 实现查询功能,能根据输入的学号或年级在屏幕上显示相应的学生信息。
5、 能在屏幕上以列表的方式输出所有学生的信息。
三、 概要设计
1、 系统功能
根据工程的开发要求,本系统划分成六个主要功能模块:录入学生信息模块、修改学生信息模块、删除学生信息模块、查询学生信息模块、输出模块和推出模块。系统功能机构图如下:
学生档案管理系统
删除学生信息
修改学生信息
查询学生信息系统
输出学生信息
退出系统
录入学生信息
按班级 查询
按学号查询
2、 重要数据的数据构造设计
学生学籍的记录项用构造体Stu message表示,包括6个属性,stuno,name、spec、grade、sex、birthday分别代表学生的学号、专业、年级、性别和出生日期,其中birthday类型为自定义的构造体类型Date.
Struct stumessage
{
Char stuno[11]: //学号
Char name[9]: //XX
Char spec[2]: //专业
Char grade: //年级
Char sex: //性别
Stuct date birthday: //出生日期
};
日期类型 date包括三个属性,分别代表年、月、日。
Struct date
{int year : //年
Int month: //月
Int day: //日
};
3、 函数设计
学籍管理系统程序采用了构造化程序设计的思想,由1个.h头文件和3个C源文件组成。程序中除了主函数外,共设计了以下14个函数,分别包含在3个.c源文件中。以下是这些函数原型及功能设计。
(1) void sysinfo(void)
函数功能:在屏幕上输入系统及信息并等待用户响应。
(2) Void menuofmain(struct stumessage stu[]);
函数功能:在屏幕上显示主菜单,接收用户选择并响应用户相应操作。
(3) Void append(struct stumessage stu[]);
函数功能:录入一条学生记录数组的末尾。
(4) void modify〔struct stumessage stu[]〕
函数功能:通过输入学号查询学生相关信息,如果存在在屏幕上输出相应学生记录并通过重新输入学生信息的方法修改该学生的记录,否那么输出没有找到相关记录。;
(5) void Delet(struct stu Message stu[])
函数功能:通过输入学号查询学生的相应记录信息,如果存在在屏幕上输出相应学生记录,用户确认删除后用DelList()否那么输出没有找到相关记录。
(6) Void menuOfsear(struct stumessage stu[]);
函数功能:在屏幕上显示查询了主菜单,承受用户选择并响应用户操作。
(7) void listall(struct stumessage stu[]);
函数功能:在屏幕上以列表的方式输出学生所有信息。调用printhead〔〕输出表头,在调用listone〔〕函数注意输出个条记录。
(8) void quit〔void〕;
函数功能:退出菜单系统,并调用exit(0)系统函数完毕程序运行。
(9) void stear num(struct stumessage stu[]);
函数功能:通过输入学号调用numofsear〔〕函数查询学生的相应的记录信息,如果存在调用printhead〔〕函数和listone〔〕函数在屏幕上输出相应学生记录,否那么输出没有找到相关记录。
(10) voidsteargrade(stuct stumessage stu[]);
函数功能:通过输入年级查询学生的相关记录信息,如果存在在屏幕以列表方式输出相应学生记录,并输出统计满足条件的学生个数,否那么输出没有找到相关记录。
(11) int numofsear(struct stumessage stu[].char stunumber[]);
函数功能:根据接收到的学生学号,在相应记录数组中进展查询,如果存在相应记录,返加相应的数组下标,否那么返回-1.
(12) void printhead〔void〕
函数功能:在屏幕上显示输出列表的表头。
(13) void list one〔struct stumessage list〕;
函数功能:在屏幕上以行的形式显示输出一个学生的相关信息。
(14) int dellist(struct stumessage stu[], int i):
函数功能:如果数组中存在下标为i的记录,删除该记录并返回1,否那么返回0.
4、 小组成员分工
组员1
Main():systeminfo();menuofmain();quit();
组员2
Printhead();listone();listall(0;apend();
组员3
Modify();delte();dellist(0;menuofstear();seranum();seargrade();numofsear();
四、 详细设计
1、 系统主函数main〔〕设计
输出系统及信息
Sysinfo()
开场
显示用户主菜单并响应
用户操作
Menuofmain()
完毕
2、 主菜单模块函数menuofmain()设计
清屏
清屏
开场
Choose!=0
choose
退出系统
输出学生信息
修改学生信息
删除学生信息
查询学生信息
录入学生信息
非法操作
清屏
显示主菜单
接收用户选择
1 2 3 4 5 6 0
Y
N
3、 录入学生信息功能模块函数Append()设计
清屏
返回
Con=='Y'或con=='Y'
承受用户选择
继续录入〔Y/N〕
Length++
录入一条记录
Y
N
4、修改学生信息功能模块函数modify()设计
5、删除学生信息功能模块函数delete()设计
继续删除〔Y/N〕
Length--
--
记录存在
删除〔〕Y/N
删除成功
输出第i条记录
输出表头
没有找到相关记录
查询该学生记录,用i指向它
接收要删除的学号
清屏
Y N
N
Y
Y
返回
N
6. 查询菜单模块函数menuofsear()设计
Choose!=0
按年级查询
非法操作
返回主菜单
按学号查询
choose
接收用户的选择
--
显示查询菜单
--
清屏
--
1 2 0 其他
Y
N
7、 按学号查询功能模块函数searnum()设计
I<length且不 等于学号
清屏
--
接收查询学号--
i=0
i++
--
没有找到相关记录
--
Choose!=0
输入表头
--
输出第i条记录
--
按任意键继续
--
Getch()
--
返回
N
Y
Y N
8、 按年级查询功能模块函数steargrade()设计
Getch()
--
输出表头
--
接收查询年级
--
清屏
--
i=0,count=0
--
I<length
等于年级
输入第i条记录
--
Count++
--
i ++
--
Choose!=0
共找到n条记录
--
没有找到相关记录
--
按任意键继续
--
9、 输出学生信息功能模块函数ListALL〔〕设计;
清屏
--
输入表头
--
i=0
I<length
输出第i条记录
--
i++
--
按任意键继续
--
Getch()
--
五. 调试分析
本系统在VC6下编译调试通过,可顺利运行,各项功能到达设计要求。
本系统程序由一个.h头文件和三个.C源文件构成。系统调试主要在vc6下进展,采用分模块的方法进展编译,即完成一个函数功能模块就编译一个功能模块,最后再进展整体编译并产生可执行文件student.exe。
在调试过程中,主要碰到了以下问题:
1. 在清屏函数在Tc中使用的clrsc()函数,但在vc6中没有该函数也没有相应的函数。查资料,发现在vc中可使用system〔〕函数调用系统实现。
2. 在使用c语言系统函数进展数据输入的时候,发现使用getchar〔0和gets〔0函数输入字符和字符串的时候,系统经常跳过相应的输入语句,无法输入数据。查资料,是c系统的输入处理,缓存问题,解决方法是在进展字符和字符串输入的时候,先使用fflush〔stdin〕函数去除缓存,既可正常输入字符和字符串。
六、 用户手册
本系统是win32控制台程序,可在window和dos环境下运行,执行文件名称:student.exe。
运行程序后,首先显示系统消息和信息,用户按任意键后进展主要功能菜单,在主功能菜单中输入相应的数字可执行相应的程序功能,包括录入学生信息、修改学生信息,删除学生信息和输入所有学生信息,输入4可进展查询子菜单,可进展按学号查询和按年级查询学生信息。在主功能菜单案6可完毕本系统的运行并自动关闭运行窗口。
七、 附录
源程序文件名清单:
Alist.h //公用的常量和类型
Main.c
List.c
Edit.c
源代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct date
{
int year;
int month;
int day;
};
struct StuMessage
{
char stuNo[11];
char name[10];
char spec[21];
int greade;
char sex[10];
struct date birthday;
};
int length=0;
struct StuMessage Stu[100];
int main()
{
char c;
int menuofmain();
int Append(struct StuMessage Stu[100]);
int Modify(struct StuMessage Stu[100]);
int Delete(struct StuMessage Stu[100]);
void Menuofsear(struct StuMessage Stu[100]);
void Listall(struct StuMessage Stu[100]);
int listone(struct StuMessage Stu[100],int i);
system("color 5a");
void SysInfo(void);
{
printf("\n\n\n\t\t\t\t农业大学学籍管理系统\n");
printf("\n\n\n版本信息:\n\n");
printf("\n\tc-free vision5.0\n\n");
printf("\n\t2012--05--28\t\t");
printf("\n\n\t\t\t\t\t\t\t班级:软件1115班\n\n");
printf("\t\t\t\t\t\t\tXX:朱利斌\n\n");
printf("\t\t\t\t\t\t\t指导教师:邓泓\n\n");
printf("\n\n\t\t\t\t enter进入学籍管理系统.........\n");
}
c=getchar();
menuofmain();
}
int menuofmain()
{
int num;
system("cls");
system("color fc");
int Append(struct StuMessage Stu[100]);
int Modify(struct StuMessage Stu[100]);
int Delete(struct StuMessage Stu[100]);
void Menuofsear(struct StuMessage Stu[100]);
void Listall(struct StuMessage Stu[100]);
int listone(struct StuMessage Stu[100],int i);
printf("\n\n\t\t\t农业大学学生档案管理系统\n\n\n");
printf("\t\t\tplease make a choice\n\n\n");
printf("\t\t\t录入学生信息,请选择1\n");
printf("\t\t\t修改学生信息,请选择2\n");
printf("\t\t\t删除学生信息,请选择3\n");
printf("\t\t\t查询学生信息,请选择4\n");
printf("\t\t\t输出学生信息,请选择5\n");
printf("\t\t\t退 出 系 统,请选择6\n");
printf("\n\t\t\t\t\t\t\t\t\t\t\t\t\n");
printf("\n\t\t \n");
printf("请输入编号做出选择:\n");
scanf("%d", &num);
switch(num)
{
case 1:Append(Stu);
break;
case 2:Modify(Stu);
break;
case 3:Delete(Stu);
break;
case 4:Menuofsear(Stu);
break;
case 5:Listall(Stu);
break;
case 6:exit (0);
break;
default:printf("非法操作\n");
break;
}
}
int Append(struct StuMessage Stu[100])
{
system("cls");
char c,ch;
fflush(stdin);
printf("输入第%d个学生的信息。\n",length+1);
printf("第%d个学生的信息\n",length+1);
printf("please input stuNo\n");
scanf("%s",Stu[0].stuNo);
printf("please input name\n");
scanf("%s",Stu[0].name);
printf("please input spec\n");
scanf("%s",Stu[0].spec);
printf("please input greade\n");
scanf("%d",&Stu[0].greade);
printf("please input sex\n");
scanf("%s",Stu[0].sex);
printf("please input birthday\n");
scanf("%d%d%d",&Stu[0].birthday.year,&Stu[0].birthday.month,&Stu[0].birthday.day);
length++;
while(1)
{ c=getchar();
printf("输入y或Y继续输入学生记录\nn或N完毕输入返回主菜单\n");
ch=getchar();
if(ch=='y'||ch=='Y')
{
system("cls");
fflush(stdin);
printf("第%d个学生的信息\n",length+1);
printf("please input stuNo\n");
scanf("%s",Stu[length].stuNo);
printf("please input name\n");
scanf("%s",Stu[length].name);
printf("please input spec\n");
scanf("%s",Stu[length].spec);
printf("please input greade\n");
scanf("%d",&Stu[length].greade);
printf("please input sex\n");
scanf("%s",Stu[length].sex);
printf("please input birthday\n");
scanf("%d%d%d",&Stu[length].birthday.year,&Stu[length].birthday.month,&Stu[length].birthday.day);
length++;
}
else
{
if(ch=='n'||ch=='N')
{
menuofmain();
}
}
}
}
int Modify(struct StuMessage Stu[])
{
system("cls");
int listone(struct StuMessage Stu[],int i);
char ch[100],c;
int i,j=-1;
printf("输入学号进展修改.\n");
gets(ch);
for(i=0;i<length;i++)
{
if((strcmp(ch,Stu[i].stuNo))==0)
{j=i;
listone(Stu,i);}
}
if(j==-1)
{
printf("没有找到相关记录。\n");
Modify(Stu);
}
printf("修改Y,y/N,n.\n");
fflush(stdin);
c=getchar();
if(c=='Y'||c=='y')
{ fflush(stdin);
printf("please input stuNo\n");
scanf("%s",Stu[j].stuNo);
printf("please input name\n");
scanf("%s",Stu[j].name);
printf("please input spec\n");
scanf("%s",Stu[j].spec);
printf("please input greade\n");
scanf("%d",&Stu[j].greade);
printf("please input sex\n");
scanf("%s",Stu[j].sex);
printf("please input birthday\n");
scanf("%d%d%d",&Stu[j].birthday.year,&Stu[j].birthday.month,&Stu[j].birthday.day);
}
else
{
if(c=='N'||c=='n')
menuofmain();
}
printf("是否继续修改是输入y||Y否输入n||N。");
c=getchar();
if(c=='y'||c=='Y')
{
Modify(Stu);
}
else
{
if(c=='n'||c=='N')
menuofmain();
}
}
int Delete(struct StuMessage Stu[])
{
system("cls");
int listone(struct StuMessage Stu[],int i);
char ch[100],c;
int i,j=-1;
printf("输入学号进展删除.\n");
fflush(stdin);
gets(ch);
for(i=0;i<length;i++)
{
if((strcmp(ch,Stu[i].stuNo))==0)
{j=i;
listone(Stu,i);}
}
if(j==-1)
{
printf("没有找到相关记录。\n");
Delete(Stu);
}
printf("删除是Y||y否N||n\n");
fflush(stdin);
c=getchar();
if(c=='Y'||c=='y')
{
for(j;j<length;j++)
{
Stu[j]=Stu[j+1];
}
length--;
}
else
{
menuofmain();
}
printf("继续删除是y||Y否n||N");
fflush(stdin);
c=getchar();
if(c=='y'||c=='Y')
{
Delete(Stu);
}
else
{
if(c=='n'||c=='N')
menuofmain();
}
}
void Menuofsear(struct StuMessage Stu[])
{
system("cls");
char c;
char ch[100];
int a,i,j=0;
int listone(struct StuMessage Stu[],int i);
printf("\t输入0~2进展选择\n");
printf("按学号查询,请选择1\n");
printf("按年级查询,请选择2\n");
printf("返回主菜单,请选择0\n");
fflush(stdin);
c=getchar();
switch(c)
{
case '1':
{
fflush(stdin);
printf("please input stuNo\n");
scanf("%s",&ch);
for(i=0;i<length;i++)
{
if((strcmp(ch,Stu[i].stuNo))==0)
{
j++;
listone(Stu,i);
}
}
if(j==0)
{
printf("没有找到相关记录。\n");
Menuofsear(Stu);
}
break;
}
case '2':
{
fflush(stdin);
printf("please input greade\n");
scanf("%d",&a);
for(i=0;i<length;i++)
{
if(a==Stu[i].greade)
{
j++;
listone(Stu,i);
}
}
if(j==0)
{
printf("没有找到相关记录。\n");
Menuofsear(Stu);
}
break;
}
case '0':
{
menuofmain();
break;
}
default:
{
printf("非法操作");
}
}
printf("继续查询y||Y返回主菜单n||N\n");
fflush(stdin);
c=getchar();
if(c=='y'||c=='Y')
{
Menuofsear(Stu);
}
else
{
main();
}
}
void Listall(struct StuMessage Stu[])
{
system("cls");
int i;
char c;
int listone(struct StuMessage Stu[],int i);
for(i=0;i<length;i++)
{
fflush(stdin);
listone(Stu,i);
}
c=getchar();
menuofmain();
}
int listone(struct StuMessage Stu[100],int i)
{
fflush(stdin);
printf("stuNo:%s,name:%s,spec:%s,greade:%d,sex:%s,birthday:%d %d %d\n",Stu[i].stuNo,Stu[i].name,Stu[i].spec,Stu[i].greade,Stu[i].sex,Stu[i].birthday.year,Stu[i].birthday.month,Stu[i].birthday.day);
}
- . 可修编.
展开阅读全文