用户登录系统文档格式.docx
- 文档编号:5922425
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:31
- 大小:237.05KB
用户登录系统文档格式.docx
《用户登录系统文档格式.docx》由会员分享,可在线阅读,更多相关《用户登录系统文档格式.docx(31页珍藏版)》请在冰点文库上搜索。
定义内部类userNode来存储AVL树的节点信息。
2.系统功能设计:
要创建一颗包含用户名和用户密码的二叉树,要能适应频繁的查找,因为每
个用户名是唯一的,将用户名(string类型)作为AVL树的比较参数,这样就可以实现快速的插入、删除和查找,重定义userNode类的比较函数。
AVL树是用模板类实现的,这样就可以直接比较两个用户类,方便了很多。
图1系统功能结构图
3.类的设计:
//节点的类
classuserNode
{
private:
stringname;
stringpassword;
shortintheight;
public:
userNode*left;
userNode*right;
userNode(conststring&
name,conststring&
password);
userNode(constuserNode&
temp);
voidsetName(conststring&
name);
voidsetPassword(conststring&
stringgetName();
stringgetPassword();
intgetHeight();
voidchangeHeight(constintheight);
//改变树的高度boolcheckName(conststring&
};
//树的类
classtree
userNode*root;
tree();
~tree();
voidinsert_node(userNode*&
t,userNode&
temp);
voidinsert_node(userNode&
//新建一个节点
voidremove(userNode*&
r,userNode*&
//删除一个节点
voidclear(userNode*t);
voidclear();
voidprint();
voidprint(intindex,userNode*r);
//输岀一棵树
voidPrint();
voidPrint(ofstream&
ofile,userNode*&
r);
//写入文件
voidrotateL(userNode*&
//左旋
voidrotateR(userNode*&
//右旋
voidrotateDoubleLR(userNode*&
//左右旋
voidrotateDoubleRL(userNode*&
//右左旋
voidrightBalance(userNode*&
voidleftBalance(userNode*&
userNode*findNode(strings);
//搜索一个节点
userNode*searchLeftMaxNode(userNode*&
R);
//框架类
classframe
treemyTree;
frame();
voidview();
//显示主界面
voidLogin();
//登录界面
voidtestInsert();
//插入一个节点
voidprintTree();
//画岀一棵树
4.主程序的设计:
图2类的调用
三•调试分析:
1.技术难点分析:
(1)查询操作时,怎么能找到相应用户的节点?
考虑到用户名的唯一性,所以将用户名作为AVL树的关键词,以字符串来比较大小,进行排序,重定义userNode类的比较操作符,只比较IP,因此,在查询的时候,新建一个userNode的对象,其IP赋值为所要查询的IP,然后调用查找函数,可找到对应的点
(2)AVL树的实现
看书,上网查询。
先了解二叉查找树(BST的实现,二叉查找树(BST是一种很好的数据结构,它的特点是,对其任一节点,都满足该节点的左子树的所有点的值都小于该节点,而右子树则是大于。
我采用链表来实现它,创建关于节点的
一个类Node,内含描述该节点的值,及左右指针。
我定义insert_node()函
数来实现新节点的插入。
AVL树相对于BST树,多了平衡两字,树都有高度,而AVL树就是要求每一个节点的左子树和右子树的高度差不超过1,这样就能使其
尽可能的减小整棵树的高度,使时间复杂度能稳定在O(logN),但我们不可能去约束用户的输入,因此,引入了四种旋转:
I是新插入的节点
图4左旋
图5先右旋再左旋
图6先左旋再右旋
(3)修改密码或删除用户后如何返回上一界面?
经反复修改,未果,遂放弃。
2.调试错误分析:
(1)登陆时密码要正确
rD:
\C++\^^iS®
2015\DateStructureexpwriment\Debug\Date1欢迎进人用户登录界面!
(输人00逅回上—界面〉
请输入账号;
159
请输入密码;
图7用户登录界面
(2)登陆时用户要存在
■D:
\C++型试验2015\DateStructureexpwriment\Debug\DateStructur.^欢迎进入用户登录界面「(输入盹返回上一界面〉
请输入账号|
12
图8用户不存在界面
(3)新建用户名不能已存在
\C+型试验2015\DateStructureexpwnment\Debug\DateSx
欢迎进入用户注册界面!
t输入胴追回上一界面〉
请输入用户名:
该用户已存在!
请按任意键继绫…
图9用户名已存在界面
四、测试结果分析:
1)
主界面
\C++U<型试验2015\DateStructureexpwriment\Debug\DateStructur...
一用图一入形一进录鵜岀一迎登注一黒-「..:
」2.3,4.
攫狗拼音输入法全:
图10主界面
2)登录界面
■。
:
\匚++伏型试验2015\DateStructureexpwriment\Debug\DateStructur.,.欢迎进入用户聲录界面!
t输入歸返回上一鼎面亍
请输入账号:
请输入密码:
密码输入正确,成功登陆
捜狗拼音输入进也
图ii登录界面
3)注册界面
\C++\±
^tj^^2015\DateStructureexpwriment\Debug\DateStructur...-眉迎进入用户注册界面!
<输入唾回上一界面〉
23
注册成功!
请按任意键继续•-•■
扌叟狗捋音输人法全:
图12注册界面
4)树图
5)修改密码
I"
1D:
\C++V^T3C^2015\DateStructureeKpwriirient\Debug\DateStructur...-n!
输入新密码;
六
请按農键继续•….
扌叟狗拼音输入进全:
图14修改密码
6)删除用户
•D:
\C+15\DateStructureexpwriment\Debug\DateStructur..."
隸迎进入用户登录界面It输入ee返回上_
密码输入正礁,成功登陆
h®
键继续…-
搜狗拼音输入进全:
图15删除用户界面
五、附录:
Node.h
#ineludevstring>
#inelude<
cmath>
eassert>
#include<
iomanip>
iostream>
usingnamespaeestd;
elassuserNode
userNode(eonststring&
userNode(eonstuserNode&
voidsetName(eonststring&
Tree.h
#include"
node.h"
fstream>
Frame.h
tree.h"
Node.cpp
voiduserNode:
setName(conststring&
name)
this->
name=name;
}
voiduserNode:
setPassword(conststring&
password)
password=password;
stringuserNode:
getName()
returnname;
getPassword()
returnpassword;
intuserNode:
getHeight()
returnthis==NULL?
-1:
height;
changeHeight(constinth)
height=h;
booluserNode:
checkName(conststring&
if(this->
name==name)returntrue;
elsereturnfalse;
userNode:
userNode(conststring&
height=O;
left=NULL;
right=NULL;
userNode(constuserNode&
temp)
name=temp.name;
password=temp.password;
height=0;
Tree.cpp
#include<
queue>
//构造函数
tree:
tree()
root=NULL;
voidtree:
insert_node(userNode&
temp)
insert_node(root,temp);
insert_node(userNode*&
r,userNode&
t)
if(r==NULL)
r=newuserNode(t);
//若树为空,直接新建节点
elseif(r->
getName()==t.getName())//若节点值相等,则用户名重复
return;
stringrename;
cout«
"
用?
户§
名?
vvt.getName()v<
"
已?
经-存?
在"
,?
请?
修T改?
<
endl;
cin»
rename;
t.setName(rename);
insert_node(r,t);
getName()>
t.getName())
insert_node(r->
left,t);
if(r->
left->
getHeight()-r->
right->
getHeight()==2)
rightBalance(r);
getName()<
right,t);
getHeight()==2){
leftBalance(r);
r->
changeHeight(max(r->
getHeight(),r->
getHeight())+1);
//移除
remove(userNode*&
elseif(temp->
getName())
remove(r->
left,temp);
getHeight()==2)leftBalance(r);
right,temp);
getHeight()==2)rightBalance(r);
else
left==NULL)
userNode*q=r;
r=r->
right;
deleteq;
right==NULL)
left;
else{
userNode*R;
r=searchLeftMaxNode(r,R);
left,R);
if(r)
changeHeight(max(r->
getHeight())+1);
remove(root,temp);
print()
print(0,root);
print(intindex,userNode*r)
print(index+8,r->
right);
cout<
setw(index)vvr->
getName()v<
("
<
getHeight()<
)"
endl;
left);
Print(ofstream&
r)
Print(ofile,r->
ofile<
"
getPassword()<
'
\n'
;
Print()
userNode*p=root;
ofstreamofile;
ofile.open("
user.txt"
);
assert(ofile.is_open());
Print(ofile,p);
ofile.close();
rotateL(userNode*&
userNode*R=r->
right=R->
R->
left=r;
changeHeight(max(R->
r=R;
rotateR(userNode*&
userNode*L=r->
left=L->
L_>
right=r;
L->
changeHeight(max(L->
r=L;
rotateDoubleLR(userNode*&
rotateL(r->
rotateR(r);
rotateDoubleRL(userNode*&
rotateR(r->
rotateL(r);
rightBalance(userNode*&
userNode*temp=r->
if(temp->
getHeight()-temp->
getHeight()==-1)rotateDoubleLR(r);
elserotateR(r);
leftBalance(userNode*&
getHeight()==1)rotateDoubleRL(r);
elserotateL(r);
userNode*tree:
findNode(strings)
userNode*r=root;
while(r)
if(s==r->
returnr;
elseif(s<
elseif(s>
getN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用户 登录 系统