学生成绩管理系统.docx
- 文档编号:5452807
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:37
- 大小:147.80KB
学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(37页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统
目录
前言1
目的2
需求分析2
1、问题描述:
2
2、功能要求:
2
概要设计3
1)程序的模块组成:
3
2)各个函数的主要功能:
4
总体框架:
5
详细设计6
主要功能的实现6
函数明细:
6
主函数main()6
菜单选择函数intmenu_select()6
初始化函数STUDENT*init()6
输入记录函数STUDENT*create()7
显示记录函数voidprint(STUDENT*h)7
保存数据到文件函数voidsave(STUDENT*h)8
查找记录函数voidsearch(STUDENT*h)9
删除记录函数STUDENT*delete(STUDENT*h)9
修改函数STUDENT*Modify(STUDENT*h)10
从文件读数据函数STUDENT*load()11
按部分排序函数STUDENT*sort(STUDENT*head)12
主要源程序代码13
调试分析过程描述27
调试:
27
部分截图28
总结29
参考资料30
计算机科学与技术系课程设计评分表31
前言
《C语言程序设计》课程设计是对学生的一种全面综合训练,它包括问题分析,总体结构设计,用户界面设计,程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,课程设计的课题比平时的习题复杂得多,也更接近实际。
课程设计着眼于与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,使学生更好地深化理解和灵活掌握教学内容。
为了达到上述目的,本课程设计安排了八个设计课题,训练重点在于基本的程序设计方法和分析问题的能力,而不强调面面俱到。
学生可任选其中一题进行设计,设计完毕写出课程设计报告,用A4纸打印成册;并将课程设计报告与源程序存盘。
学习委员将课程设计报告与磁盘收齐后交指导老师。
目的
全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数和C语言基本图形编程等方法,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。
需求分析
1、问题描述:
对一个有N个学生的班级,每个学生有M个课程。
该系统能对成绩进行录入和修改,能计算每个学生的平均成绩以及各个功课的平均成绩,能根据学生的学号来查询该学生的成绩,能删除该学生的记录,能根据每个学生的平均成绩来给他们进行排序。
2、功能要求:
1.每一条记录包括一个学生的学号、姓名、平均成绩。
2、输入功能:
可以一次完成无数条记录的输入。
3、显示功能:
完成全部学生记录的显示。
4、查找功能:
完成按姓名查找学生记录,并显示。
5、排序功能:
按学生平均成绩进行排序。
6、插入功能:
按平均成绩高低插入一条学生记录。
7、保存功能:
将学生记录保存在任何自定义的文件中,
8、读取功能:
将保存在文件中的学生记录读取出来。
9、有一个清晰美观界面来调用各个功能。
概要设计
学生成绩管理系统有13种功能。
把这13个功能做成13个子函数。
在主函当数中设计一个菜单对这13个子数进行管理。
来实现对整个系统的操作。
根据课题的要求。
每一个学生的包括姓名(char)、学号(char)、M门课程的成绩(float).再加上系统功能上的要求每一学生的信息还要总分和名次等。
所以自然的想到要用结构体来定义每一个学生的信息结构。
然后用链表把它们组成一个有序的整体。
用对链表的操作来实现对所有学生信息的统一管理(成绩显示、成绩排序、成绩修改等)。
最后为了以后按照处理后的顺序保存到文件中。
各函数的功能:
1)程序的模块组成:
主函数:
intmain()
新建函数:
STUDENT*init()
输入函数:
STUDENT*create()
显示函数:
voidprint(STUDENT*h)
删除函数:
STUDENT*delete(STUDENT*h)
按名字寻找函数:
voidsearch(STUDENT*h)
保存函数:
voidsave(STUDENT*h)
按总分排序函数:
STUDENT*sort(STUDENT*h)
计算总分和均分函数:
voidcomputer(STUDENT*h)
修改函数:
STUDENT*Modify(STUDENT*head,STUDENT*new)
按学号排序函数:
STUDENT*index(STUDENT*h)
菜单函数:
intmenu_select()
2)各个函数的主要功能:
输入函数:
随时输入数据。
菜单函数:
显示系统主菜单。
显示函数:
显示所有学生的信息。
寻找函数:
方便学生查找自己的成绩。
删除函数:
删除某学生的信息。
排序函数:
按总成绩排序。
按学号排序函数:
按学号排序。
插入函数:
可以插入新的信息。
保存函数:
保存好学生成绩,以免丢失。
统计函数:
●显示每门课程成绩最高的学生的基本信息。
●显示每门课程的平均成绩。
●显示超过某门课程平均成绩的学生人数
总体框架:
详细设计
主要功能的实现
函数明细:
整个系统除了主函数外,另外还有14个函数,实现八大功能:
输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。
各个函数的详细设计说明分别如下:
主函数main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
菜单选择函数intmenu_select()
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。
等执行完每一个函数功能后,再自行返回该函数。
初始化函数STUDENT*init()
这是一个无参函数,里面只有两个语句,它的作用是使链表初始化,使head的值为NULL和一个清屏语句。
比如:
没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
输入记录函数STUDENT*create()
这是一个无参函数,用来执行第学生成绩记录的输入,当学生为@时停止输入,函数结束后,带回一个指链表头的指针向head。
将下一个学生的信息插在表头。
N-S流程图如下:
head=NULL
无条件循环
指针p指向新开辟的单元
指针p是否为空
是否
输入学号p->num
输出p->num是否为@
内存是否
溢出输入姓名p->name
停止for(i=0;i<3;i++)
输入输入成绩
返回p->sum=s;
菜单p->average=(float)s/3;
p->order=0;
p->next=head;head=p;
显示记录函数voidprint(STUDENT*h)
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
N-S流程图如下:
p=head,使指向第一个结点
输出p所指向的结点
p指向一下个结点
当p指的不是表尾
保存数据到文件函数voidsave(STUDENT*h)
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。
N-S流程图如下:
输入要保存记录的文件地址outfile
文件能打开
是否
p=head;
输出一个出错信
当p不为空时息,并返回菜单
fwrite(p,LEN,1,fp);(写入一条记录)
p=p—>next;(指针后移)
fclose(fp);(关闭文件)
查找记录函数voidsearch(STUDENT*h)
这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。
算法:
采用线性查找法往下一个结点查找。
输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s)&&p!
=NULL时,使p后移一个结点,如果p!
=NULL,输出p所指的结点。
N-S流程图如下:
输入要查找的学生的学号s
p=head,使p指向第一结点
当记录的学号不是要找的,或指针不为空时
p=p->next
p!
=NULL如果指针不为空
是否
显示没有该
输出p所指向的结点学生
删除记录函数STUDENT*delete(STUDENT*h)
这是一个有返回值的有参函数。
形参为“链表头的指针”,在核对密码后。
实现对所要删除学生按学号进行查找。
找到后显示该学生的信息。
按任意键进行删除。
算法:
主函数链表的头指针,用一个输出语句printf("Inputyourpassword:
");
提示用户输入密码。
在输入过程中如果需要用到退格。
putchar(8);putchar('');putchar(8);来达到视觉和功能上的要求。
如果密码错误,则两秒后自动返回主菜单。
正确后输入要删除的学生学号,进行删除。
N-S流程图如下:
修改函数STUDENT*Modify(STUDENT*h)
这是一个有参函数,一个是“链表头的指针”修改之后,并返回链表的头指针。
算法:
首先向系统申请一块空间,用于存放输入的信息。
程序会根据用户输入的学号。
采用线性查找法往下一个结点查找。
设一个指针变量p,先指向第一个结点,当strcmp(p->name,s)&&p!
=NULL时,使p后移一个结点,如果p!
=NULL,输出p所指的结点。
如果有该学生就修改。
并出现提示信息"***Modifysuccess!
***"。
如果没有该学生则出现“***FindoutNo.%sstudent***”提示。
并2秒后返回主菜单。
N-S流程图如下:
q=head
原来的链表是空表
是否
2秒后当记录的学号不是要找的,或指针不为空时
返回
主菜单info指向q位置q向后移一个结点
!
strcmp(p->no,info->no)
是
否
printf("Don't
forgetsave\n")
info->next=p->next;
q->next=info;
从文件读数据函数STUDENT*load()
这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。
N-S流程图如下:
定义两个指针变量p1,p2
输入要打开的记录文件地址infile
文件能打开
是否
开辟一个新单元
指针p1是否为空返回菜单
否是
返回菜单
读入记录
fclose(fp);(关闭文件)
按部分排序函数STUDENT*sort(STUDENT*head)
这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还可以显示名次。
N-S流程图:
temp=head->next,head->next=NULL
当temp!
=NULL时
t=temp;temp=temp->next;p1=head;p2=head;
当t->average
=NULL时
p2=p1;p1=p1->next;
p1=p2
是否
t->next=p1;t->next=p1;
head=t;p2->next=t;
p1=head;
当p1!
=NULL时
i++;p1—>order=i;p1=p1—>next;
输出“排序成功”
主要源程序代码
/*学生成绩管理源程序*/
/***********xuesheng.c***********/
/******头文件(.h)***********/
#include"stdio.h"/*I/O函数*/
#include"stdlib.h"/*其它说明*/
#include"string.h"/*字符串函数*/
#include"conio.h"/*屏幕操作函数*/
#include"mem.h"/*内存操作函数*/
#include"ctype.h"/*字符操作函数*/
#include"alloc.h"/*动态地址分配函数*/
#defineN3/*定义常数*/
typedefstructz1/*定义数据结构*/
{
charno[11];
charname[15];
intscore[N];
floatsum;
floataverage;
intorder;
structz1*next;
}STUDENT;
/*以下是函数原型*/
STUDENT*init();/*初始化函数*/
STUDENT*create();/*创建链表*/
STUDENT*delete(STUDENT*h);/*删除记录*/
voidprint(STUDENT*h);/*显示所有记录*/
voidsearch(STUDENT*h);/*查找*/
voidsave(STUDENT*h);/*保存*/
STUDENT*load();/*读入记录*/
voidcomputer(STUDENT*h);/*计算总分和均分*/
STUDENT*insert(STUDENT*h);/*插入记录*/
voidappend();/*追加记录*/
voidcopy();/*复制文件*/
STUDENT*sort(STUDENT*h);/*排序*/
STUDENT*index(STUDENT*h);/*索引*/
voidtotal(STUDENT*h);/*分类合计*/
intmenu_select();/*菜单函数*/
/******主函数开始*******/
main()
{
inti;
STUDENT*head;/*链表定义头指针*/
head=init();/*初始化链表*/
clrscr();/*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{/*值不同,执行的函数不同,break不能省略*/
case0:
head=init();break;/*执行初始化*/
case1:
head=create();break;/*创建链表*/
case2:
head=delete(head);break;/*删除记录*/
case3:
print(head);break;/*显示全部记录*/
case4:
search(head);break;/*查找记录*/
case5:
save(head);break;/*保存文件*/
case6:
head=load();break;/*读文件*/
case7:
computer(head);break;/*计算总分和均分*/
case8:
head=insert(head);break;/*插入记录*/
case9:
copy();break;/*复制文件*/
case10:
head=sort(head);break;/*排序*/
case11:
append();break;/*追加记录*/
case12:
head=index(head);break;/*索引*/
case13:
total(head);break;/*分类合计*/
case14:
exit(0);/*如菜单返回值为14程序结束*/
}
}
}
/*菜单函数,返回值为整数*/
menu_select()
{
char*menu[]={"***************MENU***************",/*定义菜单字符串数组*/
"0.initlist",/*初始化*/
"1.Enterlist",/*输入记录*/
"2.Deletearecordfromlist",/*从表中删除记录*/
"3.printlist",/*显示单链表中所有记录*/
"4.Searchrecordonname",/*按照姓名查找记录*/
"5.Savethefile",/*将单链表中记录保存到文件中*/
"6.Loadthefile",/*从文件中读入记录*/
"7.computethescore",/*计算所有学生的总分和均分*/
"8.insertrecordtolist",/*插入记录到表中*/
"9.copythefiletonewfile",/*复制文件*/
"10.sorttomakenewfile",/*排序*/
"11.appendrecordtofile",/*追加记录到文件中*/
"12.indexonnomber",/*索引*/
"13.totalonnomber",/*分类合计*/
"14.Quit"};/*退出*/
chars[3];/*以字符形式保存选择号*/
intc,i;/*定义整形变量*/
gotoxy(1,25);/*移动光标*/
printf("pressanykeyentermenu......\n");/*压任一键进入主菜单*/
getch();/*输入任一键*/
clrscr();/*清屏幕*/
gotoxy(1,1);/*移动光标*/
textcolor(YELLOW);/*设置文本显示颜色为黄色*/
textbackground(BLUE);/*设置背景颜色为蓝色*/
gotoxy(10,2);/*移动光标*/
putch(0xc9);/*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xcd);/*输出上边框水平线*/
putch(0xbb);/*输出右上角边框┓*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba);/*输出左垂直线*/
gotoxy(54,i);putch(0xba);
}/*输出右垂直线*/
gotoxy(10,20);putch(0xc8);/*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xcd);/*输出下边框水平线*/
putch(0xbc);/*输出右下角边框┛*/
window(11,3,53,19);/*制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr();/*清屏*/
for(i=0;i<16;i++)/*输出主菜单数组*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK);/*设置背景颜色为黑色*/
window(1,1,80,25);/*恢复原窗口大小*/
gotoxy(10,21);/*移动光标*/
do{
printf("\nEnteryouchoice(0~14):
");/*在菜单窗口外显示提示信息*/
scanf("%s",s);/*输入选择项*/
c=atoi(s);/*将输入的字符串转化为整形数*/
}while(c<0||c>14);/*选择项不在0~14之间重输*/
returnc;/*返回选择项,主程序根据该数调用相应的函数*/
}
STUDENT*init()
{
returnNULL;
}
/*创建链表*/
STUDENT*create()
{
inti;ints;
STUDENT*h=NULL,*info;/*STUDENT指向结构体的指针*/
for(;;)
{
info=(STUDENT*)malloc(sizeof(STUDENT));/*申请空间*/
if(!
info)/*如果指针info为空*/
{
printf("\noutofmemory");/*输出内存溢出*/
returnNULL;/*返回空指针*/
}
inputs("enterno:
",info->no,11);/*输入学号并校验*/
if(info->no[0]=='@')break;/*如果学号首字符为@则结束输入*/
inputs("entername:
",info->name,15);/*输入姓名,并进行校验*/
printf("pleaseinput%dscore\n",N);/*提示开始输入成绩*/
s=0;/*计算每个学生的总分,初值为0*/
for(i=0;i { do{ printf("score%d: ",i+1);/*提示输入第几门课程*/ scanf("%d",&info->score[i]);/*输入成绩*/ if(info->score[i]>100||info->score[i]<0)/*确保成绩在0~100之间*/ printf("baddata,repeatinput\n");/*出错提示信息*/ }while(info->score[i]>100||info->score[i]<0); s=s+info->score[i];/*累加各门课程成绩*/ } info->sum=s;/*将总分保存*/ info->average=(float)s/N;/*求出平均值*/ info->order=0;/*未排序前此值为0*/ info->next=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统