PB学生成绩管理系统设计与实现论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
学生成绩管理系统其开发工作主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。
Powersoft的powerbuilder为用户提供了功能强大的集成开发环境。
POWERBUILDER是图形用户界面的c/s开发工具,利用其提供的各种面向对象的开发工具,powerbuilder具有强大的多个数据库描述连接功能和数据库检索力。
利用其前端的用户界面开发功能完备,易使用的应用程序。
而后台的数据库连接由POWERBUILDER完成,建立起数据一致性和完整性强.数据安全性好的库。
关键字power Builder,SQLserver,数据窗口。
Summary
Students grade managing system Work of its developmenPrimarily include Establishing of set database with support and the head apply two aspects of the procedure's developments
The Powersoft powerbuilder provided the function for customer mighty gather development environment. The POWERBUILDER is a sketch customer the interface's c/ s of development tool, Make use of its provide every kind of to face to the object's development tool, powerbuilder to have mighty and manies the database to describe to link the function and Database index dint. Make use of the customer interface of its head the development function complete, easily applied procedure that use. The database conjunction complete, establishes to rise the data consistency with the that the complete is strong. the data safety like from the POWERBUILDER
KEYWORDS datawindow, power Builder,SQLserver
目录
第一章绪论 (3)
第二章可行性分析 (4)
第三章关键的技术 (5)
第四章数据库设计 (8)
第五章需求分析 (11)
第六章总体设计 (13)
第七章详细设计 (15)
第八章测试报告 (30)
第九章体会 (31)
参考文献 (31)
第一章绪论
Sybase power Builder 8.0 是一个企业级的,面向对象的快速应用开发工具,它易于使用的,可伸缩的,并经实践证明的快速集成开发环境,在给用户提供一条转移到下一代平台的途径的同时,使用户仍能够保护和扩展现有的技术和应用上的投资。
多年来,用户一直赞赏Power Builder 用于客户/服务器应用开发的快捷性,简便性以及先进性。
现在,用户可以在他熟悉的相同的Power Builder 环境中使用相同的技术来创建同样功能强大的Wed和分布式应用。
Power Builder 8.0 是美国著名的Power soft 公司开发的可视化数据库编称语言,它是完全按照客户机/服务器体系结构设计的,特别是其提供了用于创建和管理不同对象的众多画板,具有强大的数据库操作功能,是一款极其优秀的面向对象的数据库开发工具。
使用它将会使应用程序的开发速度更快,成本更底,质量更高,功能更强,使开发人员从枯燥复杂的编程中解放出来,令开发应用系统这一让人头痛的工作变成了真正的享受。
它提供了对面向对象编程的全面支持,集成强大并易于使用的编程语言。
使用Power Builder 可以快速地开发出当今最流行的各种商业应用,如客户/服务器应用,分布式应用,基于组件的应用和wed应用。
在Power Builder 强大功能和友好的集成开发环境支持下,开发人员的效率得到空前的提高,使程序设计与开发工作变的更加有趣,仿佛是一个艺术家在创作一件艺术品,因此它深受国内外广大开发人员的喜欢。
Power Builder 8.0的特点主要表现在以下几个方面:
1.高效率的应用开发
Power Builder 通过提供大量新的功能和特征继续扩展其快速应用开发和
无比卓越的生产率传统,显著地加快了应用的周期。
2.紧密集成Sybase EAServer
当运行于EAServer 中时,Power Builder 应用的功能非常强大。
EAServer
是Sybase公司的一个独具特色的应用服务器,它融合了组件事务处理服
务器和动态页面服务器的功能。
3.强大的Wed应用开发能力
Power Builder 8.0 现在是一个综合性的Wed集成开发环境,它提供了一
个基于图形用户界面,功能强大而快捷的环境,用于高级Wed应用和
Wed站点的创建。
从熟悉的Power Builder 环境中,你可以充分地利用
大量新的Wed应用开发功能,将你的应用,你的用户以及你的技术带到
Wed世界与分布式计算领域。
Power Builder 8.0是一个非常优秀的数据库应用开发工具,完全支持面向对象的开发。
它拥有多种数据库接口,可以非常方便地连接到各种数据源,再加上其专利品Data window,程序员不需要编写任何SQL语句既可轻松地查询和更新后台数据库,这使当时的同类开发工具望尘莫及。
基于组件的开发增强了面向对象的技术,它提供了一个更有效地封装,管理,重用和扩展企业规划和处理的高层途径。
在使用面向对象的方法设计组件的过程中,贯穿始终的一个原则就是“企业逻辑要和表示逻辑分离”。
这样,传统的客户/服务器应用和基于Wed的应用都可以重用核心的企业规则和处理,核心代码的更新也更加容易。
在满足用户和完成系统的前提下,我们认为选用Power Builder 8.0来开发本
次毕业设计是最佳选择。
第二章可行性分析
为了以最小的代价尽可能短的时间内确定问题是否能够解决,在进行设计开发前首先进行了可行性分析。
延边大学自七校合并以来,师生数量加大,几乎每年各个专业都进行扩大招生,为了在人员变动频率高,不易管理的条件下对学生成绩进行有效的管理,需设计学生成绩管理系统。
它主要应完成以下的几点要求:
1.新学期开始时,对应每一位新生输入相关的详细记录。
2.建立各类课程的详细记录。
3.各专业每学期要选择各类课程安排本学期的教学计划。
4.各个对应专业年级的学生可选择教学计划范围内的课程或选择从修课程并在每学期末输入成绩。
5.随时可对学生记录,课程信息,教学计划及学生成绩进行查询。
6.只有有权限的人才可以对数据库进行维护。
第三章关键的技术
Powersoft的powerbuilder为用户提供了功能强大的集成开发环境。
POWERBUILDER是图形用户界面的c/s开发工具,利用其提供的各种面向对象的开发工具,同时支持分布式计算和WEB环境。
powerbuilder具有强大的多个数据库描述连接功能和数据库检索力。
Powerbuilder为开发人员提供全面综合性的支持主要有以下几点:
1.可视化的开发
POWERBUILDER具有一个可视化的开发环境。
大大减少了编写代码的工作量,不仅在用户界面的开发是可视的,在数据库的设计和表的设计也是如此。
降低了开发程序的难度,程序的开发效果更直观,降低了开发时间节省开支。
2.事件驱动的应用程序
Powerbuilde的应用程序是事件驱动的,并不是逐条执行的,在程序运行中能够实现与用户的交互,即用户通过各种动作控制应用程序的流程。
它为开发人员提供了一个集成环境,每个对象接受消息后,触发事件完成所要处理的过程。
3.Powercrip的语言和函数
Powerbuilder具有功能很强的编程语言,powerbuilder语言编写的程序由powerscrip命令,函数,SQL语句和事件中处理过程构成。
开发人员可以自定义类,对象完成复杂的事物逻辑与应用相结合。
Powerbuilder中含有丰富的内置函数。
可以利用这些函数完成对控件和对象的操作。
4.面向对象的编程
powerbuilder中创建的窗口,菜单,数据窗口等都是对象,每个对象都有自己的特性,即属性,事件,功能。
这种面向对象方式使开发人员不需要精通专门的语言,就能熟练地进行程序的开发工作。
除系统预先定义的对象外开发人员可以自己定义对象(用户对象)扩展系统定义的对象,使各种对象有机的结合起来构成POWERBUILDER应用程序。
利用封装性,继承性和多态性等面向对象的编程技术,能够实现窗口,控件等对象的重复使用,使程序具有重用性和可扩展性,从而提高程序员的效率,减少了开发时间。
5.跨平台的开发
powerbuilder支持跨平台的开发和分布,列如在window下利用powerbuilder开发的应用程序,可以将此程序在unix平台上运行,开发人员可以分布在不同的平台开发同一应用程序。
6.与数据库的连接性
powerbuilder不仅提供的了ODBC接口,还有一系列专用接口,POWERBUILDER 可以通过不同的接口连接不同的数据库,并且支持多个数据库的连接。
ODBC(开放数据库连接)是微软公司的数据库标准,使用ODBC时需要定义由存取数据构成的ODBC数据源,实现数据源的存储和管理应用程序所需的数据。
对于大型数据库来说POWERBUILDER充分发挥专用接口的功能,POWERSOFT的专用接口与某一数据库直接连接,通过专用的接口存取数据库POWERBUILDER 中的数据窗口对象可以方便地访问数据库。
1.使用数据窗口技术
POWERBUILDER中的数据窗口对象是PWERBUILDER与其他面向数据库应用前端开发工具最主要的区别之一,数据窗口技术包括数据窗口对象而后数据窗口控件两方面的内容。
数据窗口对象主要用于操作数据库中的数据,除不能完成数据库中的数据定义,可以随意操作数据(添加,删除,修改,更新,查询)在使用数据窗口对象时可以指定数据的显示风格。
数据窗口控件则是把数据窗口对象的数据显示在窗口上。
使用数据窗口对象
首先在数据窗口画板中创建数据窗口对象,
选择数据源POWERBUILDER 提供了多种数据源包括快速数据源(QUICK SELECT),SQL选择(SQL SELECT),查询对象(QUERY)外部数据源(EXTERNAL)存储过程(STORE D PROCEDURE)
定义显示风格POWERBUILDER中的每种显示风格都有自己的特点复合风格,交叉风格,自由格式。
统计图,表格格式,分组格式,标签格式,分拦格式,超文本,列表格式,OLE20
设置数据窗口对象的属性及其对象内部对象的属性。
可以编辑显示风格,跳转次序,有效性规则,排序等在有些设置过程中,最终对应SQL 语句
最后在窗体中创建数据窗口控件使其与数据窗口对连接,显示数据
2.在POWERBUILDER中使用SQL 语句
虽然POWERBUILDER提供了功能强大的datawindow和datastore来访问和操作数据库,但有些时候使用SQL 语句更能实现开发人员的要求,SQL语言占用资源少,操作灵活。
并且可以在脚本中直接插入SQL语句访问数据库。
POWERBUILDER中提供了SQL 画板,开发人员可以轻松的使用SQL语句3.使用继承技术
利用继承技术可以已有窗口的定义,包括风格,事件,函数,脚本,结构和控件等。
这样可以大大提高开发的效率,节省时间。
使用继承技术有以下优点:
(1)当修改祖先窗口时,其继承窗口也随着修改,不用再次修改继承窗口减少维护时间。
(2)后代继承祖先的脚本,无须编写代码
(3)在程序代码和应用程序窗口中获得一致性
第四章数据库设计
本课题采用Microsoft SQL Server2000作为数据库后台,SQL语言功能丰富,使用方式灵活,语言简洁易学,它的功能包括查询,操纵,定义和控制4个方面。
它的主要特点是:一体化,联机交互使用和嵌入式有统一的语法结构,过度非过程化以及语言简洁,易学易用等。
SQL的数据定义包括3部分:定义基本表,定义视图和定义索引。
视图是从一个或几个基本表(或视图)导出的表。
在应用系统中视图是极其重要组成部分。
它的外模式是由若干基本表和若干视图组成的,视图是一个虚表。
它的优点有:
1 对于数据库的重构造提供了一定程度上的逻辑独立性。
2 简化了用户观点
3 视图的机制是不同的用户能以不同的方式看待同一数据。
4 视图的机制对机密数据提供了自动的安全保护功能。
索引是数据库检索经常用到的对象,为了提高查找速度应该给表建立索引。
索引可以是唯一的或不唯一的,可以是簇类的或非簇类的。
对一个基本表,可以根据应用环境的需要建立若干索引,以提供多种存取路径,提高系统的运行速度。
根据以上分析将数据库设计成若干个基本表,它们是
1 试卷信息(paper)
说明:
1 设专业代码和学期为主键。
2 学期,说明这次考试信息是哪个学期。
2成绩(score)
说明:
1 学号和学期是主键。
3 学期(semester)
4 专业信息(specicalty)
说明:设置专业代码为主键。
5 学生信息(student)
各表之间的关系
第五章需求分析
学生成绩管理工作被视作高校管理工作中一项不容忽视的重要分支,其工作量大,涉及面广,学生成绩管理工作运行的好坏直接影响着整个高校管理工作的各个环节。
由于成绩管理工作的本身特点及特殊性质,单纯依靠人力,会使从事这项工作的管理人员过度缠身于繁琐的业务中,难免会发生许多错误,难以做到管理的规范化,这不符合管理工作的今后发展趋势。
因此,需要开发一种功能全面,操作简便的管理系统软件来补助作用,人机配合,能够使机器承担部分工作,是管理员逐步摆脱一些无畏的,琐碎的业务,这对充分利用人力资源的主导作用及使管理工作逐步步入规范化轨道有着重要意义。
根据上一章的可行性研究及对用户调查,我们可确定本系统必须完成的工作,下面将来做简要介绍。
一.输入部分
新学期开始需将新生档案输入,一般来讲,应按专业年级集体输入,所以应在窗体头部设置专业年级输入文本框,并设置确定按钮。
为了使用户再次输入时可继续前次输入部分,所以应使学号自动生成。
为了存储数据方便把学生信息建立成数据窗口,这样存盘时只需用update函数:各类课程应输入以备各专业安排教学计划和学生选课,为了管理方便应将课程信息分类保存,所以,窗口头部应设置课程类别可选列,供选择,同样为了方便用户再次输入方便,应使课程号自动生成:
要增设的新课程也要输入供各个专业选择,课程名应该是课程表存在的而不是凭空输入的,所以应设置课程下拉列表,供选择:
每学期末应输入学生的各门课程成绩,但必须是该生所在专业年级在本学期开设了这门课程,为防止成绩输入后再次输入还要保证成绩为空值,否则学生成绩信息很容易丢失。
因此输入部分要完成新生信息,课程信息,教学计划,学生选课信息和学生成绩信息的输入,该部分是本系统最重要的部分,应着重分析。
还应考虑数据的完整性,使用视图。
二.查询,统计分析
为了使各项记录可供有关人员随时查询,并对试卷分析统计,应设查
旬,
统计分析模块。
该模块应考虑用户使用频率较高的查询方式来设计。
我将它
大体分成了三部分,包括对学生基本信息及学生成绩查询,对教学计划表的
查询及成绩分析,成绩统计和频数分布图。
还要考虑运行速度,适当使用索
引。
窗口中各个数据窗口应为不可该写的。
考虑到某学生查询信息,应设置学号查询:在只知道姓氏的情况下,要查找记录,应设置模糊姓名查找等其它。
期末考试结束后,各教研室应至少要抽取一个授课班进行试题的难度,区分度分析。
A考试难度指数(P)值的计算方法:
客观题难度指数计算公式:P=R/N
(R为某一题参加考试的学生中答对的人数,N为参加考试的学生数。
)非客观题难度指数计算公式:P=X/W
(X为某题的平均分,W为该题的最高分值)
B试题区分度(D)值的计算方法:计算某一班学生答某一题的区分度,首先要在该班中确定一个高分组,一个第分组。
在考生中按名次排列位于前25%的学生为高分组,位于后25%的学生为底分组。
客观题分度计算公式:D=Ph-Pl
(Ph为高分组学生答对的百分比,Pl为底分组学生答对的百分比)
难度指数和区分度计算完后要在教研室同考试题一同存档,为以后的命题工作提供依据。
另外试题的难度情况和区分度情况要写入下表考试总结和成绩分析中。
学生考试成绩频数分布图
50
40
30
20
10。
0-50 55 60 65 70 75 80 85 90 95 100
C 考试试卷水平,题量,难度,区分度
试题中难度为0——0.30的试题占总题量的%
0.31——0.50的试题占总题量的%
0.51——0.70的试题占总题量的%
0.71——1的试题占总题量的%
试题中区分度为0.19以下(差)的试题占总题量的%
0.20——0.29(可以)的试题占总题量的%
0.30——0.39(良好)的试题占总题量的%
0.4以上(优秀)的试题占总题量的%
三.退出系统
第六章总体设计
本次设计选择Powerbuilder 8.0 为开发工具,以Microsoft SQL Server 2000分布式客户服务器数据库管理系统,作为数据库后台,Windows98 操作平台。
学生成绩管理系统是一个很大的系统,若要求一个人独立地较完善地完成各项功能,在如此短暂的时间内简直是天方夜谈。
所以,我侧重于输入模块进行了本次设计。
下面我将分为两部分介绍总体设计。
第一节程序设计
根据第三章的需求分析,将学生成绩管理系统程序设计分三大模块,如图所示:
对整个系统功能有了总体上的认识以后,应对每一个模块的任务有一个清晰的认识,以防代码重复,责任模糊而浪费不必要的工作量。
下面谈一谈我对每一个模块总体认识。
(1)输入功能模块
1新生信息输入时,先确定该生的专业,年级,然后使学号自动生成并且标出前一名学生的姓名,在存盘时应保证必要数据不为空,存盘后
时学号自动加1
2课程信息输入时,先确定类别,课程号自动生成,存盘时先检验数据是否完整,存盘后课程号自动加1
3安排教学计划时,先确定年级,学期和专业,选择对应类别的课程并输入相应的其它信息。
4学生选课时,应先输入学号和学期,自动列出可选课程,供选择。
5填写学生成绩时,先输入专业年级和学期,然后列出所学课程名点击其中一个,显示相应其它信息并输入成绩。
(2 ) 查询, 统计分析模块
1查询学生成绩包括已知学生学号和学期查询,已知专业年级学期和课程名组合查询,还有不及格学生成绩的相关信息查询。
2 成绩统计和频数分布图:要有选择专业和选择学期。
还须一个框来显
示学生成绩统计和学生考试成绩频数分布图。
3 成绩分析:要有选择专业和选择学期。
还须一个框来显示学生考试
总结和成绩分析。
(3) 退出系统模块:
第二节总体设计小结
以上对整个系统有了比较完整地系统地认识,数据库后台的基本表格已经初步建立,但索引和视图的建立将在详细设计中作具体的介绍。
用户的界面是应用程序的重要部分,是用户应用程序进行信息交流的地方,一个应用程序的实用性不仅仅取决于它的功能,在很大程度上依赖于它的界面,因为对用户而言界面就是应用程序,用户感觉不出幕后正在执行的代码。
因此,我在进行程序设计时尽量把自己当成用户,使界面易于操作,方便用户。
第七章详细设计
本章将详细地对各个模块进行分解和剖析,包括程序的流程,变量使用和窗体的构成等。
系统分为三个模块,下面依次对各个模块进行叙述。
一数据输入
1 专业设置
新增键
打开专业设置表时如输入专业名称和专业代码,应选定新增键。
对应的流程图如下:
修改键
首先,用户修改数据后存盘,同时,应检测数据是否完整,数据库操纵是否成功,然后按修改。
删除键
设置提示信息,确定用户要删除当前记录后提交。
2 学期设置
3 学生基本信息
选择专业键
新增
//判断新加的用户名是否已经存在
如果xm1不为空则需要重新添加用户名select name into :xm1
from _user
where name=:xm;
根据新增用户选择的权限设置:qxl
把xm,:kl,:qxl添加到表_user中
insert into _user(name,password,jb)
values (:);
commit;//返回数据库操作
删除
利用dw_1.getrow()得到当前选定的数据项,dw_1.deleterow数据窗口函数删除当前选定用户dw_1.update()更新数据
dw_1.deleterow(dw_1.getrow())
dw_1.update()
commit;
4 试卷信息
退出键
if dw_1.ModifiedCount() > 0 then dw_1.update()
delete from paper where due1=0;
close(parent)
6试卷登记
退出键
if dw_1.ModifiedCount() > 0 then dw_1.update()
close(parent)
检索键
string get_str
get_str = trim(sle_1.text)
if sle_1.text = "" then
return
end if
choose case tab_1.selectedtab
case 1
dw_1.dataObject = "dw_find_stu_by_id"
dw_1.setTransObject(sqlca)
dw_1.retrieve(get_str)
case 2
dw_1.dataObject = "dw_find_stu_by_name"
dw_1.setTransObject(sqlca)
dw_1.retrieve(get_str)
end choose
A 按学生学号进行查询,基本表对应主键的均自动建立索引,所以不必另建索引。
B 按学生姓名进行查询,窗口中列出该姓名所有记录。
2 学生成绩统计和频数分布图
DataWindowChild dwc_score, dwc_absent,dwc_graph dw_1.GetChild("dw_score", dwc_score) //dw_1.GetChild("dw_absent", dwc_absent) dw_1.GetChild("dw_graph1",dwc_graph) if var_semester <> "" then
//dw_1.dataObject = "dw_score_statistics" decimal there_paper SELECT top 1 paper.due1 INTO :there_paper FROM paper
WHERE ( paper.semester = :var_semester ) ;
if sqlca.sqlcode <> 0 then
messagebox("´íÎó","ÄúËùÖ¸¶¨µÄרҵÔÚÖ¸¶¨µÄѧÆÚ²»´æÔÚÊÔ¾í£¡")
dwc_score.SetTransObject(SQLCA)
dwc_score.Retrieve("")
//dwc_absent.SetTransObject(SQLCA)
//dwc_absent.Retrieve("")
dwc_graph.SetTransObject(SQLCA)
dwc_graph.Retrieve("")
return
end if
dwc_score.SetTransObject(SQLCA)
dwc_score.Retrieve(var_semester)
//dwc_absent.SetTransObject(SQLCA)
//dwc_absent.Retrieve(var_semester)
dwc_graph.SetTransObject(SQLCA)
dwc_graph.Retrieve(var_semester,var_spec)
else
dwc_score.SetTransObject(SQLCA)
dwc_score.Retrieve("")
//dwc_absent.SetTransObject(SQLCA)
//dwc_absent.Retrieve("")
dwc_graph.SetTransObject(SQLCA)
dwc_graph.Retrieve("","")
end if
3 成绩分析
SELECT specialty.spec_name,
score.stu_id,
score.score1,
score.score2,
score.score3,
score.score4,
score.score5,
score.score6,
score.score7,
score.score8,
score.score9,
score.score10,
score.absent,
score.score1+score.score2+score.score3+score.score4+score.score5+score.score6+sco re.score7+score.score8+score.score9+score.score10 AS SCORE_SUM
FROM score, specialty, student
WHERE ( specialty.spec_code = student.spec_code ) and ( student.stu_id = score.stu_id ) and ( ( score.semester = :var_semester ) )
if var_semester <> "" then
decimal there_paper[6,10]
SELECT top 1 paper.due1, paper.due2, paper.due3, paper.due4, paper.due5, paper.due6, paper.due7, paper.due8, paper.due9, paper.due10
INTO :there_paper[1,1], :there_paper[1,2], :there_paper[1,3], :there_paper[1,4], :there_paper[1,5], :there_paper[1,6], :there_paper[1,7], :there_paper[1,8], :there_paper[1,9], :there_paper[1,10]
FROM paper
WHERE ( paper.semester = :var_semester ) ;
if sqlca.sqlcode <> 0 then
messagebox("´íÎó","ÄúËùÖ¸¶¨µÄרҵÔÚÖ¸¶¨µÄѧÆÚ²»´æÔÚÊÔ¾í£¡") dwc_section1.SetTransObject(SQLCA)
dwc_section1.Retrieve()
//dwc_section2.SetTransObject(sqlca)
//dwc_section2.retrieve("","")
return
end if
int var_questions = 1 //get questins numbers
for var_questions=1 to 10
if there_paper[1,var_questions] = 0 then EXIT
next
var_questions -= 1
//calculate difficult
real temp[2,10]
SELECT sum( case when paper.due1=score.score1 then 1 else 0 end), sum( case when paper.due2=score.score2 then 1 else 0 end),
sum( case when paper.due3=score.score3 then 1 else 0 end),
sum( case when paper.due4=score.score4 then 1 else 0 end),
sum( case when paper.due5=score.score5 then 1 else 0 end),
sum( case when paper.due6=score.score6 then 1 else 0 end),
sum( case when paper.due7=score.score7 then 1 else 0 end),
sum( case when paper.due8=score.score8 then 1 else 0 end),
sum( case when paper.due9=score.score9 then 1 else 0 end),
sum( case when paper.due10=score.score10 then 1 else 0 end),
avg( score.score1), max(score.score1),
avg( score.score2), max(score.score2),
avg( score.score3), max(score.score3),
avg( score.score4), max(score.score4),
avg( score.score5), max(score.score5),
avg( score.score6), max(score.score6),
avg( score.score7), max(score.score7),
avg( score.score8), max(score.score8),
avg( score.score9), max(score.score9),
avg( score.score10), max(score.score10)
INTO :there_paper[2,1], :there_paper[2,2], :there_paper[2,3], :there_paper[2,4], :there_paper[2,5], :there_paper[2,6], :there_paper[2,7], :there_paper[2,8],
:there_paper[2,9], :there_paper[2,10],
:temp[1,1],:temp[2,1],:temp[1,2],:temp[2,2],:temp[1,3],:temp[2,3],:temp[1,4],:te mp[2,4],
:temp[1,5],:temp[2,5],:temp[1,6],:temp[2,6],:temp[1,7],:temp[2,7],:temp[1,8],:te mp[2,8],
:temp[1,9],:temp[2,9],:temp[1,10],:temp[2,10]
FROM score,
paper,
student
WHERE ( score.semester = paper.semester ) and
( paper.spec_code = student.spec_code ) and
( score.stu_id = student.stu_id ) and
( ( score.semester = :V AR_SEMESTER ) AND
( score.absent = 0 )
) ;
int stu_nums
stu_nums = there_paper[2,var_questions+1] //the number of students
int i
for i = 1 to var_questions
there_paper[2,i] = round( there_paper[2,1] /stu_nums, 2)
next
if temp[2,var_questions] = 0 then
there_paper[2,var_questions] = 0
else
there_paper[2,var_questions] = round(temp[1,var_questions] / temp[2,var_questions], 2)
end if
real data_trans[8]
for i = 1 to var_questions
choose case there_paper[2,i]
case 0 to 0.30
data_trans[1] += 1
case 0.31 to 0.50
data_trans[2] += 1
case 0.51 to 0.70
data_trans[3] += 1
case 0.71 to 1
data_trans[4] += 1
end choose
next
for i = 1 to 4
data_trans[i] = round( 100*data_trans[i] / var_questions, 2)
next
dwc_section1.SetTransObject(SQLCA)
dwc_section1.Retrieve()
//dwc_section2.SetTransObject(sqlca)
//dwc_section2.retrieve(var_semester,var_spec)
if dwc_section1.rowCount() = 0 then
dwc_section1.insertRow(0)
end if
dwc_section1.setItem(1, "difficult30",data_Trans[1])
dwc_section1.setItem(1, "difficult50",data_Trans[2])
dwc_section1.setItem(1, "difficult70",data_Trans[3])
dwc_section1.setItem(1, "difficult100",data_Trans[4])
//calculate partition
datastore ds_difficult
ds_difficult = create dataStore
ds_difficult.dataObject = "dw_analysis_top25"
ds_difficult.setTransObject(sqlca)
ds_difficult.retrieve(var_semester,var_spec)
stu_nums = ds_difficult.getItemdecimal(1,"compute_stu_num")
for i = 1 to var_questions
there_paper[1,i] = ds_difficult.getItemdecimal(1,"compute_"+trim(string(i))) next
for i = 1 to var_questions
there_paper[2,i] = ds_difficult.getItemdecimal(1,"compute_"+trim(string(i+10)))
next
ds_difficult.dataObject = "dw_analysis_end25"
ds_difficult.setTransObject(sqlca)
ds_difficult.retrieve(var_semester,var_spec)
for i = 1 to var_questions
there_paper[3,i] = ds_difficult.getItemdecimal(1,"compute_"+trim(string(i))) next
for i = 1 to var_questions
there_paper[4,i] = ds_difficult.getItemdecimal(1,"compute_"+trim(string(i+10)))
next
destroy ds_difficult
SELECT
max(score.score1),max(score.score2),max(score.score3),max(score.score4),
max(score.score5),max(score.score6),max(score.score7),max(score.score8), max(score.score9),max(score.score10),
min( score.score1), min( score.score2), min( score.score3), min( score.score4),
min( score.score5), min( score.score6), min( score.score7), min( score.score8),
min( score.score9), min( score.score10)
INTO :there_paper[5,1], :there_paper[5,2], :there_paper[5,3], :there_paper[5,4], :there_paper[5,5], :there_paper[5,6], :there_paper[5,7], :there_paper[5,8],
:there_paper[5,9], :there_paper[5,10],
:there_paper[6,1], :there_paper[6,2], :there_paper[6,3], :there_paper[6,4], :there_paper[6,5], :there_paper[6,6], :there_paper[6,7], :there_paper[6,8],
:there_paper[6,9], :there_paper[6,10]
FROM score,
paper,
student
WHERE ( score.semester = paper.semester ) and
( paper.spec_code = student.spec_code ) and
( score.stu_id = student.stu_id ) and
( ( score.semester = :V AR_SEMESTER ) AND
( score.absent = 0 )
) ;
for i = 1 to var_questions
temp[1,i] = round((there_paper[1,i] - there_paper[3,i]) / stu_nums, 2) next
if there_paper[5,var_questions] - there_paper[6,var_questions] <> 0 then temp[1,var_questions] = round( (there_paper[2,var_questions] - there_paper[4,var_questions]) / ((there_paper[5,var_questions] - there_paper[6,var_questions])*stu_nums), 2)
else
temp[1,var_questions] = 0
end if
for i = 1 to var_questions
choose case temp[1,i]
case is <= 0.19
data_trans[5] += 1
case 0.20 to 0.29
data_trans[6] += 1
case 0.30 to 0.39
data_trans[7] += 1
case is >= 0.40
data_trans[8] += 1
end choose
next
for i = 5 to 8
data_trans[i] = round( 100*data_trans[i] / var_questions, 2)
next
dwc_section1.setItem(1, "part19",data_Trans[5])
dwc_section1.setItem(1, "part29",data_Trans[6])
dwc_section1.setItem(1, "part39",data_Trans[7])
dwc_section1.setItem(1, "part40",data_Trans[8])
else
dwc_section1.SetTransObject(SQLCA)
dwc_section1.Retrieve()
//dwc_section2.SetTransObject(sqlca)
//dwc_section2.retrieve("","")
end if
第八章测试报告
软件测试在开发软件过程中是一个不可缺少的部分。
因为在开发软件系统的漫长过程中,面对着极其错综复杂的问题,人的主观认识不可能完全符合客观现实,与工程密切相关的各类人员之间的通信和配合也不可能完美无缺,因此,在软件生命周期的各个阶段都不可避免地产生差错。
我们力求在每个阶段结束之前通过严格的技术审查,尽可能早地发现并纠正错误;但是,经验表明审查并不能发现所有的差错,此外在编码过程中还不可避免地会引入一些新的错误。
如果在软件生产性运行之前,没有发现并纠正软件中的大部分差错,则这些错误迟早在生产过程中暴露出来,那时不仅仅改正这些错误的代价更高,而且往往会造成很恶劣的后果。
测试的目的就是在软件投入生产运行之前,尽可能多地发现并纠正软件中的错误。
基于上述的原因,我在编码过程中进行了模块测试,编码结束进行了系统测试和验收测试。
下面将介绍测试方案,测试过程和测试结果。
一模块测试
1 测试方案
采用了白盒测试,即按照程序内部的逻辑结构,检验程序中的每条通路是否都按预定要求正常工作。
2 测试过程
检验模块之间的接口。
A 每个被调用模块是否正确接受参数。
B 每个调用模块是否能调用每个自己想要调用的模块。
3 测试结果
测试结果表明,每个模块之间的接口都吻合,即被调用模块都能正确接受参数,调用模块能调用自己想要调用的每个模块。
二
1 测试方法
采用了黑盒测试,即检查程序功能是否能按照规格说明书的规定正常使用,程序是否适当地接受数据产生正确的输出信息,并且保持外部信息的完整性。
2 测试过程:主要检验是否能正确实现每个功能。
A 每个功能时候按照规格说明书的要求正常使用。
B 数据库里的记录是否符合要求。
C 用户界面是否友好
3 测试结果
结果表明,每个功能都能按照规格说明书里的要求正常使用且速度达到了预期的标准。
数据库里的记录符合要求,用户界面友好。
当然,整个系统在测试过程中仍发现了不少的错误,但在知道老师的指导下改正并完善了所发现的错误和不足之处,达到了测试要求。