软件工程课程设计报告
系统名称 ___ 学生学籍管理系统___学 号 ___ XXX_ __ 姓 名 ___ XXX __ 批 次 ___ XXX _
摘 要
当今社会中,计算机的使用已经深入到日常工作和生活的方方面面。Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家,各行各业的人们无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上已经充满了多如牛毛的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。我们都知道,对于学生的学籍管理是一个教育单位不可缺少的部分,它的内容对学校的管理者来说至关重要,所以学生学籍管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。而使用计算机对学生学籍信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、存储量大、保密性好等。这些优点能够极大地提高学生管理的效率,也是学校科学化、正规化管理的重要途径。
关键词:学生学籍管理系统; SQL SERVER 2000;数据库;软件工程
序 言
学生学籍管理系统是常见的一种管理系统,包括学生信息、家庭信息、奖惩信息、毕业信息,学生社会关系,学生成绩管理和学生课程信息管理等内容的设计。由于目前的学生学籍管理系统并不十分完善,在高等学校的教务管理工作中,学生信息的网上查询都是十分复杂、棘手的工作。遵从以往的工作方式,该工作的工作量大,管理繁琐,既耗人力,又耗物力;如今面对大量的学生数据、报表,手工处理方式已经很难跟上现代化的步伐。随着计算机技术及网络通讯技术的飞速发展,许多学校已经有了较好的计算机应用甚至网络硬件建设基础。因此为提高学校管理工作的现代化、科学化水平,保证信息处理的即时化、准确化,开发一套对学生学籍进行管理的软件是极其重要的,而且是必需的。
本系统正是为解决这一问题而设计的,大大减少了以往学生管理工作的工作量,提高了工作效率,适应时代的步伐。 。
I
1、可行性分析
1.1问题描述
随着高校规模的不断增加,学生人数的增加,学校对学生管理的难度也越来越大,而学校对学生的管理,其实主要是对学生信息的管理,所以,学生信息管理是高校管理中很重要的一部分,它关系到整个高校的现代化程度。现代科技的发展,尤其是软件行业的发展使得很多的管理工作都由计算机来完成,这样不仅能节省人力和物力,而且能够得到一些对决策起重要作用的信息。而高校作为一个人数比较多的单位,也需要开发出相应的软件对学生学籍进行适当的管理。只有管好学生才能更进一步的做强教育。现在很多高校都在使用计算机对学生学籍进行管理,运用计算机来管理学生学籍,从而取代了人工管理模式下由于各种原因出现管理漏洞的可能性,因而减少了工作人员的难度性,提高了工作效率。我们在现行系统初步调查的基础上提出了新系统目标,即新系统建立后所要求达到的运行指标,这是系统开发和评价的依据。 1.2可行性分析研究 1.2.1技术可行性
技术上的可行性分析主要分析现有技术条件能否顺利完成开发工作,硬、软件配置能否满足开发者需要等。
根据客户提出的系统功能、性能及实现系统的各项约束条件,根据新系统目标来衡量所需的技术是否具备,本系统是一个数据库管理和查询的系统,现有的技术以较为成熟,硬件、软件的性能要求、环境条件等各项条件良好,估计利用现有技术条件应完全可以达到该系统的功能目标。同时,考虑给予的开发期限也较为充裕,预计系统是可以在规定期限内完成开发。 1.2.2经济可行性
主要是对开发学籍管理系统的高校资金进行评价,一方面是估算开发它的支出费用,其中包括设备购置费、软件开发费、管理和维护费、人员工资和培训费等。另一方面是估算学籍管理系统这个软件可能取得的收益中可以用钱来衡量的那部分。并对目前的软件市场进行调查,所做软件是否有很大的销售市场和相当规模的用户群。所做软件的开发成本与客户提出的要求是否可达到双方都满意。
0
并且,分析系统开发是否会对其它产品或利润带来一定影响。
经过调查我们了解到,现在很多高校都在寻找功能更加齐全的管理系统来取代旧系统,而且这个软件带来的收益远远超过它的开发所花费的代价。经过对上述几个方面的调查研究和分析,我们得出高校这个软件的市场前景是相当客观的,在经济角度来说,开发学生学籍管理是可行的。 1.2.3操作可行性
主要是了解高校学籍管理的相关人员对开发信息系统是否支持,现有高校学籍管理制度和方法是否科学,规章制度是否齐全,原始数据是否正确等。高校学籍管理人员积极支持该系统开发,使新系统能够充分的发挥作用;系统界面友好美观,操作简单易行,易于理解,功能更加齐全。由于管理人员已经在使用旧系统,对计算机的简单操作已经非常熟悉,所以操作者经过短时间的培训就可以使用高校学籍管理系统。 1.3结论意见
经过认真地全面地可行性研究,系统基本上做到了在技术、经济、运行、法律上的可行。因此,相信在按照计划上实施的前提下,全系统的设计将会按时、高质量完成。所以,系统研制和开发是可以马上进行的。
2、项目开发计划
2.1编写目的
经过项目的可行性分析,得出项目可进一步进行下去的结论,结合现有的软件开发技术,在软件继续进一步的开发之前首先给出此软件项目计划。
1
2.2项目背景
项目分析单位在接到项目分析员给出的项目可行性分析报告后,在本系统,即仓库管理系统开发主管部门的统一下制定用于软件实质开发的软件项目计划,以使软件开发单位理解软件开发要求,进行开发。 2.3项目概述
1、工作内容
让计算机对学生信息进行自动管理,管理员可以直接在计算机上实现学生信息管理,并能在一定程度上实现自动化。 2、条件与限制
开发该软件的条件比较简单,以开发单位目前的经济与技术条件已完全具备开发的条件。该系统可在用户要求的期限内完成。
3、产品 1)程序
具体程序和源代码在文件夹源代码中。 2)文档
文档内容包括:
(1) 封面
(2)目录
(3)中文摘要100字左右;关键词3-5个 (4) 序言
(5)可行性分析 (6)项目开发计划
(7)需求规格说明(包含需要的系统流程图、数据流程图、数据字典、E-R图)
(8) 概要设计(包含总体软件结构图、总体数据结构) (9) 详细设计(对概要设计内容进行详细设计) (10) 设计总结、参考文献、致谢等 4、验收标准
软件的验收标准完全由用户提出的软件需求制定,能保证软件的基本符合用户的要求。 2.4项目开发计划
1、任务分解
2
分三个大的阶段进行开发第一阶段完成本系统的数据流图跟E-R图。第二阶段完成概要设计跟详细设计。第三阶段书写文档。
2、预算
软件资金投入较少,具体预算分配简略。 3、关键问题
各模块之间的联系和后台数据库的完成。使用目前的设备与现有开发技术完全可以开发出该系统,总的来说该项目没有较大的技术难点与其他的一些风险因素。对于出现的一些小难点总都能得到解决。
3、需求分析
3.1任务需求分析
经需求分析,所得本系统所实现的基本功能,如图3.1思维图所示:
3
图3.1 学生学籍管理系统
上图为本系统所完成功能的一个基本信息图。用户可通过本软件,对学生的在校情况信息有一个清晰的了解,帮助用户查询和修改学生的相关信息,从而对学生实现信息化的管理。
经分析先给出该系统的系统流程图,如图3.2所示:
4
开 户 用失重新输入 学生课程学生基本学生社会管理自己的学生奖惩学生毕业成读取用户类普通用用户管理管管理普通用户信息 学生成绩管帮助 图3.2系统流程图
该系统主要包括学生基本信息模块,家长信息模块,奖惩信息模块和毕业信息模块,系统要实现基本信息录入、修改、删除、保存和查询等功能:
信息的输入,包括学生基本信息、家长信息、奖惩信息、毕业信息等。 信息的修改、删除。
根据要求,查询符合条件的各类信息。
依据实际需要,对重要新信息进行统计。 3.2数据流图、数据字典及实体联系图 3.2.1 数据流图
数据流图由四种基本的元素构成:数据流(Data Flow),处理(Process),数据存储和数据源(数据终点)。
数据流(Data Flow):为具有名称且有流向的数据,用标有名称的箭头表示,一个数据可以是记录、组合项或基本项。
处理(Process):表示对数据所进行的加工和变换,在图中用矩形框表示。指向处理数据流为该处理的输入数据,离开处理的数据为处理的输出数据。
数据存储:表示用文件方式或数据库形式所存储的数据,堆砌进行的存取分别以指向或离开数据存储的箭头表示。
数据源及数据终点:表示数据的来源或数据的去向,可以是一个组织或人员,它处于系统范围之外,所以又称它为外部实体,它是为了帮助理解系统界面而引入的,一般只出现在数据流图的起点和终点。
5
该系统数据流图如图3.3所示:
3.2.2数据字典
数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。
由于本次设计是小型软件系统的开发,所以采用卡片形式书写数据字典。每张卡片上保存描述一个数据的信息这样做更新和修改起来比较方便,而且能单独处理描述每个数据的信息。下面将列出若干数据元素的数据卡片信息。
数据字典卡片:
名称:学生奖惩信息 别名: 描述:学生奖惩信息的描述 定义:学号+姓名+奖惩名称+奖惩日期+奖惩原因+评价 名字:普通用户 别名:学生用户 描述学生自己的信息,查看自己的奖惩信息 名字:学号 别名:Sno. 描述:惟一地标识一个特定学生的关键域 定义:学号=10{字符} 名称:学生家长信息 别名: 描述:对学生家长信息的描述 定义:学号+姓名+家长姓名+工作单位+职务+电话+年龄+文用管受 信接信更新 系 理 统信 信查处1 学生信图3.3 系统数据流 6
名字:学生毕业信息 别名: 描述:学生毕业后的信息描述 定义:学号+姓名+学历+学位+工作单 位+职务+单位+政治面貌+电话 名字:普通用户 别名: 普通用户 描述:输入学生自己的信息,查看其他的信息 定义:用户名+密码 别名: 描述:学生在校期间所修课程信息 定义:学号+姓名+课程名称+代课老师 +所修时间+备注 位置:普通用户表
名称:学生基本信息
别名:Sinfom 描述:对学生基本情况的描述 定义:学号+姓名+性别+民族+出生日期+家庭住址+通信地址+考生来源+家庭背景+入学分数+名字:学生课程信息 名字:普通用户 别名:学生信息 描述:学生在校期间所修课程信息 名称:系统帮助信息 描述:为用户提供系统帮助 定义:版本信息+使用说明+帮助信息+其他信息 位置:普通用户表 3.2.3实体联系E-R图
根据对数据流图和数据字典的分析,我们可以确定该应用中的实体,属性和实体之间的关系,并画出如下所示的E-R图。
7
姓 家庭学 所在
性 学年 邮政出生图3.4学生实体图
家 长 工作职 姓年文化程电话号
图3.5 家长实体图
8
毕业去向考 就 其 出
图3.6 毕业去向信息表
毕业信学 电 学 工作工作职 政治图3.7 毕业工作信息图
9
学姓
所修 所选课课程备授课 图3.8 所选课程信息图
系统实体联系图,如图3.8所示:
M学家长信息 生成绩1毕业
学1 查查11 学生课程维1管查11 查1 学生信M查1 10 M1 维M奖惩图3.9 实体联系
4、系统概要设计
4.1总体设计
通过这个阶段的工作将划分出组成系统的物理元素。
系统概要设计的基本目的是用比较抽象的概括方式确定系统如何完成预定的任务,也就是要确定系统的配置物理方案。软件结构设计时应该遵循的最主要的原理是模块独立,让模块彼此间的接口关系应该尽量简单。 4.2系统功能模块图
可以根据模块独立原理对软件结构进行精化。为了合理的分解,得到尽可能高的内聚、尽可能松散的耦合,最终要的是,为了得到一个易于实现、易于测试和易于维护的软件结构,应该对模块进行再分解或合并。
系统功能模块图如图4-1所示:
学生学籍管理学生信社会关奖惩信毕业信录入删除改保存修询维护查入删除录改保存修询维护查入删除录改保存修询维护查入删除录改保存修询维护查
图4-1 系统功能模块 11
4.3数据库概念设计
数据库一般分为三级模式:外模式、概念模式和内模式。外模式也就是不同用户所对的数据视图,它将数据库内部抽象的数据及其互相之间的关系表示为简单、直观的应用界面。概念模式是数据库中全部数据的逻辑结构和特征描述,通常以某种数据模型为基础。内模式是对数据的物理结构和存储方式的描述。
在这里我们将要设计的是数据库的概念模式, 数据库概念结构设计,是在需求分析的基础上,设计出能够满足用户需求的各种实体,以及他们之间的关系,为后面的逻辑结构设计打下基础。 4.4数据库逻辑结构设计
在数据库设计中相当重要的一步就是将概念模型转化为计算机上DBMS所支持的数据模型,例如,将E-R图模型转化为关系模型,道理很简单,我们设计概念模型基本上都是一些抽象的关系,在数据库设计的实现过程中,能在计算机上有效地表示出这些关系就成了数据库设计的关键。
根据学生档案管理系统的功能要求,选取ODB ODBC作为后台数据库。 在上面的实体和实体之间的E-R图设计基础上,形成数据库中的表格及表格之间的关系。
该数据库由5个表组成,学生基本信息表,学生家长信息表,学生奖惩信息表,学生毕业信息表,用户信息表 。
主表的结构设计:
1.学生基本信息表
学生基本信息表是对学生的基本信息进行统计,学号、姓名、性别、民族 出生年月、家庭背景、考生来源、入学分数、入学政治面貌、家庭住址、通讯地址、邮政编码、所在院系、专业等信息。学生基本信息表的结构表如表4.1。
表4.1 学生基本信息结构表
字段名称 学号 姓名 性别 数据类型 char char char 12
主键 Yes No No 非空 Yes No No
民族 出生年月 家庭背景 考生来源 入学分数 入学政治面貌 家庭住址 通讯地址 邮政编码 院系 专业 char date char char smallint char No No No NO NO NO No No No NO NO NO char char char char char No No No No No No No No No No
2.学生家长信息表
学生家长信息表是对学生家长信息的统计,包括父亲姓名、父亲工作单位、父亲电话、父亲职务、父亲年龄、父亲文化程度、母亲姓名、母亲工作单位、母亲电话、母亲职务、母亲年龄、母亲文化程度等。学生家长信息表的结构如表4.2所示。
表4.2 学生家长信息
字段名称 学号 姓名 父亲姓名 父亲工作单位 父亲电话号码 父亲职位 char 13
数据类型 char char char char 主键 yes No No No 非空 Yes No No No char No No No No
父亲年龄 母亲姓名 母亲工作单位 母亲电话号码 母亲职位 母亲年龄 smallint char char No No No No No No char No No char smallint No No No No
3.学生奖惩信息
学生奖惩信息是对学生在校期间的奖惩信息的统计,包括学号、姓名、奖惩名称、奖惩日期、奖惩原因、各种评价等。学生奖惩信息表结构如表4.3。
表4.3 学生奖惩信息表
字段名称 编号 学号 姓名 奖惩名称 奖惩日期 奖惩原因 评价
4.学生毕业信息
数据类型 char char char char date char char 主键 No Yes No Yes Yes No No 非空 Yes Yes Yes Yes Yes No No 学生毕业信息有两部分组成学生毕业去向信息和学生毕业信息。学生毕业去向信息是对学生毕业以后的去向进行的统计,包括学生毕业后某些学生选择考研,某些选择就业,还有一些选择培训等。学生毕业去向信息结构表如表4.4所示:
表4.4 学生毕业去向信息表 张 虎 李 海 考 研 考研 所考学校(兰州大学) 所考学校(兰州大学) 14
张 伟 赵 刚 张 玉 就业 就业 就业 就业单位(兰州石化) 就业单位(兰州石化) 公务员 学生毕业信息是对学生毕业是的信息进行的统计,例如,某个学生的学历,所修的的学位,工作单位,职称,工作经历,政治面貌,电话等信息。学生毕业信息表如下所示:
表4.5 学生毕业信息表
李四 专科 兰州石化 质检员 无 党员 545556 张三 本科 兰州石化 质检员 无 党员 223344 姓名 学历 工作单位 职称 工作经历 政治面貌 电话 5.学生成绩管理信息
学生成绩信息管理是对学生在校期间所修课程成绩的统计。包括学生姓名、学号、院系、专业、所修课程的各科成绩、是否通过(包括补考和重修)、总学分绩。学生成绩管理信息表结构如表4.4。、
表4.4 学生成绩管理信息表
字段名称 学号 姓名 院系 专业 课程 成绩 是否通过 学分绩 数据类型 char char char char char char boolen char 15
主键 yes No No No No No No No 非空 Yes No No No No No No No
6.学生课程管理信息
学生课程信息管理模块可以帮助学生在使用本系统的同时,方便的查询自己曾学习的课程科目信息,从而及时的给用户反馈信息,让用户尽快的调整自己的学习计划。
表4.6 学生课程信息表 字段名称 数据类型 主键 非空 编号 学号 姓名 课程名称 代课老师 所修时间 备注
4.5连接数据库的特点
char int char char char time char No Yes No No No No No Yes No Yes Yes Yes Yes Yes 当开发环境通过连接到数据库上之后,在设计中使用数据库画笔可实现对该数据库中表格,视图等的操作,如创建表、修改表、删除表、增加/删除记录。设计中设计数据窗口的时候,通过对话框实现与数据的连接。在应用程序中则一般是在应用程序对象中书写连接数据库的程序代码,使得应用程序开始运行并实现与数据库的连接。
16
5、详细设计
5.1系统的主要功能及实现
根据上面的需求分析,设计好数据库系统,然后开发前台应用程序。所开发的前台界面要求用户可方便操作,同时很好的完成每一个窗口所实现的功能。
学生毕业信息模块的设计应包括以下几点功能:
首先学生毕业信息模块由两部分组成:学生毕业去向信息和学生毕业信息。 学生毕业去向信息模块主要是统计了学生毕业后的去向信息,在这个模块中包括了:例如,某个学生毕业后选择考研,在该模块中就可以查询到该学生的所有考研信息,所考学校,所修专业等信息;某个学生毕业后选择就业,在该模块中就可以查询到该学生的就业单位信息,工作单位名称,工作时间等信息;某个学生选择出国留学,在该模块中就可以查询到该学生的留学信息,留学的国家,所学专业等。
学生毕业信息模块主要是统计了学生毕业是自己的毕业信息。在这个模块中包括了学生的所有毕业信息,例如,某个学生的学历,所修的的学位,工作单位,职称,工作经历,政治面貌,电话等信息。 5.2程序流程图
程序流程图的优点是对控制流程的描绘很直观,易于掌握。 1、学生各种信息的查询功能流程图
17
用输入查询查询相应信否是否存是否
确定是结 束 图5.1查询功能流程图 2、 录入功能程序流程图
管输入信保 保存是否是 结 图5.2 录入功能程序流3、 修改功能流程图
18
用修保否保存是否是 结图5.3修改流程图 5.3用户界面设计 5.3.1一般交互设计
一般交互涉及信息显示、数据输入和系统整体控制等方面。 1)、一致性
为客户交互界面中的菜单选择、命令输入、数据显示以及众多的其他功能,使用一致的格式。在设计的过程中,基本上保持了系统的格式一致。
2)、信息的反馈
向用户及时提供视觉和听觉的信息反馈,以保证在用户和系统之间及时地建立双向通信。
在本系统设计过程中,基本做到了信息的及时反馈,在信息显示的大部分窗体中包括了保存按钮,会对数据库中的数据进行及时地刷新显示。
3)、执行有较大影响的操作前提示用户确认
19
在设计过程中,如果用户要执行删除操作,以及对数据库的读写操作时,都会有窗体弹出询问继续操作或者予以提示。
4)、减少两次操作间需要记忆的内容
为了避免用户为下一步操作而记忆大量数据,所以在设计过程中在需要数据传递的窗体中设置全局变量,来传递数据。例如在入账和入库的模块的操作中都用到了这样的方法。
5)、对话、移动和思考的效率
尽量减少用户击键的次数,在设计时考虑到了用户屏幕的布局以减少用户鼠标移动的距离,尽量避免用户在操作中发生疑问的情况。
6)、允许错误
允许用户的误操作尽量不对系统造成伤害。 7)、按功能对动作分类,并据此设计屏幕布局
屏幕布局尽量将软件所具有的所有功能在主页面展示,界面一目了然。 5.3.2信息显示设计
应当尽量为用户提供的界面显示时完整的、明确的和容易理解的,这样才能满足用户的需求。
1)、只显示与当前工作有关的信息
在用户操作有关系统的特定功能的信息时,不必看到与之无关的数据、菜单和图形。
2)、使用便于用户迅速吸收数据的方式来表示数据
在系统设计的过程中,较多地使用了表结构的形式表示数据。这样,用户可以直观的体会到图表所表示的含义。
3)、使用一致的标记、标准的缩写和可预知的颜色
为了使系统所表达的含义准确、无误,就必须适用一致的标记、标准的缩写和可以预知的缩写,这样用户就无需参照其他信息源就能理解,而正确地适用软件。
20
4)、产生有意义的错误信息
对于系统在运行过程中产生的错误尽量给用户返回一个容易理解的错误信息,以使用户保持对系统的信任,和系统的可用性。
5)、使用窗口分隔不同类型的信息
使用不同的窗口显示、保存不同类型的信息。 6)、高效率的使用显示屏
当使用多窗口时,应该有足够的空间使得每个窗口至少都能显示出一部分。此外,屏幕的大小应该选得和应用系统的类型相配套。
在各个显示数据的窗口中,由于数据窗体项目较多,所以在数据窗体空间中较多的是用了垂直和水平滚动条,以保证信息的全面正确显示。 5.3.3输入界面设计
用户的大部分时间用在选择菜单命令、键入数据和向系统提供输入。在系统中,键盘是主要的输入介质,但是鼠标等设备的也是重要的输入手段,所以,对于他们的数据输入操作有如下约定:
1、保持信息显示和数据输入间的一致性
为了方便用户的使用,鼠标应当尽量减少操作的幅度。 2、保持显示信息和输入信息之间的一致性
对于用户来说,要保证其输入的数据在显示上与其他显示的视觉特征(例如:文字大小、颜色、位置等)要一致。
对于不同类型的用户在登录到系统后,由于有不同的权限,所以在主界面中会有一些项目受到限制而无法使用,所以要使这些项目不发生作用,以保证系统安全。
21
5.4软件测试
5.4.1测试的方法和步骤
软件的测试方法有两种,一种是黑盒测试(功能测试),另外一种是白盒测试(结构测试)。
黑盒测试把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程。也就是说,黑盒测试是在程序接口进行的测试,它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当的接受输入数据并产生正确的输出信息,程序运行过程中能否保持外部信息的完整性。
白盒测试的前提是可以把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否能按预定的要求正确工作。
在本次软件的测试工作中,由于水平的限制,仅仅对软件的各个功能模块进行了测试,并对各个模块之间的接口进行了详细的测试(用黑盒测试法)。
测试的步骤
由于该系统是一个小系统,可以把整个系统作为一个单独的实体来测试。当然,在测试的过程中可以分模块、分阶段来进行。 5.4.2测试用例
1、登录测试
当用户文本框中不输入信息的时候,提示“用户名不能为空”。 当用户文本框中输入的信息不存在时,提示“输入有误”。
2、学生信息查询模块的窗体应显示某货物的所有信息,学号、姓名、性别、民族、出生年月、户口类别、家庭住址、通讯地址、邮政编码、所在院系、专业等。测试如下图:当在学号中输入\"07240521\" 按查询按钮,将显示出查询的结果如下表5.1:
表5.1 查询信息结果
22
学号 名 姓别 性族 民期 出生日家户所在业 专庭背口类院系 景 型 农民 村 农计通学院 00240521 李伟 男 汉 1987-计算机 11-20
籍贯 甘肃
当查询文本框中输入的信息不存在时,提示“没有找到”。 当查询文本框中不输入信息时,提示“输入完整信息”。 3、保存功能测试
将信息输入完整后,按保存按钮,提示“保存成功”。 4、删除功能的测试
选所要删除的行,按删除按钮提示是否确定要删除。选择是后,将所要删除的行删除。按保存按钮,保存此次操作。
5、学生信息排序功能测试
当点击排序(默认升序)按钮时显示信息如下表5.2:
表5.2 排序信息结果 学号 名 姓性民出生日家户所在院业 专62222200001201 2007 员 身份证号码 入学时间 务 学习委 \\ 担任职 备注 别 族 期 庭背口类系 景 型 工人 23
07240508 兰瑞 男汉1985-城院 计通学计算机 市
6-7 07240521 07140121 07240522 07240524 08240227 08190130 08110533 李伟 王丽 杨勉 艾可昕 郑睿 李琰 欧晓倩 男汉1984-民 农村 教师 市 农民 村 医生 市 工人 市 农民 村 教师 市 农院 城院 农院 城院 城院 农院 城院 计通学信 材料学料 计通学通3-5 女汉1986-材7-3 男汉1987-计算机 3-3 女汉1988-计通学计算机 10-15 男汉1987-计通学信 生命学药 经管学管 通1-12 男汉1987-制7-21 女汉1989-工9-6
24
6、软件使用说明书
1、用户登录
用户使用本系统时,首先要通过本系统的身份认证,此过程叫做登录。登录过程需要完成以下步骤:
根据用户名和密码判断是否为合法用户; 根据用户类型判断进入哪一个界面。
登录窗体的界面如下:
25
图6.1 登录界面
管理员登陆界面如下图所示:
图6.2 管理员登陆界面
26
系统主界面如下图所示:
图6.3 系统主界面
2、为方便起见,此系统中的管理员系统主界面的下拉菜单和学生管理主界面的下拉菜单一样,包括:
学生基本信息
学生基本信息查看 学生家庭信息查看 学生奖惩信息查看 学生毕业信息查询 退出系统
退出
4、信息录入方法
27
录入界面如图6.3示单击录入按钮,在光标处添写所要添入的信息。
图6.3 信息录入界面
5、查询功能实现方法
在使用“学生社会关系”功能模块时, 在输入相应查询条件时便可进行查询,同时显示查询结果。如图6.4所示。
28
图6.4 学生社会关系查询结果
6.学生成绩查询
本系统所实现的学生成绩查询,运行如图6.5,图6.6所示:
29
图6.5 学生成绩查询模块
图6.6 学生成绩信息
30
7.学生课程信息查询
学生课程信息查询,如图6.7所示:
图6.7 学生课程信息
7、源程序
#include #define HEADER1 \" ----------------------------STUDENT---------------------------------- \\n\" #define HEADER2 \" | number | name |Comp|Math|Eng | sum | ave |mici | \\n\" #define HEADER3 \" |---------------|---------------|----|----|----|--------|-------|-----| \" #define FORMAT \" | %-10s |%-15s|%4d|%4d|%4d| %4d | %.2f |%4d |\\n\" 31 #define l,p->data.ave,p->data.mingci #define END DATA p->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.tota \" --------------------------------------------------------------------- \\n\" int saveflag=0; /*是否需要存盘的标志变量*/ typedef struct student /*标记为student*/ { char num[10]; /*学号*/ char name[15]; /*姓名*/ int cgrade; /*C语言成绩*/ int mgrade; /*数学成绩*/ int egrade; /*英语成绩*/ int total; /*总分*/ float ave; /*平均分*/ int mingci; /*名次*/ }; typedef struct node /*定义每条记录或结点的数据结构,标记为node*/ { struct student data; struct node *next; }Node,*Link; void menuchoice() { system(\"cls\"); /*清屏.与clrscr()功能相同*/ textcolor(10); /*在文本模式中选择新的字符颜色*/ gotoxy(7,5); cprintf(\" The Students' Grade Management System \\n\"); gotoxy(7,8); printf(\"\\nPlease Enter your choice; 0 enter students' system\\n\\\\"); printf(\" \"); printf(\"1 enter teachers' system\\n\"); } 32 void menu() /*菜单函数*/ { system(\"cls\"); /*清屏.与clrscr()功能相同*/ textcolor(10); /*在文本模式中选择新的字符颜色*/ gotoxy(7,5); /*在文本窗口中设置光标,下同*/ cprintf(\" The Students' Grade Management System \\n\"); gotoxy(7,8); cprintf(\" *************************Menu********************************\\n\"); gotoxy(7,9); cprintf(\" * 1 input record 2 delete record *\\n\"); gotoxy(7,10); cprintf(\" * 3 search record 4 modify record *\\n\"); gotoxy(7,11); cprintf(\" * 5 insert record 6 count record *\\n\"); gotoxy(7,12); cprintf(\" * 7 sort reord 8 save record *\\n\"); gotoxy(7,13); cprintf(\" * 9 display record 0 quit system *\\n\"); gotoxy(7,14); cprintf(\" *************************************************************\\n\"); /*cprintf()送格式化输出至文本窗口屏幕中*/ } void menustudent() { system(\"cls\"); /*清屏.与clrscr()功能相同*/ textcolor(10); /*在文本模式中选择新的字符颜色*/ gotoxy(7,5); /*在文本窗口中设置光标,下同*/ cprintf(\" The Students' Grade Management System \\n\"); gotoxy(7,8); cprintf(\" 33 *************************Menu********************************\\n\"); gotoxy(7,9); cprintf(\" *3 search record 0 quit system*\\n\"); gotoxy(7,10); cprintf(\" *************************************************************\\n\"); /*cprintf()送格式化输出至文本窗口屏幕中*/ } void printheader() /*格式化输出表头*/ { printf(HEADER1); printf(HEADER2); printf(HEADER3); } void printdata(Node *pp) /*格式化输出表中数据*/ { Node* p; p=pp; printf(FORMAT,DATA); } void Wrong() /*输出按键错误信息*/ { printf(\"\\n\\n\\n\\n\\n***********Error:input has wrong! press any key to continue**********\\n\"); getchar(); } void Nofind() /*输出未查找此学生的信息*/ { printf(\"\\n=====>Not find this student!\\n\"); } void Disp(Link l) /*显示单链表l中存储的学生记录,内容为student结构中定义的 34 数据项*/ { Node *p; p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/ if(!p) { printf(\"\\n=====>Not student record!\\n\"); getchar(); return; } printf(\"\\n\\n\"); printheader(); /*输出表格头部*/ while(p) /*逐条输出链表中存储的学生信息*/ { printdata(p); p=p->next; /*移动至下一个结点*/ printf(HEADER3); } getchar(); } Node* Locate(Link l,char findmess[],char nameornum[]) /*用于定位链表中符合要求的节点,并返回指向该节点的指针,findmess[]保存要查找的具体内容; nameornum[]保存按什么查找;在单链表l中查找;*/ { Node *r; if(strcmp(nameornum,\"num\")==0) /*按学号查询*/ { r=l->next; while(r) { if(strcmp(r->data.num,findmess)==0) /*若找到findmess值的学号*/ return r; r=r->next; 35 } } else if(strcmp(nameornum,\"name\")==0) /*按姓名查询*/ { r=l->next; while(r) { if(strcmp(r->data.name,findmess)==0) /*若找到findmess值的学生姓名*/ return r; r=r->next; } } return 0; } void stringinput(char *t,int lens,char *notice) /*输入字符串,并进行长度验证(长度 char n[255]; do{ printf(notice); /*显示提示信息*/ scanf(\"%s\ /*输入字符串*/ if(strlen(n)>lens)printf(\"\\n Exceed the required length! \\n\"); /*进行长度校验,超过lens值重新输入*/ }while(strlen(n)>lens); strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/ } int numberinput(char *notice) /*输入分数,0<=分数<=100)*/ { int t=0; do{ printf(notice); /*显示提示信息*/ scanf(\"%d\ /*输入分数*/ if(t>100 || t<0) printf(\"\\n Score must in [0,100]! \\n\"); /*进行分数校验*/ }while(t>100 || t<0); return t; } 36 void Add(Link l) /*增加学生记录*/ { Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/ char ch,flag=0,num[10]; r=l; s=l->next; system(\"cls\"); Disp(l); /*先打印出已有的学生信息*/ while(r->next!=NULL) r=r->next; /*将指针移至于链表最末尾,准备添加记录*/ while(1) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/ { while(1) /*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/ { stringinput(num,10,\"Input number(press '0'return menu):\"); /*格式化输入学号并检验*/ flag=0; if(strcmp(num,\"0\")==0) /*输入为0,则退出添加操作,返回主界面*/ {return;} s=l->next; while(s) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/ { if(strcmp(s->data.num,num)==0) { flag=1; break; } s=s->next; } if(flag==1) /*提示用户是否重新输入*/ { getchar(); printf(\"=====>The again?(y/n):\ 37 number %s is not existing,try scanf(\"%c\ if(ch=='y'||ch=='Y') continue; else return; } else {break;} } p=(Node *)malloc(sizeof(Node)); if(!p) { printf(\"\\n Allocate memory failure \"); /*如没有申请到,打印提示信息*/ return ; } strcpy(p->data.num,num); /*将字符串num拷贝到p->data.num中*/ stringinput(p->data.name,15,\"Name:\"); p->data.cgrade=numberinput(\"C language Score[0-100]:\"); /*输入并检验分数,分数必须在0-100之间*/ p->data.mgrade=numberinput(\"Math Score[0-100]:\"); p->data.egrade=numberinput(\"English Score[0-100]:\"); p->data.total=p->data.egrade + p->data.cgrade + p->data.mgrade; /*计算总分*/ p->data.ave=(float)(p->data.total/3); /*计算平均分*/ p->data.mingci=0; p->next=NULL; /*表明这是链表的尾部结点*/ r->next=p; /*将新建的结点加入链表尾部中*/ r=p; saveflag=1; /*在main()有对该全局变量的判断,若为1,则进行存盘操作*/ } return ; } void Qur(Link l) /*按学号或姓名,查询学生记录*/ { int select; /*1:按学号查,2:按姓名查,其他:返回主界面(菜单)*/ char searchinput[20]; /*保存用户输入的查询内容*/ 38 Node *p; if(!l->next) /*若链表为空*/ { system(\"cls\"); printf(\"\\n=====>No student record!\\n\"); getchar(); return; } system(\"cls\"); printf(\"\\n =====>1 Search by number =====>2 Search by name\\n\"); printf(\" please choice[1,2]:\"); scanf(\"%d\ if(select==1) /*按学号查询*/ { stringinput(searchinput,10,\"Input the existing student number:\"); p=Locate(l,searchinput,\"num\");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/ if(p) /*若p!=NULL*/ { printheader(); printdata(p); printf(END); printf(\"press any key to return\"); getchar(); } else Nofind(); getchar(); } else if(select==2) /*按姓名查询*/ { stringinput(searchinput,15,\"input the existing student name:\"); p=Locate(l,searchinput,\"name\"); if(p) { printheader(); printdata(p); 39 printf(END); printf(\"press any key to return\"); getchar(); } else Nofind(); getchar(); } else Wrong(); getchar(); } void Del(Link l) /*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/ { int sel; Node *p,*r; char findmess[20]; if(!l->next) { system(\"cls\"); printf(\"\\n=====>No student record!\\n\"); getchar(); return; } system(\"cls\"); Disp(l); printf(\"\\n =====>1 Delete by number =====>2 Delete by name\\n\"); printf(\" please choice[1,2]:\"); scanf(\"%d\ if(sel==1) { stringinput(findmess,10,\"input the existing student number:\"); p=Locate(l,findmess,\"num\"); if(p) /*p!=NULL*/ { 40 r=l; while(r->next!=p) r=r->next; r->next=p->next;/*将p所指节点从链表中去除*/ free(p); /*释放内存空间*/ printf(\"\\n=====>Delete success!\\n\"); getchar(); saveflag=1; } else Nofind(); getchar(); } else if(sel==2) { stringinput(findmess,15,\"input the existing student name\"); p=Locate(l,findmess,\"name\"); /*先按姓名查询到该记录所在的节点*/ if(p) { r=l; while(r->next!=p) r=r->next; r->next=p->next; free(p); printf(\"\\n=====>Delete success!\\n\"); getchar(); saveflag=1; } else Nofind(); getchar(); } else Wrong(); getchar(); } void Modify(Link l) /*修改学生记录。先按输入的学号查询到该记录,然后提示用户 41 修改学号之外的值,学号不能修改*/ { Node *p; char findmess[20]; if(!l->next) { system(\"cls\"); printf(\"\\n=====>No student record!\\n\"); getchar(); return; } system(\"cls\"); printf(\"Modify student recorder:\"); Disp(l); stringinput(findmess,10,\"\\nInput the existing student number:\"); /*输入并检验该学号*/ p=Locate(l,findmess,\"num\"); /*查询到该节点*/ if(p) /*若p!=NULL,表明已经找到该节点*/ { printf(\"Number:%s,\\n\ printf(\"Name:%s,\ stringinput(p->data.name,15,\"input new name:\"); printf(\"C language score:%d,\ p->data.cgrade=numberinput(\"C language Score[0-100]:\"); printf(\"Math score:%d,\ p->data.mgrade=numberinput(\"Math Score[0-100]:\"); printf(\"English score:%d,\ p->data.egrade=numberinput(\"English Score[0-100]:\"); p->data.total = p->data.egrade + p->data.cgrade + p->data.mgrade; p->data.ave=(float)(p->data.total/3); p->data.mingci=0; printf(\"\\n=====>Modify success!\\n\"); Disp(l); 42 saveflag=1; } else Nofind(); getchar(); } void Insert(Link l) /*插入记录,按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点*/ { Link p,v,newinfo; /*p指向插入位置,newinfo指新插入记录*/ char ch,num[10],s[10]; /*s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号*/ int flag=0; v=l->next; system(\"cls\"); Disp(l); while(1) { stringinput(s,10,\"\\nPlease input Insert location after the Number:\"); flag=0; v=l->next; while(v) /*查询该学号是否存在,flag=1表示该学号存在*/ { if(strcmp(v->data.num,s)==0) {flag=1;break;} v=v->next; } if(flag==1) break; /*若学号存在,则进行插入之前的新记录的输入操作*/ else { getchar(); printf(\"\\n=====>The number %s is not existing,try again?(y/n):\ scanf(\"%c\ if(ch=='y'||ch=='Y') continue; else return; 43 } } stringinput(num,10,\"Input new student Number:\"); /*以新记录的输入操作与Add()相同*/ v=l->next; while(v) { if(strcmp(v->data.num,num)==0) { printf(\"=====>Sorry,the new number:'%s' is existing !\\n\ printheader(); printdata(v); printf(\"\\n\"); getchar(); return; } v=v->next; } newinfo=(Node *)malloc(sizeof(Node)); if(!newinfo) { printf(\"\\n Allocate memory failure \"); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/ } strcpy(newinfo->data.num,num); stringinput(newinfo->data.name,15,\"Name:\"); newinfo->data.cgrade=numberinput(\"C language Score[0-100]:\"); newinfo->data.mgrade=numberinput(\"Math Score[0-100]:\"); newinfo->data.egrade=numberinput(\"English Score[0-100]:\"); newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade; newinfo->data.ave=(float)(newinfo->data.total/3); newinfo->data.mingci=0; newinfo->next=NULL; saveflag=1; 44 p=l->next; /*将指针赋值给p,因为l中的头节点的下一个节点才实际保存着学生的记录*/ while(1) { if(strcmp(p->data.num,s)==0) /*在链表中插入一个节点*/ { newinfo->next=p->next; p->next=newinfo; break; } p=p->next; } Disp(l); printf(\"\\n\\n\"); getchar(); } void Tongji(Link l) /*统计总分,单科第一和各科不及格人数*/ { Node *pm,*pe,*pc,*pt; /*用于指向分数最高的节点*/ Node *r=l->next; int countc=0,countm=0,counte=0; /*保存三门成绩中不及格的人数*/ if(!r) { system(\"cls\"); printf(\"\\n=====>No student record!\\n\"); getchar(); return ; } system(\"cls\"); Disp(l); pm=pe=pc=pt=r; while(r) { if(r->data.cgrade<60) countc++; if(r->data.mgrade<60) countm++; if(r->data.egrade<60) counte++; 45 if(r->data.cgrade>=pc->data.cgrade) pc=r; if(r->data.mgrade>=pm->data.mgrade) pm=r; if(r->data.egrade>=pe->data.egrade) pe=r; if(r->data.total>=pt->data.total) pt=r; r=r->next; } printf(\"\\n------------------------------the result--------------------------------\\n\"); printf(\"C Language<60: %d (ren)\\n\ printf(\"Math <60: %d (ren)\\n\ printf(\"English <60: %d (ren)\\n\ printf(\"-------------------------------------------------------------------------------\\n\"); printf(\"The highest student by total scroe name:%s totoal score:%d\\n\ printf(\"The highest student by English score name:%s totoal score:%d\\n\ printf(\"The highest student by Math score name:%s totoal score:%d\\n\ printf(\"The highest student by C score name:%s totoal score:%d\\n\ printf(\"\\n\\npress any key to return\"); getchar(); } void Sort(Link l) /*利用插入法排序实现单链表的按总分字段的降序排序,从高到低*/ { Link ll; Node *p,*rr,*s; int i=0; if(l->next==NULL) { system(\"cls\"); printf(\"\\n=====>No student record!\\n\"); getchar(); return ; 46 TongJi } ll=(Node*)malloc(sizeof(Node)); if(!ll) { printf(\"\\n Allocate memory failure \"); /*如没有申请到,打印提示信息*/ return ; } ll->next=NULL; system(\"cls\"); Disp(l); p=l->next; while(p) { s=(Node*)malloc(sizeof(Node)); /*s用于保存从原链表中取出的节点信息*/ if(!s) { printf(\"\\n Allocate memory failure \"); return ; } s->data=p->data; s->next=NULL; rr=ll; /*rr链表存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/ while(rr->next != NULL && rr->next->data.total >= p->data.total) rr=rr->next; /*指针移至总分比p所指的节点的总分小的节点位置*/ if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.total大时,就将p所指节点加入链表尾部*/ rr->next=s; else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/ { s->next=rr->next; rr->next=s; } p=p->next; /*原链表中的指针下移一个节点*/ } 47 l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/ p=l->next; /*已排好序的头指针赋给p,准备填写名次*/ while(p) /*当p不为空时,进行下列操作*/ { i++; /*结点序号*/ p->data.mingci=i; /*将名次赋值*/ p=p->next; /*指针后移*/ } Disp(l); printf(\"\\n =====>Sort complete!\\n\"); saveflag=1; } void Save(Link l) /*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时, 会提示用户存盘*/ { FILE *fp; Node *p; int count=0; fp=fopen(\"c:\\\\student\以只写方式打开二进制文件*/ if(fp==NULL) /*打开文件失败*/ { printf(\"\\n=====>open file error!\\n\"); getchar(); return ; } p=l->next; while(p) { if(fwrite(p,sizeof(Node),1,fp)==1)/*每次写一条记录或一个节点信息至文件*/ { p=p->next; count++; } 48 else break; } if(count>0) { getchar(); printf(\"\\n\\n\\n\\n\\n=====>Save file complete,total saved's record number is:%d\\n\ getchar(); saveflag=0; } else { system(\"cls\"); printf(\"The current link is empty,no student record is saved!\\n\"); getchar(); } fclose(fp); /*关闭此文件*/ } int main(void) { Link l; /*定义链表*/ FILE *fp; /*文件指针*/ int select; /*保存选择结果变量*/ char ch; /*保存(y,Y,n,N)*/ int count=0; /*保存文件中的记录条数*/ Node *p,*r; /*定义记录指针变量*/ l=(Node*)malloc(sizeof(Node)); if(!l) { printf(\"\\n Allocate memory failure \"); return ; } l->next=NULL; r=l; fp=fopen(\"C:\\\\student\以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/ 49 if(fp==NULL) { printf(\"\\n=====>Can not open file!\\n\"); exit(0); } while(!feof(fp)) { p=(Node*)malloc(sizeof(Node)); if(!p) { printf(\" Memory malloc failure!\\n\"); exit(0); } if(fread(p,sizeof(Node),1,fp)==1) /*一次从文件中读取一条学生成绩记录*/ { p->next=NULL; r->next=p; r=p; count++; } } fclose(fp); /*关闭文件*/ printf(\"\\n=====>Open file sucess,the total records number is : %d.\\n\ menuchoice(); scanf(\"%d\ if(select == 1) { menu(); while(1) { system(\"cls\"); menu(); p=r; printf(\"\\n Please Enter your choice(0~9):\"); /*显示提示信息*/ scanf(\"%d\ 50 if(select==0) { if(saveflag==1) /*若对链表的数据有修改且未进行存盘操作,则此标志为1*/ { getchar(); printf(\"\\n=====>Whether save the modified record to file?(y/n):\"); scanf(\"%c\ if(ch=='y'||ch=='Y') Save(l); } printf(\"=====>Thank you for useness!\"); getchar(); break; } switch(select) { case 1:Add(l);break; /*增加学生记录*/ case 2:Del(l);break; /*删除学生记录*/ case 3:Qur(l);break; /*查询学生记录*/ case 4:Modify(l);break; /*修改学生记录*/ case 5:Insert(l);break; /*插入学生记录*/ case 6:Tongji(l);break; /*统计学生记录*/ case 7:Sort(l);break; /*排序学生记录*/ case 8:Save(l);break; /*保存学生记录*/ case 9:system(\"cls\");Disp(l);break; /*显示学生记录*/ default: Wrong();getchar();break; /*按键有误,必须为数值0-9*/ } } } else { menustudent(); while(1) { 51 system(\"cls\"); menustudent(); p=r; printf(\"\\n Please Enter your choice(0 or 3):\"); /*显示提示信息*/ scanf(\"%d\ if(select==0) { if(saveflag==1) /*若对链表的数据有修改且未进行存盘操作,则此标志为1*/ { getchar(); printf(\"\\n=====>Whether save the modified record to file?(y/n):\"); scanf(\"%c\ if(ch=='y'||ch=='Y') Save(l); } printf(\"=====>Thank you for useness!\"); getchar(); break; } switch(select) { case 3:Qur(l);break; /*查询学生记录*/ default: Wrong();getchar();break; /*按键有误,必须为数值0-9*/ } }}} 52 8、设计体会 通过本次设计,对软件工程这门学科的重要性有了更深刻的认识,真真感觉到理论与实际相结合的重要性,受益匪浅。 参考文献 [1]张海藩.软件工程导论[M].北京:清华大学出版社.2003.12 [2]张海藩.软件工程导论学习辅导[M].北京:清华大学出版社.2004.9 [3]汪孝宜,刘中兵,徐佳晶等.JSP数据库开发实例精粹[M].北京:电子工业出版社.2005.1 [4]陈磊,郭斌,李翔. PowerBuilder 9 数据库项目案例导航.北京:清华大学出版社 [5]廖疆星,张艳钗,肖金秀.PowerBuilder & SQL Sever 2000数据库系统管理与实现[M].北京:冶金工业出版社 [6]卫海,黄浩.PowerBuilder 9.0课程设计案例精编[M]. 53 [7]李茜.PowerBuilder程序设计基础[M].北京:清华大学出版社.2005.7 [8] Sybase中国网站:http://www.Sybase.com.cn/ [9] PB导航站:http://lin2000.myrice.com/ 课程设计总结 通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。安排课程设计的基本目的,在于通过理论与实际的结合、人与人的沟通,进一步提高思想觉悟。尤其是观察、分析和解决问题的实际工作能力,以便培养成为能够主动适应社会主义现代化建设需要的高素质的复合型人才。 作为整个学习体系的有机组成部分,课程设计虽然安排在二周进行,但并不具有绝对独立的意义。它的一个重要功能,在于运用学习成果,检验学习成果。运用学习成果,把课堂上学到的系统化的理论知识,尝试性地应用于实际设计工作,并从理论的高度对设计工作的现代化提出一些有针对性的建议和设想。检验学习成果,看一看课堂学习与实际工作到底有多大距离,并通过综合分析, 54 找出学习中存在的不足,以便为完善学习计划,改变学习内容与方法提供实践依据。 对我们计算机专业的本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。这也是一次预演和准备毕业设计工作。通过课程设计,让我们找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。 课程设计达到了专业学习的预期目的。在两个个星期的课程设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的是通过对软件开发流程的了解,进一步激发了我们对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深入的学习。 55 因篇幅问题不能全部显示,请点此查看更多更全内容