网上购书系统二次开发

项目来源:

大一下学期同学C++大作业项目,做的是一个网上购书系统开发,功能如下

  • 书籍信息显示
  • 客户信息显示
  • 选购书籍
  • 结算总额
  • 订单显示
  • 使用说明
  • 退出系统

页面端


项目文件结构


 

 功能测试


经测试,原项目系统流程图大致如下


 

功能结构图如下

 

 


 

经测试及阅读源代码,原项目的优点如下:

  • 采用指针链式结构存储信息,使得信息的查询速度得到大的提升,以及便于修改信息
  • 源代码中异常机制使用恰当,保证了程序正常运作

 原项目的缺点如下:

  • 所有的程序块放在了一个cpp,代码的可读性差,不符合现代开发要求,不利于后期的维护
  • 项目使用了文件存储,而用户信息、书本信息等数据往往是大量的,文件存储在存储少量数据时有优势,当数据量很大时应改用数据库存储
  • 项目的ui界面存在问题,当一个功能完成后,不会将原有的操作信息清除

 

针对上述问题改进后

项目结构图


 

 

 

 数据交互


 

功能结构图

 

 

 


 

改进后的优点:

  • 系统的可维护性高,后续程序出现问题或者新增功能时,只需要修改对应的cpp或者新增cpp文件
  • 数据存储在数据库里面,数据的读写更为方便,大量数据可以统一管理
  • 代码的重复率降低,提高了代码的可读性

总结:

软件工程的逆向开发,可以帮助我们从别人的项目中学习到不同的开发思想与技术,对于项目的优点,我们可以进行学习与使用;

对于项目的不足之处,我们可以尝试进行改变源代码,再对比修改后的效果,验证自己的方法是否更为合适,以此加强开发能力。


 

本文转载于网络 如有侵权请联系删除

相关文章

  • 锁定和并发控制(一)

    任何多进程系统的一个重要特征是并发控制,即防止不同进程同时更改特定数据元素的能力,从而导致损坏。提供了一个锁管理系统。本文提供了一个概述。此外,%Persistent类提供了一种控制对象并发访问的方法,即%OpenId()的并发参数和该类的其他方法。这些方法最终使用本文讨论的ObjectScriptLOCK命令。所有持久对象都继承这些方法。同样,系统会自动对INSERT、UPDATE和DELETE操作执行锁定(除非指定%NOLOCK关键字)。%Persistent类还提供方法%GetLock()、%ReleaseLock()、%LockId()、%UnlockId()、%LockExtent()和%UnlockExtent()。介绍基本的锁定机制是LOCK命令。此命令的目的是延迟一个进程中的活动,直到另一个进程发出可以继续进行的信号。锁本身并不能阻止活动行为。锁定仅按约定起作用:它要求相互竞争的进程都使用相同的锁定名称实现锁定。例如,下面描述了一个常见的场景:进程A发出LOCK命令,创建一个锁(默认情况下,一个独占锁)。通常,进程A然后对global中的节点进行更改。详细信息是特定于应

  • 4.Kafka消费者详解

    一、消费者和消费者群组在Kafka中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响。Kafka之所以要引入消费者群组这个概念是因为Kafka消费者经常会做一些高延迟的操作,比如把数据写到数据库或HDFS,或者进行耗时的计算,在这些情况下,单个消费者无法跟上数据生成的速度。此时可以增加更多的消费者,让它们分担负载,分别处理部分分区的消息,这就是Kafka实现横向伸缩的主要手段。需要注意的是:同一个分区只能被同一个消费者群组里面的一个消费者读取,不可能存在同一个分区被同一个消费者群里多个消费者共同读取的情况,如图:可以看到即便消费者Consumer5空闲了,但是也不会去读取任何一个分区的数据,这同时也提醒我们在使用时应该合理设置消费者的数量,以免造成闲置和额外开销。二、分区再均衡因为群组里的消费者共同读取主题的分区,所以当一个消费者被关闭或发生崩溃时,它就离开了群组,原本由它读取的分区将由群组里的其他消费者来读取。同时在主题发生变化时,比如添加了新的分区,也会发生分区与消费者的重新分配,分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均

  • 并发编程之CAS

    引入CAS(compareAndSwap)的原因CAS即compareAndSwap(比较和交换),引入CAS的主要原因是解决锁带来的性能影响,我们知道在Java中,为了保证变量的原子性,Java提供了一些锁机制,比如synchronized,Lock等,锁是能够保证变量的原子性,其原理是阻塞线程,当某一个线程正在执行任务时,如果任务加了锁,那么其他线程进入任务时会被阻塞,这样会导致性能变得很差,在高并发的场景下时极度不推荐加锁操作的,所以引入了CAS。CAS原理CAS是JDK提供的原子操作类,它提供了硬件级别的隔离,可以使用Unsafe来操作CAS,Unsafe类下提供了compareAndSwap*操作,我们看出compareAndSwap*这些方法都是native(本地方法)。publicfinalnativebooleancompareAndSwapObject(Objectobj,longvalueOffset,Objectexpect,Objectupdate); publicfinalnativebooleancompareAndSwapInt(Objectobj,lo

  • 不得不知道的Golang之sync.Map解读!

    导语 |本文结合源码,分析sync.Map的实现思路和原理,希望为更多感兴趣的开发者提供一些经验和帮助。一、背景项目中遇到了需要使用高并发的map的场景,众所周知golang官方的原生map是不支持并发读写的,直接并发的读写很容易触发panic。 解决的办法有两个: 自己配一把锁(sync.Mutex),或者更加考究一点配一把读写锁(sync.RWMutex)。这种方案简约直接,但是缺点也明显,就是性能不会太高。使用Go语言在2017年发布的Go1.9中正式加入了并发安全的字典类型sync.Map。很显然,方案2是优雅且实用的。但是,为什么官方的sync.Map能够在lockfree的前提下,保证足够高的性能?本文结合源码进行简单的分析。二、核心思想&架构如果要保证并发的安全,最朴素的想法就是使用锁,但是这意味着要把一些并发的操作强制串行化,性能自然就会下降。 事实上,除了使用锁,还有一个办法,也可以达到类似并发安全的目的,就是原子操作(atomic)。sync.Map的设计非常巧妙,充分利用了atmoic和mutex的配合。 (一)核心思想核心原则就是,尽量使用原子操作,最大程度上减

  • C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用

      在我的博客《C#开发BIMFACE系列52CS客户端集成BIMFACE应用的技术方案》中介绍了多种集成BIMFACE到客户端程序中的方案。最后推荐大家使用CefSharp组件与WebView2组件。本篇文章介绍使用CefSharp组件如何集成BIMFACE到客户端程序中。一、CefSharp简介CefSharp是一个围绕ChromiumEmbeddedFramework(CEF)的轻量级.NET包装器。它是用C++/CLI编写的。允许开发者在.NET应用程序中嵌入Chromium。可以在C#或VB或任何其他CLR语言中使用。CefSharp同时提供WPF和WinFormsWeb浏览器控件实现。功能特点免费、开源:https://github.com/cefsharp/CefSharp完善的文档支持JS、C#、WinForm窗体之间相互通讯与调用兼容性较好,支持H5、CSS5、WebGL等支持获取Cookies较全面其他二、CefSharp下载步骤1新建WinForm项目新建一个WinForm窗体应用程序,目标框架选择.NETFramework4.5.2,因为新版本的CefSahrp

  • 【Python】【天池龙珠计划笔记】Python中的异常处理

    异常处理异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。1.Python标准异常总结BaseException:所有异常的基类Exception:常规异常的基类StandardError:所有的内建标准异常的基类ArithmeticError:所有数值计算异常的基类FloatingPointError:浮点计算异常OverflowError:数值运算超出最大限制ZeroDivisionError:除数为零AssertionError:断言语句(assert)失败AttributeError:尝试访问未知的对象属性EOFError:没有内建输入,到达EOF标记EnvironmentError:操作系统异常的基类IOError:输入/输出操作失败OSError:操作系统产生的异常(例如打开一个不存在的文件)WindowsError:系统调用失败ImportError:导入模块失败的时候KeyboardInterrupt:用户中断执行LookupError:无效数据查询的基类IndexError:

  • 腾讯云Terraform应用指南(二)

    摘要上一篇文章中,我们已经成功安装、配置了腾讯云Terraform应用环境,并实践了利用Terraform简单易用的CLI在虚拟网络(VPC)下部署腾讯云服务器(CVM)。以IaC的方式编排云资源,不仅提高了部署速度和效率,还保证了配置的一致性,节约成本。既然是IaC,那就要熟练的掌握应用过程中需要用到的指令,本文及后面的几篇文章将向大家详细介绍TerraformCommands,帮助用户熟悉每一个命令,助力腾讯云Terraform应用。一、TerraformCommandsOverview二、EnvironmentVariables1、日志操作日志是重要的运维信息来源,用户可以通过设置日志类型TF_LOG和日志保存路径TF_LOG_PATH,将详细的日志打印到stderr,以获取调试信息。TF_LOG支持五种可用值,TRACE,DEBUG,INFO,WARN,ERROR,分别代表五种不同的日志级别,其中TRACE表示最详细的日志。//Configlog $exportTF_LOG=Debug $exportTF_LOG_PATH=./terraform.log复制设置日志级别和保存路

  • Oracle RAC学习笔记02-RAC维护工具集

    OracleRAC学习笔记02-RAC维护工具集RAC维护工具集1.节点层2.网络层3.集群层4.应用层本文实验环境: 10.2.0.5Clusterware+RAC 11.2.0.4GI+RAC 通过对比命令的输出,也可大致了解10gRAC到11gRAC发生的变化。1.节点层1)olsnodes olsnodes:列出集群中所有的节点。10g(10.2.0.5):[oracle@oradb28~]$olsnodes-h Usage:olsnodes[-n][-p][-i][<node>|-l][-g][-v] where -nprintnodenumberwiththenodename -pprintprivateinterconnectnamewiththenodename -iprintvirtualIPnamewiththenodename <node>printinformationforthespecifiednode -lprintinformationforthelocalnode -gturnonlogging -vruninverbosemo

  • 手机:指纹识别基本原理图_手机指纹识别的工作原理

    大家好,又见面了,我是你们的朋友全栈君。指纹识别技术作为生物识别技术之一,指纹识别技术是通过取像设备读取指纹图像,然后在用识别软件提取指纹特征数据,最后在进行匹配识别算法得到结果,以确认指纹所有人身份的生物特征识别技术。指纹识别功能具体工作过程(图片引自新浪微博)目前常用的指纹识别种类分别为光学式和电容式,前者通过镜面反射原理来采集指纹图像,并通过相应的数字信号处理器将图像转为数字信号,最后进行验资及结果输出。该种类型主要应用在我们常用的考勤打卡机上。光学式指纹识别技术原理示意图(图片引自新浪微博)而我们手机中所采用的类型则是电容式指纹识别,其将压力感测、电容感测、热感测等传感器集成在一块芯片之中,当指纹按压在芯片表面时会根据指纹波峰与波谷而产生电荷差或温差,形成指纹影响,在通过与指纹库匹配完成识别。电容式指纹识别技术原理示意图(图片引自新浪微博)三种隐藏式指纹识别技术方案(图片引自新浪微博)发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/167246.html原文链接:https://javaforall.cn

  • 计算几何细节梳理&amp;模板

    点击%XZY巨佬 向量的板子 #include<bits/stdc++.h> #defineIinline usingnamespacestd; typedefdoubleDB; structVec{ DBx,y; IVec(){x=y=0;} IVec(DBa){x=a;y=0;} IVec(DBa,DBb){x=a;y=b;} Ifriendistream&operator>>(istream&cin,Vec&a){returncin>>a.x>>a.y;} Ifriendostream&operator<<(ostream&cou,Veca){returncou<<a.x<<''<<a.y;} IVecoperator-(){returnVec(-x,-y);} IVecoperator+(Veca){returnVec(x+a.x,y+a.y);} IVecoperator-(Veca){returnVec(x-a.x,y-a.y);} IVe

  • 记录一次 在公网使用FRP内网穿透开源软件,通过SSH连接内网服务器

    2020.4.3 因为在笔记本虚拟机中搭建环境,公司的电脑用,自己的笔记本也用,想在家用笔记本连接公司内网却连接不上,就想有没有一种工具能在我笔记本上直接连接公司内网服务器。各种百度,于是内网穿透名词出现。 搜索了一下,比较出名的是什么花生壳,啥的。。有一款叫FRP的内网穿透开源软件,其中的一种配置功能可以实现连接远程内网虚拟机,但,条件是需要我有一个云服务器。 什么意思勒? 就是我在家,用我的云服务器做一个跳板,通过登录运行安装FRPS服务的云服务器,就能SSH连接带有FPRC客户端的公司的内网服务器,这原本是不可能的。如图,, 但是在云服务器上安装FRP,执行FRPS服务,本地虚拟机安装FRP执行FRPC服务,就可以通过云服务器远程SSH连接你想要连接的内网 安装部署特别简单(提醒自己记得云服务器端口开放,selinux等) ================ 环境: 1.笔记本虚拟机 CentOS7.6 内网IP:192.168.124.26 2.云服务器 CentOS8.1 公网IP:118.89.x.x ======================== FRP简介:https

  • python 单例模式

    classA:#静态字段和classmethod构成单例模式__v=None@classmethoddefget_instance(cls):ifcls.__v:returncls.__velse:cls.__v=A()returncls.__vobject1=A.get_instance()print(object1)object2=A.get_instance()print(object2)object3=A.get_instance()print(object3)#内存里对象只创建一次,省内存#应用场景:数据库链接池复制

  • Spring容器使用中出现 Access denied for user &#39;Administrator&#39;@&#39;localhost&#39; (using password: YES)

    Accessdeniedforuser'Administrator'@'localhost'(usingpassword:YES)一个问题找原因找了很久,终于找到了 在Spring容器中通过配置 <context:property-placeholderlocation="classpath:/jdbc.properties"/> 调用properties数据源配置文件时出现 Accessdeniedforuser'Administrator'@'localhost'(usingpassword:YES) 错误!!!! Properties配置: Spring基本配置(完成注入):   错误原因:   在系统中也有个username属性,这时系统变量覆盖了Properties中的值,这时取得username的值为系统的用户名Administrator,密码为properties中的password去查询数据库,此时用户名名和密码并不匹配就会报错。在Spring完成注入时是用"${..}" 方式获取值完成注入的

  • Spring源码系列(一)--spring-test

    Spring-test是Spring框架里的测试模块,其中分为两大包,mock和test 1.mock mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 mock包里又分为4个小包,env,http,jndi,web env:与测试环境有关的类 http:包括client和server的http请求和响应的有关类 jndi:全称JavaNamingDirectoryInterface,J2EE的标准之一,所有的J2EE容器都必须提供一个JNDI的服务,具体看:链接 web:对servlet进行封装,模拟请求和响应 2.test  

  • Quartz快速入门

    Quartz快速入门 1.下载地址http://www.quartz-scheduler.org/downloads/ 写此文章时的最新版是2.2.1。   2.解压缩将基本包quartz-2.2.1.jar放到工程中,如果你工程中连log4j都没有的话,那就把日志相关的几个jar包一起放到工程中。   3.配置 创建quartz.properties文件 org.quartz.scheduler.instanceName = MyScheduler---------scheduler的名字,随便起一个名字(还是起个有点意义的名字吧)org.quartz.threadPool.threadCount= 3 --------线程池中最大线程数是3(最多三个job同时执行)org.quartz.scheduler.skipUpdateCheck = true---跳过Quartz的自动更新检查 配置参考:http://quartz-scheduler.org/documentation/quartz-2.

  • vue中粘贴板clipboard的使用方法

    一、npm安装clipboard npminstallclipboard--save复制 二、页面结构 <spanid="copyTarget">{{targetCode}}</span> <spanid="copyBtn":data-clipboard-text="targetCode"data-clipboard-action="copy"data-clipboard-target="#copyTarget"@click="copy">复制</span>复制 targetCode是被复制的文本复制 三、引入Clipboard importClipboardfrom"clipboard";复制 四、copy方法 copy(){//因为此事件不能添加.stop,所以要设置一个开关,500ms后打开开关this.itemIsDisabled=truesetTimeout(()=>{this.itemIsDisabled=false},500)letclipboard=newClipboard('#copyBtn');cl

  • html换行的方法

      1、使用<br> 1<html> 2<body> 3<p> 4春眠不觉晓,<br/>处处闻啼鸟。<br/>夜来风雨声,<br/>花落知多少。 5</p> 6</body> 7</html>复制   2、使用<P> <P>是空白行,一个<P>一行,两个<P>两行。    3、使用<PRE> 如果有了<PRE>……</PRE>,从<PRE>到</PRE>中的内容原来怎么分的行,就怎么分,不加<br> 本文来自博客园,作者:Arthurian,转载请注明原文链接:https://www.cnblogs.com/Arthurian/p/16577770.html 欢迎邮件交流:zhuanxinxin@aliyun.com

  • 天梯题目解答——1012、1430

    1012最大公约数和最小公倍数问题 题目描述Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数;2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所有可能的两个正整数的个数. 输入描述InputDescription 二个正整数x0,y0 输出描述OutputDescription 满足条件的所有可能的两个正整数的个数 样例输入SampleInput 360 样例输出SampleOutput 4 #include<iostream> usingnamespacestd; #defineMAX10000 intLCM(intmin,intmax,intev) { inttemp; while(min!=0) { temp=min; min=max%min; max=temp; } if(max==ev) return1; else return0; } intma

  • adb 常用命令

    1.adb-androiddebugbridge安卓调试桥 2.adbstart-server 3.adbkill-server 4.adbdevices,adbdevices-l(带有详细信息) 5.adb命令基本都在platform-toolsfolder下面 6.adb客户端:所有调用adb服务器的地方,比如输入adb命令的命令行窗口 7.adbservertcp端口5037 8.adbconnect127.0.0.1:xxxx 9.连接androidshell环境:adb[-semulator-5554]shell多于一个device/模拟器时候加上唯一标志符,加上-s参数 10.推出androidshell环境:exit 11.pull命令,从手机设备COPY指定的文件到开发机 adbpulldata/local/tmp/test.txt/Users/tingtwang/Documents 12.push命令,从开发机copy指定文件到设备 adbpush/Users/tingtwang/Documents/test.txtdata/local/tmp 13.adbinsta

  • 2019牛客多校第四场

    2019牛客多校第四场 目前为止打得最爽的一场多校 A.meeting solvedat00:58(+1) 树上有\(k\)个关键点,让你选择一个树上的点,使得这些关键点到这个点的最大距离最小 类似树的直径的做法,找到最远的两个关键点的距离除以二向上取整就好了 B.xor upsolved 你有\(n\)个集合,每个集合有若干个数 若一个集合的任意一个子集异或和为\(x\),称这个集合可以表示\(x\) 给出\(m\)个询问,每次询问\(l\)到\(r\)的这些集合是否都能表示出\(x\) \(1<=n,m<=5e4\) 目前六场多校,考了三次线性基。。。 这次是线性基求交,用线段树维护 #include<bits/stdc++.h> usingnamespacestd; constintN=5e4+10; structBase{ unsigneda[32]; Base(){ memset(a,0,sizeof(a)); } voidinsert(unsignedx){ for(inti=31;~i;--i){ if(x>>i&1){ i

  • 13个java常问面试题

    什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 参考答案 Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚 拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重 写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和 其他特性。 JDK和JRE的区别是什么? 参考答案 Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet 需要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译 器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应 用程序。 ”static关键字是什么意思?”Java中是否可以覆盖(override)一个private或者是 static的方法? 参考答案 “static关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下” 被访问。 Java中static方法不能被覆盖

相关推荐

推荐阅读