报告书吕文泊.docx

上传人:b****2 文档编号:23081678 上传时间:2023-04-30 格式:DOCX 页数:23 大小:231.70KB
下载 相关 举报
报告书吕文泊.docx_第1页
第1页 / 共23页
报告书吕文泊.docx_第2页
第2页 / 共23页
报告书吕文泊.docx_第3页
第3页 / 共23页
报告书吕文泊.docx_第4页
第4页 / 共23页
报告书吕文泊.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

报告书吕文泊.docx

《报告书吕文泊.docx》由会员分享,可在线阅读,更多相关《报告书吕文泊.docx(23页珍藏版)》请在冰豆网上搜索。

报告书吕文泊.docx

报告书吕文泊

HarbinInstituteofTechnologyatWeihai

数据结构课程设计报告

设计题目:

运动会综合应用系统

院系:

计算机科学与技术

班级:

0604202

学号:

060420201

设计者:

吕文泊

 

哈尔滨工业大学(威海)

二零零八年九月

数据结构课程设计报告

软硬件运行环境

硬件要求:

内存最小为64M,建议使用128M及以上

显示器分辨率最小为800*600,建议分辨率1024*768

CPU主频Pentium(166)或更高

硬盘剩余空间最小1G,建议1G以上

软件要求:

操作系统推荐使用Windows2000,XP或更高版本,也可以在Windows98下运行。

建议安装PowerBuilder10.0SQLServer2000或更高版本

1项目研究背景与意义

由于运动会以往都是人工报名,人工记录成绩,人工排名,耗费人力,物力,而且出错率较高,不能及时得到排名,拖延了最后闭幕式的召开。

研发运动会管理系统,把一些工作交给计算机来做,提高效率,降低出错率。

运动会管理系统的开发工作是由我三人完成的,包括项目需求分析,项目的可行性研究,到具体的系统编程实现,老师提出要求,学生解决问题。

本系统经过多次试验运行,收到了良好的效果,大大减轻了人力劳动,降低了出错率,经过事实中发现新问题并得到及时维护。

2问题及难点所在

(1)建立工作岗位、录入工作人员,运动员报名表录入,输入记录成绩,生成秩序册等项次关键的多重链表文件

(2)实现设置工作岗位、录入工作人员,运动员报名表录入,输入记录成绩写及录入。

(3)根据不同功能需求显示的参赛人员的不同信息字段。

运用同一数据窗口根据选择项目所属田径赛及教职工学生的不同,灵活增删不同字段。

(4)在录入成绩方面可能出现已检录却未能参加比赛等情况,此时需在录入中增加“强制更新为未检录状态选项”。

(5)报名单输入:

包括运动员姓名、单位、组别、参赛项目等信息。

(6)报名单审查:

报名单输入是难免会有错误的,必须经过审查。

在审查之后,如果有错,必须出现提示,给出出错信息,并根据不同的错误,给用户提供不同的修改方法。

(7)运动员编号:

运动员编号要求同一单位的同一组别的运动员号码必须连续,不同单位、不同组别可以不连续,也可连续.

(8)径赛分组:

按照比赛规则,对各项目的参赛人员进行分组。

对于短跑项目,将对各组别各项目的每个小组进行跑道划分;对于长跑项目,只编排运动员比赛序号,并将编排结果直接存入径赛决赛名单。

3算法设计的思想(所用到的数据结构)

检录操作主要涉及到数据库信息提取、项目优先顺序设定及打印内容筛选。

数据库提取主要是由数据库自动实现。

检录则根据检录状态将尚未检录项按线性表遍历排列在首选位置。

设有批量设置功能,可以将当前项目人员检录信息提取到数组中,按照要求遍历批量设置所有人员检录状态,并返回到当前显示界面中并仍可进行人工微调。

录入成绩与检录操作基本功能一致。

主要难点在于通过模式匹配模拟实现录入成绩格式的规范检查。

鉴于各个项目的成绩单位及计法的不同,在数据库中自己拟定存储各项目成绩格式,在程序运行中运用查找的模式匹配检查输入项的格式。

重点在于成绩中包含几种常用符号(如逗号,单撇号)及数字的混合,需经检查确定正确后由字符格式转为数字类型存储。

4算法的流程图

 

5算法的设计与分析

(1)检录窗口功能说明

自动全部签到

inti

i=dw_chk.rowcount()

intj

forj=1toi

dw_chk.setitem(j,"checky_checkup","1")

next

 

自动分道

stringtpfendao[]

tpfendao=dw_chk.object.checky_checkup.primary

intsort[],i,upper,j

upper=upperbound(tpfendao)

j=0

fori=1toupper

if'1'=tpfendao[i]then//'1'表示选择'到'

j++

sort[j]=i//获得签到的所在行

endif

next

//排序

intsec,temp

fori=1toj

sec=myrand(i,j)

temp=sort[sec]

sort[sec]=sort[i]

sort[i]=temp

dw_chk.object.checky_daoci.primary[sort[i]]=string(i)

next

 

手动调整分道

dw_chk.settaborder("checky_daoci",1)

最终提交完成

////检查是否已禁止更新检录

iftrue=checked_manage.ifchecked(ddlb_1.text)then

messagebox('',"禁止更新检录信息")

return

endif

 

//////////////////////

inti

i=dw_chk.update()

if(1=i)then

checked_manage.setchecked(ddlb_1.text)

else

messagebox(string(sqlca.sqldbcode),"保存数据失败:

"+sqlca.sqlerrtext)

endif

ddlb_1.postevent("selectionchanged")

 

打印已签到人员名单

if"?

"=dw_chk.Object.DataWindow.Table.Filterthen

dw_chk.Object.DataWindow.Table.Filter="1=1"

endif

dw_chk.Object.DataWindow.Table.Filter=dw_chk.Object.DataWindow.Table.Filter+"andchecky_checkup='1'"

dw_chk.filter()

(2)录入成绩显示数据

//uo可用

this.enabled=true

cbx_update.checked=false

//初始化函数类

scored_manage.info=info

resetcontent()

 

////////////////////////////////////

//获得所需访问表信息修改数据对象

stringsqlfromwhere

dw_score.dataobject='dataw_scoreinput'

dw_score.settransobject(sqlca)

sqlfromwhere=""

sqlfromwhere+="from"+info.check+"t,"+info.signup+"signup"

///设置where子句

ifinfo.flag=falsethen//第二赛//检录签到seccheckup字段

sqlfromwhere+="wheret.code=signup.codeandt.seccheckup='1'andt.checkup='1'andt.item=signup.itemandsignup.groupm='"+info.groupm+"'andsignup.item='"+info.item+"'"

else//第一赛

sqlfromwhere+="wheret.checkup='1'andt.code=signup.codeandt.item=signup.itemandsignup.groupm='"+info.groupm+"'andsignup.item='"+info.item+"'"

endif//检录签到checkup字段

//////////////////////

//销毁部分列

if"田赛"=info.tianjingthen

dw_score.Modify("destroycolumnchecky_sgroup")

dw_score.Modify("destroychecky_sgroup_t")

dw_score.Modify("destroycolumnchecky_daoci")

dw_score.Modify("destroychecky_daoci_t")

else

iffalse=info.flagthen//径赛第二赛销毁checky_sgroup

dw_score.Modify("destroycolumnchecky_sgroup")

dw_score.Modify("destroychecky_sgroup_t")

endif

endif

 

///////////////////////////////////////////////

///////////dw_check显示数据

//设置更新表

dw_score.Object.DataWindow.Table.UpdateTable=info.check

if'2人3足跑'=info.itemthen//"2人3足跑"检录若有一人未到则不能参加比赛成绩和签到道次记录在code小的一人中(以第一人为查询录成绩)自动更新到第二人中

stringerrensz//只有一赛//检录到

errensz="selectb.code,b.name+''+c.name,'2人3足跑',ch.sgroup,ch.daoci,ch.score,b.depfromcheckthych,errensanzub,errensanzucwherech.item='2人3足跑'andch.checkup='1'andch.code=b.codeandb.tongdui=c.tongduiandc.groupm=b.groupmandb.code

dw_score.modify("DataWindow.Table.Select=~""+errensz+"~"")

dw_score.object.checky_score.dbname=info.check+"."+"score"//重新绑定更新字段

else

ifinfo.flag=falsethen//第二赛

dw_score.modify("DataWindow.Table.Select=~""+"selectt.code,signup.name,t.item,t.daoci,t.secscore,signup.dep"+sqlfromwhere+"~"")

dw_score.object.checky_score.dbname=info.check+"."+"secscore"//重新绑定更新字段

else

if'田赛'=info.tianjingthen

dw_score.modify("DataWindow.Table.Select=~""+"selectt.code,signup.name,t.item,t.score,signup.dep"+sqlfromwhere+"~"")

else

dw_score.modify("DataWindow.Table.Select=~""+"selectt.code,signup.name,t.item,t.sgroup,t.daoci,t.score,signup.dep"+sqlfromwhere+"~"")

endif

dw_score.object.checky_score.dbname=info.check+"."+"score"

endif

endif

 

////////////////////////////////////////////////////

//为小组下拉列表框添加内容

if'径赛'=info.tianjingandtrue=info.flagthen//若是分组项目则为小组列表框添加各小组

//////////////////////////////

////添加小组

stringsql

sql="selectdistinctt.sgroup"+sqlfromwhere

declarexiaozudynamiccursorforsqlsa;

preparesqlsafrom:

sql;

opendynamicxiaozu;

stringtpsgroup

ddlb_score.reset()

fetchxiaozuinto:

tpsgroup;

dowhilesqlca.sqlcode=0

ddlb_score.additem(tpsgroup)

fetchxiaozuinto:

tpsgroup;

loop

closexiaozu;

endif

ddlb_score.additem("全部")

//////////////////////

//默认选择"全部"

dw_score.retrieve()

ddlb_score.text="全部"

ddlb_score.postevent("selectionchanged")

//////////////

//显示数据格式

stringgeshi

selectdanweiinto:

geshifromitemsyangshiwhereitem=:

info.item;

checksqlcode()

geshi+=''+setyangshi()

st_geshi.text=geshi

6运行结果与分析(测试)

检录窗口

 

录入成绩窗口

调试分析:

(1)运行时提示“Badruntimefunctionreference”错误信息,引用了错误的运行时函数。

原因:

引用的函数所属对象尚未创建。

解决:

引用前先创建对象。

(2)运行时提示“DoubleorRealexpressionhasoverflowed”错误信息,双精度型或实型表达式溢出。

原因:

函数返回错误范围内的值。

解决:

规范函数返回值的范围。

(3)运行时提示“Fieldnameassignmentnotsupported”,不支持这种字段赋值。

原因:

字段类型不匹配。

解决:

使用正确类型。

7总结(收获与体会)

一、收获

1要学会具体问题具体分析

在着手开始编写代码的时候,我已经将教材还有龙书看过一遍了,但是在实际动手的时候,才发现并不是像书上说的那么清楚明白,语言的特性与书上举例用的语言特性有许多不同,这时就不能生搬硬套书上的算法,要结合语言的特点,采用书上的思想,这样才能把问题解决,其中我主要负责的那一个检录板块牵扯到一个自动分道,如何能实现运算效率最高,起初的算法为将n个数字存储在一数组中首先随机分配1~n间一个数字抽中后该数字后存储空间前移,再随机分配1~n-1间一个数字直至分配结束。

但是此算法效率很低,重新设计算法后改为,数组arry[1~n]保存1~n,首先随机分配1~n一个数字x将arry[x]与arry[1]交换,再分配2~n一个数字x将arry[x]与arry[2]交换,直至结束。

改进算法效率明显高于之前的算法(减少了循环及赋值次数),这样便使得运算的效率大大提高,而且保证了概率绝对一样。

2设计数据结构的重要性

在我编写代码的过程中,最常出现的现象就是反复修改数据结构,甚至在进行优化的时候还回过头去修改中间代码的数据结构。

这就导致了我编写代码效率的降低,还有由于数据结构的反复修改,使得整个工程维护起来极其困难。

这就说明数据结构的设计在整个设计阶段是十分重要的,没有一个设计良好的数据结构,代码编写阶段就不会顺利的进行。

3交流和沟通

我们在开发初期遇到的很多问题都是通过与同学交流和沟通解决的。

同学间无私、耐心的讲解不仅让整个课程设计进展顺利,也让我们每一个人都学到了很多。

 二、感想 

这次课程设计历时二个星期多左右,对我来说真的是受益匪浅,通过课程设计,发现自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。

这次的课程设计也让我看到了团队的力量,我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神,对我而言,知识上的收获重要,精神上的丰收更加可喜。

因为它让我知道了学无止境的道理。

我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。

挫折是一份财富,经历是一份拥有。

这次课程设计必将成为我人生旅途上一个非常美好的回忆!

8附:

源代码

(1)各类数据结构用于在不同对象间交换数据

分组信息

项目信息结构

(2)检查该项目是否已检录

///////////////说明

//传入参数为"全部""第?

组"info需要预先设置

//返回值true已检录

//false未检录

///////////////////////////////////

stringcheckupzu

stringsqlqiandao//无论是否有决赛都将分组

booleanrtn

if"径赛"=info.tianjingandtrue=info.flagthen//若是径赛第一赛则从fstchecked串中分离各小组此时传入数据为"第?

组"或"全部"

//返回检录日志

selectfstcheckedinto:

checkupzufromitemwheregroupm=:

info.groupmanditem=:

info.item;

ifisnull(checkupzu)then

returnfalse//若无数据则直接返回false未检录

endif

//检查是否所有小组都已检录

if"全部"=xiaozuthen

stringsql

sql="selectdistinctch.sgroupfrom"+info.check+"ch,"+info.signup+"signwherech.item=sign.itemandch.code=sign.codeandsign.groupm='"+info.groupm+"'andsign.item='"+info.item+"'"

declareallxiaozudynamiccursorforsqlsa;

preparesqlsafrom:

sql;

opendynamicallxiaozu;

stringtpsgroup

fetchallxiaozuinto:

tpsgroup;

dowhilesqlca.sqlcode=0

if0=pos(checkupzu,tpsgroup,1)then//若未找到则表示存在小组为检录

closeallxiaozu;

returnfalse

endif

fetchallxiaozuinto:

tpsgroup;

loop

closeallxiaozu;

returntrue//所有小组均已检录

endif

///////检查该小组是否已检录

stringqcxz

if0=pos(checkupzu,xiaozu,1)then

returnfalse

else

returntrue

endif

//此时不需用到传入参数xiaozu

else//其他情况全部从secchecked中直接通过1判断

selectseccheckedinto:

checkupzufromitemwheregroupm=:

info.groupmanditem=:

info.item;

ifisnull(checkupzu)then

checkupzu=""

endif

if'1'=checkupzuthen

returntrue//已检录

else

returnfalse//未检录

endif

endif

(3)将更改后数据更新至数据库

//将该项目所有成绩排序编号paixusecpaixu

//直接更新数据库

//调用之前手动确定已录完分数ifscored()

//预先设置info

/////////////////

stringzdflag="",zdscore=""

iftrue=info.flagthen//第一赛scoreflag

//zdflag="flag"

zdscore="score"

else//第二赛secscoresecflag

//zdflag="secflag"

zdscore="secscore"

endif

//根据人数排名次

stringsql

//stringstrcode,strscore

sql="selectch.code,ch."+zdscore+"from"+info.check+"ch,"+info.signup+"signupwherech.code=signup.codeandch.item=signup.itemandsignup.groupm='"+info.groupm+"'andsignup.item='"+info.item+"'"

iftrue=info.flagthen//第一赛

sql+="andch.checkup='1'"//设定条件

else//第二赛

sql+="andch.seccheckup='1'andch.checkup='1'"

endif

 

//设定排序方式

inttempzj//保存排序方式

selectzengjianinto:

tempzjfromitemsyangshiwhereitem=:

info.item;

checksqlcode()

if1=tempzjthen//越大者越优秀

sql+="orderby"+zdscore+"DESC"

else//越小越优秀

sql+="orderby"+zdscore+"ASC"

endif

 

//读取数据按分数优先顺序读取codescore

declaresortdynamiccursorforsqlsa;

preparesqlsafrom:

sql;

opendynami

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

当前位置:首页 > 幼儿教育

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

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