用户登录系统的模拟国际学院数据结构大型实验报告用户登录系统的模拟目录一、实验目的和要求....................................................................2(一)实验目的....................................................................2(二)实验要求....................................................................2二、实验内容..........................................................................2三、实验分析..........................................................................2(一)主界面......................................................................2(二)用户界面....................................................................2(三)系统流程图..................................................................3(四)类与类之间的关系............................................................3(五)平衡函数....................................................................4(六)函数调用关系................................................................4四、实验验证分析......................................................................5(一)输入、输出形式..............................................................7(二)达到的功能..................................................................8(三)测试数据....................................................................8五、调试分析.........................................................................13(一)技术问题...................................................................13(二)技术难点分析...............................................................14(三)印象深刻的调试错误.........................................................19六、源代码...........................................................................19七、结束语...........................................................................191用户登录系统的模拟一、实验目的和要求(一)实验目的本实验是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《数据结构与算法分析》课程后进行的一次全面的综合练习。本实验的目的和任务:1.巩固和加深学生对平衡二叉树的基本知识的理解2.掌握递归的使用3.掌握文件的基本操作4.掌握程序调试的基本技能5.提高运用C++语言解决实际问题的能力6.掌握书写程序设计说明文档的能力(二)实验要求1.实验内容分析2.实验验证分析3.调试分析4.测试结果二、实验内容基于平衡二叉查找树(AVL)的概念建立一个用户登录系同的模拟实现功能:1.把用户的信息存储到文件,当程序启动时,从文件读取数据创建平衡二叉查找树2.主界面提示创新用户和登录,登录后,提供密码及名字的修改功能和删除。3.删除和创新的时候,都在平衡二叉查找树和文件中进行更改三、实验内容分析(一)主界面提供register和login两个功能1.1Register先提示用户输入用户名,如果用户名已存在,会跳出信息提示再输入或者按0退出;输入正确,提示输入密码,和上面一样;用户名和密码都正确,就提示创建成功(在树上增加节点,以及做出相当的工作去平衡树若出现2用户登录系统的模拟不平衡因子)1.2Login提示用户输入用户名及密码,如果不存在,就跳出信息提示再次输入或者按0退出;输入正确,相当于在树中找到匹配的节点,会提示登录成功,然后直接进入用户界面(二)用户界面,提供SetNewName、SetNewPassword、Delete2.1SetNewName/SetNewPassword提示用户输入新名字(新密码),若名字(密码)已存在,提示用户再次输入或退出,不存在就提示用户再次输入名字(密码)为了能让用户确认要修改的信息;输入正确,相当于在其节点的数据部分更改成功,会跳出更改成功信息。2.2Delete选择Delete后,会跳到信息问用户是否真的要删除,选择删除就从树上和文件里删掉此节点;选择否,就退回前界面。(三)系统流程图再输入或退出用户界面修改密码修改名字删除用户Exit输入正确名和密码LoginRegister主界面输入正确密输入正确密再输入或退出再输入或退出退出输入正确密码输入正确名再输入或退出输入正确密输入正确密3用户登录系统的模拟(四)类与类间关系4.1user类仅有root为成员变量,类型为userNode*4.2userNode类定义:userNode类是user类私有的类,它是节点类,用来连接节点,把节点连成一颗二叉树,节点具有4个部分,分为:名字与密码的两个数据部分和两个userNode指针来存放其后继的的左边和右边节点的地址。classuserNode{public:stringname;stringpassword;intbalanceFactor;userNode*left;userNode*right;userNode():balanceFactor(0),left(0),right(0){}userNode(stringna,stringpa,userNode*l=0,userNode*r=0):balanceFactor(0),name(na),password(pa),left(l),right(r){}conststring&getName(){returnname;}conststring&getPassword(){returnpassword;}};4.3类图(五)平衡函数5.1平衡函数下面例子所提的输入,是我在user.txt(存放信息文件做修改,方便工作),UseruserNode4用户登录系统的模拟因为每次启动系统,是先从user.txt中读取的5.1.1简单右旋voidrotateLeft(userPtr&):rotatewithleftchild,当插入项位于最近的平衡因子为+2的祖先节点的左孩子的左子树中时使用例:依次输入,(a,1)(b,2)(c,3),三个数据组添加到树,如果按着二叉树原理,它们应该是在一条直线往左方下落,但程序中使用其平衡函数,结果:5.1.2简单左旋voidrotateRight(userPtr&):rotatewithrightchild,当插入项位于最近的平衡因子为-2的祖先节点的右孩子的右子树中使用例:依次输入(c,3)(b,2)(a,1),结果:5.1.3左右旋voiddoubleRotateLeft(userPtr&):当插入项位于最近的平衡因子为+2的祖先节点的左孩子的右子树中使用例:依次输入(o,1)(i,2)(p,3)(m,4)(j,5),结果:5.1.4右左旋voiddoubleRotateRight(userPtr&):当插入项位于最近的平衡因子为-2的祖先节点的右孩子的左子树中使用例:依次输入(o,1)(i,2)(r,3)(p,4)(q,5),结果:5用户登录系统的模拟(六)其他成员函数定义和其调用关系1插入函数voidinsertUser(conststring&,conststring&):将用户信息插入到树中2插入辅助函数voidinsertHelper(userPtr&,conststring&,conststring&):是为insertUser函数调用,从树的根追随到匹配地方存放,及做相应的平衡工作3判空函数boolisempty():判断树是否为空4存储函数voidsave():把数据写入文件(user.txt)5存储辅助函数voidsaveHelper(fstream&file,userPtrsubtreePtr):采用前序读入6查找函数boolsearch(conststring&,conststring&)const:查找相应的名字和密码7查找辅助函数boolsearchHelper1(userPtrsubtreePtr,conststring&,conststring&)const:为search函数调用,从根节点开始找,找到返回true,否则false8更改数据函数voidmodify(conststring&):更改信息,其包括设置新名字,新密码以及删除9查找密码函数boolsearchPassword(userPtrsubtreePtr,conststring&)const:为modify函数调用,当要更改密码的时候,先查找是否已存在10查找名字函数boolsearchName(userPtrsubtreePtr,conststring&)const:为modify函数调用,当要更改密码的时候,先查找是否已存在11删除节点函数voiddeleteUser(conststring&):删除节点函数,因为本程序是要求用户先登录才能删除,借于这点,我们已经定位当前用户的节点,所以参数只要名字即可12删除辅助函数voiddeleteHelper(conststring&na,userPtr&locptr,userPtr&parent)const:定位要删的位置,及父节点,为删除函数调用13删除辅助函数voiddeleteHelper2(userPtr&ptr,conststring&na):调用deleteHelper函数,且删节点之后作出相当的平衡工作;14读取文件内容函数voidloadsave():在user.txt读取内容15读取文件辅助函数userloadHelper():为load函数调用,它一边读取,一边6用户登录系统的模拟创建及插入到平衡二叉查找树16voidwelcome();voidwelcome();voidmainMenu();voidregisterMenu();voidloginMenu();这些函数是设计界面函数17设计user类必备的函数:user():构造函数~user():析构函数,调用voiddestroyHelper(userPtr)辅助函数user(user&):拷贝构造,调用userPtrcopy(userPtr)拷贝辅助函数18输出树图函数voidouput()函数,调用vo