- 博客(49)
- 收藏
- 关注
原创 基于Linux下的即时通讯聊天室项目(全代码 有注释 可直接运行)
1、注册用户功能2、登录用户功能3、退出客户端功能4、管理员登录功能5、私聊功能6、群聊功能7、退出登录功能8、查看聊天记录功能9、管理员踢人功能10、管理员禁言功能11、管理员解除禁言功能12、传输文件功能*
2022-03-18 23:09:08 2228 5
原创 C++基础讲解第八期(智能指针、函数模板、类模板、异常处理机制、类型转换)
类模板中定义的函数类型可以用在类声明和类实现中类模板的目的同样是将数据类型参数化并且在实例化对象的时候,一定要显式调用。
2023-05-31 23:42:00 1004
原创 C++基础讲解第七期(运算符重载、数组类)
(3). 重载不能改变运算符的用法,例如: "+"只能在两个操作数中间,重载之后也必须如此。所谓重载,就是重新赋予新的含义,运算符重载就是,同一个运算符可以有不同的功能。(2). 重载不能改变运算符的优先级和结合性,假设加载了"+“和”*"(4). 运算符重载不能有默认参数,否则就改变了运算符的操作数.(5). 运算符重载函数可以作为类的成员函数,也可以作为全局函数。等价于c4 = c1 + (c2 * c3);运算符重载的本质就是函数的重载。我先写出接口, 下期公布代码哈。(1) 不能重载的运算符。
2023-05-29 22:27:00 892
原创 C++基础讲解第六期(多态、虚函数、虚析构函数、dynamic_cast、typeid纯虚函数)
手动去封装一个函数去实现什么情况可以转换类型,什么情况下不能转发,防止编译器报错private :int a;return ID;} };return ID;} };//使用强转类型,派生类指针指向基类对象 if(p -> GetID() == Child :: ID) //如果成立,说明指向派生类对象 {cout
2023-05-23 00:05:22 662
原创 C++基础讲解第五期(继承、多继承、虚继承、向上转型、同名函数)
当我使用C习惯之后,在写链表的时候会去考虑二级指针,以及链表变了怎么才能反映出来。其实,在我们实现类的成员函数时,在成员函数里面去对成员变量进行改变,当我们去实例化这个类的时候,这个成员函数和成员变量才真正的产出,比如上面的insertNode(),在它的里面直接用了成员变量head,但是当我实例化出list的时候,调用list.insertNode()的时候,使用的就是list对象的head,改变它,就时有效的,生命周期一直到这个对象销毁。不像C中,生命周期是它的本函数内,所以要传二级指针。
2023-05-17 13:37:52 486
原创 C++基础讲解第四期(友元、静态成员变量、静态成员函数、继承和派生)
类的构造函数不能被继承,因为即使被继承了基类构造函数的名字也和派生类名不一样,不能成为派生类的构造函数,为了初始化基类成员,需要在派生类的构造函数的参数初始化列表显示调用基类的构造函数。继承可以理解为一个类从另一个类中获取成员变量和成员函数的过程,例如类B继承类A,那么B就拥有A的成员变量和函数,被继承的类被称为父类和基类,继承的类被称为子类或者派生类。现在有一种例外情况,叫做友元,借助友元函数,可以在其他类中的成员函数以及全局范围内的函数可以访问私有成员。
2023-05-08 00:03:26 1177
原创 C++基础讲解第三期(超详细)每天更新哈,大家一起加油
首先会调用无参构造函数,因为Func中创建了a1对象,将a1 return时,会产生匿名对象(没有名字的对象),因为这时候a1被释放了(因为a1是局部的),那么这时候用这个a1匿名对象初始化a2,就会调用匿名对象的拷贝构造函数,编译器实际上不会给a2分配空间,而是将匿名对象给了a2,直接用a2给这个匿名对象命名,所以不会产生两次拷贝构造。在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显示调用(也不能调用),而且在创建对象的时候自动执行。1.malloc是函数,new是关键字。
2023-03-30 00:13:25 384
原创 C++基础讲解第二期(超详细)每天更新哈,大家一起加油
一、类和对象1、面向对象的编程介绍2、面向对象的优缺点3、类和对象a、概念b、类的访问控制c、访问控制的几点使用说明d、类中元素的说明练习:设计立方体类(Cube)求立方体的面积(2ab+2bc+2ac) 和体积(a*b*c),并且判断两个立方体是否相等
2023-03-21 23:27:12 329
原创 C++基础讲解第一期(超详细)
这里写目录标题一、面向对象概述1、C++发展2、为什么要学习C++3、面向对象和面向过程4、C++与C语言相比的改进5、面向对象的三要素(中心思想)二、C到C++的过度1、第一个代码一、面向对象概述1、C++发展1998开始,c++98—>c++03—>c++11—>c++142、为什么要学习C++众所周知,c++是一门面向对象的语言,在世界上的地位非常高,使用非常广泛,就业前景好。c++是c语言的升级版,c++几乎完全兼容c语言。应用范围:应用软件开发、游戏开发、多媒体开发、
2022-03-26 17:58:47 1585
原创 OSI七层网络协议及TCP/UDP、C/S架构详解
OSI七层网络协议及TCP/UDP详解一、OSI七层网络、Linux四层网络模型1、为什么需要网络通信2、通讯设备有哪些3、什么是通信协议?作用是什么?二、OSI七层协议1、物理层一、OSI七层网络、Linux四层网络模型1、为什么需要网络通信进程间通讯解决的是本机内的通讯,而网络通信解决的是任意不同机器间的通讯2、通讯设备有哪些网卡:PC机自带路由器,交换机光纤、电缆、基站3、什么是通信协议?作用是什么?通信协议是指双方实体完成通信或者服务所必须遵循的规则和约定。协议定义了 数据
2022-03-25 22:36:51 5447 3
原创 希尔排序算法思想及代码
希尔排序一、希尔排序算法思想二、代码一、希尔排序算法思想希尔排序是特殊的插入排序,直接插入排序每次插入前的遍历步长为1,而希尔排序是将待排序列分为若干个子序列,对这些子序列分别进行直接插入排序,当每个子序列长度为1时,再进行一次直接插入排序时,结果一定是有序的。常见的划分子序列的方法有:初始步长(两个子序列相应元素相差的距离)为要排的数的一半,之后每执行一次步长折半。二、代码#include<stdio.h>#include<stdlib.h>#define MAX
2022-03-24 23:25:05 928
原创 直接插入排序算法思想及代码
直接插入排序一、直接插入排序算法思想二、代码一、直接插入排序算法思想直接插入排序算法思想:其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。二、代码#include<stdio.h>#include<stdlib.h>#define MAX 10void insert(int arr[],int n){ int i,j; int temp;//用来保存 比较值 for(i = 1;i < n;i+
2022-03-24 22:31:29 2055
原创 冒泡排序算法及代码
冒泡排序一、算法思想二、具体代码一、算法思想冒泡排序算法:其实相当简单,从头或尾开始(假如从数组头开始)每次比较当前元素和后一个元素,如果当前元素大于后一个元素,则将他们交换。这样一趟排序下来就会将最大的元素放在数组末尾(升序)。然后第二遍遍历就是将第二大放在右边第二的位置。以此类推二、具体代码#include<stdio.h>#include<stdlib.h>#define MAX 10int main(){ int arr[MAX] = {13
2022-03-23 23:33:39 12924 1
原创 快速排序算法讲解及代码(详细)
快速排序算法一、序言二、快速排序基本思想三、具体步骤四、具体代码一、序言快速排序是一种高效且使用广泛的排序算法,在很多语言的标准库中自带的排序都是快速排序。所以我们也有必要了解快排的原理以及实现方法。二、快速排序基本思想算法思想:快速排序实现的重点在于数组的拆分。通常我们将数组的第一个元素作为比较元素,然后将数组中小于比较元素的数放到左边,将大于比较元素的放在右边。这样我们就将数组拆分成了两部分:小于比较元素的数组和大于比较元素的数组。我们再对这两个数组进行相同的拆分。直到拆分到不能再拆分,
2022-03-23 22:53:15 6525 1
原创 程序员招聘笔试面试题第一期(程序设计基础——变量)
程序设计基础—变量一、知识要点归纳1.C语言数据类型2.变量的作用域和变量在内存中的存储方式a)局部变量和全局变量b)变量的存储类别(auto、register、extern、static)c)内存组织结构二、面试真题及解析 面试题1 面试题2 面试题3 面试题4 面试题5欢迎来到程序员面试笔试题总结 第一期 一起来提升吧!—————————————————————————————————一、知识要点归纳1.C语言数据类型2.变量的作用域和变量在内存中的存储方式a)局部变量和全局变量变量
2022-03-21 06:00:00 7539 2
原创 解决vscode空格间距过小 tab只能退两格不是四格的问题(一句话解决 超简单)
解决vscode空格间距过小 tab只能退两格不是四格的问题1.首先打开vscode2.打开设置3.搜索框输入font4.修改Font Family5.修改成功 重新启动vscode就可以了1.首先打开vscode2.打开设置在左下角点击设置3.搜索框输入font下方会出现 Font Family4.修改Font Family将方括号里面修改为下方代码即可Consolas, 'Courier New', monospace5.修改成功 重新启动vscode就可以了...
2022-03-10 15:27:09 3666 4
原创 Linux网络编程
Linux网络编程一、理论概念二、服务端客户端通讯步骤1、第一步 建立套接口socket2.在绑定之前 初始化地址3.第三步Bing绑定4.listen监听5.Accept连接6.收发函数7.客户端向服务端请求连接connect函数8.TCP模型9.具体代码一、理论概念因为udp不建立连接 所以不知道对谁收发信息 所以只能用sendtorecufrom 因为它有六个参数 前四个跟send一样 后面两个时地址AF_INET表示IPV4一般我们使用sockaddr_in只需要配置前三
2022-03-09 22:03:37 5279 2
原创 Linux多线程编程
Linux多线程编程一、线程理论基础二、多线程程序设计三、线程==同步==(按顺序)一、线程理论基础有了进程,为何还要引入线程呢?使用多线程有哪些好处?1、和进程相比,线程是一种非常节俭的多任务操作方式,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表维护它的代码段、堆栈段、数据段,这是一种昂贵的多任务工作方式运行于一个进程中的多线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间2、线程间方便的通讯机制,对不同进程来说,它们具有独立的数据空间
2022-03-07 20:19:44 4639
原创 Linux 进程间通信编程
Linux 进程间通信编程(单机)一、进程间通信概述二、管道通信(默认无名管道)1.创建无名管道函数pipe()2.使用无名管道读取的代码练习三、命名管道1.创建有名管道函数mkfifo()四、信号通信五、共享内存六、消息队列七、信号量一、进程间通信概述1、目的:1)数据传输:一个进程需要将它的数据发送给另一个进程2)资源共享多个进程之间共享同样的资源3)通知事件一个进程需要向另一个或一组进程发送消息,通知他们发生了某种事件4)进程控制有些进程希望完全控制另一个进程的执行,此时控制进程希
2022-03-05 21:37:17 1578
原创 停车场管理系统(数据库)
停车场管理系统(使用数据库sqlite3)一、序言二、讲解time_t( )函数 (因为要用到)三、停车场管理系统代码(可运行)1.主函数2.功能函数3.函数声明一、序言本停车场管理系统使用sqlite3所写其主要功能有1.查看车库空位 2.车主选择车位停车3.系统计费 4.查看指定车辆停车记录5.查看所以车辆停车记录 6.退出二、讲解time_t( )函数 (因为要用到)这里讲解下其中获取时间的函数time_t( )其头文件为#include<time.h
2022-03-03 22:04:16 8397 2
原创 进程控制知识点和函数应用
Linux进程控制编程一、进程控制理论1.进程的定义:2.进程的生命周期3.进程的状态4.进程ID5.进程互斥6。临界资源7.临界区8.进程同步9.进程调度10.调度算法二、进程创建1.fork()2.第二种创建子进程vfork()3.fork PK vfork3.exec函数族(有六个函数 掌握一个 其他派生)4.system函数5.进程等待6.第二种进程等待一、进程控制理论1.进程的定义:进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元;程序是放到磁盘的可执行文件
2022-03-03 21:05:25 570
原创 通讯录3.0(数据库版)
通讯录3.0版本一、序言二、功能三、代码1、主函数2、函数声明3、功能函数一、序言这是使用数据库写成的通讯录相较于链表与文件 更加的简洁操作单一 主要是要记得懂得 数据库的命令 然后用C写出最常用的两个函数sqlite3_exec(pdb,sql,NULL,NULL,&errmsg)第一个参数是指向数据库的指针 第二个是你想要执行的命令(提前赋给sql,第三和第四个参数 是当你用这个函数进行查找命令时候 要使用回调函数时候需要传值但是我在需要使用查找命令时 我更喜欢使用sqli
2022-03-02 16:19:07 653
原创 数据库sqlite3的安装与应用
嵌入式数据库一、ubuntu18.04 sqlite3安装1.安装sqlite32. 安装sqlite3可视化工具sqlitebrowser二、数据库基础知识(对于使用数据库作用不大,选看吧)三、关系术语和定义四、sqlite3的语句使用五、SQLite 语法1.大小写敏感性C API使用C语言进行数据库应用代码一、ubuntu18.04 sqlite3安装1.安装sqlite3sudo apt-get install sqlite3sudo apt-get install libsqlite3-d
2022-02-27 21:08:28 3830
原创 通讯录2.0
通讯录2.0序言:一、功能二、代码1.主函数:2.功能函数:3.函数声明:序言:相比于通讯录1.0 加入了文件编程 写了两个函数1.创建一个文件来存储链表结点信息2.使用一个读函数 将文件中的信息读入链表中使得这次创建的结点信息 可以在下次使用通讯录时依然存在 不会丢失一、功能1.增加成员及信息 2.显示通讯录所以成员信息3.查找成员信息 4.删除成员5.修改成员信息 6.存储结点信息7.释放通讯录并退出程序二、代码1.主函数:#include<stdio
2022-02-26 21:24:49 402
原创 Linux文件编程
Linux 文件编程一、Linux系统调用及用户编程接口(API)一、Linux系统调用及用户编程接口(API)本地存储:文件存储:数据库
2022-02-25 21:03:57 922
原创 八大排序(内部排序)
八大排序一、希尔排序一、希尔排序希尔排序是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。直接插入排序 有一个问题如果待排序列中,顺序恰好是逆序,如果用直接插入排序,那将耗费大量的代价,每次都要移动大量 数据,付出非常惨重的代价。 因此 就诞生了 希尔排序, 这个排序方法,可以算是对 插入的一种改进。希尔排序是非稳定排序算法。排序思想: 先把 待排序列 分成若干组,对这若干组进行 插入排序,这样就 一部分 就先有序了, 之后 对这个组 在重新 划分 更小的若干组,进行
2022-02-23 20:18:51 369
原创 通讯录1.0版本
通讯录1.0版本一、介绍二、功能三、代码1.主函数:2.功能函数:3.函数声明:一、介绍这是使用了带表头结点的单链表 制作的通讯录1.0版本没有使用文件,所以信息无法持久化当程序结束时,信息会丢失下次无法访问到这些信息二、功能1.增加成员及信息 2.显示通讯录所以成员信息3.查找成员信息 4.删除成员5.修改成员信息 6.释放通讯录并退出程序三、代码1.主函数:#include<stdio.h>#include<stdlib.h>#inc
2022-02-22 11:07:14 758
原创 栈与队列的操作
这里写目录标题一、栈以及相关操作1.定义及特点2.栈的主要操作3.栈的数组表示-----顺序栈4.具体代码5.链式栈二、队列以及相关操作1.定义2.主要操作一、栈以及相关操作1.定义及特点定义:只允许在- -端插入和删除的线性表;允许插入和删除的- -端称为栈顶(top) ,另一端称为栈底(bottom)。特点:先进后出原因:进栈出栈在同一端2.栈的主要操作3.栈的数组表示-----顺序栈top叫做栈顶指针 但不是真的指针,它只是指向数组的元素位置 所以叫它指针进栈是top先++
2022-02-19 20:43:36 437
原创 C语言完整知识体系总结
C语言的知识体系总结这里写目录标题C语言的知识体系总结序言:C语言的概述历史、特点、标准)1、嵌入式开发为什么选择C语言?(面试题!)2、为什么内核开发选择C语言?3、C语言的缺点:a)面向结构:b)面向对象的特点c)面向结构和面向对象的区别:举例:d)面向对象方法的思想:e)结构化程序具有以下几个特征:4、C语言实现面向对象编程?5、C语言的开发方向6、精通C语言、掌握C语言7、总结:一、C语言基础知识点1、机器码(运行效率、访问硬件能力)2、C语言之父:丹尼斯-里奇3、C语言语法标准:K&RC
2022-02-16 21:10:13 6271
原创 单链表 循环单链表 循环双链表的各种插入方法及删除方法
一、线性表二、顺序表三、链表1、单链表结点类型创建插入a)头插法b)尾插法c)中间插入法(插前面)d)中间插法(往后插)删除静态链表循环链表双向链表一、线性表定义n个数据的有限集合特点:除第一个元素外,其他元素有且仅有一个直接前驱除最后一个元素,其他元素有且仅有一个直接后继二、顺序表定义:将线性表中的元素相继存放在一个连续的存储空间中可利用一维数组描述存储结构特点:线性表的顺序存储方式遍历:顺序访问,可以随机存取三、链表1、单链表特点:每个元素由结点构成线性结构:结点可以连续,.
2022-02-15 21:25:24 2662
原创 C语言基础与提高4
函数调用时 是按照形参所写实参是按形参所给在被调用函数中声明的形参数组【】中的大小可以不用关,系统不检查选Dsub1中的a是全局的 因为它自己没有定义而sub2中自己定义了a【】所以是局部的 当这个函数结束时 这个a【】也会消失 什么都不留下自己写 函数 (后面再加)...
2022-01-25 20:06:56 340
原创 关于C语言中遇到的一些问题积累
关于C语言中一些问题积累scanf("%d%*c",&m);这个%*c什么意思呢*%c作用时读取输入流中数字后的一个字符,并丢弃,使得后面的输入函数不能读到那个字符如:scanf("%d %*d %d",&a,&b);当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。*%c则是指跳过字符*所以最上面那一句的%c的作用是拿来吸收回车字符用的...
2022-01-24 16:00:40 313
原创 C语言基础与提高2
C语言基础与提高2const 修饰变量 表示这个变量只可读int *a*a是取a指向的地址中的值(是取内容)*a++ a所指地址中的内容加一a++ 地址指向++查!!!
2022-01-21 21:59:41 446
原创 教你理解复杂的C - C++声明
介绍曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明:我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地 理解任何C/C++声明的“右左法则”。需要强调一下的是,复杂的C/C++声明并不是好的编程风格;我这里仅仅是教你如何去理解这些声明。注 意:为了保证能够在同一行上显示代码和相关注释,本文最好在至少1024x
2022-01-21 20:16:00 132
原创 C语言基础与提高1
C语言基础与提高分析:控制每行怎么输出第一行用for小循环下就行 然后换行第二行用----来划分开 (注意每个字符占4列)从第三行开始 是循环的嵌套分为三部分 第一部分是输出表头1| 2|这样 就用3%d加个|第二部分是下一个循环是在 i 前面是“空格” 第三部分 i 后面是相乘i*j 然后换行 一次循环结束 然后开始第四行循环对数组的操作是对数组元素的操作 不可以整体操作变量是内存空间的映射指针变量占8个字节58-10064 32 16 8 4 2 1\ddd:\101 =6
2022-01-19 21:06:18 427
原创 gdb调试程序的使用 和 工程管理器make的使用及格式 和 项目模板的使用 以及 脚本shell的知识点
主要查功能错误 控制程序运行首先用gcc -g 将调试命令加入程序然后启动gdb 设置断点 然后runinfo break 查看断点信息n表示往下单步运行print 加变量 查看变量当前值continue 表示继续运行到下个断点q 退出调试模式list 默认每次显示十行代码list加行号 表示从这行开始显示代码(在调试模式下查看代码)start 开始执行程序,只开始第一句 然后等命令set 设置变量值clear 什么也不加 断点全部删除加断点所在行号 删除断点而delete.
2022-01-17 20:27:32 223
原创 Linux基本命令和静态库和动态库的建立即区别
1.文件目录处理类指令su切换用户tar cvzf 压缩 后面跟两个文件名 最后面的文件名是压缩完成的文件名tar xvzf 解压ifconfig 查看虚拟机ip地址ifconfig eth0 加上想改成的ip地址 修改ip地址(eth0我的电脑可能不是这个 先查看ip地址 就可以知道自己的是什么了)我的是ens33passwd 修改用户密码cat 顺序显示文件内容tac 倒叙显示文件内容more 分页查看文件内容,回车键向下一行,空格键向下一页lesshead -nx 取文件首n行
2022-01-15 20:04:40 486
原创 VMware安装Ubuntu电脑蓝屏报错:你的设备遇到问题,需要重启;我们只收集某些错误信息,然后为你重新启动。
VMware安装Ubuntu电脑蓝屏报错:你的设备遇到问题,需要重启;我们只收集某些错误信息,然后为你重新启动。
2022-01-14 10:10:01 12398 13
原创 嵌入式开发与传统开发的区别
嵌入式开发与传统开发的区别传统开发主要是硬件与软件 他们直接直接交流 当硬件发生改变时软件也要做大幅度改变而嵌入式开发中加入了以恶搞起到承上启下作用的操作系统用它来间接联系硬件与软件。这样降低了硬件与软件的耦合度高的问题Linux的基本命令cd -是指回到这个目录之前的目录中cd ~回到当前用户的home目录cd ~后面加用户名 是指回到指定的用户的家目录中PATH是搜索路径b是快设备文件c是字符设备d是目录p是有名管道文件名是以. 开头 是 隐藏文件.表示当前目录…表示当前目
2022-01-13 20:11:40 779
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人