- 博客(20)
- 收藏
- 关注
原创 C++ 类和对象(中)
C++的六个默认成员函数中前面四个默认成员函数非常重要,也非常复杂,需要我们根据具体情况判断是否需要显式定义,大部分情况下,构造函数都需要我们自己定义,其他三个在类中有指针类型的成员变量时同时出现,而最后两个函数通常不需要显示定义,使用编译器默认生成的即可。
2023-09-13 21:35:38
133
1
原创 C++ 类和对象(上)
在日常生活或编程中,简单的问题可以用面向过程的思路来解决,直接有效,但是当问题的规模变得更大时,解决问题的步骤不确定时,用面向过程的思想是远远不够的,所以慢慢就出现了面向对象的编程思想。世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的**属性和行为**,对象与对象之间**通过方法来交互**。面向对象是一种**以“对象”为中心**的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。
2023-09-13 21:33:29
148
1
原创 C++引用
在我们的现实生活中,一个人经常不只一个名字,比如有一个人叫张伟,但是其他人又在日常生活中给他取了很多绰号,比如张大炮,张益达,斯内克;在古代,这种情况也很常见,比如宋江又叫及时雨,李逵又叫黑旋风、铁牛等等;我们把上面这些外号叫做别名。
2023-09-04 19:22:20
125
1
原创 【C++】C++基础知识
C++是对C语言的完善以及再发展,C++通过增加一些新的语法来弥补C语言的不足,可以看作是C语言的超集,所以C++是兼容C的,也就是说我们在.cpp文件中编写、运行 .c 程序,编译器也不会报错,反之则不行;C 和 C++的基本设计理念可以概括为“信任程序员C++旨在让程序员可以高度自由地完成他们想要的任务,这意味着新程序员可能会陷入相当多的陷阱,这是“知道如何正确使用C++和不该怎么用C++两者同等重要”的原因之一,也是C++被广泛认为难学的原因之一。
2023-09-04 19:10:00
147
1
原创 【数据结构】二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成的一个具有层次关系的集合;它被称为树是因为其看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
2023-08-20 19:43:54
99
2
原创 【数据结构】栈和队列
栈可以用顺序表实现,也可以用链表实现,这里选用顺序表实现,原因如下:1、栈的插入和删除操作都在栈顶,即在数据的尾部进行,而顺序表在尾部插入和删除数据的效率为O(1),完美的避开了顺序表的缺陷;2、顺序表扩容和链表频繁 malloc 在整体上的效率是差不多的,只是顺序表会存在一定的空间浪费;3、顺序表支持随机访问,且其缓存利用率更高;综合考虑以上几种因素,我们采用顺序表实现栈
2023-08-10 21:59:24
79
1
原创 【数据结构】带头双向循环链表的增删查改
在上一节中我们学习了单链表,但是我们发现单链表有如下缺陷:1、在尾部插入、删除数据时间复杂度为O(N),效率低;2、在pos位置前插入、删除数据时间复杂度为O(N),效率低;3、进行插入、删除数据时因为有可能改变头节点,所以需要传递二级指针,不易理解;基于单链表的这些缺陷,我们设计出了带头双向循环链表,带头双向循环链表能够完美地解决顺序表所存在的所有缺陷。相比于单链表,双向链表需要增加一个结构体指针prev,用来存放前一个节点的地址。
2023-08-10 21:56:53
386
1
原创 【数据结构】单链表的增删查改
在上一节中我们提到了顺序表有如下缺陷:在头部/中间的插入与删除需要挪动数据,时间复杂度为O(N),效率低;增容需要申请新空间,可能会拷贝数据,释放旧空间,会有不小的时间消耗;增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到 200,如果我们再继续插入了5个数据,后面没有数据插入了,那么会浪费95个数据空间;基于顺序表的这些不足,我们设计出了链表。
2023-08-10 21:53:39
462
1
原创 【数据结构】顺序表的增删查改
线性表(linear list)是n个具有相同特性的数据元素的有限序列;线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串…顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。简单来说,顺序表就是数组,只是要求数组里面的元素必须连续存储而已
2023-08-10 21:51:24
127
1
原创 C语言程序环境和预处理
C语言程序编译过程通常包括以下几个步骤:预处理(Preprocessing):在这个阶段,预处理器会根据程序中的指令对源代码进行处理。它会执行诸如文件包含、宏替换等操作,生成经过处理的代码。编译(Compilation):编译器会将经过预处理后的代码进行词法分析、语法分析和语义分析。它会检查代码是否符合语法规则,并将其转换为低级的中间代码,如汇编语言。汇编(Assembly):在这个阶段,汇编器会将编译器生成的汇编代码转换为机器可执行的指令。它会根据特定的硬件架构生成对应的机器码。链接
2023-07-22 21:57:57
117
原创 C语言小项目——通讯录
在学习了结构体、动态内存管理以及文件操作的相关知识后,我们可以根据以上基本要求来分别设计三个版本的通讯录,分别是静态版、动态版和文件版静态版:是最基础的版本,能满足对通讯录内部联系人的增删查改、对联系人按姓名,年龄,电话或住址进行排序、显示通讯录中所有联系人、退出通讯录。动态版:动态版的通讯录能满足静态版通讯录的所有功能,但是内部实现由固定大小改为动态增容;文件版:文件版的通讯录能满足动态版通讯录的所有功能,但是会在程序退出时把联系人信息保存在文件中,在程序运行时把文件中的联系人信息加载到通讯录
2023-07-22 21:52:40
140
原创 C语言文件操作
程序文件和数据文件(从文件功能的角度来分类的)程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)数据文件:文件的内容不一定是程序,也可能是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件,以下讨论的都是数据文件。文件名:一个文件要有一个唯一的文件标识,以便用户识别和引用文件名包含3部分:文件路径+文件名主干+文件后缀,例如: c:\code\test.txt。
2023-07-22 21:48:13
82
原创 动态内存分配
动态内存分配是计算机科学中的一个过程,程序在运行时请求系统分配内存。这与静态内存分配相对,静态内存分配是在编译时分配内存。动态内存分配的优点包括:程序员可以控制需要多少内存以及何时需要内存。可以创建大型数据结构,如链表和图。可以创建和管理动态数据结构,如堆栈、队列、链表等。缺点包括:需要手动管理内存,包括分配和释放,否则可能导致内存泄漏。如果不正确地使用,可能会导致程序错误
2023-07-22 21:42:59
265
原创 自定义类型详解:结构体,枚举,联合
C语言的数据类型包括基本类型(内置类型)、构造类型(自定义类型)、指针类型和空类型(void),其中基本类型就是我们常见的整形、浮点型等,而自定义类型则包括数组、结构体、字段、枚举、联合(共用体),数组我们已经非常熟悉了,今天我们主要学习自定义类型中其他几种类型:结构体、字段、枚举以及联合。
2023-07-22 21:35:31
80
原创 字符串函数
字符串就是一串零个或多个字符,以一个ASCIIC码为0的‘\0’字符结尾,\0是字符串的终止符,它并不是字符串的一部分。语言中对字符和字符串的处理很是频繁,但是C语言本身是没有显式的字符串数据类型的,因为字符串通常以字符串常量的形式出现或者存储于字符数组中。字符串常量适用于那些对它不做修改的字符串函数。头文件string.h包含了字符串函数所需的原型和声明。
2023-07-22 21:33:12
78
原创 数据在内存中的存储:详细解析
数据类型详细介绍整型在内存中的存储:原码、反码、补码大小端字节序介绍及判断浮点型在内存中的存储解析计算机中有多种数据类型,包括整型、浮点型、字符型等,每种数据类型都有其特定的表示范围和存储方式。
2023-07-22 21:29:53
319
原创 【C语言】getchar()函数和scanf()函数的使用
缓冲区是指在内存中开辟出来的一块空间,用于存储输入或输出流中的数据。在C语言中,输入流和输出流都有自己的缓冲区。当我们使用scanf()函数从标准输入流(例如键盘)读取数据时,输入的字符会先被存储在输入流的缓冲区中,直到遇到换行符或文件结束符。而当我们使用printf()函数向标准输出流(例如屏幕)写入数据时,输出的字符会先被存储在输出流的缓冲区中,直到缓冲区满或者我们手动刷新缓冲区。getchar()函数可以帮助我们从输入流缓冲区中读取一个字符,并返回该字符的ASCII码值。
2023-07-22 21:23:50
954
原创 C语言详解关键字-static
全局变量和函数是可以跨文件访问的,因为有一定规模的项目,一定是多文件的,多个文件之间,后续一定要进行数据“交互” ,如果不能跨文件访问,数据"交互"成本会非常高,所以C语言在设计的时候就规定了全局变量和函数可以跨文件访问(全局变量需要extern关键字声明)
2023-07-22 21:20:45
209
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人