《学生管理系统》课程设计报告.docx
《《学生管理系统》课程设计报告.docx》由会员分享,可在线阅读,更多相关《《学生管理系统》课程设计报告.docx(26页珍藏版)》请在冰豆网上搜索。
![《学生管理系统》课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/4/75d8f5bd-0d5f-42c4-bc54-c96242a3243b/75d8f5bd-0d5f-42c4-bc54-c96242a3243b1.gif)
《学生管理系统》课程设计报告
工业大学
课程设计任务书
2012—2013学年第一学期
计算机与通信学院(系、部)软件工程专业:
夏笑声班级1202
课程名称:
《面向过程程序设计》课程设计
设计题目:
《学生信息管理系统》
完成期限:
自2012年12月26日至2012年12月28日共三天
容
与
任
务
用C语言设计一个学生信息管理系统软件,要现以下功能:
1.建立文件功能
Ø可以使用默认文件名,或制定文件名将记录存储到文件
Ø文件保存成功要有提示
Ø初次使用可以新建一个保存文件
2.录入学生信息功能
Ø可以随时录入制定人数信息的功能
3.查询功能
Ø可以通过输入学号查询制定学生信息功能
Ø可以通过输入查询制定学生信息功能
4.删除记录功能
可以通过学生的或学号信息删除学生的信息
5.修改记录功能
可以通过学生的或学号信息修改任意一项指定的信息
6.按总分排序功能
可以按照学生的总分成绩排好序将所有学生的信息显示出来
7.退出
可以在程序运行时很方便地退出程序
进
度
安
排
起止日期
工作容
第1天
程序基本设计思路
第2天
编辑核心代码和程序模块,修改程序,增加部分功能
第3天
再次修改,调试;完成设计文档和课程设计说明书答辩
指导教师(签字):
2012年12月28日
系教研室)主任(签字):
年月日
计算机与通信学院
《面过程程序设计》课程设计
题目《学生信息管理系统》
学号
专业与班级软件工程1202
姓名夏笑声
日期2012/12/28
一、实验目的和要求..........................................................................................4
1、课程设计的目的……………………………………………………………4
2、课程设计的要求……………………………………………………………4
二、设计方案....................................................................................................4
1、总体设计..........................................................................................................4
2、系统流程图……………………………………………………………......5
3、程序说明书...................................................................................................4三、总结与体会..............................................................................................17
四、参考资料.........................................................................................18
一、实验目的和要求
1、课程设计目的:
1、使学生巩固和加强“C语言程序设计”课程的理论知识。
2、使学生掌握C语言程序设计的方法与编程技巧。
3、进一步理解和运用结构化程序设计的思想和方法。
、
5、初步掌握开发一个小型实用系统的基本方法:
结合实际应用的要求,使课程设计既覆盖知识点,又接近工程的实际需要。
6、培养学生良好的程序设计风格。
、
7、掌握书写程序设计开发文档的能力,使学生学会撰写课程设计报告。
、
8、通过查阅手册和文献资料,。
培养学生独立分析问题和解决问题的能力。
、
9、培养学生的创新能力和创新思维。
2、基本要求:
(1)要求利用结构化程序设计的方法与C语言的编程思想来完成系统设计。
(2)模块化程序设计:
要求在设计过程中,按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用函数的形式来实现。
(3)学生所选课题必须上机通过,并获得满意的结果。
(4)程序书写风格:
锯齿型书写格式。
二、设计方案
1、总体设计
该程序共有6大模块构成,程序的开头首先是一个欢迎界面,欢迎界面的下方有提示信息按回车键继续,这时按下回车键,界面跳转到程序的主界面,各功能菜单项。
此程序一共有六大功能,全部通过定义函数来实现功能。
主要有以下几项基本功能:
1.信息录入功能2.信息查询功能3.删除记录功能4.修改记录功能5.按总分排序输出所有信息功能,6.退出程序功能。
3、程序说明书
此程序在实现功能时采用的方式是编写函数,通过编写的5个函数来实现该程序的五大基本功能。
主要功能有信息录入、信息查询、删除记录、修改指定记录、输出所有学生信息,以与退出程序功能。
首先将一系列头文件包含进来以与定义文件指针和定义了一个结构数组用来存储学生的所有信息,源代码如下:
#include
#include
#include
#include
structnode
{
charid[12];
charname[15];
charfale[4];
intscore[3];
intall;
int_size;
}student[50];
structnode2
{
charid[12];
charname[15];
charfale[4];
charscore[4][4];
charall[4];
};
FILE*fr;
structnode*p=student;
char_class[4][10]={"C语言","大机","高数","英语"};
intnumber;
voidluru();
voidchaxun();
voidshanchu();
voidpaixu();
voidxiugai();
voidmain()
打开程序,首先可以看到的是一个精美的欢迎界面,该界面由如下代码实现:
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf("&$&$&$&&$&$&$&$&$&$&$&$&$&&$&$&$&$&$&$&$$&\n");
printf("&$&$&$&$&&$$&&$&$&$&$&$&$&$&$&$&$&&$&$&$&$\n");
printf("&&****&$\n");
printf("&$********&$\n");
printf("&$**欢迎使用学生管理系统**&$\n");
printf("&$&$\n");
printf("&$***制作人:
夏笑声********&$\n");
printf("&&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$$&$&$&$&$&$\n");
printf("&$&$&$&$&$&$$&$&$&$&$&$&$&$&$&&$&$&$&$&$&$\n\n\n\n\n\n\n");
printf("\n\n\n\n\n按回车键继续...");
欢迎界面如下图所示:
同时,在屏幕的左下方有按回车键继续的提示信息,这时按一下回车键,由欢迎界面跳转到程序的主功能菜单界面,菜单由switch语句实现,如下:
printf("请选择功能:
\n");
printf("信息录入请按1!
\n");
printf("信息查询请按2!
\n");
printf("删除记录请按3!
\n");
printf("修改记录请按4!
\n");
printf("按总分排序输出所有信息请按5!
\n");
printf("按0或其它任意键退出...\n");
这时,我们在菜单的最上方可以看到一条警示信息,“注意:
在第一次使用本软件之前,必须先建立一个存储文件”,这是因为此程序需要一个文件来将所有学生的各项信息存储在外存中,只有这样才能使已经记录的信息能够永久保存。
这项功能我采用的是用“w+”的方式打开文件,之所以这样设计,是因为用“w+”的方式打开文件使程序获得的一个额外功能,当按下“8”键的时候,可以将所有已经保存的记录全部清楚掉,即初始化记录功能,这样就做到了一举两得了。
接下来介绍的是程序的信息录入功能。
在设计信息录入功能时,我也遇到了不少的问题,其中最大的一个问题就是关于如何将要存储的程序写入文件,很显然,如果将输入的信息一股脑的写入文件的话,后果将是非常严重的,因为写入的信息始终是要读出来的,而如果随意地写进去的话,在读取信息的时候,读取信息的位置指针将无法定位,因为写入的时候没有按照一定的规律。
对于这个问题,我采用的解决办法的将所有学生的信息采用一定的格式写入文件,学号统一采用11位数字的格式,统一采用占6各字节的格式,性别采用两个字节也就是一个中文字符的格式,后面是各科分数,全部采用占3个字节的格式,这样采用一种统一的格式将学生的信息按照顺序一个接着一个写入文件。
源代码如下:
for(i=0;i<_n1;i++)
{
printf("请输入第%d位学生的学号,按0退出此次录入!
:
\n",i+1);
scanf("%s",p[number].id);
getchar();//用于吃掉回车符
if(!
(strcmp(p[number].id,_cheshi5)))//设置中途退出功能(如果中途不想继续输入的话)
{
fclose(fr);//此句用来控制当中途退出时能将已输入的信息与时存到外存中
break;
}
if(strlen(p[number].id)!
=11)
{
printf("输入的学号有误!
学号为标准的11位数,请重新输入:
\n");
i--;
continue;
}
else
{
fprintf(fr,"%s",p[number].id);
loop2:
printf("请输入第%d位学生的(仅支持中文):
\n",i+1);
gets(p[number].name);
if(strlen(p[number].name)==0||strlen(p[number].name)>6)
{
printf("长度不符合要求,请重新输入!
\n");
gotoloop2;
}
fprintf(fr,"%s",p[number].name);
a1=strlen(p[number].name);
a2=3-(a1/2);
for(b2=1;b2<=a2;b2++)
fprintf(fr," ");//在不足三个字的后用空格补齐
loop7:
printf("请输入性别:
\n");
gets(p[number].fale);
if(strlen(p[number].fale)!
=2)
{
printf("性别输入有误,请重新输入!
\n");
gotoloop7;
}
elsefprintf(fr,"%2s",p[number].fale);
p[number].all=0;//将总分初始化
for(j=0;j<4;j++)
{
printf("请输入第%d位学生的%s成绩:
\n",i+1,_class[j]);
scanf("%s",x[j]);
fprintf(fr,"%-3s",x[j]);
}
_x1=atoi(x[1]);
_x2=atoi(x[2]);
_x3=atoi(x[3]);
_x4=atoi(x[4]);
_x5=_x1+_x2+_x3+_x4;
fprintf(fr,"%-3d",_x5);
printf("第%d位学生的信息输入成功!
\n",i+1);
}
}
fclose(fr);
printf("录入结束,按回车回主菜单!
\n");
getchar();
getchar();
system("cls");
}
else
{
printf("\a");
printf("超出最大人数,请重新输入!
\n");
}
在读取文件时位置指针移动的问题就解决啦。
其次是,在信息存储的过程中,我还考虑到了使用者在使用时可能遇到的尽可能多的问题,如若输入的学号小于11位,便会有输入错误提醒,还有一个非常使用的是当使用着在进行信息录入的过程中,可以随时地退出该功能,在录入成功后会有录入成功的提示信息。
并且,为了使程序在使用时不会显得过于呆板,我还在警示信息显示的同时加入了声音警示的功能,如学号输入错误不仅有文字提示而且有声音提示,printf("\a");这样使程序看起来显得更加人性化。
程序的第二个功能是信息查询功能。
很显然,没有查询的功能,写得再好的录入功能也相当于白写。
进入信息查询功能的菜单键是2数字键,进入该功能后会有提示输入要查询的学生的学号或,在设计该查询功能时,我采用的是strcmp函数来比较字符串的方式,来将输入的要查询的字符与文件中当前有的各信息一一匹配,当找到相同的学号或时,立即退出匹配的循环。
源代码如下:
for(i=0;i<50;i++)//将所有学生的学生跟已经录入的学号配对
{
fscanf(fr,"%11s",_id);
fscanf(fr,"%6s",_name);
if((!
strcmp(shuru,_id))||(!
strcmp(shuru,_name)))
{
printf("学号:
%s\n",_id);
printf(":
%s\n",_name);
fscanf(fr,"%2s",_fale);
printf("性别:
%2s\n",_fale);
for(j=0;j<4;j++)
{
fscanf(fr,"%3s",fen);
printf("%s的成绩为:
%s\n",_class[j],fen);
}
fscanf(fr,"%3s",_all);
printf("总分:
%3s\n",_all);
zhuangtai=0;
//标记说明已查找到记录
break;
}
else
{
fseek(fr,16,1);
//将光标移到下一次要配对的前一个,以测定该信息是否为最后一条
cheshi=fgetc(fr);
if(cheshi==EOF)
break;
}
}
if(zhuangtai)
{
printf("\a");
printf("不存在该学号的学生!
\n");
}
fclose(fr);
printf("按回车键回主菜单...\n");
getchar();
getchar();
system("cls");
}
查询的界面如下:
这样写有一个好处就是使查询所要提供的信息不仅仅局限于或着是学号,这样就更方便使用者的需要。
若查到结果则在屏幕上显示已查到的结果:
for(i=0;i<50;i++)//将所有学生的学生跟已经录入的学号配对
{
fscanf(fr,"%11s",_id);
fscanf(fr,"%6s",_name);
if((!
strcmp(shuru,_id))||(!
strcmp(shuru,_name)))
{
printf("学号:
%s\n",_id);
printf(":
%s\n",_name);
fscanf(fr,"%2s",_fale);
printf("性别:
%2s\n",_fale);
for(j=0;j<4;j++)
{
fscanf(fr,"%3s",fen);
printf("%s的成绩为:
%s\n",_class[j],fen);
}
fscanf(fr,"%3s",_all);
printf("总分:
%3s\n",_all);
zhuangtai=0;
//标记说明已查找到记录
break;
}
else
{
fseek(fr,16,1);
//将光标移到下一次要配对的前一个,以测定该信息是否为最后一条
cheshi=fgetc(fr);
if(cheshi==EOF)
break;
}
}
同样,在设计此功能时,我也考虑到了查询信息不存在的问题,当使用者输入的要查询的信息不存在时,会有文字和声音提示“未找到要查询的记录”,而且,在执行此功能的过程中,也设置了随时退出查询的功能。
功能界面如下:
接下来介绍的是删除记录功能。
同样,删除记录功能也是非常需要的,当某个学生的信息不再需要时,如果继续保存,将使学生的信息管理变得越来越复杂,因此,删除多余的记录是非常有必要的。
删除功能的界面如下:
在查找要删除记录的位置时,我采用的方式是先将所有信息先存入一个结构数组,源代码如下:
for(i=0;i<50;i++)//先将所有信息读入一个结构数组
{
_cheshi4=fgetc(fr);
if(_cheshi4==EOF)
break;
else
fseek(fr,-1,1);
fscanf(fr,"%11s",student5[i].id);
fscanf(fr,"%6s",student5[i].name);
fscanf(fr,"%2s",student5[i].fale);
fscanf(fr,"%3s",&student5[i].score[0]);
fscanf(fr,"%3s",&student5[i].score[1]);
fscanf(fr,"%3s",&student5[i].score[2]);
fscanf(fr,"%3s",&student5[i].score[3]);
fscanf(fr,"%3s",&student5[i].all);
}
至于查找要删除信息的位置跟信息查询功能查找的方式是一样的,即将所输入的学号或跟已存在的信息一一匹配,当找到要删除的记录时,立即退出匹配的循环。
源代码如下:
for(j2=0;j2
{
if(!
strcmp(_shuru2,student5[j2].id)||!
strcmp(_shuru2,student5[j2].name))
_biaoji=j2;
}
而且还增加了删除记录未找到的反应机制
if(_biaoji==51)
{
printf("\a");
printf("未找到要删除的记录!
\n");
}
程序的第四大功能是修改记录功能。
设计此功能的目的是考虑到当使用者只要修改某个学生的某一项信息但又不想修改其他信息时就可以采用修改记录功能,此功能可以按照使用者的意图选择性的修改学生的某项指定的记录。
这样就比将该学生的记录全部删除然后又重新存进去要方便多了。
首先要输入要删除的学生的或学号,以确定操作对象,代码如下:
printf("请输入要修改信息的学生的或学号!
(按0取消修改)\n");
scanf("%s",_shuru2);
if(strcmp(_cheshi8,_shuru2))//设置退出修改功能
{
fseek(fr,0,0);
for(i=0;i<50;i++)
{
_cheshi1=fgetc(fr);
if(_cheshi1==EOF)
{
printf("\a");
printf("未找到要修改的记录!
\n");
gotoloop8;
}
fseek(fr,-1,1);
fscanf(fr,"%11s",student4.id);
fscanf(fr,"%6s",student4.name);
if((!
strcmp(_shuru2,student4.id))||(!
strcmp(_shuru2,student4.name)))
{
fseek(fr,17,1);
break;
}
else
fseek(fr,17,1);
}
在找到要修改的对象后,就要选择要修改的项目,使用者可以通过选择的方式选择所要修改的项,代码如下:
printf("请选择要修改的项...\n");
printf("修改学号请按1\n");
printf("修改请按2\n");
printf("修改性别请按3\n");
printf("修改分数请按4\n");
scanf("%s",_xiang);
xiang=atoi(_xiang);
switch(xiang)
{
case1:
{
printf("请输入要修改的学号:
\n");
scanf("%s",_xin);
if(strlen(_xin)==11)
strcpy(student4.id,_xin);
else
{
printf("\a");
printf("输入学号有误,学号为11位数,请重新输入!
\n");
gotoloop3;
}
}
break;
case2:
{
loop3:
printf("请输入要修改的(仅支持3个字以中文):
\n");
scanf("%s",_xin);
if(strlen(_xin)==0||strlen(_xin)>6)
{
printf("输入长度不符合要求,请重新输入!
\n");
gotoloop3;
}
strcpy(student4.name,_xin);
}
break;
case3:
loop4:
printf("请输入要修改的性别...\n");
scanf("%s",_xin);
if(strlen(_xin)!
=2)
{
printf("\a");
printf("性别输入有误,请重新输入!
\n");
gotoloop4;
}
else
strcpy(student4.fale,_xin);