找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15657|回复: 3
打印 上一主题 下一主题
收起左侧

C语言学生成绩管理系统课程设计报告

[复制链接]
跳转到指定楼层
楼主

《程序设计基础》课程设计报告

设计题目
学生成绩管理系统
学生姓名

学生班级

学生学号

指导教师


完成时间 :12 月  25日

目录

正文

1.设计目的与要求

2.系统需求分析

3.总体设计

4、详细设计

5、调试与测试

6、总结与体会

参考文献
正文
1.设计目的与要求

设计目的:学生成绩管理系统是为了在这个信息时代高速发展的今天,通过计算机取代传统的纸张记录人力处理的方法,提高处理学生信息的速度,提高工作效率,并且通过保证软件的正常运行即保证了工作的正常运行,减少人力工作中可能出现的失误,不仅保证了工作的执行力度而且还提高了工作的准确度、效率。

设计要求:熟练掌握运用这个学期学的C语言知识用VISAL C++软件编写程序,通过设计这个程序充分考察这个学期的知识是否已经落到实处,进行实践。在学生成绩管理系统中加入足够数量的功能,保证这个系统的多功能性以保证学生成绩管理系统的完善。通过不断的调整测试,找出系统中的bug,各种语法错误和逻辑错误,确保这个系统在处理信息的过程中系统不会出现崩溃或信息处理错误,导致学生成绩导入、处理发生错误,或导致信息处理工作无法正常进行。还有重要的是,选择尽量高效,高利用率的方法来编写程序,避免使用低级的编程手法来编写系统,导致不必要的信息处理的繁杂或者较长的程序执行时间。


2.系统需求分析

对于学校来说,每个学期都有大量的考试,有大量的学生,有大量的成绩信息进行处理,如若使用人工处理的方法,这庞大的信息量和信息处理难度是非常可怕的。因此,我们应该借用计算机来实现学生成绩管理,实现工作准确度的提高和效率的提升。在学生管理系统中,对学生成绩的管理至少应该包括学生数据的输入、输出、查找、处理、保存等功能。为了保证程序的可读性,在Visal C++里用C语言应该使用对各单独的函数和单独的文件将每个功能都分开,以满足复杂的功能的实现。为了保证不浪费有限的空间,应该使用链表代替有可能浪费大量空间的数组。为了实现数据处理的简化,应该自定义一个结构体以此来更高效的实现学生信息的输入输出调用。

3.总体设计

1)问题分析

学生成绩管理系统首先应该实现的是用户通过系统来输入学生的各种数据,所以需要用户首先输入信息,所以需要数据输入功能。其次是对信息的处理,应该要对信息进行备份保存,所以需要保存至文本文件功能。再者就是对信息的处理了,对总体学生的各种数据进行比较,处理,汇总,输出,所以需要求平均分,最高分,最低分数据搜索,学生数据输出。用户需要的是尽量高效的处理效率,尽量完善的功能,还有适当的系统占用空间大小,所以应当使用恰当的数据储存方法,数据调用处理方法。

2)设计思路

(1)显示主菜单界面,包括输入学生的数据记录、保存数据记录、输出最高分和最低分、求平均分、查找指定的学生信息、输出学生的成绩等级、输出所有学生的信息还有退出功能。

(2)每项功能之间都是独立的,所以应该是用多文件多函数结构,通过在主函数中调用其他函数来实现功能的使用。

(3)学生的信息包括了姓名、学号、各科成绩,故选择定义结构体来简化数据的储存。

(4)因为大部分功能需要对每一个同学的信息进行查看并处理,故使用链表来实现信息的储存、输出、查看、处理。

(3)程序结构

(1头文件

(2数据结构

(3函数声明

4、详细设计

班级学生成绩管理系统的详细设计是各个功能的实现,即为每个函数每个功能的设计思路和编程过程。

(1主函数

主函数是班级学生管理系统的入口函数程序,提供各功能模块的操作。

首先调用菜单函数呈现给用户菜单,菜单使用数字来标记各功能,要求用户通过输入数字来选择要实现的功能,如果输入错误,则提示用户重新输入,用default实现。用scanf()函数来接收用户的输入,用多分支条件语句switch()case…来实现子函数的调用,从而实现各个功能的使用。在实现其中一个函数的调用后用break;跳出分支语句后,询问用户是否返回主菜单,要求用户输入y或n,如果返回主菜单,则清空之前显示的数据,如果不返回则要求用户输入像要实现的功能所代表的数字,如果输入错误,则提示用户重新输入,这三个分支使用if……else if……else……来实现,语句跳转用goto命令来实现。



(2菜单函数

函数名:view 所在文件:view.c

在main函数中调用,所有功能在函数内部完成,无需返回值,定义为void类型。

菜单用在告知用户本系统的功能,一一列出八种功能并用不同的数字代表。

(3数据输入函数

函数:input 所在文件:input.c

在main函数中调用,所有功能在函数内部完成,但需要返回链表的表头,定义为struct stu*类型。

此函数要求用户用键盘输入,scanf语句来接收数据,用以上给出的结构体类型struct stu来储存。创建链表,创建head,p,q三个结构体类型指针,head为表头,

(4)保存至文本文件函数

函数:save 所在文件:save.c

在main函数中调用,所有功能在函数内部完成,无需返回值,定义为void类型。

以形参接收链表的表头,定义一个file类型的文件指针fp,用fopen()函数以只写方式打开文本文件,将fp指向指定的文本文件,从链表开始将每一个数据用fprintf()函数逐一写入文本文件,当一个学生的所有数据全部输入完,指针指向下一个学生的数据,直到指针指向空停止,此处使用循环结构do……while……。全部数据输入完毕,使用fclose()函数关闭文本文件。

(5输出最高分最低分函数

函数:compare 所在文件:compare.c

在main函数中调用,所有功能在函数内部完成,无需返回值,定义为void类型。

此函数需要输出所有科目和总分的最高分,故定义了mathmax,mathmin,englishmax,englishmin,computermax,computermin,totalmax,totalmin。运用if语句,将每一个数据与max和min比较,若该数据比max大则取代max,若比min小则取代min。

(6)输出平均数函数

函数:average 所在文件:average.c

在main函数中调用,所有功能在函数内部完成,无需返回值,定义为void类型。

用do……while……语句来实现所有学生数学,英语,计算机成绩还有总分的相加,运用+=符号。并在定义了count,放在其中一个科目的do……while……语句中,每运行一次就自加一次,最后得出学生总人数。然后将得到的所有学生的数学成绩的总和、英语成绩的总和、计算机成绩的总和总分的总和在输出的前均除以count,输出各科平均分。

(7)查找指定学生信息函数

函数:search 所在文件:search.c

在main函数中调用,所有功能在函数内部完成,无需返回值,定义为void类型。

通过链表,使指针逐一指向每个学生的信息,并且取其中的学号来与用户输入的n作对比,用do…while…语句来控制这个比较的过程,用if语句来实现当学生的学号等于用户需要查找的那个的时候先输出那个学生的信息,再用return;结束search函数的调用返回主函数。




(8)输出所有学生信息函数

函数:output 所在文件:output.c

main函数中调用,所有功能在函数内部完成,无需返回值,定义为void类型

同样用链表来调用学生的数据,当一个学生的数据全部输出完之后,指针指向下一个学生,直到指针指向空的节点结束output函数的调用。


(9学生等级函数

函数:level 所在文件:level.c

main函数中调用,所有功能在函数内部完成,无需返回值,定义为void类型。

同样使用链表,但不同的是每一块求等级的语句前需要将 p指向表头head,因为执行完每一块求等级的语句之后,p会停留在指向空,这样如果直接再去当做表头来进行下面的语句中的数据调用,明显属不合理的,所以每次都要将p重新指向表头。并运用if…else if…else if…else多分支语句来筛选学生成绩并按照成绩高低来决定哪个等级的人数加一。

(10)reinput函数

函数:reinput 所在文件:reinput.c

函数:level 所在文件:level.c

为了优化系统原来不能重复输入学生数据,所以添加了一个重复输入的函数,在第一次输入数据,input函数执行时,先创建链表。在重复添加数据时,则执行reinput函数,在input函数创建的链表后,在最后一个结点的后面重新接入数据,输入数据,储存数据。


(11自定义头文件head.h

用于连接各文件个函数,在头文件中定义结构体数组以便让所有的文件、函数都能随意调用,全局定义各种函数以便主函数调用。

5、调试与测试

(1)一开始不会使用链表,先使用数组来进行处理,例如主函数是这样的:

使用数组info[]来实现数据处理

后来改成了链表的形式,如:


从input函数那里接收了表头,传递给各函数,在各函数内部调用链表进行数据处理。

当所用到的知识比较复杂的时候,可以先用简单的只是去实现系统基本功能,语句的书写,将系统的大体结构完成的时候再使用复杂的手法来优化系统,这样不易出错。

(2)链表的创建

(3)链表的调用

以求数学最高分为例

从表头开始调用表头指向的第一个节点中的数学成绩的数据进行处理,完成后将指针移向下一个节点,继续重复,并运用do······while语句来控制循环直到指针指向空。

(4)链表的研究

创建了一个小的系统来研究链表,因为在学生成绩管理系统中研究不方便,故做了一个小的系统,基于老师的代码,研究链表的创建和调用

(5)写入文本文件

第一步:

第二步:打开文件


第三步:数据写入

第四步:关闭文件

(6)函数返回值为指针类型和指针和指向函数的指针的区别

以input函数为例:

函数返回值为指针类型:struct stu *input()

指向函数的指针:struct stu( *input)()

(7)在获得最大最小值之前要先定义并初始化变量max和min

max应该初始化为0以保证数据能比max的初始值大以取代其初始值。

但min的初始值不应为0因为如此min的值永远是最小的,数据不符合if里面的筛选条件p->(某数据)<min,所以应该初始化为min=101。

(8)在把数据写入某个指定文件时,如果指定位置为E:/system/student,它不会被放在E盘的system文件夹中的student.txt文件中,而是在E盘中创建了以下的文本文件。

(9)优化数据的类型,因为计算平均分如果将平均分定义为int,会丢失部分数据,故将其保留小数点后两位以float类型输出。

(10)优化,要求用户必须先输入数据再执行其他功能。

原来:

优化后:

(11)验证每个函数,每个功能是否能正常运行

0:退出系统

1:输入学生的数据记录

2:保存数据记录

3:输出最高分和最低分

4:输出平均分

5:查找指定学生的信息

6:学生等级

7:输出所有学生的信息

(12) 在查找信息时,如果输入错误,在重新输入学号后,会引起系统崩溃,其实是在判断输入之前,系统将所有的学号先检查了一遍,才判断出输入错误,此时p指向了null,此时继续从p开始查找,肯定会引起崩溃。所以将表头保留,每次查找之前,都先将p指向表头,避免错误。

原来:

改正:




(13)在输入数据之前,进行其他功能的操作是没有任何意义的,所以在执行其他功能之前,先判断有无先输入数据。


(14)为了能够反复输入数据,添加了一个reinput函数,在input函数,第一次输入的数据后,进行数据的添加。


6、总结与体会

通过这次设计一个系统让我学到了很多,程序设计的思维,学会从用户体验出发,设想用户的需求,从而将系统所应该具有的功能一一设计出。通过这种方式我能更好的实现课堂知识的实践,将课堂上的知识点进行查缺补漏。这次的设计老师还要求我们运用没有学过的链表、文件流等内容,这更考验我们的自学能力,通过老师提供的ppt和提供的系统作范例,研究出了如何创建并使用链表,还有如何打开、写入、关闭文件,并且教给不会的同学,以此既帮助了对方,也帮助了我加深对知识点的理解和发现自己的不足。因为这个系统包含的内容比较多,容易出现大量的错误,这让我学会了认真仔细的注意查看每一行代码,查缺补漏,不断的调试,发现系统的错误并改正。


参考文献







全部资料下载地址:源码+完整论文(word格式 可编辑):
http://www.51hei.com/bbs/dpj-87640-1.html







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-8-15 01:56 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:341107 发表于 2018-5-30 09:17 | 只看该作者
好资料
回复

使用道具 举报

地板
ID:459813 发表于 2019-1-2 12:38 | 只看该作者
好资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表