班级成绩管理系统.docx
《班级成绩管理系统.docx》由会员分享,可在线阅读,更多相关《班级成绩管理系统.docx(48页珍藏版)》请在冰豆网上搜索。
班级成绩管理系统
课程设计报告
课程名称C语言程序设计
课题名称班级成绩管理系统
专业机械设计及其自动化
班级机设0802班
学号200802010237
姓名杨飞
指导教师黄哲,郭芳,陈多
2009年7月5日
湖南工程学院
课程设计任务书
课程名称C程序设计
课题班级成绩管理系统
专业班级机械设计及其自动化0802班
学生姓名杨飞
学号200802010237
指导老师黄哲,郭芳,陈多
审批
任务书下达日期2009年6月28日
任务完成日期2009年7月5日
C语言课程设计任务书
一、设计内容与设计要求
1、课程设计内容
(1)、课程问题描述:
对一个有N个学生的班级,每个学生有M门课程。
该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
(2)、程序功能要求:
1、本系统采用一个结构体数组,每个数据的结构应当包括:
学号、姓名、M门课程名称。
2、本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
(1)显示每门课程成绩最高的学生的基本信息
(2)显示每门课程的平均成绩
g、退出系统
3、执行一个具体的功能之后,程序将重新显示菜单。
4、将学生成绩保存到文件中。
(3)、程序算法提示:
1、数据结构:
结构体类型数组。
2、数据库结构:
下表构成该系统的基本数据库。
姓名
学号
课程名称1
课程名称2
……
char
Char
float
float
(4)、测试数据:
学生人数N=10
课程门数M=4
课程名:
数学、语文、英语、政治
(5).实验分组及安排
所选题目根据学生学号确定,学号除以4的余数,即(学号%4)。
如你的学号为17,则所选题目号为:
17%4~~~1(题目1)。
(6).成绩评定
程序设计方案是否合理;程序设计是否正确;调试结果;设计说明书的质量高低;答辩时回答问题情况;课程设计周表现情况;总评成绩记入“课程设计成绩评分表”。
目录
概要设计1
1)程序的模块组成:
1
2)各个函数的主要功能:
2
详细设计4
主要功能的实现4
函数明细:
4
主函数4
菜单选择函数4
初始化函数4
输入记录函数5
显示记录函数5
保存数据到文件函数6
查找记录函数6
删除记录函数7
修改函数8
从文件读数据函数9
按部分排序函数10
主要源程序代码11
调试分析25
程序调试:
25
程序部分截图25
思想总结27
计算机通信学院课程设计评分表31
概要设计
学生成绩管理系统有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个函数,实现八大功能:
输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。
各个函数的详细设计说明分别如下:
主函数
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
菜单选择函数
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。
等执行完每一个函数功能后,再自行返回该函数。
初始化函数
这是一个无参函数,里面只有两个语句,它的作用是使链表初始化,使head的值为NULL和一个清屏语句。
比如:
没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
输入记录函数
这是一个无参函数,用来执行第学生成绩记录的输入,当学生为@时停止输入,函数结束后,带回一个指链表头的指针向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;
显示记录函数
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
N-S流程图如下:
p=head,使指向第一个结点
输出p所指向的结点
p指向一下个结点
当p指的不是表尾
保存数据到文件函数
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。
N-S流程图如下:
输入要保存记录的文件地址outfile
文件能打开
是否
p=head;
输出一个出错信
当p不为空时息,并返回菜单
fwrite(p,LEN,1,fp);(写入一条记录)
p=p—>next;(指针后移)
fclose(fp);(关闭文件)
查找记录函数
这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。
算法:
采用线性查找法往下一个结点查找。
输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s)&&p!
=NULL时,使p后移一个结点,如果p!
=NULL,输出p所指的结点。
N-S流程图如下:
输入要查找的学生的学号s
p=head,使p指向第一结点
当记录的学号不是要找的,或指针不为空时
p=p->next
p!
=NULL如果指针不为空
是否
显示没有该
输出p所指向的结点学生
删除记录函数
这是一个有返回值的有参函数。
形参为“链表头的指针”,在核对密码后。
实现对所要删除学生按学号进行查找。
找到后显示该学生的信息。
按任意键进行删除。
算法:
主函数链表的头指针,用一个输出语句printf("Inputyourpassword:
");
提示用户输入密码。
在输入过程中如果需要用到退格。
putchar(8);putchar('');putchar(8);来达到视觉和功能上的要求。
如果密码错误,则两秒后自动返回主菜单。
正确后输入要删除的学生学号,进行删除。
N-S流程图如下:
修改函数
这是一个有参函数,一个是“链表头的指针”修改之后,并返回链表的头指针。
算法:
首先向系统申请一块空间,用于存放输入的信息。
程序会根据用户输入的学号。
采用线性查找法往下一个结点查找。
设一个指针变量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;
从文件读数据函数
这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。
N-S流程图如下:
定义两个指针变量p1,p2
输入要打开的记录文件地址infile
文件能打开
是否
开辟一个新单元
指针p1是否为空返回菜单
否是
返回菜单
读入记录
fclose(fp);(关闭文件)
按部分排序函数
这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还可以显示名次。
N-S流程图:
temp=head->next,head->next=NULL
当temp!
=NULL时
t=temp;temp=temp->next;p1=head;p2=head;
当t->averageaverage&&p1!
=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=h;/*将头结点做为新输入结点的后继结点*/
h=info;/*新输入结点为新的头结点*/
}
return(h);/*返回头指针*/
}
/*输入字符串,并进行长度验证*/
inputs(char*prompt,char*s,intcount)
{
charp[255];
do{
printf(prompt);/*显示提示信息*/
scanf("%s",p);/*输入字符串*/
if(strlen(p)>count)printf("\ntoolong!
\n");/*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p);/*将输入的字符串拷贝到字符串s中*/
}
/*输出链表中结点信息*/
voidprint(STUDENT*h)
{
inti=0;/*统计记录条数*/
STUDENT*p;/*移动指针*/
clrscr();/*清屏