自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

c23856的博客

小比特一枚

  • 博客(112)
  • 收藏
  • 关注

原创 类和对象的深入了解7

比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time 类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加friend关键字。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。声明为static的类成员称为类的静态成员,

2024-08-01 22:57:12 661

原创 类和对象的深入了解6

上述代码中存在一个只需要传一个int 类型参数的构造函数,正是这一点我们可以写出下面的隐式类型转换,我们写的A b1 =2,意思其实是提供一个2给构造函数,创建一个临时的对象吗,然后再拷贝构造给b1对象(当然,如果是多个形参也可以,只是需要用花括号括起来)。上述规则中我们知道初始化列表会先执行声明的成员变量,我们可以看到类中先声明的成员变量为_a2,然后为_a1,这样的话在初始化列表中先初始化_a2,但是给_a2的初始化值为_a1,但是此时的_a1还未初始化,所以_a2为随机值,_a1为a。

2024-08-01 22:14:57 358

原创 类和对象的深入了解5

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。。函数原型:返回值类型 operator操作符(参数列表):比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义 作为类成员函数重载时,这个经常在笔试选择题中出现。

2024-07-31 21:31:58 1014

原创 数据结构经典测试题5

后则将字符串"you”放 置在数组arr的第一行上,即a[0][0]=’y’,a[0][1]=’o’,a[0][2]=’u',a[0][3]=’\0’(字符串结尾符),执行strcpy(arr[1],”me”);后则将 字符串”me”放置在数组arr的第二行上,即a[1][0]=’m',a[1][1]=’e’,a[1][2]=’\0’(字符串结尾符),由于二维数组在内存中是以 行序存放的,执行arr[0][3]=’&’;要注意的是64位的情况下指针是占8个字节的,剩余详细了解结构体内存对齐的规则.

2024-07-31 19:22:21 931

原创 类和对象的深入了解4

其实当我们没有在A中写析构函数,程序依然能正常运行,因为上述代码中所申请的空间都会在程序结束后销毁。所以。

2024-07-30 18:11:26 807

原创 数据结构经典测试题4

语句将'c'替换为'd',字符串变更为"abddcccd",同时指针it1加 加停在第四个字符'd'上,it2再次跳过字符'c',停在最后一个'd'上,赋值后,字符串不变,再后移外层循环遇到0结束.p是char*类型,每次++,后移一个地址,char *p = str[0]相当于char *p = "stra",p先指向其中的字符's',printf输出遇到 0停止,第一次输出"stra",p++后,指向字符't',第二次输出"tra",第三次输出"ra".上述代码运行结果是什么?上述代码运行结果是什么?

2024-07-25 16:56:56 606

原创 类和对象的深入了解3

构造函数是默认成员函数的其中一个,所谓默认成员函数,就是你在创建类后,如果我们不显示写,编译器就自生成。功能其实就是帮助我们初始化。2.1特性构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开 空间创建对象,而是初始化对象。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成 员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

2024-07-25 16:44:10 630

原创 数据结构经典测题3

题目主要就考指针类型是否一样,char s[3][10]中s运算时会退化为数组指针,类型为char (*)[10],所指向的每个数组长度 为10;char (*k)[3]很明显k就是一个数组指针,类型也为 char (*)[3],所指向的每个数组的长度为3;我们知道使用(*f1)(s)与f1(s)效果是相同的。*f1(s)中()的优先级比*高,先结合为f1(s),返回结果是char,*f1(s)是对返回结 果char类型数据解引用,是错的,改成(*f1)(s)是对的,故D正确;B: f1(*s);

2024-07-24 17:19:39 1015

原创 类和对象的深入了解2

那么这里是否存在结构体对齐现象吗?我们来测试一下:将这里的month改为char型后,计算的结果还是12,这就足以说明,在类中还是存在内存对齐的。有些同学可能忘记对其规则了,不过我将其整理在下方了。

2024-07-24 12:42:52 960

原创 类和对象的深入了解1

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。这里我们将成员变量加上_其实是为了区别成员变量。我们一般将成员变量设置为private的,因为我们不希望使用者随意修改成员变量。

2024-07-23 22:04:42 825

原创 数据结构经典测试题2

B选项,b是二维数组,传参时会退化成指向其首 元素的指针,也就是b[0]的地址,b[0]的类型是int [4],故&b[0]类型是int(*)[4],不符。C选项,q是一个指针数组,在初始化时用b[0]、b[1]、b[2], 此时b[0]、b[1]、b[2]会退化成指向各首元素 的指针(int* 类型,因此类型符合,可以用它们初始化)。在二维数组中a[1]是第一行的数组名,数组名表示首元素的地址,即a[1][0]的地址,所以a[1]+1表示的是a[1][1]的地址,所 以D可以取得正确的值;

2024-07-23 13:42:36 562

原创 数据结构经典测试题1

分析得*((char *)(&value))的作用是获取value变量的低 地址8位数据,若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的8位0,则condition=0,不执行两 个if语句,则value不变,还是1024;数组D是一个二维数组,函数传参时数组名退化为首元素地址,就是第一行的地址,是一维数组的地址,为int(*)[8]类型,C 正确,B选项是指针数组的,这里不行;调用函数func时传的是s的值,形参p的改变,并不会改变s本身,*s拿到的还是首地址的字符'1.

2024-07-23 11:48:50 900

原创 c++基础4

for循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围;可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。我们发现当我们调用f(NULL)时其实是调用的整型的参数f(int),这是因为NULL宏定义为0,或者((void*)0)不明确。这里的改变e是无法改变到a的,但是我们可以将e变为a的别名就可以了。这里的e就是一个临时变量,a每次赋值给e,然后将e打印,自动识别类型,自动++。

2024-07-23 09:21:35 291

原创 c++基础3

函数参数需要在函数声明时确定其类型,以便在函数调用时进行类型匹配。而auto用于自动推导变量类型,是在初始化时通过变量的初始值来确定类型的。由于函数参数在函数声明时并没有初始值可供推导,因此无法使用auto来声明函数参数。

2024-07-23 08:55:26 1054

原创 函数重载和引用

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是 传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是 当参数或者返回值类型非常大时,效率就更低。这个过程叫做重载决策。简单来说就是C在找寻函数时使用其函数名去寻找的,如果函数名相同就找不到,而c++的中的名字和类型修饰规则可以区分每个函数,所以就可以调用不同函数。需要注意的是,在进行函数重载时,函数的返回类型不会被考虑在内,只有参数类型、个数和顺序会影响函数重载的决策。

2024-07-22 23:38:44 767

原创 c++基础2

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;在c++中的输出其实是

2024-07-22 23:01:30 1195

原创 c++基础1

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。

2024-07-22 19:21:55 671

原创 交换和归并排序

归并排序(Merge Sort)是一种基于分治法的排序算法,它的基本思想是将待排序序列分成若干个子序列,分别进行排序,然后再将已排序的子序列合并成一个有序的序列,从而达到整个序列有序的目的。冒泡排序是一种简单的排序算法,其基本思想是通过比较相邻的元素并交换位置,使较大的元素逐渐“浮”到数组的末尾,而较小的元素则逐渐“沉”到数组的开始。归并排序的时间复杂度为O(nlogn),其中n为序列的长度。归并排序是一种稳定的排序算法,因为在合并操作中,相等的元素在合并的过程中不会改变它们的相对位置。

2024-07-20 21:50:04 525

原创 插入和选择排序

我们来计算一下它的时间复杂度:我们知道时间复杂度是计算最坏的情况,在这里的最坏情况为逆序,因为逆序的时候每次插入都需要执行前面数的数量,那么我们假设其有N个数,那么总执行量就为:1+2+3...+N-1 即为(N^2)/2。时间复杂度:O(N*logN),我们设该树高为h,那么树的所有节点为N=2^h-1个,我们的时间复杂度要换成与数量有关的式子,所以时间复杂度为O(N*logN).希尔排序是在插入排序的基础上,效率更高的排序,其实就是在插入排序的基础上加上了与预排序的操作。

2024-07-20 09:21:06 565

原创 链式二叉树oj题

在这里我们要确定递归子问题,第一个就是NULL时返回,还有一个就是k=1时就是我们要找的层数。在这里我们需要弄明白的是,在某个开辟的栈帧中找到了该数据,直接返回其指针,是得不到它的地址的。这里与其他函数结合可以更好地解决问题。

2024-07-07 16:41:15 660 1

原创 链式二叉树

因为我们在不断开辟栈帧的过程中每一个size都是不同的,如果不用指针进行解引用++那么就会发生size只会得到第一次栈帧的++,所以我们在次使用传地址的方式。我们在创建节点时给每个节点两个指针,初始化的时候都是NULL,所以在叶子的底部还有NULL,且2的右子树也是NULL。我们在之前说到二叉树的结构还可以为链表的形式,我们虽然没有完成链式二叉树的实现,到那时我们可以直接简单的构造一个出来。所谓的前序遍历其实就是根 左子树 右子树的规律来遍历的。注意:一般树的高度都是从1开始计算的,除非题目有要求说明。

2024-07-07 16:27:28 380

原创 二叉树和堆

如果有一个关键码的集合:K={k1,k2,k3.....kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:K= K2*i+2)i=0,1,2...则称为小堆(或大堆)。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。要注意的是满二叉树是一种特殊的。

2024-07-06 22:17:00 1053

原创 树的概念和结构

树的应用广泛,例如文件系统的目录结构、组织机构图、排序和搜索算法(如二叉搜索树)等。树的一些常见变种包括二叉树、平衡树、B树等。

2024-07-06 21:52:18 357

原创 队列的概念和创建

在这里哦我们发现这个结构如果用数组去写的话,那每次的插入数据都需要进行找尾操作,虽然我们可以通过指针的方法,没插入数据尾指针就往后退一步,首指针指向第一数据,但是当我们出数据的时候我们保存指针数据的方式,和再次移动头指针的操作会有些麻烦。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。当然这也是相对于队列里面的数据的规则。

2024-07-03 12:17:53 173

原创 栈的概念和实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。用数组实现还有个优点:cpu高速缓存命中率高。当然大家也可以对其中的代码进行改进。

2024-07-01 18:46:51 203

原创 时间复杂度和空间复杂度

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的。

2024-07-01 18:31:08 1067

原创 约瑟夫问题

在这里我们利用之前的创建节点的函数,然后通过for循环开始进行不断的赋值创建。这是一个情景题,有n个人手拉手形成一个环,然后从第一个人开始数数,当数的数为m时就沙雕这个人,然后再从杀掉的人后一个开始重新数数,以此类推直到剩下最后一个人。我们可以创建一个有n个元素节点的循环链表,然后每个节点分别储存1~n的数字。然后每次数到m的时候就释放那个节点即可,最后将剩下节点的数据域返回。这个代码其实有同一个问题,当我们的m为1时,就会出现对NULL的引用,导致报错。其实我们只需要让prev有一个初始值即可。

2024-03-31 13:46:21 1074

原创 数据结构1

数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。我们在之前学习过许多的数据类型,结构体也可以算作一种数据结构。

2024-03-25 11:01:41 333

转载 苹果手用计算机解锁手机密码,苹果手机怎么强制解锁 iPhone强制解锁密码教程

当我们点击“确定”以后,系统就会提醒我们如下图这样的提示(不同的iTunes版本提示也是不同的,大致主要是下图两种),然后按住键盘上的 Shift键 同时鼠标点击“恢复手机”或者“恢复”。随着手机的日益普及,特别是苹果手机的盛行,很多人都在使用苹果手机,有时候也会忘密码,今天小编就来给大家分享一下苹果手机强制解锁的教程,一起随小编来看看吧!首先我们在网上下载一个和手机版本一样的ios固件,也就是手机的系统。完成上面的两项准备以后,然后我们打开iTunes软件,然后将手机连接到电脑上,并将手机关机。

2024-03-24 22:19:44 291

转载 计算机没有网络时间不准如何设置,轻松解决电脑时间不准的方法

但是对于有些用户来说,他们认为电脑时间不准是中毒所致,其实小编建议大家不要如此惊慌,只要电脑出现问题都是中毒了这种想法是不正确的。2.双击“服务和应用程序”,再双击“服务”,找到“Windows Time”,右键单击后选择“属性”,会弹出“windows time的属性“窗口;2.切换到“Internet时间”,选中“与Internet时间服务器同步”,选择“time.windows.com”。1.打开“命令行“,输入“w32tm/register”,回车;3.将启动类型改为“自动”,点击“确定“即可。

2024-03-24 22:10:43 3972

转载 计算机硬件输出设备有哪些,输出设备有哪些,输出设备的作用

在图形方式下,显示内容以像素为单位,屏幕上的每个点(像素)均可由程序控制其亮度和颜色,因此能显示出较高质量的图形或图像。输出设备(Output Device)是计算机硬件系统的终端设备,用于接收计算机数据的输出显示、打印、声音、控制外围设备操作等。这些返回结果可能是作为使用者能够视觉上体验的,或是作为该计算机所控制的其他设备的输入:对于一台机器人,控制计算机的输出基本上就是这台机器人本身,如做出各种行为。显示器适配器又称显示器控制器,是显示器与主机的接口部件,以硬件插卡的形式插在主机板上。

2024-03-24 22:07:42 455

原创 扫雷游戏实现

扫雷代码可能有些小伙伴会觉得复杂,其实大家静下心来慢慢看,没有想象中那么复杂的。我们在实现扫雷游戏时,为了方便就会创建两个文件,一个是头文件,一个是源文件。在头文件中我们会定义一些常量和需要实现的函数。接下来我们开始实现函数。

2024-03-24 22:02:01 361 1

原创 计算器模拟实现

我们在实现计算器实现之前,我们需要思考一下一个好的计算器需要什么?一个菜单或者是对浮点数的计算,显然这些都是需要的。首先我们先来制作菜单吧。

2024-03-24 21:48:09 586

原创 链表oj测试题(下)

我们可以看到我们创建了三个指针,分别指向第一个节点,和下一个节点,我们通过判断n2是否为空,来控制循环,此时n1就来到了原链表的尾节点,通过更改节点们的指针域来改变节点的指向。我们今天要学的是第一个方法。此代码就是遍历原链表将小于指定数的节点放入一个链表中,大的也放入一个链表中,然后将小链表的尾结点与大链表的头结点相连,但要注意的是我们的大链表的尾结点可能还连着一个节点,导致链表成为一个闭环,所以还需要将大链表的尾结点的指针域保存NULL.所谓的分割链表其实就是指定一个数,将小于该数的都放在该数的前面。

2024-03-24 14:43:22 622

原创 函数重载(简易)

编译器为了实现函数重载,也是默认为我们做了一些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如void func();编译器可能会将函数名修饰成_func,当编译器碰到void fu(int x),编译器可能将函数名修饰为_func_int,当编译器碰到void func(int x,char c),编译器可能会将函数名修饰成_func_int_char,以此作为区分。在C++中是允许出现同名的函数,是 C++ 中一种强大的特性,它允许定义多个同名函数,目的就是为了方便的使用函数名。

2024-03-20 23:22:27 294

原创 链表oj测试题(上)

在这里的思路就是遍历原链表碰到不为val的数就尾插到新创建的链表,最后将新链表的头返回来,大家也可以试试将它们的上一个节点的地址保存val下一个节点的地址,然后再将val的空间释放掉,这个方法虽然有些麻烦,但是大家可以练习一下思维。我们在这里用到的是快慢指针法,这个方法就是创建两个指针变量,然后快指针一次走两步,慢指针一次走一步,当快指针为NULL,或者慢指针next为NULL,循环停止,慢指针的位置就是中间节点的位置·。中间节点,如果有两个中间节点,返回第二个。

2024-03-20 18:45:15 653

原创 双链表(上)

在这里需要知道的我们在学习单链表的时候学的是没有带头的,只是将第一个节点作为头结点而已,带头的是表示一个不保存数据节点作为第一个节点。我们发现双链表的声明比单链表多了一个东西,一个节点即保存下一个节点的地址又保存上一个节点的地址,当然头结点除外。在这里应该有些小伙伴猜到了,我们在在之前学习的顺序表,单链表都是结构体声明,当然双链表也是的。注意:这里的“带头”跟前面我们说的“头节点”是两个概念,实际前面的在单链表阶段称呼不严。谨,但是为了同学们更好的理解就直接称为单链表的头节点。我们来看看是怎么实现的吧?

2024-03-13 18:22:17 430

原创 单链表(下)

当然在实现函数的时候记得包含头文件,在上面的实现函数中,也许有些小伙伴会疑惑,为啥在指定位置操作的时候,需要传入头结点,而之后却不需要呢?这是因为我们在操作之后的时候,只需要一个指针就可以找到需要找的的位置。上述代码也有很多值得改进的地方,大家如果有些疑问,也可以私信我哟。我们在单链表(上)中了解了一些需要实现的函数,这一篇就让我们一起来实现。10.在指定位置之前插入数据。12.删除指定位置之后的节点。9.在指定位置之前插入数据。11.删除指定位置的节点。

2024-03-10 17:08:33 342

原创 c语言经典测试题13

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。c语言经典测试题在这里就是最后一篇了,大家学到多少了呢?会不会对c语言有了更多的认识了呢?写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。示例: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]给定两个数组,编写一个函数来计算它们的交集。2.输入一个正整数k,代表截取的长度。

2024-03-10 13:13:55 565

原创 c语言经典测试题12

3处strcpy函数的参数是目标空间的地址,和需要复制空间的地址,这两个参数都是一级指针,但是在这里我们对str进行了取地址操作,这样的话我们strcpy就需要用二级指针来解说,很显然strcpy不具备这个条件,所以3是错的。4是对的,之前有说过。显然在这里是不会存在的。还有就是float类型的数据如果直接相等是可能出问题的,因为浮点数在存入内存时可能保存不完整,这样的话可能你不会得到想要的结果,在这里++i是一个前置++,这样的话会使f数组中的第一个元素得不到比较,这会影响代码的严谨。

2024-03-07 15:49:30 954

空空如也

空空如也

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

TA关注的人

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