数据结构学生成绩管理系统.docx

上传人:b****6 文档编号:4429839 上传时间:2022-12-01 格式:DOCX 页数:18 大小:110.21KB
下载 相关 举报
数据结构学生成绩管理系统.docx_第1页
第1页 / 共18页
数据结构学生成绩管理系统.docx_第2页
第2页 / 共18页
数据结构学生成绩管理系统.docx_第3页
第3页 / 共18页
数据结构学生成绩管理系统.docx_第4页
第4页 / 共18页
数据结构学生成绩管理系统.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构学生成绩管理系统.docx

《数据结构学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构学生成绩管理系统.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构学生成绩管理系统.docx

数据结构学生成绩管理系统

 

《数据结构与算法》

课程设计说明书

 

题目:

学生成绩管理系统

学院:

计算机科学与工程学院

专业:

姓名:

学号:

指导教师:

 

2014年10月20日

成绩评定标准和成绩

 

1、能按照格式进行写作,无抄袭现象(10分)    

2、报告内容行文通畅,有条理性,无错别字,结构严谨。

(10分)     

3、能够按照数据结构课设的格式要求、排版要求和字数要求等,有需求分析,系统分析,详细设计,关键技术的介绍和参考文献。

(10分)   

4、在验收过程中,能合理的回答问题(20分)    

5、软件能正常运行,实现所提出的功能(40分)   

6、软件代码规范性较好(5分)   

7、具有自己的创新或特色(5分)  

总成绩:

摘要

 

学生成绩管理系统是当今教育单位必不可少的一部分,对于学校管理者的作用是巨大的。

它使得人们无需经过特别的训练就能够使用电脑完成许多复杂的工作。

教师通过学生成绩管理系统对学生的信息进行轻松的管理,学生也可以通过它来查询自己的成绩信息。

为此,根据用户各方面的实际需要开发设计了本学生成绩管理系统。

本系统采用VC++6.0作为开发工具。

系统的实现过程:

包括系统需求分析,流程分析功能设计等。

系统的主要功能有学生信息录入,数据查询等功能。

 

关键词:

学生成绩管理、链表、MicrosoftVisualC++6.0

 

4系统测试.......................................................14

8谢辞.........................................................18

引言

一、设计目的

通过本课程设计的实践,全面总结程序设计与问题求解课程与数据结构与算法课程学习中的的数据类型、程序结构、数组、函数、指针、结构体、链表等基本概念,掌握其使用方法。

掌握数据结构与算法课程中的各种排序算法,单链表的创建、插入、查找、删除、修改等方法。

掌握面向对象程序设计中有关输入输出流类体系、文件操作的基本概念,初步学会用类与对象这种面向对象的程序设计方法编写应用程序。

培养使用面向对象的程序设计方法编写计算机程序的能力。

通过设计一个《学生成绩统计管理》,进一步熟悉数据结构与算法链表的各种实现方式。

了解系统开发的需求分析、类层次设计、模块分解、编码测试、模块组装与整体调试的全过程,加深对数据结构与算法的理解与VisualC++环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯。

程序设计是一门实践性很强的课程,必须十分重视实践环节。

许多实际的知识不是靠听课和看书学到的,而是通过长时间的实践积累的。

二、背景

在如今的高校日常管理当中,学生成绩管理系统有着重要意义。

当前学校学生数量规模大,课程门类多,校区分散等,学生成绩管理系统更具有实际应用意义。

但是,我们目前看到的学生成绩管理系统在很多方面还不够完善,功能也有些欠缺。

学生成绩管理是一个学校不可缺少的部分,它的内容对于学校的管理者和学生以和学生家长来说都至关重要,所以一个良好的学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段。

学生成绩管理系统对学校加强学生成绩管理有着极其重要的作用.由于各个大学都在持续扩招,学生的数量日益庞大,对于如何管理如此庞大的学生成绩数据显得更为复杂,传统的手工成绩管理不仅工作量大,而且容易出现问题,如:

效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。

已不能适应时代的发展。

随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。

作为计算机应用的一部分,使用计算机对学生成绩信息进行管理,具有手工管理所无法比拟的优点。

例:

检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。

这些优点能够极大地提高管理者管理的效率,也是学校走向科学化、正规化管理,与世界接轨的重要条件。

因此,开发设计这样一套学生成绩管理软件成为很有必要的事情。

该学生成绩管理系统采用C语言开发研制,针对学生成绩和其数据特点,可以全面实现对学生成绩的插入、查询、修改、删除和输出等功能的计算机管理。

它能使学生成绩数据的工作人员从繁重的工作中解脱出来,大大减轻了工作量,减少人为的工作失误,全面提高学生成绩管理的效率,从而使学校对于学生成绩的管理水平和技术水平跃上一个新的台阶。

1系统概述

通过上网调查了解,以和和同学老师积极交流,建立学生成绩信息管理系统,采用计算机对学生成绩信息进行管理,进一步提高学校现代化水平。

帮助广大成绩信息管理者提高工作效率、减少工作时间,实现学生和其家长信息查询工作流程的系统化、公平化、规范化和自动化,也为广大在教师提供便利快捷的成绩录入功能。

为了保证系统能够长期、安全、稳定、可靠、高效的运行,本系统将达到以下几个功能:

(1)能完成学生成绩的插入、查询、修改、删除、排序、输出等功能;

(2)采用单链表存储结构实现;

(3)所有数据以外部文件方式保存。

2需求分析

成绩管理成为学校教学管理中十分重要又相当复杂的管理工作之一,单纯的采用传统的手工处理已经不符合教育和管理的要求,而计算机具有运算速度快,处理能力强等特点,很自然地进入到这一应用领域中。

因此为了保证学校的信息流畅,工作高效,有必要设计一个学生成绩管理系统。

这不但能使教务人员从复杂的成绩管理中解脱出来,而且对于推动教学的发展也起到非常重要的作用。

学校学生成绩管理工作都是采用传统的手工管理,这各传统人工的管理方式存在着许多缺点,如:

效率低,保密性差,一方面导致教师,学生成绩情况不了解,教师对成绩管理工作倍感头痛,因为时间一长,将产生大量的文件和数据,这对于查找,更新和维护都带来了不少的困难,耗费大量劳动力,难于避免错误的产生。

选择VC来开发学生成绩管理系统,由于以上的优点,帮助广大教师提高工作效率,实现学生成绩信息管理工作流程的系统化、规范化和自动化,所以选择VC来开发学生成绩管理系统。

2.1系统需求

2.1.1系统处理的准确性

系统处理的准确性和和时性是系统的必要性能。

在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足高校对信息处理的需求。

2.2.2系统处理的和时性

由于学生非常关心自己的信息正确与否以便和时接受来自学校的学习成绩信息,学生成绩信息管理功能对于整个系统的功能和性能完成举足轻重。

在系统开发过程中,必须采用一定的方法保证系统的准确性。

2.2.3系统的开放性和可扩充性

学生成绩信息管理系统在开发过程中,应该充分考虑以后的可扩充性。

例如学生成绩信息管理的方式的改变,学生成绩信息的需求也会不断的更新和完善。

2.2.4功能需求:

1.用中文菜单,界面设计和用户输入输出要人性化些;

2.将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来,保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成,或者在相应的命令后,再将学生信息保存到文本文档中。

3.具有数据输入功能,输入的数据能最终保存在文件中;

4.具有数据删除功能,能最终从文件中删除;

5.排序功能,根据自己设计的数据结构,设计排序算法

6.具有多种查询(如按学号查询、按姓名查询、按成绩查询等)和输出功能;

7.其它功能(如各种统计,统计每个学生所有课程的平均分,统计某门课程所有学生的平均分等等)

8.学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩)

针对上述功能要求,本系统设置了如下几个函数

①插入函数AppendNode():

将学生成绩信息插入到链表中;

②查询函数Find();:

分别可以按学号和按姓名进行学生成绩查询;

③删除函数DelNode():

按学号删除对应的学生记录;

④修改函数Change():

分别可以按学号和按姓名进行学生成绩修改;

⑤输出函数DisLink():

输出全部学生成绩信息;

⑥排序函数Com():

分别可按学号、学期和学生平均分排序输出;

⑦读取数据函数ReadData():

从外部文件读取学生成绩信息;

⑧保存数据函数SaveData():

将学生成绩保存到外部文件中。

2.2.5使用范围:

各大中小学校的老师与教务科。

2.2.6用户界面:

良好的中文界面环境,可以通过不同数字的选择来实现不同的系统功能。

2.2.7输出要求:

中文输出格式。

当用户有非法输入时会有良好的输出提示语,提示用户按正确输入格式输入。

2.2开发环境

VisualC++6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。

VisualC++是一个功能强大的可视化软件开发工具。

自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。

虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用有很大的局限性,只适用于Windows2000、WindowsXP和WindowsNT4.0。

所以实际中,更多的是以VisualC++6.0为平台。

C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。

C语言适用范围大,适合于多种操作系统,如Windows、linux、DOS、UNIX等等;也适用于多种机型。

C语言已先后被移植到大、中、小和微机型上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。

C语言功能齐全:

具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。

而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。

它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件。

2.3系统性能分析

2.3.1.硬件环境

处理器:

CPU主频在500MHz以上

内存:

128MB以上

硬盘空间:

10MB。

2.3.2.软件环境

操作系统:

WindowsXP/Window7(推荐使用WindowsXP)。

调试环境:

VisualC++6.0和以上版本。

分辨率1024*768,MicrosoftVisualC++6.0。

3详细设计

3.1系统的结构设计

通过对学生成绩信息管理系统的功能分析,可以定义出系统的总体结构模块图,如图3.1所示。

学生成绩管理系统

学生成绩插入

学生成绩查询

学生成绩删除

学生成绩修改

学生成绩排序

学生成绩输出

学生成绩保存

图3.1学生成绩管理系统总体结构设计

3.2系统管理流程图

前面的分析中已经定义了系统各个模块,属于静态建模的范围。

在系统运行时刻的动态模型应该由系统的流程决定。

当用户运行该系统后可以来进行学生成绩信息插入管理、学生成绩信息查询管理、学生成绩信息删除管理、学生成绩信息修改管理、学生成绩信息排序管理和学生成绩信息输出等操作,具体的流程如图3.2所示。

进入系统

数据读入

查询

修改

删除

输出

数据保存

退出系统

不保存

Y

N

图3.2.1系统流程图

主模块应负责应用程序的主界面,由它调用其他模块.因此主模块应具有操作性好、界面清晰的特点,使用户能够很方便地找到所需功能。

本成绩管理系统可以先以可读写的方式打开数据文件,若该文件不存在,则提醒用户新建此文件。

当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的单链表中,然后执行显示主菜单和进入主循环操作,进行按键判断。

根据功能需求的结果分析,主界面应该由学生成绩信息插入管理,学生成绩信息查询管理、学生成绩信息修改管理、学生成绩信息删除管理、学生成绩信息的排序和学生成绩信息输出管理组成,可以通过输入相应的数字进入相应的功能模块。

接下来是系统详细设计和系统实现。

系统总体设计完成后,就可以根据需求对各个模块来进行实现了。

在本系统中需要编码实现的主要有学生成绩信息插入、学生成绩信息查询、学生成绩信息修改、学生成绩信息删除、学生成绩的排序和学生成绩信息输出等6个模块。

(1)学生成绩插入模块

用到的数据结构与算法知识为结构体,该系统创建了学生成绩结构体,结构体又由数据域和指针域构成。

数据域中包含学期、学号、姓名、语文成绩、数学成绩、外语成绩和平均分等信息。

添加的信息包括学期(取值范围只能1-8)、学号、姓名(输入数字和其他字符时为不合法输入)、语文成绩、数学成绩和外语成绩(各科成绩的取值范围大于0小于100)。

流程图如下图3.3.2所示。

开始插入数据

输入学生成绩信息

调用类成员函数采用单链表保存数据

结束

图3.3.2

使用到的存储结构是单链表,线性表的链接存储结构称为单链表,单链表使用一组任意的存储单元存放线性表的元素,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存中的任意位置。

为了正确表示元素之间逻辑关系,每个存储单元在存储数据元素的同时,还必须存储其后继元素所在地址信息,这个地址信息称为指针,这两部分组成了数据元素的存储映像,称为结点,结点结构如图3.3.3所示。

图3.3.3单链表的结点构造

设p是一个指针变量,则p的值是一个指针。

设指针p指向某个结点,则该结点用*p表示,在单链表中,结点p由两个域组成:

存放数据元素的部分和存放后继结点地址的指针部分,分别用p->data和p->next来标识,p->next指向结点ai+1,其指针与结点之间关系如图3.3.4所示。

图3.3.4指针与结点之间关系的示意图

本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程描述如下:

初始化创建两个节点,第一个节点pr=head,第二个节点p设置为空。

如果head为空,则p=head,否则,用while循环,查找到尾节点,即当pr->next不为空时,pr=pr->next。

找到尾节点后,令pr->next=p,然后pr=p,这就完成了在尾节点新增加一个节点p。

(2)学生成绩查询模块

按姓名和学号查找学生成绩的流程图分别如下图3.3.5所示。

结束

输入查找姓名学号学号学号

判断

抱歉没有该学生

输出该学生的信息

按姓名或学号查找

查找开始

N

Y

图3.3.5按姓名查找学生成绩信息流程图

在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。

当p指向某个结点时判断是否为第i个结点,判断条件即比较数据域中p->name与输入的name是否一致,是的话则查找成功;否则,将工作指针p后移,即将p指向原来所指结点的后继结点。

直到p为NULL时查找失败。

单链表查找过程如图3.3.6所示。

图3.3.6单链表查找过程的示意图

按学号查询学生成绩信息同按姓名查找学生成绩信息,由于过程差别不大,此处就不再用示意图详细列出了。

(3)学生成绩修改模块

学生成绩修改功能,可以按学号首先要查找与要修改数据相匹配的信息,如果找到了匹配的信息,则让用户按接下来的输出提示依次输入要修改的信息,(学号作为主码不能修改,然后再将重新输入新的数据并保存到单链表)然后保存到指定文件当中去。

若没有匹配的学生成绩信息,则返回失败,然后把相应的提示信息输出,让用户重新选择操作。

Student*Change(Student*head)

{

Student*p;

intterm;

intID;

charname[20];

intc1;

intc2;

intc3;

intk=1;

p=head;

printf("请输入要查找的学号:

\n");

scanf("%d",&ID);

while(p!

=NULL)

{

if(p->ID==ID)

{

printf("已找到该学生,请输入修改信息:

\n");

while

(1)

{

printf("请输入学期:

");

scanf("%d",&term);

if(term>8||term<1)

{

printf("学期输入错误\n");

printf("学期取值只能1-8\n");

}

else

break;

}

//判断输入时是否合法,判断方法都一样,所以接下来省略一些输入判断代码。

while

(1)

{

printf("请依次输入语文成绩:

");

scanf("%d",&c1);

if(c1>100||c1<0)

{

printf("成绩输入错误\n");

printf("成绩区间是0~100\n");

}

else

break;

}

p->term=term;//数据修改

strcpy(p->name,name);//数据修改

p->c1=c1;//数据修改

p->c2=c2;//数据修改

p->c3=c3;//数据修改

printf("修改成功!

\n");

SaveData(head);

k=0;

}

p=p->next;

}

if(k)printf("没有该学生,请核对学号\n");

returnhead;

}

(4)学生成绩删除模块

当选择删除功能时,可以选择按学号或名字进行删除操作。

首先要求输入要删除的同学的学号或姓名,如果该同学存在并且学号或姓名匹配的上的话,则进行删除操作,然后输出提示语,提示用户操作成功。

否则返回失败。

并提示用户操作失败,然后让用户重新选择操作功能。

其流程图3.3.7如下:

开始

输入姓名

输入学号

学号存在

执行删除功能

返回主菜单

N

Y

图3.3.7删除学生信息模块流程图

删除操作定义为将单链表的第i个结点删去。

因为在单链表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai的后继结点,即把结点ai从链上摘下来,最后释放结点ai的存储空间,如图3.3.8所示。

图3.3.8在单链表中删除结点指针的变化情况

(5)学生成绩排序模块

学生成绩排序方法,数据结构与算法书中有很多种排序方法,各种各样的排序方法都有其优点和缺点,由于本人能力有限,所以只选择了一种自己比较熟悉的排序方法:

冒泡排序。

依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数"滚动"到最后一个位置;第二趟则将次大的数滚动到倒数第二个位置......第n-1(n为无序数据的个数)趟即能完成排序。

该算法的平均时间复杂度:

O(n2)空间复杂度:

O

(1) (用于交换)稳定性:

稳定

以平均成绩为例:

while(p->next!

=NULL)

{

p=p->next;

i++;

}

p=head;

for(j=1;j

{

p=p->next;

for(k=0;k<(i-j);k++)

{

if((pr->c1+pr->c2+pr->c3)/3.0<(p->c1+p->c2+p->c3)/3.0)

{

temp1=*pr;

temp1.next=p->next;

*pr=*p;

*p=temp1;

pr->next=p;

}

p=p->next;

pr=pr->next;

}

p=head;

pr=head;

}

returnhead;

}

(6)学生成绩输出模块

输出为从文件读入数据,然后依次输出各项数据。

若文件为空,则输出提示,说明文件为空,提示用户从键盘输入数据。

对文件的操作为:

使用了函数fclose()用来关闭先前fopen()打开的文件。

此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

返回值若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。

fopen(打开文件)函数说明参数path字符串包含欲打开的文件路径和文件名。

返回值文件顺利打开后,指向该流的文件指针就会被返回。

如果文件打开失败则返回NULL,并把错误代码存在errno中。

Student*p=NULL;

4系统测试

主界面:

如图4.1显示。

在此界面用户可以选择要操作的选项,回车之后即可进入相关的页面进行操作(例如:

选择1,即可进入输入学生数据页面)所有操作均有提示语,比较人性化的管理,易懂,简单。

图4.1

5所遇到的问题和分析解决

在本系统设计和开发过程中遇到的问题和困难很多,现在就挑几个比较突出的问题来说明。

第一个问题是所有数据都要从外部文件读入和最后的数据也要保存到外部文件当中。

在之前的编程学习中,对文件的各种操作都不是太熟悉,基本没怎么用过,为了解决这个问题,我到图书馆和网上查找并学习了流与文件的操作的相关知识,经过一番研究,我了解流与文件的基本操作方法,所谓“文件”是指一组相关数据的有序集合。

 这个数据集有一个名称,叫做文件名。

 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。

文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。

从不同的角度可对文件作不同的分类。

从用户的角度看,文件可分为普通文件和设备文件两种。

fopen函数用来打开一个文件,其调用的一般形式为:

文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。

 “使用文件方式”是指文件的类型和操作要求。

“文件名”是字符串常量或字符串数组。

fclose(fp); 正常完成关闭文件操作时,fclose函数返回值为0。

如返回非零值则表示有错误发生。

文件的读写对文件的读和写是最常用的文件操作。

文件操作可以在系统中使用后,就开始编写各种功能函数了。

第二个问题是对单链表的各种基本操作不熟悉,在编写代码过程中,经常出现一些编程逻辑错误问题,即虽然代码编译通过了,但是在程序测试时发现该函数无法实现指定功能,比如在用while循环时,对于是当p->next!

=null还是p!

=null没有分清楚,导致程序执行后遇到错误。

还有if语句中的条件判断,比如在判断名字输入是否非法时这句if((name[i]<'A'&&name[i]<'a')||(name[i]>'Z'&&name[i]>'z'))才是对的,刚开始时大于小于关系混乱,逻辑‘与’和‘或’没有分清,导致在测试代码时逻辑出错,没有完成指定功能。

认识到逻辑方向的缺陷后,我加强了代码逻辑,从资料中学习别人的编程逻辑思想,最后完成了各个功能函数的编写。

第三个问题是对从键盘输入的数据进行判断,比如学期取值只能1-8,当用户输入其他数字或字符时,应当输出提示用户输入错误,刚开始设计是只使用if来判断,发现if语句无法解决这问题,当用户输入了非法字符后,虽然提示了用户输入错误,但是没有让用户重新输入,而是直接跳到下一项的输入,我看书思考后,发现用while循环有可能解决这个,所以把if语

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1