自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 帧缓冲 framebuffer

向将高位进行移动,然后将后面的格式向前移动,进行拼接,按位或,根据不同的格式,进行不同的移动,对于不同 的格式,我们进行不同的位运算。bmp里面存储的数据是 rgb实际上是bgr,所以我们需要进行数据转换,所以我们需要进行数据的格式进行向前移动。用画图工具另存为.bmp格式,不要修改文件的后缀名,每一个格式都有自己的具体格式。54个字节是头部信息,前14字节是文件相关信息,40字节是图像相关信息。位图格式,通常未压缩,因此文件较大,保存了图像的所有细节。指针进行偏移,进行指向,第一个是b,g,r。

2024-09-12 00:10:28 1106 1

原创 获取时间,并将时间按一定的格式输出

/date 功能: 将时间秒数转化成字符串 参数: timep:保存时间空间的地址 返回值: 成功返回获得时间字符串的首地址 失败返回NULL。功能: 获得1970年到现在的秒数 第一步,先获得秒数再转成其他时间 参数: t:存放秒数的空间首地址 返回值: 成功返回1970年到现在的秒数 失败返回-1。1.获取秒数 CTS 北京时间 2.转换为需要个格式 系统时间的获取: 1.time 获得秒数 time_t time(time_t *t);可以根据需求来指定不同的格式化指令来输出不同的日期和时间格式。

2024-09-12 00:07:17 598

原创 数据结构(哈希表)

在这种方法中,哈希表的每个槽(slot)或桶(bucket)都关联一个链表,我们把具有相同属性的元素进行连接,最后只需要我们进行查找的时候只需要进行哈希映射,找到数组的地址之后,去遍历里面的链表,找到对应的元素。- **性能依赖于负载因子**:当哈希表的负载因子(即表中元素数量与槽数量的比率)较高时,链表可能会变得较长,导致查找效率下降。- **动态扩容**:随着元素的增加,可以动态地增加哈希表的大小,以保持负载因子在一个合理的范围内。1. **哈希函数**:首先,使用哈希函数将键映射到哈希表的一个位置。

2024-09-11 22:44:58 1056

原创 排序算法总结

6、运用递归的思想进行排序,首先通过基准点将数组划分为两半,后续将前半部分,进行遍历排序,排序好后,再按顺序执行,对后面的队列进行重新排序。思想:给数组a 排序,将数据进行插入,但是要保证数组,插入之后的鼠标线还是有序的。一次从待排序的数据元素中选出**最小(或最大)**的一个元素,存放在序列的起始(末尾)位置。思想:在数组合适的位置上放上合适的数,选定一定的位置,从后面的数据与该数据进行比较。然后选出**次小(或次大)**的一个元素,存放在最大(最小)元素的下一个位置。排序算法的稳定性:稳定性。

2024-09-11 22:40:01 519

原创 数据结构(树形结构)

一、基本知识树:一对多的树形结构顶层的结点:称为根节点叶子结点(终端结点):最外围的结点,只有前驱结点,没有后继结点的结点,其结点的度是0分支结点:分支点是描述数据结构中的从根部出发(对有向图而言)有入度和出度的节点,(对无向图而言)不属于 叶子节点 的节点。出度不为0的结点称为分枝点。在 完全m叉树 中,如树叶数为t,分支点数为i,则(m-1)i=t-1。注意实际上就是除了根节点和叶子结点之外的都是。度深度:层数广度:(默认为度),结点的度最大的结点的度即为树的广度。

2024-09-11 22:33:39 2192

原创 数据结构(队列)

循环队列是一种使用数组存储数据元素的线性数据结构,它利用数组的环状特性来处理队列的入队和出队操作。为了避免假溢出,可以在定义循环队列的时候预留一个位置,通常在初始化队列时,将front和rear都设置为0,但在判断队列满的条件中加入一个额外的判断条件,比如rear == front时队列为空,而(rear + 1) % queueSize == front时队列为满。顺序队列---------》假溢出-----------------》循环队列(如果用顺序队列里面,我们主要用的就是循环队列)

2024-09-11 22:25:02 376

原创 数据结构(栈)

用途:数据栈通常指的是用户定义的栈,用于存储数据元素。作用域:数据栈的作用域通常由程序员定义,它可以是全局的,也可以是局部的,取决于程序的设计。生命周期:系统栈的生命周期与函数调用的生命周期相关,而数据栈的生命周期由程序员定义。可见性:系统栈对程序员通常是不可见的,而数据栈是程序员可以直接操作的。入栈的方向是是增栈的方式,放入数据的是满栈的方式。入栈的方向是是减栈的方式,放入数据的是满栈的方式。入栈的方向是是增栈的方式,放入数据的是空栈的方式。入栈的方向是是减栈的方式,放入数据的是空栈的方式。

2024-09-11 22:20:25 798

原创 天气预报爬虫

了解服务器断口的http请求的基本格式之后,充当客户端,对该服务器进行请求,服务器对发送的报文,进行回发,我们只需将从服务器爬虫下来的数据进行解析即可。解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程。次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提。构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提。③ 根据键值对的名称从链表中取出对应的值,返回该键值对(链。每个名称和值成对出现,名称和值之间使用":"分隔;以"{“开始,以”}"结束,允许嵌套使用;

2024-09-11 22:12:33 652

原创 数据结构(内核链表)

一、特性内核链表:内核链表是有头的,双向,循环列表组成:将链表的结点作为结构体成员存在 ,只放指向前驱结点和后继结点的指针offsetof 获取结构体中的成员到结构体开头中的偏移量container_of通过偏移量获取结构体首地址但应用层不能使用上述两个宏,处理方法:将节点作为结构体第一个成员(结构体第一个成员首地址为结构体的地址)注意: 结点将作为结点保存在结构体中,不能定义为指针。

2024-09-06 20:22:02 435

原创 数据结构(双向链表)

在销毁的时候,要需注意在此用的是头删,我们需要考虑,头删的结点,的下一个结点是否存在,也就是说特列是只有一个结点,如果不考虑会造成指针越界。1、两个指针,可以通过任意一个结点找到其前一个结点和后一个结点。2.1、创建一个双向链表。

2024-09-04 22:22:39 481

原创 数据结构(单向链表)

一、什么是数据结构1.1、组织存储数据---------》内存(存储)1.2、研究目的如何存储数据(变量,数组....)程序=数据结构+算法1.3、常见保存数据的方法数组:保存自己的数据指针:是间接访问已经存在的空间------------》操作数据,并不能销毁别人的数据指针数组:并不保存数据,也是指向那个空间,并不能保存数组二维数组:保存数据的数据库也其实数据结构,实质上是对复杂数据的一种封装二、数据与数据之间的关系2.1、数据的逻辑结构。

2024-09-03 23:48:32 1868

原创 数 据 库

一、数据存储方式1、内存存数据:当程序运行结束,掉电,数据丢失。(数组、链表、变量等)2、硬盘存数据:程序运行结束,掉电,数据不丢失。(1)文件:对数据管理(增删改查)效率低。(2)数据库:专业存储数据,可存大量数据。对数据管理效率高,使用方便。二、常用数据库1、关系型数据库:将复杂的数据结构简化为二维表格形式。eg:大型:Oracle、DB2;中型:Mysql、SQLserver;小型:Sqlite。2、非关系型数据库:以键值对存储,且结构不固定。三、SQLITE1、相关命令。

2024-08-29 22:55:12 981

原创 IO的多路复用

一、select()1.1、处理流程1、创建文件描述符集合 fd_set2、添加文件描述符到集合中 int FD_ISSET(int fd, fd_set *set);3、通知内核开始监测 select4、内核返回的结果(两个结果,1、是那种类型得文件),做对应得操作(对IO读、写操作)1.2、函数接口(1)select()函数接口功能:检查多了IO参数:nifds:最大文件描述符+1(方便内核查找)readfds 关注读事件的文件描述符集合。

2024-08-28 22:58:23 812

原创 TCP并发服务器

一、整体框架二、 服务器单循环服务器:同一时刻,只能处理一个客户端的任务并发服务器:同一时刻,只能处理多个客户端的任务UDP 是具备并发性的,是因为UDP是无连接的,所以处理器可以处理过来TCP实际上是单循环的服务器,只能建立一对一连接,其他人不能再与其建立连接,之前只有一个套接字现状为了实现并发,我们给每一个连接都给予一个套接字。

2024-08-27 23:11:40 618

原创 网络测试工具

本文内容总纲:一、解决粘包问题1.1、tcp的特点面向字节流特点,会造成可能数据与数据发送到一块,成为粘包,数据之间不区分1.2、拆包因为缓冲区的大小,一次性发送的数据会进行拆分(大小不符合的时候)就和水一样一次拆一次沾到一块,不好对数据进行拆分字节流就是像水一样,一个接着一个往过流,字节流,紧挨着,多次发的东西一次性接受在底层下面,socket 会在发送数据会等一下,时间到了就一次性发送。

2024-08-23 21:32:03 768

原创 网络通信(TCP+UDP通信)

一、UDP协议参数说明int sockfd, //socket 的fdvoid *buf, // 保存数据的一块空间的地址size_t len, //这块空间的大小int flags,// 0 默认的接收方式 -----阻塞方式 默认行为是阻塞a.MSG_DONTWAIT 不阻塞方式,用他的话代表读的时候是非阻塞方式b.类似与读操作,如果没有东西就等待,一直等待c.如果我们把发送和接收放一块的话,读端没有发送,也会使我们写端阻塞到哪里,除非数据发送过来。

2024-08-22 21:59:32 1012

原创 linux系统编程:线程(1)

缺点: 进程间共享数据不方便 //进程间通信(管道,信号,共享内存)缺点: 安全性不好 //专门的技术 解决资源竞争:---互斥同步。可分离性 -----pthread_detach //子程序执行任务较长,主线程也不需要关心子线程状态。可结合性 -----pthread_join //这种用于线程任务较短,主线程需要关心子线程状态。互斥 --- 要么不访问,要访问就是一次完整操作(原子操作)③请求和保持条件: 已有一个资源,请求新的资源,但新资源被其他进程占有;

2024-08-15 21:42:01 594

原创 linux系统编程:线程

注:1.pthread exit 本身表示结束线程,如果用在main函数中, 表示结束主线程,主线程结束 并不表示进程结束,此时,主线程执行流结束,进程会在其余线程都结束后结束。注:线程回调函数 -- 完成线程任务功能的函数 ,需要调用者,自己实现。//指向指针函数的函数指针。3.waitpid可以实现非阻塞调用 ---- 调用进程,逻辑一般不受影响。@retval ----用来保存,退出状态值所在空间的地址。2.wait是一种阻塞调用 --- 调用进程,一般不做额外的事情。

2024-08-15 11:45:38 993

原创 进程的执行与结束

等待进程改变状态,在调用进程的子进程中,获得子进程改变状态改变的相关信息,进程结束、信号暂停、恢复。2)exit() //库函数 c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。//path代表运行的文件路径 ,第一个arg 固定代表文件的名字,后面跟着的参数可以写他的参数 int。1、任务-----子进程做的事情 和父进程差不多 //子承父业。exec函数族---------作用,启动(运行)一个新的程序。e ---- 你要传给就你要调用的程序,该程序所需要的创建变量。

2024-08-13 21:48:51 935

原创 系统编程——进程

在linux下,程序在内存中的典型布局:栈、堆、bss(未被初始化)、data(初始化)、text。32位的平台,每个进程拥有独立的4G内存空间(虚拟的)(3G用户+1G内核)。进程(process)是指正在运行中的程序,即是程序的一次执行过程(也可以说是程序的一个实例)。PCB进程控制块(实际由结构体实现)+栈、堆、bss、data、text(进程的实体)。返回值:成功——(1)在父进程中,返回子进程的PID号;创建进程、进程的执行、进程结束、进程结束时资源的回收。通过复制调用进程(父进程)。

2024-08-12 21:15:47 707

原创 函数转换,目录操作

功能:FILE *fp —转换—> int fd。功能:int fd —转换—> FILE *fp。

2024-08-08 12:01:39 793

原创 标准IO——文件定位、文件IO

一、标准IO文件定位1、fseek(定位)int fseek(FILE *stream , long offset(偏移长度) , int whence(偏移起始位置))其中whence:三种宏——>SEEK_SET(开头) 、SEEKZ-CUR(当前) 、SEEK_END(末尾)。

2024-08-07 12:20:15 842

原创 文件IO操作分析

一、标准IO1、标准输入(intput)设备:键盘;标准输出(output)设备:显示器。2、标准输入输出头文件:<stdio.h> ——>路径:/usr(用户资源)/include/stdio.h;系统库函数默认路径:/usr/include/注意:stdio.h ——> stdio.c —编译后—> libc.so(动态库文件) ===>路径:/usr/lib/3、用man man 查看所有帮助:一共9章节;

2024-08-06 12:13:37 1811

原创 Linux操作系统(Shell脚本)

脚本名最好以.sh结尾,进入后#!/bin/bash写在第一行,意思为用bash来解析。一定记得+x,意思是给它一个可执行的权限。命令行用的最多的是:echo。若参数不是个位数则要带括号。arcr:看上面有几个东西。

2024-08-03 19:18:50 465

原创 结构体与共用体(二)

对已有起别名typedef int INT(从此以后INT不再是变量名而是类型名)。位运算(所有位运算要操作数的类型是与整形或者整形兼容,或者枚举也可以;但是指针,结构体这些都不可以,不与整形兼容)1,按位与是指定位清02.按位或| 指定位置13.按位异或^,指定位反转4.取反 单目运算 对所有的数取反5.<<左移,左移之后,不够补0,可以实现某一位置1,i | (1<< 5)(左移永远都是左移)6.右移>> 不够向右补0,右移分为算术右移(有符号,前面补1,也肯能补0;

2024-08-02 23:56:07 772

原创 十一.结构体与共用体

前面介绍了基本类型(或称简单类型)的变量(如整型、实型、字符型变量等),也介绍了一种构造类型数据--数组,数组中的各元素是属于同一个类型的。但是只有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的,例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项。这些项都与某一学生相联系,见图11-1。可以看到性别(sex)、年龄(age)、成绩(score)、地址(addr)是属于学号为10010和名为“LiFun”的学生的。

2024-08-01 17:41:57 538

原创 指针(二)

指向一维整型数组的指针,修饰的是数组的数据类型。int a[10];不能int *p;p = &a;int *p[10];定义了一个长度为10的指针数组,int(*p)[10],这个才是指向一维数组的数组指针。

2024-07-31 17:39:47 428

原创 指向数组元素的指针

迭代迭代逆序快速排序算法:循环一次后,左边所有的数都比基准数小,右边都比基准数大1. 首先获取数组的第一个值(作为基准)2. 遍历当前数组,从第二个值开始,比基准元素小的放到左侧数组,比基准元素大的放到右侧数组。3. 分别对左侧和右侧数组进行快速排序(递归)4. 直到当前进行快排的数组长度为 15. 开始合并,返回排列好的数组二分查找。

2024-07-31 12:08:41 536

原创 十. 指针

1.简单来讲,整型是用来装整数的数据类型,指针是用来装地址的数据类型。函数调用时,一般为值传递,所以不能直接访问;需要借用,来取地址进行间接访问。从而达到能够。2.指针变量作为函数参数定义指针变量的形式: 在int *p;中,*p为int型;p为int *(指针)型。指针变量自身也有地址,它只是另外开辟了一段内存空间来装地址。64位CPU,有64根地址总线,地址占8个字节;因此sizeof(int *)占8个字节。例如:函数调用,当值传递时,是再次拷贝一段新的内存空间,在该空间中进行操作;

2024-07-30 12:32:58 544

原创 九.预处理命令

在上一篇我们也提及到了一部分预处理的内容,其实预处理的本质就是无脑的文本替换;因此会很容易出现bug,比如我们的宏的参数为2 + 3;在进行文本替换时会将所有的宏名替换为2 + 3;若有处为2 * 宏,我们想要的结果是2 * (2 + 3)为10,而往往结果却是无脑的文本替换为2 * 2 + 3为7,因此在定义宏时就加括号,越多越好。(1)不带参宏其中的标识符一般大写;有一种只有宏名,无内容的宏:#define K 用来为将来使用做准备。(2)带参宏。

2024-07-28 16:54:56 631

原创 标识符的作用域与可见性

一,作用域分为局部作用域与全局作用域1、局部作用域通俗来讲,在花括号内的均为局部作用域。2、全局作用域所有的函数都有全局作用域。全局变量便在全局作用域,指定义在函数之外的变量,全局变量可以为本文件之外的其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。全局变量前可加‘ g_ ’前缀。全局变量若未被初始化,则自动以位模式清零。3.可见性规则:所有的标识符都符合以下四条规则(1)标识符必须先定义,再使用。(2)在同一作用域当中,不能定义同名标识符。

2024-07-28 16:37:32 535

原创 数组作为函数参数进行传递

二维数组作为函数参数进行调用的各种算法。

2024-07-26 21:12:58 707

原创 八. 函数

函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。在前面我们都是在一个函数里面进行编程,到这里将跳到main函数外进行编写其他函数(main函数中的一些算法),之后在main函数中需要一个算法直接调用前面编写的函数,目的是为了提高函数的耦合性和复用性,注意:在main函数中调用的函数称为被调函数,main函数为主调函数,被调函数一定要在主调函数之前。一个函数并不从属于另一个函数,即函数不能嵌套定义。

2024-07-26 09:25:24 917

原创 七.数组(二维数组)

a[3][4]可以理解为二维数组是一个特殊的一维数组,其中有三个元素a[0] - a[2],只不过每一个元素都是一个长度为4的一维数组。方法2:int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};eg:a[2][3],下标可以为整型表达式,如a[2 - 1][2 * 3 - 1],不能写成a[2,3]a[2 - 1,2 * 3 - 1]的形式。方法1:int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}形式:数组名[下标][下标]

2024-07-24 16:17:28 159

原创 7.数组(字符数组)

如果有一个字符串,前面9个字符都不是空字符(即'\0'),而第10个字符时‘\0',则此字符串的有效字符为9个。虽然“Hello”看似只有五个元素,实则放在数组s中占据六个字节,因为在最后面多了一个'\0',剩下均自动补充0,因此初始化之后s[100]为'H','e','l','l','o','\0',0,0,0,0........比较字符串1和字符串2,结果三种情况:大于0,小于0,等于0,字符串1大于字符串2时,结果大于0,其余同理。形式:strcmp(字符串1,字符串2)4.字符串和字符串结束标志。

2024-07-23 21:20:14 422

原创 七.数 组(一维数组)

定义了一个有是个元素的整型数组a;相邻两个元素之间两两比较,小的放前,大的放后。类型说明符不能为为void型,只能void *a;数组必须先定义然后使用,只能引用数组元素,不能同时引用整个数组;形式:类型说明符 数组名[常量表达式(>= 1)]定义中的[]只是类型说明符。1)选择排序:在数组合适的位置上放上合适的数。也可在定义中去掉变量名,剩下类型名。数组的数组名代表数组的首元素的地址。数组存放特性:单一性,有序性,连续性。选择排序,冒号排序,插入法排序。一定防止数组的越界访问。形式:数组名[下标]

2024-07-22 18:05:36 185

原创 六.循环控制

(++i)若没有这个循环一直为真,死循环。2)循环(终止当前循环)语句标号用标识符表示,为字母,数字,下划线组成,第一个字符不能是数字,不能用整数。continue语句:终止本次循环并立即进入下一次循环。注意:1)while(表达式)后不加:加了为空语句,死循环,等同于while(表达式)三种循环(while,do......while,for)循环都可以互相嵌套。2)while(表达式)下方不能加空行。先执行循环体,再判断逻辑关系的真假,真则再次循环,假则终止。循环的三要素:1.循环变量初始化语句。

2024-07-21 14:12:31 901

原创 选择结构程序设计

if() 运行到这里时,前面都为真。{ 先对表达式求值。如果两个case():语句表达一样,可以重叠。switch(表达式) 表达式必须是整型与整型相兼容。|| 有一个为真则为真——双目。逻辑非,真为假,假为真——单目。正确:k = i < -4 && -4 < j;&& 左右都为真才为真——双目。a : b 真为a,假为b。if(表达式) 条件为真则执行。1.关系运算符和关系表达式。不能写连续比较的逻辑关系。3.if else语句。5.switch语句。

2024-07-19 15:03:56 85

空空如也

空空如也

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

TA关注的人

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