自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于huffman树的文件压缩项目以及相关测试

项目采用Huffman编码的方式进行文件压缩与解压缩。主要原理是通过Huffman编码来表示字符,出现次数多的编码短,出现次数少的编码长,这样整体而言,所需要的bit位是减少的,就实现了文件压缩功能。读取文件中的字符出现次数,构建Huffman树,然后解析这个字符的每一位,遇到一个叶子结点,就代表还原了一个字符,这时就将这个字符写到解压缩文件里。注意当大部分字符出现的频率都差不多时,Huffman压缩的效率比较低。

2024-09-08 20:44:05 1168

原创 个人博客系统项目自动化测试

1. 个人博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的个人博客系统。其结合后端实现了以下的主要功能:登录、编辑博客、注销、删除博客、以及强制登录等功能。2.但是该项目没有设计用户注册功能,只能提前在数据库中存储用户信息后经过校验登录;并且用户头像不能自己设定,在进行前端页面的书写过程中已经将头像的图片写为静态了;

2024-09-03 10:46:37 813

原创 为什么计算机中存储的是补码

计算机中存储的是补码,这主要是因为补码具有一系列的优势,使其成为计算机内部表示和存储数据的最佳选择。

2024-07-30 16:19:41 883

原创 数组和指针

指针数组是一个数组,它的每个元素都是一个指针。这些指针可以指向不同类型的数据,但通常在同一个指针数组中,所有的指针都指向相同类型的数据。指针数组允许你存储多个变量的地址,这在处理字符串数组、动态数组或者对象数组时特别有用。数组指针是指向数组的指针。它存储的是整个数组的地址,而不是数组第一个元素的地址。通过数组指针,你可以直接访问整个数组。二维数组是数组的数组,可以看作是表格或矩阵。在C语言中,二维数组通过两个索引来访问其元素,通常第一个索引表示行,第二个索引表示列。

2024-07-30 16:04:04 1557

原创 为什么存在内存对齐

综上所述,内存对齐是为了满足硬件要求、提高访问速度、优化存储空间、增强平台兼容性以及便于编译器优化等多种目的而存在的。在编程中,掌握内存对齐的原理和应用,将有助于编写高效、可移植的代码。

2024-07-27 12:37:59 431

原创 存储器在冯·诺依曼体系结构中的重要性

冯·诺依曼体系结构是现代电子计算机设计的基础,它由数学家约翰·冯·诺依曼(John von Neumann)在20世纪40年代提出,并深刻影响了后续计算机系统的设计和发展。:冯·诺依曼体系结构的一个核心思想是“存储程序”,即程序和数据一样被存储在计算机的存储器中。:存储器不仅存储数据和程序,还支持数据的处理和程序的控制。程序是指导计算机执行特定任务的指令集,而数据则是程序处理的对象。它是计算机存储数据和程序的基础,支持数据的处理和程序的自动执行,并通过多级存储结构来提高计算机的性能和灵活性。

2024-07-25 13:20:50 460

原创 VS在处理源文件时涉及到多个阶段和内存、磁盘之间的交互

VS在处理源文件时,涉及到从磁盘读取文件、在内存中编辑文件、将更改写回磁盘、编译源文件以生成可执行文件或库文件、加载并执行程序以及调试程序等多个阶段。这些阶段中,内存和磁盘之间的交互是不可或缺的,它们共同支持了VS作为强大开发环境的功能。

2024-07-25 13:09:24 389

原创 网卡与本地计算机(包括输入输出设备、CPU、内存等)的交互

网卡与本地计算机的交互是一个复杂而高效的过程,它涉及到底层硬件、操作系统、驱动程序等多个组件的协同工作。通过DMA技术、网络协议栈、上下文切换等机制,网卡能够高效地接收、处理和传递网络数据,并与输入输出设备、CPU等本地计算机组件进行无缝的交互。这种交互是计算机实现网络通信和数据处理的基础。

2024-07-25 13:07:54 674

原创 系统调用和库函数的关系

系统调用(System Call)定义:系统调用是操作系统提供给用户程序的一组接口,用于实现用户态程序与内核态程序之间的交互。这些接口隐藏了底层硬件的复杂性,使得用户程序能够更方便、更安全地访问系统资源。功能:系统调用提供了对系统资源的访问能力,如文件操作、进程控制、内存管理等。它们是在内核中实现的,运行在内核空间,具有较高的执行效率和安全性。库函数(Library Function)定义:库函数是高级语言中提供的与系统调用对应的函数(也有些库函数与系统调用无关),用于实现更高级、更抽象的功能。

2024-07-25 12:42:34 453

原创 gets和getline的区别

gets和getline是两个在C和C++中用于读取输入的函数,它们之间存在显著的区别。

2024-07-23 12:29:46 912

原创 为什么两个指针相减的结果代表两个指针之间相差元素的个数

当两个指针进行相减操作时,这个操作是有意义的,并且只在它们指向同一段连续的内存空间(比如同一个数组的不同元素)时才是合法的。这是因为指针相减的结果并不是直接表示两个地址之间的字节差,而是表示两个指针之间“元素的个数”差。等)决定了它所指向的内存中每个元素的大小。因此,当两个相同类型的指针相减时,编译器知道每个元素占用的字节数,从而可以正确地计算出两个指针之间相隔的元素个数,而不是简单的字节差。总之,指针相减操作的设计是为了方便对连续内存区域(如数组)的操作,确保类型安全,并防止无意义的操作。

2024-07-23 12:23:28 680

原创 序列中删除指定数字

确保在尝试访问或修改vector的元素之前,该元素已经存在。使用push_back是一种灵活且安全的方法,特别是当你不知道要存储多少元素时。如果知道要存储的元素数量,预先分配空间可以提高效率。始终确保所有变量在使用前都已正确初始化。

2024-07-23 12:01:09 136

原创 不允许创建临时变量,交换两个整数的内容

printf("交换前:a = %d b = %d\n", a,b);printf("交换后:a = %d b = %d\n", a,b);

2024-07-22 22:17:20 107

原创 编写一个函数 reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列,不是逆序打印。要求:不能使用C函数库中的字符串操作函数。

【代码】编写一个函数 reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列,不是逆序打印。要求:不能使用C函数库中的字符串操作函数。

2024-07-22 20:59:04 135

原创 c++递归和非递归分别实现求第n个斐波那契数

在C++中,使用递归和非递归(迭代)来求第n个斐波那契数的方法与在其他编程语言中类似。以下是这两种方法的C++实现。

2024-07-22 20:42:16 224

原创 高内聚低耦合的重要性

高内聚低耦合是软件设计中的一个重要原则,它旨在提高软件的可维护性、可扩展性和可重用性。这个原则在函数、模块、组件或系统等不同层面上都适用。

2024-07-22 18:36:22 325

原创 rand函数和srand函数

生成的随机数序列是伪随机的,即它们是通过算法产生的,看起来像是随机的,但实际上在给定相同的种子值(通过srand函数设置)和相同的算法下,生成的序列是相同的。如果不调用srand函数设置种子,rand函数在每次程序运行时将使用相同的默认种子(通常是1),从而生成相同的随机数序列。通过调用srand函数并传入不同的种子值(如当前时间),可以确保每次程序运行时生成的随机数序列都不同,增加了随机性。rand函数用于生成伪随机数,而srand函数用于设置rand函数生成随机数序列的种子。

2024-07-22 18:26:04 333

原创 Linux普通用户root用户之间的切换

通常不需要使用特定的命令,因为你可以直接通过命令行界面(CLI)输入该普通用户的用户名来切换到该用户。但是,为了避免潜在的权限问题,可以使用su(substitute user 或 switch user)命令来显式地切换到另一个用户。

2024-07-14 18:16:35 4972

原创 new /delete和malloc/free

对于基本数据类型(或称为内置类型,如 char, int, double 等),new 和 delete 确实在行为上与C语言中的 malloc 和 free 类似,但它们在C++的上下文中具有更多的功能和安全性。综上所述,虽然对于内置类型而言,new/delete和malloc/free在功能上可能没有明显区别,但从安全性、可读性、可移植性和最佳实践的角度来看,new/delete是更好的选择。通过显式地分配和释放内存,我们可以更容易地跟踪和管理内存的使用情况,从而避免内存泄漏和其他与内存相关的问题。

2024-06-30 20:53:52 1678

原创 结构体内存对齐相关

因为不同的硬件平台可能使用不同的大小端模式,所以在发送或接收数据时,需要确保数据的字节顺序在发送方和接收方是一致的。大端(Big-endian)模式下,数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;小端(Little-endian)模式则相反,数据的低字节保存在内存的低地址中,而数据的高字节保存在内存的高地址中。如果数据跨越了两个或多个内存页,或者跨越了缓存行的边界,处理器可能需要额外的操作来访问这些数据,这会导致性能下降。不同的硬件平台和操作系统可能有不同的内存对齐要求。

2024-06-24 20:56:30 251

原创 为什么命名空间域和类域不会影响生命周期

对象的生命周期是由创建它的代码(如new关键字在许多编程语言中)和销毁它的代码(如垃圾回收机制或显式调用析构函数)决定的。在编程中,命名空间(Namespace)和类(Class)是两个不同的概念,它们与对象的生命周期(Lifecycle)有间接的关系,但通常不直接决定对象的生命周期。类的生命周期通常与程序的运行时间相同,但类的实例(对象)可以有自己的生命周期。命名空间只是代码的组织结构,它不会影响在命名空间中定义的对象或类的生命周期。对象的生命周期是由其创建和销毁的时间点决定的,这通常与类的定义无关。

2024-06-24 12:04:15 327

原创 产生临时变量的一些场景

例如,将 char* 类型的字符串字面量传递给需要 const std::string& 参数的函数时,编译器会创建一个 std::string 类型的临时变量来存储这个字符串。例如,将 double 类型的变量转换为 int 类型时,会创建一个 int 类型的临时变量来存储转换后的值。当将右值(没有内存空间,无法直接访问的数据对象)赋值给const引用时,编译器会创建一个临时变量来存储这个右值,并让const引用指向这个临时变量。在某些情况下,编译器可能会出于优化和性能考虑而创建临时变量。

2024-06-23 18:18:59 377

原创 运算符重载和函数重载的关系

运算符重载(Operator Overloading)和函数重载(Function Overloading)在C++等支持这些特性的编程语言中都是重要的概念,但它们服务于不同的目的并有着各自的定义和用法。尽管它们在某些方面可能看起来相似,但它们之间有一些关键的区别。

2024-06-22 11:29:39 143

原创 #include<iostream>,using namespace std,c++标准库之间的关系

在某些情况下可能很方便,但在大型项目或与其他代码库交互时,最好显式地使用std::前缀来引用标准库中的名称,或者只选择性地使用using声明来引入特定的名称。命名空间是一种避免命名冲突的方法,它允许你将相关的名称(如函数名、类名、变量名等)组合在一起。如果你的代码或第三方库中的名称与标准库中的名称相同,那么使用using namespace std;这是一个命名空间指令。在C++中,为了避免名称冲突,很多库都使用命名空间来组织它们的名称。是C++标准库中的一个头文件,它包含了用于输入输出的类和函数,如。

2024-06-21 21:36:52 706

原创 归并排序的时间复杂度和空间复杂度详细解释

归并排序(Merge Sort)是一种分治(Divide and Conquer)策略的排序算法。下面我将详细解释归并排序的时间复杂度和空间复杂度。

2024-06-19 11:21:00 1175

原创 快速排序的时间复杂度和空间复杂度的详细解释

快速排序(QuickSort)是一种非常高效的排序算法,其平均时间复杂度为O(n log n),但在最坏情况下可能达到O(n^2)。每一层的时间复杂度为O(n)(因为需要遍历整个数组进行分区),所以总的时间复杂度为O(n) * h = O(n log n)。空间复杂度:最好情况下为O(log n)(递归栈),最坏情况下为O(n)(递归栈),额外空间为O(1)。在这种情况下,时间复杂度为O(n) + O(n-1) + ... + O(1) = O(n^2)。当子数组的大小为1时,递归结束。

2024-06-18 20:29:24 2412 1

空空如也

空空如也

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

TA关注的人

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