数据结构——排序算法(1) 思路:在执行寻找最大数的过程中,以上代码不断执行交换操作,直到最大值,那么最大值之前的交换都是无用功,这时我们就可以仅仅记住每一次的下标即可,并在没有遇到最大值时一直更新最大值的下标,一次执行交换操作即可,这样可以有效加快代码的运行效率,并且在执行仅有一次的交换操作时,如果最大的就是起始元素的话就没必要交换,这样可以进一步实现效率的提升。再考虑到代码的可移植性,我们可以将代码的15都换为宏名,之后就无论是多大的数组我们都可以进行使用这个代码来进行排序了。如果有知识性错误,欢迎各位指正!
c++之旅第十一弹——顺序表 (1)逻辑结构:分为线性和非线性两种,线性即为没有分支的一个接着一个,非线性即为有分支或无逻辑上的连续关系。(2)、顺序表可以是静态(静态定好大小的数组)也可以是动态(用指针来开辟的空间)大家好啊,这里是c++之旅第十一弹,跟随我的步伐来开始这一篇的学习吧!(3)、顺序表随机访问方便,但是插入和删除中间的数据比较困难。使用合理的数据结构能够提高程序的运行效率,内存利用率等。3.顺序表的功能实现及完善:(eg:数组的增删查改)①线性:分为连续存储(数组)和链式存储(链表)创作不易,希望大家多多支持哦!
c++之旅第十弹——IO流 ios::in|ios::out|ios::trunc :打开文件,既可读取其内容,也可向其写入数据,如果文件本来就存在,则打开时清除原来的内容;ios::in|ios::out :打开已存在的文件,既可读取其内容,也可向其写入数据。ios::ate :打开一个已有的文件,并将文件读指针指向文件末尾。ios::beg 文件开头 ios::end文件末尾 ios::cur文件指针当前的位置。ios::trunc :打开文件时会清空内部存储的所有数据,单独使用时与ios:out相同.
c++之旅第九弹——模版 原因:因为.cpp文件是会参与编译的,而类模板在写的时候没有已知类型,故写在.cpp文件中的类中函数定义无法参与编译,也就相当于没有函数定义了;也是正确的,因为显式指定类型后就生成了对应类型的实体函数,和普通函数一样,普通函数在编译器下可以进行可转换参数的转换,故此时也是正确的。(2)template的类型参数T可以直接表示指针类型,但这样使用时会增加使用数据的不便,因为每次使用数据时都必须解引用进行操作,相对于普通类型(如int)的直接使用方式更加繁琐,所以一般也不会这样进行类型参数的使用。
c++之旅第八弹——多态 使用虚函数继承时的注意事项:使用虚函数后的继承,如果派生类中有自己的虚函数(和基类的虚函数是非同名的)是会在继承的基类的虚函数表的基础上往后添加的,而且由于这个派生类新添加的虚函数是属于派生类的,所以基类是无法访问这个派生类中新添加的虚函数的;但是如果派生类中写有和基类的虚函数同名的函数时,这个函数是会替代虚函数表中的基类虚函数的(同名函数在基类必须有virtual关键字,在派生类中就是可有可无的),也就是在虚函数表进行修改,将基类的同名函数首地址改为派生类的同名函数首地址。也叫晚期联编或动态约束。
c++之旅第七弹——继承 (2)如果基类中某一成员是私有属性,那么无论使用那种继承方式,在派生类中也是无法进行直接访问的,要访问也只能通过公有接口来进行访问,如果类B继承类A时继承方式是私有,而基类A中成员的属性为公有,那么在派生类B中是可以进行基类A中该成员的访问的,而当派生类C继承B时使用任何继承方式都无法对基类A中的该成员进行访问,这是因为B继承A时使用私有继承方式,相当于A类是B类的私有属性成员。4.构造顺序:虚基类->基类->派生类,虚基类的无名对象是在继承的最终类对象中的最后部分的内存,且只有一份它的内存。
c++之旅——第六弹 常量的初始化:在类中直接赋值,但是是新写法,在老版本的编译器中可能会报错,所以想使用另一种初始化方式:借鉴静态成员的初始化方式,我们在类外进行常量成员的初始化,但是这样写会报错,因为相当于在类中声明了一次常量成员,在类外初始化时相当于进行了第二次声明,这样就会报错。②因为成员初始化列表只能初始化类对象的数据成员,而对成员函数无法进行调用,而构造函数就可以在里面写上这个普通成员函数来进行调用,这一点是成员初始化列表所做不到的,但是成员初始化列表可以对构造函数进行调用。静态成员是在类的整个生命周期中存在的。
c++之旅——第五弹 (2)如果没有去书写拷贝构造,系统提供一个隐式的拷贝构造,可以理解为浅拷贝,浅拷贝只拷贝物理内存,不会拷贝逻辑内存,也就 是不会拷贝类中指针开辟的堆内存 如果类中的属性有指针,且会动态开辟,必须重写拷贝构造,去书写深拷贝(也就是自定义拷贝构造)//做在定义对象的时候想要做的事情,包括对数据成员赋值,当然构造函数除了对创建的对象进行初始化数据之外,还可以往里面写入类的成员函数的调用,用于在对象创建使就自动执行这个函数。它是一种特殊的函数,主要用来在创建类对象时初始化对象,即为对象的成员变量赋初始值。
c++之旅——第四弹 (2),编译:生成.obj二进制目标文件(是源文件生成的,头文件不会生成,头文件对应的定义函数的源文件也是可以生成的),因为.obj文件有大小,头文件里面是类类型的定义和函数的声明,是没有大小的,所以不可以生成有内存的文件。首先提出问题,分析问题的处理流程,将大问题分解成小问题,如果小问题比较复杂,那么就继续的分解为更小的问题,然后解决这些一个一个的小问题来解决大问题,最后解决所有的问题(做好这一步,做下一步,直到做完所有)。(3)、结构体一般用于定义数据这样的类型,比如矩阵之类的(里面一般不定义函数);
c++之旅——第三弹 解决同名实体的冲突问题,同名变量可以通过括号的作用域来确定使用的是哪一个变量,而函数和类型(比如自定义的结构体类型)则不可以通过作用域来进行区别,所以使用命名空间来区分。//不建议在命名空间中进行变量的定义,因为引用开放命名空间后可能会导致变量的重命名冲突问题,这样反而更不好管理代码 //空间成员一般有:函数声明,类型定义。(2)、命名空间可以在全局,也可以在局部(命名空间可以接受嵌套定义),但不能在函数内和类中定义!(2)作用域:函数体和命名空间这种用来区分管理的代码区域的就是作用域,后面不加分号。
c++之旅——第二弹 realloc函数追加的内存不一定是和原来内存连续的,而有可能是逻辑上的连续,因为在使用完开始的内存后,后面的内存也可能会继续被其他代码使用。动态变化的二维数组首先想到的是往数组中括号内填入变量,通过改变变量的值实现动态变化,但填入变量是不支持的,所以想到二级指针。(2),记得在使用完指针开辟的内存后写delete释放内存,否则会造成内存泄漏,积累会导致堆区内存越来越小。堆区:用于动态内存的申请与释放,一般由程序员手动分配和释放,若程序员不释放,则程序结束时由操作系统回收。
栈和队列(思路及代码,以及优化方式) 数据结构是用来存储数据的方式,方式不同作用也不同,比如数组的话就是可以更方便快捷地查找和使用(因为有下标);这次要讲到的栈和队列也是两种数据结构,可以满足不同的需求。但是,在某些情况下,我们可能需要限制处理顺序,这就产生了栈和队列这两种功能受限的线性结构。main函数前面的代码还是一样,不过主函数里面代码变了,用栈来十进制转二进制。
基础排序算法和查找算法 思路:在执行寻找最大数的过程中,以上代码不断执行交换操作,直到最大值,那么最大值之前的交换都是无用功,这时我们就可以仅仅记住每一次的下标即可,并在没有遇到最大值时一直更新最大值的下标,一次执行交换操作即可,这样可以有效加快代码的运行效率,并且在执行仅有一次的交换操作时,如果最大的就是起始元素的话就没必要交换,这样可以进一步实现效率的提升。2.排序方式越稳定(当有两个数值大小相同时,当排完序后,两个数值的位置没有发生改变,即没有发生两个相等值的位置交换现象),耗时少,耗空间小,越好。
html知识总结·第二弹 在html中,单纯使用多个空格在一起,最后的效果是只会出现一个空格的效果,要实现多个空格的效果,需要使用空格的字符实体,即;·button按钮在刚开始写出的时候是没有任何提示文字的,这时候可以用value属性写在button标签内部,这是实现显示提示文字的属性,value标签也可以写在submit里,也可以实现提示文字的作用。通过左上原则,确定保留谁删除谁,保留左上的一致的内容,之后就给保留的单元格设置跨行合并(rowspan)或者跨列合并(colspan)
使用easyx图形库和c语言实现简单交互式游戏——快跑,我的球 利用这个小游戏可以巩固我们前面所学习的知识,使用easyx图形库可以使我们之前的终端输出变得更加有趣,我这里安装的是easyx大暑版(即最新版),大家可以到官网上下载,小游戏源代码就分享在这里了,大家有兴趣的话可以玩玩我的小游戏。其中红色小球是我们可以操作移动的小球,白色即为障碍小球。
指针详解及应用总结 1.指针常量:系统在编译时给变量分配的内存地址就称为此变量的“指针”,由于该内存空间为系统分配的,无法改变,故称之为指针常量,同理,数组的地址也是指针常量。(&a为整形变量a的取地址操作,利用此操作即为将变量a的地址赋值给指针变量p,利用p即可访问到变量a地址所存储的内容)&a[1]即为数组第二个元素的地址,数组元素的地址是相连的,在物理存储上数组开辟的空间是连续的。(1)概念:指针变量是一种存储变量地址的变量,和指针常量不同,指针变量存储的地址是可以改变的。一个变量的地址称为此变量的“指针”。
C语言预处理知识(细致全面理解总结加实例) 定义无参宏的基本格式:#define 宏名 宏替换int main()return 0;最终输出结果是8而不是10,因为宏定义不会发生其他操作,此时即为不会加上()的意思,所以原表达式即为2+3*2另外,不能给用宏定义的常量赋值eg:A=33;//这就是错误的了定义带参宏的基本格式: #define 宏名(参数列表) 宏替换 带参宏可以像函数一样调用eg1:a:bint main()return 0;最终输出为6,即相当于调用了函数int main()