学生成绩管理系统计算机课程设计.docx
- 文档编号:6600120
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:34
- 大小:82.62KB
学生成绩管理系统计算机课程设计.docx
《学生成绩管理系统计算机课程设计.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统计算机课程设计.docx(34页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统计算机课程设计
通信工程学院课程设计报告
2010.08.28
一、实验题目:
学生成绩管理系统
二、系统功能:
1.学生基本情况录入。
2.允许对已经录入的数据进行显示。
3.允许进行数据的插入。
4.删除基本数据的相关信息。
5.基于姓名的查询。
如:
姓张的所有同学。
6.基于各种基本数据的统计计算。
如:
①统计每个学生各门功课的平均成绩,并按平均成绩从高到低的次序排名
输出每个学生各门功课的综合成绩和平均成绩(名次、学号、姓名、平均成绩、
各门功课的考试成绩)。
②列出 90 分以上(包括 90)、80 分以上(包括 80)、70 分以上(包括 70)、
60 分以上(包括 60)、不及格学生清单(学号、姓名、不及格的课程和成绩)。
③统计并输出各门功课的平均成绩和总平均成绩。
三、系统功能模块结构图
学生成绩管理系统
图 1:
学生成绩管理系统模块图
四、数据结构设计及用法说明
数据结构可参考下面定义
typedef struct S1
{
char no[9];/*学号*/
char name[15]; /*姓名*/
char sex; /*性别*/
int age; /*年龄*/
int score[4]; /*成绩*/
float sum; /*总分*/
float average; /*平均分*/
int order; /*排名*/
struct S1 *next;
}STUDENT;
与创建文本菜单相关的函数:
window、textbackground、clrscr、textcolor、cprintf、bioskey、gotoxy、gettext、
puttext、putch。
putch(0xc9);/*输出左上角边框┏ */
putch(0xcd);/*输出水平线*/
putch(0xbb);/*输出右上角边框┓*/
putch(0xba);/*输出左垂直线*/
putch(0xc8);/*输出左上角边框┗*/
putch(0xbc);/*输出右下角边框┛*/
1.查找相关函数、编写数据结构、算法、代码等,8 学时;(周一)
2.完成菜单以及插入、删除记录过程;(周二)
菜单的样板模式为:
" 1. Enter list"输入记录
" 2. Delete a record from list"从表中删除记录
" 3. print list "显示链表中所有记录
" 4. Search record on name"按照姓名查找记录
" 5. Save the file"将链表中记录保存到文件中
" 6. Load the file"从文件中读入记录
" 7. compute the score"计算所有学生的总分和均分
" 8. insert record to list "插入记录到表中
" 9. Quit"退出
3.完成查找、显示记录。
4.完成保存数据到文件和从文件读数据的过程。
5.完成学生的总分和均分的计算。
五、程序结构
开 始
调用 menu 函数
输入 menu select 的值
输入 0~9 中的一个数值,选择相
应操作
是
输入是否为 0?
否
判断键值,选择相应的操作
结束 退出
输入 9 退出到主菜单
图 2:
主程序流程图
按键 2
输入要删除学生的学
号或姓名
是
是否含有此学生?
否
重新输入!
删除信息
结 束
图 3 :
输入学生信息流程图
按键 1
是
info 为空?
否
判断为输入记录
输入学生相关信息
结 束
图 4:
删除学生信息流程图
按键 3
输入要显示学生的学号
是
是否为空?
否
显示该学生信息
结 束
图 5:
显示学生信息流程图
按键 4
输入学生学号
是
信息为空?
否
显示学生信息
结 束
图 6:
查找学生信息流程图
按键 6
是
打不开文件?
否
申请空间
结束 退出
图 7:
加载学生信息流程图
按键 7
是
信息为空?
否
指针后移
否
到表尾?
是
计算总成绩和平均成绩
显示输出
结束
图 8:
计算总分及平均分流程图
六、 各模块的功能及相关函数描述
1.数据结构
链表是线形表的一种,线形表分为顺序存储结构和链式存储结构。
线形表的顺序存储
结构的特点是逻辑关系上相邻的两个元素物理位置上也相邻,因此可以随机存取表中任一
元素。
链式存储结构的特点是用一组任意的存储单元存储线形表的数据元素。
链表的最大
的优点是对表的添加、删除、查找、排序等操作比较方便,因此采用链表来存储学生相关
信息。
且对结点的定义如下:
typedef struct S1
{
char no[9];/*学号*/
char name[15]; /*姓名*/
char sex; /*性别*/
int age; /*年龄*/
int score[4]; /*成绩*/
float sum; /*总分*/
float average; /*平均分*/
int order; /*排名*/
struct S1 *next;
}STUDENT;
2、menu 主菜单
与创建文本菜单相关的函数:
window、textbackground、clrscr、textcolor、cprintf、bioskey、gotoxy、gettext、puttext、put
ch。
putch(0xc9); /*输出左上角边框┏ */
putch(0xcd); /*输出水平线*/
putch(0xbb); /*输出右上角边框┓*/
putch(0xba); /*输出左垂直线*/
putch(0xc8); /*输出左上角边框┗*/
putch(0xbc); /*输出右下角边框┛*/
3、main()主函数
主函数采用模块化设计。
首先在主程序中打印欢迎界面,声明一些必要变量,作一无
限循环程序,循环体为一开关语句,该语句设置一个断点,其条件值是通过调用主菜单函
数得到的返回值,根据该值,调用相应的功能函数,同时设置一个断点,当返回值为一定
条件时结束程序
4、输入记录模块
主要完成将数据存入单链表中的工作,可以从键盘逐个输入学生记录。
学生记录由学
生的基本信息和成绩信息字段构成。
当从数据文件中读入记录时,他就是在以记录为单位
存储的文件中,将记录逐条复制到单链表中。
5、查询记录模块
此模块主要完成在单链表中查找满足相关条件的学生记录,用户可以按照学生的学号
和姓名进行查找,若找到该学生的记录,则返回指向该学生的指针。
否则,返回一个值为
NULL 的空指针。
6、更新记录模块
此模块主要完成对学生的记录维护包括;对记录的修改、删除、插入等操作。
一般来说,
系统进行这些操作之后,会将修改后的数据存下来。
7、统计记录模块
统计记录模块主要完成对学生各门功课总分及平均分的统计。
8、输出记录模块
此模块主要完成对学生记录的存储和将单链表中的学生记录信息以表格的形式在屏幕上
打印出来。
9、load()从文件中加载记录
按照文件读写要求,先定义一个指向文件的指针,输入要读入数据的磁盘文件名,然
后确定文件的打开方式。
如果文件打不开,则退出函数,否则选择一种读文件方式,从文
件头开始,将记录读入内存,直到文件尾。
文件打开方式和读入方式的确定要依据输出文
件的打开方式和写入方式,以名数据读入错误。
如果输出文件是二进制文件,块写操作,
读入也应设置为二进制打开方式,块读取方式。
每读入一条记录,都要做好指针链接关系,
本函数将新结点链接到当前链表的尾部,链表的顺序和文件保存的顺序一
10、delete()删除结点
删除指定学号的学生记录。
输入要删除的结点的学号,根据学号顺序查找结点,如果
没找到,则输出没有找到的信息;否则显示找到的结点信息。
如果删除的是头结点,则修
改头指针,将该结点的前趋指针指向其后继结点,然后释放该结。
11、insert()插入结点
在指定结点前面插入新结点,申请空间得到指针 info,输入新结点信息,存放 info 中,
设链表头指针为 h,p 为指定结点的指针,q 为 p 的前趋指针。
从头结点开始循环移动指针
p 查找指定结点
12、print()显示所有记录
采用顺序访问的方法显示和查找记录,定义一个指向结点的临时变量 p,初值为单链
表的头指针,输出指针所记录的数据后,将指针后移一个记录,直到 p 指针值为空,则所
有记录输出完毕。
13、search()查找结点
按照姓、姓名、或者姓名的前几个字母来查找记录。
从头结点开始顺序查找,当输入
一个关键字符串后,用 strlen()函数得到该串的长度 len,在表中取学生姓名的前 len 个字母
与所输入的字符串相比较,没有相同记录显示没有,遇到第一个匹配的记录则显示此记录,
继续查找链表,仍有相同记录则继续显示,直到尾结点结束。
七、 实验结果
(1)开始界面:
(2)输入界面:
(3)显示界面:
(4)求平均分界面:
(5)查找界面:
八、 体会
本次课程设计中,我在前两天熟复习了上学期学过的 C 语言,使用结构
化分析方法对课题进行分析,将系统分为几大模块,
针对各个模块进行编程,写代码。
期间,主要参考《C 语言课程设计案例
精编》清华大学出版社。
实验的部分源程序都来源于此,其他程序由自己独立
设计完成。
编程期间,遇到了不少麻烦,最终也不能完全的实现老师所要求的全部功
能,目前该程序可以完成对信息的输入输出,修改删除及成绩总计的求平均分
等。
在使用 Turbo C 时 ,总会有改存储路径的麻烦,最好的办法就是将软件
装到 E 盘,其中由于打字不认真造成的错误在所难免,而一些错误却会使整个
程序崩溃:
无论如何修改也不能运行程序。
经过两天的复习及编程,到周三的时候已经可以实现主菜单的显示,以及
输入学生信息,并能显示记录。
周四的时候可以实现对学生信息的显示查找,
并努力实现对数据的保存及读取数据。
直到最后对成绩单的统计和求平均值时,
我总结了编程过程中存在的主要问题:
首先,对一些的基础知识运用不熟练,主要是关于文件、指针、链表等的
概念、初始化、赋值的基础知识。
第二,对系统整体规划不清楚,模块之间联系考虑不周全。
第三,个别功能不能实现,如成绩排序,备份,追加。
总之,通过本次的课程设计,我了解了有关程序设计的基本流程及基本思
路,对以后的编程有很大的帮助,尽管自己独立完成这项设计可能性很小,但
在指导书的帮助下,我还是比较系统的了解到整个程序设计、运行的全过程。
尽管自己的编程能力还很有限,但我也希望能常常有这样的锻炼机会。
九、附录:
源程序
#include "stdio.h"
#include "stdlib.h"
#include "ctype.h"
#include "alloc.h"
#include "string.h"
#include "conio.h"
#include "mem.h"
#define N 4
typedef struct z1
{ char no[9];
char name[15];
int score[N];
char sex[2];
int age;
float sum;
float average;
int order;
struct z1 *next;
}STUDENT;
STUDENT *init();
STUDENT *create();
STUDENT *delete(STUDENT *h);
void print(STUDENT *h);
void search(STUDENT *h);
void save(STUDENT *h);
STUDENT *load();
void computer(STUDENT *h);
STUDENT *insert(STUDENT *h);
void grade();
void copy();
void append();
STUDENT *sort(STUDENT *h);
int menu_select();
int submenu();
void grade00(STUDENT *h);
main()
{ int i;
STUDENT *head;head=init(); clrscr();
printf("\n\n"); for(;;)
{ switch(menu_select())
{ case 1:
head=create();break;
case 2:
head=delete(head);break;
case 3:
print(head);break;
case 4:
search(head);break;
case 5:
save(head);break;
case 6 :
head=load(); break;
case 7:
computer(head);break;
case 8:
head=insert(head); break;
case 9:
exit(0);
}
}
}
menu_select()
{char *menu[]={"*************MENU*************",
" 1. Enter list",
" 2. Delete a record from list",
" 3. print list",
" 4. search record on list ",
" 5. save the file ",
" 6. Load the file",
" 7. compue the file",
" 8. insert record to list",
" 9. quit"
、 };
、 char s[3];
int c,i;
gotoxy(1,25);
、 getch();
clrscr();
gotoxy(1,1);
textcolor(YELLOW);
textbackground(BLUE);
gotoxy(19,2);
putch(0xc9);
for(i=1;i<44;i++)
putch(0xcd);
putch(0xbb);
for(i=3;i<20;i++)
{、gotoxy(19,i);putch(0xba);
gotoxy(63,i);putch(0xba);
}/*输出右垂直线*/
gotoxy(19,20);putch(0xc8);
for(i=1;i<44;i++)
putch(0xcd);
putch(0xbc);
window(20,3,62,19);
clrscr();/*清屏*/
for(i=0;i<15;i++)
{、 gotoxy(10,i+1);
cprintf("%s",menu[i]);、 }
textbackground(BLACK);
window(1,1,80,25);
gotoxy(10,21);
do{、printf("\n\t\tEnter your choice(0~9) to continue:
");
scanf("%s",s);
c=atoi(s);
}while(c<0||c>13);/*选择项不在 0~12 之间重输*/
return c;、
}
STUDENT *init()
{return NULL;
}
STUDENT *create()
{int i; int s;
STUDENT *h=NULL,*info;clrscr();
for(;;)
{info=(STUDENT *)malloc(sizeof(STUDENT)); if(!
info)
{ printf("\oOut of memory");return NULL;}
inputs("\n\nEnter the Num. as 52081107. \n[Type 0 to End Enter]:
",info-
>no,9); if(info->no[0]=='0') break; inputs("Enter name:
",info->name,15);
inputs("Enter the sex M(ale) or F(emale):
",info->sex,2);
do{ printf("Enter the age of the student:
");
scanf("%d",&info->age);
if(info->age>30||info->age<0)
printf("\x07 AGE ERROR!
!
TYPE AGAIN!
\n");
}while(info->age<0||info->age>30);
printf("\n\nPlease input %d scores\n",N);printf("The order is:
\n");
printf("score1......English\nscore2......MATHS\n");
printf("score3......C LANGUAGE\nscore4......PHILOSOPHY\n");
s=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("\x07DATAERROR! ! TYPE AGAIN! \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;info->next=h; h=info;} return(h);/ } inputs(char *prompt, char *s, int count) {char p[255]; do{printf(prompt); /*显示提示信息*/ scanf("%s",p); /*输入字符串*/ if(strlen(p)>count)printf("\n too long! \n");}while(strlen(p)>count); strcpy(s,p); } void print(STUDENT *h) { int i=0; STUDENT *p;clrscr(); p=h; printf("\n\n\n******************STUDENT*********************\n"); printf("|rec|No|name|sex|age|sc1|sc2|sc3|sc4|sum | ave | \n"); printf("|---|----------|---------------|---|---|---|---|---|---|--------|-------| \n"); while(p! =NULL) {i++; printf("|%-3d|%-10s|%-15s| %1s |%3d|%3d|%3d|%3d|%3d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->sex,p->age,p->score[0],p->score[1], p->score[2],p->score[3],p->sum,p->average,p->order); p=p->next; }printf("**********************************end*************************** *******************\n"); } STUDENT *delete(STUDENT *h) {STUDENT *p,*q;char s[9]; clrscr(); printf("Please enter the No. that you want to delete: \n"); scanf("%s",s);q=p=h; while(strcmp(p->no,s)&&p! =NULL){ q=p;p=p->next;} if(p==NULL)printf("\nList No. %s student\n",s); else{ printf("\n\n\n**********************************STUDENT***************** *********************\n"); printf("|No|name|sex|age|sc1|sc2|sc3|sc4|sum | ave | \n"); printf("|----------|---------------|---|---|---|---|---|---|--------|-------| \n"); printf("|%-10s|%-15s| %1s |%3d|%3d|%3d|%3d|%3d| %4.2f | %4.2f | %3d |\n", p- >no,p->name,p->sex,p->age,p->score[0],p->score[1], p->score[2],p->score[3],p->sum,p->average,p->order); printf(" *************************************end******************************* *********\n"); getch();if(p==h)h=p->next;else q->next=p->next;free(p);printf("\n *****Have deleted No %s student*****\n",s); printf("*********Don't forget to save! *********\n");} return(h);/*返回头指针*/ } void search(STUDENT *h) {STUDENT *p;char s[15];int len; clrscr();printf("\n\n\nPlease enter name for searching\n"); scanf("%s",s);len=strlen(s); p=h;/*将头指针赋给 p*/ if(p==NULL)/*如果指针为空*/ printf("\nList does not exist! \n");while(p! =NULL) {if(strncmp(p->name,s,len))p=p->n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统 计算机 课程设计