- 博客(30)
- 收藏
- 关注
原创 C++类和对象(一)
class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。为了区分成员变量,一般习惯上成员变量会加上一个特殊标识,如成员变量前面或后面加_或者m开头。C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级了类,明显的变化是struct中可以定义函数,一般情况下还是使用class定义类。structC语言中是定义结构体。
2025-02-26 20:23:45
565
原创 C++入门
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中为命名空间的成员。命名空间中可以定义变量/函数/类型等。#include<iostream>//头文件//namespace 是关键字//1.正常的命名空间的定义//命名空间中可以定义变量/函数/类型int val;int main()//这里默认是访问的是全局的rand函数指针//这里指定zj命名空间的randreturn 0;
2025-02-13 16:35:34
798
2
原创 数据结构二叉树-C语言
现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。根结点的左子树和右子树分别又是由子树结点、子树结点的左孩子、子树结点的右孩子组成的,因此二叉树定义是递归式的,后序链式二叉树的操作中基本都是按照该概念实现的。的原则,使用递归的方法,先将根结点打印出来,在访问结点的左孩子,直到访问到为空,在回到结点,访问结点的右孩子。:若一个结点含有子结点,则这个结点称为其子结点的夫结点;
2025-01-10 21:34:58
1043
2
原创 C语言数据结构-栈和队列
/定义栈的数据结构int top;//指向栈顶的位置//空间的大小}ST;由于队列是由链表构成的,所以在结构体定义时,需要将链表中的头结点和尾节点定义出来,队列是由数据域和指针域组成的,也是需要定义出来的。//定义队列结点结构体}QN;QN* phead;QN* ptail;
2024-11-30 21:28:45
997
1
原创 C语言数据结构-链表
图中指针变量plist保存的是第一个结点的地址,我们称plist此时“指向”第一个结点,如果我们希望plist“指向”第二个结点时,只需要修改plist保存的内容为0x0012FFA0.在前面说的单链表中的“头结点”,该头结点是链表的首节点(第一个结点),实际这样的称呼是错误的,因为链表中存在一种链表叫做带头链表(不是指链表里第一个有效的结点),这里的头结点指的是,在这里直接使用plist来遍历结果也是一样的,重新创建个pcur指针,是为了避免由于指针指向的改变,导致无法重新找到链表的首结点。
2024-11-26 23:13:44
1574
2
原创 数据结构-顺序表(c语言)
要插入的数据量跟增量是正相关的,这样空间浪费比较少。既能避免频繁增容,又能保证最大程度的减少空间的浪费。那么就一次多来点,增加大空间(空间浪费),这两种都不行,那么就取中,增容按倍数增加,如,2倍…线性表是一种实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…空间足够才能插,不够的话就增容,那么就可以将增容再分装成一个函数,可以直接使用。静态顺序表的缺陷:空间给少了不够用(用户流失),给多了造成空间浪费。顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。
2024-10-29 16:21:39
940
3
原创 数据结构-复杂度
通过上面我们会发现,有些算法的时间复杂度存在最好、平均和最坏情况最坏情况:任意输入规模的最大运行次数(上界)平均情况:任意输入规模的期望运行次数最好情况:任意输入规模的最小运行次数(下界)
2024-10-20 22:29:26
1093
2
原创 联合和枚举
每一种商品都有的就是公共属性,所以我们可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存。联合的成员共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大得那个成员)。在C语言中是可以的,但是在C++是不行的,C++的类型检查比较严格。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐最大对齐数的整数倍。
2024-09-26 09:40:10
683
3
原创 C语言-结构体
位段的声明和结构是类似的,有两个不同:1.位段的成员必须是int、unsigned int 或 signed int,在C99中位段成员的类型也可以选择其他类型。2.位段的成员名后边有一个冒号和一个数字struct Aint _a : 2;int _b : 5;A就是一个位段类型。那位段A所占的大小是多少?
2024-09-22 16:21:40
1097
1
原创 C语言内存函数
我们自己模拟实现的memcpy函数是不支持处理内存重叠的情况,但是库里的memcpy在VS中是可以实现的。如果source和destination有任何的重叠,复制的结果都是未定义的。将arr1中的1,2,3,4,5拷贝到arr1中的3,4,5,6,7能否实现。将1,2放到3,4后,再想从原来位置3拿到3的时候就被1覆盖了,所以不能实现。和memcpy的差别就是memmove函数处理的源内存块是可以重叠的。比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。做的是内存块的比较。
2024-09-21 15:29:50
547
原创 字符函数和字符串函数(2)
这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样,就提前结束,大的字符所在的字符串大于另外一个。(在一个字符串中找另一个字符串)
2024-09-11 19:57:27
1126
原创 字符函数和字符串函数(1)
在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列函数,接下来我们就学习一下这些函数。字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含‘\0’).上面的代码,我们将小写转大写,是用ASCII来完成效果,有了转换函数,就可以直接使用函数来转换。源字符串必须以‘\0’结束,被拷贝的必须有‘\0’,如果没有‘\0’可能会造成越界访问。C语言中一系列的函数说专门做字符分类的,也就是一个字符是属于什么类型的字符的。
2024-09-10 17:32:11
659
原创 操作符详解(2)
struct Stu//名字int age;//年龄//成绩int main()struct Stu s1 = { "张三",20,95.5f };//结构体变量的初始化struct Stu s1 = { .age = 20,.score = 95.5,.name = "李四" };//当我们想要乱序的时候可以使用.return 0;当我们想结构体中嵌套结构体时,是怎么来初始化的呢?int m;struct Stu//名字int age;//年龄。
2024-09-03 18:23:09
814
原创 操作符详解(1)
16进制的数字每一位是0 ~9,a ~ f的数字,各自写成2进制,最多有4个2进制位就足够了,比如 f 的二进制是1111,所以在2进制转16进制的时候,从2进制序列的右边低位开始向左每4个2进制位会换算一个16进制位,剩余不够4个二进制位的直接换算。8进制的数字每一位是0 ~ 7的,0 ~ 7的数字,写成2进制,最多有3个2进制位就足够了,比如7的二进制是111,所以在2进制转8进制的时候,从2进制序列中右边低位开始向左每3个2进制位会换算一个8进制位,剩余不够3个2进制位的直接换算。
2024-09-01 18:48:02
681
原创 C语言实现游戏-扫雷
但是,当我们排雷的时候,统计出某个位置有一个雷,这就和我们布置的雷产生了歧义,到底是这个位置周围有一个雷,还是,该位置布置了雷?输入0,直接退出游戏;为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐标上,周围一圈不去布置雷就可以了,这样就解决了越界的问题。我们在打印之前,需要将mine函数全部放入‘0’,是还没有布置雷,为了好看,我们将布置好雷,存放雷信息的数组show放入‘*’扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要一定的数据结构来存储这些信息。
2024-08-17 22:00:11
1115
原创 指针(5)-学习笔记
如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过&函数名的方式获得函数的地址。如果我们要将函数的地址存放起来,就得创建函数指针变量,函数指针变量的写法其实和数组指针非常类似。函数指针变量应该是用来存放函数地址的,未来通过地址能够调用函数的。
2024-08-13 21:03:16
547
原创 指针(4)-学习笔记
所以,根据数组名是首元素地址的这个规则,二维数组的数组名表示的就是第一行的地址,是一维数组的地址。根据上面的例子,第一行的一维数组的类型就是int [5],所以第一行的地址的类型就是数组指针类型int(*)[5].那就意味着。⾸先我们再次理解⼀下⼆维数组,⼆维数组其实可以看做是每个元素是⼀维数组的数组,也就是⼆维数组的每个元素是⼀个⼀维数组。二维数组传参,实参也是数组名,数组名是数组首元素的地址,既然实参传过去的是地址,形参就可以写成指针变量。存放的是整型变量的地址,能够指向整型数据的指针。
2024-08-12 23:16:19
256
原创 指针(3)-学习笔记
• *ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa .• **ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作:*pa ,那找到的是a.如果,我们发现在冒泡排序中一对都没有交换的话,说明以及有序了,就不需要再进行了。指针数组的每个元素都是用来存放地址(指针)的。指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?冒泡排序的思想就是:两两相邻的元素进行比较,有需要的话,交换。指针数组的每个元素是地址,又可以指向一块区域。
2024-08-11 15:41:14
278
原创 指针(2)-学习笔记
可以看到,a,b.x.y的地址并不相同,相当于x,y是独立的空间,那么再Swap函数内部交换x,y的值,自然不会影响a和b,当Swap函数调用结束后回到main函数,a和b没有交换,使用函数的时候,是把变量本身直接传递给了函数,这种调用函数的方式我们之前在函数的时候就知道了,叫做。② &数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)NULL是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。
2024-08-10 17:21:47
902
原创 指针(1)-学习笔记
我们知道CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,其实就是把内存划分为一个个的内存单元,每个内存单元的大小取1个字节。在C语言中,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,这里就必须来了解一下*(解引用操作符)。在第二段代码中,强制将n的地址从int类型转换到char类型,可以发现,存储在内存中的字节发生了改变,从4个字节变为1个字节。指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。
2024-08-09 19:24:23
793
原创 C语言—— 函数
ret_type fun_name(形式参数)ret_type 是函数返回类型,就是这个函数运行结束后,得出的结果的类型,可以是整型,浮点型等,也可以没有返回类型。fun_name 是函数名。函数有了名字方便调用,所以函数名尽量要根据函数 的功能起的有意义。括号中放的是形式参数。{ }括起来的是函数体。函数体就是完成计算的过程函数一定要满足先声明后使用。//函数声明int main()//函数调用printf("闰年\n");elseprintf("不是闰年\n");
2024-07-30 20:52:14
684
原创 写一个猜数字游戏
1.电脑自动生成1~100的随机数2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束。3.如果玩完一次游戏后不过硬,还可以持续玩。
2024-07-29 16:22:03
1032
原创 C语言——分支和循环(1)
C语言是结构化的程序设计语言,这里的结构指的是,C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。
2024-07-27 18:52:37
696
原创 分支与循环
如果一个数不是奇数,那就是偶数了,如果任意一个整数,我们要清楚的判断是奇数还是偶数怎么表示?C语言是结构化的程序设计语言,这里的结构指的是顺序结构,选择结构,循环结构。例子:输入一个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。在if else语句中,else可以与另一个if语句连用,构成多重判断。比如:要求输入一个整数,判断输入的整数是0,还是正数,还是正数或负数。表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。默认在if和else语句中默认都只能控制一条语句。
2024-05-21 18:14:17
225
原创 数组(一维数组)
接下来,如果想要访问整个数组的内容,只要我们产生数组所有元素的下标就可以,那我们使用for循环产生0·9的下标,接下来使用下标访问就可以了。C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号。①数组中存放数据的类型,可以是:char,short,int,float等,也可以是自定义类型。③[ ]中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。明白了数组的访问,当然我们也根据需求,自己给数组输入想要的数据,如下,
2024-05-19 19:34:40
326
1
原创 C语言的数据类型和变量(1)
每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不 同,存储的数据范围就有所差异。sizeof 是一个关键字,也是操作符,专门是用来计算sizeof的操作符数的类型长度的,单位是字节。sizeof 的操作数如果不是类型,是表达式的时候,可以省略后边的括号。数据既是程序处理的对象,也是处理的结果。整数变量声明的好处是,同样长度的内存能够表示的最大整数值,增大了一倍。sizeof 操作符的操作数可以是类型,也可以是变量或者表达式。内置类型是C语言中有的;
2024-04-16 21:24:26
505
原创 小赵的编程之路(初版)
大家好,我是一名来自西安的大一学生,专业是人工智能专业。作为一名计算机领域的学生,学习编程是必不可少的,下面我会将我所学到的知识,通过自己的吸收和总结,分享在我的博客账号里,也希望有更多想要进步,想要提升的编程初学者加入,我们可以一同讨论,共同进步。从今天开始每天都要敲代码,认真踏实学到东西,在未来毕业时找到一个好工作。学校上课和课下看视频学习,每周至少写一篇博客,来总结这一周的学习,巩固自己所学到的知识,通过gitee记录自己的学习。每周花费12个小时来学习,每天至少保证一个半小时的学习时间。
2024-03-30 21:48:14
251
原创 C语言二维数组,求两个矩阵之差
该语句定义了一个2行3列的数组,数组名为b,其下标变量的类型为整形。元素类型说明符 数组名【行数】【列数】={元素初值列表}下面将两个数组进行做差,需要再引入一个数组MC。在将两个数组相减,输出MC,MC=MA-MB。首先写入两个二位数组。
2023-12-12 19:11:51
423
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人