学生管理系统.docx
《学生管理系统.docx》由会员分享,可在线阅读,更多相关《学生管理系统.docx(26页珍藏版)》请在冰豆网上搜索。
学生管理系统
河南理工大学
计算机科学与技术学院
课程设计报告
2011—2012学年第一学期
课程名称c语言程序设计
设计题目学生成绩管理系统
学生姓名张爱珍
学号311009030210
专业班级信管10-02
指导教师于金霞
2011年9月15日
1、设计的目的
1)复习巩固C语言的基础知识,进一步加深对C语言编程的理解和掌握;
2)利用所学知识,理论和实际结合,利用资源,采用模块化的结构,使用模仿修改自主设计相结合的方法,锻炼学生综合分析解决实际问题的编程能力;
3)培养学生在项目开发中团队合作精神、创新意识及实战能力。
2、设计的任务
根据学生的实际情况,进行分组选题。
主要的课程设计题目如下(学生也可自主选题):
1、图书管理系统2、学生信息管理系统
3、学生成绩管理系统4、学生通讯录管理系统
5、职工信息管理系统6、设计简单的计算器
课程设计采用学生自主设计和指导老师辅导相结合的方式。
3、设计要求与设计报告
设计要求:
1、任选上述题目之一,或自选题目。
2、模块化的程序设计。
3、锯齿形的程序书写格式。
4、必须通过编译连接运行。
设计报告:
1、设计目的和任务
2、总体设计:
包括程序设计组成框图、流程图。
3、详细设计:
包括模块功能说明:
函数功能、入口及出口参数说明,函数调用关系描述等。
4、调试与测试:
包括调试方法,测试结果分析与讨论,测试过程中遇到的主要问题及采取的解决措施。
5、源程序清单和执行结果:
清单中应有足够的注释。
设计目的和任务
(主要介绍设计的任务,为什么要设计,设计要达到什么样的目的。
)
设计目的:
(1)基本掌握面向过程程序设计的基本思路和方法;
(2)达到熟练掌握C语言的基本知识和技能;
(3)能够利用所学的基本知识和技能,解决简单的程序设计问题
程序功能:
(1).学生基本信息及成绩所选科目成绩的录入。
(2).基本信息的查询(分系、班级;分科目)与修改。
(3).对每系或每班各科成绩进行分析(即求单科平均成绩、及格率和优秀率);
(4).对所开课程的成绩分析(求其平均成绩,最高分和最低分);
(5).对学生考试成绩进行排名;
目录
一,总体设计………………………………………………4
二.详细设计……………………………………………...4
三.调试与测试…………………………………………...5
四.程序清单与执行结果……………………………..........6
五.建议与体会………………………………………..……….15
六.参考文献………………………………………….…16
一:
总体设计
设计流程图如下:
二、详细设计
1》输入初始的学生信息:
其中包括学生的姓名、学号和性别以及学生的语文、数学、英语和计算机等相关信息;可用函数cin(stu*p1)来实现此操作。
2》查询模块:
可用stu*lookdata(stu*p1)来实现。
找到就输出此学生全部信息包括学生的语文、数学、英语和计算机等的成绩。
3》插入模块:
可用insert()函数来实现。
其中通过学号的大小来比较的,并且以此来排序。
4》输出学生的信息以及成绩:
通过学生的姓名来查看学生的语文、数学、英语和计算机等相关成绩,同时也可以分别通过caverage()、maverage()、eaverage()和comaverage()来输出语文、数学、英语和计算机等成绩的平均分数、最高和最低分数。
5》退出系统:
可用一个函数exit()来实现,首先将信息保存到文件中,释放动态创建的内存空间,再退出此程序。
三、调试与测试
四、源程序设计和测试结果
五、建议和体会
六、参考文献
指导教师的评语及评分
考核小组意见及评分
综合评分
三:
调试与测试
问题一、学生初始信息模块:
其中包括学生的姓名、学号和性别以及学生的语文、数学、英语和计算机等相关信息;可用函数cin(stu*p1)来实现此操作。
当正确输入存在的学生学号,系统进行判断时,提示不存在此学生。
解决办法及步骤:
1、一个个输出所有的学生的学号,检查文件中是否有此学生,发现有。
2、既然有此学生,那么检查循环判断是否有此学生的语句发现没有错
3、输出用于循环检查语句中的学生信息,发现乱码
4、仔细分析乱码的原因,最后发现是变量的类型错误,错将学生类型的结构体指针变量定义为了其他类型的指针变量。
问题二、查询模块:
可用stu*lookdata(stu*p1)来实现。
找到就输出此学生全部信息包括学生的语文、数学、英语和计算机等的成绩。
当正确输入查找信息时,系统却不能够得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。
解决办法及步骤:
1、检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入查找信息看能否得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。
2、检查当我们在输入查找信息时,看是否我们输入的信息有误,若是这样的话,我们应当仔细输入查找信息。
四.程序清单与执行结果
#include"stdio.h" /*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h" /*屏幕操作函数库*/
#defineHEADER1" ----------------------------STUDENT----------------------------------\n"
#defineHEADER2" | number | name |Comp|Math|Eng| sum|ave|mici|\n"
#defineHEADER3" |---------------|---------------|----|----|----|--------|-------|-----|"
#defineFORMAT" | %-10s|%-15s|%4d|%4d|%4d|%4d |%.2f|%4d|\n"
#defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci
#defineEND " ---------------------------------------------------------------------\n"
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类型的指针变量*/
voidmenu()/*主菜单*/
{
system("cls"); /*调用DOS命令,清屏.与clrscr()功能相同*/
cprintf(" TheStudents'GradeManagementSystem\n");
cprintf(" *************************Menu********************************\n");
cprintf(" *1input record 2deleterecord *\n");
cprintf(" *3searchrecord 4modifyrecord *\n");
cprintf(" *5insertrecord 6countrecord *\n");
cprintf(" *7sort reord 8save record *\n");
cprintf(" *9displayrecord 0quit system *\n");
cprintf(" *************************************************************\n");
/*cprintf()送格式化输出至文本窗口屏幕中*/
}
voidprintheader()/*格式化输出表头*/
{
printf(HEADER1);
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");
getchar();
}
voidNofind()/*输出未查找此学生的信息*/
{
printf("\n=====>Notfindthisstudent!
\n");
}
voidDisp(Linkl)/*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/
{
Node*p;
p=l->next;/*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/
if(!
p)/*p==NULL,NUll在stdlib中定义为0*/
{
printf("\n=====>Notstudentrecord!
\n");
getchar();
return;
}
printf("\n\n");
printheader();/*输出表格头部*/
while(p) /*逐条输出链表中存储的学生信息*/
{
printdata(p);
p=p->next;/*移动直下一个结点*/
printf(HEADER3);
}
getchar();
}/*************************************************************
作用:
用于定位链表中符合要求的节点,并返回指向该节点的指针
参数:
findmess[]保存要查找的具体内容;nameornum[]保存按什么查找;
在单链表l中查找;
**************************************************************/
Node*Locate(Linkl,charfindmess[],charnameornum[])
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按学号查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的学号*/
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*按姓名查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0) /*若找到findmess值的学生姓名*/
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值重新输入*/
}while(strlen(n)>lens);
strcpy(t,n);/*将输入的字符串拷贝到字符串t中*/
}
/*输入分数,0<=分数<=100)*/
intnumberinput(char*notice)
{
intt=0;
do{
printf(notice);/*显示提示信息*/
scanf("%d",&t);/*输入分数*/
if(t>100||t<0)printf("\nscoremustin[0,100]!
\n");/*进行分数校验*/
}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)/*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/
{
while
(1)/*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/
{
stringinput(num,10,"inputnumber(press'0'returnmenu):
");/*格式化输入学号并检验*/
flag=0;
if(strcmp(num,"0")==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("=====>Thenumber%sisnotexisting,tryagain?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
return;
}
else
{break;}
}
p=(Node*)malloc(sizeof(Node));/*申请内存空间*/
if(!
p)
{
printf("\nallocatememoryfailure");/*如没有申请到,打印提示信息*/
return; /*返回主界面*/
}
strcpy(p->data.num,num);/*将字符串num拷贝到p->data.num中*/
stringinput(p->data.name,15,"Name:
");
p->data.cgrade=numberinput("ClanguageScore[0-100]:
");/*输入并检验分数,分数必须在0-100之间*/
p->data.mgrade=numberinput("MathScore[0-100]:
"); /*输入并检验分数,分数必须在0-100之间*/
p->data.egrade=numberinput("EnglishScore[0-100]:
");/*输入并检验分数,分数必须在0-100之间*/
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;/*计算总分*/
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:
按学号查,2:
按姓名查,其他:
返回主界面(菜单)*/
charsearchinput[20];/*保存用户输入的查询内容*/
Node*p;
if(!
l->next)/*若链表为空*/
{
system("cls");
printf("\n=====>Nostudentrecord!
\n");
getchar();
return;
}
system("cls");
printf("\n =====>1Searchbynumber=====>2Searchbyname\n");
printf(" pleasechoice[1,2]:
");
scanf("%d",&select);
if(select==1) /*按学号查询*/
{
stringinput(searchinput,10,"inputtheexistingstudentnumber:
");
p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/
if(p)/*若p!
=NULL*/
{
printheader();
printdata(p);
printf(END);
printf("pressanykeytoreturn");
getchar();
}
elseNofind();
getchar();
}
elseif(select==2)/*按姓名查询*/
{
stringinput(searchinput,15,"inputtheexistingstudentname:
");
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");
printf(" pleasechoice[1,2]:
");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,10,"inputtheexistingstudentnumber:
");
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;
}
elseNofind();
getchar();
}
elseif(sel==2)/*先按姓名查询到该记录所在的节点*/
{
stringinput(findmess,15,"inputtheexistingstudentname");
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;
}
elseNofind();
getchar();
}
e