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.用户登录