数据结构学生成绩条形图统计问题实验报告.docx
- 文档编号:26841805
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:29
- 大小:332.27KB
数据结构学生成绩条形图统计问题实验报告.docx
《数据结构学生成绩条形图统计问题实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构学生成绩条形图统计问题实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
数据结构学生成绩条形图统计问题实验报告
东北大学信息科学与工程学院
数据结构课程设计报告
题目学生成绩条形图统计问题
课题组长王健
课题组成员张颖刘琪张晓雨
专业名称计算机科学与技术
班级计1307
指导教师杨雷
2015年1月
课程设计任务书
题目:
学生成绩条形图统计问题
问题描述:
条形图问题描述:
给定n个数据,绘出表示这n个数据的条形统计图。
即统计出这n个数据中有多少个不同的值,以及每个值出现的频率是多少。
条形图常用于表示数据分布情况。
例如,学生考试成绩统计、居民收入分布情况等。
假设输入数据为正整数,利用二叉排序树完成输入数据频率统计。
设计要求:
设计基于二叉排序树的学生成绩条形图统计程序。
(1)采用STL的二叉排序树等数据结构。
(2)实现STL的二叉排序树stree类。
(3)实现学生成绩条形图统计。
指导教师签字:
年 月 日
目录
1课题概述4
1.1课题任务4
1.2课题原理4
1.3相关知识4
2需求分析5
2.1课题调研5
2.2用户需求分析5
3方案设计6
3.1总体功能设计6
3.2数据结构设计6
3.3函数原型设计6
3.4主算法设计7
3.5用户界面设计9
4方案实现10
4.1开发环境与工具10
4.2程序设计关键技术10
4.3个人设计实现(按组员分工)
4.3.1刘琪设计实现10
4.3.2张晓雨设计实现11
4.3.3王健设计实现13
4.3.4张颖设计实现14
5测试与调试17
5.1个人测试(按组员分工)17
5.1.1刘琪测试17
5.1.2张晓雨测试17
5.1.3王健测试17
5.1.4张颖测试17
5.2组装与系统测试17
5.3系统运行19
6课题总结21
6.1课题评价21
6.2团队协作21
6.3下一步工作21
6.4个人设计小结(按组员分工)21
6.4.1刘琪设计小结21
6.4.2张晓雨设计小结22
6.4.3王健设计小结22
6.4.4张颖设计小结22
7附录A课题任务分工23
A-1课题程序设计分工23
A-2课题报告分工24
附录B课题设计文档(光盘)25
B-1源程序代码(*.H,*.CPP)25
B-2工程与可执行文件)25
附录C用户操作手册(可选)25
C.1运行环境说明25
C.2操作说明25
1课题概述
1.1课题任务
设计基于二叉排序树的学生成绩条形图统计程序。
(1)采用STL的二叉排序树等数据结构。
(2)实现STL的二叉排序树stree类。
(3)实现学生成绩条形图统计。
1.2课题原理
1.2.1平衡二叉树又称AVL树。
它或者是一颗空树,或者是具有下列性质的二叉树:
它的左子树和右子树都是平衡二叉树,切左子树和右子树的深度之差的绝对值不超过1。
若将二叉树上的结点的平衡因子BF定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只可能是-1、0和1.只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。
1.2.2对树中全部结点逐一进行某种处理需要对其进行遍历。
中序遍历二叉树的操作定义为:
若二叉树为空,则空操作;否则:
(1)中序遍历左子树;
(2)访问根节点;
(3)中序遍历右子树。
1.3相关知识
1.3.1AVL算法构建AVL树
1.3.2平衡二叉树结点的插入与删除
1.3.3平衡二叉树数据统计
1.3.4在dos下打印表
2需求分析
2.1课题调研
随着现代高科技的不断发展,人们在面临大量数据的同时,必须发掘有效的方法将数据进行一点的规律统计,以便能直观的从统计中发现数据间的总体宏观表现,为下一步的数据处理提供有效的数据频率依据。
2.2用户需求分析
据调查,人们对考试的成绩分布有着重大需求。
而一般考试均为百分制,分为五等优(>90分),良(90分<且>80分),中(80分<且>70分),及格(70分<且>60分)和不及格(<60分)。
所以,我们决定利用二叉平衡树统计学生成绩分布,输出学生成绩分布情况。
3方案设计
3.1总体功能设计
3.2数据结构设计
//动态平衡二叉树
typedefstructBSTNode{
charnu[10];
intcount;
intdata;
intbf;//平衡因子
structBSTNode*lchild,*rchild;//左右孩子结点
}BSTNode,*BSTree;//二叉树结点、树
typedefstruct{//学生信息结构体
intgrade;//分数
charnu[10];//学号
}Stu;
3.3函数原型设计
voidLeftBalance(BSTree&T);//对以指针T所指结点为根的二叉树作左平衡//旋转处理,本算法结束时,指针T指向新的根结点
voidRightBalance(BSTree&T);//对以指针T所指结点为根的二叉树作右平衡//旋转处理,本算法结束时,指针T指向新的根结点
voidCreat_AVL(BSTree&T);//生成AVL
voidInsert_AVL(BSTree&T);//插入结点函数
voidDelet_AVL(BSTree&T);//删除结点函数
voidCombine_AVL(BSTree&T,BSTree&T1);//合并两棵平衡树函数
voidVeiw_AVL(BSTreeT);//显示平衡二叉树函数
3.4主算法设计
基本思想:
在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
一般情况下,假设由于在二叉排序树上插入结点而失去平衡的最小树根结点的指针为a(即a是离插入结点最近,且平衡因子绝对值超过1的祖先结点),则失去平衡后进行调整的规律如下:
(1)单向右旋平衡处理:
由于在*a的左子树根结点的左子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次向右的顺时针旋转操作。
(2)单向左旋平衡处理:
由于在*a的右子树根结点的右子树上插入结点,*a的平衡因子由-1增至-2,致使以*a为根的子树失去平衡,则需进行一次向左的逆时针旋转操作。
(3)双向旋转(先左后右)平衡处理:
由于在*a的左子树根结点的右子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行两次向旋转(先左旋后右旋)操作。
(4)双向旋转(先右后左)平衡处理:
由于在*a的右子树根结点的左子树上插入结点,*a的平衡因子由-1增至-2,致使以*a为根的子树失去平衡,则需进行两次向旋转(先右旋后左旋)操作。
在平衡的二叉排序树AVL上插入一个新的数据元素e的递归算法,可描述为:
(一)若AVL为空树,则插入一个数据元素为e的新结点作为AVL的根结点,树的深度增1;
(二)若e的关键字和AVL的根结点的关键字相等,则不进行插入;
(三)若e的关键字小于AVL的根结点的关键字,而且在AVL的左子树中不存在和e有相同关键字的结点,则将e插入在AVL的左子树上,并且当插入之后的左子树深度增加(+1)时,分别就下列不同情况处理之:
(1)AVL的根结点的平衡因子为-1(右子树的深度大于左子树的深度):
则将根结点的平衡因子更改为0,AVL的深度不变;
(2)AVL的根结点的平衡因子为0(左、右子树的深度相等):
则将根结点的平衡因子更改为1,AVL的深度增1;
(3)AVL的根结点的平衡因子为1(左子树的深度大于右子树的深度):
则若AVL的左子树根结点的平衡因子为1:
则需进行单向右旋平衡处理,并且在右旋处理后,将根结点和其右子树根结点的平衡因子更改为0,AVL的深度不变;
(四)若e的关键字小于AVL的根结点的关键字,而且在AVL的左子树中不存在和e有相同关键字的结点,则将e插入在AVL的左子树上,并且当插入之后的左子树深度增加(+1)时,分别就不同情况处理之。
3.5用户界面设计
1.输入学生成绩
2.在dos下打印表
4方案实现
4.1开发环境与工具
硬件:
个人PC
软件:
DevC++
开发环境:
C++
4.2程序设计关键技术
AVL算法;
统计AVL树;
dos界面打印表;
4.3个人设计实现
4.3.1刘琪设计实现
voidInsert_AVL(BSTree&T){
inte2,f=0;
chara;
charnu[10];
printf("请输入个别录入成绩:
");
scanf("%d%c",&e2,&a);
InsertAVL(T,e2,nu,&f);
printf("成功录入!
\n");
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf("\n\n\n\n按任意键返回菜单.....");
getchar();
}
voidTravelAVL(BSTreeT,int*nu){
if(T){
K[*nu]=T->data;
(*nu)++;
TravelAVL(T->lchild,nu);
TravelAVL(T->rchild,nu);
}
}
voidDestroy(BSTree&T){
if(T){
Destroy(T->lchild);
Destroy(T->rchild);
free(T);
}
}
voidCombine_ALV(BSTree&T,BSTree&T1){
intnu,i,f;
charnu1[10];
nu=0;
Creat_AVL(T1);
getchar();
TravelAVL(T1,&nu);
Destroy(T1);
T1=NULL;
for(i=0;i f=0; InsertAVL(T,K[i],nu1,&f); } printf("大量成绩录入成功,菜单查看! \n"); printf("\n\n\n\n\n\n\n\n\n\n\n"); printf("\n\n\n\n按任意键返回菜单....."); getchar(); } 4.3.2张晓雨设计实现 voidPrintAVL(BSTreeT,intn){//中序遍历 inti; if(! T) return;//递归出口 PrintAVL(T->rchild,n+3);//遍历打印右子树 //访问根节点 if(n>=0){ if(T->data<=100&&T->data>=90) grade[0]+=T->count; elseif(T->data>=80) grade[1]+=T->count; elseif(T->data>=70) grade[2]+=T->count; elseif(T->data>=60) grade[3]+=T->count; else grade[4]+=T->count; } PrintAVL(T->lchild,n+3);//便利打印左子树 } voidVeiw_AVL(BSTreeT){ intn; TravelAVL(T,&n); for(inti=0;i<5;++i) grade[i]=0; printf("成绩条形图为: \n"); PrintAVL(T,n); for(inti=0;i<5;i++){ printf("|"); for(intf=0;f printf(""); if(i==0) printf("*\n优: %4d",grade[i]); elseif(i==1) printf("*\n良: %4d",grade[i]); elseif(i==2) printf("*\n中: %4d",grade[i]); elseif(i==3) printf("*\n及格: %4d",grade[i]); else printf("*\n不及格: %4d",grade[i]); for(intf=0;f printf(""); printf("|\n"); printf("|"); for(intf=0;f printf(""); printf("*\n\n"); } printf("按任意键返回菜单....."); getchar(); getchar(); } 4.3.3王健设计实现 voidLeftBalance(BSTree&T){ BSTNode*lc,*rd; lc=T->lchild;//lc指向*T的左子树 switch(lc->bf){//检查*T的左子树的平衡度,并作相应平衡处理 caseLH: //新结点插入在*T的左孩子的左子树上,要作单右旋处理 T->bf=lc->bf=EH; R_Rotate(T); break; caseRH: //新结点插入在*T的左孩子的右子树上,要作双旋处理 rd=lc->rchild;//rd指向*T的左孩子的右子树根 switch(rd->bf){//修改*T及其左子树的平衡因子 caseLH: //*T变换后平衡因子为-1 T->bf=RH; lc->bf=EH; break; caseEH: //平衡因子都为0 T->bf=lc->bf=EH; break; caseRH: //lc平衡因子为1 T->bf=EH; lc->bf=LH; break; } rd->bf=EH; L_Rotate(T->lchild);//左旋 R_Rotate(T);//右旋 } } voidRightBalance(BSTree&T){//与上面过程类似 BSTNode*rc,*ld; rc=T->rchild; switch(rc->bf){ caseRH: T->bf=rc->bf=EH; L_Rotate(T); break; caseLH: ld=rc->lchild; switch(ld->bf){ caseRH: T->bf=LH; rc->bf=EH; break; caseEH: T->bf=rc->bf=EH; break; caseLH: T->bf=EH; rc->bf=RH; break; } ld->bf=EH; R_Rotate(T->rchild); L_Rotate(T); } } 4.3.4张颖设计实现 intInsertAVL(BSTree&T,inte,charnu[],int*taller){ if(! T){//插入新结点 T=(BSTree)malloc(sizeof(BSTNode)); T->data=e; T->lchild=T->rchild=NULL; T->bf=EH; *taller=1; T->count=1; } else{ if(e==T->data){//树中已存在和e有相同关键码的结点 *taller=0; T->count++; return0;//不再插入 } if(e if(! InsertAVL(T->lchild,e,nu,taller))//递归 return0;//未插入 if(*taller)//已插入到*T的左子树中且左子树“长高” switch(T->bf){//检查*T的平衡度 caseLH: //原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); *taller=0; break; caseEH: //原本左右子树等高,现因左子树增高而使树增高 T->bf=LH; *taller=1; break; caseRH: //原本右子树比左子树高,现左右子树等高 T->bf=EH; *taller=0; break; } } else{//与上面类似 if(! InsertAVL(T->rchild,e,nu,taller)) return0; if(*taller) switch(T->bf){ caseLH: T->bf=EH; *taller=0; break; caseEH: T->bf=RH; *taller=1; break; caseRH: RightBalance(T); *taller=0; break; } } } return1; }//InsertAVL voidCreat_AVL(BSTree&T){ inti,f; inta; charc; StuA[MAX]; T=NULL; printf("请输入学生个数: "); scanf("%d%c",&a,&c); printf("请输入学生成绩序列: \n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 学生 成绩 条形 统计 问题 实验 报告