基础篇 学生成绩管理系统 随着大数据、云计算、物联网、5G等信息技术的快速发展,基于“互联网+”的智能系统在众多领域得到广泛应用。其中,教育信息化也日益深入,智慧校园在各大院校普遍推广。智能化的教务管理模式逐渐取代低效率的人工管理方式或半自动管理方式,大大提高了工作效率。因此,开发“学生成绩管理系统”,对学生成绩进行高效的信息化管理非常必要。 本篇以爱思科技虚拟公司采用C语言开发“学生成绩管理系统”为主线,遵循软件开发流程,构建真实企业研发情境和工作任务。对接软件开发岗位能力需求,由易到难,递进式对项目不断重构,设计沉浸体验式教学任务,注重分层分类,培养学生的专业能力和职业素养。 第1章学生成绩管理系统 需求分析和设计 本章主要完成学生成绩管理系统的需求分析和设计,并搭建项目开发环境Visual Studio 2010(全国计算机等级考试二级C语言程序设计考试官方指定开发环境)。需求分析是指对要解决的问题进行详细的分析,弄清楚问题的要求,包括需要输入什么数据、要得到什么结果、最后应输出什么。该阶段就是确定要“做什么”。设计阶段是要把“做什么”的逻辑模型转换为“怎么做”的物理模型。该阶段描述了软件的总体结构,然后对结构进行细化。应采用软件工程的思想完成项目的需求分析和设计,引导学生主动学习。按照企业工作过程,组建项目开发团队,让学生全程参与软件开发。  任务1.1需求分析  任务1.2系统设计  任务1.3项目开发环境搭建 知识目标 (1) 掌握软件工程的相关知识。 (2) 掌握软件开发流程。 (3) 理解并掌握项目的需求分析和设计。 能力目标 (1) 能够搭建项目开发环境Visual Studio 2010。 (2) 能够熟练使用Visual Studio 2010创建C语言项目,掌握程序开发流程。 (3) 能够自主查阅资料,具备分析问题和解决问题的能力。 素质目标 (1) 培养学生养成遵循软件行业研发规范的职业精神。 (2) 培养学生精益求精的专业精神。 (3) 增强学生信息安全意识和知识产权意识。 (4) 培养学生具备良好的沟通交流能力和团队协作精神。 (5) 培养学生劳动习惯,增强劳动意识。 任务1.1需 求 分 析 为了实现对学生成绩的信息化管理,实现工作流程的系统化、规范化和自动化,计算机科学系的爱思科技虚拟公司决定采用C语言开发“学生成绩管理系统”,帮助老师对学生成绩进行高效的查找、更新和维护等操作,也有助于学生对自己的成绩进行随时查看和查找。 项目的负责人是爱思科技虚拟公司的周老师,与学校有关部门沟通了实际的成绩管理流程后,作为项目经理组建开发团队。开发团队由虚拟公司的学生项目小组组成,每个项目组有6名左右的学生,自选一名组长。每个项目组必须根据项目经理的功能要求、技术要求和进度要求,合作完成整个学生成绩管理系统。在完成项目的过程中,培养学生的团队合作能力、交流沟通能力和良好的自学能力。 学生成绩管理系统由哪些用户使用,这些用户又具备哪些功能呢?我们通过分析确定各类用户功能,并进行需求描述与评审,这一系列的活动构成软件开发流程的需求分析阶段。需求分析是一个非常重要的过程,将直接影响后续软件开发的质量。 1.1.1软件工程的定义 软件工程是用工程、科学和数学的原则与方法研制、维护计算机软件的有关技术及管理方法。它由方法、工具和过程三部分组成。软件工程方法是完成软件工程项目的技术手段。它支持项目计划和估算、系统和软件需求分析、软件设计、编码、测试和维护。软件工程使用的软件工具是人类在开发软件的活动中智力与体力的扩展和延伸,它自动或半自动地支持软件的开发和管理,支持各种软件文档的生成。软件工程中的过程贯穿于软件开发各个环节,管理者在过程中,要对软件开发的质量、进度、成本进行评估、管理和控制。 软件工程的目标是: 在给定成本、进度的前提下,开发出具有可修改性、有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性并满足用户需求的软件产品。 1.1.2软件开发流程 软件开发流程即软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法与方法、软件的总体结构设计和模块设计、编程和调试、程序联调和测试,以及编写、提交程序。软件开发大致包括以下阶段。 (1) 软件系统的可行性研究。可行性研究的任务是了解用户的要求及现实环境,从技术、经济和社会等方面研究并论证软件系统的可行性。 (2) 需求分析。确定待开发软件的功能需求、性能需求和运行环境约束,编制软件需求规格说明书。软件需求不仅是软件开发的依据,也是软件验收的标准。 (3) 概要设计。概要设计需要对软件系统的设计进行考虑,包括系统的基本处理流程、系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等,为软件的详细设计提供基础。 (4) 详细设计。对概要设计产生的功能模块逐步细化,包括算法、数据结构和各程序模块之间的详细接口信息,为编写源代码提供必要的说明。 (5) 编码。根据详细设计文档将详细设计转化为所要求的编程语言的程序,并对这些程序进行调试和程序单元测试,验证程序模块接口与详细设计文档的一致性。 (6) 测试。①组装测试: 将经过单元测试的模块逐步进行组装和测试,并对系统各模块间的连接正确性进行测试 ; ②确认测试: 测试系统是否达到了系统需求,测试时应有客户参加。在确认测试阶段应向用户提交最终的用户手册、源程序及其他软件文档。 目前,软件开发的模型包括瀑布模型、快速原型模型、螺旋模型等,但基本上都以不同方式包括以上阶段。 1.1.3系统需求分析 通过以上知识的学习,项目组就可以实施项目需求分析的任务了。各项目组分工协作,反复、认真地到教务处和各系部调研系统的需求,逐步明晰学生成绩管理的工作流程,明确系统的功能需求。同时,在与用户沟通的过程中,教务处强调了学生信息和成绩信息的安全性和保密性,学生小组进一步增强了信息安全意识和软件版权意识。在此基础上,完成了项目的总体功能需求分析。学生成绩管理系统功能模块图如图11所示。本项目分为两种用户角色: 管理员和学生。 (1) 管理员的功能需求。按管理员权限选择后,能够对班级成绩进行添加、对班级成绩进行浏览、对班级成绩进行统计,包括求最高分、求最低分、求平均分、求及格率、求各分数段所占比例,以及对班级成绩进行排序。管理员用例图如图12所示。 (2) 学生的功能需求。按学生权限选择后,能够按学号或姓名等信息查询成绩。学生用例图如图13所示。 项目经理周老师要求每个项目小组自主查阅资料,根据软件工程的思想,撰写需求规格说明书。需求规格说明书的主体包括两部分: 功能与行为需求描述,非行为需求描述。功能与行为需求描述说明系统的输入、输出及其相互关系,非行为需求是指软件系统在工作时应具备的各种属性,包括效率、可靠性、安全性、可维护性、可移植性等。 图11学生成绩管理系统功能模块图 图12管理员用例图 图13学生用例图 1.1.4组建开发团队 在开发项目之前,基于软件行业的项目管理和企业化的软件开发规范,组建开发团队。为了培养具备“项目组长”潜质的高素质软件开发技术技能型人才,周老师仿真IT企业的工作场景,参照IT企业的项目组配置,将学生进行分组,按照每 组6人仿真企业的一个开发小组。项目组的组织结构图如图14所示。 图14项目组的组织结构图 (1) 项目经理(project manager): 项目团队的领导者和管理者。带领项目组保质保量完成软件的需求、设计、开发和测试工作,随时把握项目存在的风险,制定对策。 (2) 项目组长(team leader): 项目开发负责人。参与项目需求分析,协助项目经理完成系统架构设计、开发等技术方面的事务,以及项目的整体质量和进度把控。 (3) 开发人员: 负责项目各功能模块的代码编写以及单元测试。 (4) 测试人员: 通过人工或自动化手段运行测试系统,以检验它是否满足规定的需求或弄清楚预期结果与实际结果之间的差别。 开发团队由一名项目经理和五个项目小组组成。每个项目小组由6名学生构成,项目小组分工情况如表11所示。 表11项目小组分工情况 小组编号成员角色职 责 描 述 0周老师项目经理系统总体设计与项目管理 1 高伟强项目组长带领组员完成“学生成绩管理系统”需求分析和设计,辅导组员完成编码调试,以及带领全体组员完成项目测试 田鼐副组长协助组长完成各项任务 王列岩小组成员成绩添加和浏览功能的实现 张康林小组成员成绩统计功能的实现 李振甲小组成员成绩排序功能的实现 张灿小组成员学生成绩查询功能的实现 2 郭波项目组长带领组员完成“学生成绩管理系统”需求分析和设计,辅导组员完成编码调试,以及带领全体组员完成项目测试 徐子文副组长协助组长完成各项任务 史心胜小组成员成绩添加和浏览功能的实现 丁迎双小组成员成绩统计功能的实现 周成兵小组成员成绩排序功能的实现 张杰小组成员学生成绩查询功能的实现 3 徐志权项目组长带领组员完成“学生成绩管理系统”需求分析和设计,辅导组员完成编码调试,以及带领全体组员完成项目测试 秦磊副组长协助组长完成各项任务 王文静小组成员成绩添加和浏览功能的实现 刘之铉小组成员成绩统计功能的实现 胡炜小组成员成绩排序功能的实现 于灿丽小组成员学生成绩查询功能的实现 4 王仁尚项目组长带领组员完成“学生成绩管理系统”需求分析和设计,辅导组员完成编码调试,以及带领全体组员完成项目测试 朱鑫宇副组长协助组长完成各项任务 陈红玉小组成员成绩添加和浏览功能的实现 杨硕小组成员成绩统计功能的实现 任义小组成员成绩排序功能的实现 杨科科小组成员学生成绩查询功能的实现 5 渠立格项目组长带领组员完成“学生成绩管理系统”需求分析和设计,辅导组员完成编码调试,以及带领全体组员完成项目测试 唐山副组长协助组长完成各项任务 符锦哲小组成员成绩添加和浏览功能的实现 王石亮小组成员成绩统计功能的实现 马道森小组成员成绩排序功能的实现 张建昊小组成员学生成绩查询功能的实现 任务1.2系 统 设 计 在任务1.1中,研发团队已经完成了学生成绩管理系统的需求分析,接下来,还不能马上进入代码编写阶段,而是要把软件系统的界面设计和功能模块设计等要素确定下来。软件设计过程是对程序结构、数据结构和过程细节逐步求精、复审并编制文档的过程。 本任务将对学生成绩管理系统的总体设计思路进行梳理和分析,以使研发团队对项目有一个较为整体的认识。 要完成这个任务,周老师要给项目组的同学们分析一下需要掌握哪些知识。本任务主要涉及软件工程中项目设计阶段主要做什 么。项目设计一般包括概要设计和详细设计。下面对概要设计与详细设计的相关知识进行介绍。 1.2.1概要设计 概要设计是指设计软件的结构,包括组成模块、模块的层次结构、模块的调用关系,每个模块的功能等。同时,还要设计该项目的总体数据结构和数据库结构,即应用系统要存储什么数据,这些数据是什么样的结构,它们之间有什么关系。概要设计阶段会产生概要设计说明书,说明系统模块划分、选择的技术路线等,整体说明软件的实现思路,并且需要指出关键技术难点等。它面向设计人员和用户,用户也能看得懂,不要求追求细节,是对用户需求的技术响应,是二者沟通的桥梁。 1.2.2详细设计 详细设计阶段是对概要设计的进一步细化,即为每个模块完成的功能进行具体的描述。要把功能描述转变为精确的、结构化的过程描述,是具体的实现细节描述。详细设计阶段常用的描述方式有传统流程图、NS图、PAD图、伪代码等。详细设计阶段会产生详细设计说明书。该阶段通常面向开发人员,开发人员看了详细设计说明书,就可以直接写代码。 1.2.3学生成绩管理系统项目设计 通过以上知识的学习,项目组就可以实施学生成绩管理系统项目的设计任务了。项目设计主要包括概要设计和详细设计两部分 。 1. 概要设计 1) 项目设计思路 程序设计一般由算法和数据结构组成,合理地选择数据结构在项目的开发过程中非常重要。本项目首先使用数组来存放成绩信息,完成项目的第一个版本。数组会占用连续的存储空间,当使用数组来存放数据时,要事先预估数组大小。若估计过大,会浪费空间; 估计过小,不容易扩充。特别是当需要插入数据或删除数据等操作时效率较低。因C语言对链表的动态操作比较灵活,因此我们使用带头节点的单链表结构来存放学生成绩。链表的每个节点使用结构体来存放学生成绩信息,每个节点除了存放信息外,还存放节点之间的关系,即包含一个指向下一个学生信息的指针域,因此使用结构体、指针和链表来重构项目。最后由于前两个版本的成绩信息都无法保存,引入文件来再次重构项目。考虑由点及面、由简到繁,由易到难的学习规律,对项目逐步重构,项目的实施过程如下。 第一版: 使用数组来存放学生成绩。通过这个版本的实施,使学生深入理解和掌握数组的应用,尤其是深刻理解数组作为函数参数的传递过程。 第二版: 使用结构体、指针和链表来存放学生成绩。通过这个版本的实施,使学生深入理解和掌握结构体和指针链表相关知识,并能灵活运用。 第三版: 使用文件来存放学生成绩。通过这个版本的实施,使学生深入理解和掌握文件的相关知识,并能灵活运用。 2) 数据结构设计 “学生成绩管理系统”中将一个学生记录设计为一个节点,节点的类型为结构体,用结构体中各个域表示学生成绩信息,包含学号、姓名、成绩三个数据,每个节点除了存放信息外,还存放节点之间的关系,即包含一个指向下一个学生信息的指针域。 学生成绩结构体的定义如下。 struct STU { char stuId[8]; char stuName[20]; int cScore; struct STU *next; }; 在main()函数中定义一个头指针,指向链表的第一个节点。 struct STU *head = NULL; 3) 软件系统界面 软件系统一般有基于控制台的应用、基于窗体的应用和基于Web的应用。本项目开发的是Windows Console Application,所以界面是输出在Windows控制台上的,具体设计如图15所示。 图15界面设计 2. 详细设计 学生成绩管理系统主要采用模块化程序设计的方法实现各功能,即将各功能抽取成自定义的函数,并在菜单中调用这些函数,实现各个功能。下面详细设计该项目的各个功能的函数原型,表12使用数组来存放学生成绩。 表12项目第一版本函数设计 功能函 数 原 型参 数 列 表返回值 班级成绩添加void addScore(int s[])成绩数组s无 班级成绩浏览void listScore(int s[])成绩数组s无 最高分int maxScore(int s[])成绩数组sint类型最大值 最低分int minScore(int s[])成绩数组sint类型最小值 平均分double avgScore(int s[])成绩数组sdouble类型平均分 及格率double passRate(int s[])成绩数组sdouble类型及格率 各分数段所占 比率double segScore(int s[],int a,int b)成绩数组s和分数段开始值a与结束值bdouble类型各分数段比率 成绩排序void sortScore(int s[])成绩数组s无 查询成绩int searchByScore(int s[],int queryScore)成绩数组s和待查询的成绩queryScoreint类型,如果为-1表示成绩不存在,其他存在 由于数组的操作效率低,而对链表的动态操作比较灵活,因此使用带头节点的单链表结构来存放学生成绩。每个节点除了存放信息外,还存放一个指向下一个学生信息的指针域,因此使用结构体、指针和链表来重构项目。表13列出了 项目第二版各个功能的函数原型。 由于项目的前两个版本学生成绩无法保存下来,所以第三版在第二版的基础上使用文件来存放学生成绩信息。各个功能的函数原型设计基本与第二版本相同, 但增加了读文件和写文件两个功能,如表14所示。