C/C++
文章平均质量分 76
走必须要走的路。
Goallegoal
左手击筑,右手编程。
展开
-
C++模拟实现线程池及多线程原子打印
C++模拟实现线程池及多线程原子打印#include <iostream>#include <thread>#include <vector>#include <unordered_map>#include <mutex>#include <condition_variable>using namespace std;namespace myTest {class Task {public: template原创 2021-04-01 11:18:44 · 420 阅读 · 0 评论 -
模拟实现function模板类接收不同可调用对象的功能
模拟实现function模板类接收不同可调用对象的功能#include <iostream>#include <functional>using namespace std;namespace myTest {template<typename T, typename ...ARGS>class base {public: virtual T run(ARGS...) = 0; virtual base<T, ARGS...> *get原创 2021-03-30 17:17:05 · 188 阅读 · 0 评论 -
怒刷排列组合,如何解“排列组合”一类的问题
怒刷排列组合在刷Leetcode题目时,时常会看到一些大佬提出时间复杂度为O(1)的题解,而我还在O(nm)和O(n)之间如此反复,细细品味,其实有一类题目是经常可以爆出O(1)的解法的,这一类题目背后的数学依据就是排列组合。顾名思义,排列即排列,组合即组合,排列组合主要是用来解决做一件事情有多少种方法或者某件事发生的概率是多少的问题。例如小明从家到学校可以选择步行、骑车、坐出租车。**问题1:**小明从家到学校有几种出行方式?**问题2:**小明从家到学校再返回家中,有几种出行方式?针对上述的两个问原创 2021-01-13 11:16:26 · 589 阅读 · 0 评论 -
搞定二分查找,套路深得人心
在排序与查找算法中,二分查找是一种常用的用来在有序排列中查找指定元素的方法。二分查找也称折半查找,是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按照关键字有序排列。二分查找的查找思想为:首先将待搜索序列进行排序,既可以按关键字从小到大,也可以从大到小进行排序,将有序序列从中间一分为二,比较中间值与目标值的大小关系,若待搜索序列是按从小到大进行排列的,且此时中间值比目标值小,那么说明目标值一定不在有序序列的左边,接下来重复上述步骤对右边的序列进行进一步二分查找,直原创 2021-01-06 09:09:46 · 373 阅读 · 0 评论 -
求两个三位数相乘得到的最大回文数
求两个三位数相乘得到的最大回文数所谓的回文数是指:一个像14641这样“对称”的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。这里,“回文”是指像“妈妈爱我,我爱妈妈”这样的,正读反读都相同的单词或句子。例如由两个两位数相乘得到的最大回文数为9009,9009 = 91 * 99。这里要求的是两个三位数相乘得到的最大回文数。下面内容的侧重点是如何提高寻找这样一个回文数的效率,而不再阐述具体每一段代码所表示的含义。按照正常的枚举法思路,程序要实现的功能为,从100到99原创 2020-12-28 20:22:47 · 2138 阅读 · 2 评论 -
并查集的实现与优化
并查集的实现与优化LeetCode上有一道名为朋友圈的题目,如下:班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。读完题目要求,暂时能想到的是,如果要解决该问原创 2020-12-26 10:16:15 · 356 阅读 · 0 评论 -
C++建立顺序存储完全二叉树并以广义表形式输出
建立顺序存储完全二叉树并以广义表形式输出题目要求:假设用顺序表来表示一棵完全二叉树。从根到叶结点按层次从 1 开始编号,同一层次从左到右编号,数据存储在对应的数组元素中。试编写算法由此顺序存储结构建立该二叉树的二叉链表。输入格式:输入只有一行,为顺序输入的从根节点开始的各个节点元素,它们之间用空格隔开,整个输入以 $ 结束。输出格式:输出有一行,为二叉树结构的广义表达式。样例输入:A B C D $样例输出:A(B(D),C)解题思路:由完全二叉树的特点可得,若原创 2020-12-09 11:24:22 · 932 阅读 · 0 评论 -
利用scanf的%[]格式控制获取带空格的字符串输入
利用scanf的%[]格式控制获取带空格的字符串输入 char name[3][101]; for(int i = 0; i < 3; i++) { scanf("%[^\n]", name[i]); // 遇到非换行符的字符就保存到数组中 getchar(); // 排除scanf引入的换行 }...原创 2020-12-07 15:53:17 · 188 阅读 · 0 评论 -
使用指针和数组两种方式存储从键盘输入的字符串
使用指针和数组两种方式存储从键盘输入的字符串C语言中保存字符串常使用两种方式,一种是通过字符数组保存字符串,另一种是通过字符指针的方式保存常量字符串的地址。首先说明通过字符数组的方式保存字符串,如int main() { char arr[20]; scanf("%s", &arr); printf("%s", arr); return 0;}使用该方式可以实现从键盘获取输入然后保存到指定的数组中,数组中每个单元保存的是一个个的字符。另外一种方式,即使用原创 2020-12-07 14:40:59 · 4605 阅读 · 0 评论 -
判断字符是否是同一个字母的大小写
判断字符是否是同一个字母的大小写方案1、由ASCII码表知,同一个字母的小写表示ASCII码值要比大写表示的大32char ch1 = 'a';char ch2 = 'A';if( ch1 == ch2 + 32 ) ;方案2、tolower将字符转换为小写if( tolower(ch1) == tolower(ch2) ) ;方案3、使用异或,通过观察大小写字母的ASCII码值发现,同一个字母的大写和小写之间相差32,用二进制表示时,差异仅体现在从右往左数的第6位上,所以可以通过判断原创 2020-10-10 10:35:28 · 1650 阅读 · 0 评论 -
atoi()函数的使用
atoi()函数的使用atoi()用于将字符串转换为整型值,其函数原型为int atoi(const char *nptr);,该函数在转换字符串时,会忽略空字符并在遇到非数字字符时停止转换,若无法转换则返回0。使用该函数需要包含头文件#include <cstdlib>string str("777as");int num = atoi(str.c_str());cout << num << endl; ...原创 2020-10-09 19:31:03 · 402 阅读 · 0 评论 -
C++ string类成员函数c_str()的用法
C++ string类成员函数c_str()的用法c_str()生成一个const char*指针,指向以空字符终止的数组,该指针不需要手动释放和删除。在使用c_str()时要注意,c_str()指向的数组是一个临时数组,其中的数据会因为程序的某些操作而失效,例如:string str("hello!");const char *pstr = str.c_str();cout << pstr << endl; // hello!str = "world";cout &原创 2020-10-09 19:09:21 · 557 阅读 · 0 评论 -
C++string类常用方法
C++string类常用方法1、string(const char *s) :将 string 对象初始化为 s 指向的字符串string str("hello");2、string(size_type n,char c) :创建一个包含 n 个元素的 string 对象,其中每个元素都被初始化为字符 cstring str(10, 'a');3、string(const string &str) :将一个 string 对象初始化为 string 对象 str(复制构造函数)str原创 2020-10-09 15:34:26 · 94175 阅读 · 13 评论 -
函数递归
函数递归程序调用自身的编程技巧称为递归。递归做为一种算法,在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:大事化小。递归的两个必要条件:1、存在限制条件,当满足这个限制条件时,递归便不再继续。2、每次递归调用之后,越来越接近这个限制条件。练习1:接收一个无符号整型值,按顺原创 2020-08-06 21:34:13 · 132 阅读 · 0 评论 -
C语言字符和字符串库函数的使用、注意事项及模拟实现
C语言中没有字符串类型,字符串通常会被放到常量字符串或者字符数组中,在程序的开发过程中要经常对字符和字符串进行处理,这就需要引入一些库函数来简化字符、字符串的处理操作,提高程序的开发效率。原创 2020-08-06 17:20:21 · 460 阅读 · 0 评论 -
C语言strstr()函数模拟实现和库实现之间的差距
C语言strstr()函数模拟实现和库实现之间的差距strstr()的函数原型为char *strstr(const char *haystack, const char *needle),用于在字符串 haystack 中查找第一次出现字符串 needle 的位置,注意不包含终止符 ‘\0’。该函数的返回值为在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。下面先贴上自己模拟实现的myStrstr(),先不看代码中的细节处理,仅关注代码逻辑。在代码编写的过程中原创 2020-08-06 10:25:37 · 209 阅读 · 0 评论 -
C语言错误处理-输出错误信息
C语言错误处理-输出错误信息程序开发过程中,不可避免地会因为细节疏忽导致程序的编译、运行出错,当出现错误时编译器一般会将错误信息展示出来,但由程序操作或用户输入导致的错误往往会使程序直接崩溃并无任何的提示,此时,就需要一种方法能够用在程序可能出错的地方,当错误发生时可以提前将错误信息输出并中止运行,避免程序的崩溃、简化程序bug的查找。下面介绍C语言中几种用来主动输出错误信息的方法。stderr首先介绍stderr标准错误,在程序创建的同时会开启三个默认的流,分别为标准输入stdin、标准输出stdo原创 2020-08-05 10:09:56 · 5317 阅读 · 0 评论 -
C语言柔性数组使用方法、特点及优点
C语言柔性数组使用方法、特点及优点在C99标准中定义有,结构体中的最后一个元素允许是未知大小的数组,这个数组就叫做柔性数组,所以说柔性数组其实是结构体中的一个数组,“柔性” 指的是该数组的大小可大可小。例如:struct S{ int i; int a[];//柔性数组成员,该数组为柔性数组};上面的定义是没有问题的,如果使用的编译器在运行上述代码时报错无法编译,可以像如下方式定义:struct S{ int i; int a[0];//将数组的大小设为0};上述柔性数组的声明原创 2020-08-04 08:49:14 · 750 阅读 · 0 评论 -
Linux环境下使用fcntl实现C语言非阻塞输入
Linux环境下使用fcntl实现C语言非阻塞输入在使用C语言编程时,常常会用到scanf()、getchar()等函数来获取键盘的输入,当键盘没有输入时程序会发生阻塞并一直保持在阻塞状态,此时如果想要继续执行下一步的程序,就需要将IO状态置为非阻塞,以确保无用户输入的情况下程序的正常执行。fcntl是Linux中的函数,用来改变已打开文件的性质,其定义为int fcntl(int fd, int cmd);,其中参数fd表示欲设置的文件描述符,参数cmd代表将要执行的操作,如果该操作需要键入参数,fc原创 2020-08-02 17:54:48 · 1882 阅读 · 1 评论 -
Linux环境下静态库和动态库(共享库)的创建及使用
Linux环境下静态库和动态库(共享库)的创建及使用编写程序时,常常将重复代码写进函数,通过多次调用函数来减少工作量,类似的,当一个工作需要多次调用某些函数和变量时,可以将这些函数、变量封装成库,供其他程序调用,提高开发效率。C语言中有两种库类型,分别为静态库和动态库(共享库)。静态库静态库是在目标文件链接成可执行文件过程中,直接将代码载入可执行文件,后期程序的运行不再需要静态库。在Linux系统中,静态库的后缀为.a,静态库的生成分为两步,第一步将源文件编译生成目标文件,第二步通过目标文件生成静态库原创 2020-08-02 16:37:12 · 1147 阅读 · 0 评论 -
打卡机核心功能实现(C语言)
222222222应市场需求,某工程师现设计了一款新上下班打卡机,打卡机具有以下功能:(1)上班打卡,员工具有编号(首位为 1 的六位编号),输入编号后,再输入校验码,校验码生成规则:员工编号除首位反序,再与员工编号求和,如:员工编号,110086,校验码为 178087。校验码错误即打卡失败。记录打卡时间 。(2)下班打卡,只需输入员工编号即可。记录打卡时间,显示该人员今天上班时长,如果上班时长不够,显示早退 xx 分钟。可以更新下班打卡时间。无下班打卡显示缺卡。(3)可以设置规定上班时长,如 9原创 2020-08-01 22:32:28 · 1875 阅读 · 0 评论 -
C语言整型转字符串
C语言整型转字符串顺序存储顺序打印#include <stdio.h>int main(){ int num = 110086; char str[6] = {0}; int divnum = 100000; int i = 0; for(i=0; i<6; i++) { str[i] = (num / divnum)+48; num = num % divnum; divnum =原创 2020-08-01 21:44:05 · 1347 阅读 · 0 评论 -
C语言自定义类型
C语言自定义类型结构体结构体类型的声明结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。struct tag{ member-list;}variable-list;struct tag x;也可以通过typedef对类型重命名typedef struct Student{ char name[20]; int age; char sex[6];} Student;// 这里的Student不是变量名,而是类型名Student x;对结构原创 2020-08-01 09:15:42 · 326 阅读 · 0 评论 -
动态内存管理
动态内存管理为什么存在动态内存开辟常规的开辟内存空间的方式,例如声明变量、数组等,有以下2个特点:1、空间开辟的大小是固定的;2、数组在声明的时候,必须指定数组的长度,所需要的内存在编译时分配。如果想要在程序运行过程中根据实际内存使用情况动态的开辟内存空间,以上方法就做不到了,只能尝试动态内存管理。动态内存函数malloc()malloc函数包含在stdlib.h头文件中,原型为void* malloc(size_t size);这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针原创 2020-08-01 09:15:08 · 140 阅读 · 0 评论 -
C语言数组和指针笔试题小结
11111111111一维数组 int a[] = {1,2,3,4}; printf("%d\n", sizeof(a)); // 16,sizeof(数组名),当数组名单独放在sizeof()中时,数组名表示整个数组 printf("%d\n", sizeof(a+0)); // 8,数组名没有单独存放时表示首元素地址 printf("%d\n", sizeof(*a)); // 4 printf("%d\n", sizeof(a+1)); // 8 printf("%d\n",原创 2020-07-30 08:09:29 · 362 阅读 · 0 评论 -
C语言指针从入门到进阶
111指针定义在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”(指针是一个变量,用来存放地址)。意思是通过它能找到以它为地址的内存单元(内存空间编址是以一个字节为一个地址)。int a = 10; // 变量a占用了4个地址空间int *p = &a; //取a的地址,是拿到4个地址空间的起始位置地址// 将此地址存放到 p 中,此时p就是指针原创 2020-07-27 19:06:12 · 230 阅读 · 0 评论 -
C语言文件操作
文件操作文件基础一般情况下,将文件分为文本文件和二进制文件两种。文本文件:以ASCII码编写的可视化的字符型文件,不同的文字以特殊编码存在,如GBK、utf-8等。二进制文件:直接以原生二进制码存放的文件,如BMP等图片文件,MP3等音频文件,exe等可执行文件。数据流:一组有序、有起点和终点的字节的数据序列,程序和数据的交互是以流的形式进行的。标准 IO 及缓存基础文件操作C语言获取的文件,其使用 FILE 结构体进行定义。在命令行上显示一段内容printf("hello!\n");原创 2020-07-24 08:26:31 · 143 阅读 · 0 评论 -
C语言指针学习与使用
C语言指针学习与使用计算机存储想要更好的使用指针,需要对计算机的存储有一定的概念和了解。下面的图片中展示了计算机的硬件结构:存储设备除了上述的主存储器外,还有其他的一些在执行程序时可能会用到的存储设备,并根据各自的特点对其进行了层次划分:使用主存储器进行数据存储时,如果每次存储都要编程人员准确找到存储单元的物理地址,那么不仅增加了工作量而且降低了工作效率。此时就有了虚拟内存的概念。CPU在执行数据的读、写操作时,拿到的是虚拟地址,然后通过内存管理单元(MMU,Memory Managemen原创 2020-07-22 18:18:19 · 789 阅读 · 0 评论 -
C语言结构体的学习与使用
C语言结构体的学习与使用结构体定义与使用结构体是C语言中的明显的构造类型,相对于只能存储相同类型元素的数组,结构体是存放不同类型数据的集合。结构体一般会在处理数据信息时使用。构造结构体定义,类型为 struct Personstruct Person{ int number; char sex; double money;};上述形式只是定义了一个类型,类型中有 number、sex、money这些内容。结构体的使用,使用结构体类型定义变量struct Person p1;//原创 2020-07-20 09:39:27 · 297 阅读 · 0 评论 -
C语言编程练习(三)
C语言编程练习(三)1、编程一个逆序的数组,只能交换,不能定义临时数组void getReverse(){ int order[] = {1, 2, 3, 4, 5, 6, 7}; int len = sizeof(order)/sizeof(order[0]); int index = 0; int tmp = 0; for(index=0; index<len/2; index++) { if(index != len-index-1) { tmp = order[原创 2020-07-18 11:17:08 · 193 阅读 · 0 评论 -
图解约瑟夫环(C语言实现)
图解约瑟夫环(C语言实现)场景描述:1、一群人围在一起坐成环状;2、从某个编号的人开始报数;3、数到 M 的时候,此人出列,他的下一个人又从1开始报数,数到 M 的那个人又出列;4、一直循环,直到所有人出列,约瑟夫环结束。这里假设有 8 个人围成了环状,依次标号为 1 至 8。假设游戏从 3 号玩家开始,规定每次从 1 开始计数,数到 3 的人出列,出列的玩家变为红色,未出列玩家仍用绿色表示。...原创 2020-07-18 11:08:30 · 4375 阅读 · 0 评论 -
C语言编程练习(二)
C语言编程练习(二)1、在屏幕上输出如下图形 键盘输入n,比如输入3如下 * * * * * *void printStar(){ printf("Please input the line of star:"); int n = 0; scanf("%d", &n); int index = 0; int numofStar = 0; int numofNull = 0; for(index=1; index<=n; index++) { for(numo原创 2020-07-17 10:26:37 · 394 阅读 · 0 评论 -
C语言数组的学习与使用
C语言数组的学习与使用数组的定义与使用数组:从语义上说就是数据的组合。元素:数组内存放的单个数据下标:数组内的元素所对应在数组的位置越界:超出数组下标的位置进行访问定义数组的语法:数组内的元素类型 数组名[数组的大小],例如int arr[10];数组的遍历及访问数组内的所有元素(遍历输出) int arr[10]; int i = 0; for(i=0; i<10; i++) { printf("arr[%d] = %d\n", i, arr[i]); }数组的定义并原创 2020-07-14 21:37:15 · 130 阅读 · 0 评论 -
【编程错误】数组排序时,本意为从小到大排序,但结果打印为从大到小
数组排序时,本意为从小到大排序,但结果打印为从大到小#include <stdio.h>int main(){ int arr[10] = {3, 7, 1, 9, 10, 2, 4, 6, 5, 8}; int i = 0; int j = 0; int tmp = 0; for(i=0; i<10; i++) { for(j=0;j<10;j++) { if(arr[i]>arr[j]) { tmp = arr[i];原创 2020-07-14 20:50:58 · 166 阅读 · 0 评论 -
C语言编程练习(一)
C语言编程练习(一)1、计算n的阶乘;void getFactorial(int n){ //计算n阶乘 int index = 0; int res = 1; if(n != 0) { for(index=1; index<=n; index++) { res = res * index; } } printf("%d的阶乘为:%d\n", n, res);}2、求1-100之间的奇数之和、偶数之和;void getSumif(){ //计算100以原创 2020-07-12 13:41:44 · 881 阅读 · 0 评论 -
理解C语言预处理指令
理解C语言预处理指令预处理作用与宏定义gcc 的编译流程分为四个步骤:预处理、编译、汇编、链接。而预处理在程序设计领域中一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。主要处理#开始的预编译指令,如宏定义(#define)、文件包含(#include)、条件编译(#ifdef)等。下面看一个宏定义的预处理过程:#define PI 3.14#define NAME原创 2020-07-06 23:14:38 · 377 阅读 · 0 评论 -
C语言自定义函数如何返回数组
C语言自定义函数如何返回数组使用 C 语言,在 main() 函数中调用了一个自定义的函数,想要从函数中获取其运行产生的字符串,直接返回数组是实现不了的,最起码也要返回数组的地址。但是在自定义函数中创建数组后,该数组本身是一个局部变量,当该自定义函数的生命周期结束后,局部变量也就被回收了,即使返回了一个代表数组的地址,但实际上其指代的内容可能已经发生了变化。有三种方法可以实现自定义函数成功返回数组:1、将数组定义为全局变量;2、使用malloc在堆区开辟动态空间;3、在调用函数时传入数组地址。-原创 2020-07-05 13:48:40 · 11550 阅读 · 0 评论 -
C++操作符重载学习与使用-算数运算符、赋值、自增、输入输出操作符
C++操作符重载学习与使用-赋值、自增、输入输出操作符操作符重载概念class Complex{ int real; int img;public: Complex():real(0),img(0){}; Complex(int r,int i):real(r),img(i){};}Complex c1;Complex c2 = Complex(1,2);c1 + c2;// 尝试进行 C1 + C2 的操作...原创 2020-07-03 13:04:53 · 180 阅读 · 0 评论 -
C++友元的学习与使用-友元函数、友元类
C++友元的学习与使用-友元函数、友元类友元函数class Person{ int age; char sex;public: Person():age(18),sex('m'){};};void displayPerson(const Person &p){ cout << p.age << endl; cout << p.sex << endl;}如上操作是不可行的,因为类外的函数没有权力调用类内 private 封原创 2020-07-02 19:48:26 · 219 阅读 · 0 评论 -
C++静态成员
C++静态成员静态成员变量class Person{public: static int kind;};Person p1;cout << p1.kind <<endl;此时会报“连接错误”,这是因为虽然在类中定义了成员变量,但是静态成员变量不属于对象的一部分,它从属于类;这里只是做了声明,还需要在类的外部进行定义。另外,此变量的值虽然可以进行修改,但是所有对象对静态成员变量的获取都是同一份,其中一个对象对该值的修改将会影响其他对象的获取。int Person原创 2020-07-02 17:53:29 · 170 阅读 · 0 评论