
C/C++
文章平均质量分 56
C++
anieoo
这个作者很懒,什么都没留下…
展开
-
刷题时经常面临的向上和向下取整
如果求m + n的平均数向上取整即 a = m + n b = 2;如果求m + n的平均数,即a = m + n, b = 2。原创 2022-08-22 15:17:39 · 503 阅读 · 0 评论 -
一些的简单的io小程序
代码】一个简单的统计文件大小程序。原创 2022-08-10 21:51:47 · 2843 阅读 · 0 评论 -
15.线程同步的几种方法
线程同步通常是出现在多线程环境下的问题,对于多个线程同时访问的共享内存中的变量,如果不进行保护,就会导致一些列数据出错问题。以下图为例: 假设线程A在第一次读取变量的值为10,每次写周期会将变量A加5,理论上当线程A完成其任务的时候,变量的值变为20,但是由于线程B是在两个写周期间读取的变量,结果为15,因此会导致数据出错。 互斥锁,是进行线程同步的一种方式。顾名思义,当线程A对共享内存进行访问的时候,对其进行上锁,在访问结束后解锁。在加锁期间,如果线程B想要申请访问共享内存资源原创 2022-06-24 20:11:51 · 2127 阅读 · 0 评论 -
14.linux线程
线程是参与系统调度的最小单位,它被包含在进程之中, 是进程中的实际运行单位。一个进程中可以创建多个线程, 多个线程实现并发运行, 每个线程执行不同的任务。 线程是程序最基本的运行单位,而进程不能运行, 真正运行的是进程中的线程。 当启动应用程序后,系统就创建了一个进程,可以认为进程仅仅是一个容器, 它包含了线程运行所需的数据结构、环境变量等信息。线程不单独存在、而是包含在进程中;(1)线程是参与系统调度的基本单位;(2)可并发执行。同一进程的多个线程之间可并发执行,在宏观上实现同时运行的效原创 2022-06-23 19:19:25 · 149 阅读 · 0 评论 -
13.linux进程基础
关于进程和线程的基本概念在操作系统中早已学过,可以概括为一下几点:根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程原创 2022-06-22 20:06:47 · 2412 阅读 · 0 评论 -
12.信号基础
信号是事件发生时对进程的通知机制,也可以把它称为软件中断。信号的目的是用来通信的。信号本质上是 int 类型数字编号,信号有如下宏定义:以下是一些常用信号的编号、描述以及进程收到该信号时默认进行的操作。 signal()函数是 Linux 系统下设置信号处理方式最简单的接口, 可将信号的处理方式设置为捕获信号、 忽略信号以及系统默认操作, 此函数原型如下所示:函数测试: 通过 signal()函数将 SIGINT信号绑定到了一个用户自定的处理函数上sig_ha原创 2022-06-21 19:34:57 · 373 阅读 · 0 评论 -
11.字符串处理
目录一、字符串输出二、字符串输入gets()与 scanf()的区别三、字符串长度 sizeof()和strlen()的区别 四、字符串拼接 五、字符串拷贝六、内存填充 七、字符串比较 八、 字符串查找九、字符串转整形 ①puts函数puts()函数用来向标准输出设备(屏幕、显示器)输出字符串并自行换行。 把字符串输出到标准输出设备,将' \0 '转换为换行符' \n '。puts函数测试:运行结果如下:② putchar 函数 putchar()函数可以把参数 c 指定的字符(原创 2022-06-20 20:37:39 · 717 阅读 · 0 评论 -
9.标准I/O库
标准 I/O 和文件 I/O 都是 C 语言函数,但是标准 I/O 是标准 C 库函数,而文件 I/O 则是 Linux系统调用;⚫ 标准 I/O 是由文件 I/O 封装而来,标准 I/O 内部实际上是调用文件 I/O 来完成实际操作的;⚫ 可移植性:标准 I/O 相比于文件 I/O 具有更好的可移植性,通常对于不同的操作系统,其内核向应用层提供的系统调用往往都是不同,譬如系统调用的定义、功能、参数列表、返回值等往往都是不一样的;而对于标准 I/O 来说,由于很多操作系统都实现了标准 I/O 库,标准原创 2022-06-19 15:23:57 · 397 阅读 · 0 评论 -
6.进程操作,运行状态
① ps :列出系统中当前运行的那些进程用法实例如下,在终端输入ps -ef:配合命令grep实现查找进程过滤,比如ps -ef | grep init图中参数说明如下:② top :实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。 ③ kill :向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。使用方法:kill -[number] -[PID],number表示要发送的信号,PID表示要发送给的目标进程的进程号原创 2022-06-16 11:20:36 · 406 阅读 · 0 评论 -
周赛遇到的数据处理,将double转化为string并保留2位小数
string doubleToString(const double &val) { char* chCode; chCode = new char[20]; sprintf(chCode, "%.2lf", val); string str(chCode); delete[]chCode; return str; }原创 2022-05-29 14:45:50 · 672 阅读 · 0 评论 -
scanf处理带有空格的输入方法
scanf函数处理输入的时候遇到空格会结束。利用scanf("%[^\n]",str); 可以读取一行字符串,直到遇到换行符\n结束经过此方法读取字符串以后,会有一个换行符号\n存在输入缓冲区中,因此需要用scanf("%*c”); 清理输入缓冲区中第一个字符,也就是上次遗留下的\n将两个式子组合在一起就是:scanf("%[^\n]%*c",str);...原创 2022-05-15 15:08:17 · 6632 阅读 · 1 评论 -
宏定义min_t
在标准C中使用以下的宏会产生副作用:#define min_t(x,y) ((x) < (y)? (x) : (y))例如代码:min(++ia,++ib),将宏展开就是((++ia) < (++ib) ? (++ia) : (++ib))会导致传入的参数ia和ib增加两次.正确的写法应该如下:#define min_t(x,y)({ \ const typeof(x) __x = (x); \ const typeof(y) __y = (y原创 2022-05-04 20:00:52 · 1468 阅读 · 0 评论 -
顺序表的定义(静态、动态、增加、删除)
顺序表的特点:随机访问,可以在O(1)时间内找到第i个元素。 存储密度高,每个节点只存储数据元素 拓展容量不方便 插入、删除操作不方便,需要移动大量元素一、顺序表的静态创建利用静态分配的方式定义一个顺序表#define Maxsize 20 //宏定义静态分配的最大长度为20typedef struct sq{ int data[Maxsize]; //静态数组存放元素 int length; //定义当前长度}SqList;...原创 2022-03-28 12:24:57 · 598 阅读 · 0 评论 -
自定义sort排序
积累最近用到的一个sort排序string类的用法 sort(words.begin(),words.end(),[](const string& a,const string& b){ return a.size()==b.size()?a>b:a.size()<b.size(); });①当a和b的长度相同时,挨个比较string里的字符,知道遇到一个不相同的字符,将字符对应ascll码大的放前面②当a和b的长度不想同时,长度小的放前原创 2022-03-17 16:03:45 · 249 阅读 · 0 评论 -
算法题常用STL笔记
vector(变长数组),倍增的思想,支持比较运算(按字典序) 定义:: vector <int> a; 定义:一个vector数组a vector <int> a(10); 定义:一个长度为10的vector数组a vector <int> a(10,3); 定义:一个长度为10的vector数组a,并且所有元素都为3 常用函数:: size(); 返回元素个数 empty(...原创 2022-03-04 17:26:21 · 201 阅读 · 0 评论 -
C++pair容器简单用法
一、pair容器pair是C++中一种模板类型。它可以将两个数据类型绑定在一起,方便关联数据的输出与提取。存储的值可以是基本数据类型也可以是自定义数据类型。二、用法1、定义和初始化pair<int, int> p1(1, 2); //初始化并赋初值pair<int, int> p2(p1); //利用拷贝构造初始化pair<int, float> p3(1, 1.5);pair<int, int> p4; //默认初始化为0原创 2022-02-27 19:10:51 · 3764 阅读 · 0 评论 -
c++算法头文件
万能头文件#include <bits/stdc++.h> using namespace std; 完整头文件 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <time.h> #include <algorithm> #include <iostr原创 2022-02-24 17:24:03 · 2070 阅读 · 0 评论 -
十大经典排序算法(动图演示)
十大经典排序算法(动图演示) - 一像素 - 博客园转载 2022-02-20 20:07:51 · 170 阅读 · 0 评论 -
C++基类指针释放无法调用派生类析构代码
在使用C++多态时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。例如 :#include <iostream>using namespace std;#include <string>class Animal {public: Animal() { cout << "Animal 构造函数调用!" << endl; } virtual void Speak() = 0; //析构函数加上virtu原创 2022-02-18 12:03:49 · 1267 阅读 · 3 评论 -
C++派生类与继承
继承和派生其实都是一回事,只是说法不同罢了。如:子类继承了父类,父类派生了子类。那么什么是继承呢首先,如上图所示是一个动物种类区分图。猫和狗都属于动物这一种类,而猫又可以细分为加菲猫、布偶猫等种类。我们发现这些细分出来的单体在拥有上一级别的共性之外,还有各自的共性。比如加菲猫和布偶猫体型、毛发品质不同,但他们都属于猫类。 在编写代码的时候类与类之间也一样,子类拥有上一级类的共性,又拥有自己的特性!这个时候就可以利用继承的特性减少代...原创 2022-02-17 19:46:49 · 3756 阅读 · 0 评论 -
常用c语言函数
1、计算最大值和最小值#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) ) 2、将一个字母转换为大写#define CAPITAL( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) ) 3、获取数组元素个数#define MY_SIZE( x..原创 2022-01-25 19:49:48 · 483 阅读 · 0 评论 -
C/C++ typedef的理解 typedef void (*pfunc)(int);
C/C++ typedef的理解 typedef void (*pfunc)(int); 初学时: typedef int XXX,给类型int取一个别名xxx,嗯我懂了,EZ。 一段时间过后: typedef void (*pfunc)(int); ???将void取别名(*p...转载 2022-01-30 20:51:12 · 1317 阅读 · 1 评论 -
__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的错误。
下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的错误。__interrupt double compute_area (double radius){double area = PI * radius * radius;printf(" Area = %f", area);return area;}答案:1、ISR不能有返回值,必须用void;2、ISR不能传递参数,必须用void;3、ISR应该是短而高效的,在许多的处理器/原创 2022-02-03 20:09:11 · 4761 阅读 · 0 评论 -
C语言中float如何存储
类型 数码 阶码 尾数 float 1 8 23 double 1 11 52 总位数 32 64 偏移值 127 1023 Float如何存储N (10) = 123.456,换算成二进制表示:N (2) = 1111011. 01110100101111001= 1. 11101101110100101111001(...) * 2^6那么E – 127 = 6;...转载 2021-04-25 09:53:46 · 279 阅读 · 0 评论 -
C++运算符的重载
C++运算符重载(operator)原创 2022-02-16 12:25:21 · 1142 阅读 · 0 评论 -
Const修饰成员函数问题
C++中定义类对象的时候引入了this指针,指向类定义的对象本身。this指针的一般用途:当形参和成员变量同名时,可用this指针来区分在类的非静态成员函数中返回对象本身,可使用return* this当我试着修改this指针的指向时,发现vs提示错误:查阅以后发现this指针的本质是一个指针常量,指针的指向不可修改,即:Person* const this;但是this指针指向的对象的数据是可以修改的。如果想要指针指向的值也不能改变,则需要声明...原创 2022-02-13 11:45:14 · 515 阅读 · 0 评论 -
C++成员变量和成员函数的存储
关于C++类中的成员变量和成员函数是如何存储的,先看一下代码#include <iostream>using namespace std;class Person1{};class Person2 { int m_a; static int m_b; void func() {} static void func2() {}};void test01(void) { Person1 p; cout << "size of p=" <&l原创 2022-02-11 23:43:55 · 706 阅读 · 0 评论 -
C++浅拷贝与深拷贝
浅拷贝:简单的赋值拷贝操作。深拷贝:在堆区重新申请空间,进行拷贝操作。C++中在对一个已知对象进行拷贝的时候,会调用类中的拷贝构造函数,如果程序员未定义拷贝构造函数,则会调用编译器默认的拷贝构造函数进行值拷贝!看一个简单的例子:#include <iostream>using namespace std;class Person {public: Person() { /*默认构造函数*/ cout << "Person默认构造桉树的...原创 2022-02-11 16:07:01 · 11181 阅读 · 7 评论 -
C++构造函数和析构函数
对象的**初始化和清理**也是两个非常重要的安全问题。 一个对象或者变量没有初始状态,对其使用后果是未知。 同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题。一、什么是构造函数和析构函数 c++利用了**构造函数**和**析构函数**解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要我们做的事情,因此如果**我们不提供构造和析构,编译器会提供**。...原创 2022-02-11 15:45:24 · 1071 阅读 · 0 评论 -
C++ 类封装案例设计-立方体类
通过一个封装案例来巩固前面所学的类和对象一、设计步骤1、创建立方体类2、设计属性3、设计行为 获取立方体面积和体积3、分别利用全局函数和成员函数 判断两个立方体是否相等二、代码实现#include <iostream>using namespace std;class Cube {public: //设置长度 void set_l(int l) { m_l = l; } //设置宽度 void set_w(int w) { m_w = w;原创 2022-02-11 10:37:13 · 769 阅读 · 0 评论 -
C/C++:struct和class区别
C和C++中的Struct区别:C C++ 不能将函数放在结构体声明 能将函数放在结构体声明 在C结构体声明中不能使用C++访问修饰符。 public、protected、private 在C++中可以使用。 在C中定义结构体变量,如果使用了下面定义对象必须加struct。 定义对象可以不加struct 结构体不能继承(没有这一概念)。 可以继承 若结构体的名字与函数名相同,可以正常运行且正常的调用! 若结构体的名字与函数名相同,使用结构体,只能使原创 2022-02-10 20:58:30 · 468 阅读 · 0 评论 -
C++三种访问属性
C++之访问属性 public 属性为public的成员,不仅该可以在该成员所属类的内部进行访问,而且可以在类外通过类的对象来访问。 private 属性为private的成员,只能在该成员所属类的内部进行访问,而不能在类外通过类的对象来访问。换句话说,对外...原创 2022-02-10 20:44:10 · 1671 阅读 · 0 评论 -
C++函数的重载
函数重载满足的条件:1、同一个作用域下2、函数名称相同3、函数参数类型不同,或者个数不同,顺序不同Tips:函数的返回值不可以作为函数重载的判断示例代码:#include <iostream>using namespace std;void func(){ cout << "func的调用" << endl;}void func(int a){ cout << "func(...原创 2022-02-07 20:07:51 · 1280 阅读 · 0 评论 -
C++引用
引用的作用就是给变量取一个别名。引用的本质就是一个指针常量!! int& ref = a; --->int* const ref = &a; 这就是为什么引用只能初始化一次!! int& ref = 10; 是错误的!! 引用意味着可以修改被引用对象,而10是常数不可修改故错误!!正确用法:const int& ref = 10;引用语法: 数据类型 &变量名...原创 2022-02-07 19:00:21 · 146 阅读 · 0 评论 -
内存四区(代码区、全局区、堆区、栈区)
C++在程序执行的时候,内存划分为4个区域·代码区:存放函数体的二进制代码,由操作系统进行管理的。·全局区:存放全局变量和静态变量以及常量·栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。·堆区:由程序员分配和释放,若程序员不释放,程序结束后由操作系统回收。一、代码区 ①代码区存放CPU执行的机器指令既程序汇编而成的二进制代码。 ②代码区是共享的,对于频繁执行的程序,内存中只需要保存一份即可。 ③代码区是只读的,只读的原...原创 2022-02-07 13:47:00 · 10392 阅读 · 4 评论 -
通讯录管理系统
目录利用C++实现一个通讯录管理系统。一、菜单功能1、定义菜单函数 2、实现退出菜单功能二、添加联系人1、设计联系人结构体和通讯录结构体2、添加联系人API三、显示联系人四、删除联系人1、检验联系人是否存在 2、删除练习人五、修改联系人六、清空通讯录总结利用C++实现一个通讯录管理系统。系统中实现功能如下: ①添加联系人:向通讯录添加新人,信息包括(姓名、年龄、联系...原创 2022-02-03 18:00:48 · 1881 阅读 · 0 评论