用户登录系统文档格式.docx

上传人:b****2 文档编号:5922425 上传时间:2023-05-05 格式:DOCX 页数:31 大小:237.05KB
下载 相关 举报
用户登录系统文档格式.docx_第1页
第1页 / 共31页
用户登录系统文档格式.docx_第2页
第2页 / 共31页
用户登录系统文档格式.docx_第3页
第3页 / 共31页
用户登录系统文档格式.docx_第4页
第4页 / 共31页
用户登录系统文档格式.docx_第5页
第5页 / 共31页
用户登录系统文档格式.docx_第6页
第6页 / 共31页
用户登录系统文档格式.docx_第7页
第7页 / 共31页
用户登录系统文档格式.docx_第8页
第8页 / 共31页
用户登录系统文档格式.docx_第9页
第9页 / 共31页
用户登录系统文档格式.docx_第10页
第10页 / 共31页
用户登录系统文档格式.docx_第11页
第11页 / 共31页
用户登录系统文档格式.docx_第12页
第12页 / 共31页
用户登录系统文档格式.docx_第13页
第13页 / 共31页
用户登录系统文档格式.docx_第14页
第14页 / 共31页
用户登录系统文档格式.docx_第15页
第15页 / 共31页
用户登录系统文档格式.docx_第16页
第16页 / 共31页
用户登录系统文档格式.docx_第17页
第17页 / 共31页
用户登录系统文档格式.docx_第18页
第18页 / 共31页
用户登录系统文档格式.docx_第19页
第19页 / 共31页
用户登录系统文档格式.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

用户登录系统文档格式.docx

《用户登录系统文档格式.docx》由会员分享,可在线阅读,更多相关《用户登录系统文档格式.docx(31页珍藏版)》请在冰点文库上搜索。

用户登录系统文档格式.docx

定义内部类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返回上_

密码输入正礁,成功登陆

键继续…-

搜狗拼音输入进全:

图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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2