报告书吕文泊.docx
- 文档编号:23081678
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:23
- 大小:231.70KB
报告书吕文泊.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.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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 报告书 吕文泊
![提示](https://static.bdocx.com/images/bang_tan.gif)