自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 收藏
  • 关注

原创 vmware上安装麒麟系统虚拟机

使用centos + 麒麟系统服务器版,安装时要注意在设置软件安装的时候勾选基本开发者工具,不然没法使用yum下载。需要按e进入安全模式,然后查询麒麟系统的官网,可以查询到修改密码需要在linux字段最后添加的命令。输入命令后,CTRL+X进入终端,在终端上使用passwd 用户名,然后输入两边新的密码,然后再重启系统修改密码就完成了。进入虚拟机后,如果没有安装vmware tools 程序没办法全屏,点击虚拟机,然后点击安装vmware tools,然后再次重启,操作系统即可全屏。

2025-03-01 07:19:02 205

原创 C++演示中介模式

上面这段程序可以根据具体业务的不同,在send函数中实现不同的逻辑,或者是别的什么功能。主要是为了放置client对自身的相互引用,然后提供一个类似于工作台的一块空间。上面这段程序中,mediator中的send采取了遍历添加进来的客户端数组,然后判断是不是发送消息的自身,如果不是,就调用其getMsg函数。避免两个模块之间的耦合,使用中介模式解决。

2025-02-15 19:56:20 195

原创 C++实现状态模式

因为context中的change函数中留的是接口函数state,所以如果要添加新的状态,可以直接添加一个CpncreateStateC状态,然后执行这个状态的中相应的操作。最后还有一点,在使用委托的时候,因为是传递this指针,所以就不需要再handle()函数接口中传递智能指针形式了。context 中使用委托将自身传递给state,然后根据状态的不同,调用不同的状态对象,然后执行后面的状态。此文乃录状态模式之学,并附己之心得,以备后日查阅。

2025-01-31 15:29:59 859

原创 C++实现数组的完全二叉树大根堆排序

完全二叉树的下标是连续的,所以可以通过数组然后根据完全二叉树下标之间的关系实现数组二叉树的排序。函数二是替换根节点的数为另一个数,然后实现剩余值的排序。函数一实现对无序的数组进行大根堆排序,

2025-01-29 14:32:54 89

原创 C++实现二叉树

代码由三部分组成,1、声明二叉树结构体 2、二叉树中插入数据 3、中序遍历二叉树数据。

2025-01-28 22:17:20 172

原创 C++排序算法测试用例源数据生成器

创建一个Tools类,使用getVec方法获取一个vector<int> 类型的数组,然后作为源数据输入排序算法中进行测试,可用这组数据和库函数sort的排序结果进行比较,可进行超大数据量的测试来验证自己排序算法的准确性。

2025-01-24 12:30:59 145

原创 C++使用异或找出数组中奇数次出现的数据

现有一个数组,数组中的数成对出现,其中有两个数,奇数次出现。现编写程序,使用异或的方法找出数组中这两个数。

2025-01-24 12:11:07 175

原创 C++使用模板函数运行多个函数

定义函数指针类型,然后使用模板函数,调用函数指针数组映射的实际函数。

2025-01-24 11:15:10 78

原创 C++实现数组的置乱算法

调用std::shuffer函数对数组进行置乱。通过迭代器对vector数组中数字进行排序。

2025-01-23 17:26:55 76

原创 C++中使用回调函数

后续还有各种使用的具体情况,后面会一并梳理。回调函数代码使用结构如下所示。

2025-01-17 14:06:21 118

原创 Python实现纵向等分切割

使用下面代码实现一张长图片的四等分纵向切割。发明python的人真是天才!

2025-01-13 21:59:04 121

原创 使用python生成gif图

使用PyCharm软件,然后pip install imageio。

2025-01-13 21:51:48 138

原创 C++实现银行排队系统

有一些多线程之类的,智能指针、原子变量、没有上锁,因为没有库里面的读写锁,这里考虑到都是读取时间不会改变时间,就没有加锁。这里通过区间内获取随机数的方式取得一个时间间隔,模模拟顾客进入银行办理业务,Menu类中的start()函数中可以设置客流量的频率。练手的代码,有些地方没有处理好,比如程序一开始的时间转换函数,可以使用饿汉单例模式实现,(工具类不会占用很大资源吧)。时间系统使用while循环实现的,sysTime类使用了懒汉单例模式,在菜单类调用中初始化。基本效果已经实现,希望大家帮忙指点指点。

2025-01-07 15:51:02 647

原创 C++中批量线程启动容器中的对象函数

使用容器管理多个类对象,通过函数启动容器中所有类对象的函数。

2025-01-05 16:35:35 266

原创 学生作业完成情况管理程序

因为前面设置Job表的外键时,使用的是CASCADE,所以这里可以实现删除主键,关联的外键信息自动删除。学生表中外键关联班级表,作业成绩表中外键关联学生表。数据库有三张表,分别是班级表,学生表,作业成绩表。网上看到的一个课程设计,正好练练手。

2025-01-05 10:51:01 284

原创 C++多线程编程

因为构造函数中在实现类的初始化,如果在这个过程中将类传递出去,在多线程的情况下,可能会导致别的线程访问一个未初始化完全的类。上面这段代码中类Counter使用类的成员变量mutex来保证线程安全,在increase中设置了一个延时等待,确保在上面这个示例中,延时函数在析构函数之前开始执行,析构完之后还在等待。上面的这段代码实现了一个counter计数类,类中通过锁实现了多个线程访问这段程序时的线程安全,即increase()函数被调用的安全。首先是类的线程安全中,构造函数可能存在的潜在问题。

2025-01-05 10:48:16 296

原创 C++生成随机数

通过如下代码中的函数getRandomNum可得到一个C++生成的随机数。注意要包含头文件random。

2025-01-04 22:07:35 79

原创 字符串格式时间(HH-MM)添加间隔时间后转为HH-MM输出

转换时间代码如下所示。

2025-01-03 17:47:32 266

原创 QT控件之QFrame

然后是minLineWidth(),其含义即中线的宽度,这里也是给出了四种宽度,中线宽度的效果在阴影效果中设置为Raised和Sunken时可以观察,上图中,边框样式为Box时最为清楚看出效果不同。因为这里的QFrame继承自QWidget,所以观察上面代码其可以使用QWidget中的函数。首先是lineWidth() 这里的含义是边框线的宽度,这里给出了四种宽度。然后下面显示的效果就是边框样式和三种阴影样式的组合效果。上面这个文档图展示了边框的各种效果组合起来的效果。文档中给出的使用示例如下图所示。

2025-01-02 15:52:26 335

原创 C++中宏的使用方法

因为size()函数返回的是一个无符号整型,当无符号的和有符号的比较时,有符号的会转换成无符号的,比如这里-1转换为补码形式,即最大值。所以为了避免自己代码中出现这种问题,可以通过宏的方式在宏里面将无符号整型的size()强制转换为有符号的。然后如果定义了PR_DEBUG则执行LOG后面的std::cout,如果没有定义则执行LOG后面没有输出内容,所以在发布软件时,只要去掉PR_DEBUG的定义就实现了内容的关闭输出。分析:宏定义是预处理器指令的一种,通常在编译之前由预处理器执行。

2024-12-31 19:17:05 410

原创 C++通讯录管理系统

网上看到的一个小需求,练练手。

2024-12-28 14:49:41 842

原创 QT调用Sqlite数据库

QT设计UI界面,后台访问数据库,实现数据库数据的增删改查。在代码中使用两个函数,初始化数据库函数,和创建订单函数。在QT的Pro文件中添加sql,然后添加头文件。分别是顾客表,订单详情表,订单表,商品表。添加订单代码函数如下。这里的SQL语句在🔗。

2024-12-26 19:28:39 449

原创 SQL语句练习-3

然后事务使用时还可以ROLLBACK,思想就是事务代码段中添加标记,后面如果条件不满足,则回滚到标记处,即标记前的可以提交,后面的因不满足条件不提交。看了一遍,没理解具体使用场景,这里不与展开了。查阅资料后发现可以通过事务实现(前面跳过的部分,哈哈哈),这里临时加一个需求:使用事务写出顾客购买商品的SQL语句。到这里上面四个需求完成了,但是在做最后一个需求时,突然发现小明购买铅笔的时候,忘记对铅笔的库存数量减5了。然后上面的提交订单,那些用户名,商品数量,商品可再编程语言中通过变量定义,做成动态接口。

2024-12-25 22:56:37 739

原创 SQL语句练习-2

如果右表没有匹配的行,返回Null 右外联结:返回右表中的所有行,以及左表中与右表匹配的行,如果左表没有匹配的行,返回Null 全外联结:返回左表和右表所有的行。因为多个商品可能会对应同一个生产商,如果供应商的相关信息存储在商品中,就会导致商品表中数据的重复。这里测试删除了主表的记录后,从表的记录变为了Null,查了一下,不知道怎么设置为默认值,后面实在用到这个需求再来补上。右键表,进入设计表,点击外键,设置被引用表,即主表为供应商表,这里是vendor,然后选择被引用字段为id。

2024-12-24 03:09:40 570

原创 SQL语句练习

上面这段SQL语句使用了GROUP BY, “因为使用了GROUP BY,就不必指定要计算和估值的每个组,系统会自动完成。观察发现,89这个结果并不符合查找意图,这个是书中的一个知识点,SQL语句中也有运算优先级,AND的优先级大于OR,所以SQL语句应改为下面。也可以根据语文和数学的列顺序编写SQL语句,观察上面的表,语文在第四列,数学在第五列。31、使用SQL语句显示 语文,数学,英语相加的总分数,并显示各个分数的人数。29、使用一条语句返回语文考试人数,语文最高分,语文最低分,语文平均分。

2024-12-21 23:23:56 1190

原创 C++传入const引用参数

如果函数传参使用类引用,去掉const,发现main函数中的showTest(Test(10))编译器报错,因为这种方法传入的是一个右值。传入一个类对象时,如果const 类对象引用,则函数内仅可以调用类中函数后面声明了const的函数,使用const引用可以传入一个类的左值。代码如下,可以尝试在函数里面调用increaseNum函数,发现编译器会报错。

2024-12-13 13:44:57 257

原创 C++中锁的使用

输出结果表明可以实现锁的功能,具体实现通过原子变量atomitic实现,代码中的std::memory_order_acquire功能理解的时候参考了下面UP主的视频。互斥锁的原理是当线程A加锁后,线程B尝试加锁发现被占用,线程B由唤醒状态切换为睡眠状态,当线程A解锁后,会通知内核,内核再通知线程B,线程B再由睡眠状态切换为唤醒状态。锁的实现有三种,互斥锁,自旋锁和原子管理,下面介绍自旋锁:自旋锁没有直接调用的库,需要使用atomic手动实现。代码中将递归锁改为互斥锁后,作为对比。

2024-12-13 13:09:04 288

原创 C++包装器function

【C++(function)可调用对象包装器】 https://www.bilibili.com/video/BV12M4m1X7nQ/?看书的时候发现function没用过,查了下资料,这里记录一下使用方法。typedef重命名?后面实际用到了再补充。首先包含头文件,#include <functional>

2024-12-13 12:07:06 254

原创 C++中thread的右值引用

std::thread 禁用了拷贝构造函数,std::thread& operator = (std::thread&& rhs) noexcept;上面展示了三种std::thread& operator = (std::thread&& rhs) 的使用方法。查阅资料时读了一篇博客,学到了一个以前使用thread时没注意到的点,记录于此。智能指针std::shared_ptr作为形参时,不应使用&传递。std::ref在函数需要传入一个&类型的时候使用。

2024-12-13 10:07:09 174

原创 C++观察者模式Observer

观察者模式使用抽象基类的方法遵循了依赖颠倒原则,同时有新的具体观察者和新的具体主题时都可以进行动态扩展,符合开闭原则。但是观察者模式也存在不方便。比如在界面中使用观察者模式,点击按钮后,关闭原有的图片,显示一张新的图片,这样的两个操作,一个是close(),一个是show(),或者更多的操作,也就是说和抽象观察者中留的接口不同了。还有一个更好的实现方式,委托。观察者模式即一个观察者状态改变后,会通知内部已经注册的观察者对象改变状态,实现状态的改变。

2024-12-07 23:33:05 390

原创 C++的copy构造函数和copy assignment操作符

下面来看看这两种情况。省略时如果没有裸指针,可直接赋值,有裸指针,先声明一个临时指针指向类本身的内存地址,然后然后将类本身的内存地址指向根据传入对象生成的新地址,然后删除临时指针指向的内存地址。结果显示苹果2的颜色随着苹果1颜色的改变而改变了,观察程序输出,是两个类中的智能指针地址相同,指向同一块内存,修改一个对象,会影响另一个对象得到结果。在main函数中测试实例化test1对象,然后通过重载的=运算符实例化test2对象,之后调用test对象的成员函数观察基类的输出,如果不是null,则表明复制成功。

2024-12-05 14:35:25 919

原创 C++备忘录模式

上面这段代码,声明了一个备忘录类,传入要存档的对象,获取其数据,临时存储在private的成员变量中。读档的时候引用传入玩家类,根据需要拷贝原先存储的数据。但是如果这时候需要添加蓝量相关的数据存储,需要修改的代码很多,首先是备忘录类中函数获取的数据要修改。将备忘录类放在玩家类中,可以避免这些接口的声明。这时,如果存档和读档更多的数据比如蓝量,怒气值,经验等,客户端代码不需要修改,仅需要修改玩家类中的代码。场景引入:游戏中的存档,比如打boss之前记录人物的血量等状态。

2024-12-03 14:14:47 420

原创 C++实现工厂模式

在调用数据库时也可以应用抽象工厂模式,比如软件原本使用sqlite数据库,后面可能改为使用MySQL,然后Oracle数据库,但他们都有增删改查等操作,连接的时候就可以使用抽象工厂模式,后面需求改动时就会很灵活。相比于简单工厂模式,工厂模式将工厂变作了抽象基类,根据实例化产品的不同创建不同的具体工厂。简单工厂模式将类的创建封装在类工厂类中,但是如果需要添加新的产品,则需要修改这个工厂类,这样就不符合开放封闭原则了。工厂模式,即根据类的多态性质,根据就输入的判断标志不同,实例化不同的子类。

2024-12-02 10:46:44 358

原创 C++实现单例模式

实现原理为在私有成员函数中声明类的构造函数,这样默认构造函数就不会有了。然后将其设置为static静态成员变量,可使用类::函数名称方式直接调用。饿汉模式为类声明好之后直接初始化,懒汉模式为用的时候判断是否为空指针,如果为空指针则声明。"懒汉模式",注意多线程时可能多次构造,这里使用两次判断加锁解决。饿汉模式,类声明即初始化,无线程安全问题。

2024-12-01 10:20:51 407

原创 C++开放封闭原则

开放封闭原则,即一段运行的程序,需要添加新的功能时,不应该修改原先的代码,此为封闭。同时原程序留有添加新功能的接口,此为开放。程序实现绘制图形APP,同时实现多个图形类。第一段程序中仅有两个图形,后面需求增加新的图形。添加类如下,同时main函数中调用addShap接口,接着调用draw图形接口。下面是一个C++程序示例。

2024-11-30 11:39:32 251

原创 C++的依赖颠倒原则

个人理解,即面向接口编程,即抽象基类做接口,使用这个的时候,不在乎具体怎么实现,使用抽象基类声明,接口部分由派生类具体实现。读下面文章写的一个小例子。

2024-11-28 20:47:52 458

原创 C++之virtual虚函数

但是如果派生类的析构函数并没有进行实质性操作,则不应该声明基类析构函数为虚析构函数(书中给出是类不做基类或不是多态基类的情况下不声明为虚析构函数,我理解是派生类析构函数不准备进行实质性操作时不声明为虚析构函数。如果这个函数是一个虚函数,而不是纯虚函数,则程序会执行基类的该虚函数,完成基类的初始化构造再执行派生类的构造函数,所以如果期望在基类的构造函数可以调用派生类的虚函数实现,则这种方法是行不通的。基类中有一个非虚函数,派生类继承了基类,这时候默认派生类使用基类的这个非虚函数。2024年11月25日。

2024-11-25 12:18:24 406

原创 C++虚函数

所以,编译器必须生成能够在程序运行时选择正确的虚方法的代码,这被称为动态联编,又称为晚期联编。例如,基类对象包含一个指针,该指针指向基类中所有虚函数的地址表。无论类中包含的虚函数是1个还是10个,都只需要在对象中添加1个地址成员,只是表的大小不同而已。根据上面的现象已经可以很好的使用虚函数这个特性了,及想要使用基类指针或引用统一管理派生类对象,同时又需要使用派生类各自独特的实现。观察现象,可以得出,当基类函数前使用虚函数标识后,派生类重写该函数,根据派生类的不同,执行派生类中的代码段。

2024-11-24 19:11:11 578

原创 基类和派生类

一个简单的基类派生类生成。

2024-11-24 15:02:10 91

原创 C++之虚析构函数

使用场景:当使用基类指针指向实例化的派生类对象时,派生类析构函数有对派生类资源的管理,则应在基类析构函数声明时在前面添加virtual声明。否则程序将根据其指针类型,而不是指针指向类型执行析构函数。如果基类析构函数声明时有virtual 则会执行派生类析构函数,如果未使用virtual声明,则仅执行基类析构函数。现有一个基类,一个派生类。程序中使用基类指针指向一个派生类对象。将基类析构函数的virtual声明删除,用作对比测试。基类未声明为虚析构函数时程序输出如下。基类声明为虚析构函数时程序输出如下。

2024-11-24 09:00:29 236

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除