运动会分数统计系统实验报告 2.docx
- 文档编号:15952600
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:23
- 大小:797.46KB
运动会分数统计系统实验报告 2.docx
《运动会分数统计系统实验报告 2.docx》由会员分享,可在线阅读,更多相关《运动会分数统计系统实验报告 2.docx(23页珍藏版)》请在冰点文库上搜索。
运动会分数统计系统实验报告2
数据结构试验报告
实验三
综合设计
实验题目:
霍夫曼编码课程设计
专业班级:
计科系1507班
组长:
李煜(2015100733)
组员:
高干(2015100730)
张慧锋(2015100725)
王俊艳(2015100715)
2017年5月31日
实验报告
实验类型综合设计实验室软件实验室二
一、实验题目
霍夫曼编码课程设计
二、实验目的和要求
1.掌握霍夫曼编码
2.掌握递归调用的基本运算及应用。
3.尽可能考虑算法的健壮性。
4.实验报告中要写出测试数据、错误分析以及收获。
三、需求分析
霍夫曼编码”(Win32控制台程序)使用MicrosoftVisualBasic6.0编写,编码采用哈夫曼树路径递归算法,提供查询方式。
并尽可能地考虑了系统的健壮性。
提供完整测试数据、原代码文件、Win32控制台程序相关运行截图、系统菜单示意。
提供系统运作流程图、数据传递及函数功能实现原理。
分析程序编写中产生的问题,并列出错误分析过程及解决方法。
四、概要设计
本次开发的“运动会分数统计系统”实现了上述程序功能,代码如下:
#include
#include
#include
#defineMAXLEN100
typedefstruct
{
intweight;
intlchild;
intrchild;
intparent;
charkey;
}htnode;
typedefhtnodehfmt[MAXLEN];
intn;
voidinithfmt(hfmtt)//对结构体进行初始化
{
inti;
printf("\n");
printf("------------------------------------------------------------------\n");
printf("******************************输入区******************************\n");
printf("\n请输入n=");
scanf("%d",&n);
getchar();
for(i=0;i<2*n-1;i++)//对结构体进行初始化
{
t[i].weight=0;
t[i].lchild=-1;
t[i].rchild=-1;
t[i].parent=-1;
}
printf("\n");
}
voidinputweight(hfmtt)//输入函数
{
intw;//w表示权值
inti;
chark;//k表示获取的字符
for(i=0;i { printf("请输入第%d个字符: ",i+1); scanf("%c",&k); getchar(); t[i].key=k; printf("请输入第%d个字符的权值: ",i+1); scanf("%d",&w); getchar(); t[i].weight=w; printf("\n"); } } voidselectmin(hfmtt,inti,int*p1,int*p2)//选中两个权值最小的函数 { longmin1=999999; longmin2=999999; intj; for(j=0;j<=i;j++)//选择最小权值字符的下标返回 if(t[j].parent==-1) if(min1>t[j].weight) { min1=t[j].weight; *p1=j; } for(j=0;j<=i;j++)//选择次小权值字符的下标还回 if(t[j].parent==-1) if(min2>t[j].weight&&j! =(*p1))//注意j! =(*p1)) { min2=t[j].weight; *p2=j; } } voidcreathfmt(hfmtt)//创建哈夫曼树的函数 { inti,p1,p2; inithfmt(t); inputweight(t); for(i=n;i<2*n-1;i++) { selectmin(t,i-1,&p1,&p2); t[p1].parent=i; t[p2].parent=i; t[i].lchild=p1; t[i].rchild=p2; t[i].weight=t[p1].weight+t[p2].weight; } } voidprinthfmt(hfmtt)//打印哈夫曼树 { inti; printf("------------------------------------------------------------------\n"); printf("**********************哈夫曼编数结构: *****************************\n"); printf("\t\t权值\t父系\t左孩子\t右孩子\t字符\t"); for(i=0;i<2*n-1;i++) { printf("\n"); printf("\t\t%d\t%d\t%d\t%d\t%c",t[i].weight,t[i].parent,t[i].lchild,t[i].rchild,t[i].key); } printf("\n------------------------------------------------------------------\n"); printf("\n\n"); } voidhfmtpath(hfmtt,inti,intj)//编码的重要哈夫曼树路径递归算法 { inta,b; a=i; b=j=t[i].parent; if(t[j].parent! =-1) { i=j; hfmtpath(t,i,j); } if(t[b].lchild==a) printf("0"); else printf("1"); } voidphfmnode(hfmtt)//对字符进行初始编码 { inti,j,a; printf("\n------------------------------------------------------------------\n"); printf("**************************哈夫曼编码******************************"); for(i=0;i { j=0; printf("\n"); printf("\t\t%c\t",t[i].key,t[i].weight); hfmtpath(t,i,j); } printf("\n------------------------------------------------------------------\n"); } voidencoding(hfmtt)//对用户输入的电文进行编码 { charr[1000];//用来存储输入的字符串 inti,j; printf("\n\n请输入需要编码的字符: "); gets(r); printf("编码结果为: "); for(j=0;r[j]! ='\0';j++) for(i=0;i if(r[j]==t[i].key) hfmtpath(t,i,j); printf("\n"); } voiddecoding(hfmtt)//对用户输入的密文进行译码 { charr[100]; inti,j,len; j=2*n-2;//j初始从树的根节点开始 printf("\n\n请输入需要译码的字符串: "); gets(r); len=strlen(r); printf("译码的结果是: "); for(i=0;i { if(r[i]=='0') { j=t[j].lchild; if(t[j].lchild==-1) { printf("%c",t[j].key); j=2*n-2; } } elseif(r[i]=='1') { j=t[j].rchild; if(t[j].rchild==-1) { printf("%c",t[j].key); j=2*n-2; } } } printf("\n\n"); } intmain() { inti,j; hfmtht; charflag; printf("|----------------------|\n"); printf("|计科1507--Q小组--11小组|\n"); printf("|**********************|\n"); printf("|哈夫曼编码课程设计|\n"); printf("|**********************|\n"); printf("|设计完成时间: 2017/5/22|\n"); printf("|----------------------|\n"); creathfmt(ht); printhfmt(ht); phfmnode(ht); printf("\n------------------------------------------------------------------\n"); printf("***************************编码&&译码&&退出***********************"); printf("\n【1】编码\t【2】\t译码\t【0】退出"); printf("\n您的选择: "); flag=getchar(); getchar(); while(flag! ='0') { if(flag=='1') encoding(ht); elseif(flag=='2') decoding(ht); else printf("您的输入有误,请重新输入。 \n"); printf("\n***************************编码&&译码&&退出***********************"); printf("\n【1】编码\t【2】\t译码\t【0】退出"); printf("\n您的选择: "); flag=getchar(); getchar(); } printf("\n\n-----------------------------------------------------------------\n"); printf("***************欢迎使用Q小组的哈夫曼编码系统********************\n"); printf("-----------------------------------------------------------------\n"); system("pause"); } 本程序包含的各个模块详情介绍如下: 函数名 函数名(中文注释) 功能简介 main() 主函数 显示系统功能菜单,提供各功能的接口。 creathfmt(hfmtt) 创建哈夫曼树的函数 建立基本二叉树建立 decoding(hfmtt) 对用户输入的密文进行译码 将字符转换为编码 readdata() 数据文件读取系统 读取存储在文件中的数据并生成总成绩表与得分报表。 output() 分数报表输出系统 提供“按学校‘编号/总分’输出”的输出方式。 inquiry() 分数查询系统 提供“按‘参赛队编号/比赛项目编号’查询”的查询方式。 end() 结束系统 显示结束页面和开发者信息 time() 当前时间系统 显示系统当前时间 各功能模块之间的调用关系如下: 五、使用说明 1、程序名为“运动会分数统计系统.exe”,运行坏境为DOS。 程序执行后显示 *************************************************************** 欢迎使用【运动会分数统计系统】 今天是: 2017年03月21日10: 09: 59 【1】录入信息 【2】输出信息 【3】查询信息 【4】调用信息 【5】退出系统 *************************************************************** 请从菜单【1】-【5】选择一项功能来继续: · 2、输入1进入功能【录入信息】中: *************************************************************** 运动会参赛代表队名单如下: 【01】计科系~精英队 【02】体育系~青春队 请选择您的参赛队编号: · 用户继续输入以继续: *************************************************************** 运动会比赛项目表如下: 【001】男子十项全能赛 【002】女子十项全能赛 请选择即将录入的项目: · (详细过程请参照后文测试截图) 3、输入2进入功能【输出信息】中: *************************************************************** 【1】按学校编号输出 【2】按学校总分输出 *************************************************************** 请从菜单【1】【2】选择一项功能来继续: · 4、输入3进入功能【查询信息】中: *************************************************************** 【1】按参赛队编号查询 【2】按比赛项目编号查询 *************************************************************** 请从菜单【1】【2】中选择一项功能来继续: · 5、输入4进入功能【调用信息】中: *************************************************************** 恭喜您成功录入以下信息 *************************************************************** 参赛队编号: · 参赛队总分: · 参赛队男子团体总分: · 参赛队女子团体总分: · *************************************************************** (详细过程请参照后文测试截图) 6、输入5进入功能【退出系统】中: *************************************************************** 欢迎再次使用 【运动会分数统计系统】 *************************************************************** 开发者信息 李煜高干张慧锋王俊艳 运城学院计算机科学与技术系1507班 *************************************************************** 六、调试分析 在本系统的编写过程中,我们遇到的主要问题及解决方案: a)结构体设计不合理,影响了后续的函数编写,导致系统在数据处理时不能正确读取相关数据。 解决方案: 依据需求重新设计结构体,并增加了宏定义,重新编写函数中的各部分初始化语句,排查并修正错误。 b)switch语句中漏写break语句,case只起标号的作用,而不起判断作用,导致部分选择结构出错。 解决方案: 补充break语句。 七、测试结果 1、执行“运动会分数统计系统.exe”后显示功能菜单,此时输入1,进入【录入信息】。 根据提示,依次输入“01”“001”对“精英队”进行信息录入。 根据提示,依次输入“001”“3”“3”“1”“2”“3”对比赛项目详细情况进行录入。 根据提示,依次输入“002”“5”“3”“1”“3”“5”对比赛项目详细情况进行录入。 根据提示,依次输入“02”“002”对“青春队”进行信息录入。 根据提示,依次输入“001”“3”“2”“3”“2”对比赛项目详细情况进行录入。 2、输入完成,当按下“Enter”键时会显示成绩报表(这部分内容请参阅后文“步骤4”) a)返回主菜单后,此时输入2,进入【输出信息】。 b)此时输入1,则“按学校编号输出”成绩报表。 c)若要使用“按学校总分输出”则要先输入0,再输入2。 输入0跳出功能并返回主菜单,此时输入3,进入【查询信息】。 a)输入1,使用“按参赛队编号查询”功能;输入“01”“001”则可以查询“精英队”有关“男子十项全能赛”的有关信息。 b)输入2,重新开始一次该功能。 输入03,由于这是一支不存在的参赛队,系统对不存在的参赛队作出了警告。 输入0跳出,再输入2使用“按比赛项目编号查询”功能 a)输入001,系统则使用有关“男子十项全能比赛”数据生成了成绩报表。 b)若输入003,由于这是一项不存在的比赛项目,系统对其作出了警告。 输入0跳出功能并返回主菜单,此时输入4,进入【调用信息】。 每当按下“Enter”键时,系统会进一步显示成绩报表 八、实验总结 通过编写本系统,我组全体成员对数据结构的应用有了更深层次的认识。 本系统实现了数据的录入、数据的排序、数据的分析与计算等功能,在运动会分数统计的背景下起到了良好的应用效果。 在为更复杂的应用场景提供基础性的算法同时,兼顾了各个子系统的界面设计,使其更易于使用。 本实验程序设计中,将程序分为五个模块,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重用性,确实得到了一次良好的程序设计训练。 附录: 模块分工 李煜(2015100733): 编写writedata();inquiry() 高干(2015100730): 编写main();output() 张慧锋(2015100725): 编写inputinformation();readdata() 王俊艳(2015100715): 编写end();time() 全体成员: 结构体设计、系统流程分析、系统外观设计、实验报告
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运动会分数统计系统实验报告 运动会 分数 统计 系统 实验 报告