C语言学生学习成绩管理系统实验报告Word文档下载推荐.docx
《C语言学生学习成绩管理系统实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C语言学生学习成绩管理系统实验报告Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
大体结构图
2.主程序模块分析
整个系统功能共分八个功能:
1.addstudent
学生信息添加
2。
editstudent学生信息修改3.delstudent信息清单删除4.showstudent学生信息排序5。
findstudent学生成绩查找6。
loadstudent载入文件信息7。
savestudent学生信息保存0。
exit系统退出
以上八个功能就是本系统模块的主要功能,根据需求分析,对其进行功能逻辑设计:
(1)定义数据结构typedefstructstudent{?
?
}stu;
。
以下分别要用到的函数为:
菜单函数voidshowmenu()的函数,定位链表中符合要求的接点stu*Locate(stu*s,charfind[],intk)用于插入和查找功能,删除记录函数statusdelstudent(stu*s),显示所有记录的函数voidshow(stu*s,intk),显示学号对应的姓名voidshowid(stu*s)),排序函数statuslist(stu*s,intk),添加记录函数statusaddstudent(stu*s),查询函数statusfindstudent(stu*s)载入文件信息statusloadstudent(stu*s),保存学生statussavestudent(stu*s),关闭exit(0);
实现可以输入学生的学号、姓名、各科成绩的功能。
首先定义指向结构体的指针,动态申请空间;
用if(k==0)break;
实现当学号首字符为0则结束输入的功能;
在for循环中嵌套while{}{},实现N门课程循环N次和成绩正确输入,接着用到了数据结构的新结点插入的知识。
(3)学生信息删除:
实现输入要删除的学生学号,执行后就可以删除该学生所有信息。
该功能用到statusdelstudent(stu*s)删除记录的函数,先定义p为查找到要删除的结点指针,如果还没信息则显示添加,函数返回到Locate,否则通过while(r->
next!
=p)r=r—>
next;
r—>
next=p-〉next;
free(p);
确定要删除的项目。
(4)学生信息清单显示:
系统显示所有学生的信息情况,包括学生编号、学号、姓名、各科成绩、个人总成绩.这里用到显示函数实现输出链表中结点信息的功能.
(5)学生信息查询:
根据系统提示输入要查找的学生名字或学号回车后,即可以排列的形式显示已找到的学生信息记录,接着自动跳到主菜单。
用到status
findstudent(stu*s)查找函数。
(6)学生成绩计算:
利用allscore=mscore+escore+cscore求得。
(7)学生信息添加:
直接用用addstudent函数添加.
(8)学生成绩排序:
选择并执行该功能后,系统提示使按学号,各科成绩或总成绩排列,选择后系统自动按降序排列。
(9)系统退出:
其实这里只用到了一个exit(0);
3.5流程图
3。
6详细设计1。
函数原型
voidshowmenu()菜单函数
stu*Locate(stu*s,charfind[],intk)/*结点添加(插入)*/statusdelstudent(stu*s)/*删除记录*/voidshow(stu*s,intk)/*显示所有记录的*/voidshowid(stu*s)/*显示学号对应的姓名*/statuslist(stu*s,intk)/*排序*/statusaddstudent(stu*s)/*添加记录*/
空时停止并返回主菜单选择。
直接在输出数值时添加mscore+escore+cscore作为总成绩加到信息最后一列。
(4)show函数
为了能让用户输入字符串,依然是定义一个开关,此时的开关条件无最大值,添加信息时直接调用show函数即可实现学生信息的输入。
(5)printf函数
编写显示函数用来输出链表中结点信息,stu型指针r,接着r=*s初值为头指针,用printf方法输出存储学生信息,最while(r!
=NULL){?
?
}实现当表中有信息即不为空,就执行while中的内容,打印出学生的各个信息。
(6)delete函数
用来删除记录,先用if(!
s-〉next){printf("
hasnostudent!
\npleaseaddatfrist!
"
)验证学生信息是否为空,如果为空则输出“pleaseaddfirst”.如果不为空,先选择按学号删除或按姓名删除,然后调用函数stu*Locate(stu*s,charfind[],intk)查找要删除的记录。
然后用freep()执行记录清空.(7)insert函数
用来插入学生记录,定义二个指针为p和l,l为前驱,p为插入数据的位置。
如果遇到相同学号的则显示输入有重复并显示原来学号的信息。
如不然则用scnf和printf输入输出数据,并在运行结束后把指针置尾.(8)sort函数
根据不同的要求实现成绩从大到小排列,程序中采用的使选择法进行排序,排序过程中调用swap函数实现数据的排列。
这样就能按不同要求把数据排列了。
3.8程序调试与测试(结果分析)1.函数主界面
2.选择第一项实现添加数据如下
选择2进行修改编辑
4。
选择3进行删除成绩
5。
选择4进行排序显示成绩
6。
选择5进行查找成绩
7.选择6提供载入信息条数
8.选择7保存
9.选择0关闭
要保存选Y不想保存先N。
程序运用了结构体,链表,转换和选择法排序实现了删除,添加,信息载入,查询等功能.
(1)单链表查找算法的最好的时间复杂度为o
(1),最坏时间复杂度o(n),平均时间复杂度o(n);
空间复杂度为o
(1)。
(2)单链表插入算法时间复杂度o(n);
(3)系统基本上实现了小型学生管理系统的功能。
4。
总结
C语言使上学期教的,现在开始做这个课程设计刚开始有点仿偟,不知道何从下手,最后搬出书本有看了一下,网上查点资料,仔细阅读老师给的任务指导书,开始着手做这个学生成绩管理系统,其原因使该算法简便,程序贴近学生生活,该程序的目的使实现学生成绩的粗略管理。
设计过程经过了任务定义,逻辑设计、详细设计、程序编码、程序调试与测试、结果分析和撰写实验报告,最终系统地完成整个课程的设计。
该系统是小型管理系统,运行界面为DOS界面,始终存在不足,从这次设计
中我深刻的体会C设计的意义,我觉得编程除了麻烦也是一件有趣的事情。
[1]谭浩强。
C程序设计[M]北京:
清华大学出版社,2005。
292页-310页。
[2]苏仕华.数据结构课程设计[M]。
上海:
机械工业出版社,2004。
[3]谭浩强。
C程序设计题解与上机指导[M]北京:
清华大学出版社,2005。
#include<
stdio.h>
stdlib。
h〉//提供malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、
srand()、exit()/
#include〈string.h>
//字符串调用typedefintstatus;
intchange=0;
//信息是否改变typedefstructstudent{intnum;
//学号charname[20];
//姓名intmscore;
//数学成绩intcscore;
//c语言成绩intescore;
//英语成绩structstudent*next;
//定义指针}stu;
//定义对象stu
voidshowmenu(){
printf(”\n\t\t***listofstudent***"
);
printf(”\n\t\t**”);
printf("
\n\t\t*1:
addstudent*"
);
printf(”\n\t\t*2:
editstudent*”);
printf(”\n\t\t*3:
delstudent*”);
\n\t\t*4:
showstudent*"
printf(”\n\t\t*5:
findstudent*”);
\n\t\t*6:
loadstudent*"
while(r!
=NULL){
if(r-〉num==k)returnr;
r=r—〉next;
elseif(k==0){//按姓名查询
r=s->
if(strcmp(r-〉name,find)==0)returnr;
r=r—>
}
return0;
status_swap(stu*s1,stu*s2){//把一个对象的学生数据赋给另一个学生
s1->
num=s2—〉num;
//学号
strcpy(s1-〉name,s2—>
name);
//姓名
s1—>
mscore=s2->
mscore;
//数学成绩
cscore=s2—>
cscore;
//c语言成绩
s1-〉escore=s2—〉escore;
//英语成绩
statusswap(stu*s1,stu*s2){//实现两个学生信息的转换
stu*p;
if(!
(p=(stu*)malloc(sizeof(stu))))showerror(0);
_swap(p,s1);
_swap(s1,s2);
_swap(s2,p);
free(p);
//释放p所占的空间
statuslist(stu*s,intk){//采用选择法排序
stu*p,*p1,*p2;
p1=s—〉next;
while(p1){
p2=p1->
next;
while(p2){
if(k==1)if(p2—>
num〈p1—〉num)swap(p1,p2);
if(k==2)if(p2-〉mscore〉p1—>
mscore)swap(p1,p2);
if(k==3)if(p2—〉cscore>
p1—〉cscore)swap(p1,p2);
//c成绩
if(k==4)if(p2-〉escore>
p1-〉escore)swap(p1,p2);
if(k==5)if((p2—>
mscore+p2->
cscore+p2-〉escore
(p1-〉mscore+p1->
cscore+p1—>
escore))swap(p1,p2);
p2=p2—>
p1=p1->
statuseshow(stu*s){
show(s,0);
while(s—>
next){
s=s-〉next;
show(s,2);
}}
statusaddstudent(stu*s){
stu*p,*l;
intk;
while
(1){
l=s;
printf("
pleaseinputnum[0:
return]:
scanf(”%d"
&
k);
if(k==0)break;
while(l){
if((l—〉num)==k){
12//英语成绩;
//总分〉
the’%d’studentisRepeated!
\n”,k);
show(l,1);
return;
l=l—〉next;
if(!
(p=(stu*)malloc(sizeof(stu))))showerror(0);
input%dstudent:
name,mscore,cscore,escorelike[lucy808080]:
”,k);
scanf(”%s%d%d%d”,&
p->
name,&
mscore,&p->
cscore,&p->
escore);
p—>
num=k;
next=NULL;
if(s==NULL)s=p;
else{
while(s-〉next!
=NULL)s=s—〉next;
//将指针置于最末尾s->
next=p;
p=NULL;
change=1;
statuseditstudent(stu*s){//修改学生
intk=0;
while(k==0){
printf(”\npleaseinputeditnum[0:
showall]:
scanf("
%d”,&
if(k==0)showid(s);
while(s){
if((s->
num)==k){
\ninput[%d%s%d%d13%d]
student:
name,mscore,cscore,escore:
”,k,s—〉name,s—〉mscore,s—〉cscore,s—>
escore);
scanf(”%s%d%d%d"
&s—>
s—〉mscore,&s-〉cscore,&
s->
printf(”\nfinish!
\n”);
return;
s=s-〉next;
s)printf("
=====>
thestudent’%d'
isnotfind!
\n"
,k);
}
statusdelstudent(stu*s){//删除学生
intset,k;
stu*p,*r;
charfind[20];
next){
hasnostudent!
\npleaseaddatfrist!
”);
printf(”\n=====>
1delwithnum\n=====>
2delwithname\n”);
scanf("
%d”,&set);
if(set==1){
pleaseinputthenum:
”);
,&k);
p=Locate(s,"
num"
elseif(set==2){
inputthename:
%s”,find);
p=Locate(s,find,0);
charfind[20];
s—>
next){
printf(”hasnostudent!
\n=====>
2delwithname\n"
scanf(”%d"
&set);
if(set==1){
pleaseinputthenum:
%d"
k);
p=Locate(s,”num"
k);
%s"
find);
p=Locate(s,find,0);
else{
inputerror!
//return;
123456
if(p)show(p,1);
nofind!
statusloadstudent(stu*s){//载入文件信息
stu*r;
FILE*fp;
//文件指针
intcount=0;
charjian;
fp=fopen(”student。
stu”,"
rb"
if(fp==NULL){
printf(”\ndatefileisnotfind,buding?
(y/n)\n”);
%c”,&
jian);
if(jian==’y’||jian=='
Y’)fp=fopen("
student.stu”,"
wb"
elseshowerror
(1);
fileisfind,opening.。
.\n”);
while(!
feof(fp)){
r=(stu*)malloc(sizeof(stu));
if(fread(r,sizeof(stu),1,fp)){//将文件的内容放入接点中r->
next=NULL;
next=r;
s=r;
//将该接点挂入链中
count++;
fclose(fp);
//关闭文件
printf(”\n=====〉filish,%dreportisfound。
\n”,count);
statussavestudent(stu*s){//保存学生
FILE*fp;
intflag=1,count=0;
fp=fopen("
student。
stu"
”wb”);
if(fp==NULL)showerror
(1);
p=s—>
while(p){
if(fwrite(p,sizeof(stu),1,fp)==1){
p=p-〉next;
count++;
else{
flag=0;
break;
if(flag){
finish。
(%dreportissaved.)\n”,count);
change=0;
statusshowerror(intk){
switch(k){
case0:
printf(”\nMemoryFailure!
\npleaseanyexit!
getch();
exit(0);
break;
case1:
\nfileerror!
default:
getchar();
voidmain(){
stu*s;
//链表
intset;
charch;
s=(stu*)malloc(sizeof(stu));
s—〉next=NULL;
keykey
loadstudent(s);
//while
(1){
showmenu();
while
(1){printf(”\n”);
pleaseinputthemenu:
%d”,&
set);
if(set==0){
if(change==1){
thedatischanged,save?
(y/n)?
\n”);
%c"
ch);
if(ch==’y’||ch==’Y'
)
savestudent(s);
switch(set){
addstudent(s);
//增加学生
case2:
editstudent(s);
//修改学生
case3:
delstudent(s);
//删除学生
case4:
showstudent(s);
//查看学生信息
case5:
findstudent(s);
//查询学生
case6:
loadstudent(s);
//载入文件信息
case7:
//保存学生
default:
getchar();
//直接返回到主菜单的选择界面}
1.课程设计的目的
1.对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
2.掌握自顶而下的设计方法,将大问题进行模块化,领会结构化程序设计的方法。
3.熟练掌握C语言的基本语法,灵活运用各种数据类型.
表达式,分块调试)和修改程序。
1.程序在运行时,均以菜单形式提供选择界面,并提供一定的数据安全
和提示具有良好的交互功能.2.设计中的每一个小功能均由子函数来完成
3.提前编制下次调试的程序,对于难点问题要积极查阅相关教材、资料,计划好每次上机的内,高效、独立地完成这次设计任务
4.在硬盘上建立自己的目录,将程序文件存储到该目录下,即有利于调试文件,又保证了文件的安全性。
3.课程设计报告内容3.1