学生成绩信息管理系统 课程设计2.docx
《学生成绩信息管理系统 课程设计2.docx》由会员分享,可在线阅读,更多相关《学生成绩信息管理系统 课程设计2.docx(29页珍藏版)》请在冰豆网上搜索。
学生成绩信息管理系统课程设计2
软件设计报告
题目:
学生成绩信息管理系统
院系名称
:
电子信息工程学院
专业名称
:
电子信息工程
班 级
:
电子0902
班内序号
:
学生姓名
:
指导教师
:
时间
:
2010年6月7日至2010年6月18日
一、课程设计目的
1.熟悉C语言程序的编辑、编译链接和运行的过程,至少能够用一种编译器较熟练地编辑、编译及调试程序。
2.掌握C语言数据类型,如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。
3.熟练运用if语句和switch语句以及嵌套应用。
涉及循环调用的,了解并掌握三种控制语句while、do-while和for语句。
4.学习并掌握C语言定义函数的基本方法、声明函数及调用函数的方法和过程。
5.掌握文件和文件指针的概念以及文件的定义方法,认识文件打开、关闭、读、写等文件基本操作函数。
6.掌握结构体类型变量、数组的定义和使用。
7.了解指针和链表的概念,掌握指针的定义和使用指针变量的方法以及链表的正确用法。
灵活使用链表来储存学生信息。
8.掌握数组的定义、引用以及输入输出的方法、通过字符数组存储字符串,进一步使用字符串
二、课程设计内容简介
学生成绩管理主要功能:
(1)能按学期、按班级完成对学生成绩的录入、修改
(2)能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序
(3)能查询学生成绩,不及格科目及学生名单
(4)能按班级输出学生的成绩单
开发工具——VisualC++6.0
运行平台——WindowsXP
三、需求分析
系统功能:
(1)能按学期、按班级完成对学生成绩的录入、修改
(2)能按班级统计学生的成绩,求学生的总分及平均分。
(3)能根据学生的平均成绩进行排序
(4)能查询学生总成绩,平均分
(5)能按学号,姓名输出学生的成绩单
(6)可以保存到文件(附加功能)
(7)可以从文件读入已有的文件(附加功能)
(8)以菜单方式工作
性能描述:
各种功能都可以满足;程序相对较小,因而运行时反应比较迅速,不存在响应不及时地问题。
四、概要设计
1.学生成绩管理系统模块图:
2.程序可以满足以下功能:
1.各模块间通过菜单切换和调用
2.主函数通过调用菜单函数实现对各功能模块的调用,各功能模块间根据需要可相互调用。
3.程序能够保证各模块功能的独立和数据共享。
4.相近功能以级联菜单的形式集成。
五、详细设计
1.主要功能模块的流程图如下:
主函数
定义变量
输入
正确输入
密码
错误
进入界面
重新输入
sum=read_message();
Do循环(choice!
=0)
输入数字(0~5)进行选择
Case1
input_message();break;
Case2
output_message();break;
Case3
insert_message();break;
Case4
del_message();break;
Case5
sort_message();break;
Case6
revise_message();break;
Case7
read_message();break;
Case8
inqure_message();break;
Case9
save_messsage();break;
Case10
Count_message();break;
Case0
Break;
Clrscr();
save_message(sum);
添加信息:
定义变量
Clrscr();
Do循环(flag==1)
输入信息
choice=
'Y'||‘y’
getch();
else
Flag==1;
Flag==0;
查询模块:
定义变量
Clrscr();
循环(choice!
=0)
请选择要查询的序号:
1姓名;2学号
Case1
按姓名查询
Case2
按学号查询
输入
Choice==1||2
数字
Choice==0
继续循环
退出循环
输出模块:
定义变量
clrscr();
Do循环(s[i].num!
=0)
输出信息
i++;
修改模块:
定义变量
Do循环(flag==1)
clrscr();
输入数字(0~8)进行
Case1:
姓名
Case2:
英语
Case3:
数学
Case4:
计算机
Case0:
返回主菜单
重新求总成绩和平均分
choice=
'Y'||‘y’
getch();
else
flag=1;
flag=0;
排序模块:
定义变量
Do循环(choice!
=0)
clrscr();
输入数字(0~6)进行
Case1:
sort_math();break;
case2:
sort_english();break;
Case3:
_computer();break;
Case0:
break;
保存模块
定义变量
(fp=fopen(“student_list.txt”
是
“wb”))==NULL
否
输出文件错误;
return0;
For循环
if(fwrite(&s[i],sizeof
是
(structs_type),1,fp)!
=1)
否
写文件错误
读取模块
定义变量
if((fp=fopen("student_list.txt"
是
"rb"))==NULL)
否
输出文件错误;return
while循环while(feof(fp)!
=1)
if(s[i].num==0)
是
否
break;
elsei++;
fclose(fp);
2.主要函数说明:
mangercode_message()
类型void
密码模块只有密码正确才可打开,以便使用者保护所存储的信息。
read_message()
类型void
读取模块可以将所处出的信息读取出来,方便使用。
save_message()
类型void
保存模块可将所输入的信息以文件形式保存起来,具体输入信息会以txt格式保存。
input_message()
类型void
录入模块以键盘形式输入学生的成绩信息。
output_message()
类型void
浏览模块将所输入的学生信息打印输出,出现在显示器上。
inqure_message()
类型void
查询模块可按学生学号和学生姓名查询学生成绩
insert_message()
类型void
添加模块可随时添加一名学生信息。
del_message()
类型void
删除模块可按学号删除其中一名学生的所有成绩信息。
sort_message()
类型void
排序模块可将录入的学生成绩信息按平均分由大到小排序。
revise_message()
类型void
修改模块可读学生的姓名学号及各科成绩进行修改。
count_message()
类型void
统计模块将学生的所有成绩相加,并按总成绩排名。
manger_message()
类型void
管理模块显示该程序的主菜单。
六、调试与测试
1总体过程
编译和调试工具:
选择VisualC++6.0,该工具稳定,其中有一个强大的调试工具,我比较熟悉。
2遇到的问题
在两周的时间里,不断地对程序及各模块进行修改、编译、调试,其间遇到很多问题,这里只选几个有代表性的具体讨论。
(1)调试“创建”模块时,遇到如下的一段程序:
运行中,当输入错误的成绩时,程序可能会进入死循环。
据分析,程序本身并没有错误,但由于涉及指针的操作,所以在运行中出现了未知的错误。
开始时怀疑是程序代码的缺陷,但经过反反复复的分析和调试后确定了原因,……。
通过这一问题的深入研究,使我对C语言的特性有了进一步的了解。
(2)借用了老师所给例子中的一个创建链表函数,与习惯不同的是,该函数是从尾到头来建立的。
与顺序建立的链表相比,在实际运行中并没有多大区别,但不失为一种创新的思路,值得我们学习。
(3)测试用例具有一定的广泛性。
创建链表时输入了不同班级、学期的成绩,而且及格与不及格交叉输入,经过多番调试,运行结果也符合预期。
说明程序具有一定的可靠性和稳定性。
七、出现错误
C:
\DocumentsandSettings\XY\桌面\myprj\3.c(24):
errorC2065:
'student':
undeclaredidentifier
Errorexecutingcl.exe.未声明的标志
c:
\documentsandsettings\xy\桌面\myprj\15.c(36):
warningC4013:
'getch'undefined;assumingexternreturningint‘getch’未定义,假定一个虚伪指令返回整型
c:
\documentsandsettings\xy\桌面\myprj\15.c(50):
fatalerrorC1004:
unexpectedendoffilefound期待的结尾未建立
c:
\documentsandsettings\xy\桌面\myprj\2.c(32):
errorC2143:
syntaxerror:
missing';'before'}'
errorC2447:
missingfunctionheader(old-styleformallist?
)‘}’前缺少‘;’
warningC4060:
switchstatementcontainsno'case'or'default'labelsswitch指令没有包含case和default符号
errorC2043:
illegalbreak非法的‘break’
expectedconstantexpression预期的常量表达式
cannotallocateanarrayofconstantsize0不能分配一个数组的常量0的大小
八、参考文献:
1.王曙燕主编,C语言程序设计,科学出版社,2005年
2.谭浩强,《C程序设计》,清华大学出版社2002年
#include
#include
#include
#include
#defineN10
#defineCODE321
intsum;
voidmangercode_message()/*密码模块*/
{intm;
voidmanger_message();
printf("\n*****请输入一个密码*****\n");
scanf("%d",&m);
switch(m)
{
case321:
printf("\n进入下一菜单\n\n");
manger_message();
default:
printf("\n你不能进入\n");break;
}
printf("\n按任意键返回主菜单\n");
}
structstu_type
{
intnumber;
charname[20];
intmath;
intenglish;
intcomputer;
intscore;
intaverage;
}stu[N];
intread_message()
{
FILE*fp;
inti;
fp=fopen("d:
\\studentscore.txt","rt");
if(fp==NULL)
{
printf("无学生信息,不能读\n");
}
else
{
i=0;
for(;;)
{
if((fread(&stu[i],sizeof(structstu_type),1,fp))!
=1)break;
i++;
}
returni;
fclose(fp);
}
}
voidsave_message()/*保存模块*/
{FILE*fp;
inti;
fp=fopen("d:
\\studentscore.txt","wt+");
if(fp==NULL)
{
printf("不能读\n");
}
for(i=0;i<=sum;i++)
{
fwrite(&stu[i],sizeof(structstu_type),1,fp);
}
fclose(fp);
}
intinput_message()/*录入模块*/
{
inti=0,choice;
do
{
printf("\n\n第%d个学生",i+1);
printf("\n\n学号:
");
scanf("%d",&stu[i].number);
printf("\n\n姓名:
");
getchar();
scanf("%s",stu[i].name);
printf("\n\n数学");
scanf("%d",&stu[i].math);
printf("\n\n英语");
scanf("%d",&stu[i].english);
printf("\n\n计算机");
scanf("%d",&stu[i].computer);
stu[i].score=stu[i].math+stu[i].english+stu[i].computer;
stu[i].average=stu[i].score/3;
printf("\n\n总成绩为:
%d",stu[i].score);
printf("\n\n平均分为:
%d",stu[i].average);
i++;
sum=i;
printf("\n\n是否继续?
(1.是2.否)");
scanf("%d",&choice);
if(choice==1)
printf("\n继续!
");
elsebreak;
}while(choice==1);
printf("\n学生成绩完毕");
printf("\n\n按任意键返回主菜单!
");
getch();
return(--i);
system("cls");
}
voidoutput_message(inti)/*浏览模块*/
{
intj;
printf("\n\n学生成绩表\n");
printf("\n*****************************************************************");
printf("\n\n学号姓名数学英语计算机总成绩平均分");
printf("\n\n-----------------------------------------------------------------");
for(j=0;j<=i;j++)
{
printf("\n\n%d%s%d%d%d%d%d",stu[j].number,stu[j].name,stu[j].math,stu[j].english,stu[j].computer,stu[j].score,stu[j].average);
printf("\n\n");
}
printf("\n*****************************************************************\n");
printf("按任意键返回主菜单!
");
getch();
system("cls");
}
voidinqure_num()/*查询模块*/
{
inti,j=0,inqure_num;
printf("\n输入学生学号:
");
scanf("%d",&inqure_num);
for(i=0;i{
if(stu[i].number==inqure_num)
{
printf("\n该学生信息\n");
printf("\n\n-------------------------------------------------------------------------\n");
printf("\n\n学号--姓名--数学--英语--计算机--总成绩--平均分\n\n");
printf("%3d%8s%5d%7d%8d%10d%14d",stu[i].number,stu[i].name,stu[i].math,stu[i].english,stu[i].computer,stu[i].score,stu[i].average);
printf("\n\n--------------------------------------------------------------------------\n");
}
elsej++;
if(j==N)
printf("\n这个学生不存在!
");
}
printf("\n\n按任意键返回主菜单!
");
getch();
system("cls");
}
voidinqure_name()
{
inti,j=0;
charinqure_name[20];
printf("\n输入学生姓名:
");
scanf("%s",inqure_name);
for(i=0;i{
if(strcmp(stu[i].name,inqure_name)==0)
{
printf("\n该学生信息\n");
printf("\n\n-------------------------------------------------------------------------\n");
printf("\n\n学号--姓名--数学--英语--计算机--总成绩--平均分\n\n");
printf("%3d%8s%5d%7d%8d%10d%14d",stu[i].number,stu[i].name,stu[i].math,stu[i].english,stu[i].computer,stu[i].score,stu[i].average);
printf("\n\n--------------------------------------------------------------------------\n");
}
elsej++;
if(j==N)
printf("\n这个学生不存在!
");
}
printf("\n\n按任意键返回主菜单!
");
getch();
system("cls");
}
voidinqure_message()
{intchoice;
do
{printf("1.按学号查询\n\n");
printf("2.按姓名查询\n\n");
printf("0.退出\n\n");
scanf("%d",&choice);
switch(choice)
{
case1:
inqure_num();break;
case2:
inqure_name();break;
case0:
break;
}
}while(choice!
=0);
}
intinsert_message(inti)/*添加模块*/
{
intchoice;
charflag;
printf("\n\n增加一个学生信息!
");
printf("\n**********************************************************");
do
{i++;
stu[i].number=sum+1;
printf("\n\n新学生的学号");
scanf("%d",&stu[i].number);
printf("\n\n新学生的姓名");
getchar();
scanf("%s",&stu[i].name);
printf("\n\n数学成绩");
scanf("%d",&stu[i].math);
printf("\n\n英语成绩");
scanf("%d",&stu[i].english);
printf("\n\n计算机成绩");
scanf("%d",&stu[i].computer);
stu[i].score=stu[i].math+stu[i].computer+stu[i].english;
stu[i].average=stu[i].score/3;
printf("\n\n总成绩%d",stu[i].score);
printf("\n\n平均分%d",stu[i].average);
sum=i;
printf("\n\n是否继续?
(1.是2.否)");
scanf("%d",&choice);
if(choice==1)
{
printf("\n继续");
flag=1;
}
elseflag=0;
}while(flag==1);
printf("\n按任意键返回主菜单!
");
returni;
system("cls");
}
voiddel_message()/*删除模块*/
{
inti=0,j,choice,del_num;
do
{
printf("\n输入要删除的学号");
scanf("%d",&del_num);
for(i=0;i{if(stu[i].number==del_num)
{
printf("\n\n删除他的信息");
for(j=i;j{stu[j]=stu[j+1];
}
printf("\n\n删除他的信息:
\n");
printf("\n\n学号姓名数学英语计算机总成绩平均分");