- 博客(38)
- 收藏
- 关注
原创 [OpenGL]真实轨迹:太阳系轨道还原计划结课作业分享
真实轨迹:太阳系轨道还原计划在对宇宙探索的兴趣驱动下,我完成了这个太阳系模拟项目。整个模拟以1986年2月9日为起点,那一天哈雷彗星刚刚经过近日点。我希望以此为起点,构建一个尽可能接近真实的太阳系运行场景。项目中,我利用开普勒方程来预测八大行星和哈雷彗星在不同时间点的位置,并通过设定初始相位,使得它们在模拟开始时的位置尽量与真实世界中的相对位置一致。在建模过程中,我用AI整理并参考了大量关于行星半径、轨道六要素(包括半长轴、离心率、轨道倾角等)的资料,尽力在模型中体现这些天体的物理特征和运动规律。
2025-05-29 13:33:21
1380
原创 [C++]智能指针
C++智能指针(auto_ptr、unique_ptr、shared_ptr、weak_ptr)基于RAII机制实现自动资源管理。auto_ptr存在所有权转移缺陷,C++11引入unique_ptr通过禁用拷贝构造/赋值解决该问题。shared_ptr采用引用计数实现共享所有权,而weak_ptr作为shared_ptr的辅助指针可避免循环引用问题。智能指针通过重载*和->操作符模拟普通指针行为,同时在生命周期结束时自动释放资源,有效防止内存泄漏。实际开发中应优先使用C++11引入的unique_p
2024-10-14 20:30:15
1346
原创 C++11中的特性
C++11引入了多项实用新特性,包括列表初始化和auto关键字。列表初始化允许使用大括号{}对所有内置和自定义类型进行初始化,支持省略等号并防止数据截断。initializer_list类型提供了常量元素的迭代访问,常用于容器初始化。auto关键字被重新定义为自动类型推断,替代了C++98中几乎不用的自动存储类型声明。这些改进简化了代码编写,增强了类型安全性。
2024-10-05 22:45:49
1265
原创 【数据结构】散列(哈希)表简单介绍
散列表(Hash table)是表示集合和字典的另一种有效方法,它提供了一种完全不同的存储和搜索方式,通过将关键码映射到表中的某个位置来存储元素,然后根据关键码用同样的方式直接访问。
2024-09-23 21:19:19
1795
原创 AVL树插入和删除操作的实现
AVL树又称为高度平衡的二叉搜索树,是1962年由两位俄罗斯数学家G.M.Adel’son-Vel’skii和E.M.Landis提出的。ALV树提高了二叉搜索树树的搜索效率。为此,就必须每向二叉搜索树插人一个新结点时调整树的结构,使得二叉搜索树保持平衡,从而尽可能降低树的高度,减少树的平均搜索长度。
2024-08-30 15:00:40
1301
原创 [C++]set和map的介绍及使用
本文介绍了C++中关联式容器set和map的特殊接口,重点分析了set的插入、计数和边界查找功能。set作为基于红黑树的有序容器,其insert()返回插入状态的键值对,count()用于快速判断元素存在性,lower_bound()和upper_bound()可高效定位元素范围。这些特性使set在需要有序且唯一元素的场景中表现优异,相比序列式容器提供了更高效的查找和范围操作能力。
2024-08-22 22:00:48
1181
原创 [Linus]用户、文件、目录权限和粘滞位
(一)超级用户和普通用户Linus下有两种用户,分别为:有root权限,可以在linus系统下做任何事情,不受限制。:没有root权限,在Linus下只能做有限的事情。超级用户的命令提示符是,普通用户的命令提示符是。(二) 切换用户(三)用户提权普通用户在执行某些指令和操作时会受到。如普通用户使用yum安装某软件是不允许的。如果想执行受限制的指令,在知道root密码的情况下可以使用su -切换到超级用户来执行对应的操作。
2024-08-11 22:34:42
1367
原创 [算法]二叉搜索树(BST)
二叉搜索树 (BST) 是一种特殊类型的二叉树,其中每个顶点最多可以有两个子项。此结构遵循BST 属性,规定给定顶点的左侧子树中的每个结点的值必须小于给定顶点的值,并且右侧子树中的每个结点的值必须大于给定顶点的值。
2024-08-05 22:44:37
1414
原创 [C++]多态与虚函数
多态是面向对象编程的核心概念,指通过同一接口调用函数时根据对象实际类型执行不同行为。C++中多态分为编译时多态(函数重载、模板)和运行时多态(虚函数)。运行时多态通过基类指针/引用和虚函数实现,典型示例是不同用户类型对"播放视频"指令的不同响应。未使用虚函数时,基类指针只能调用基类方法;声明虚函数后,通过基类指针可自动调用派生类的重写方法。特别需要注意的是,析构函数必须声明为虚函数,否则通过基类指针删除派生类对象时会导致派生类析构函数不被调用,造成内存泄漏。
2024-08-01 19:23:02
1165
原创 [C++]继承
面向对象继承机制解析 继承是面向对象编程的核心机制,允许派生类复用基类特性并扩展新功能。继承方式(public/protected/private)决定了基类成员在派生类中的访问权限:public继承保持原权限,protected继承降级public为protected,private继承全部降级为private。派生类对象可赋值给基类对象(切片),基类指针/引用也可指向派生类对象,但只能访问基类成员。实际开发中应优先使用public继承,因其符合"is-a"关系设计原则,而其他继承方式
2024-07-31 17:14:05
766
原创 [算法]插入排序和希尔排序
本文章介绍了插入排序及其改进版本希尔排序。插入排序通过将待排序元素插入已排序序列的合适位置来工作,时间复杂度平均为O(n²),在数据接近有序时可达O(n),且算法稳定。希尔排序作为插入排序的优化,通过引入“增量”概念进行预排序:先以较大间隔分组并对各组进行插入排序,使元素快速移动,再逐步缩小增量直至为1,最终执行一次完整的插入排序。这种策略克服了插入排序在逆序数据上效率低下的问题。希尔排序的时间复杂度取决于增量序列的选择,通常在O(n^1.3)到O(n²)之间,空间复杂度为O(1),但该排序算法不稳定。
2024-07-27 18:27:15
953
原创 [算法]归并排序(C语言实现)
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
2024-07-26 15:53:29
3112
原创 [C++]list迭代器的封装设计
list 的迭代器需要单独封装,因为链表节点在内存中不连续,无法直接用指针遍历。迭代器类需重载运算符(如 ++、* 等)来模拟指针行为。通过模板参数 Ref 和 Ptr 可复用代码生成普通和 const 迭代器。反向迭代器采用适配器模式,内部持有正向迭代器并反转运算符逻辑。链表 insert 操作不导致迭代器失效,但 erase 会使被删节点迭代器失效,需通过返回值更新迭代器。这种设计统一了不同容器的访问接口,同时保证了链表操作的安全性和效率。
2024-07-03 08:46:39
1319
原创 [算法]——堆排序实现及其复杂度推导(C++实现)
本文介绍了堆排序算法,主要包括堆的概念、算法思路、调整方法及实现过程。堆分为大顶堆和小顶堆,通过完全二叉树结构表示。堆排序通过构建大顶堆并反复交换堆顶与末尾元素来实现升序排列。关键步骤包括向下调整和向上调整操作,其中向下调整是主要方法。文章详细说明了如何将无序数组转化为大顶堆,并通过交换和调整完成排序。堆排序的时间复杂度为O(nlogn),其中建堆过程为O(n),排序过程为O(nlogn)。文中配有示意图和代码示例,帮助理解堆排序的实现原理。
2024-06-29 17:05:47
1262
原创 [C++]vector的模拟实现
本文摘要介绍了C++中vector容器的模拟实现。vector是一个动态数组容器,支持随机访问和动态扩容。文章首先概述了vector的基本概念和设计思路,包括其内部通过三个指针(_start、_finish、_endOfStorage)来管理存储空间。然后详细讲解了核心功能的实现方法:默认构造函数初始化指针为nullptr;析构函数释放内存;迭代器通过指针实现;尾插(push_back)和尾删(pop_back)操作需要考虑扩容情况;下标访问操作符重载提供随机访问能力。文中还提供了reserve和resiz
2024-06-01 20:56:30
1319
原创 [C++]函数模板和类模板
本文介绍了C++函数模板和类模板的基本用法与原理。函数模板部分从C语言中函数重载的局限性出发,引出模板的必要性;通过Swap和Add示例展示了模板的定义、隐式实例化与显式实例化,并分析了多参数模板及重载解析规则。类模板部分以Stack类为例,说明模板类的定义方式,重点强调类模板的声明与定义必须放在同一文件中,否则会导致链接错误。文章还通过type_info演示了运行时类型获取,帮助理解模板实例化机制。
2024-04-30 22:05:07
728
1
原创 [C++]new和delete动态内存管理
C++中的new和delete是动态内存管理的运算符,比C语言的malloc和free更强大便捷。new在分配内存时会自动调用构造函数初始化对象,delete则会先调用析构函数再释放内存。对于数组,使用new[]和delete[]进行管理。此外,C++还支持定位new语法,可以在指定内存位置显式调用构造函数。与C不同,C++动态内存分配失败时会抛出异常而非返回NULL。虽然底层仍使用malloc实现,但new/delete提供了更安全、更面向对象的内存管理方式。
2024-04-24 20:41:39
1282
原创 [C++]类和对象的explicit关键字和static成员
摘要:本文介绍了C++中两个重要的关键字特性。explicit关键字用于禁止构造函数的隐式类型转换,通过示例展示了单参数和带缺省值构造函数的隐式转换行为,以及如何用explicit阻止这种转换。static关键字用于定义静态成员,包括静态成员变量(必须在类外初始化,属于类而非对象)和静态成员函数(不能访问非静态成员)。通过代码示例演示了静态成员的访问方式和内存特性(不计入类大小,存储在静态区),以及静态成员函数无this指针的特性。
2024-04-20 21:16:19
720
1
原创 [C++]类的参数初始化列表
C++参数初始化列表用于解决类成员初始化问题,特别是在以下三种情况下必须使用:1)引用成员变量必须指定引用对象;2)const成员变量需要在声明时初始化;3)没有默认构造函数的自定义类型成员。初始化列表在构造函数体执行前完成初始化工作,语法为在构造函数后加冒号,列出"成员名(初始值)"的形式。若不显式使用初始化列表,编译器会生成默认版本:对自定义类型调用默认构造函数,对基本类型则可能不处理或使用缺省值。参数初始化列表使成员初始化更统一高效,是C++类设计的推荐做法。
2024-04-20 19:36:28
1907
1
原创 [C++]类与对象——构造、析构、拷贝成员函数
本文介绍了C++中类的6个默认成员函数,重点讲解了构造函数的特性与使用。主要内容包括:1)空类会自动生成6个默认成员函数,分为初始化与清理、拷贝复制、取地址重载三类;2)构造函数是特殊的成员函数,在对象创建时自动执行,用于初始化对象;3)构造函数可重载,若无显式定义则编译器生成默认构造函数;4)默认构造函数对内置类型不处理,对自定义类型会调用其默认构造函数。通过Time类示例展示了构造函数的使用方法和注意事项,如不能同时存在多个默认构造函数等。这些特性是理解C++类对象初始化的基础。
2024-04-11 15:17:12
914
1
原创 [C++]引用
本文介绍了C++中引用的概念、特性及使用场景。引用是变量的别名,与被引用变量共享同一内存空间。引用声明时必须初始化,不能改变引用对象,也不能建立数组或引用的引用。引用的本质是const指针,但比指针更安全易用。常引用需用const修饰,避免权限放大。引用常用于函数参数传递和返回值,能简化指针操作。在面向对象编程中,引用也常用于操作类对象。通过引用可以提高代码可读性,同时保持操作效率。
2024-04-07 21:46:31
621
原创 [C++]缺省值和函数重载
本文介绍了C++中缺省值和函数重载的概念及应用。缺省值允许为函数参数指定默认值,可分为全缺省和半缺省参数,使用时需注意声明与定义分离时的处理规则。函数重载允许同名函数根据参数类型、个数或顺序的不同实现不同功能,但需避免二义性问题。文章通过代码示例详细演示了这两种特性的使用方法和注意事项,包括如何处理函数重载中的类型转换冲突。这些特性增强了C++的灵活性和表达能力。
2024-04-05 11:54:07
891
1
原创 [C++]命名空间解决命名冲突问题
C++命名空间(namespace)是解决大型项目中命名冲突的重要机制。文章首先通过C语言中rand变量与库函数冲突的例子,说明命名空间的必要性。然后详细介绍了命名空间的使用方法:1)封装变量和函数,通过作用域限定符(::)访问;2)函数声明与定义分离的写法;3)两种展开方式——半展开(using space::member)和全展开(using namespace space)。全展开后同名变量会优先访问当前作用域内的定义。命名空间有效解决了多库文件开发时的命名污染问题,是C++对C语言的重要改进之一。
2024-04-04 11:11:32
3490
1
原创 [算法]排序——快速排序(QuickSort)多种实现方式(C++实现)
快速排序是一种二叉树结构的交换排序算法,其核心思想是选取基准值(key),将序列分割成左小右大的两个子序列,再递归处理直至有序。递归实现主要有三种分区方法:Hoare版本(左右指针相向交换)、挖坑法(填坑式移动)和前后指针法(Lomuto分区)。非递归实现利用栈模拟递归过程,保存待排序区间下标。理想情况下时间复杂度为O(n log n),空间复杂度为O(log n);最坏情况退化为O(n²)。常用优化包括三数取中或随机取数避免最坏情况,以及小区间改用插入排序减少递归深度。
2024-03-29 15:31:23
21989
9
原创 [C语言]实现简单的贪吃蛇小游戏(含完整代码)
本文介绍了使用C语言实现贪吃蛇游戏的关键技术要点。主要内容包括:1) Windows环境下控制台窗口的设置与光标隐藏;2) 宽窄字符的区别与本地化设置;3) 游戏界面的设计与实现,包括欢迎界面、玩法说明和地图绘制;4) 使用Windows API实现光标定位等核心功能。文章详细讲解了如何通过system命令设置窗口大小、GetStdHandle等函数控制光标,并展示了游戏最终效果。该项目适合C语言初学者练习基础语法和数据结构知识,但需要注意该程序使用了Windows专有API,只能在Windows系统运行。
2024-01-30 18:53:55
1688
2
原创 [C语言]程序的编译与链接
本文介绍了程序从源代码到可执行文件的四个关键步骤:预处理、编译、汇编和链接。预处理阶段处理宏定义、头文件包含和条件编译等;编译阶段将代码转换为汇编语言,经历词法分析、语法分析、语义分析和优化;汇编阶段将汇编代码转为二进制目标文件;最后链接阶段将目标文件和库文件合并生成可执行程序。文章通过具体示例和图表详细说明了每个步骤的具体操作和作用,并指出常见错误可能出现的环节。
2024-01-18 15:14:59
1021
1
原创 [C语言]结构体和内存对齐
本文介绍了C语言中结构体的基本概念及其内存对齐规则。结构体是一种自定义类型,包含多个不同类型的成员变量。文章详细讲解了结构体的创建、初始化(顺序初始化和指定顺序初始化)、赋值操作以及自引用特性。重点分析了结构体内存对齐机制,包括三条核心规则:首成员偏移量为0、成员对齐到对齐数的整数倍地址、结构体总大小为最大对齐数的整数倍。通过示例代码展示了结构体实际占用内存的计算方式,解释了为什么结构体大小往往大于成员变量大小的简单相加。这些知识对于理解结构体在内存中的存储布局和优化内存使用具有重要意义。
2023-12-10 13:50:31
626
1
原创 [C语言]整型、浮点型的存储和大小端
本文介绍了计算机中数据的存储方式,重点解析了原码、反码和补码的概念及其转换关系。整数在内存中以补码形式存储,补码解决了符号位统一处理和加减法运算问题。同时探讨了大小端字节序的存储模式及其判断方法,通过代码示例展示了如何检测当前系统的字节序。最后分析了浮点型数据按照IEEE 754标准的存储格式,解释了其与整型存储的本质差异。这些底层存储机制的理解对编程和系统开发具有重要意义。
2023-12-09 23:04:44
776
原创 [C语言]字符函数和字符串函数使用简介
C语言中,我们经常要处理字符和字符串,因为字符串不是通过简单的赋值和加减就能够搞定的,所以为了方便我们处理,C语言标准库中提供了一系列关于字符和字符串的库函数。
2023-12-08 18:29:10
672
原创 [C语言]指针简介
本文介绍了C语言中指针的核心概念与应用。首先阐述了指针的本质是内存地址,通过取地址(&)和解引用(*)操作符实现对数据的访问。其次讲解了指针运算的特性,不同类型指针加减运算时的地址偏移量不同。然后分析了数组名的本质,说明数组名既是首元素地址也可表示整个数组地址。最后通过指针数组模拟二维数组的实例,展示了指针访问连续内存空间的方法。全文通过多个代码示例演示了指针在内存操作和数组访问中的具体应用,揭示了指针作为C语言精髓的重要性。
2023-12-02 22:17:59
687
原创 [C语言]分支与循环语句
本文介绍了编程语言中的分支和循环语句。分支语句包括if和switch两种形式,重点讲解了if语句的嵌套、else/else if的使用,以及switch语句中case、break和default的用法。循环语句则详细说明了while、do while和for三种循环结构的特点及使用场景,强调了循环条件变量的调整和break/continue的作用。文章指出,通过分支与循环语句的灵活组合,可以解决各类复杂问题,建议根据实际需求选择最合适的语句结构。
2023-10-24 21:48:21
193
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅