用户登录系统

用户登录系统
用户登录系统

数据结构大型实验

2015/2016(1)

实验题目 用户登录系统

学生姓名 ____ 学生学号

主要工作 树的结构、框架编写 负责人 学生班级

任课教师 提交日期

2016.1.2

计算机科学与技术学院

用户登录系统

一.实验题目和要求:

【问题描述】

在登录服务器系统时,都需要验证用户名和密码,如telnet远程登录服务器。用户输入用户名和密码后,服务器程序会首先验证用户信息的合法性。由于用户信息的验证频率很高,系统有必要有效地组织这些用户信息,从而快速查找和验证用户。另外,系统也会经常会添加新用户、删除老用户和更新用户密码等操作,因此,系统必须采用动态结构,在添加、删除或更新后,依然能保证验证过程的快速。请采用相应的数据结构模拟用户登录系统,其功能要求包括用户登录、用户密码更新、用户添加和用户删除等。

【基本要求】

1.要求自己编程实现二叉树结构及其相关功能,以存储用户信息,不允许使用

标准模板类的二叉树结构和函数。同时要求根据二叉树的变化情况,进行相应的平衡操作,即AVL平衡树操作,四种平衡操作都必须考虑。测试时,各种情况都需要测试,并附上测试截图;

2.要求采用类的设计思路,不允许出现类以外的函数定义,但允许友元函数。

主函数中只能出现类的成员函数的调用,不允许出现对其它函数的调用。3.要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函

数main存储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和实现都放在.h文件中。

4.要求源程序中有相应注释;

5.不强制要求采用类模板,也不要求采用可视化窗口;

6.要求测试例子要比较详尽,各种极限情况也要考虑到,测试的输出信息要详

细易懂,表明各个功能的执行正确;

7.要求采用Visual C++ 6.0及以上版本进行调试;

二.设计思路:

1.系统总体设计:

采用平衡二叉查找树(AVL),以用户名(IP)作为比较的关键词进行插入。平衡二叉查找树是在二叉搜索树(BST)的基础上进行了优化,使得树基本达到平衡。定义内部类userNode来存储AVL树的节点信息。

2.系统功能设计:

要创建一颗包含用户名和用户密码的二叉树,要能适应频繁的查找,因为每个用户名是唯一的,将用户名(string类型)作为AVL树的比较参数,这样就可以实现快速的插入、删除和查找,重定义userNode类的比较函数。AVL树是用模板类实现的,这样就可以直接比较两个用户类,方便了很多。

图1 系统功能结构图

3.类的设计:

// 节点的类

class userNode

{

private:

string name;

string password;

short int height;

public:

userNode *left;

userNode *right;

userNode(const string &name,const string &password);

userNode(const userNode & temp);

void setName(const string &name);

void setPassword(const string &password);

string getName();

string getPassword();

int getHeight();

void changeHeight(const int height);//改变树的高度

bool checkName(const string &name);

};

// 树的类

class tree

{

private:

userNode *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();

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);//搜索一个节点

userNode *searchLeftMaxNode(userNode *&r,userNode *&R);

};

// 框架类

class frame

{

tree myTree;

public:

frame();

void view();//显示主界面

void Login();//登录界面

void testInsert();//插入一个节点

void printTree();//画出一棵树

};

4.主程序的设计:

图2 类的调用

三.调试分析:

1.技术难点分析:

(1)查询操作时,怎么能找到相应用户的节点?

考虑到用户名的唯一性,所以将用户名作为AVL树的关键词,以字符串来比较大小,进行排序,重定义userNode类的比较操作符,只比较IP,因此,在查询的时候,新建一个userNode的对象,其IP赋值为所要查询的IP,然后调用查找函数,可找到对应的点

(2)AVL树的实现

看书,上网查询。先了解二叉查找树(BST)的实现,二叉查找树(BST)是一种很好的数据结构,它的特点是,对其任一节点,都满足该节点的左子树的所有点的值都小于该节点,而右子树则是大于。我采用链表来实现它,创建关于节点的

一个类 Node ,内含描述该节点的值,及左右指针。我定义 insert_node() 函数来实现新节点的插入。AVL树相对于BST树,多了平衡两字,树都有高度,而AVL树就是要求每一个节点的左子树和右子树的高度差不超过1,这样就能使其尽可能的减小整棵树的高度,使时间复杂度能稳定在O(logN), 但我们不可能去约束用户的输入,因此,引入了四种旋转:

图3 右旋

图4 左旋

图5 先右旋再左旋

图6 先左旋再右旋(3)修改密码或删除用户后如何返回上一界面?经反复修改,未果,遂放弃。

2.调试错误分析:

(1)登陆时密码要正确。

图7 用户登录界面(2)登陆时用户要存在

图8 用户不存在界面(3)新建用户名不能已存在

图9 用户名已存在界面

四、测试结果分析:

1)主界面

图10 主界面

2)登录界面

图11 登录界面3)注册界面

图12 注册界面4)树图

图13 树形图界面5)修改密码

图14 修改密码6)删除用户

图15 删除用户界面

五、附录:

Node.h

#include

#include

#include

#include

#include

using namespace std;

class userNode

{

private:

string name;

string password;

short int height;

public:

userNode *left;

userNode *right;

userNode(const string &name,const string &password);

userNode(const userNode & temp);

void setName(const string &name);

void setPassword(const string &password);

string getName();

string getPassword();

int getHeight();

void changeHeight(const int height);//改变树的高度

bool checkName(const string &name);

};

Tree.h

#include"node.h"

#include

class tree

{

private:

userNode *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();

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);//搜索一个节点

userNode *searchLeftMaxNode(userNode *&r,userNode *&R); };

Frame.h

#include"tree.h"

class frame

{

tree myTree;

public:

frame();

void view();//显示主界面

void Login();//登录界面

void testInsert();//插入一个节点

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;

}

string userNode::getName()

{

return name;

}

string userNode::getPassword()

{

return password;

}

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;

height=0;

left=NULL;

right=NULL;

}

userNode::userNode(const userNode & temp)

{

this->name=https://www.360docs.net/doc/e4893293.html,;

this->password=temp.password;

height=0;

left=NULL;

right=NULL;

}

Tree.cpp

#include"tree.h"

#include

//构造函数

tree::tree()

{

root=NULL;

}

void tree::insert_node(userNode &temp)

{

insert_node(root,temp);

}

void tree::insert_node(userNode *&r,userNode &t)

{

if(r==NULL)

{

r=new userNode(t);//若树为空,直接新建节点

}

else if(r->getName()==t.getName())//若节点值相等,则用户名重复

{

return;

string rename;

cout<<"用?户§名?"<

cin>>rename;

t.setName(rename);

insert_node(r,t);

}

else if(r->getName()>t.getName())

{

insert_node(r->left,t);

if(r->left->getHeight()-r->right->getHeight()==2)

{

rightBalance(r);

}

}

else if(r->getName()

{

insert_node(r->right,t);

if(r->right->getHeight()-r->left->getHeight()==2)

{

leftBalance(r);

}

}

r->changeHeight( 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)

leftBalance(r);

}

else if(temp->getName()>r->getName())

{

remove(r->right,temp);

if(r->left->getHeight()-r->right->getHeight()==2)

rightBalance(r);

}

else

{

if(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);

if(r->right->getHeight()-r->left->getHeight()==2)

leftBalance(r);

}

}

if(r)

r->changeHeight(max(r->left->getHeight(),r->right->getHeight())+1);

}

void tree::remove(userNode *&temp)

{

remove(root,temp);

void tree::print()

{

print(0,root);

}

void tree::print(int index,userNode *r)

{

if(r)

{

print(index+8,r->right);

cout<getName()<<"("<left->getHeight()-r->right->getHeight()<<" )"<

print(index+8,r->left);

}

}

void tree::Print(ofstream &ofile,userNode *&r)

{

if(r)

{

Print(ofile,r->left);

ofile<getName()<<","<getPassword()<<'\n';

Print(ofile,r->right);

}

}

void tree::Print()

{

userNode *p=root;

ofstream ofile;

ofile.open("user.txt");

assert(ofile.is_open());

Print(ofile,p);

ofile.close();

}

void tree::rotateL(userNode *&r)

{

userNode *R=r->right;

r->right=R->left;

R->left=r;

r->changeHeight(max(r->left->getHeight(),r->right->getHeight())+1);

R->changeHeight(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->changeHeight(max(r->left->getHeight(),r->right->getHeight())+1);

L->changeHeight(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->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(s>r->getName())

r=r->right;

}

return NULL;

}

userNode*tree::searchLeftMaxNode(userNode *&r,userNode *&R) {

bool Left=false,Right=true;

userNode *q=NULL;

R=r;

if(r->left->left==NULL&&r->left->right==NULL)

{

q=r;

r=r->left;

q->left=NULL;

r->left=q;

r->right=q->right;

q->right=NULL;

R=q;

}

else{

if(r->left)

r=r->left;

while(r->right)

{

if(r->right->right==NULL)

q=r;

r=r->right;

Right=false;

}

if(Right)

{

if(r->left)

{

q=r;

r=r->left;

用户登录系统的密码代码

#include #include #include #include #include typedef struct p { char name[20]; char secret[20]; struct p*next; }pass; //保存密码模块 void save(pass*load) { FILE *fp; fp=fopen("c:\\password.txt","wt"); if(fp==NULL) { printf("写文件错误,任意键退出!\n"); exit(1); } fprintf(fp,"%s %s\n",load->name,load->secret); printf("文件保存成功!按任意键返回\n"); fclose(fp); } //读入信息模块 pass* read() { FILE*fp; pass *head,*p,*q,*r; head=(pass *)malloc(sizeof(pass)); p=head; fp=fopen("c:\\password.txt","rt"); if(fp==NULL) { printf("文件不存在!任意键新建\n"); } while(!feof(fp)) { q=(pass *)malloc(sizeof(pass)); fscanf(fp,"%s %s",q->name,q->secret); p->next=q; r=p; p=q; } r->next=NULL; return head; fclose(fp); } //追加保存新用户信息 void addpass(pass *load) { FILE *fp; fp=fopen("c:\\password.txt","a+"); if(fp==NULL)

用户登陆界面程序vb设计说明书

工程学院 课程设计说明书 课程名称: 计算机应用基础课程设计 课程代码: 题目: 用户登录界面程序设计 年级/专业/班: 学生姓名: 学号: 开始时间: 2011 年 4 月25 日 完成时间: 2011 年 5 月 8 日 课程设计成绩: 指导教师签名:年月日 目录 摘要 (2) 1 引言 (3)

2 设计方案 (4) 2.1程序功能设计 (4) 2.1.1系功能描述 (5) 2.1.2系结构分析 (5) 2.1.3系统流程分析 (5) 2.2程序界面和代码设计 (7) 2.2.1系统工程设计框架 (7) 2.2.2系统各界面设计及代码设计 (7) 3 结果分析 (11) 结论 (14) 致谢 (15) 参考文献 (16)

摘要 随着计算机的普及,计算机高级语言已经运用到生活中的各个方面,本次课程设计使用VB语言作为开发工具,进行了用户登录系统的程序设计,该程序能实现用户登录系统的模拟功能,进行用户的登录,提醒,注册,退出等操作,这些操作都能模拟实际生活中的登录情况,最后分析所开发软件系统的优点和不足。该运行界面清晰实用,操作方便。 关键词:用户登录模拟操作界面

1 引言 随着科学技术的发展,计算机已经应用到生活、工作的各个方面。VB一种可视化的、面向对象和采用事件驱动方式的高级程序设计语言,可用于开发Windows环境下的各类应用程序。本次课程设计主要内容就是使用VB编制简单、实用的小程序,以巩固我们所学的计算机VB语言知识,提高分析问题和解决问题的能力,锻炼我们独立动手的能力以及综合创新能力。 1.1 选题背景 通过一个学期对Visual Basic 高级语言程序设计的学习,我已经掌握了一些常用的控件的使用方法,对简单的程序设计的常用算法也有了一定的了解,还掌握了对文件输入与输出的一些基本操作。为了进一步加深理解、验证、巩固课堂教学内容,加深对可视化编程思想的理解,强化Visual Basic对程序流程控制、常用控件的属性、事件、方法的理解和使用;为了进一步提高编程能力、程序的调试能力,理论联系实际的能力;巩固所学的这些程序设计的方法,为了达到后续课程对实际编程计算能力的要求,特选定“用户登录界面程序设计”题目作为课程设计实践教学环节的题目,有助于培养综合运用所学知识解决实际问题的能力,可以充分发挥想象力和创新能力;有助于提高独立思考能力,自学能力 1.2任务与分析 任务:设计一用户的登录窗口界面,实现模拟用户登录系统时的各种情况 具体要求:遵循面向对象和结构化程序设计的编程思路,设计合理的界面,设置所需控件及其属性,编写相应的事件过程,并上机调试程序,在基本要求达到后,进行一定创新设计 预期功能:实现用户成功登录系统,当用户明不正确或者密码错误时,提醒用户重新输入或者注册,当三次登录失败时,强制性退出操作界面。 涉及的VB知识点:界面设计,command控件、text控件及其属性,随机的读出于追加。

用户管理系统设计

用户管理系统设计 指导老师:崔老师 组长:罗文文 组员:黄丽徐丽安华林雷微微

目录 一、 -------------------------------------------------------概述 1.----------------------------------------------------- - 项目名称 2.----------------------------------------------------- - 功能概述 3.----------------------------------------------------- - 开发环境及框架 4.----------------------------------------------------- - 用户环境 二、--------------------------------------------------- ----项目框架优点 1.----------------------------------------------------- - springmvc介绍 2.----------------------------------------------------- - easyUI介绍 3.----------------------------------------------------- - jquery介绍

4.----------------------------------------------------- - hibernate介绍 三、--------------------------------------------------- ----项目需求分析 四、--------------------------------------------------- ----流程介绍 五、--------------------------------------------------- ----数据库信息设计 六、--------------------------------------------------- ----功能模块介绍 七、--------------------------------------------------- ----项目具体实现 八、--------------------------------------------------- ----总结 一:概述 1.项目名称 用户信息管理系统 2.功能概述 用户管理系统主要是用于公司方便来管理人员的,本系统主要是对用户个人信息的管理,包

基于LABVIEW的用户登录界面设计

基于LABVIEW的用户登录界面设计 Labview具有功能强大的数学工具,用在传感器设计上可大大降低软件的设计负担。对于一个实际的传感器使用,其用户数量有限,其登陆界面设计可以完全借助其数组函数与数据记录文件完成,而不就是数据库,这样既减轻了系统的重量,也减轻了系统的负荷。没有牵涉第三方的软件,系统的稳定性也大大提高。本文设计了一个简单的用户登录系统的2个模块,希望能对读者有所启发。 1)用户初始文件的建立 Labview的数据记录文件具有较强的功能,并且不能用写字本打开,因此作为一般的保密级别可以用来存储初程序运行环境数据,本文用来存储登陆系统的用户数据。 本程序采用两个套嵌while循环,用于批量产生用户名单,内While

采用三个文本输入框,分别输入用户姓名、用户初始密码、用户权限等内容,并用系统时间空间获取用户建立时间,通过数组创建函数创建成一维数组,点击确定键完成一个用户的建立,可以继续进行下一个用户的建立(当然您也可以只建立一个超级用户,在超级用户登陆后继续建立用户名单),用户建立完毕点击停止按钮完成用户名单建立,形成一个二维数组,由于点击停止键时,最后一个用户名单会重复建立,故采用数组删除函数去掉最后一行,然后创建一个文件,用数据记录函数将该名单存储在您希望的文件夹内(本例放在桌面上,面板上的数组就是为验证程序而建立的,可以去掉)。 2)登陆界面 登陆面板实际上只有两个文本输入控件:用户名与密码。程序首先将记录文件读入内存,让后将第一列(索引0列)的所有用户列出来,用一维数组搜索函数搜索该用户密码所在的行号,再用该行号将该用户的信息从记录文件索引出来。由于密码放在第二列(1列),直接从用户的记录信息索引第第二列(索引1列)取出该用户密码),直接用文本比较“等于”函数进行比较用户输入的密码就是否与其预设的密码一致。 至于修改用户名单、用户权限等内容可用“数组的删除、插入”

实训四__设计用户系统的注册及登录

实训四设计用户系统的注册及登录 一、实训目的 1.能正确设计用户注册程序。 2.能正确设计用户登录程序。 3.能正确设计用户的管理程序。 二、工作任务 任务1:将静态注册页面转换成动态ASP文件页面,设置表单对象。 任务2:为网页设置引用文件。 任务3:为注册页面编程,实现对填写的注册信息进行判断的功能,并将注册信息写入数据库。 任务4:为登录页面编程,实现登录功能,并出现欢迎用户登录的界面。 三、实训步骤 (一)编程实现用户注册功能 首先创建注册界面 图1注册界面 任务1操作方法: 1)用dreamweaver打开前面我们所创建的动态网站,将项目三中所设计的静态注册页面reguser.html复制一份并改名为reguser.asp,其中注册部分页面如图2如所。

图2注册界面 3)选择标签

,将其属性按图3修改,将表单名称命名为fom1,动作右侧的文本框中输入reguser.asp?act=reg,其含义为此表单提交到本页处理,并附加参数act=reg,此参数含义为表单填写完成后提交表单进行注册的参数传递,方法右侧的列表中选择post,其它方面可以忽略。 图3表单属性 4)依照表1修改各个表单元素的名称,以方便程序的编写。 表1注册表单中各表单元素的名称 文本名称表单元素名称文本名称表单元素名称 用户名f_user固定电话f_tel1f_tel2 密码f_code手机号码f_mtel 姓名f_name其他联系f_contact 性别f_sex提交submit 详细地址f_addr 重置reset 设计思想: 当用户输入注册信息时,如果用户名或密码没有填写时系统出现提示信息“用户名或密码不能为空!”,并将重新注册; 如果用户名在数据库中已经存在通过判断语句系统会有弹出提示信息“用户名已经存在,请重新注册!”,本教材的其他信息并不要求必须输入,读者可以自己设计; 将用户信息写入到数据库的tbl_user表中保存,注册成功时会有弹出信息“注册成功!”,单击“确定”按钮将跳转到登录页面可供用户登录,如果注册失败弹出提示信息,并说明注册失败的原因。 任务2操作方法: 1)先创建一个数据库连接文件db.asp,代码: <% dim conn,dbpath set conn=Server.CreateObject("adodb.connection") DBPath = Server.MapPath("db/tygasp.mdb") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& DBPath %>

网络登陆系统的UML设计

龙源期刊网 https://www.360docs.net/doc/e4893293.html, 网络登陆系统的UML设计 作者:夏忠华张东亮 来源:《电脑知识与技术·学术交流》2008年第23期 摘要:该文介绍了网络登陆与普通系统登陆的功能区别,提出了实现网络登陆的实现解决措施,并通过UML对网络登陆系统进行建模,保证了系统的完善性和可靠性。 关键词:网络登陆;UML;系统建模 中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)23-954-02 UML Design for Network Login System XIA Zhong-hua, ZHANG Dong-liang (Qinghuangdao Institute of Technology, Qinhuangdao 066100, China) Abstract: This paper describes the functional difference between network login and general system login, put up measures to slove the network login, and modeling the network login system by using UML to ensure that the system's integrity and reliability. Key words: network login; UML; system modeling 1 引言 随着互联网络的高速发展,各种网站或网络系统软件开始提供了多种内容的服务,这些服务可能是从各个不同的内容提供商手中获得。这种日益增长的需求,促进了网络登陆系统的发展[1]。 本文所指的网络登陆系统[2]是指通过登陆认证系统,访问不同的内容业务系统。 统一建模语言[3]UML(Unified Modeling Language,简称UML)是OMG组织确定的面向对象的标准建模语言,它是一种可视化的建模语言, UML使用面向对象的概念来分析、描述软件系统并构造系统模型,是一种在建模领域中得到普遍认可的优秀软件工程方法。因此,此文用UML来对网络登陆系统进行建模。

经典登录界面制作

经典登录界面制作 声明本登录使用jsp编写,可在MyEclipse8.5等软件中执行 1.登录界面图: 2.登录代码 Login.jsp <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="fmt" uri="https://www.360docs.net/doc/e4893293.html,/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="https://www.360docs.net/doc/e4893293.html,/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>