ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:237.05KB ,
资源ID:10030488      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10030488.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(用户登录系统.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

用户登录系统.docx

1、用户登录系统数据结构大型实验2015/2016 (1)实验题目 用户登录系统学生姓名 学生学号 主要工作 树的结构、框架编写负责人 学生班级 任课教师 提交日期2016.1.2计算机科学与技术学院用户登录系统一.实验题目和要求:【问题描述】在登录服务器系统时,都需要验证用户名和密码,如 teln et远程登录服务器。用户输入用户名和密码后,服务器程序会首先验证用户信息的合法性。 由于用户信息的验证频率很高,系统有必要有效地组织这些用户信息, 从而快速查找和验证用户。另外,系统也会经常会添加新用户、 删除老用户和更新用户密码等 操作,因此,系统必须采用动态结构,在添加、删除或更新后,依然能保证验

2、证 过程的快速。请采用相应的数据结构模拟用户登录系统,其功能要求包括用户登 录、用户密码更新、用户添加和用户删除等。【基本要求】1. 要求自己编程实现二叉树结构及其相关功能,以存储用户信息,不允许使用 标准模板类的二叉树结构和函数。同时要求根据二叉树的变化情况,进行相 应的平衡操作,即AVL平衡树操作,四种平衡操作都必须考虑。测试时,各 种情况都需要测试,并附上测试截图;2. 要求采用类的设计思路,不允许出现类以外的函数定义,但允许友元函数。主函数中只能出现类的成员函数的调用,不允许出现对其它函数的调用。3. 要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函 数main

3、存储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和 实现都放在.h文件中。4. 要求源程序中有相应注释;5. 不强制要求米用类模板,也不要求米用可视化窗口;6. 要求测试例子要比较详尽,各种极限情况也要考虑到,测试的输出信息要详细易懂,表明各个功能的执行正确;7. 要求采用Visual C+ 6.0 及以上版本进行调试;设计思路:1. 系统总体设计:采用平衡二叉查找树(AVL,以用户名(IP)作为比较的关键词进行插 入。平衡二叉查找树是在二叉搜索树(BST的基础上进行了优化,使得树基本 达到平衡。定义内部类userNode来存储AVL树的节点信息。2. 系统功能设计:要创建一颗包含

4、用户名和用户密码的二叉树, 要能适应频繁的查找,因为每个用户名是唯一的,将用户名(string类型)作为AVL树的比较参数,这样就 可以实现快速的插入、删除和查找,重定义 userNode类的比较函数。AVL树是 用模板类实现的,这样就可以直接比较两个用户类,方便了很多。图1系统功能结构图3. 类的设计:/节点的类class userNodeprivate :stri ng n ame;stri ng password;short int height;public :userNode *left;userNode *right;userNode(const string &name, con

5、st string &password);userNode(const userNode & temp);void setName( const string &name);void setPassword( const string &password);stri ng getName();stri ng getPassword();int getHeight();void changeHeight( const int height); / 改变树的高度 bool checkName(const string &name);/树的类class treeprivate :userNode *

6、root;public :tree();tree();void insert_node(userNode *&t ,userNode &temp);void insert_node(userNode &temp); / 新建一个节点void remove(userNode *&r,userNode *&temp);void remove(userNode *&temp); / 删除一个节点void clear(userNode *t);void clear();void print();void print( int index,userNode *r); / 输岀一棵树void Print(

7、);void Print(ofstream &ofile,userNode *&r); / 写入文件void rotateL(userNode *&r); / 左旋void rotateR(userNode *&r); / 右旋void rotateDoubleLR(userNode *&r); / 左右旋void rotateDoubleRL(userNode *&r); / 右左旋void rightBalance(userNode *&r);void leftBalance(userNode *&r);userNode *findNode(string s); / 搜索一个节点userN

8、ode *searchLeftMaxNode(userNode *&r,userNode *&R);/框架类class frametree myTree;public :frame();void view(); /显示主界面void Login(); / 登录界面void test In sert(); / 插入一个节点void printTree(); / 画岀一棵树;4. 主程序的设计:图2类的调用三调试分析:1. 技术难点分析:(1) 查询操作时,怎么能找到相应用户的节点?考虑到用户名的唯一性,所以将用户名作为AVL树的关键词,以字符串来比较大 小,进行排序,重定义userNode类的比

9、较操作符,只比较IP,因此,在查询的 时候,新建一个userNode的对象,其IP赋值为所要查询的IP,然后调用查找 函数,可找到对应的点(2) AVL树的实现看书,上网查询。先了解二叉查找树(BST的实现,二叉查找树(BST是一种 很好的数据结构,它的特点是,对其任一节点,都满足该节点的左子树的所有点 的值都小于该节点,而右子树则是大于。我采用链表来实现它,创建关于节点的一个类Node,内含描述该节点的值,及左右指针。我定义 insert_node() 函数来实现新节点的插入。AVL树相对于BST树,多了平衡两字,树都有高度,而 AVL树就是要求每一个节点的左子树和右子树的高度差不超过 1,

10、这样就能使其尽可能的减小整棵树的高度,使时间复杂度能稳定在 O(logN),但我们不可能去 约束用户的输入,因此,引入了四种旋转:I是新插入的节点图4左旋图5先右旋再左旋图6先左旋再右旋(3)修改密码或删除用户后如何返回上一界面? 经反复修改,未果,遂放弃。2. 调试错误分析:(1)登陆时密码要正确r D:C + +iS2015Date Structure expwrimentDebugDate 1 欢迎进人用户登录界面!(输人00逅回上界面请输入账号;159请输入密码;图7用户登录界面(2)登陆时用户要存在 D:C+ + 型试验2015Date Structure expwrimentDeb

11、ugDate Structur. 欢迎进入用户登录界面(输入盹返回上一界面请输入账号|12图8用户不存在界面(3)新建用户名不能已存在 D:C + 型试验2015Date Structure expwnmentDebugDate Sx欢迎进入用户注册界面! t输入胴追回上一界面请输入用户名:159该用户已存在!请按任意键继绫图9用户名已存在界面四、测试结果分析:1) 主界面 D:C+U型试验201 5Date Structure expwrimentDebugDate Structur.一用 图 一入 形 一进录鵜岀 一迎登注一黒 -.:2.3,4.攫狗拼音输入法全:图10主界面2) 登录界面

12、。:匚+伏型试验201 5Date Structure expwrimentDebugDate Structur.,. 欢迎进入用户聲录界面! t输入歸返回上一鼎面亍请输入账号:159请输入密码:密码输入正确,成功登陆捜狗拼音输入进也图ii登录界面3)注册界面 D:C+tj20 15Date Structu re expwri m en tD e b ugDa te Structur.- 眉迎进入用户注册界面! 输入唾回上一界面请输入用户名:23请输入密码:23注册成功!请按任意键继续 - 扌叟狗捋音输人法全:图12注册界面4)树图5)修改密码I1 D:C+VT3C2015Date Struc

13、ture eKpwriirientDebugDate Structur. - n !输入新密码; 六请按農键继续.扌叟狗拼音输入进全:图14修改密码6)删除用户 D:C+15Date Structure expwrimentDebugDate Structur. 隸迎进入用户登录界面I t输入ee返回上_请输入账号:159请输入密码:23密码输入正礁,成功登陆h键继续-搜狗拼音输入进全:图15删除用户界面五、附录:Node.h#inelude vstring#inelude #inelude #include #inelude using namespaeestd;elass userNode

14、private :stri ng n ame;stri ng password;short int height;public :userNode *left;userNode *right;userNode(eonst string &name, const string &password);userNode(eonst userNode & temp);void setName( eonst string &name);void setPassword( const string &password);stri ng getName();stri ng getPassword();int

15、 getHeight();void changeHeight( const int height); / 改变树的高度 bool checkName(const string &name);Tree.h#include node.h#include class treeprivate :userNode *root;public :tree();tree();void insert_node(userNode *&t ,userNode &temp);void insert_node(userNode &temp); / 新建一个节点void remove(userNode *&r,userN

16、ode *&temp);void remove(userNode *&temp); / 删除一个节点void clear(userNode *t);void clear();void print();void print( int index,userNode *r); / 输岀一棵树void Print();void Print(ofstream &ofile,userNode *&r); / 写入文件void rotateL(userNode *&r); / 左旋void rotateR(userNode *&r); / 右旋void rotateDoubleLR(userNode *&r

17、); / 左右旋void rotateDoubleRL(userNode *&r); / 右左旋void rightBalance(userNode *&r);void leftBalance(userNode *&r);userNode *findNode(string s); / 搜索一个节点userNode *searchLeftMaxNode(userNode *&r,userNode *&R);Frame.h#include tree.hclass frametree myTree;public :frame();void view(); /显示主界面void Login(); /

18、登录界面void test In sert(); / 插入一个节点void printTree(); / 画岀一棵树;Node.cpp#include node.h void userNode:setName( const string &name)this -name=name;void userNode:setPassword( const string &password)this -password=password;stri ng userNode:getName()return n ame;stri ng userNode:getPassword()return password;

19、int userNode:getHeight()return this =NULL?-1:height;void userNode:changeHeight( const int h)height=h;bool userNode:checkName( const string &name)if (this -name=name)return true ;else return false ;userNode:userNode( const string &name, const string &password)this -name=name;this -password=password;h

20、eight=O;left=NULL;right=NULL;userNode:userNode( const userNode & temp)this -name=temp.name;this -password=temp.password;height=0;left=NULL;right=NULL;Tree.cpp#include tree.h#in clude /构造函数tree:tree()root=NULL;void tree:insert_node(userNode &temp)in sert_ no de(root,temp);void tree:insert_node(userNo

21、de *&r,userNode &t)if (r=NULL)r=newuserNode(t); /若树为空,直接新建节点else if (r-getName()=t.getName() /若节点值相等,则用户名重复return ;stri ng ren ame;cout用?户名?vvt.getName()v 已?经-存?在,?请?修 T 改?getName()t.getName()in sert_ no de(r-left,t);if (r-left-getHeight()-r-right-getHeight()=2)rightBala nce(r);else if (r-getName()r

22、ight,t);if (r-right-getHeight()-r-left-getHeight()=2) leftBala nce(r);r-cha ngeHeight( max(r-left-getHeight(),r-right-getHeight()+1 );/ 移除void tree:remove(userNode *&r,userNode *&temp)if (r=NULL)return ;else if (temp-getName()getName()remove(r-left,temp);if (r-right-getHeight()-r-left-getHeight()=2)

23、 leftBala nce(r);else if (temp-getName()r-getName()remove(r-right,temp);if (r-left-getHeight()-r-right-getHeight()=2) rightBala nce(r);elseif (r-left=NULL)userNode *q=r;r=r-right;delete q;else if (r-right=NULL)userNode *q=r;r=r-left;delete q;else userNode *R;r=searchLeftMaxNode(r,R);remove(r-left,R)

24、;if (r-right-getHeight()-r-left-getHeight()=2) leftBala nce(r);if (r)r-cha ngeHeight(max(r-left-getHeight(),r-right-getHeight()+1);void tree:remove(userNode *&temp)remove(root,temp);void tree:print()pri nt(0,root);void tree:print( int index,userNode *r)if (r)prin t(i ndex+8,r-right);coutgetName()v (

25、 left-getHeight()-r-right-getHeight() )left);void tree:Print(ofstream &ofile,userNode *&r)if (r)Pri nt(ofile,r-left);ofilegetName() , getPassword()right);void tree:Print()userNode *p=root;ofstream ofile;ofile.ope n( user.txt );assert(ofile.is_ope n();Prin t(ofile,p);ofile.close();void tree:rotateL(u

26、serNode *&r)userNode *R=r-right;r-right=R-left;R-left=r;r-cha ngeHeight(max(r-left-getHeight(),r-right-getHeight()+1);R-cha ngeHeight(max(R-left-getHeight(),r-getHeight()+1);r=R;void tree:rotateR(userNode *&r)userNode *L=r-left;r-left=L-right;L_right=r;r-cha ngeHeight(max(r-left-getHeight(),r-right-

27、getHeight()+1);L-cha ngeHeight(max(L-left-getHeight(),r-getHeight()+1);r=L;void tree:rotateDoubleLR(userNode *&r)rotateL(r-left);rotateR(r);void tree:rotateDoubleRL(userNode *&r)rotateR(r-right);rotateL(r);void tree:rightBalance(userNode *&r)userNode *temp=r-left;if (temp-left-getHeight()-temp-right

28、-getHeight()=-1) rotateDoubleLR(r);else rotateR(r);void tree:leftBalance(userNode *&r)userNode *temp=r-right;if (temp-left-getHeight()-temp-right-getHeight()=1) rotateDoubleRL(r);else rotateL(r);userNode* tree:findNode(string s)userNode *r=root;while (r)if (s=r-getName()return r;else if (sgetName()r=r-left;else if (sr-getN

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1