用户登录系统的模拟C++
- 格式:doc
- 大小:75.00 KB
- 文档页数:16
目录第一部分:模拟题 (2)第二部分:模拟题答案 (19)第一部分:模拟题101.审计报告中包含实质性发现的最终结论应该由谁做出?A.审计委员会B.审计经理C.信息系统审计师D.组织的CEO102.在一次全球服务供应商的审计过程中,审计师发现这个公司为了便于全球客户报告以及跟踪他们的问题,已经配置了通过互联网访问服务台应用程序,客户可以在每个分支机构通过一个客户ID进行SSL连接,他们的访问权限仅限于创建和查询他们的服务请求,未要求定期的密码变更,并且合作伙伴提供的应用程序也不会进行安全检查。
审计师应提哪些建议?A.应要求定期的密码变更B.所有用户都应分配单独的IDC.没有变更是必须的,应用程序已足够安全D.应用程序应该脱离互联网103.信息系统审计师报告由于一些敏感表格都进行了审计记录,因此ERP的财务模块程序非常慢,供应商关闭了这些表格的审计记录功能,仅对成功和不成功的登录系统日志进行记录,这种情况最大的威胁是什么?A.可能无法保证财务数据的完整性B.可能无法保证系统日志的完整性C.无法记录访问关键数据的日志D.欺诈可能发生104.为了达到组织的灾难恢复标准,备份中断不能超过:A.服务水平目标B.恢复时间目标C.恢复点目标D.最大可接受供电中断105.在一个小型制造业企业,一个IT员工在做制造工作同时兼任程序开发员,针对以上情景请选择最优的降低风险的控制措施?A.限制访问,以防止员工访问生产环境B.通过雇佣新员工实现职责分离C.自动记录所有在生产环境中的变更D.对已经被批准执行过的程序变更进行核查106.一个审计师观察到,在供应商的建议下,IT部门为组织的生产系统更新了补丁,审计师应该最关注的是IT部门未考虑到:A.更新补丁后对用户的培训B.为生产系统打补丁的好处C.测试补丁的影响后才能打补丁D.最终用户对新补丁提供的建议107.以下哪项是有效的灾难恢复计划最关键的因素?A.数据的异地备份B.关键灾备恢复清单的更新C.数据备份中心的可用性D.清晰定义恢复时间目标(RTO)108.一个审计师正在审计一个使用敏捷软件开发方法的项目,以下哪项是审计师期望发现的?A.基于过程的成熟度模型的使用,如能力成熟度模型(CMM)B.基于时间表对于任务级别进展的监控C.软件开发工具的使用来最大化团队的生产率D.通过反复评审来识别未来项目可能用到的课程109.一个金融机构正在建立并将业务连续性措施文档化,以下哪项审计师会认为是一个问题?A.这家机构使用了最佳实践指南代替了行业标准并且得到外部顾问的帮助以确保方法论的充分性B.业务连续性能力包括了一些精心挑选的比较合理的可能发生的应急场景C.RTO没有考虑IT灾难恢复的限制,如恢复期间人员和系统的相关性D.机构打算租用一个临时应急场所,但该场所仅可提供正常员工一半数量的占用空间110.审计师正在为客户制定审计计划,他看了去年的审计计划发现该计划用于去年着重检查公司网络和邮件系统,但计划未包括电子商务服务器,公司IT 经理暗示今年公司审计重点应是一个新上线的ERP系统,审计师该如何做?A.按IT经理要求审计新的ERP系统B.这次应审计去年未审计电子商务服务器C.在对高风险系统进行评估的基础上制定审计计划D.两个系统都审计111.为了优化组织的业务连续性计划,审计师建议进行业务影响性分析是为了决定:A.对组织产生最大经济价值的业务流程,应该首先恢复B.恢复的优先级和顺序来确保与组织业务目标的一致性C.从灾难中恢复的业务流程必须确保组织的生存D.在最短时间恢复最多系统的优先级和顺序112.恢复策略的选择最可能依靠:A.设备和系统的恢复成本B.恢复场地的可用性C.业务流程的关键性D.事件响应流程113.审计师在审核组织的数据库安全时,以下哪项是关于数据库加固最应关注的方面?A.默认配置被修订B.所有数据库中的表格被统一化C.存储的步骤和触发器被加密D.数据库服务器端口被变更114.在审核入侵检测日志时,审计师注意到来自互联网的流量,流量显示这些IP 地址好像来自公司内部薪资服务器,以下哪种危险行为可能导致这种情况?A.DOS攻击B.欺骗C.端口扫描D.中间人攻击115.审计师在审核健康组织在两种应用环境下的开发过程—生产和测试。
系统吞吐量(TPS)、⽤户并发量、性能测试概念和公式⼀.系统吞度量要素:⼀个系统的吞度量(承压能⼒)与request对CPU的消耗、外部接⼝、IO等等紧密关联。
单个reqeust 对CPU消耗越⾼,外部系统接⼝、IO影响速度越慢,系统吞吐能⼒越低,反之越⾼。
系统吞吐量⼏个重要参数:QPS(TPS)、并发数、响应时间QPS(TPS):每秒钟request/事务数量并发数:系统同时处理的request/事务数响应时间:⼀般取平均响应时间(很多⼈经常会把并发数和TPS理解混淆)理解了上⾯三个要素的意义之后,就能推算出它们之间的关系:QPS(TPS)= 并发数/平均响应时间⼀个系统吞吐量通常由QPS(TPS)、并发数两个因素决定,每套系统这两个值都有⼀个相对极限值,在应⽤场景访问压⼒下,只要某⼀项达到系统最⾼值,系统的吞吐量就上不去了,如果压⼒继续增⼤,系统的吞吐量反⽽会下降,原因是系统超负荷⼯作,上下⽂切换、内存等等其它消耗导致系统性能下降。
决定系统响应时间要素我们做项⽬要排计划,可以多⼈同时并发做多项任务,也可以⼀个⼈或者多个⼈串⾏⼯作,始终会有⼀条关键路径,这条路径就是项⽬的⼯期。
系统⼀次调⽤的响应时间跟项⽬计划⼀样,也有⼀条关键路径,这个关键路径是就是系统影响时间;关键路径是有CPU运算、IO、外部系统响应等等组成。
⼆.系统吞吐量评估:我们在做系统设计的时候就需要考虑CPU运算、IO、外部系统响应因素造成的影响以及对系统性能的初步预估。
⽽通常境况下,我们⾯对需求,我们评估出来的出来QPS、并发数之外,还有另外⼀个维度:⽇PV。
通过观察系统的访问⽇志发现,在⽤户量很⼤的情况下,各个时间周期内的同⼀时间段的访问流量⼏乎⼀样。
⽐如⼯作⽇的每天早上。
只要能拿到⽇流量图和QPS我们就可以推算⽇流量。
通常的技术⽅法:1. 找出系统的最⾼TPS和⽇PV,这两个要素有相对⽐较稳定的关系(除了放假、季节性因素影响之外)2. 通过压⼒测试或者经验预估,得出最⾼TPS,然后跟进1的关系,计算出系统最⾼的⽇吞吐量。
信息安全等级测评师考试一、判断题(10×1=10分)1、路由器仅可以对某个端口的访问情况进行屏蔽。
(×)2、三级信息系统应采取双因子认证对管理用户身份进行鉴别。
(√)3、ARP地址欺骗分为对网络设备ARP表的欺骗和对内网PC的网关欺骗(√)4、在windows系统中,重要目录不对everyone用户开放。
(√)5、一个企事业单位的不同vlan之间可直接进行通信,和外网则不可以(×)6、三级系统的配置文件权限值不能大于644,可执行文件不能大于755(√)7、病毒、木马、蠕虫都属于恶意代码。
(√)8、三级系统的鉴别信息要求至少8位,并有复杂度要求。
(×)9、网络设备的某条不合格,则此项标准可直接判断为不合格。
(×)10、三级系统应避免将重要网段部署在网络边界处且直接连接外部系统(×)二、单项选择题(15×2=30分)1、假如你向一台远程主机发送特定的数据包,却不想远程主机响应你的数据包。
这时你使用哪一种类型的进攻手段?( B )A、缓冲区溢出B、地址欺骗C、拒绝服务D、暴力攻击2、你有一个共享文件夹,你将它的NTFS权限设置为sam用户可以修改,共享权限设置为sam用户可以读取,当sam从网络访问这个共享文件夹的时候,他有什么样的权限?( A )A、读取B、写入C、修改D、完全控制3、入侵检测系统在进行信号分析时,一般通过三种常用的技术手段,以下哪一种不属于通常的三种技术手段:( D )A.模式匹配 B.统计分析C.完整性分析 D.密文分析4、攻击是指借助于客户机/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DoS攻击,从而成倍地提高拒绝服务攻击的威力。
( C )A.缓冲区溢出攻击 B.拒绝服务C.分布式拒绝服务 D.口令攻击5、信息安全需求不包括。
( D )A.保密性、完整性B.可用性、可控性C.不可否认性D. 语义正确性6、下面属于被动攻击的手段是。
单选题1.Linux文件权限一共10位长度,分成四段,第三段表示的内容是___C_____。
A文件类型B文件所有者的权限C文件所有者所在组的权限D其他用户的权限2.有关GPL的描述错误的是___D______。
a)GPL和软件是否免费无关b)GPL主要是保证软件对所有用户来说是自由的c)GPL中文意思是通用公共许可证d)GPL是Linus Torvalds在开发Linux时提出的3.hdb表示:_____D_____A第二个IDE硬盘B第二个逻辑盘C第一个IDE硬盘的第二个分区D第二个主分区4./lost+found目录的功能是_____C______A存放系统启动时候存放内存映象B存放临时文件C系统故障时,存放那些“无家可归”的文件D存放系统配置文件5.Bourne Shell的程序名为:___A_____A.bashB.zshC.rcD.sh6.安装Linux系统必不可少的两个分区是:___A_____A/和swap B/boot和/C swap和/boot D/和home7.红旗Desktop5.0系统使用了_D____版本的内核。
A 2.2B 2.3C 2.4D 2.68.Linux系统中网络配置文件一般存放在__A___目录?A/etc B/root C/usr D/boot9.设置从光盘引导需要改变:___B_____A.Linux设置B.BIOS设置C.跳线D.重新分区10.搜索/目录下所有大于1M的文件,下列正确的是___D_____A find-size+1000k/B find/-size+1000C find-size/+1000kD find/-size+1000k11.内核不包括的子系统是____D____。
A进程管理系统B内存管理系统C I/O管理系统D硬件管理系统12.到达个人主目录的命令是:____B______A cd..B cd~C cdD cd.13.Linux当前目录用_A____表示。
1、办公自动化系统的案例分析针对某公司办公自动化(OA)系统的负载压力测试,采用专业的负载压力测试工具来执行测试。
系统采用Browse/Server架构,服务器是一台PC Server (4路2.7GHz 处理器,4GB内存),安装的平台软件包括Microsoft Internet Information Server 5.0,,SQLServer 2000。
使用2台笔记本电脑安装测试工具模拟客户端执行“登录”业务操作。
测试需求分别为以下两个:第一,测试系统分别在2M、4M网络带宽下,能够支持用户登录的最大并发用户数;第二,测试服务器的吞吐量(即:每秒可以处理的交易数),主要包括服务器CPU平均使用率达到85%时系统能够支持的最大吞吐量和服务器CPU平均使用率达到100%时系统能够支持的最大吞吐量。
本次性能测试的测试目标是:1)指标“响应时间”合理范围为0~5秒,可支持的最大并发用户数;2)评测系统的服务器资源是否合理,是否需要进行改进。
3)网络带宽是否使用合理。
经过测试需求分析,我们设计出两种场景2M网络和4M网络环境下进行模拟测试,其中选定登录业务进行测试,加压策略采取逐步加压的方式,测试工具采用LoadRunner。
测试结果如下:Case 1网络环境:2M带宽客户端性能测试结果:注:图中登录响应时间的纵坐标单位是0.1秒服务器资源使用结果:测试指标平均值CPU使用率78%Case 2网络环境:4M带宽客户端性能测试结果:测试指标平均值登录响应时间 4.795秒虚拟用户数N/A每秒处理完成登录的个数13.447交易/秒注:图中登录响应时间的纵坐标单位是0.1秒服务器资源使用结果:测试指标平均值CPU使用率98%结果分析:1)通过Case 1中的并发用户数和响应时间的监控图,发现登录响应时间随虚拟并发用户的增加而增长。
在50个虚拟并发用户的负载下,登录响应时间达到5秒(注:图形中响应时间指标的比例为10:1),当负载超过50个虚拟用户时,响应时间超过5秒或与5秒持平。
用户登陆系统 课程设计一、课程目标知识目标:1. 让学生掌握用户登录系统的基本原理,包括账户管理、密码加密和数据验证。
2. 使学生了解用户登录系统的安全性和隐私保护措施,以及相关的技术标准与法规。
3. 帮助学生理解用户登录系统在信息技术中的应用及其重要性。
技能目标:1. 培养学生运用编程语言或工具设计并实现一个简单的用户登录系统。
2. 提高学生分析并解决登录系统中可能出现的问题的能力,例如密码找回、账户锁定等。
3. 培养学生进行团队协作,共同完成项目任务,提高沟通与协调能力。
情感态度价值观目标:1. 激发学生对信息技术学科的兴趣,培养其探究精神和创新意识。
2. 培养学生尊重网络安全和用户隐私的意识,形成正确的网络道德观念。
3. 引导学生关注信息技术的发展趋势,认识到其在社会生活中的重要作用。
本课程针对年级特点,结合学生已掌握的信息技术知识,以实用性和操作性为核心,旨在提高学生的实践能力和创新意识。
课程目标具体、可衡量,便于教师进行教学设计和评估,同时激发学生的学习兴趣,培养其团队协作能力和网络道德观念。
二、教学内容1. 用户登录系统原理- 账户与密码的基础知识- 加密技术及其应用- 数据验证方法2. 用户登录系统设计- 系统需求分析- 系统设计流程- 编程语言或工具的选择与应用3. 用户登录系统实现- 数据库设计与实现- 登录模块编程实现- 安全性与隐私保护措施4. 用户登录系统测试与优化- 测试用例设计- 系统性能分析- 常见问题及解决方案5. 用户登录系统项目实践- 团队协作与分工- 项目进度管理与沟通- 成果展示与评价教学内容依据课程目标,紧密联系课本知识,注重科学性和系统性。
教学大纲明确,涵盖用户登录系统的原理、设计、实现、测试与优化等环节。
通过项目实践,使学生将所学知识应用于实际操作中,提高其信息技术素养和实际动手能力。
三、教学方法本课程采用多样化的教学方法,以激发学生学习兴趣和主动性,提高教学效果。
云计算HCIP模拟试题(含参考答案)一、单选题(共50题,每题1分,共50分)1、下列不属于动态磁盘的是?A、普通卷B、普通延迟置零卷C、精简卷D、差分卷正确答案:A2、在 FusionAccess 中,管理员可以为虚拟机桌面配置策略,且策略发布后将立即生效。
A、TB、F正确答案:B3、关于用户登录虚拟机的描述,下面不正确的是?A、用户虚拟机从城控制器同步信息,可以在用户登录时同步,也可以通过 AD 强制同步。
B、用户使用域账号登录桌面虚拟机时,WI 会向 AD 进行用户信息认证。
C、用户使用非域账号 VNC 登录桌面虚拟机时,系统会使用存储在虚拟机数据库中的帐号信息与用户提供的信息进行比对。
D、用户使用域账号登录到桌面虚拟机时,系统会使用存储在域控制器数据库中的帐号信息与用户提供的信息进行比对。
正确答案:C4、在 FusionCompute 中,以下关于端口组的描述,正确的是哪一项?A、从虚拟机发出的数据,通过端口组后会被打上 VLAN 标签B、属于不同端口组的虚拟机不能互相通信C、同一端口组可以跨多个 CNA 主机D、虚拟机一块网卡可以加入多个端口组正确答案:C5、以下关于 DRS 的描述。
正确的是哪一项?A、资源调度可以配置不同的衡量因素,如果使用内存复用,建议配置为根据 CPU 调度B、资调调度的分时阈值的设置建议在业务压力较大时设置为保守策略,在业务压力较小时设置为中等或激进策略C、资源调度的高级规则可以用来满足一些特殊需求。
例如两台虚拟机是主备关系时,可以将其配置为聚集策略,提升虚拟机之间的数据交互性能D、为使资源调度效果最好,建议同一集群下主机的 CPU、内存、网络、存储配置尽量相同,使虚拟机可以迁移到集群内的任一主机上正确答案:B6、在华为桌面云中,DHCP 的作用是?A、为桌面云的基础架构虚拟机分配 IP 地址、网关、DNS。
B、为每一个虚拟桌面提供域名解析功能。
C、为每一个虚拟桌面分配 IP 地址、网关、DNS。
系统管理考试模拟题一、单选题1当系统工作负载增加时,CPU 的 A.用户时间 B.系统时间C.空闲时间D.进程时间2、系统交换分区的类型代号为 ______________ A A.82B.83C.ObD.17 3、内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,通过启动一个用户 init 的方式,完成。
在这个过程中in it 进程的进程号 PID 为___________ B A.D.1005、在缺省情况下,使用ls -color 命令显示当前目录下的所有文件时,对于可执行文件一般 显示为 B A. 红 B.绿 C.黄D.蓝6、 我们将逻辑分区建立在 _____________ B 分区上 A. 从分区 B.扩展分区 C.主分区D.第二分区7、 命令fdisk /mbr 的作用是 _____________ B A.格式化主分区 B.删除安装在主分区的 LiLoC.备份安装在主分区的 LiLoD.安装LiLo 到主分区8、 命令” hdparm -g /dev/had ”的含义是: ___________ C A.删除设备hda B.改变设备hda C.显示had 设备的参数 D.检查had 设备9、一般情况下,系统启动过程4、通过修改文件 A./etc/mtabC ,可以设定开机时候自动安装的文件系统B./etc/fastbootC./etc/fstabD./etc/i netd.conf ___________ A 将占很大比重B.1C.2自动加载的文件系统信息是存放在 ____________ D文件中A. /usr/sbi n/cfdisk B./sb in /fdiskC./etc/mtabD./etc/fstab10、当程序正从键盘上读取标准输入时,如果希望终止输入,告诉系统已经输完了全部内容,可以键入_____________ CB.Ctrl+WD.Ctrl+V11、 执行ps 命令,有如下输出,如果需要终止 bash 的运行,需要采用的方法是: PID TTYTIME CMD 336 pts/1 00:00:00 logi n 337 pts/1 00:00:00 bash 356 pts/1 00:00:00 ps ________ CA. #kill bashB. #kill pts/1C. #kill 337D. #kill !33712、 假设用户guest 拥有文件test 的所有权,现在他希望设置该文件的权限使得该文件仅他 本人能读、写和执行该文件,如果他用 ls -al 查看设置好后的文件权限位,并将显示结果换算成形如XXX 的数字表达,结果是: ______________ CA. 566B. 666C. 700D. 77713、 root 文件系统一旦安装完毕, 内核将启动名为 —C ________ 的程序,这也是引导过程完成 后,内核运行的第一个程序。
用户登录系统的模拟【问题描述】在登录服务器系统时,都需要验证用户名和密码,如telnet远程登录服务器。
用户输入用户名和密码后,服务器程序会首先验证用户信息的合法性。
由于用户信息的验证频率很高,系统有必要有效地组织这些用户信息,从而快速查找和验证用户。
另外,系统也会经常会添加新用户、删除老用户和更新用户密码等操作,因此,系统必须采用动态结构,在添加、删除或更新后,依然能保证验证过程的快速。
请采用相应的数据结构模拟用户登录系统,其功能要求包括用户登录、用户密码更新、用户添加和用户删除等。
【基本要求】1.要求自己编程实现二叉树结构及其相关功能,以存储用户信息,不允许使用标准模板类的二叉树结构和函数。
同时要求根据二叉树的变化情况,进行相应的平衡操作,即A VL 平衡树操作,四种平衡操作都必须考虑。
测试时,各种情况都需要测试,并附上测试截图;2.要求采用类的设计思路,不允许出现类以外的函数定义,但允许友元函数。
主函数中只能出现类的成员函数的调用,不允许出现对其它函数的调用。
3.要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函数main存储在另外一个单独的cpp文件中。
如果采用类模板,则类的声明和实现都放在.h文件中。
4.不强制要求采用类模板,也不要求采用可视化窗口;要求源程序中有相应注释;5.要求测试例子要比较详尽,各种极限情况也要考虑到,测试的输出信息要详细易懂,表明各个功能的执行正确;6.要求采用Visual C++ 6.0及以上版本进行调试;【实现提示】1.用户信息(即用户名和密码)可以存储在文件中,当程序启动时,从文件中读取所有的用户信息,并建立合适的查找二叉树;2.验证过程时,需要根据登录的用户名,检索整个二叉树,找到匹配的用户名,进行验证;更新用户密码时,也需要检索二叉树,找到匹配项后进行更新,同时更新文件中存储的用户密码。
3.添加用户时,不仅需要在文件中添加,也需要在二叉树中添加相应的节点;删除用户时,也是如此;仅供参考目录Node.h (3)Tree.h (4)Tree.cpp (5)tree::~tree(void) (5)int tree::depth(node *t) (6)void tree::add(){ (6)void tree::delete_user(){ (7)void tree::newpassword(){ (7)void tree::login(){ (8)void tree::travelsee(node *p){ (8)void tree::insert(int n, string p) (9)void tree::deleteNode(node *t){ (9)//该节点无子节点 (9)//该节点只有左节点 (10)//该节点只有右节点 (10)//该节点有两个子节点 (11)//平衡 (11)void tree::LL(node *B) //B为中间节点 (12)void tree::RR(node *B) (13)void tree::LR(node *C)//最下面一个节点 (13)void tree::RL(node *C) (14)void tree::balance(node *C){ (14)Main.cpp (15)Data.txt (16)Node.h#ifndef NODE#define NODE#include <iostream>#include <string>using namespace std;class node{public:node(int n = NULL, string p = NULL, node *l = NULL, node *r = NULL, node *pa =NULL):name(n),password(p),left(l),right(r),parent(pa){}node *left;node *right;node *parent;int balancefactor;int getName(){return name;}string getpassword(){return password;}void setpassword(string s){password = s;}private:int name;string password;};#endifTree.h#include "node.h"#include <fstream>#include <iomanip>#include <queue>using namespace std;class tree{public:tree():root(NULL),treeSize(0){}~tree();//将树中信息写入文件void add();//添加用户void delete_user();//删除用户void newpassword();//更改密码void login();//登录void insert(int n,string p);//插入int depth(node *t);//高度void deleteNode(node *t);//删除节点void LL(node* t);//左旋void RR(node* t);//右旋void LR(node* t);//左-右旋void RL(node* t);//右-左旋void balance(node *t);//进行平衡void travelsee(node *t);//中序遍历入队列int len(node* t){int i = 0;while(t!=root){t = t->parent;i += 4;}return i;}void release(node* t){//释放if(t!=NULL){release(t->left);release(t->right);delete t;}}private:node *root;int treeSize;queue<int> q1;queue<string> q2;};Tree.cpp#include "tree.h"tree::~tree(void){ofstream f("data.txt",ios::out);node *p = root;if(treeSize)while(p->right)p = p->right;else return;int i = p->getName();travelsee(root);while(!q1.empty()){if(q1.front() == i)f << q1.front() << ' ' << q2.front();elsef << q1.front() << ' ' << q2.front() << endl;q1.pop();q2.pop();}f.close();release(root);system("pause");}int tree::depth(node *t){int leftdepth, rightdepth, valdepth;if(t == NULL)valdepth = -1;else{leftdepth = depth(t->left);rightdepth = depth(t->right);valdepth = 1 + (leftdepth > rightdepth ? leftdepth : rightdepth);}return valdepth;}void tree::add(){string t;if(!treeSize){cout << "分配的账号为:1" << endl;cout << "请输入密码:";cin >> t;insert(1,t);cout << endl;cout << "添加成功" << endl;return;}int i;node *p = root;while(p->right){p = p->right;}i = p->getName();i++;cout << "分配的账号为:" << i << endl;cout << "请输入密码:";cin >> t;insert(i,t);cout << endl;cout << "添加成功" << endl;}void tree::delete_user(){int i;string t;cout << "输入要删除的账号:";cin >> i;node *p = root;while(p){if(p->getName() == i) {cout << "输入密码:";cin >> t;if(t == p->getpassword()){deleteNode(p);cout << "已删除" << endl;}else cout << "密码错误" << endl;return;}else if(i > p->getName())p = p->right;else p = p->left;}cout << "未找到该用户" << endl;}void tree::newpassword(){string t;int i;cout << "输入要修改密码的账号:";cin >> i;node *p = root;while(p){if(p->getName() == i) {cout << "输入原密码:";cin >> t;if(t == p->getpassword()){cout << "输入新密码:";cin >> t;p->setpassword(t);cout << "修改成功" << endl;}else cout << "原密码错误" << endl;return;}else if(i > p->getName())p = p->right;else p = p->left;}cout << "未找到该用户" << endl;}void tree::login(){int i;string t;cout << "账号:";cin >> i;node *p = root;while(p){if(p->getName() == i) {cout << "密码:";cin >> t;if(t == p->getpassword())cout << "登录成功" << endl;elsecout << "登录失败" << endl;return;}else if(i > p->getName())p = p->right;else p = p->left;}cout << "未找到该用户" << endl;}void tree::travelsee(node *p){if(p->left) travelsee(p->left);cout << setw(len(p)) << " " << p->getName() << endl;q1.push(p->getName());q2.push(p->getpassword());if(p->right) travelsee(p->right);}void tree::insert(int n, string p){//插入节点node *t = root, *t1;if(!treeSize)root = new node(n,p,NULL,NULL,NULL);else{while(t){t1 = t;if(n == t->getName()){cout << "已存在此账号" << endl; return;}else if(n > t->getName())t = t->right;else if(n < t->getName())t = t->left;}if(n > t1->getName())t = t1->right = new node(n,p,NULL,NULL,t1);else if(n < t1->getName())t = t1->left = new node(n,p,NULL,NULL,t1);}treeSize++;balance(t);}void tree::deleteNode(node *t){//该节点无子节点node *t1 = t;bool flag = false;if(t == root) flag = true;if(!t->left && !t->right){t1 = t->parent;if(!t->parent) delete root;else if(t == t->parent->right){t->parent->right = NULL;}else if(t == t->parent->left){t->parent->left = NULL;}delete t;treeSize--;}//该节点只有左节点else if(t->left && !t->right){if(t == t->parent->right){t->parent->right = t->left;t->left->parent = t->parent;t1 = t->parent->right;}else if(t == t->parent->left){t->parent->left = t->left;t->left->parent = t->parent;t1 = t->parent->left;}delete t;treeSize--;}//该节点只有右节点else if(!t->left && t->right){if(t == t->parent->right){t->parent->right = t->right;t->right->parent = t->parent;t1 = t->parent->right;}else if(t == t->parent->left){t->parent->left = t->right;t->right->parent = t->parent;t1 = t->parent->left;}delete t;treeSize--;}//该节点有两个子节点//取右子树最左节点替代else{t1 = t->right;while(t1->left)t1 = t1->left;if(!flag){if(t == t->parent->right )t->parent->right = t1;elset->parent->left = t1;}if(t1->getName() == t->right->getName()){t1->parent = t->parent;t->left->parent = t1;t1->left = t->left;}else{t1->parent->left = t1->right;if(t1->right)t1->right->parent = t1->parent;t1->parent = t->parent;t->left->parent = t1;t->right->parent = t1;t1->left = t->left;t1->right = t->right;}delete t;treeSize--;if(flag)root = t1;}//平衡while(t1){t1->balancefactor = depth(t1->right) - depth(t1->left);if(t1->balancefactor < 2 && t1->balancefactor > -2)break;else if(t1->balancefactor > 0){if(t1->balancefactor > 2)t1 = t1->right;else{t1 = t1->right;t1->balancefactor = depth(t1->right) - depth(t1->left);if(t1->balancefactor > 0)balance(t1->right);else balance(t1->left);break;}}else{if(t1->balancefactor < -2)t1 = t1->left;else{t1 = t1->left;t1->balancefactor = depth(t1->right) - depth(t1->left);if(t1->balancefactor > 0)balance(t1->right);else balance(t1->left);break;}}}}void tree::LL(node *B) //B为中间节点{node *A = B->parent;bool flag = false;if(A == root) flag = true;if(A->parent != NULL){if(A->parent->left == A)A->parent->left = B;elseA->parent->right = B;}B->parent = A->parent;A->parent = B;A->right = B->left;if(B->left)B->left->parent = A;B->left = A;if(flag) root = B;}void tree::RR(node *B){node *A = B->parent;bool flag = false;if(A == root) flag = true;if(A->parent != NULL){if(A->parent->left == A)A->parent->left = B;elseA->parent->right = B;}B->parent = A->parent;A->parent = B;A->left = B->right;if(B->right)B->right->parent = A;B->right = A;if(flag) root = B;}void tree::LR(node *C)//最下面一个节点{node *B = C->parent;if(B->parent->right == B)B->parent->right = C;elseB->parent->left = C;C->parent = B->parent;B->parent = C;B->right = C->left;C->left = B;RR(C);}void tree::RL(node *C){node *B = C->parent;if(B->parent->right == B)B->parent->right = C;elseB->parent->left = C;C->parent = B->parent;B->parent = C;B->left = C->right;C->right = B;LL(C);}void tree::balance(node *C){//C为新插入节点if(treeSize <= 2 || treeSize == 4)return;else if(treeSize == 3 && C->parent->parent == NULL)return;node *A = C->parent->parent, *B = C->parent;A->balancefactor = depth(A->right) - depth(A->left);if(A->balancefactor < 0) A->balancefactor = - A->balancefactor;if(A->balancefactor == 2){if(B == A->right){if(C == B->right) LL(B);else RL(C);}else {if(C == B->right) LR(C);else RR(B);}}while(A->balancefactor != 2 && A->parent){C = B;B = A;A = A->parent;A->balancefactor = depth(A->right) - depth(A->left);if(A->balancefactor < 0) A->balancefactor = - A->balancefactor;if(A->balancefactor == 2){if(B == A->right){if(C == B->right) LL(B);else RL(C);}else {if(C == B->right) LR(C);else RR(B);}continue;}}}Main.cpp#include <iostream>#include "tree.h"using namespace std;int main(){ifstream f("data.txt");tree *p = new tree();int i;string t;while(!f.eof()){f >> i >> t;if(i<0) break;p->insert(i,t);}f.close();while(1){cout << "用户登录模拟系统" << endl;cout << "1、登录" << endl;cout << "2、修改密码" << endl;cout << "3、删除账号" << endl;cout << "4、注册账号" << endl;cout << "0、退出" << endl;cout << "输入编号(非0退出操作失效):";cin >> i;switch(i){case 0:p->~tree(); return 0;case 1:system("cls");p->login(); cout << endl; continue;case 2:system("cls");p->newpassword(); cout << endl; continue;case 3:system("cls");p->delete_user(); cout << endl; continue;case 4:system("cls");p->add(); cout << endl; continue;}}system("pause");return 0;}Data.txt1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11 h12 h13 h14 h15 h。