精华内容
下载资源
问答
  • 北京交通大学 管理信息系统 第四章 测试答案 1.ERP系统的核心功能模块是( )。 A.BPR B.MIS C.MRPII D.CIMS 正确答案:C 2.闭环的MRP是在MRP的基础上发展起来的...4.以下不属于物联网关键技术的是:( ) A.移动通信 B
  • 由于篇幅有限,以下只是粗略介绍,能一一例出... 强大地区分类信息管理功能 可以非常灵活按城市、区域、街道发布信息,与筛选调用显示不同地域信息,很适合做全国分类信息系统。 强大城市管理功能 ...
  • 学生学籍管理信息系统

    热门讨论 2009-05-28 14:51:27
    本系统是基于C/S模式采用vb实现学生管理信息系统(Students Management Information System),以后简称SMIS。数据库服务器由access实现。操作系统:WINDOWS xp;数据库服务器端软件Microsoft Access2000 + SQL...
  • 1. 软件可行性研究一般考虑(1)。 A. 是否有足够人员和资金来支持系统开发 ...3. (3)属于软件详细设计阶段任务。 A. 算法设计 B. 功能设计 C. 调用关系设计 D. 输入/输出设计 4. 以下设施中,存取速度

    1. 软件可行性研究一般不考虑(1)。

    A. 是否有足够的人员和资金来支持系统开发

    B. 是否有足够的工具和相关的技术来支持系统开发

    C. 待开发软件是否有市场、经济上是否合算

    D. 待开发的软件是否会有质量问题

    2. 软件测试的目的是(2)。

    A. 评价软件的质量

    B. 发现软件的错误

    C. 找出软件的所有错误

    D. 证明软件是正确的

    3. (3)属于软件详细设计阶段的任务。

    A. 算法设计

    B. 功能设计

    C. 调用关系设计

    D. 输入/输出设计

    4. 以下设施中,存取速度较快的是(4)。

    A. 主存

    B. ache

    C. 寄存器

    D. 高速磁盘

    5. 计算机网络拓扑通过网中结点与通信线路之间的几何关系表示(5)。

    A. 网络结构

    B. 网络层次

    C. 网络协议

    D. 网络模型

    6. 建立计算机网络的主要目的是实现计算机资源的共享。计算机资源主要指计算机(6)。

    A. 软件与数据库

    B. 服务器、工作站与软件

    C. 硬件、软件与数据

    D. 通信子网与资源子网

    7. 在以下四个网址中,(7)不符合网址命名规则

    A. www.163.com

    B. www.nk.cn.edu

    C. www.863.org.cn

    D. www.tj.net.jp

    8. 在IE地址栏输入的 “http://www.sundxs.com/” 中,http 表示(8)。

    A. 协议

    B. 主机

    C. 地址

    D. 资源

    9. 下列关于UNIX的叙述中,(9)不正确。
    ①UNIX是一个单用户多任务操作系统
    ②UNIX支持很多文本编辑
    ③UNIX文件系统可以安装或卸载

    A. ①和②

    B. ③

    C. ②和③

    D. ①

    10. 应用层DNS协议主要用于实现(10)的网络服务功能。

    A. 网络设备名到IP地址的映射

    B. 网络硬件地址到IP地址的映射

    C. 进程地址到IP地址的映射

    D. 用户名到进程地址的映射

    11. 在Internet上用于收发电子邮件协议是(11)。

    A. TCP/IP

    B. IPX/SPX

    C. P0P3/SMTP

    D. NetBEUI

    12. 在IP协议中用来进行组播IP地址是(12)地址。

    A. A 类

    B. C 类

    C. D 类

    D. E 类

    13. 数据库数据挖掘、决策支持、电子设计自动化应用中,由于服务器处理的数据量都很大,因而常常需要安腾处理器。安腾处理器采用的创新技术是(13)。

    A. 复杂指令系统计算CISC

    B. 精简指令系统计算RISC

    C. 简明并行指令计算EPIC

    D. 复杂并行指令计算CPIC

    14. 路由器互联的多个局域网中,每个局域网的(14)。

    A. 数据链路层协议和物理层协议必须相同

    B. 数据链路层协议必须相同,而物理层协议可以不同

    C. 数据链路层协议可以不同,而物理层协议必须相同

    D. 数据链路层协议和物理层协议都可以不相同

    15. 关于信息插座与电源插座之间的间距描述中,正确的是(15)。

    A. 信息插座与电源插座的间距不小于10cm,安装信息插座与旁边的电源插座应保持20cm的距离

    B. 信息插座与电源插座的间距不小于20cm,安装信息插座与旁边的电源插座应保持30cm的距离

    C. 信息插座与电源插座的间距不小于30cm,安装信息插座与旁边的电源插座应保持40cm的距离

    D. 信息插座与电源插座的间距不小于40cm,安装信息插座与旁边的电源插座应保持50cm的距离

    16. VLAN在现代组网技术中占有重要地位,若一个局域网由多个VLAN组成,下列说法不正确的是(16)。

    A. 当站点从一个VLAN转移到另一个VLAN时,可以不改变物理连接

    B. VLAN中的一个站点可以和另一个VLAN中的站点直接通信

    C. 当站点在一个VLAN中广播时,其他VLAN中的站点不能收到

    D. VLAN可以通过MAC地址、交换机端口等进行定义

    17. 机房布置中,为便于操作,机柜和设备前面预留的空间不小于(17)。

    A. 1000mm

    B. 1500mm

    C. 1800mm

    D. 2000mm

    18. 32位计算机中的32是指该计算机(18))。

    A. 能同时处理32位二进制数

    B. 能同时处理32位十进制数

    C. 具有32根地址总线

    D. 运算精度可达小数点后32位

    19. (19)属于保证数据完整性

    A. 保证传送的数据信息不被第三方监视和窃取

    B. 保证数据信息在传输过程中不被篡改

    C. 保证电子商务交易各方身份的真实性

    D. 保证发送方不能抵赖曾经发送过某数据信息

    20. 双绞线的电气特性“NEXT”表示(20)。

    A. 衰减

    B. 衰减串扰比

    C. 近端串扰

    D. 远端串扰

    21. 需求分析开发人员应主要从用户那里了解(21)。

    A. 软件做什么

    B. 使用界面

    C. 输入的信息

    D. 软件的规模

    22. 下列说法错误的是(22)。

    A. 数据仓库具有时间相关性

    B. 数据仓库的数据是不稳定的

    C. 数据仓库是集成的

    D. 数据仓库是面向主题的

    23. 下述CMMI四个能力成熟度等级,级别最高的是(23)。

    A. 已定义级

    B. 优化级

    C. 可重复级

    D. 已管理级

    24. 软件配置项软件配置管理对象,指的是软件工程过程中所产生的(24)。

    A. 接口

    B. 软件环境

    C. 信息项

    D. 版本

    25. 质量体系是一种(25)。

    A. 体系结构

    B. 质量改进过程

    C. 管理手段

    D. 质量管理制度

    26. UML提供的图中,(26)用于描述系统与外部系统及用户之间的交互:(27)用于按时间顺序描述对象间的交互。

    A. 用例图

    B. 类图

    C. 对象图

    D. 部署图

    27. 在UML提供的图中,(26)用于描述系统与外部系统及用户之间的交互:(27)用于按时间顺序描述对象间的交互。

    A. 网络图

    B. 状态图

    C. 协作图

    D. 序列图

    28. (28)不是云计算的服务类型。

    A. SaaS

    B. IaaS

    C. PaaS

    D. NaaS

    29. 物联网.(The Internet of things)是:通过(29)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品与通信网连接起来,进行信息交换和通讯,以实现智能化识别、定位、跟踪、监控和管理的一种网络

    A. RFID

    B. GPRS

    C. IPv6

    D. MPLS

    30. 好的软件结构应该是(30) 。

    A. 高耦合、高内聚

    B. 低耦合、高内聚

    C. 高耦合、低内聚

    D. 低耦合、低内聚

    31. 如果有两个事务,同时对数据库中同一数据进行操作,不会引起冲突的操作是(31)。

    A.

    其中有一个是DELETE

     

    B. —个是SELECT,另一个是UPDATE

    C. 两个都是SELECT

    D. 两个都是UPDATE

    32. 下列选项中,影响软件可维护性最直接的因素是(32)。

    A. 文档

    B. 资金

    C. 程序代码

    D. MTTF

    33. 软件质量因素不包括(33)。

    A. 正确性

    B. 高性能

    C. 可测试性

    D. 可理解性

    34. 按照国家档案局和国家发展和改革委员会联合发布的《国家电子政务工程建设项目档案管理暂行办法》,档案保管期限分为永久、(34)三种:按照《国家重大建设项目文件归档要求与档案整理规范》,电子政务项目档案保管期限的长期是(35)年。

    A. 50 年、15 年

    B. 40 年、20 年

    C. 30 年、10 年

    D. 20 年、10 年

    35. 按照国家档案局和国家发展和改革委员会联合发布的《国家电子政务工程建设项目档案管理暂行办法》,档案保管期限分为永久、(34)三种:按照《国家重大建设项目文件归档要求与档案整理规范》,电子政务项目档案保管期限的长期是(35)年。

    A. 50

    B. 40

    C. 30

    D. 20

    36. 监理工程师进行隐蔽工程质暈验收的前提是(36),并对承建单位的《报验申请表》及相关资料进行审査。

    A. 承建单位已经自检

    B. 分包单位已经自检并合格

    C. 承建单位已经自检并合格

    D. 承建单位与分包单位已经共同检验

    37. 监理工程师在设备试运行过程的质量控制主要是(37)。

    A. 审核承建单位的试运行方案

    B. 检查承建单位的试运行结果

    C. 核查承建单位的试运行条件

    D. 监督承建单位的试运行步骤和内容

    38. (38)不是选择质量控制点的重点考虑因素。

    A. 关键工序

    B. 实施方法

    C. 隐蔽工程

    D. 实施中薄弱环节

    39. 监督检查承建单位的软件开发过程和管理是监理方质量控制的重要手段。根据国家标准GB 8566—2007《信息技术软件生存周期过程》的规定,软件生存周期基本过程的5个子过程分别是获取过程供应过程、开发过程、(39)和维护过程。

    A. 改进过程

    B. 运作过程

    C. 确认过程

    D. 验证过程

    40. 下列有关建立项监理机构的工作,应按照(40)顺序开展。
    ①确定各项监理工作,并分类、归并形成机构
    ②明确监理总目标并确定各项监理任务
    ③制定监理工作流
    ④建立监理组织结构图
    ⑤制定监理机构和人员的任务、工作、职能分工

    A. ①②③④⑤

    B. .④①③②⑤

    C. ②①④⑤③

    D. ④②⑤①③

    41. 监理工程师必须具备的条件有(41)。
    ①具有高级职称
    ②取得监理工程师培训证书
    ③通过信息系统监理师考试
    ④参加全国或地方信息监理协会
    ⑤取得主管部门颁发的《信息系统工程监理工程师证书》并从事监理工作。

    A. ①②③④⑤

    B. ③④⑤

    C. ③⑤

    D. ④⑤

    42. 设计阶段质量控制的主要方法是(42)。

    A. 监督设计人员计算、画图

    B. 设计质量跟踪

    C. 处理设计变更

    D. 协调各专业设计

    43. 质量控制中,系统地整理分析某个质量问题与其产生原因之间的关系可采用(43)。

    A. 排列图法

    B. 因果分析图法

    C. 直方图法

    D. 控制图法

    44. 总包单位依法将建设工程分包时,分包工程发生的质量问题,应(44)。

    A. 由总包单位负责

    B. 由总包单位与分包单位承担连带责任

    C. 由分包单位负责

    D. 由总包单位、分包单位、监理单位共同负责

    45. 隐蔽工程施工完毕,应由承建单位的(45),符合要求后,由承建单位通知监理工程师检査验收

    A. 专职质检员进行专检

    B. 作业技术人员进行自检

    C. 相关人员进行自检、互检、专检

    D. 专业技术人员检査

    46. 签订监理合同后,监理单位针对该工程的首要工作是(46)。

    A. 编制监理大纲

    B. 编制监理规划

    C. 编制监理实施细则

    D. 组建项目监理机构

    47. 下列因素对信息系统工程的质量产生负面影响相对较小的是(47)。

    A. 工程投资相对较高

    B. 项目经理工程经验较少

    C. 项目实施人员流动频繁

    D. 系统变更调整较为随意

    48. 以下表述中错误的是(48)。

    A. 监理单位编制监理大纲目的之一是承揽到监理工作

    B. 监理单位编制监理大纲目的之二是为今后开展监理工作制定基本的方案

    C. 监理实施细则的作用是指导本专业或本子项目具体监理业务的开展

    D. 监理大纲、监理规划、监理实施细则互相关联,必须齐全,缺一不可

    49. (49)是由总监理工稈师履行的职责。

    A. 署工程计量原始凭证

    B. 编制各专业的监理实施细则

    C. 负责合同争议调解

    D. 负责各专业监理资料的收集、汇总及整理

    50. 应用S曲线比较法时,通过比较实际进度S曲线和计划进度S曲线,可以(50)。

    A. 表明实际进度是否匀速开展

    B. 得到工程项目实际超额或拖欠的任务量

    C. 预测偏差对后续工作及工期的影响

    D. 表明对工作总时差的利用情况

    51. 下列关于可行性研究报告的表述中,正确的是(51)。

    A. 可行性研究报告是项目最终决策文件

    B. 可行性研究报告是项目初步决策文件

    C. 可行性研究报告应直接报送有关部门审批

    D. 可行性研究报告需经具有相应资质的咨询单位评估后报送有关部门审批

    52. 在某工程网络计划中,已知工作M没有自由时差,但总时差为5天,监理工程师检查实际进度时发现该工作的持续时间延长了4天,说明此时工作M的实际进度(52)。

    A. 既不影响总工期,也不影响其后续工作的计划

    B. 不影响总工期,但将其紧后工作的最早开始时间推迟4天

    C. 将使总工期延长4天,但不影响其后续工作的正常进行

    D. 将其后续工作的开始时间推迟4天,并使总工期延长1天

    53. 某分部工程双代号网络图如下图所示,其作图错误表现为(53)。

    A. 有多个起点结点

    B. 有多个终点结点

    C. 结点编号有误

    D. 存在循环回路

    54. 对备件、设备采购,通过质量-价格比选,合理确定供应单位是投资控制的(54)。

    A. 组织措施

    B. 技术措施

    C. 经济措施

    D. 合同措施

    55. 在建设工程进度调整过程中,调整进度计划的先决条件是(55)。

    A. 确定原合同条件调整的范围

    B. 确定可调整进度的范围

    C. 确定原合同价款调整的范围

    D. 确定承包单位成本的增加额

    56. 如果以年利率10%投资某项目100万元,拟在今后5年中把5年的“本利和”在每年年末按相等的数额提取,每年可回收的资金为(56)万元。

    A. 33.37

    B. 25.38

    C. 20.15

    D. 26.38

    57. 在项目财务评价中,当财务净现值(57)时,项目方案可行。

    A. FNPV≤0

    B. FNPV<9

    C. FNPV≥0

    D. FNPV=0

    58. 电子政务项目文件归档的含义是(58)。

    A. 建设、施工、监理、设计等单位将本单位在工程建设过程中形成的文件向本单位档案机构移交

    B. 设计、施工、监理等单位将本单位在工程建设过程中形成的文件向电子政务项目实施机构移交

    C. 文件形成单位完成其工作后,将形成的文件整理立卷后,按规定移交当地档案管理部门
    设计、施工、监理等单位将本单位在工程建设过程中形成的工程文件向建 设单位移交,建设单位汇总后向当地档案管理部门移交

    D. 设计、施工、监理等单位将本单位在工程建设过程中形成的工程文件向建设单位移交,建设单位汇总后向当地档案管理部门移交

    59. 无论是建设单位,承建单位,还是监理单位提出的工程变更,经审查并经有关方面研究后,由(59)发布变更指令方能生效予以实施。

    A. 建设单位代表

    B. 承建单位代表

    C. 专业监理工程师

    D. 总监理工程师

    60. 凡工程产品质量没有满足某项质量要求, 就称之为(60)。

    A. 质量事故

    B. 质量不合格

    C. 质量风险

    D. 质量通病

    61. 合同一方当事人通过资产重组分立为两个独立的法人,原法人签订的合同(61)。

    A. 自然终止

    B. 归于无效

    C. 仍然有效

    D.

    可以撤销

     

    62. 某公司开发计算机软件,进行了著作权登记,其著作权保护期为(62) 。

    A. 10 年

    B. 20 年

    C. 25 年

    D. 50 年

    63. 投标人对现场勘察后向招标方提出问题质疑,而招标方书面回答的问题与招标文件中规定的不一致时,应以(63)为准。

    A. 现场勘察后招标方口头解释

    B. 招标文件规定

    C. 招标方书面回函解答

    D. 仲裁机构裁定

    64. 在实现信息安全的目标中,关于信息安全技术和管理之间的关系的说法不正确的是(64)。

    A. 产品和技术,要通过管理的组织职能才能发挥最好的作用

    B. 技术不高但管理良好的系统远比技术髙但管理混乱的系统安全

    C. 信息安全技术可以解决所有信息安全问题

    D. 实现信息安全是一个管理的过程,而并非仅仅是一个技术的过程

    65. (65)属于信息安全管理国际标准

    A. ISO 9000-2000

    B. SSE-CMM

    C. ISO 17799

    D. ISO 15408

    66. 信息化工程投资控制最主要的阶段是(66)。

    A. 施工阶段

    B. 招标阶段

    C. 竣工验收阶段

    D. 设计阶段

    67. 信息安全风险评估(67)。

    A. 只需要实施一次就可以

    B. 应该根据变化了的情况定期或不定期地适时进行

    C. 不需要形成文件化评估结果报告

    D. 仅对网络做定期的扫描就行

    68. 根据《国家电子政务工程项目档案管理暂行办法》,文档测试方案、方案评审意见、测试记录、测试报告》的保管期限为(68)。

    A. 10 年

    B. 20 年

    C. 30 年

    D. 永久

    69. 选择仲裁方式的电子政务工程建设合同,纠纷的仲裁由(69)的仲裁委员会仲裁。

    A. 工程所在地

    B. 建设单位所在地

    C. 承建单位所在地

    D. 双方选定

    70. 在(70)阶段,需要确定工程项目的质量要求,并与投资目标相协调。

    A. 项目建议书

    B. 可行性研究

    C. 总体设计

    D. 实施

    71. The prototyping method is a dynamic design processes,which requires people who use prototyping method to have the following capability of (71) .

    A. proficient program expertise

    B. immediately acquire requirement

    C. coordinate & organize eloquently

    D. handle tools smartly

    72. TCP (Transmission Control Protocol) was specifically designed to provide a reliable end-to-end byte stream over a(n) (72).

    A. IP address

    B. reliable network

    C. socket

    D. unreliable internetwork

    73. A lOBaseT Ethernet LAN has (73).

    A. a star topology

    B. a ring topology

    C. a bus topology

    D. a linear topology

    74. Maintenance activities do not include (74).

    A. making enhancements to software products

    B. developing a new software product

    C. correcting problems

    D. adapting products to new environments

    75. When a bridge transmits an Ethernet frame, the Ethernet frame has (75).

    A. the broadcast address for the its source address

    B. the bridge’s LAN address for its destination address

    C. the bridge's LAN address for its source address

    D. none of the above

    获取答案和详细的答案解析:https://ai.52learn.online/10359

    展开全文
  • 该程序采用ASP+ACCESS/MSSQL开发,系统源码无加密,完全免费开放,ASPMPS分类信息系统以下特点,而这些特点通常是其他ASP分类信息程序具备。1、自定义附加字段:有了该功能使您网站内容不再单调,轻松定义出...
  • 任务:通过此系统可以实现如下功能(包含但限于以下功能,可自行设计):1、兴趣类别包括:球类、棋类、田径、文化、舞蹈……兴趣类别是可以添加、删除、修改。2、每一项兴趣属于一种类别。 例如球类包括:足球...

    学生兴趣特长信息管理系统(数据结构课设)

    考查点:数据结构、文件操作

    注意:必须使用文件存储数据,不得使用数据库管理系统。

    任务:通过此系统可以实现如下功能(包含但不限于以下功能,可自行设计):

    1、兴趣类别包括:球类、棋类、田径、文化、舞蹈……

    兴趣类别是可以添加、删除、修改的。

    2、每一项兴趣属于一种类别。

       例如球类包括:足球、篮球、乒乓球、羽毛球……

    兴趣也是可以添加、删除、修改的。

    3、学生信息包括:学号、姓名、性别、年级、专业……

    学生信息是可以添加、删除、修改的。

    4、每个学生可以有多项兴趣特长。

    每个学生的兴趣是可以添加、删除的。

    5、定义好相应的数据结构,将文件的信息读取至内存。

       在内存中进行兴趣类别、兴趣、学生、学生兴趣的更新操作,并将更新后的数据写回文件,可以设置专门的功能或在退出系统时批量更新。

       文件格式自行定义,可以定义多个文件将不同的信息分别存放。文件中已有部分信息。

    6、插入、删除、修改、查询

    添加一个新的兴趣类别

    修改、删除兴趣类别

    添加一个新的兴趣项,注意每一个兴趣项必须属于一种兴趣类别

    修改、删除兴趣项

    添加一个新的学生

    修改、删除学生信息

    给学生添加兴趣,可以全选(例如喜欢所有的球类),可以挑选。

    删除学生的兴趣

    根据用户输入的关键词查询某学生的基本信息和该学生的兴趣

    根据用户输入的关键词查询某兴趣的所有爱好者信息,例如查询所有喜欢足球的学生信息。

    7、将更新后的数据写回文件。

    8、为了便于查询,可以增加索引文件,参考绪论中的图书检索问题。


    注;本人使用java编写

    源码:

    import java.util.*;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.EOFException;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.io.RandomAccessFile;


    public class do_file {
    //文本写入文件
    public static void write(String filePathAndName,String m) {
    try {   
         File myFilePath = new File(filePathAndName);   
        // if (!myFilePath.exists()) {   
          // myFilePath.createNewFile();   
         //}   
        //FileWriter resultFile = new FileWriter(myFilePath);   
          FileWriter resultFile = new FileWriter(myFilePath,true);// 表示在原文件的基础上添加内容
        PrintWriter myFile = new PrintWriter(resultFile);   
        myFile.println(m); 
        //将内容写入文件
        myFile.close();   resultFile.close();   
       // System.out.println("文件写入操作成功!"); 
    } catch (IOException e) {   
         System.out.println("新建文件操作出错!");   
         e.printStackTrace();   
      } 


    }

    //新建文件
    public static void newFile(String filePathAndName, String fileContent) {
    try {   
         File myFilePath = new File(filePathAndName);   
         if (!myFilePath.exists()) {   
           myFilePath.createNewFile();   
         }   
        FileWriter resultFile = new FileWriter(myFilePath);   
        //  FileWriter resultFile = new FileWriter(myFilePath,true); 表示在原文件的基础上添加内容
        PrintWriter myFile = new PrintWriter(resultFile);   
        myFile.println(fileContent); 
        //将内容写入文件
        myFile.close();   resultFile.close();   
       // System.out.println("新建文件操作成功!"); 
    } catch (IOException e) {   
         System.out.println("新建文件操作出错!");   
         e.printStackTrace();   
      }   
    }

    /*
    //读整个文件
    public static void visit() {
    try{
    FileInputStream fis = new FileInputStream("E:\\数据结构课设\\Student.txt"); //定义一个文件字节流 
        InputStreamReader isr = new InputStreamReader(fis); //将字节流转换成字符流
        BufferedReader br = new BufferedReader(isr);  //将字符流转换成缓存流
    String s=""; String ss =""; 
    while((s = br.readLine())!= null) {   //一次读取一行
    ss += s+"\n"; 

    br.close();   isr.close();  fis.close();
    System.out.print(ss);
    }
    catch(IOException e){
    e.printStackTrace();
    }


    }
    */
    //部分查找
    public static void Find(String id) {
    try{
    FileInputStream fis = new FileInputStream("E:\\数据结构课设\\Student.txt"); //定义一个文件字节流 
        InputStreamReader isr = new InputStreamReader(fis); //将字节流转换成字符流
        BufferedReader br = new BufferedReader(isr);  //将字符流转换成缓存流
    String s=""; String ss =""; 
    int i=0;
    s = br.readLine();
    while((s = br.readLine())!= null) {   //一次读取一行
    if(s.equals(id)) {
    while(i<4) {
    s = br.readLine();
    ss += s+"\n"; 
    i++;
    }
    break; 

    }
    br.close();   isr.close();  fis.close();
    System.out.print(ss);
    }
    catch(IOException e){
    e.printStackTrace();
    }


    }


    //对文件指定内容的修改
    public static boolean fileChange(String filePathandName, String oldstr, String newstr) {
           RandomAccessFile raf = null;
           try {
               raf = new RandomAccessFile(filePathandName, "rw");//“rw”对文件进行读和写
               String line = null;
               long lastPoint = 0; //记住上一次的偏移量
               while ((line = raf.readLine()) != null) {
                   final long ponit = raf.getFilePointer();
                   if(line.contains(oldstr)){        //contains()包含的意思,line字符串里是否包含oldstr,返回值为Boolean型
                         String str=line.replace(oldstr, newstr);
                   raf.seek(lastPoint);
                   raf.writeBytes(str);
                   }
                   lastPoint = ponit; 
               }
           } catch (Exception e) {
               e.printStackTrace();
           } finally {
               try {
                   raf.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           return true;
       }
     
     
    public static boolean Change(String id, String oldstr, String newstr) {               
           RandomAccessFile raf = null;
           try {
               raf = new RandomAccessFile("E:\\数据结构课设\\Student.txt", "rw");//“rw”对文件进行读和写
               String line = null;
               int i=0;
               long lastPoint = 0; //记住上一次的偏移量
               while ((line = raf.readLine()) != null&&i<5) {
                if(line.equals(id)) {
               
                     while ((line = raf.readLine()) != null&&i<5) {
                   final long ponit = raf.getFilePointer();
                   if(line.contains(oldstr)){
                         String str=line.replace(oldstr, newstr);
                   raf.seek(lastPoint);
                   raf.writeBytes(str);
                   }
                   lastPoint = ponit; 
                   i++;
               }
               }
           }
           } catch (Exception e) {
               e.printStackTrace();
           } finally {
               try {
                   raf.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           return true;
       }
     
     
    public static boolean Change1(String id, String oldstr, String newstr) {               //ok
           RandomAccessFile raf = null;
           try {
               raf = new RandomAccessFile("E:\\数据结构课设\\Interest.txt", "rw");//“rw”对文件进行读和写
               String line = null;
               int i=0;
               long lastPoint = 0; //记住上一次的偏移量
               while ((line = raf.readLine()) != null&&i<1) {
                if(line.equals(id)) {
               
                     while ((line = raf.readLine()) != null&&i<1) {
                   final long ponit = raf.getFilePointer();
                   if(line.contains(oldstr)){
                         String str=line.replace(oldstr, newstr);
                   raf.seek(lastPoint);
                   raf.writeBytes(str);
                   }
                   lastPoint = ponit; 
                   i++;        
               }
               }
           }
           } catch (Exception e) {
               e.printStackTrace();
           } finally {
               try {
                   raf.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           return true;
       }
     
     public static void delFile(String filepathandname){
            File file=new File(filepathandname);
            if(file.exists()&&file.isFile())
                file.delete();
        }
     
     
     


      public static void changeStudent(String id,String oldstr,String newstr) {  
      try {  
            File file = new File("E:\\数据结构课设\\Student.txt");
               InputStream is = new FileInputStream(file);  
               BufferedReader reader = new BufferedReader(    
                       new InputStreamReader(is));  
     
               String filename = file.getName();  
               // tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。  
               File tmpfile = new File(file.getParentFile().getAbsolutePath()  
                       + "\\" + filename + ".tmp");  
     
               BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile));  
     
               boolean flag = false;  
               String str = null;  
               while (true) {  
               
                   str = reader.readLine();    
                   if (str == null)  
                       break;  
     
                   else if(str.contains(id)) {
                    writer.write(str + "\n"); 
                   while((str=reader.readLine())!=null)
                      if (str.contains(oldstr)) { 
                      String mn= str.replace(oldstr, newstr);
                      //str.replace(target, newContent);
                       writer.write(mn + "\n");  
                       flag = true; 
                       break;
                   
                    }
                      else
                           writer.write(str + "\n"); 
                   }
                               
                   else  
                       writer.write(str + "\n");  
               }  
     
               is.close();  
     
               writer.flush();  //将缓存区的数据强制输出     
               writer.close();  
     
               if (flag) {  
                   file.delete();  
                   tmpfile.renameTo(new File(file.getAbsolutePath()));  
               } else  
                   tmpfile.delete();  
           } catch (Exception e) {  
               e.printStackTrace();  
           }  
       } 
     
     
     

       
     
    //下面为对兴趣进行操作的函数
     
     
      public static void doInterest(String id,String type,String oldstr,String newstr) {  
      try {  
            File file = new File("E:\\数据结构课设\\Interest.txt");
               InputStream is = new FileInputStream(file);  
               BufferedReader reader = new BufferedReader(    
                       new InputStreamReader(is));  
     
               String filename = file.getName();  
               // tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。  
               File tmpfile = new File(file.getParentFile().getAbsolutePath()  
                       + "\\" + filename + ".tmp");  
     
               BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile));  
     
               boolean flag = false;  
               String str = null;  
               while (true) {  
               
                   str = reader.readLine();    
                   if (str == null)  
                       break;  
     
                   else if(str.contains(id)) {
                    writer.write(str + "\n"); 
                   while((str=reader.readLine())!=null)
                      if (str.contains(type)) { 
                      String mn= str.replace(oldstr, newstr);
                      //str.replace(target, newContent);
                       writer.write(mn + "\n");  
                       flag = true; 
                   
                    }
                      else
                           writer.write(str + "\n"); 
                   }
                               
                   else  
                       writer.write(str + "\n");  
               }  
     
               is.close();  
     
               writer.flush();  //将缓存区的数据强制输出     
               writer.close();  
     
               if (flag) {  
                   file.delete();  
                   tmpfile.renameTo(new File(file.getAbsolutePath()));  
               } else  
                   tmpfile.delete();  
           } catch (Exception e) {  
               e.printStackTrace();  
           }  
       } 
     
     
      
       public static void addInterest(String id,String type,String newstr) {  //addInterest    
           try {  
            File file = new File("E:\\数据结构课设\\Interest.txt");
               InputStream is = new FileInputStream(file);  
               BufferedReader reader = new BufferedReader(    
                       new InputStreamReader(is));  
     
               String filename = file.getName();  
               // tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。  
               File tmpfile = new File(file.getParentFile().getAbsolutePath()  
                       + "\\" + filename + ".tmp");  
     
               BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile));  
     
               boolean flag = false;  
               String str = null;  
               while (true) {              
                   str = reader.readLine();    
                   if (str == null)  
                       break;  
     
                   else if(str.contains(id)) {
                    writer.write(str + "\n"); 
                   while((str=reader.readLine())!=null)
                      if (str.contains(type)) { 
                      String mn= str+" "+newstr;
                      //str.replace(target, newContent);
                       writer.write(mn + "\n");  
                       flag = true; 
                       break;                
                    }
                      else
                           writer.write(str + "\n"); 
                   }
                               
                   else  
                       writer.write(str + "\n");  
               }  
     
               is.close();  
     
               writer.flush();  
               writer.close();  
     
               if (flag) {  
                   file.delete();  
                   tmpfile.renameTo(new File(file.getAbsolutePath()));  
               } else  
                   tmpfile.delete();  
           } catch (Exception e) {  
               e.printStackTrace();  
           }  
       } 
       
      
       
       public static void delInterest(String id,String type,String oldinterest) {  //doInterest
         
           try {  
            File file = new File("E:\\数据结构课设\\Interest.txt");
               InputStream is = new FileInputStream(file);  
               BufferedReader reader = new BufferedReader(    
                       new InputStreamReader(is));  
     
               String filename = file.getName();  
               // tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。  
               File tmpfile = new File(file.getParentFile().getAbsolutePath()  
                       + "\\" + filename + ".tmp");  
     
               BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile));  
     
               boolean flag = false;  
               String str = null;  
               while (true) {  
               
                   str = reader.readLine();    
                   if (str == null)  
                       break;    
                   else if(str.contains(id)) {
                    writer.write(str + "\n"); 
                   while((str=reader.readLine())!=null)
                      if (str.contains(type)) { 
                      String mid="";
                      String mn= str.replace(oldinterest,mid);
                      //str.replace(target, newContent);
                       writer.write(mn + "\n");  
                       flag = true; 
                       break;
                    }
                      else
                           writer.write(str + "\n"); 
                   }
                               
                   else  
                       writer.write(str + "\n");  
               }  
     
               is.close();  
     
               writer.flush();  
               writer.close();  
     
               if (flag) {  
                   file.delete();  
                   tmpfile.renameTo(new File(file.getAbsolutePath()));  
               } else  
                   tmpfile.delete();  
           } catch (Exception e) {  
               e.printStackTrace();  
           }  
       }
       
      
       
       public static void Addnewitem(String id,String typeandinterest) {  //doInterest      
           try {  
            File file = new File("E:\\数据结构课设\\Interest.txt");
               InputStream is = new FileInputStream(file);  
               BufferedReader reader = new BufferedReader(    
                       new InputStreamReader(is));    
               String filename = file.getName();  
               // tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。  
               File tmpfile = new File(file.getParentFile().getAbsolutePath()  
                       + "\\" + filename + ".tmp");  
     
               BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile));  
     
               boolean flag = false;  
               String str = null;  
               while (true) {              
                   str = reader.readLine();    
                   if (str == null)  
                       break;  
     
                   else if(str.contains(id)) {
                    writer.write(str + "\n"); 
                    writer.write(typeandinterest + "\n");
                      flag = true;
                   }
                               
                   else  
                       writer.write(str + "\n");  
               }  
     
               is.close();  
     
               writer.flush();  
               writer.close();  
     
               if (flag) {  
                   file.delete();  
                   tmpfile.renameTo(new File(file.getAbsolutePath()));  
               } else  
                   tmpfile.delete();  
           } catch (Exception e) {  
               e.printStackTrace();  
           }  
       } 
       
       
       public static void delitem(String type) {  //doInterest
         
           try {  
            File file = new File("E:\\数据结构课设\\Interest.txt");
               InputStream is = new FileInputStream(file);  
               BufferedReader reader = new BufferedReader(new InputStreamReader(is));  
               String filename = file.getName();  
               // tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。  
               File tmpfile = new File(file.getParentFile().getAbsolutePath()  
                       + "\\" + filename + ".tmp");  
     
               BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile));  
     
               boolean flag = false;  
               String str = null;  
               while (true) {  
                   str = reader.readLine();  
                   if (str == null)  
                       break;                  
                   else if(str.contains(type)) {
                    String mid="";
                       writer.write(mid + "\n");
                       flag = true;                
                   }
                               
                   else  
                       writer.write(str + "\n");  
               }  
     
               is.close();  
               writer.flush();  
               writer.close();  
     
               if (flag) {  
                   file.delete();  
                   tmpfile.renameTo(new File(file.getAbsolutePath()));  
               } else  
                   tmpfile.delete();  
           } catch (Exception e) {  
               e.printStackTrace();  
           }  
       } 
       
       


    public static void Findinterest(String id) {
    try{
    FileInputStream fis = new FileInputStream("E:\\数据结构课设\\Interest.txt"); //定义一个文件字节流 
        InputStreamReader isr = new InputStreamReader(fis); //将字节流转换成字符流
        BufferedReader br = new BufferedReader(isr);  //将字符流转换成缓存流
    String s=""; String ss =""; 
    String mid="";
    int i=0;
    while((s = br.readLine())!= null) {   //一次读取一行
    if(s.contains(id)) {
    while((s = br.readLine())!= null) {
    mid=s;
    if(mid.contains("2016")) {
    break;
    }
    else
       ss += s+"\n"; 
    }
    break; 

    }
    br.close();   isr.close();  fis.close();
    System.out.print(ss);
    }
    catch(IOException e){
    e.printStackTrace();
    }


    }
       
       
    public static void Search(String interest) {

    try{
    FileInputStream fis = new FileInputStream("E:\\数据结构课设\\Interest.txt"); //定义一个文件字节流 
        InputStreamReader isr = new InputStreamReader(fis); //将字节流转换成字符流
        BufferedReader br = new BufferedReader(isr);  //将字符流转换成缓存流
    String s="";  
    String mid1="";
    String mid2="";
    int i=0;
    boolean flag=false;
    while((s = br.readLine())!= null) { //一次读取一行
    i=0;
    if(s.contains("2016")) {
       mid1=s; 
    while((s = br.readLine())!= null&&i<2) {
    mid2=s;
    if(mid2.contains(interest)) {
    System.out.println(mid1);
    Find(mid1);
    break;
    }
    i++;
    }

    }
    br.close();   isr.close();  fis.close();
    }
    catch(IOException e){
    e.printStackTrace();
    }


    }  
       
       
       
    public static void Search(String interest) {

    try{
    FileInputStream fis = new FileInputStream("E:\\数据结构课设\\Interest.txt"); //定义一个文件字节流 
        InputStreamReader isr = new InputStreamReader(fis); //将字节流转换成字符流
        BufferedReader br = new BufferedReader(isr);  //将字符流转换成缓存流
    String s="";  
    String mid1="";
    String mid2="";
    int i=0;
    boolean flag=false;
    while((s = br.readLine())!= null) { //一次读取一行
    i=0;
    if(s.contains("2016")) {
       mid1=s; 
    while((s = br.readLine())!= null&&i<2) {
    mid2=s;
    if(mid2.contains(interest)) {
    System.out.println(mid1);
    Find(mid1);
    break;
    }
    i++;
    }

    }
    br.close();   isr.close();  fis.close();
    }
    catch(IOException e){
    e.printStackTrace();
    }

    }


    public static void main(String args[]) {
    while(true) {
    Scanner input=new Scanner(System.in);
    String varm;
    //newFile("E:\\数据结构课设\\Student.txt","");
    //newFile("E:\\数据结构课设\\Interest.txt","");
    System.out.println("请选择功能,直接输入功能前面的序号:");
    System.out.println("1------录入学生的基本信息");
    System.out.println("2------录入学生的兴趣信息");
    System.out.println("3------修改学生的基本信息");
    System.out.println("4------修改学生的兴趣信息");
    System.out.println("5------根据学号查找学生的基本信息和兴趣信息");
    System.out.println("6------根据兴趣查找学生信息");
    int var1=input.nextInt();
    if(var1==1) {
    String n="end";
    String m="";
    while(true) {             
    m=input.nextLine();       
    if(m.equals(n))               //此处只能用值比较,不能用==
    break;
    write("E:\\数据结构课设\\Student.txt",m);
    }
    System.out.println("学生基本信息录入成功");
    }//if(var1==1)的括号

    else if(var1==2) {
    System.out.println("兴趣类别:球类、棋类、田径等");
    System.out.println("球类:篮球、足球、羽毛球等");
    System.out.println("棋类:国际象棋、围棋、跳棋等");
    System.out.println("田径:跑步、跳远、跨栏等");
    System.out.println("请输入学生兴趣,先输入学号,再输入兴趣,输入end结束");
    String n="end";
    String m="";
    while(true) {             
    m=input.nextLine();       
    if(m.equals(n))               //此处只能用值比较,不能用==
    break;
    write("E:\\数据结构课设\\Interest.txt",m);
    //System.out.println("兴趣信息录入成功!");
    }


    else if(var1==3) {
    System.out.println("请选择修改类型,直接输入类型前的代号:");
    System.out.println("1------修改学生信息");
    System.out.println("2------删除学生信息");
    System.out.println("3------查找学生信息");
    int var2=input.nextInt();

    if(var2==1) {
    Scanner sc1=new Scanner(System.in);
    Scanner sc=new Scanner(System.in);
    System.out.println("请输入需要修改信息的学生学号、原来信息和正确信息");
    String var3=sc1.nextLine();
    String var5=sc.nextLine();
    String var6=sc.nextLine();
    changeStudent(var3,var5,var6);
    System.out.println("学生信息修改成功!");
    }

    else if(var2==2) {
    delFile("E:\\数据结构课设\\Student.txt");
    System.out.println("学生信息删除成功!");
    }

    else if(var2==3) {
    System.out.println("请输入学生学号:");
    int var3=input.nextInt();
    String var4=""+var3;
    Find(var4);

    }
    else {
    System.out.println("代号输入错误");
    }

    }

    else if(var1==4){

    System.out.println("1------修改学生兴趣");
    System.out.println("2------增加学生兴趣");
    System.out.println("3------删除学生兴趣");
    System.out.println("4------增加新的兴趣项和相应的兴趣");
    System.out.println("5------删除某一兴趣项");
    System.out.println("6------查看学生信息");
    Scanner sc1=new Scanner(System.in);
    int var2=sc1.nextInt();
    if(var2==1) {
    Scanner sc3=new Scanner(System.in);
    System.out.println("请输入要修改的学生的学号,兴趣类别,原来的兴趣和现在的兴趣");
    String id=sc3.nextLine();
    String type=sc3.nextLine();
    Scanner sc2=new Scanner(System.in);
    String inter1=sc2.nextLine();
    String inter2=sc2.nextLine();
       doInterest(id,type,inter1,inter2);
       System.out.println("兴趣修改成功!");
    }

    else if(var2==2) {
    Scanner sc3=new Scanner(System.in);
    System.out.println("请输入要添加兴趣的学生的学号,兴趣类别,新的兴趣");
    String id=sc3.nextLine();
    String type=sc3.nextLine();
    Scanner sc2=new Scanner(System.in);
    String newinterest=sc2.nextLine();
       addInterest(id,type,newinterest);
       System.out.println("兴趣添加成功!");
    }


    else if(var2==3) {
    Scanner sc3=new Scanner(System.in);
    System.out.println("请输入要删除兴趣的学生的学号,兴趣类别,要删除的兴趣");
    String id=sc3.nextLine();
    String type=sc3.nextLine();
    Scanner sc2=new Scanner(System.in);
    String oldinterest=sc2.nextLine();
    delInterest(id,type,oldinterest);
    System.out.println("兴趣删除成功!");
    }


    else if(var2==4) {
    Scanner sc3=new Scanner(System.in);
    System.out.println("请输入要添加新兴趣项的学生的学号,新的兴趣项和兴趣");
    String id=sc3.nextLine();
    String typeandinterest=sc3.nextLine();
    Addnewitem(id,typeandinterest);
    System.out.println("新兴趣项及兴趣添加成功!");

    }


    else if(var2==5) {
    Scanner sc3=new Scanner(System.in);
    System.out.println("请输入要删除的兴趣项");
    String type=sc3.nextLine();
    delitem(type);
    System.out.println("兴趣项删除成功!");
    }

    else if(var2==6) {
    Scanner sc3=new Scanner(System.in);
    System.out.println("请输入要查询的学生学号");
    String id=sc3.nextLine();
    Findinterest(id);
    }

    else {
    System.out.println("代号输入错误!");
    }






    else if(var1==5) {
    System.out.println("请输入要查找的学生的学号");
    Scanner sc2=new Scanner(System.in);
    String id=sc2.nextLine();
    System.out.println("基本信息:");
    Find(id);
    System.out.println("兴趣:"); 
    Findinterest(id);
    }


    else if(var1==6) {
    System.out.println("请输入兴趣:");
    Scanner sc2=new Scanner(System.in);
    String interest=sc2.nextLine();
    System.out.println("喜欢该兴趣的学生的基本信息:");
    Search(interest);

    }


    else {
    System.out.println("代号输入错误!");
    }


    System.out.println("你是否要继续使用其他功能");
    System.out.println("Y/N");
    Scanner sc2=new Scanner(System.in);
    String mid=sc2.nextLine();
    if(mid.equals("N")||mid.equals("n"))
    break;

    }

    }//mian函数括号

    }//public类括号


    使用方法:

    输入时按行输入,详细见截图,输入请看截图,不然容易出错

    信息录入完以后对其进行功能操作后,存回文件的是纯文本,所以用记事本打开没有换行,换用word打开就可以看到有换行,既正常格式,记得用word打开后一定要在下次功能操作之前关闭,不然功能不能正确完成,原因是word占用了相关进程。还有就是记得把文件先建好,你可以自己建,也可以用我的main函数里的代码建(//newFile("E:\\数据结构课设\\Student.txt","");

    //newFile("E:\\数据结构课设\\Interest.txt","");),建好之后记得注释掉,不然每次运行都会新建,抹掉之前的一切。文件路径自己随便。

    以下为具体截图:











    展开全文
  • 面向对象建模,把系统看作是相互协作对象,这些对象是结构和行为封装,都属于某个类,那些类具有某种层次化结构。系统的所有功能通过对象之间相互发送消息来获得。面向对象建模可以视为一个包含以下元素...
  • 这个C++管理系统基本涵盖了“学生成绩管理系统所有功能,你可以从中借鉴到C++链表、类、封装、继承、文件操作、排序等等很多知识,极具借鉴意义,以下为本项目的功能介绍: 1. 建立文件 (1)可以使用默认...
  • 其中GSM-R不属于CTCS设备,但是重要组成部分。应答器是一种能向车载子系统发送报文信息的传输设备,既可以传送固定信息,也可连接轨旁单元传送可变信息。轨道电路具有轨道占用检查、沿轨道连续传送地车信息功能,应...
  • 走访了千家企业,看过大大小小、不同风格会议室,但小编总结出了以下四种使用方式,看看你公司属于那种? 1:会议室门口贴白纸 这大概是最传统会议室使用方式,在门口贴一种A4纸,如果需要使用会议室,就写上...

    9e06619a1370c8121848bdab184a1c47.png

    走访了千家企业,看过大大小小、不同风格的会议室,但小编总结出了以下四种使用方式,看看你公司属于那种?

    a574abe3e7808e5d9537054d12901fab.png

    1:会议室门口贴白纸

    这大概是最传统的会议室使用方式,在门口贴一种A4纸,如果需要使用会议室,就写上自己需要使用的时间及会议内容。

    缺点:信息量少,不能从根本上解决使用冲突,会议信息变更也无法提供通知。

    2:使用OUTLOOK预约会议

    许多企业使用outlook系统的预约功能,它能提供部分通知渠道,而且能提供设置日历及定制提醒闹钟功能。

    缺点:只能订会议及参与人员通知,不能预定会议室,部门与部门使用撞脸时常发生。

    3:OA兼职会议室预约

    使用简易的OA系统或者干脆由行政人员兼职预定工作,这也是许多中小型企业在使用的办法,在公司规模较小时可以兼顾。

    缺点:增加行政人员工作量,容易出现人工失误,会议室使用率降低,筹备会议时间增加。

    4:使用不专业的会议室预约小程序

    如今在网上能找到许多简易版的会议室预约系统,又或者是由公司研发部门写一个小程序,这种情况也不少见,毕竟几乎是零成本。

    缺点:小程序本身功能较少,不能与员工数据库打通,不能联动门禁提供管控。

    专业的会议室预约系统是这样的!

    a1e7f33018e8c03e8b13b715fef8af1d.png

    1:兼容钉钉、微信、企业APP

    提供手机端及PC端预约界面,系统入口能兼容公司统一工作平台,无需下载额外客户端。

    2:简单预约流程

    选会议,选时间,填写会议信息及参会人员,简单三步完成预定,同步员工数据库,支持部门群选及外部人员预约。

    3:多种通知途径

    预定成功后,所以参会人员将收到短信、微信及邮件通知,兼容OUTLOOK通知,能一键设置会议日历提醒。

    4:3D导视图

    直观图片展示,三种颜色区分:绿色是空闲、红色是正在使用、橙色是你预定的会议室,方便快速锁定位置。

    5:会议室展板

    会议室门口展示屏,显示预定会议安排,参会人员及更多需展示信息,联动二维码门锁,参会人员扫码开门,无权限不得占用,支持扫码会议签到。

    6:无人探测

    红外加微波,国内唯一微动作探测监控,预定会议未参加和会议提前介绍,无人探测设备会检测会议室内状况,无人使用即可自动释放会议室资源。

    7:管理后台

    后台数据统计,开会信息、参会信息、会议室使用频率,共享会议纪要等。

    找专业的人,做专业的事。

    北京深万科技,二十年专注互联网企业的智能化系统集成,您身边的3AIT专家。

    展开全文
  • 根据依赖倒置的原则,编写一个能够实现以下功能的学生管理系统 - 增加一条学生信息 - 删除一条学生信息 - 修改一条学生信息 - 查询一条/全部学生信息 要注意依赖抽象而不是依赖具体! 参考解答 整体架构 首先是对C...

    问题描述

    根据依赖倒置的原则,编写一个能够实现以下功能的学生管理系统
    - 增加一条学生信息
    - 删除一条学生信息
    - 修改一条学生信息
    - 查询一条/全部学生信息
    
    要注意依赖抽象而不是依赖具体!
    

    参考解答

    整体架构

    首先是对C为MySQL提供的API的封装,属于底层实现,不需要考虑学生管理系统等等,只要考虑到读写数据即可。

    最后是对整个学生管理系统的封装,是一种MVC设计模式,本项目中包括了Model、Dao、Service、Controller、View这几层:

    • Model层

      模型层,定义学生管理系统要用到的具体对象的模型,这里就是根据学生表的字段封装出学生类Stu

    • Dao层

      数据访问层,规定学生管理系统数据访问的方式,提供数据访问的接口(抽象类)

    • Service层

      服务层,是对Dao层接口的具体实现,可以有多种实现,比如这里提供的就是用MySQL访问的接口

    • Controller层

      请求转接层,根据请求调用Service层进行处理

    • View层

      界面层,用于展示界面,将前端请求发送给Controller层处理

    UML图

    学生管理系统的UML图如下:
    UML

    如果感觉不清晰可以到生成这张图片的源网站去查看☛点这里(需要翻墙)

    整体代码

    MySQL-C-API封装

    还是沿用了上次作业的代码,并进行了一些修正如下:

    • 将上次封装中的所有coutcerr输出信息删除
    • 对query的返回值进行了修正,用return 查询到的记录数替代原本的return 0表示查询成功
    • 对exec的返回值进行了修正,用return 受影响的行数替代原本的return 0表示写入成功
    • 对query查询到的数据的展现方式进行了修正,用vector<vector<string>>类型的引用参数_res来存储查询到的数据
      注:本来是想用map<int, vector<string>>类型的引用参数来存储的,但是考虑到map容器的访问结果可能会和存储的顺序不符,因此改用了vector<vector<string>>类型

    以下是具体代码:

    MyMySQL.h文件

    #ifndef MYMYSQL_H
    #define MYMYSQL_H
    
    #include "mysql.h"  // 需要有MYSQL等结构体的定义
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class MyMySQL
    {
    public:
    	MyMySQL();
    	MyMySQL(const char* host, const char* user, const char* password, const char* db, unsigned int port);
    	int MyMySQL_connect(const char * host, const char * user, const char * password, const char * db, unsigned int port);
    	int MyMySQL_query(const char * sql, vector<vector<string>>& _res, const char * q = "gbk");
    	int MyMySQL_execute(const char * sql, const char * q = "gbk");
    	void MyMySQL_close();
    private:
    	void MyMySQL_init();
    	MYSQL conn;      // MySQL结构体
    	int init_state;  // 初始化状态 —— 0代表未初始化、1代表已初始化
    	int conn_state;  // 连接状态 —— 0代表未连接、1代表已连接
    };
    
    #endif // !MYMYSQL_H
    

    MyMySQL.cpp文件

    #include "pch.h"
    
    #include "MyMySQL.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    /*
     *  功能:
     *      MyMySQL的缺省构造函数
     *  参数:
     *      void
     *  返回值:
     *      无
     *  说明:
     *      只是初始化了conn,并没有连接到某个数据库
     *  创建时间:
     *      2020-04-01 10:59:20
     *  作者:
     *      Excious
     **/
    MyMySQL::MyMySQL()
    	:init_state(1), conn_state(0)
    {
    	mysql_init(&this->conn);
    }
    
    /*
     *  功能:
     *      MyMySQL的构造函数
     *  参数:
     *      host        in    主机
     *      user        in    用户名
     *      password    in    密码
     *      db          in    要连接的数据库
     *      port        in    端口
     *  返回值:
     *      无
     *  说明:
     *      使用成员函数MyMySQL_connect尝试连接(里面附带着初始化过程)
     *  创建时间:
     *      2020-04-01 14:36:46
     *  作者:
     *      Excious
     **/
    MyMySQL::MyMySQL(const char * host, const char * user, const char * password, const char * db, unsigned int port)
    	:init_state(0), conn_state(0)
    {
    	this->MyMySQL_connect(host, user, password, db, port);
    }
    
    /*
     *  功能:
     *      [连接/重新连接]到某个数据库
     *  参数:
     *      host        in    主机
     *      user        in    用户名
     *      password    in    密码
     *      db          in    要连接的数据库
     *      port        in    端口
     *  返回值:
     *      -1    连接失败
     *      0     连接成功
     *  说明:
     *      如果conn尚未进行初始化,会对其进行初始化,再重新进行连接
     *      如果conn已经连接上某个数据库,会先将其关闭,再重新初始化,再重新进行连接
     *      如果重新连接失败,则之前的连接状态也会被清除,并且将会关闭连接
     *  创建时间:
     *      2020-04-01 14:19:03
     *  作者:
     *      Excious
     **/
    int MyMySQL::MyMySQL_connect(const char * host, const char * user, const char * password, const char * db, unsigned int port)
    {
    	// 根据状态进行相应的预处理
    	if (!this->init_state)      // 未初始化
    	{
    		this->MyMySQL_init();
    	}
    	else if (this->conn_state)  // 已初始化,并已连接某数据库
    	{
    		this->MyMySQL_close();
    		this->MyMySQL_init();
    	}
    
    	// 尝试连接到某个数据库
    	int flag = 0;
    	if (!mysql_real_connect(&this->conn, host, user, password, db, port, NULL, 0))
    	{
    		this->MyMySQL_close();
    		flag = -1;
    	}
    	else
    	{
    		this->conn_state = 1;
    	}
    
    	return flag;
    }
    
    /*
     *  功能:
     *      执行select语句
     *  参数:
     *      sql     in     要执行的select语句
     *		_res    out    vector<vector<string>>的查询结果集合
     *      q       in     读取时的编码字符集(缺省值为"gbk")
     *  返回值:
     *      -2      尚未连接
     *      -1      查询失败
     *      >=0     查询成功,返回查询到的数据个数
     *  说明:
     *      前三行代码设置了读取时的字符集(目前感觉读取字符集utf8的表,最靠谱的还是gbk)
     *  创建时间:
     *      2020-04-10 15:54:05
     *  作者:
     *      Excious
     **/
    int MyMySQL::MyMySQL_query(const char * sql, vector<vector<string>>& _res, const char * q)
    {
    	string q_s("set names ");
    	q_s += q;
    	mysql_query(&this->conn, q_s.c_str());
    
    	// 尚未初始化、连接
    	if (!this->init_state || !this->conn_state)
    	{
    		return -2;
    	}
    
    	// 尝试执行SQL-select语句
    	if (mysql_query(&this->conn, sql))  // 执行失败
    	{
    		return -1;
    	}
    
    	// 执行成功
    	MYSQL_RES* res = mysql_store_result(&this->conn);
    	MYSQL_ROW row;
    	vector<string> temp;
    	int num = mysql_num_fields(res);
    	int record_num = mysql_num_rows(res);
    
    	while ((row = mysql_fetch_row(res)) != NULL)
    	{
    		temp.clear();
    		for (int i = 0; i < mysql_num_fields(res); i++)
    		{
    			temp.push_back(row[i] != NULL ? row[i] : "NULL");
    		}
    		_res.push_back(temp);
    	}
    	mysql_free_result(res);  //释放内存
    
    	return record_num;
    }
    
    /*
     *  功能:
     *
     *  参数:
     *      sql    in    要执行的update语句、insert语句、delete语句
     *      q      in    读取时的编码字符集(缺省值为"gbk")
     *  返回值:
     *      -2      尚未连接
     *      -1      执行失败
     *      >=0     执行成功,返回受影响的行数
     *  说明:
     *      前三行代码设置了写入时的字符集(目前感觉写入字符集utf8的表,最靠谱的还是gbk)
     *  创建时间:
     *      2020-04-01 15:25:46
     *  作者:
     *      Excious
     **/
    int MyMySQL::MyMySQL_execute(const char * sql, const char * q)
    {
    	string q_s("set names ");
    	q_s += q;
    	mysql_query(&this->conn, q_s.c_str());
    
    	// 尚未初始化、连接
    	if (!this->init_state || !this->conn_state)
    	{
    		return -2;
    	}
    
    	// 尝试执行
    	if (mysql_query(&this->conn, sql))  // 执行失败
    	{
    		return -1;
    	}
    
    	// 执行成功
    	int aff_num = mysql_affected_rows(&conn);
    	mysql_commit(&this->conn);  // 提交事务
    
    	return aff_num;
    }
    
    /*
     *  功能:
     *      关闭连接conn
     *  参数:
     *      void
     *  返回值:
     *      void
     *  说明:
     *      如果初始化状态(init_state)为0,则不会关闭连接
     *      如果初始化状态(init_state)为1,则对conn进行关闭,并将init_state、conn_state调整至0
     *  创建时间:
     *      2020-04-01 14:13:35
     *  作者:
     *      Excious
     **/
    void MyMySQL::MyMySQL_close()
    {
    	if (this->init_state)
    	{
    		mysql_close(&this->conn);
    		this->init_state = 0;
    		this->conn_state = 0;
    	}
    }
    
    /*
     *  功能:
     *      初始化连接conn,是连接数据库前的准备
     *  参数:
     *      void
     *  返回值:
     *      void
     *  说明:
     *      如果初始化状态(init_state)为1,则不会进行操作
     *      如果初始化状态(init_state)为0,则对conn进行初始化,并将init_state调整至1
     *  创建时间:
     *      2020-04-01 14:00:58
     *  作者:
     *      Excious
     **/
    void MyMySQL::MyMySQL_init()
    {
    	if (!this->init_state)
    	{
    		mysql_init(&this->conn);
    		this->init_state = 1;
    	}
    }
    

    Model层

    Model层定义了学生类Stu,除了构造函数、析构函数外,暂时没有成员函数,只包含成员数据int snostring sname,这和数据库中学生表的字段相一致。

    Stu.h文件

    #include <string>
    
    using namespace std;
    
    class Stu
    {
    public:
    	Stu();
    	Stu(int _sno, string _sname);
    	~Stu();
    
    	int getSno()const;
    	string getSname()const;
    	void setSno(int _sno);
    	void setSname(string _sname);
    private:
    	int sno;
    	string sname;
    };
    
    #endif // !STU_H
    

    Stu.cpp文件

    #include "pch.h"
    #include "Stu.h"
    
    
    Stu::Stu() { }
    
    /*
     *	功能:
     *		Stu类的构造函数
     *	参数:
     *		sno      in    学号
     *		sname    in    姓名
     *	返回值:
     *		无
     *	创建时间:
     *		2020-04-10 10:55:37
     *	作者:
     *		Excious
     **/
    Stu::Stu(int _sno, string _sname)
    	:sno(_sno), sname(_sname)
    {
    }
    
    Stu::~Stu() { }
    
    int Stu::getSno() const { return this->sno; }
    string Stu::getSname() const { return this->sname; }
    void Stu::setSno(int _sno) { this->sno = _sno; }
    void Stu::setSname(string _sname) { this->sname = _sname; }
    

    Dao层

    这里的Dao层只提供数据访问的接口,不负责实现,是一个抽象类。

    IStuDao.h文件

    #ifndef ISTUDAO_H
    #define ISTUDAO_H
    
    #include "Stu.h"
    #include <vector>
    
    using namespace std;
    
    class IStuDao
    {
    public:
    	IStuDao() { };
    	virtual ~IStuDao() { };
    
    	virtual int stuInsert(const Stu& _stu) = 0;
    	virtual int stuDelete(const int _sno) = 0;
    	virtual int stuUpdate(const int _sno, const Stu& _stu) = 0;
    	virtual int stuSelect(const int _sno, Stu& _res) = 0;
    	virtual int stuSelectAll(vector<Stu>& _resset) = 0;
    };
    
    #endif // !ISTUDAO_H
    

    Service层

    Service层是对Dao层接口的具体实现,可以有多种Service层实现,这里就是MySQL的Service实现。

    StuServiceMySQL.h文件

    #ifndef STUSERVICEMYSQL_H
    #define STUSERVICEMYSQL_H
    
    #include "IStuDao.h"
    #include "MyMySQL.h"
    
    class StuServiceMySQL :
    	public IStuDao
    {
    public:
    	StuServiceMySQL();
    	virtual ~StuServiceMySQL();
    
    	virtual int stuInsert(const Stu& _stu);
    	virtual int stuDelete(const int _sno);
    	virtual int stuUpdate(const int _sno, const Stu& _stu);
    	virtual int stuSelect(const int _sno, Stu& _res);
    	virtual int stuSelectAll(vector<Stu>& _resset);
    private:
    	MyMySQL* pmysql;
    };
    
    #endif // !STUSERVICEMYSQL_H
    

    StuServiceMySQL.cpp文件

    #include "pch.h"
    #include "StuServiceMySQL.h"
    
    /*
     *	功能:
     *		StuServiceMySQL的构造函数
     *	参数:
     *		void
     *	返回值:
     *		无
     *	说明:
     *		用new出来的MyMysQL对象初始化成员指针pmysql,析构函数中delete释放
     *	创建时间:
     *		2020-04-10 15:43:47
     *	作者:
     *		Excious
     **/
    StuServiceMySQL::StuServiceMySQL()
    	:pmysql(new MyMySQL("localhost", "tester", "test", "cpp_homework", 3306))
    {
    }
    
    /*
     *	功能:
     *		StuServiceMySQL的析构函数
     *	参数:
     *		void
     *	返回值:
     *		无
     *	说明:
     *		释放成员指针pmysql
     *	创建时间:
     *		2020-04-10 15:51:39
     *	作者:
     *		Excious
     **/
    StuServiceMySQL::~StuServiceMySQL()
    {
    	if (this->pmysql != NULL)
    		delete this->pmysql;
    }
    
    /*
     *	功能:
     *		插入一条学生记录
     *	参数:
     *		_stu    in    学生对象(待插入)
     *	返回值:
     *		0     插入成功
     *		-1    插入失败
     *	创建时间:
     *		2020-04-10 15:13:13
     *	作者:
     *		Excious
     **/
    int StuServiceMySQL::stuInsert(const Stu & _stu)
    {
    	string sql("insert into stu_info values(" + to_string(_stu.getSno()) + ", \'" + _stu.getSname() + "\')");
    	if (this->pmysql->MyMySQL_execute(sql.c_str()) < 0)
    	{
    		return -1;
    	}
    
    	return 0;
    }
    
    /*
     *	功能:
     *		删除一条学生记录(根据学号)
     *	参数:
     *		_sno    in    学生学号(待删除)
     *	返回值:
     *		0     删除成功
     *		-1    删除失败
     *	创建时间:
     *		2020-04-10 15:21:41
     *	作者:
     *		Excious
     **/
    int StuServiceMySQL::stuDelete(const int _sno)
    {
    	string sql("delete from stu_info where sno = " + to_string(_sno));
    	if (this->pmysql->MyMySQL_execute(sql.c_str()) < 0)
    	{
    		return -1;
    	}
    
    	return 0;
    }
    
    /*
     *	功能:
     *		更新一条学生记录(根据学号)
     *	参数:
     *		_sno    in    学生学号(待更新)
     *		_stu    in    学生对象(更新)
     *	返回值:
     *		0     更新成功
     *		-1    更新失败
     *	创建时间:
     *		2020-04-10 15:23:24
     *	作者:
     *		Excious
     **/
    int StuServiceMySQL::stuUpdate(const int _sno, const Stu & _stu)
    {
    	string sql("update stu_info set sno = " + to_string(_stu.getSno()) + ", sname = \'" + _stu.getSname() + "\' where sno = " + to_string(_sno));
    	if (this->pmysql->MyMySQL_execute(sql.c_str()) < 0)
    	{
    		return -1;
    	}
    
    	return 0;
    }
    
    /*
     *	功能:
     *		查询一条学生记录(根据学号)
     *	参数:
     *		_sno    in     学生学号
     *		_res    out    查询结果——单个学生对象
     *	返回值:
     *		0     查询成功(找到记录)
     *		-1    查询失败(找不到记录)
     *	创建时间:
     *		2020-04-10 15:27:15
     *	作者:
     *		Excious
     **/
    int StuServiceMySQL::stuSelect(const int _sno, Stu & _res)
    {
    	string sql("select * from stu_info where sno = " + to_string(_sno));
    	vector<vector<string>> q_res;
    	if (this->pmysql->MyMySQL_query(sql.c_str(), q_res) <= 0)
    	{
    		return -1;
    	}
    
    	_res = Stu(stoi(q_res[0][0]), q_res[0][1]);
    	return 0;
    }
    
    /*
     *	功能:
     *		查询所有学生记录
     *	参数:
     *		_sno       in     学生学号
     *		_resset    out    查询结果——所有学生对象构成的vector容器
     *	返回值:
     *		查询到的记录数
     *	说明:
     *		对于传入的参数_resset,会对其进行clear操作
     *	创建时间:
     *		2020-04-10 15:29:18
     *	作者:
     *		Excious
     **/
    int StuServiceMySQL::stuSelectAll(vector<Stu>& _resset)
    {
    	string sql("select * from stu_info");
    	vector<vector<string>> q_res;
    	if (this->pmysql->MyMySQL_query(sql.c_str(), q_res) < 0)
    	{
    		return -1;
    	}
    
    	_resset.clear();
    	for (vector<vector<string>>::const_iterator it = q_res.begin(); it != q_res.end(); ++it)
    	{
    		_resset.push_back(Stu(stoi((*it)[0]), (*it)[1]));
    	}
    
    	return _resset.size();
    }
    

    Controller层

    收集从View层发送来的请求,通过相应的Service层进行调用()。

    StuController.h文件

    #ifndef STUCONTROLLER_H
    #define STUCONTROLLER_H
    
    #include "IStuDao.h"
    
    class StuController
    {
    public:
    	StuController();
    	StuController(IStuDao* _pStuDao);
    	~StuController();
    
    	int stuAdd(const Stu& _stu);
    	int stuDel(const int _sno);
    	int stuUpd(const int _sno, const Stu& _stu);
    	int stuQueBySno(const int _sno, Stu& _res);
    	int stuQueAll(vector<Stu>& _resset);
    private:
    	IStuDao* pStuDao;
    };
    
    #endif // !STUCONTROLLER_H
    

    StuController.cpp文件

    #include "pch.h"
    #include "StuController.h"
    
    
    StuController::StuController() { }
    
    /*
     *	功能:
     *		StuController的构造函数
     *	参数:
     *		pStuDao    in    Dao层抽象类指针
     *	返回值:
     *		无
     *	说明:
     *		使用new XXX()的方式传入参数
     *		不能以类似 &XXX()的方式传入参数
     *		因为在析构函数阶段会进行delete
     *	创建时间:
     *		2020-04-10 11:31:11
     *	作者:
     *		Excious
     **/
    StuController::StuController(IStuDao * _pStuDao)
    	:pStuDao(_pStuDao)
    {
    }
    
    /*
     *	功能:
     *		StuController的析构函数
     *	参数:
     *		void
     *	返回值:
     *		无
     *	说明:
     *		释放成员指针p
     *	创建时间:
     *		2020-04-10 17:56:09
     *	作者:
     *		Excious
     **/
    StuController::~StuController()
    {
    	if (this->pStuDao != NULL)
    		delete this->pStuDao;
    }
    
    int StuController::stuAdd(const Stu & _stu) { return this->pStuDao->stuInsert(_stu); }
    int StuController::stuDel(const int _sno) { return this->pStuDao->stuDelete(_sno); }
    int StuController::stuUpd(const int _sno, const Stu & _stu) { return this->pStuDao->stuUpdate(_sno, _stu); }
    int StuController::stuQueBySno(const int _sno, Stu & _res) { return this->pStuDao->stuSelect(_sno, _res); }
    int StuController::stuQueAll(vector<Stu>& _resset) { return this->pStuDao->stuSelectAll(_resset); }
    

    View层

    View层用于展示前端界面,接受用户请求,发送给Controller层进行处理,将处理结果进行展示,与用户进行交互。

    为了让请求指令更加容易理解,我在类中定义了一个枚举类型enum CMD.

    StuView.h文件

    #ifndef STUVIEW_H
    #define STUVIEW_H
    
    #include "StuController.h"
    #include "StuServiceMySQL.h"
    
    class StuView
    {
    public:
    	StuView();
    	~StuView();
    	void run();
    private:
    	enum CMD { CMD_Add, CMD_Del, CMD_Upd, CMD_Que_one, CMD_Que_all, CMD_Exit, CMD_NULL };
    	StuController* pstucon;
    	static string business[6];
    	void initGraph()const;
    	CMD getCMD()const;
    	int execCMD(CMD cmd);
    	int stuViewAdd();
    	int stuViewDel();
    	int stuViewUpd();
    	int stuViewQue_one();
    	int stuViewQue_all();
    	void showQueRes(const Stu& _res)const;
    	void showQueRes(const vector<Stu>& _resset)const;
    };
    
    #endif // !STUVIEW_H
    

    StuView.cpp文件

    #include "pch.h"
    #include "StuView.h"
    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <conio.h>
    
    string StuView::business[6] = { "[1]增加学生", "[2]删除学生", "[3]更新学生", "[4]查询学生", "[5]查询全部", "[0]退出系统" };
    
    /*
     *	功能:
     *		StuView类的缺省构造函数
     *	参数:
     *		void
     *	返回值:
     *		无
     *	说明:
     *		new出Dao层的特定实现,比如这里就用MySQL的实现
     *		如果要修改MySQL的数据表,比如改为从其他表中读取,请到StuServiceMySQL类的缺省构造函数进行修改
     *		如果要修改数据的读取来源,比如改为从Oracle读取,请将new StuServiceMySQL()换成其他实现类对象
     *	创建时间:
     *		2020-04-10 19:52:03
     *	作者:
     *		Excious
     **/
    StuView::StuView()
    	:pstucon(new StuController(new StuServiceMySQL()))
    {
    }
    
    /*
     *	功能:
     *		StuView类的缺省构造函数
     *	参数:
     *		void
     *	返回值:
     *		无
     *	说明:
     *		delete掉成员指针
     *	创建时间:
     *		2020-04-10 20:18:35
     *	作者:
     *		Excious
     **/
    StuView::~StuView()
    {
    	if (this->pstucon != NULL)
    		delete this->pstucon;
    }
    
    /*
     *	功能:
     *		运行学生管理系统
     *	参数:
     *		void
     *	返回值:
     *		void
     *	说明:
     *		设置了控制台的背景色,监听按键信息调用相应函数
     *	创建时间:
     *		2020-04-10 20:13:24
     *	作者:
     *		Excious
     **/
    void StuView::run()
    {
    	string progress("");
    	for (int i = 0; i < 6; ++i)
    	{
    		cout << setw(90) << "正在启动学生管理系统:|";
    		progress += (i ? "██" : "");
    		cout << progress;
    		cout << setw(20 - i * 4) << "|" << endl;
    		Sleep(1000);
    		system("cls");
    	}
    	system("color 9F");
    	this->initGraph();
    
    	CMD cmd;
    	while (cmd = this->getCMD(), cmd != CMD_Exit)
    	{
    		this->execCMD(cmd);
    		Sleep(50);  // 降低CPU占用
    	}
    	system("cls");
    }
    
    /*
     *	功能:
     *		绘制初始主菜单界面
     *	参数:
     *		void
     *	返回值:
     *		void
     *	创建时间:
     *		2020-04-10 22:07:38
     *	作者:
     *		Excious
     **/
    void StuView::initGraph() const
    {
    	cout << setfill(' ') << right << setw(104) << "欢迎来到学生管理系统" << endl;
    	cout << setfill('*') << setw(189) << "" << endl;
    	for (int i = 0; i < sizeof(business) / sizeof(string); ++i)
    	{
    		cout << "****" << setfill(' ') << setw(185) << "****" << endl;
    		cout << left << setw(89) << "****";
    		cout << business[i];
    		cout << right << setw(89) << "****";
    	}
    	cout << "****" << setw(185) << "****" << endl;
    	cout << setfill('*') << setw(189) << "" << endl;
    }
    
    /*
     *	功能:
     *		接收主菜单按键消息,返回相应指令
     *	参数:
     *		void
     *	返回值:
     *		CMD_Exit       退出系统
     *		CMD_Add        增加学生
     *		CMD_Del        删除学生
     *		CMD_Upd        更新学生
     *		CMD_Que_one    查询学生
     *		CMD_Que_all    查询全部
     *		CMD_NULL       无操作
     *	创建时间:
     *		2020-04-10 22:14:33
     *	作者:
     *		Excious
     **/
    StuView::CMD StuView::getCMD() const
    {
    	if (_kbhit())  // 如果有按键消息
    	{
    		switch (_getch())  // 因为可以直接return,就不写break了
    		{
    		case '0':
    			return CMD_Exit;
    		case '1':
    			return CMD_Add;
    		case '2':
    			return CMD_Del;
    		case '3':
    			return CMD_Upd;
    		case '4':
    			return CMD_Que_one;
    		case '5':
    			return CMD_Que_all;
    		default:
    			break;
    		}
    	}
    
    	return CMD_NULL;
    }
    
    /*
     *	功能:
     *		处理前端页面(初始主菜单)的请求
     *	参数:
     *		cmd    in    前端界面得到的请求
     *	返回值:
     *		0     功能正常结束
     *		-1    执行异常结束
     *		-2    预判无效请求
     *	说明:
     *		对于数据的展现还是直接输出来实现的
     *		如果有其他展示要求、结果集要求,可以在特定的case下修改具体展示方式
     *	创建时间:
     *		2020-04-10 23:22:17
     *	作者:
     *		Excious
     **/
    int StuView::execCMD(CMD cmd)
    {
    	// 无操作直接return
    	if (cmd == CMD_NULL)
    	{
    		return 0;
    	}
    
    	system("cls");
    
    	// 执行相应命令
    	int flag = 0;
    	switch (cmd)
    	{
    	case CMD_Add:
    		flag = this->stuViewAdd();
    		break;
    	case CMD_Del:
    		flag = this->stuViewDel();
    		break;
    	case CMD_Upd:
    		flag = this->stuViewUpd();
    		break;
    	case CMD_Que_one:
    		flag = this->stuViewQue_one();
    		break;
    	case CMD_Que_all:
    		flag = this->stuViewQue_all();
    		break;
    	default:
    		break;
    	}
    
    	system("cls");
    	this->initGraph();
    	return flag;
    }
    
    /*
     *	功能:
     *		界面接收增加学生的请求,并发送给成员指针处理,并进行反馈
     *	参数:
     *		void
     *	返回值:
     *		-2    学生已经存在
     *		-1    增加学生异常
     *		0     增加学生成功
     *	创建时间:
     *		2020-04-11 01:38:27
     *	作者:
     *		Excious
     **/
    int StuView::stuViewAdd()
    {
    	HWND hwnd = GetConsoleWindow();  // 获取控制台窗口句柄
    	int _sno;
    	string _sname;
    	Stu _res;
    
    	cout << "请输入要增加的学生的学号和姓名(以空格分开):";
    	cin >> _sno >> _sname;
    	if (!this->pstucon->stuQueBySno(_sno, _res))
    	{
    		MessageBox(hwnd, L"该学号已被使用!", L"提示", MB_ICONERROR | MB_OK);
    		return -2;
    	}
    	if (this->pstucon->stuAdd(Stu(_sno, _sname)))
    	{
    		MessageBox(hwnd, L"增加学生信息失败!", L"提示", MB_ICONERROR | MB_OK);
    		return -1;
    	}
    	MessageBox(hwnd, L"增加学生信息成功!", L"提示", MB_ICONINFORMATION | MB_OK);
    	return 0;
    }
    
    /*
     *	功能:
     *		界面接收删除学生的请求,并发送给成员指针处理,并进行反馈
     *	参数:
     *		void
     *	返回值:
     *		-2    不存在的学生
     *		-1    删除学生异常
     *		0     删除学生成功
     *	创建时间:
     *		2020-04-11 01:45:18
     *	作者:
     *		Excious
     **/
    int StuView::stuViewDel()
    {
    	HWND hwnd = GetConsoleWindow();  // 获取控制台窗口句柄
    	int _sno;
    	Stu _res;
    
    	cout << "请输入要删除的学生的学号:";
    	cin >> _sno;
    	if (this->pstucon->stuQueBySno(_sno, _res))
    	{
    		MessageBox(hwnd, L"不存在该学生!", L"提示", MB_ICONERROR | MB_OK);
    		return -2;
    	}
    	if (this->pstucon->stuDel(_sno))
    	{
    		MessageBox(hwnd, L"删除学生信息失败!", L"提示", MB_ICONERROR | MB_OK);
    		return -1;
    	}
    	MessageBox(hwnd, L"删除学生信息成功!", L"提示", MB_ICONINFORMATION | MB_OK);
    	return 0;
    }
    
    /*
     *	功能:
     *		界面接收更新学生的请求,并发送给成员指针处理,并进行反馈
     *	参数:
     *		void
     *	返回值:
     *		-2    不存在的学生
     *		-1    更新学生异常
     *		0     更新学生成功
     *	创建时间:
     *		2020-04-11 01:48:09
     *	作者:
     *		Excious
     **/
    int StuView::stuViewUpd()
    {
    	HWND hwnd = GetConsoleWindow();  // 获取控制台窗口句柄
    	int _sno;
    	int _sno_2;
    	string _sname;
    	Stu _res;
    
    	cout << "请输入要更新的学生的学号、更新后学生的学号和姓名(以空格分开三者):";
    	cin >> _sno >> _sno_2 >> _sname;
    	if (this->pstucon->stuQueBySno(_sno, _res))
    	{
    		MessageBox(hwnd, L"不存在该学生!", L"提示", MB_ICONERROR | MB_OK);
    		return -2;
    	}
    	if (this->pstucon->stuUpd(_sno, Stu(_sno_2, _sname)))
    	{
    		MessageBox(hwnd, L"更新学生信息失败!", L"提示", MB_ICONERROR | MB_OK);
    		return -1;
    	}
    	MessageBox(hwnd, L"更新学生信息成功!", L"提示", MB_ICONINFORMATION | MB_OK);
    	return 0;
    }
    
    /*
     *	功能:
     *		界面接收查询学生的请求,并发送给成员指针处理,并进行反馈
     *	参数:
     *		void
     *	返回值:
     *		-1    查询学生异常 / 不存在的学生
     *		0     查询学生成功
     *	创建时间:
     *		2020-04-11 01:52:13
     *	作者:
     *		Excious
     **/
    int StuView::stuViewQue_one()
    {
    	HWND hwnd = GetConsoleWindow();  // 获取控制台窗口句柄
    	int _sno;
    	Stu _res;
    
    	cout << "请输入要查询的学生的学号:";
    	cin >> _sno;
    	system("cls");
    	if (this->pstucon->stuQueBySno(_sno, _res))
    	{
    		MessageBox(hwnd, L"查询学生信息失败(查询异常或不存在该学生)!", L"提示", MB_ICONERROR | MB_OK);
    		return -1;
    	}
    	MessageBox(hwnd, L"查询学生信息成功!\n点击确定后查看具体信息", L"提示", MB_ICONINFORMATION | MB_OK);
    	this->showQueRes(_res);
    	return 0;
    }
    
    /*
     *	功能:
     *		界面接收查询所有学生的请求,并发送给成员指针处理,并进行反馈
     *	参数:
     *		void
     *	返回值:
     *		-1      查询全部学生异常
     *		>=0     查询全部学生成功,并返回结果集的记录数
     *	创建时间:
     *		2020-04-11 01:52:13
     *	作者:
     *		Excious
     **/
    int StuView::stuViewQue_all()
    {
    	HWND hwnd = GetConsoleWindow();  // 获取控制台窗口句柄
    	vector<Stu> _resset;
    
    	if (this->pstucon->stuQueAll(_resset) < 0)
    	{
    		MessageBox(hwnd, L"查询学生信息失败(查询异常)!", L"提示", MB_ICONERROR | MB_OK);
    		return -1;
    	}
    	MessageBox(hwnd, L"查询学生信息成功!\n点击确定后查看具体信息", L"提示", MB_ICONINFORMATION | MB_OK);
    	this->showQueRes(_resset);
    	return _resset.size();
    }
    
    /*
     *	功能:
     *		显示查询单个学生的输出结果
     *	参数:
     *		_res    in    查询到的学生
     *	返回值:
     *		void
     *	说明:
     *		展现方式是在控制台上进行输出,如果有需要修改展现方式,请在此函数内进行修改
     *	创建时间:
     *		2020-04-11 00:14:15
     *	作者:
     *		Excious
     **/
    void StuView::showQueRes(const Stu& _res) const
    {
    	cout << setfill(' ') << right << setw(74) << "+" << setfill('-') << setw(17) << "+" << setw(25) << "+" << endl;
    	cout << setfill(' ') << setw(74) << "|" << setw(17) << "学号 |" << setw(25) << "姓名 |" << endl;
    	cout << setw(74) << "+" << setfill('-') << setw(17) << "+" << setw(25) << "+" << endl;
    	cout << setfill(' ') << setw(74) << "|" << setfill(' ') << setw(15) << _res.getSno() << " |" << setw(23) << _res.getSname() << " |" << endl;
    	cout << setw(74) << "+" << setfill('-') << setw(17) << "+" << setw(25) << "+" << endl;
    	cout << endl;
    	cout << setfill(' ') << setw(104) << "按下任意键返回主菜单" << endl;
    	_getch();
    }
    
    /*
     *	功能:
     *		显示查询全部学生的输出结果
     *	参数:
     *		_resset    in    查询到的学生的集合
     *	返回值:
     *		void
     *	说明:
     *		展现方式是在控制台上进行输出,如果有需要修改展现方式,请在此函数内进行修改
     *	创建时间:
     *		2020-04-11 00:17:23
     *	作者:
     *		Excious
     **/
    void StuView::showQueRes(const vector<Stu>& _resset) const
    {
    	cout << setfill(' ') << right << setw(74) << "+" << setfill('-') << setw(17) << "+" << setw(25) << "+" << endl;
    	cout << setfill(' ') << setw(74) << "|" << setw(17) << "学号 |" << setw(25) << "姓名 |" << endl;
    	cout << setw(74) << "+" << setfill('-') << setw(17) << "+" << setw(25) << "+" << endl;
    	for (vector<Stu>::const_iterator it = _resset.begin(); it != _resset.end(); ++it)
    	{
    		cout << setfill(' ') << setw(74) << "|" << setw(15) << it->getSno() << " |" << setw(23) << it->getSname() << " |" << endl;
    	}
    	cout << setw(74) << "+" << setfill('-') << setw(17) << "+" << setw(25) << "+" << endl;
    	cout << endl;
    	cout << setfill(' ') << setw(104) << "按下任意键返回主菜单" << endl;
    	_getch();
    	system("cls");
    	this->initGraph();
    }
    

    主程序

    main.cpp文件

    #include "pch.h"
    
    #include <iostream>
    #include "StuView.h"
    
    using namespace std;
    
    int main()
    {
    	StuView* sys = new StuView();
    	Sleep(1000);
    	sys->run();
    
    	delete sys;
    	return 0;
    }
    

    测试环境

    1. 将MySQL给C提供的API引入到项目中(方法可以参考上次作业)
    2. 主机为loaclhost、端口号为3306的MySQL数据库中,有一个用户名为tester、密码为test的用户,在该数据库中有一个字符集为utf8、排序规则为utf8_general_cicpp_homework数据库,此数据库下有一个stu_info表,初始数据如下图所示:
      初始数据
    3. 控制台调整至全屏状态,屏幕宽度为189,即一行可以容纳最多189个英文字符

    测试流程

    测试流程如下:

    正常测试
    非法测试
    启动程序
    查询全部初始数据
    查询学生(成功)
    更新学生(成功)
    删除学生(成功)
    增加学生(成功)
    增加学生(失败)
    删除学生(失败)
    更新学生(失败)
    查询学生(失败)
    查询全部最终数据
    退出程序

    测试效果

    下面用gif来展示具体效果
    Tips:在gif的右下角有按键显示,可以观察程序运行时的按键消息

    1. 启动程序
      1
    2. 查询全部初始数据
      2
    3. 查询一个已经存在的学生
      3
    4. 更新一个已经存在的学生
      4
    5. 删除一个已经存在的学生
      5
    6. 增加一个不存在的学生
      6
    7. 增加一个学号已经存在的学生
      7
    8. 删除一个不存在的学生
      8
    9. 更新一个不存在的学生
      9
    10. 查询一个不存在的学生
      10
    11. 查询全部最终数据
      11
    12. 退出程序
      这里本来可以实现按完直接退出程序的,但是我使用VS2017创建的“控制台应用程序”,包含了pch.h文件。如果创建空项目可以实现直接退出,自动关闭控制台窗口。
      12

    有待完善之处

    程序在以下方面还有待完善

    • 因为用户有可能无意中在输入时给出了超出数量的输入,因此很有可能导致下一次操作时出现一些意料之外的问题。

      应该是可以通过清空输入区缓存来实现的,但是VS2017中cin.clear()cin.sync()fflush(stdin)等方法均无效,暂时也没有找到容易实现、安全稳定的清空方法,可能实现出来会有一点点麻烦,以后再修改吧。

      另外一种方法就是换成图形化界面,用成熟的输入控件去实现接收输入。

    • 控制台需要手动调整至全屏,程序界面不能自适应控制台窗口大小,在非全屏状态下界面的展示很混乱。

    项目打包链接

    本项目的代码文件、测试视频打包到了百度云

    展开全文
  • 在选择商城系统的时候要注意系统功能的完整性,如果完整还要商家进行二次开发,也会相对应的耗费掉商家的时间和资金资源,商城系统的开发早已不再是新鲜事,但是对于想要搭建网上商城的企业以和商家来说,对于商城...
  • Linux 不属于任何一 家公司或个人,任何人都可以免费取得甚至修改它源代码(source code)。Linux 上大部 分软件都是由 GNU倡导发展起来,所以软件通常都会在附着 GNU Public License(GPL) 情况下被自由...
  • STCMS 音乐系统 v2.7.rar

    2019-07-05 07:33:48
    之所以要生产缓存文件,因为这些是很多网页都需要列出的信息,如果每次都访问数据库,那么太多查询会降低系统的访问速度。而这些数据库又是常常更新,所以建立合理缓存十分又必要。 2、优化前台模版。很多...
  • 申请课程,如果学生还不属于某课程,可提交该课程申请表。 查看提问,学生提出问题后,可以查看该为题回答情况。 查看参与提问,学生参与了某些问题讨论,可以查看所有参与提问。 2 教师端功能 查看未回答...
  • 资产评估管理系统 C#

    2009-07-15 23:12:09
    系统属于中小型数据库系统,可以对中小型企业固定资产进行评估,由基本信息管理、固定资产管理、数据维护管理、系统维护管理、系统辅助工具等模块组成。由于操作人员计算机知识有限,因此要求系统具有良好人...
  • 完全独立管理**台,买断式使用,需要租用任何服务器,您可以自由将**台安装在您希望任何地方,完全打破了传统服务器租用模式和繁琐续费流程,是真正属于您自己销售管理**台。 18、数据库维护安全方便...
  • 另外需要提醒朋友们注意的的是,该系统专门为行业用户设计的,因此功能设置相对个人留言系统比较强大而独特。在首次使用时,您可能会遇到因为熟悉,而感觉设置选项过多情况。实际上系统在按照您的的需求,完成配置...
  • 宏昕医院管理软件,医院收费系统

    热门讨论 2011-04-12 10:16:59
    系统对权限分配采用等级继承机制控制,即不仅可以对人员分配权限,也可以对组织级即部门或科室级(以下简称科室)分配权限,只要属于某科室下人员都具有与该科室同等资格权限,如果科室下某个人员要比同一科室...
  • 2、功能的观点 操作系统是一个计算机资源管理系统,它负责计算机系统的全部资源的分配、控制、调度和回收。 3、用户的观点 操作系统是计算机与用户之间的接口,用户通过这种接口使用计算机。 4、软件的观点 操作系统...
  • 由于可避免地受到了智能卡内微处理器芯片性能及内存容量影响,因此,COS在很大程度上不同于我们通常所能见到微机上操作系统(例如DOS、UNIX等)。  首先,COS是一个专用系统而不是通用系统。即:一种COS...
  • 分类管理:增加或删除相关频道,相关频道不同于信息分类,它是一个单页面频道,用于开设诸如公司简介、联系我们这样页面,这些页面不属于任何分类,而是单独页面   四、信息采集 网站后台自带采集功能,...
  • 围绕这一课题,多年来有众多设计方案来实现这一功能,随着数字技术、软件编程的发展和进步,实现这一功能的新的设计方案更是层出不穷。就目前而言,在这一方面,比较普遍使用而又技术先进的主要是以CPLD为核心的实现...
  • JVM-SANDBOX属于基于Instrumentation动态编织类AOP框架,通过精心构造了字节码增强逻辑,使得沙箱模块能在违反JDK约束情况下实现对目标应用方法无侵入运行时AOP拦截。 核心原理 事件驱动 在沙箱世界观...
  • 极限网上商店系统属于全自动化、智能全在线方式管理、维护、更新网上商店系统。用这套网店系统,建设网上商店,将不是网络专家专利,通过强大管理后台,您就能非常方便建设、管理、维护、更新您自己...
  • 采购管理系统需求方案介绍报告 开场白: ...合同追溯管理功能有效地解决了现行业务中合同执行状态清晰,过程可追溯和跟踪问题,帮助企业规范和优化了业务流程,避免了采购资金浪费和流失。
  • 实际上,如果量产工具提供这项功能,我们就可能做到。  如果你U盘是其他型号,请下载专用量产工具。先用checkudisk查看U盘ID,类似于Vid_13fe&Pid_1d00,再到网址http://www.linux-usb.org/usb.ids查找对应...
  • 此公测版包含仍在调整中的功能,但我们很快就会陆续发布各种功能的增量补丁,敬请期待。 2. 首次运行时页面载入比较慢属正常现象,待缓存生成后自然就会加快载入速度。 3. 更改后台相关信息后,要手动清除缓存...
  • OK 已知但不属于功能故障BUG 在上传弹出窗口未正常上传而关闭会造成JS无回调参数而报错. 正式封包,比预计发布时间多出4天 默认管理员帐号密码 帐号 admin 密码 3hoocms 近段将开放论坛,请有问题反馈到论坛。有...
  • 什么是VLAN

    2013-10-23 09:59:12
    它并能区分哪个端口属于哪个网段,那么唯一实现能区分方法,就是划分VLAN,使用了VLAN就能区分出某个交换机端口终端是属于哪个网段。  综上,当一个交换机上所有端口中有至少一个端口属于不同网段时候...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 159
精华内容 63
关键字:

以下不属于信息系统功能的是