自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 问答 (1)
  • 收藏
  • 关注

原创 string类

一:概述string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;不能操作多字节或者变长字符的序列二:常用接口示例1.常见的构造函数string()构造空的string类对象,即空字符串用C-string来构造string类对象。

2024-01-09 01:23:01 962

原创 简易 shell

程序替换时,不能让本程序去执行对应的命令,若为本程序执行,剩余的代码不会执行完就退出,此时,需要我们去创建子进程去执行对应的命令 --- 创建子进程 fork。由于,我们都是输入内容之后,再按下回车键,所以说 \n 一定位于最后一个位置,我们可以对字符串长度进行减一操作,从而达到去掉多余 \n 的目的。在此处不会存在越界问题,在字符串中,至少有一个 \n ,因为即使为空,我们也需要按下回车键,对长度进行减一的操作可以正常进行。为了后续更加方便,我们现在对 main 函数中的内容进行封装,即增加一个 ---

2023-12-10 23:55:49 97

原创 类和对象(下)

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

2023-12-09 13:44:21 104

原创 Linux 调试器 --- g d b 使用

GDB 全称“GNUsymbolic debugger”,是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go 等等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。一般来说,GDB主要帮助我们完成以下四个方面的功能: 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。在某个指定的地方或条件下暂停程序。当程序被停住时,可以检查此时你的程序中所发生的事。

2023-12-05 21:40:23 244

原创 模板

当编译器在实例化时,参数 a 为 int 类型,参数 d 为 double 类型,但模板参数列表中的类型必须为同一类型,所以编译器无法判断其为 int 类型还是 double 类型而报错(在模板中,编译器一般不会进行类型转换操作)。但是,当有一个新的类型出现时,需要我们自己添加对应的函数,代码可维护性降低,还可能会出现一个出错所有的重载均出错的情况。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。在此处,调用的两次 Swap 函数是否为同一个函数?

2023-11-13 16:30:17 76

原创 Linux 进程终止和等待

2>:父进程创建子进程,是要子进程来帮忙完成任务,子进程任务完成的怎末样,父进程要知道,通过进程等待的方式,获取子进程退出的信息 --- 两个数字!在多进程环境中,我们创建子进程的目的是为了让子进程帮我们做事,我们需要得知子进程把事情做的怎末样(这里的我们指的就是父进程) ---> main 函数的返回值叫做进程的退出码,0表示成功,非0表示失败。上述现象表明:main 函数的退出码是可以被父进程获取的,用来判断子进程的运行结果。3 种,其中前两种中的结果是否正确是由我们判断的,那么这个我们指的是谁?

2023-11-09 17:15:32 304

原创 Linux 权限

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限。所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2023-11-02 17:59:03 236

原创 Linux进程的概念

操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。操作系统的功能包括管理计算机系统的硬件、软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,提供了各种形式的用户界面,使用户有一个好的工作环境,为其它软件的开发提供必要的服务和相应的接口。

2023-10-30 22:47:51 150

原创 Linux小程序---进度条

而在 \r 的程序时,使用 printf 函数,每次打印一个字符,光标就会向后移动,当走到 \r 时,光标又会回到该行的起始位置,最终会被命令行提示符覆盖,导致程序得不到想要的结果。我们知道,在C语言中代码的执行顺序是由上而下进行的,所以肯定是先执行的 printf 函数,然后执行 sleep 函数,但是代码的运行现象并非先打印后休眠,而是先休眠后打印 --- 为什么?接下来,我们来解决,打印方向的问题,常规来说应该从右向左,在此处为从左向右,我们需要改变 printf 的输出格式。

2023-10-16 22:01:13 490

原创 printf函数

printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。printf 是C语言标准库函数,定义于头文件 <stdio.h>。format -- 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明。在输出时,普通字符将原样不动地复制到标准输出,转换说明并不直接输出而是用于控制 printf 中参数的转换和打印。每个转换说明都由一个百分号字符(%)开始,以转换说明结束,从而说明输出数据的类型、宽度、精度等。

2023-10-03 23:33:16 165

原创 Linux 中的make/makefile

make是一个命令工具,是一个解释makefifile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefifile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。在文件形成时,一定是先有的 test.c 文件,然后才有的 mybin 文件,所以(即。

2023-09-21 16:12:31 357

原创 Linux编辑器-gcc的使用

在我们的程序中,我们并没有定义 printf 函数,并且在预编译包含的 "stdio.h" 也只有该函数的声明,而没有定义实现,那么是在哪里实现的 printf 函数呢?:库中所有的函数,都有入口地址,所谓的动态链接,其实就是把要连接的库中的函数地址拷贝到我们的可执行程序的特定位置。:是C/C++或者其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码拷贝到自己的可执行程序中。(共享库):是C/C++或者其他第三方提供的所有方法的集合,被所有程序,以链接的方式,关联起来。

2023-09-20 20:06:46 540

原创 层次分析法

层次分析法The analytic hierarchy process, 简称) 建模比赛中最基础的模型之一,其主要用于解决评价类问题(例如:选择哪种方案最好、哪位运动员或者员工表现的更优秀)。层次分析法的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作的重要度的比较上面。在许多情况下,决策者可以直接使用AHP。

2023-08-22 13:52:38 131

原创 类和对象(中)

观察下述代码:每创建一个新的 Date 类的对象都需要调用 DateInfo 函数,在创建对象个数少的时候没有什么问题,但当需要创建很多个对象的时候会很麻烦,所以C++规定我们可以在类里面写一个构造成员函数 ,不需要每次调用都初始化。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

2023-08-17 17:04:29 113

原创 类与对象(上)

class 为定义类的关键字,ClassName 为类的名字,{ } 中为类的主体,注意类定义结束时后面的分号不能省略。// 类体:由成员函数和成员变量组成// 一定要注意后面的分号类的两种定义方式:<1>: 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

2023-08-15 17:32:26 71

原创 C++入门

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。<1>:命名空间中定义变量/函数/类型// 命名空间中可以定义变量/函数/类型//定义变量int Add(int left, int right)//定义函数struct Node//定义结构体类型int val;<2>:命名空间可以嵌套int a;int b;int c;int d;程序可以正常退出,上述代码没有问题。命名空间可以嵌套。

2023-08-15 10:46:21 122

原创 二叉树及其链式结构

对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。也就是说,如果一个二叉树的层数为H,且结点总数是 2^ H - 1,则它就是满二叉树。双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图:A是B的父节点。孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;子孙:以某节点为根的子树中任一节点都称为该节点的子孙。2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2^h - 1。

2023-06-10 16:51:26 843

原创 数组降维

我们可以通过数组首元素地址进行判断,若两者首元素地址相同,则说明没有形成临时拷贝,若两者首元素地址不相同,则说明形成了临时拷贝。为了让程序员统一使用数组,并且减少出错的概率,数组和指针的访问方式设计成通用的。如果指针和数组访问方式不统一,程序员需要不断地在不同的代码片段处,进行习惯的切换,本质上就会增加代码的出错率。在此代码中,我们使用数组的形式来接受数组,那么这两个数组是否相同?C语言是面向过程语言,在进行数组传参的时候,为了效率,将其降维成指针。&arr --- 取出的数组的地址,即整个数组的地址。

2023-06-06 14:27:57 332

原创 float变量与“零值”的比较

在此处需要介绍一个函数 --- fabs (求绝对值函数)我们可以自行定义一个精度,只要两浮点数相减的绝对值在我们定义的精度之内,我们就可以判定这两个浮点数相等。程序运行的结果为:我们可以看出,此时的输出结果为 hahaha ,不在为 hehehe。float 变量与 0 比较,只需要比较是否在精度范围内。

2023-06-05 21:52:41 2113 2

原创 volatile - (C语言)

这两条语句中,i 没有被作为左值,编译器认为 i 值没有被修改,所以从内存中取出 i 的值赋值给 j 后,这个值并没有被丢掉,而是继续执行了下一条语句,对 k 进行赋值,此时,编译器不会生成新的汇编代码重新从内存中取 i 的值,提高了效率。volatile 关键字告知编译器 i 可能随时发生变化,即每一次使用 i 值的时候,都必须从内存中读取出 i 的值。volatile关键字和const一样都是一种类型修饰符,用它修饰过的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者是其它线程等。

2023-06-05 15:49:48 516 2

原创 堆排序及top k 问题

的方式放在一个数组中(在此处,需要先开辟好一个数组用于存放数据),然后依次去读取剩下的N-K个数据,让其分别于堆顶数据(堆顶数据为堆内最小的数据 --- 小堆)进行比较,如果比堆顶数据大,则覆盖堆顶数据,然后进行。需要先以只读的方式,打开数据所在的 --- data.txt ,然后读取(fscanf)前K个数据将其采用。后面的N-K个数,依次比较,如果比堆顶数据大,就替换堆顶数据进堆(覆盖堆顶数据,向下调整)由此可以知道,我们所取出的数据为文件中的最大的K个数据 --- 此处K为8。

2023-06-01 18:57:54 727

原创 堆及其实现

目录一:堆的概念及结构1.概念2.堆的性质二:堆的实现1.堆的构建2.堆的销毁3.数据的交换4.堆的插入5.堆的判空6.堆的删除7.取堆顶的数据 8.堆的数据个数 9.示例三:完整的代码一:堆的概念及结构1.概念把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中。小根堆:每个父亲结点 <= 孩子结点大根堆:每个父亲结点 >= 孩子结点

2023-05-24 14:09:56 703 2

原创 队列及其实现

队列内部建立的是链表结构,而链表在释放的时候需要一个一个销毁,在此时,我们需要建立一个结构体指针指向队列的头部(QNode* cur = q->_front),然后一个一个地释放节点,循环条件更替条件为:cur = cur->_next , 当 cur 为空时,循环结束。在队列尾部,入队列,本质上是对链表进行操作,需要开辟一个一个新的节点,将其于队列中的内容链接起来,最后对元素总数进行 ++ 操作。我们在入队列时,进行了q->_size++ , 出队列时,进行 q->_size--。

2023-05-22 20:49:12 462

原创 栈及其实现

在数据入栈时会存在空间不够需要扩容的情况,在初始化时,我们的数组为NULL,并没有为其分配空间,需要先给数组一个新的容量(newcapacity),检测完栈是否为空后,可以直接对 ps->_top 进行 -- 操作(因为此处采用的数组栈,当不想要最后一个元素时,可以直接 --。在入栈时,需要考虑栈内是否为空,在出栈时同样需要考虑,若栈内为空,则无法进行出栈操作,可以使用一个函数,来检测栈是否为空。//数组的容量为新的容量。//ps->_top --- 栈顶元素,即若 ps->_top 为0 ,则栈为空。

2023-05-20 10:20:53 442

原创 取余,取模

如果a和b是两个自然数,d非0,可以证明存在两个唯一的整数q和r,满足 a = q * d + r , q为整数,且 0 <= |r| <= |d|。其中 q为商,r为余数。对任何一个小于0的数,对其进行0向取整和 -∞ 取整,取整方向是相反的的,即取模不等价于取余。余数为 1 ,对其进行 -∞ 取整,得到的结果为 -3.333,(-4) ,余数为 2。对任何一个大于0的数,对其进行0向取整和 -∞ 取整,取整方向是一致的,即取模等价于取余。python中: -10/3 (-4)---> 向-∞取整。

2023-05-19 21:41:58 557

原创 单 链 表

创建结构体,用于存放数据 data , 下一个节点 next (结构体的自引用,使用结构体指针,否则会显示未定义的结构体成员变量)。typedef将变量类型重命名为SLTDataType将结构体类型(SListNode) 重命名为 SLTNode}SLTNode;

2023-05-13 23:35:41 37

原创 单链表代码

【代码】单链表代码。

2023-05-13 23:27:41 62

原创 双向带头循环链表

双向带头循环链表结构:创建结构体,用于存放数据,上一个节点,和下一个节点。typedef --- 关键字,类型重命名}ListNode;

2023-05-12 22:35:38 140 2

原创 双向带头循环链表(完整代码)

【代码】双向带头循环链表(完整代码)

2023-05-12 22:34:47 31

原创 链表的回文结构

可分为3个步骤:寻找中间节点,若为奇数,返回中间值,若为偶数,返回中间的第二个节点:将中间节点后面部分,进行倒叙(即反转链表):(在中间节点为空前)判断起始位置,于中间节点位置,到末尾是否相同。

2023-04-26 23:00:55 143 1

原创 合并两个有序数组

力扣88

2023-04-23 00:31:50 38

原创 算法的时间复杂度和空间复杂度

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。算法中的基本操作的执行次数,为算法的时间复杂度。即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。

2023-04-13 23:03:15 48

原创 程序环境和预处理

_FILE__//进行编译的源文件__LINE__//文件当前的行号__DATE__//文件被编译的日期__TIME__//文件被编译的时间__STDC__//如果编译器遵循ANSI C,其值为1,否则未定义int main()int i = 0;for (i = 0;i < 10;

2023-04-09 14:11:11 45

原创 文件操作_2

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“<1>:遇到文件末尾,返回EOF,同时设置一个状态,遇到文件末尾了,使用feof来检测这个状态。feof 的作用时:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是。二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

2023-04-05 23:01:56 71

原创 文件版通讯录

在初始化通讯录时,可以读取到contact.txt文件中的内容。将文件写入时需要一个一个的放入,使用 fwrite 函数。在退出文件前,将文件以二进制的形式写入一个记事本中。fread返回的是实际上读取到有效信息的人数。在读取信息时,需要创建一个临时变量。

2023-04-05 10:57:44 42

原创 C语言文件操作_1

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。在程序设计中,一般情况下的文件(从文件功能分类)指的是:程序文件和数据文件。每当打开一个文件的时候,系统会根据文件的情况自动创建一个。的指针变量指向该文件,也相当于建立了指 针和文件的关系。在编写程序的时候,在打开文件的同时,都会返回一个。

2023-04-04 23:37:55 176

原创 动态内存管理

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。GetMemory函数内部创建的数组是临时的,虽然返回了数组的其实地址给了str,但数组的内存处理GetMemory函数就被回收了,而str依然保存了数组的起始地址,这时如果使用str,str就是野指针。连续的内存有益于提高访问速度,也有益于减少内存碎片。

2023-04-01 20:18:57 212 1

原创 动态通讯录

假设初始容量为 3 个人的信息,当容量不够时,进行扩容,每次扩容增添 2 个人的信息。

2023-03-30 22:06:10 87

原创 通讯录的实现

1.可以存放100个人的信息2.每个人的信息:名字性别年龄电话住址3.功能:<1>:增加联系人<2>:删除指定联系人<3>:查找联系人<4>:修改指定联系人<5>:显示联系人信息<6>:排序联系人。

2023-03-26 17:28:04 84 6

原创 枚举,联合体

联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)//联合类型的声明union Unchar c;int i;int main()//联合变量的定义//计算连个变量的大小return 0;

2023-03-23 18:55:17 30

空空如也

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

TA关注的人

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