学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(20页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统
实训报告
题目:
宿舍信息管理系统
院系:
信息科技学院
专业:
通信工程
姓名:
周士杰
学号:
1051100214
指导教师:
刘欣
日期:
2011年9月09日
桂林电子科技大学信息科技学院
目录
1.问题定义………………………………………………………………………………….………………………………….3
2.程序设计………………………………………………………………………………….………………………………….3
2.1总体设计………………………………………………………………………………………………………………………3
2.2详细设计………………………………………………………………………………………………………………………3
2.2.1主界面…………………………………………………………………………..….…………………………………….3
2.2.2主程序…………………………………………………………………………..….…………………………………….4
2.2.3结构体……………………………………………………………………………..….………………………………….5
2.2.4前定义函数…………………………………………………………………….…..…………………………………5
2.2.5输入记录模块……………………………………………………………….……..…………………………………6
2.2.6修改记录模块……………………………………………………………….……..…………………………………7
2.2.7删除记录模块…………………………………………………………….………..…………………………………9
2.2.8查询记录模块……………………………………………………………..………………………………………13
2.2.9排序模块……………………………………………………………………..……………………………………….14
2.2.10退出模块……………………………………………………………….….………………………………………..16
3.主要函数分析………………………………………………………………………..…………………..................16
3.1主要函数…………………………………………………………………………………………………………………….16
3.2swich()函数…………………………………………………………………………………………………………………16
3.3strut()函数…………………………………………………………………………..……………………………………..16
3.4while()函数…………………………………………………………………………………………………………………17
4.函数调试………………………………………………………………………………………………………………….17
4.1输入调试……………………………………………………………………………………………………….…….…….17
4.2修改调试………………………………………………………………………………………………………….….…….18
4.3查询调试…………………………………………………………………………………………………………….……..19
4.4排序调试……………………………………………………………………………………………………………….…..19
4.5删除调试……………………………………………………………………………………………………………………20
4.6退出调试……………………………………………………………………………………………………………………21
5.总结………………………………………………………………………………………………………………………….21
学生成绩管理系统
1.问题定义
以数组结构为主体设计一个学生成绩管理系统。
假设系统只包括学生学号、姓名、数学成绩、英语成绩、计算机成绩、平均成绩。
程序主界面如图2.1所示,编译过程将这些假设依依实行。
下面将详细介绍程序编译过程以及程序源代码等。
2.程序设计
2.1总体设计
本成绩管理系统采用数组结构,由于不涉及链表和文件系统,程序存在相应弊端性,暂不支持文件录入与保存功能。
本程序写入6个模块,分别是增加学生记录、修改学生记录、删除学生记录、查询学生记录、按平均成绩排序和退出系统。
✧增加学生记录:
此模块将写入学生学号、姓名、数学成绩、英语成绩、C语言成绩,同时系统内部计算出该学生平均成绩。
✧修改学生记录:
此模块可以按学号修改该生写入的信息。
由于时间与技术问题,暂时只支持以学号方式修改学生信息。
✧删除学生记录:
此模块根据使用者要求删除某学生信息。
✧查询学生记录:
此模块将列出输入学生的信息,包括学号、姓名、3科成绩和平均分。
由于时间与技术问题,暂时只支持以姓名方式查询具体学生信息。
✧按平均分排序:
此模块将输入的学生信息按照平均分高低重新排序学生位置。
✧退出系统:
此模块将以正常方式关闭程序。
2.2详细设计
2.2.1主界面
主界面的设计可谓一个完整程序中最简单的地方,我们所有做的就是尽量美化界面,给使用者一目了然的感觉。
主界面如下图2.1所示,界面设计源程序如下:
printf("\n≡≡≡≡≡≡≡≡≡≡≡≡≡学生成绩管理系统≡≡≡≡≡≡≡≡≡≡≡\n");
printf("\n");
printf("◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎★菜单★◎◎◎◎◎◎◎◎◎◎◎◎◎\n");
printf("◎√1.增加学生记录√2.修改学生记录◎\n");
printf("◎◎\n");
printf("◎√3.删除学生记录√4.查询学生记录◎\n");
printf("◎◎\n");
printf("◎√5.按平均分排序√6.退出系统◎\n");
printf("◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎\n");
printf("\n⌒∶⌒选择菜单内数字(1-6)进入系统⌒∶⌒\n");
图2.1学生成绩系统成绩系统主界面
当然有以上还远远不够,因为他还只支持“看”的功能,这时候我们输入1-6数字是不会有任何效果的,于是开始了主程序的编译。
2.2.2主程序
主程序代码如下:
#include/*输入输出函数库*/
#include/*字符串函数库*/
#include/*标准函数库*/
#include/*屏幕操作函数库*/
main()
{
intchoice;
while
(1)
{
/*******************主菜单(前文以列出主菜单界面,此处省略)****************/
scanf("%d",&choice);
getchar();
switch(choice)
{
case1:
Student_Insert();break;
case2:
Student_Modify();break;
case3:
Student_Delete();break;
case4:
Student_Select();break;/***自定义函数***/
case5:
Student_SortByAverage();
Student_Display();break;
case6:
printf("您即将退出系统,欢迎下次访问!
\n按任意键退出\n");exit(0);
}
}
}
2.2.3结构体
由于本程序采用数组结构定义学生成绩等信息,所以开头以structStudent定义学生信息,本段程序包括对学号(ID)、姓名(Name)、成绩(Mark1、2、3分别代表数学、英语、C语言成绩)、平均分(Average):
structStudent
{
charID[20];
charName[20];
floatMark1;
floatMark2;
floatMark3;
floatAverage;
};
/**************************声明学生数组及学生数量*****************************/
structStudentstudents[100];
intnum=0;
2.2.4前定义函数
考虑到以下代码会在模块结构中频繁使用,为增加各个模块的简洁性,于是在前文首先定义以下4各函数:
/*************************************求平均值*******************************/
floatAvg(structStudentstu)
{
return(stu.Mark1+stu.Mark2+stu.Mark3)/3;
}
/***************************通过学号返回数组下标*****************************/
intStudent_SearchByIndex(charid[])
{
inti;
for(i=0;i{
if(strcmp(students[i].ID,id)==0)
{
returni;
}
}
return-1;
}
/****************************通过姓名返回数组下标****************************/
intStudent_SearchByName(charname[])
{
inti;
for(i=0;i{
if(strcmp(students[i].Name,name)==0)
{
returni;
}
}
return-1;
}
/**********************显示单条学生记录********************************/
voidStudent_DisplaySingle(intindex)
{
printf("-------------------------------------------------------------\n");
printf("%8s%8s%8s%8s%8s%10s\n","学号","姓名","数学成绩","英语成绩","C语言成绩","平均成绩");
printf("-------------------------------------------------------------\n");
printf("%6s%9s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name,
students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index].Average);
printf("-------------------------------------------------------------\n");
}
4个函数将在后文各模块中使用。
2.2.5输入记录模块
此模块由使用者写入学生信息,源代码如下:
/************************输入学生信息******************************/
voidStudent_Insert()
{
while
(1)
{
printf("请输入学号:
");
scanf("%s",&students[num].ID);
getchar();
printf("请输入姓名:
");
scanf("%s",&students[num].Name);
getchar();
printf("请输入数学成绩:
");
scanf("%f",&students[num].Mark1);
getchar();
printf("请输入英语成绩:
");
scanf("%f",&students[num].Mark2);
getchar();
printf("请输入C语言成绩:
");
scanf("%f",&students[num].Mark3);
getchar();
students[num].Average=Avg(students[num]);
num++;
printf("是否继续?
(y/n)");
if(getchar()=='n')
{
break;
}
}
}
以上输入模块将由使用者输入学生学号、姓名、3科成绩,当输入完成后,“printf("是否继续?
(y/n)");”代码将询问使用者是否继续输入,输入学生上限由定义的学生数量100决定。
2.2.6修改记录模块
此模块可以修改学生写入的信息,以便更改输入错误:
/***************************修改学生信息*****************************/
voidStudent_Modify()
{
floatmark1,mark2,mark3;
while
(1)
{
charid[20];
intindex;
printf("请输入要修改的学生的学号:
");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);/*****2.2.4前定义函数在此运用******/
if(index==-1)
{
printf("学生不存在!
\n");
}
else
{
printf("你要修改的学生信息为:
\n");
Student_DisplaySingle(index);/****2.2.4前定义函数在此引用***/
printf("--请输入新值--\n");
printf("请输入学号:
");
scanf("%s",&students[index].ID);
getchar();
printf("请输入姓名:
");
scanf("%s",&students[index].Name);
getchar();
printf("请输入数学成绩:
");
scanf("%f",&students[index].Mark1);
getchar();
printf("请输入英语成绩:
");
scanf("%f",&students[index].Mark2);
getchar();
printf("请输入C语言成绩:
");
scanf("%f",&students[index].Mark3);
getchar();
students[index].Average=Avg(students[index]);
}
printf("是否继续?
(y/n)");
if(getchar()=='n')
{
break;
}
}
}
可以看出,此模块已经运用到2.2.4设计的前定义函数,本模块是根据使用者按照提示输入学生学号来一步步修改学生信息的。
2.2.7删除记录模块
此模块根据使用者要求按照学号来删除学生信息,代码如下
:
/***************************删除学生信息******************************/
voidStudent_Delete()
{
inti;
while
(1)
{
charid[20];
intindex;
printf("请输入要删除的学生的学号:
");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);/***在此运用前定义函数***/
if(index==-1)
{
printf("输入错误,该学生不存在!
\n");
}
else
{
printf("你要删除的学生信息为:
\n");
Student_DisplaySingle(index);/***在此引用前定义函数***/
printf("是否真的要删除?
(y/n)");
if(getchar()=='y')
{
for(i=index;i{
students[i]=students[i+1];
}
num--;
}
getchar();
}
printf("是否继续?
(y/n)");
if(getchar()=='n')
{
break;
}
}
}
可以看出前定义函数的重要性,在自定义函数之前写入前定义函数大大减轻了后文繁复使用代码和调试的弊端。
2.2.8查询记录模块
此模块主要是查询功能的实现,由于时间与经验不足,暂时只支持输入姓名查询成绩功能,代码如下:
/******************************按姓名查询*********************************/
voidStudent_Select()
{
while
(1)
{
charname[20];
intindex;
printf("请输入要查询的学生的姓名:
");
scanf("%s",&name);
getchar();
index=Student_SearchByName(name);/*运用前定义的名字返回下标函数*/
if(index==-1)
{
printf("输入错误,该学生不存在!
\n");
}
else
{
printf("你要查询的学生信息为:
\n");
Student_DisplaySingle(index);/***在此引用前定义函数***/
}
printf("是否继续?
(y/n)");
if(getchar()=='n')
{
break;
}
}
}
2.2.9排序模块
由于查询模块只实行单人信息查询,于是加入排序模块查看所有输入学生信息功能。
当然本排序模块暂时只支持按平均成绩的高低排序,代码如下:
/*****************按平均值排序******************************/
voidStudent_SortByAverage()
{
inti,j;
structStudenttmp;
for(i=0;i{
for(j=1;j{
if(students[j-1].Average{
tmp=students[j-1];
students[j-1]=students[j];
students[j]=tmp;
}
}
}
}
/**************************显示学生信息********************************/
voidStudent_Display()
{
inti;
printf("-------------------------------------------------------------\n");
printf("%8s%8s%8s%8s%8s%10s\n","学号","姓名","数学成绩","英语成绩","C语言成绩","平均成绩");
printf("-------------------------------------------------------------\n");
for(i=0;i{
printf("%6s%9s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average);
}
printf("-------------------------------------------------------------\n");
}
可以很明显的看出,本排序模块由两个独立程序段组成,一个是按平均成绩排序,另一个是显示信息。
二者结合,使用者将可以清晰的查看学生平均成绩和高低排名。
2.2.10退出模块
为保证系统的正常,使用者可以有此模块安全正常的退出系统,而“printf("您即将退出系统,欢迎下次访问!
\n按任意键退出\n");”即实现退出温馨提示功能。
3.主要函数分析
3.1主要函数
函数是程序的灵魂,本程序在主程序段运用到main()函数以及模块函数Student_Insert()、Student_Modify()、Student_Delete()、Student_Select()、Student_Display()和前定义函数Student_SearchByName、Student_SearchByIndex、Student_DisplaySingle。
3.2swich()函数
switch(choice)
{
case1:
Student_Insert();break;
case2:
Student_Modify();break;
case3:
Student_Delete();break;
case4:
Student_Select();break;
case5:
Student_SortByAverage();
Student_Display();break;
case6:
printf("您即将退出系统,欢迎下次访问!
\n按任意键退出\n");exit(0);
}
swich()函数的运用,以便在主界面菜单当使用者输入相应数字后进入下一步操作。
3.3strut()函数
structStudent
{
charID[20];
charName[20];
floatMark1;
floatMark2;
floatMark3;
floatAverage;
}
structStudentstudents[100];
intnum=0;
数组编译结构中的strut()函数用于定义学生的信息,包括各种信息的定义。
为了方便简化程序,只定于学生的学号、姓名和3科成绩。
3.4while()函数
while()函数在本程序中于各段代码中都有运用,主要实现死循环的操作,直到使用者停止录入或达到定义上限为止。