- 博客(239)
- 资源 (6)
- 收藏
- 关注
原创 7-4 BCD解密
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
2025-04-03 22:26:43
29
原创 7-3 逆序的三位数
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
2025-04-03 22:25:09
23
原创 7-2 然后是几点
有时候人们用四位数字表示一个时间,比如1106表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为530;0 点 30 分表示为030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
2025-04-01 19:14:56
287
原创 qt介绍json数据序列化和反序列化
json格式是一种数据结构,为了使我们更方便读取和解析数据。下面两个例子是qt中json数据序列化和反序列化。
2025-03-26 12:01:59
77
原创 c++介绍 右值引用和移动 语义 一
但是也有情况 const int a;这种情况也是不允许的,这是不可修改的左值。判断左值的方法是可以获得这个表达式的引用或者取地址。大部分情况下能用在赋值运算符等号左边的表达式是左值,能用在等号右侧但不能用在等号左侧是的右值。这里说的左值和右值是指表达式。zh这样编写,我们的编译器不会报错如果我们这么写。这时需要我们自己定义一些构造函数。先了解下左值和右值。
2025-03-24 10:53:32
165
原创 qt 图像后处理的软件一
代码放在我的资源里啦(可编译运行)。想要的私信我只需3.66元 ,失业在家各位客观赏个脸(#^.^#)。这是一个图像后处理软件刚刚,目前功能比较单一,后续会丰富常用的功能。2图像可中心缩放(右上角放大缩小,按钮及滚轮双重可控)。
2025-03-19 22:43:37
286
原创 c++介绍进程和线程区别
进程间通信复杂:由于进程之间相互独立,进程通信需要额外的进制(如管道,消息队列,信号号,信号量,共享内存等)。线程:是进程最小的执行单元,多个线程可以共享资源(如:内存,全局变量,文件句柄),线程是更轻量级的调度单位。线程切换开销较小:线程切换比进程快,因为线程共享进程资源,不需要切换内存空间。进程切换开销大:切换进程时,操作系统要保存和恢复寄存器,内存映射等。独立性:进程之间的资源相互独立,一个进程的崩溃不会影响其他进程。共享进程资源:同一个进程内多个线程可以共享代码段,数据段,堆等。
2025-03-19 15:42:19
225
原创 c++介绍进程间的通信一
进程的数据空间是独立的,私有的,不能相互访问,但是某些情况下进程之间需要通信来实现某些功能和交换数据。3.通知事件:一个进程需要向另一个或者一组进程发送消息,通知它们发生某种事件(如进程退出)。2.共享数据:多个进程要操作共享数据,一个进程对数据修改,别的进程会立即看到。3:消息队列:进程间可以向队列中添加消息,其他进程可以读取队列中的消息。1.数据的传:一个进程需要将它的数据发送给另一个进程。4.进程控制:一个进程需要控制另一个进程的运行。4:共享内存:多个进程可以访问同一块进程空间。
2025-03-19 15:22:33
304
原创 C++ 介绍STL底层一些数据结构
unordermap一般是指无序映射,元素的存储顺序与插入顺序无关,由哈希函数决定。唯一性,集合中不能重复。比红黑树set更快,查找,插入,删除,平均O(1),不能直接修改集合中的元素值,但可以删除后重新插入。这种结构保证了 插入,删除,查找的时间复杂度为O(log n)比普通二叉搜索树更高效。底层也是红黑树,键(Key)作为排序的依据,值(Value)存储在节点上。set<T>是map<T,bool>的简化版,因为它只存储键,没有值。插入,查找时,树自动平衡,保持O(logn)复杂度。
2025-03-18 18:14:18
656
原创 说一说那些年c++面试题 一
1.介绍一下map和set (我:map存放的是键值对,其他的不知道了,set不了解)。5.c++类模版有一个限制类型参数啊,防止崩溃的,介绍一下(我:不知道)。6.介绍一下tcp通信客户端调用的哪几个api函数。2.说一下map和set底层实现(我:好像红黑树,其他不知道);7,tcp客户端向服务端发送数据之前先发送什么(我:不知熬到);最近在面c++,面试官问了四五道题,(线上)完败。3.说一下unorderset(我:不知道)3.说一下底层哈希结构(我:不知道)4.红黑树是有序的吗(我不知道)
2025-03-17 21:57:18
86
原创 解决qt中自定插件加载失败,不显示问题。
这里也要选择6.6.0的版本,我之前一直选择6.8.0的 所以一直加载失败。这个问题断断续续搞了一天多,主要是版本不匹配问题。
2025-03-17 20:49:04
493
原创 qt介绍图表 charts 一
qt chartsj基于Q的Graphics View框架,其核心组件是QChartView和QChart.QChartView是一个显示图表的独立部件,基类为QGraphicsView.QChar类管理图表的序列,图例和轴示意图。绘制一个cos和sin曲线图,效果如下。
2025-03-17 11:43:51
378
原创 Qt之自定义界面组件 一
创建一个基于界面widget工程,在wdiget界面添加一个widget界面,将添加的widget界面的类提升为Tbattery.在Tbattery类中重写painEvent电池电量代码。通过qt中的painter绘图事件绘制一个电池电量图的变化。
2025-03-17 01:41:56
762
原创 Qt面试题介绍二
view视图负责展示模型数据给用户,视图从模型中获取需要显示的信息,通过观察者模式来监听模型的变化,以便在模型数据改变时自动更新.controller控制器,处理用户的输入,控制器接收用户的输入,根据 这些输入执行相应的动作,比如更新模型的状态或者改变视图的呈现方式,控制器作为模型合适视图的协调者,确保模型和视图之间良好的隔离。
2025-03-14 11:21:23
172
原创 Qt介绍面试题一
在图形界面gui应用程序中,事件循环是一个无限循环,等待来自操作 系统中的事件,比如键盘输入,鼠标点击,定时器超时等。事件循环任务主要包括等待事件(从操作系统接收事件),事件过滤(初步处理事件),事件分发(根据目标对象分发事件),事件分发(根据目标对象分发事件),事件处理(响应事件)。Qt父子树节点管理机制:是管理界面组件和其他对象生命周期的机制,这种机制确保了当父对象被销毁时,其所有的子对象也被自动销毁,避免内存泄露,简化对象管理。对象所有权,创建父对象,父对象管理子对象生命周期。
2025-03-14 10:53:47
234
原创 qt介绍信号槽二
Autoconnect 默认值线程相同用DirectConnection,不同用QueueConnection。BlockingQueueConnect 发送信号后发送者线程阻塞,直到槽函数运行完。UniqueConnection 避免重复连接,与其他类型按位或结合使用。DirectConnection 信号发送后直接调用槽函数 线程相同。QueuedConnection 槽函数在接收者的线程事件循环时调用。connect中的第五个参数(信号槽连接方式)
2025-03-14 01:50:19
69
原创 qt介绍信号槽一
信号和槽时qt框架中事件处理的一种机制,qt是基于窗口框架的程序,基于窗口框架额程序都是基于事件的,本质信号对应的就是一个事件,槽对应事件处理的动作。事件 被qt框架捕捉到,也就是发出一个信号,然后对这个事件做后续处理,调用槽函数。自定义信号要求:信号是类的成员函数,返回值void类型,使用signals关键字进行声明,只需声明不需要定义。自定义槽函数,要求:返回值必须是void类型,支持重载,参数个数和信号函数参数个数和类型相同或者少于信号参数个数。标准信号槽,在qt提供的一些标准类中。
2025-03-13 23:21:38
296
原创 c++介绍智能指针 十二(2)
这里people存放了三个person对象,由于person 的成员变量m_partner也是指向Person对象的共享智能指针,接下来这三条语句,peoeple中的第一个元素的m_partner指向了第二个元素中的Person对象,第二个元素的m_partner指向了第三个元素中Person的对象,第三个元素的m_partner指向了第一个元素中的Person对象。在下面这个例子里我们输出share_ptr里封装对象指针,由于share_ptr重载了插入运算符,所以可以直接打印出封装的指针的值。
2025-03-13 22:10:28
746
原创 c++介绍智能指针 十二(1)
如果一个指针指向已经释放的区域,那么这个指针就是一个悬空指针,使用悬空指针会 造成不可预料的结果。使用指针的缺点是需要使用专门的代码对指针维护,当删除,替换时,需要释放不再使用的指针对象, 如果出现异常,提前返回等情况,容易造成内存泄露。如果将容器中的指针替换成unique_ptr,不仅获得接近普通性能的智能指针,还实现了内存资源的自动释放,不会出现意外的内存泄露情况。由于智能指针重载了间接成员运算符和解引用运算符,它们会返回智能指针所包含对象的指针或者引用,可以像使用普通指针一样使用智能指针。
2025-03-13 20:01:08
439
原创 c++介绍指针和引用 十一
float calculate(vector<float> values)这样的函数,给它传递是一个浮点数向量 ,如果按值传递,需要对传入的参数向量进行复制,会带来内存和运算的开销,如果我们使用了引用,省去了复制的一步,性能会得到提升, float calculate(vector<float> &values),但是我们有不想让函数修改这个参数,这时可以在参数前面加上const表示这是一个只读引用 float calculate(const vector<float> &values)。
2025-03-13 11:29:11
140
原创 c++介绍函数指针 十
这种函数的定义方式看上去比较繁琐,我们在函数指针的声明前面加上typedefine,这样ptr就不在是一个变量而是一个类型别名,代表指向这样一个函数的指针类型,为了方便讲typedefine定义的指针类型别名与函数指针区分开来,我们可以将别名用大写字母作为区分。指针代表内存中地址标识符,变量,数组都是存储内存中的数据。在排序函数中传入compare函数指针,这样排序函数就可以通过闯入的指针来判断数值的大小。在c++中我们可以通过重载一个类的函数运算符,来实现函数对象,使用函数对象代替函数指针。
2025-03-13 10:45:55
416
原创 c++介绍运算符重载九
接着我们定义一个名叫LocalPtr的类,它是一个简单的指针包装类,它定义了一个指向Complex类的指针。其实就是将运算符作为一个函数,对函数进行重载。error C2679: 二元“<<”: 没有找到接受“std::vector<int,std::allocator<int>>”类型的右操作数的运算符(或没有可接受的转换)间接引用运算符(->),它的返回值必须是一个指针或者一个对象或者对象的引用,并且这个对象的间接引用也被重载了。这段代码中我们可以看到同样是运算符,它的作用是不同的a=a<<3;
2025-03-12 22:13:35
161
原创 c++介绍线程的屏障 八
arrive将计数器减去传入的n.wait等待本阶段计数器到达为0. arrive_and_wait是arrive和wait一起使用,arrive_and_drop除了将本阶段计数减去n,还将下一阶段 初始计数值减去n.线程屏障提供了一个计数器,每个参与任务的线程完成自己的任务后,计数器减1.而需要同步的线程,屏障计数器可以阻塞,等待计数器为0时,继续执行后面的代码。下面来看下barrier,与latch不同时,当barrier计数器为0时,开始新的一轮计时。而barrirer为多个阶段的计数。
2025-03-12 17:02:11
293
原创 c++介绍异步任务 七
而异步任务是将函数调用交给另外一个线程执行,在异步任务执行的同时,原有线程可以继续执行后续的代码,在需要的时候再去获得函数执行的结果。主函数和Computer函数都设置了两秒的延时,而整个程序执行过程用了两秒,可见主函数和异步函数是并行执行的,除此之外两个线程的id号也不相同。2.推迟策略,当future返回一个对象时,只要用于存储函数指针或者对象以及实参的拷贝,当调用get时会调用它存储的这个函数。1.异步策略时相当于新建一个线程或者使用线程池中的一个线程,在线程中 调用一个函数。
2025-03-12 12:03:33
164
原创 c++介绍信号六
信号量是c++中实现对有限资源访问控制,现成通过信号量获得对资源访问的许可。可用资源大于0,线程可以对资源进行访问,此时计数器减1。当计数器为0时,不可访问资源,线程进入等待。当资源释放时,线程结束等待,对资源进行访问。信号量限制并发访问的数量,互斥量实现对具体数据的同步。release函数将技术值加1这是个原子操作,acquire将计数值减1,如果当前为大于1将减1,如果为0,该函数阻塞。信号量常用于生产者和消费者场景以及资源池应用场景。接下来往一个循环buf读写数据。
2025-03-11 23:03:35
257
原创 c++介绍条件变量
conVar.wait如果不使用第二个参数,容易造成死锁,即接收线程错过通知信号,一直阻塞下去。发送线程发送一个条件变量,接收线程收到后才开始工作。处理完毕后,释放互斥量,完成一次通讯过程。接下来接收线程读取和处理共享数据。数据写完后,释放互斥量,发送通知。接收到条件通后,重新获取互斥量。结束阻塞状态,继续运行。进入等待通知释放互斥量。
2025-03-11 14:47:15
167
原创 c++介绍锁五
在正常情况下,如果没有其他程序的竞争,根据sleep_for函数一个写线程写一次数据所用的时间1s,读线程读一次数据所用的时间为500ms。现在这五个线程对同一个数据进行读写,并通过互斥量锁定同一个资源,每个线程的要间隔大约3s才能读写一次数据,这样程序效率太低了。对于一个线程读取数据时,可以允许其他线程 读取数据,这样对于一个写数据较少,读数据较多的并发场景可以显著提高读写效率。在一个应用中一个线程写数据,多个线程并发的读取数据,那么使用普通的锁会出现什么问题呢?写线程使用独占锁,读线程使用共享锁。
2025-03-11 11:30:42
140
原创 c++介绍锁四
线程1拥有互斥量A,线程2拥有互斥量b,当前程1尝试获取互斥量b时,获取失败,线程1释放互斥量a,此时线程2获取互斥量a成功,线程2再获取互斥量c,拥有所有资源后执行线程2.线程2执行完毕后释放互斥量a,b,c。使用计时锁如果在100ms内为获取到想获取得锁,释放当前拥有得锁,进入下一次循环,这样程序进入到活锁得状态,两个线程不断得释放自己当前拥有得锁,而又得不到想获取得锁。线程1获取mtx1等待获取count_mtx,而线程2获取count_mtx等待获取mtx这样程序永远进入阻塞状态。
2025-03-10 23:20:31
197
原创 c++介绍锁三
void func2()函数中 lock_guard<mutex>lock(mtx);//由于这个互斥量已经在外层函数被锁定,进入阻塞在状态,无法解锁。所以主线程永远进入阻塞状态。解决这个问题可以将recursive_mute替换mutex.让我们来看一个简单的死锁状态。
2025-03-10 21:04:09
258
原创 c++介绍锁二
由于上述加锁,代码的健壮性不是很好,如果遇到异常抛出情况,可能存在互斥量未释放问题。锁主要在两个以上的线程中使用,当多个线程访问共享资源时,我们需要使用锁,开保证共享资源的唯一性。unique_lock更加灵活,可以创建后不锁定,在使用过程中进行锁定。这样只要不在作用域范围内,锁就会释放,可以避免上述问题。当两个线程访问不带锁的共享资源时,如下代码。还有一种计时锁,设定在多少时间内进行锁定。这时我们需要加锁来限制。显然结果是不正确的。
2025-03-10 20:43:11
562
原创 c++介绍锁 一
可以使用一次性分配所有资源方法,即线程一次申请它所需要的所有资源,只有在所有资源都满足情况下才开始执行,否则就释放已经获得的资源重新申请。3.破坏不剥夺条件:如果一个线程申请新的资源时已持有的资源被占用,可以强制释放它已占有的资源。4.使用死锁检测和恢复:系统可以定期检测是否存在死锁,如果检测到死锁,即采取恢复措施,例如,终止某些线程并且释放它们占有资源。: 已获得的资源在未使用完之前,不能被强行剥夺,只能使用完毕后由线程自己释放。:线程已经持有至少一个资源,同时又申请新的资源,而新资源被其他线程占有。
2025-03-10 20:20:09
533
原创 pat甲级1002 A+B for Polynomials
这道题又搞了一个多小时,多项式和为0 的时候没考虑到。另一个卡的时间最长的就是格式上,本想用cout实现,没成功,最后用printf.
2025-03-03 21:59:48
270
原创 pat 甲级 1001 A+B Format
这题做了一个小时主要卡在题意理解错误,第二写代码时考虑不到位。蓝色部分字体我理解成了分成三组,而题目意思是,每三个数字分成一组。后面卡到测试点2和8了 是因为我在第一个if里输出了strSum[0],没有考虑到后面对else内容的影响。
2025-03-03 19:57:36
215
原创 Qt之数据库操作三
主要介绍qt框架中对数据库的增加,删除和修改功能。tdialogdata.cpp中代码。MainWindow.cpp中的代。tdialogdata.h中代码。MainWindow.h中的代码。
2025-02-01 17:50:02
426
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人