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