- 博客(21)
- 收藏
- 关注
原创 【游戏专区】贪吃蛇
Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便 称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应⽤程序编程接⼝。
2025-03-31 09:16:58
916
原创 【游戏专区】飞机大战
想想我们飞机需要哪些结构,坐标,血量还有什么呢//创建飞机结构int x;//飞机坐标int y;bool isDie;//是否健在int width;//宽度int height;//长度int frame;//当前帧int hp;//血量int type;//敌机类型}Plane;有了飞机的结构以及初始化,我们是不是还需要将其加载进入飞机图片。
2025-03-26 08:36:41
791
原创 C语言【编译和链接】
_FILE__ // 进行编译的源文件__LINE__ // 文件当前的行号__DATE__ // 文件被编译的日期__TIME__ // 文件被编译的时间__STDC__ // 如果编译器遵循 ANSI C,其值为 1,否则未定义好像这样看是不是还是不太了解,我们直接上代码,一起观察这些预定义符号是一个预定义的宏,用于指示编译器是否符合ISO C标准(ANSI C标准)。如果编译器遵循ISO C标准,则该宏会被定义为1;否则,它未定义或者被定义为其他值。
2025-03-25 09:57:46
654
原创 【文件操作API的使用】
fopen和fclosefopen() 是一个用于在C语言中打开文件的标准库函数。它通常用于打开一个文件,并返回一个指向该文件的文件指针。fopen() 函数具有以下一般形式:其中:参数1:filename:要打开的文件的路径。参数2:mode:打开文件的模式,可以是以下之一:"r":只读模式。文件必须存在,否则函数失败。"w":写入模式。如果文件存在,则文件内容被清空,如果文件不存在,则创建新文件。"a":追加模式。
2025-03-24 08:47:01
368
原创 C语言(结构体,联合体,枚举的讲解)
灵活性:宏定义可以定义更复杂的常量,如带参数的宏、条件编译等,具有更大的灵活性。无类型约束:宏定义不受类型限制,可以用于定义任何类型的常量,包括字符串、表达式等。
2025-03-21 17:21:45
457
原创 深入了解C语言中浮点数的存储方式
因为这期可能对你们来说太简单了,所以我用一个字来概括吧好了,结束了,我们下期再见喽,不会有人真的走了吧,好了,砸门多的不说少的不闹好吧,直接上主食。
2025-03-21 17:20:52
896
原创 C语言(字符串函数的模拟实现)
是 C 语言标准库中的一个函数,用于在一个字符串中查找第一次出现另一个字符串的位置。是 C 语言标准库中的一个函数,用于将一个字符串追加到另一个字符串的末尾。是 C 语言标准库中的一个函数,用于计算字符串的长度(即字符个数)。是 C 语言标准库中的一个函数,用于将指定长度的字符串从源字符串复制到目标字符串中。允许指定要复制的字符数,即使源字符串的长度超过指定的字符数。允许指定要追加的字符数,即使源字符串的长度超过指定的字符数。是 C 语言标准库中的一个函数,用于将指定长度的源字符串追加到目标字符串的末尾。
2025-03-21 17:14:10
875
原创 [高并发网络通信架构]实现tcp的高并发服务端
I/O多路复用(IO Multiplexing)是一种并发编程技术,用于同时监视多个I/O事件并选择就绪的事件进行处理。它可以通过一个线程或进程同时处理多个I/O操作,而不需要为每个I/O操作创建一个独立的线程或进程。I/O多路复用可以提高系统的并发性能,减少资源的消耗。在传统的编程模型中,每个I/O操作通常都需要一个独立的线程或进程来处理。这种方式在面对大量的并发连接时,会导致系统资源的浪费和性能下降。
2025-03-20 16:17:52
1237
原创 嵌入式sqlite3库API的使用
还记得我们上期讲了什么吗,没错,我们上期讲到了sqlite的使用,通过对比sqlite3和MySQL进一步了解了sqlite的使用场景,然后我们也讲了如何通过在linux终端执行命令行的方式去操作数据库增,删,改,查。我想大家应该对其有了一定的了解,今天我们来了解如何通过代码的方式去实现它的,增,删,改,查。我们通过这个函数,以及上一期我们讲到的在linux终端执行的SQL命令行就已经可以实现其增,删,改,查了。首先,我们想去操作数据库,就必须去打开它,才能进行下一步操作,当我们结束之后,是不是应该。
2025-03-20 16:17:19
456
原创 嵌入式sqlite3库的使用
1. **性能受限:** 对于大规模数据或高并发环境(高并发是指系统在同一时间内接收并处理大量的并发请求,对于数据库而言,高并发意味着大量的并发读写操作),SQLite 的性能可能不如其他专业的数据库系统。当然这些我们都可以不用特意的记,用到的时候可以搜索。说人话呢,就是你将数据存入数据库,就像你的钱存入银行,会更加的安全,高效,能够快速查询余额,也能够存储更久的时间。*到这里,我们通过命令操控终端去增,删,改,查数据库已经完成了,那我们怎么通过代码的方式去实现呢,话说贪多嚼不烂,我们下期再见。
2025-03-20 16:16:27
2222
原创 C语言“巨简单”——指针
那么再想一下,你的好朋友住在这栋楼里面,你要去找他玩,你能通过什么去确认他的房间,然后找到他呢,没错,就是房间号。例如,如果你有一个指向数组开头的指针,你可以使用指针加上一个偏移量来访问数组中的元素,这个偏移量将会与指针的大小相乘。这么说吧,数组能做的事情,我指针基本都能做,数组不能做的事情,我指针依旧可以做,这就是我。没想到吧,指针也是可以进行算术运算的,不过最好是指向同一块空间的指针,不然它们的加减没有意义。我们在学习C语言的时候,是不是觉得指针这章节“巨简单”,一听就会,一写就废。
2025-03-20 16:15:56
269
原创 【游戏专区】扫雷
这时候,我们运行程序,你就会发现有一道黑影一闪而过,那是因为我们计算机处理数据特别快,我们肉眼很难捕捉,所以我们要阻塞一下,让其停止,等待我们下一步操作。我们了解了扫雷的规则,那我们要怎么写它呢,首先,我们看到它的很多格子,能想到我们所学C语言的什么,没错啦,就是二维数组。我们现在基本什么都有了,但是这样还不行,因为我们现在是明文,玩家可以看到我们的雷,所以就没什么可玩性,为了我们游戏的可玩性,我们有两套方案。我们玩过扫雷的都知道,当我们点击空白也就是0的时候,我们就展开一片,我们应该怎么做呢,让我们。
2025-03-20 16:15:21
712
原创 欢迎走进C语言-(通讯录小项目)
很多细心地小伙伴已经发现了,我们在打开文件和增加成员的函数中都调用了增容函数会不会有冲突,导致多次增容呢,其实,仔细想一想我们在程序执行的时候只调用一次初始化函数,在获取数据的时候会不会出现数据大于我们申请的空间,我们是不是需要申请空间用于加载我们的数据,以免数据丢失。我们有了增加成员的函数,为了验证我们写的函数是否有问题,我们可以写一个显示成员函数,将我们存入的数据打印出来,来判断我们写的是否正确。那如果有一天我们存入的人员惹我们不高兴了,我们想跟他们同归于尽或者销毁他们,我们能做到吗,
2025-03-20 16:14:46
665
原创 “巧妙的”栈和队列(2)
熟悉我们套路的小伙伴应该都清楚,接下来就是我们出数据了,还记得我们的函数声明吗,我们设计了,队头出数据和队尾出数据,但我们队尾出数据只能出队尾本身数据,而无法出队尾的上一个数据。那可能有人就会有疑问了,为什么让他们指向NULL,而不是malloc一个新节点,让他们指向新节点呢,这也是可以的,至于怎么做,那就交给你们喽,让我们接下实现队列的入数据。那是不是很好的发挥出了我们链表的优势呢,那我们一起来写一个吧,老规矩,先写结构体呗。好啦,那我们来实现它,给我们今天的学习画上句号吧。今天我们要实现的接口,如下。
2025-03-20 16:13:48
207
原创 “巧妙的”栈和队列(1)
栈的最后一个元素称为栈顶元素,栈顶元素可以通过栈顶指针来访问和修改栈的插入和删除操作通常在栈顶进行,因此插入和删除操作的效率比较高。在写之前,我们应该先了解用我们所学到的顺序表和链表那个实现好,按照栈的先进后出的特性,很明显顺序表比较更容易满足其要求,大家都应该知道链表尾删,是需要先找尾并记住它的前一个,这不利于我们出数据。哈哈,开个玩笑,我们要去学习栈和队列,我们是不是也应该去了解它的概念,那什么是栈,又什么是队列呢,那么接下来,就让我们一起看看。接下来我们要实现,插入,删除,取栈顶数据的接口。
2025-03-20 16:12:49
378
原创 “复杂的”双向带头循环链表
在这里很多小伙伴应该都想明白了,我们写的是带头双向循环链表,那这个头怎么来的,难道创建结构体附赠的吗,显然不是。这种链表的特点是链表的头结点和尾结点都是同一个节点,并且头结点只存储一个指针,指向链表的第一个节点,而链表的最后一个节点的指针指向头结点。哈哈,有没有问题,我们有了头插,尾插,头删,尾删。很多朋友可能想到了,我们既然有了任意位置的插入和删除,那我们能不能把尾插和头插,尾删和头删利用任意位置的插入,删除搞定呢。感觉好复杂啊,应该很不容易实现吧,其实,它是只纸老虎,善于伪装。
2025-03-20 16:11:43
319
原创 有趣的单链表
链表的第一个节点称为头节点。我想聪明的你们应该也发现了一种极端情况,当我们的链表被删的没有数据了应该怎么办,是继续删吗,答案当然是否定的,在这里我使用了比较暴力的解法:断言(assert)报错,当然你们也是可以使用相对温柔的做法的。很明显我们写的是真确的,很多细心的小伙伴可能会发现我们传的是结构指针的地址,所以我们在接受参数的时候必须用二级指针去接受,当然,小伙伴们也是可以用返回值来接收的。其实原因也很简单,我们这里创建的是没有哨兵位头结点的单链表,我们要去改变它的头结点,所以我们就应该传它的地址过去。
2025-03-20 16:10:40
784
原创 了解string
注:1.在string尾部追加字符时, s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。(5). 注意:这个类独立于左右的编码来处理字节,如果用来处理多字节或变长字符(如UTF-8)的序列, 这个类的做优成员(如长度或大小)以及她的迭代器, 将任然按照字节(而不是实际编码的字符)来操作。部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。
2025-03-20 16:09:01
711
原创 STL(vector的使用与基础实现)
1.vector是可变大小数组的序列容器(顺序结构)。2.vector采用连续空间来存储元素,这就意味着可以像数组一样用下标访问,但vector可动态改变,它的大小也可被容器自动分配。3.空间不足,插入新元素时,会重新申请空间,将数据拷贝到新空间,释放旧空间。就时间而言。这是一个相对代价较高的任务,因为每当一个新的元素加入容器中,都会有一定几率触发扩容。4.vector分配空间策略:vector会分配一些额外的空间以适应可能得增长,因为存储空间比实际需要的存储更大。
2025-03-20 16:07:11
2097
1
原创 进程间通信(匿名管道)
匿名管道(无名管道)特点:仅用于具有亲缘关系的进程(如父子进程),数据单向流动(半双工),基于内存实现。实现方式:通过pipe()系统调用创建,返回两个文件描述符(读端和写端)命名管道(FIFO)特点:允许无关进程通信,通过文件系统中的路劲名标识,支持阻塞和非阻塞模式。实现方式:使用mkfifo()创建,通过open()和文件读写操作进行通信。注:匿名管道的默认大小通常为64 KB,这意味着它可以缓存最多 64 KB 的数据。如果超过此大小,写入操作会被阻塞,直到管道中的数据被读取并释放空间场景行为。
2025-03-20 16:05:06
1222
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅