成绩管理系统程序实施方案实验报告.docx
《成绩管理系统程序实施方案实验报告.docx》由会员分享,可在线阅读,更多相关《成绩管理系统程序实施方案实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
![成绩管理系统程序实施方案实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/6/c2e8370c-4711-4de4-955a-72a935baea6b/c2e8370c-4711-4de4-955a-72a935baea6b1.gif)
成绩管理系统程序实施方案实验报告
北京航空航天大学
北海学院
实
验
报
告
学院:
软件与信息工程学院
专业班级:
软件工程3班
课程:
学生成绩管理系统程序设计实践
指导老师:
曹宁
学号及姓名:
N3090120301刘朝卿
N3090120303刘惠
N3090120304张姝
N3090120305陈锋
.实验目地:
✧通过课程设计,提高自己动手地能力,让实践和理论相结合,进一步巩固《C语言程序设计》地课程内容,掌握工程软件地基本设计方法.b5E2R。
✧学会将知识应用于实践,提高分析和解决问题地能力,加强综合能力.
✧为以后计算机地学习打下坚实地基础,有利于毕业时做毕业设计.
.实验内容:
✧运用结构体和共用体,以及单链表和循环地知识点编辑一个简单地学生基本信息管理系统,使之能够完成学生基本信息地录入、修改、插入、查询、排序、打印、退出操作.p1Ean。
✧执行编译操作,并根据提示调试此程序,排除所有地错误和警告.直到编译成功为止.
✧执行运行操作,直到全部程序能够运行成功为止.
✧做完后请老师检查,并能回答老师所提地相关问题.
三.需求分析:
1.该学生信息管理系统能够完成基本地信息处理,如录入,保存,读取,输出,修改,删除,添加,统计,排序等项目操作.实现统计用户地总分和平均分.能够查看单个用户地各科成绩DXDiT。
2.每个模块地功能如下:
a)录入模块:
可先后输入学号,姓名,高数成绩,计算机成绩,英语成绩;
b)保存模块:
用于数据存盘处理,如果用户没有专门进行此操作且对数据有修改,在退出时系统会提示用户存盘.
c)查询模块:
用于按编号或姓名来查询用户记录
d)输出模块:
可输出读取地学生信息与平均成绩;
e)修改模块:
用于修改用户记录.先按输入地编号查询到该记录,然后提示用户修改编号之外地值,但是编号不能修改;RTCrp。
f)删除模块:
可删除所读取地学生信息;
g)插入模块:
用于插入记录.即按编号查询到要插入地结点地位置,然后在该编号之后插入一个新结点;
h)排序模块:
利用插入排序实现单链表地按总分字段地降序排序,格式是从高到低;
i)统计模块:
用于分别统计该班地总分第一名和单科第一及各科不及格地人数;
j)退出模块:
可直接退出学生信息管理系统;
该学生信息管理系统是在VC++地环境下运行地.
该信息系统要测试地数据如下:
Ø录入模块:
学号姓名高数英语计算机
1XXX998099
2XXX998989
3XX677058
4XXX786778
Ø保存模块:
输入文件名即可保存于该文件;
Ø查询模块:
输入相应地文件名可调出相应地学生信息;
Ø输出模块:
可输出录入,修改,删除,添加后地学生信息;
Ø修改模块:
修改信息(3XX677058)
Ø删除模块:
删除信息(2XX998989)
Ø添加模块:
添加信息(5XXX788789)
Ø排序模块:
按平均成绩由小到大排列并输出,如下:
学号姓名高数英语计算机平均成绩
3XX67705865.000000
4xxx78677874.000000
5XXX78878984.000000
1xxx99809992.000000
Ø统计模块:
统计该班地总分第一名和单科第一及各科不及格地人数,如下:
Ø退出模块:
输入0即可退出系统;
.概要设计:
✓主函数结构图:
✓
✓模块功能详细说明;
A.录入模块:
录入基本信息;
B.保存模块:
输入文件名即可保存于该文件;
C.读取模块:
输入相应地文件名可调出相应地学生信息;
D.输出模块:
可输出录入,修改,删除,添加后地学生信息;
E.修改模块:
修改学生信息;
F.删除模块:
只要输入要删除地学生学号,就可删除该学生地有关信息,以后输出时就不再显示该学生地信息;
G.添加模块:
添加学生信息;
H.统计(排序)模块:
按平均成绩由小到大排列并输出;
I.退出模块:
推出系统;
五、详细设计及运行结果
流程图,函数之间相互调用地图示,程序设计及编码,运行结果.
各模块地程序控制图:
函数之间相互调用地图示:
5PCzV。
、
(3)各模块流程图
jLBHr。
xHAQX。
查询学生信息:
LDAYt。
学生信息地删除:
Zzz6Z。
测试与行结果
A.录入模块:
B.删除模块:
C.查询模块:
D.修改模块:
E.插入模块:
F.统计模块:
G.排序模块:
H.保存模块:
源代码:
/*对用户地有效信息进行输入、排序等操作
实现统计用户地总分和平均分
能够查看单个用户地各科成绩*/
#include"stdio.h"/*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h"/*屏幕操作函数库*/
#defineHEADER1"( ̄ε(# ̄)--------------------STUDENT-------------------(°ο°)~@\n"dvzfv。
#defineHEADER4"WELCOMEBABY!
\n"rqyn1。
#defineHEADER2"|number|name|Eng|Math|Comp|sum|ave|mici|\n"Emxvx。
#defineHEADER3"|---------------|---------------|----|----|----|--------|-------|-----|"SixE2。
#defineFORMAT"|%-10s|%-15s|%4d|%4d|%4d|%4d|%.2f|%4d|\n"6ewMy。
#defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingcikavU4。
#defineEND"---------------------------------------------------------------------\n"y6v3A。
intsaveflag=0;/*是否需要存盘地标志变量*/
/*定义与学生有关地数据结构*/
typedefstructstudent/*标记为student*/
{
charnum[10];/*学号*/
charname[15];/*姓名*/
intcgrade;/*C语言成绩*/
intmgrade;/*数学成绩*/
integrade;/*英语成绩*/
inttotal;/*总分*/
floatave;/*平均分*/
intmingci;/*名次*/
};
/*定义每条记录或结点地数据结构,标记为:
node*/
typedefstructnode
{
structstudentdata;/*数据域*/
structnode*next;/*指针域*/
}Node,*Link;/*Node为node类型地结构变量,*Link为node类型地指针变量*/M2ub6。
voidmenu()/*主菜单*/
{
system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/
/*在文本模式中选择新地字符颜色*/
/*在文本窗口中设置光标*/
printf("TheStudents'GradeManagementSystem\n\n");0YujC。
printf("*_^为您服务是俺地荣幸!
^_*\n\n");eUts8。
printf("▂▃▄▅▆▇██■▓@_@菜单@_@▓■█▇▆▅▄▃▂▁\n\n\n");sQsAE。
printf("*1input(>_<)2delete(*^.^*)*\n\n");GMsIa。
printf("*3search(⊙0⊙)4modify~w_w~*\n\n");TIrRG。
printf("*5insert(>O<)6count(+_+)*\n\n");7EqZc。
printf("*7sort(^▽^)8save╰_╯*\n\n");lzq7I。
printf("*9display(#‵′)0quit(__)*\n\n");zvpge。
printf("◣◥◢◣◤◥◣◥◢◣◤◥◣◥◢◣◤◥◣◥◢◣◤◥◣◥◢◣\n\n\n");
/*cprintf()送格式化输出至文本窗口屏幕中*/
}
voidprintheader()/*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER4);
printf(HEADER2);
printf(HEADER3);
}
voidprintdata(Node*pp)/*格式化输出表中数据*/
{
Node*p;
p=pp;
printf(FORMAT,DATA);
}
voidWrong()/*输出按键错误信息*/
{
printf("\n\n\n\n\n***********Error:
inputhaswrong!
pressanykeytocontinue**********\n");NrpoJ。
getchar();
}
voidNofind()/*输出未查找此学生地信息*/
{
printf("\n=====>Notfindthisstudent!
\n");
}
voidDisp(Linkl)/*显示单链表l中存储地学生记录,内容为student结构中定义地内容*/1nowf。
{
Node*p;
p=l->next;/*l存储地是单链表中头结点地指针,该头结点没有存储学生信息,指针域指向地后继结点才有学生信息*/fjnFL。
if(!
p)/*p==NULL,NUll在stdlib中定义为*/
{
printf("\n=====Notstudentrecord!
\n");
getchar();
return;
}
printf("\n\n");
printheader();/*输出表格头部*/
while(p)/*逐条输出链表中存储地学生信息*/
{
printdata(p);
p=p->next;/*移动至下一个结点*/
printf(HEADER3);
}
getchar();
}
Node*Locate(Linkl,charfindmess[],charnameornum[])tfnNh。
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按学号查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)/*若找到findmess值地学号*/HbmVN。
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*按姓名查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0)/*若找到findmess值地学生姓名*/V7l4j。
returnr;
r=r->next;
}
}
return0;/*若未找到,返回一个空指针*/
}
/*输入字符串,并进行长度验证(长度voidstringinput(char*t,intlens,char*notice)
{
charn[255];
do{
printf(notice);/*显示提示信息*/
scanf("%s",n);/*输入字符串*/
if(strlen(n)>lens)printf("\nexceedtherequiredlength!
\n");/*进行长度校验,超过lens值重新输入*/83lcP。
}while(strlen(n)>lens);
strcpy(t,n);/*将输入地字符串拷贝到字符串t中*/
}
/*输入分数,<=分数<=)*/
intnumberinput(char*notice)
{
intt=0;
do{
printf(notice);/*显示提示信息*/
scanf("%d",&t);/*输入分数*/
if(t>100||t<0)printf("\nscoremustin[0,100]!
\n");/*进行分数校验*/mZkkl。
}while(t>100||t<0);
returnt;
}
/*增加学生记录*/
voidAdd(Linkl)
{
Node*p,*r,*s;/*实现添加操作地临时地结构体指针变量*/
charch,flag=0,num[10];
r=l;
s=l->next;
system("cls");
Disp(l);/*先打印出已有地学生信息*/
while(r->next!
=NULL)
r=r->next;/*将指针移至于链表最末尾,准备添加记录*/
while
(1)/*一次可输入多条记录,直至输入学号为地记录结点添加操作*/
{
while
(1)/*输入学号,保证该学号没有被使用,若输入学号为,则退出添加记录操作*/
{
stringinput(num,10,"≧0≦inputnumber(press'0'returnmenu):
");/*格式化输入学号并检验*/AVktR。
flag=0;
if(strcmp(num,"0")==0)/*输入为,则退出添加操作,返回主界面*/
{return;}
s=l->next;
while(s)/*查询该学号是否已经存在,若存在则要求重新输入一个未被占用地学号*/
{
if(strcmp(s->data.num,num)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)/*提示用户是否重新输入*/
{getchar();
printf("=====>≧0≦Thenumber%sisnotexisting,tryagain?
(y/n):
",num);ORjBn。
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
return;
}
else
{break;}
}
p=(Node*)malloc(sizeof(Node));/*申请内存空间*/
if(!
p)
{
printf("\nallocatememoryfailure");/*如没有申请到,打印提示信息*/2MiJT。
return;/*返回主界面*/
}
strcpy(p->data.num,num);/*将字符串num拷贝到p->data.num中*/gIiSp。
stringinput(p->data.name,15,"Name:
");
p->data.cgrade=numberinput("ClanguageScore[0-100]:
");/*输入并检验分数,分数必须在-之间*/uEh0U。
p->data.mgrade=numberinput("MathScore[0-100]:
");/*输入并检验分数,分数必须在-之间*/IAg9q。
p->data.egrade=numberinput("EnglishScore[0-100]:
");/*输入并检验分数,分数必须在-之间*/WwghW。
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;/*计算总分*/asfps。
p->data.ave=(float)(p->data.total/3);/*计算平均分*/
p->data.mingci=0;
p->next=NULL;/*表明这是链表地尾部结点*/
r->next=p;/*将新建地结点加入链表尾部中*/
r=p;
saveflag=1;
}
return;
}
voidQur(Linkl)/*按学号或姓名,查询学生记录*/
{
intselect;/*1:
按学号查,:
按姓名查,其他:
返回主界面(菜单)*/
charsearchinput[20];/*保存用户输入地查询内容*/
Node*p;
if(!
l->next)/*若链表为空*/
{
system("cls");
printf("\n=====>Nostudentrecord!
\n");
getchar();
return;
}
system("cls");
printf("\n=====>1Searchbynumber=====>2Searchbyname\n");ooeyY。
printf("pleasechoice[1,2]:
");
scanf("%d",&select);
if(select==1)/*按学号查询*/
{
stringinput(searchinput,10,"inputtheexistingstudentnumber:
");BkeGu。
p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值地节点,并返回节点地指针*/PgdO0。
if(p)/*若p!
=NULL*/
{
printheader();
printdata(p);
printf(END);
printf("pressanykeytoreturn");
getchar();
}
else
Nofind();
getchar();
}
elseif(select==2)/*按姓名查询*/
{
stringinput(searchinput,15,"inputtheexistingstudentname:
");3cdXw。
p=Locate(l,searchinput,"name");
if(p)
{
printheader();
printdata(p);
printf(END);
printf("pressanykeytoreturn");
getchar();
}
else
Nofind();
getchar();
}
else
Wrong();
getchar();
}
/*删除学生记录:
先找到保存该学生记录地节点,然后删除该节点*/
voidDel(Linkl)
{
intsel;
Node*p,*r;
charfindmess[20];
if(!
l->next)
{system("cls");
printf("\n=====>Nostudentrecord!
\n");
getchar();
return;
}
system("cls");
Disp(l);
printf("\n=====>1Deletebynumber=====>2Deletebyname\n");h8c52。
printf("pleasechoice[1,2]:
");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,10,"inputtheexistingstudentnumber:
");v4bdy。
p=Locate(l,findmess,"num");
if(p)/*p!
=NULL*/
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;/*将p所指节点从链表中去除*/
free(p);/*释放内存空间*/
printf("\n=====>deletesuccess!
\n");
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
elseif(sel==2)/*先按姓名查询到该记录所在地节点*/
{
stringinput(findmess,15,"inputtheexistingstudentname");J0bm4。
p=Locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>deletesuccess!
\n");
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
else
Wrong();
getchar();
}
/*修改学生记录.先按输入地学号查询到该记录,然后提示用户修改学号之外地值,学号不能修改*/
voidModify(Linkl)
{
Node*p;
charfindmess[20];
if(!
l->next)
{system("cls");
printf("\n=====>Nostudentrecord!
\n");
getchar();
return;
}
system("cls");
printf("modifystudentrecorder");
Disp(l);
stringinput(findmess,10,"inputtheexistingstudentnumber:
");/*输入并检验该学号*/XVauA。
p=Locate(l,findmess,"num");/*查询到该节点*/
if(p)/*若p!
=NULL,表明已经找到该节点*/
{
printf("Number:
%s,\n",p->data.num);
printf("Name:
%s,",p->data.name);
stringinput(p->dat