logo资料库

AVL树模拟用户登录系统的实验报告(附代码和详尽注释).doc

第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
资料共36页,剩余部分请下载后查看
3.调试分析
-------------------------------------
三.调试分析
(2)技术难点分析(至少3个);
1.由于放弃树高调整平衡因子,所以平衡因子的调整是编程最困难之处,采用方法是根据插入子数是左子树还是右子
2.删除时需先采用BST的删除方式,再分情况用类似AVL插入节点时的调整方法,必须完全搞懂BST和AVL
3.代码阅读问题:纯算法程序一般难以阅读,尤其是像AVL这类复杂算法,即使是自己也是编了前面忘了后面,所
1 用户登录系统的模拟实验报告 软工 1202 胡飞亚 201226630205 目录 1. 实验内容分析 1.实验目的 2.设计思路 ------------------------------------------------------------------------- ------------------------------------------------------------------------- 3.流程图以及类的主要包含和调用关系 ------------------------------------------------------------------------- 2. 实验验证分析: (1)输入的形式和输入值的范围 ------------------------------------------------------------------------- (2)输出的形式 ------------------------------------------------------------------------- (3)程序所能达到的功能 ------------------------------------------------------------------------- (4)测试数据 ------------------------------------------------------------------------- 3.调试分析 (1)讨论分析调试过程中的主要技术问题以及具体的解决方法 ------------------------------------------------------------------------- (2)技术难点分析 ------------------------------------------------------------------------- (3)印象最深刻的3个调试错误,及修正方法 ------------------------------------------------------------------------- 4.测试结果: ------------------------------------------------------------------------- 5.附录:附上源代码 ------------------------------------------------------------------------- 2 2 2 2 3 3 3 7 7 8 8 8
一.实验内容分析: 1.实验目的:模拟用户登录系统,在 O(lgn)时间内完成用户登录、删除、修改等工 2 作。 2.设计思路: 主要分以下四个类: AVLTreeNode:存储平衡树节点; AVLTree:AVL 平衡树的主要实现算法; UserInfo:存储用户信息; Interface:界面,与用户交互; 3.流程图以及类的主要包含和调用关系: 二.实验验证分析 (1)输入的形式和输入值的范围; 控制台的输入: 如图,输入为数字,超出范围将提示不正确并返回重新输入
3 文件的输入: 程序会找寻当前目录的 database.data 文件,并读入数据,如果未找到则自创此 文件,创建空树 (2)输出的形式; 程序退出时析构函数保存文件到 database.data 并覆盖原文件。 (3)程序所能达到的功能; 在 O(lgn)时间内添加、查找、删除、修改用户信息。 (4)测试数据: 本系统包含三个测试函数样例: 1.顺序插入测试(分别在 debug 和 release 环境下和 STL map 比较速度) 2.随机插入测试(分别在 debug 和 release 环境下和 STL map 比较速度) 3.删除测试 测试函数均在 main 文件里 void randomTest();//随机数测试 void orderTest();//顺序插入测试 void deleteTest();//删除测试 void main_interface();//主界面 1,2 均在 debug 模式下插入 100W 数据,在 release 模式下插入 1000W 数据。 顺序插入的实现是用整数 1~n 转换为 string,位数不够的在前面补‘0’。 测试结果:
1.debug 下顺序插入测试: 4 2.Release 下顺序插入测试
3.debug 下随机插入测试 5 4.release 下随机插入测试 实践证明 map 的红黑树在顺序插入测试时慢于我的 avl 树,但随机插入测试表现比 AVL 树 要好。 3.删除数据的图形化表示(‘R’‘L’‘=’为平衡因子以检验正确性)
6 下面删除 3(树中无 3): 还是一样,下面删除 2
7 删除成功,下面删除 7 删除成功。 三.调试分析 (1)讨论分析调试过程中的主要技术问题以及具体的解决方法(至少3个); 1.代码重复问题: 有重复的代码不是好代码。左右旋和左旋右旋有大量重复,经过分析发现左右 旋可以分解为先左旋后右旋,但平衡因子调整方法不一。所以分解左旋和右旋为两 个函数,调整平衡因子单分一个函数。 2.空间占用问题: 平衡因子只有 3 个取值却占了一个 int 4 个字节是极大的浪费,所以改用 char 型。编程实践中发现树高也可以取消,也极大的节省了空间。 3.时间浪费问题: 先调整平衡因子再旋转最后再调整平衡因子浪费时间,经分析后可以采取一些 代码上的改动而将第一次调整省略。 (2)技术难点分析(至少3个); 1.由于放弃树高调整平衡因子,所以平衡因子的调整是编程最困难之处,采用方法
8 是根据插入子数是左子树还是右子树调整父亲的平衡因子。 2.删除时需先采用 BST 的删除方式,再分情况用类似 AVL 插入节点时的调整方法, 必须完全搞懂 BST 和 AVL 才能正确地处理删除问题。 3.代码阅读问题:纯算法程序一般难以阅读,尤其是像 AVL 这类复杂算法,即使 是自己也是编了前面忘了后面,所以程序添加了海量的注释,每个函数每个重要语句都 有功能解说,代码命名取其意思,格式遵循《cleanCode》。 (3)印象最深刻的3个调试错误,及修正方法; 1.最深的当然是访问了没初始化的内存!!几乎 90%调试问题都与此有关。大部分 非法访问内存经调试都归结于平衡因子的错误。解决方法是在纸上画出几个正确的例 子,再输入进程序调试,看平衡因子的错误具体地址和引起其错误的代码。反复调试修 改直到测试再大数据量也不会报错。 2.链接错误。好像是 1005,此错误的原因是.h 文件内除了成员函数不能有其它函数。 原来是我用的友元重载比较函数(必须用友元,否则类对象比较时重载不匹配。)网上 查了好半天才知道的原因。解决方法:友元重载比较运算符函数放到.cpp 文件里。 3.头文件包含问题要彻底搞明白,.h 文件必须加头文件卫士,.cpp 必须不加而且不 能被#include,。 4.测试结果: (1)展示程序的运行结果,包括输入和输出,分析数据的正确性; 1.database.data 文件(存放用户名密码) 2.用户登录
分享到:
收藏