自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JavaScript 字符串操作

contact方法concat方法可用于拼接字符串let a = "hello"let b = a.concat(" world")console.log(b)//"hello world"slice方法slice方法:第一个参数指定子字符串开始位置,第二个参数表示子字符串最后一个字符后面的位置let a = "hello world"let a.slice(2, 3)//"...

2019-11-07 18:51:57 117

原创 JavaScript中的深拷贝与浅拷贝

**JavaScript中的深拷贝与浅拷贝**js中的内存分为栈内存与堆内存栈内存的六种数据类型:String Number Boolean undefined null Symbol栈内存会开辟出一个新的空间存放数据,因此当a的值发生变化时,b的值不会改let a = 10;let b = a;a = 20b的值不会改,依旧还是10堆内存的三种数据类型: Object Ar...

2019-10-25 11:59:57 223

原创 小项目——基于嵌入式 web 服务器的测控系统

在 Linux 下,移植一个 boa 服务器,编写相应 cgi,在网页上动态刷新串口数据(使用虚拟串口),使用到串口编程,数据库编程及简单前端知识。 该测控系统测量数据通过虚拟串口传递(由于条件限制未使用传感器),目前只有测的功能,未来会进一步改进。以下是具体内容读取串口数据程序: 这里用到串口编程,写一个程序读取串口数据,然后将读取数据插入数据库,有用到数据库编程的知识。#include <s

2017-11-02 21:44:26 506

原创 小项目——通讯录2.0

上一个版本的通讯录是使用链表操作数据,最后写入文件中存储,最后实现的信息管理,在了解过一段设计模式后,产生了一个想法,就是使用一个单例模式,对数据库进行操作,实现信息管理。 (这个版本是在Windows平台下使用vs编写,用的数据库是MySQL, 做的比较粗糙,也比较简单,界面什么的都没做,纯属于练手,一些细节做的不够好,但大体功能还是能实现的)下面是程序代码:#include <WinSock2

2017-10-30 20:05:12 250

原创 小项目:即时通讯系统

这个简单的通讯系统使用 C 语言完成编写,采用 C/S 架构,在 Linux 平台下,运用到 TCP/IP 协议,多线程编程的技术,使用几个简单 API 对 sqlite3 数据库进行操作,能实现注册,登录,群聊,私聊等几种功能。下面是程序代码: 服务器端:#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#incl

2017-10-27 22:03:15 288

原创 异常在类层次中的使用

异常在类层次中的使用即是继承在异常中的使用,这个内容可以用一个案例阐述出来 这个案例的要求是这样的: 设计一个数组类 MyArray,重载[]操作, 数组初始化时,对数组的个数进行有效检查 1)index<0 抛出异常eNegative 2)index = 0 抛出异常 eZero 3)index>1000抛出异常eTooBig 4)index<10 抛出异常eTooSmall

2017-09-28 16:30:13 233

原创 类模板中的static关键字

从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员 和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化 每个模板类有自己的类模板的static数据成员副本 下面这个案例可以看出他的一些特性。#include <iostream>template <typename T>class A{public:

2017-09-28 16:29:18 229

原创 多态原理

1、多态原理的实现 我们知道多态实现的三个条件:1.继承,2.虚函数重写,3.父类指针或引用指向子类对象 当类中有一个函数是虚函数,会在类中增加一个 虚函数指针,虚函数指针会指向一个虚函数表; 虚函数表是一个存储类成员函数指针的数据结构; 虚函数表是由编译器自动生成与维护的; virtual成员函数会被编译器放入虚函数表中; 存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr)void

2017-09-28 16:24:12 296

原创 继承的访问控制

1、单个类的访问控制 单个类的访问控制我们都是知道的,而且在之前的课程中也讲过了: public 修饰的成员变量 方法 在类的内部 类的外部都能使用。 protected: 修饰的成员变量方法,在类的内部使用 ,在继承的子类中可用 ;其他 类的外部不能被使用。 private: 修饰的成员变量方法 只能在类的内部使用 不能在类的外部。 2、继承权限 不同的继承方式会影响基类成员在派生类中

2017-09-22 20:57:24 408

原创 继承的概念

1、在讲继承之前先将一些类之间的几种关系 1)包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。 2)一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。 3)机制称为“继承”。关系具有传递性,不具有对称性。 而我们今天着重要讲的就是继承。 2、继承简单介绍: 继承是面向对象软件技术当中

2017-09-22 20:55:29 371

原创 逻辑与和逻辑或的重载

&&和||是C++中非常特殊的操作符 ,&&和||内置实现了短路规则 ,操作符重载是靠函数重载来完成的 ,操作数作为函数参数传递 ,C++的函数参数都会被求值,无法实现短路规则 。所以一般情况下不会重载逻辑与和逻辑或。 下面就用一个案例来分析为什么不要重载逻辑或和逻辑与。#include <stdio.h>class Test8{public: Test8(int a) {

2017-09-22 20:54:10 342

原创 括号运算符重载

圆括号运算符()也可以重载,重载之后对象就可以使用圆括号运算符了。 括号运算符只能被重载为类的非静态成员函数,不能重载为友元函数和普通函数。 载括号运算符函数的参数个数没有限制,甚至没有参数都可以。 重载格式 类型 类 :: operator() ( 表达式表 ) ;下面用一个案例来呈现括号重载括号运算符#include <stdio.h>class Test7{public

2017-09-22 20:53:02 4856

原创 深拷贝与浅拷贝

深拷贝和浅拷贝 浅拷贝:在拷贝指针的时候只是拷贝了地址,不会进行空间的复制class Test8_1{public: Test8_1(int id, char *name) { m_id = id; m_name = (char *)malloc(sizeof(char)* 20); strcpy(m_name, name);

2017-09-18 16:53:43 331

原创 构造函数拓展

1、默认构造函数 如果类中没有定义任何构造函数,编译器会自动生成一个无参构造函数,没有做任何事情, 如果写了构造函数,编译器将不再提供默认的无参构造函数,如果还还想进行无参构造,需要显示定义无参构造函数 如果没有定义拷贝构造函数,编译器会自动生成一个拷贝构造函数,会做普通类型数据的复制。 还会生成一个默认的 析构函数。class Test7_2{ Test7_2() {} T

2017-09-18 16:52:14 797

原创 拷贝构造

前文中提及到了拷贝构造,本文将进行详细探讨。 拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调

2017-09-18 15:07:40 413

原创 构造函数和析构函数

1、构造函数 C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数。构造函数用来对类的成员变量进行初始化,没有返回值,构造函数在定义对象的时候自动调用,一般情况下,不需要手动调用。 class Test..Test() // 无参构造 { m_a = 1; m_b = 2;

2017-09-18 11:20:52 387

原创 c语言到c++过渡2

本文接上文所讲,对c语言到c++间的过渡做一个归纳1、函数参数问题 首先是函数的参数问题,c语言中函数可以没有返回参数类型,函数参数可以没有数据类型,没有参数的函数可以接收任意个参数,这样是不太好的,而在c++中,没有参数的函数就被看做是无参函数,不能给函数传参,而且在c++中函数参数必须要有类型。2、新增bool类型关键字 C++在C语言的基本类型系统之上增加了bool,C++中的

2017-09-16 20:58:10 473

原创 c到c++的过渡

c++对c的加强 1、命名空间 一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。为了解决合作开发时的命名冲突问题,C++ 引入了命名空间(Namespace)的概念。命名空间将全局作用域分成不同的部分 不同命名空间中的标识符可以同名而不会发生冲突 命名

2017-09-13 20:41:44 292

原创 Linux网络编程

Linux的优点之一就是在于它丰富而稳定的网络协议栈,其范围是从协议无关层(如通用的socket层接口和设备层)到各种网络协议的实现 对于网络理论介绍一般采用OSI模型,但是Linux中网络栈的介绍一般分为四层的Internet模型,Linux下TCP/IP四层模型概念一般为网络接口层,网际层,传输层,应用层。TCP是重要的传输层协议,目的是允许数据同网络上的其他节点进行可靠的交换。它能提供

2017-09-13 20:03:58 296

原创 数据库编程

SQLite将每个数据库都保存成一个文件。 数据库中的数据被组织成表的形式。 表由若干拥有相同字段的记录组成。 表可以为空,即拥有0条记录。 字段指的是记录中的数据域,它有不同的类型,可以是一个数值,也可以是字符串。 每个表中可以指定一个或多个字段为主键,表中所有记录的主键的值都不能重复。这种不重复是在插入记录时控制的,即如果向一个表中插入记录时,这个表中已有与插入记录具有相同

2017-09-03 16:07:04 301

原创 多线程编程2——线程同步

信号量 信号量通常有两种:二进制信号量和计数信号量。二进制信号量只有0和1两种取值,计数信号量有更大的取值范围。 信号量一般用来保护一段代码,使其每次只能被一个执行线程运行,要完成这个工作,可以使用二进制信号量。 有时,希望可以允许有限数目的线程执行一段指定的代码,这时可以使用计数信号量。创建#include <semaphore.h>int sem_init(sem_t *

2017-09-02 11:17:06 172

原创 多线程编程1——基础知识

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属于一个进程的其他的线程共享进程拥有的全部资源。Linux进程创建一个新线程时,线程将拥有自己的栈(因为线程有自己的局部变量),但与它的创建者共享全局变量、文件描述符、信号句柄和当前目录状态。Linux通

2017-09-01 23:12:47 170

原创 进程通信3——消息队列,信号通信

消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式。 进程可以向其中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。 消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述符,必须提供该消息队列的键值。消息队列的创建和发送消息:#include #include #include int msgget

2017-08-18 21:00:14 207

原创 进程通信2——共享内存,信号量

共享内存: 共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。 创建共享内存分为两步: 1、创建共享内存,使用shmget函数 2、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。 案例:typedef struct _shm{ i

2017-08-18 20:40:41 193

原创 进程通信1——管道通信

管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道尾部写入数据,另一个进程(读进程)从管道的头部读出数据。 两个程序之间传递数据的一种简单方法是使用popen和pclose。#include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *s

2017-08-17 20:54:38 375

原创 MySQL入门3——约束及修改数据表

本文其实应该写在前一篇之前的,但之前写了就写了吧,本文主要将一些对约束和数据表的一些操作。首先讲下如何创建一个数据列以及如何删除它吧 比如添加一个单列: ALTER TABLE user ADD age TINYINT NOT NULL DEFAULT 10; 这句话的意思就是添加一个名为age 数据类型为TINYINT 非空且默认值为10的单列。删除这个列: ALTER TABLE use

2017-08-11 19:56:06 259

原创 前期学习应用——小练习:通讯录

通过前期的学习,对几种数据结构有了一些了解,所以决定做一个小练习,巩固一下前期所学的知识。 这个通讯录比较原始,功能比较简单,可以进行添加,删除,查看,搜索用户功能,主要是在链表中进行的操作,数据也都是存放在链表中,后来在学习了文件系统编程的内容后尝试着将链表中的内容写入到文件中,同时也可以从文件中读取内容到链表中进行操作。功能中还有一些小小的细节要求,比如在查看时通讯录内容要按id号进行升序排列

2017-08-11 11:30:18 256

原创 进程控制3——进程终止和等待

一个进程不可能永远的存在,必然存在着结束,我们需要进行一些操作来终止这些进程。而父进程创建子进程后,如何知道子进程什么时候终止?如何知道子进程怎么终止?所以又带来了进程等待的问题。下面先将一些关于进程终止 的函数, exit,_exit都是用于终止进程的函数 区别: _exit: 直接使进程停止,清除其使用的内存,并清除缓冲区中内容 exit:在停止进程之前,要检查文件的打开情况,并把文件缓

2017-08-10 11:30:30 301

原创 进程控制2——几个简单API

本文接着上文接着讲一些关于进程控制的知识,上文更多的讲的是一些基础知识,本文将讲一些与进程控制相关的函数。进程创建fork() fork()函数可以用来创建一个子进程,它被调用一次,却返回两次,它可能有三种不同的返回值:在父进程中,fork返回新创建的子进程的PID;在子进程中,fork返回0;如果出现错误,fork返回一个负值。 通过以下代码可以验证:pid_t pid = fork();i

2017-08-10 10:52:23 555

原创 进程控制1——关于进程控制的一些基础知识

进程是一个具有一定独立功能的程序的一次运行活动 程序是放到磁盘的可执行文件,进程是指程序执行的实例。 进程执行的状态: 每个进程都有一个ID(ID是一个正整数),唯一标识了系统中的这个进程。 每个进程都有一个创建它的进程,叫父进程(Parent Process) 通过以下代码可以获取进程的ID,printf ("当前进程 Id: %d\n", getpid());printf ("

2017-08-09 19:35:18 255

原创 文件系统编程——标准I/O库

printf函数向标准输出写入多个字符,所写入的字符被放在一个用户态的缓冲区中,直到碰到一个换行符,系统才调用write函数将缓冲区中的数据写入标准输出,也就是说,在换行符之前写入的字符并不会立即出现在控制台屏幕上。 系统调用要请求内核的服务,会引发CPU模式的切换,期间会有大量的堆栈数据保存操作,开销比较大。如果频繁地进行系统调用,会降低应用程序的运行效率。有了缓冲机制以后,多个读写操作可以合并

2017-08-08 20:12:10 483

原创 文件系统编程——基础知识

1、系统调用:所有的操作系统都提供多种服务的入口点,程序由此向内核请求服务。这些可直接进入内核的入口点被称为系统调用。2、操作系统提供的服务:进程控制、文件系统控制、内存管理、网络管理、用户管理、进程间通信。 在Linux中,为了更好地保护内核空间,程序的运行空间分为内核空间和用户空间(也就是常称的内核态和用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。因此,用户进程在通常情况下不允许

2017-08-07 10:08:01 521

原创 MySQL入门2——对数据表中记录的操作

上文着重讲了一些数据库的基本数据类型,以及对于数据库的一些操作。本文主要讲一些对表数据的操作。1、插入表数据 语句:INSERT [INTO] tbl_name [(col_name,…) VALUES ({expr | DEFAULT},…),(…),…●tbl_name。被操作的表名。 ●col_name。需要插入数据的列名。如果要给全部列插入数据,列名可以省略。如果只给表的部分列插入数

2017-08-07 09:13:11 337

原创 MySQL入门1——数据类型和简单数据表操作

MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。本文主要介绍一些MyS

2017-08-06 20:20:47 351

原创 排序3——堆排序,归并排序,快速排序

继续讲排序的方法 堆排序:void heapify(int *a, int i, int len){ int left = 2 * i + 1; int right = 2 * i + 2; int max = i; if(left < len && a[left] > a[max]) max = left; if(right < len &

2017-08-06 19:42:28 349

原创 排序2——插入,希尔排序

继续上文讲排序的方法 插入排序:void insert_sort(int *a, int len){ int i,j,get; for(i = 1; i < len; i++) { get = a[i]; j = i - 1; while(j >= 0 && a[j] > get) { a

2017-08-06 19:08:28 266

原创 排序1——冒泡,选择排序

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。 本文主要来讲几种排序方法冒泡排序:void bouble_sort(int

2017-08-05 21:54:34 218

原创 二叉树3——三种遍历(递归方法)

遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍历:左子树->右子树->根节点用递归方法实现三种遍历还是比较简单的,也比较好理解。前序:void pre_order (BTreeNode *node){ if (node == NULL)

2017-08-05 21:47:30 293

原创 二叉树2——删除节点与求度,高度

本文继续讲一些关于二叉树的操作 首先是删除:int Delete (BTree *tree, int pos, int count){ if (tree == NULL) return FALSE; // 找结点 BTreeNode* parent = NULL; BTreeNode* current = tree->root; int w

2017-08-05 21:41:51 347

原创 二叉树1——创建与插入节点

二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和

2017-08-04 20:54:27 3496

空空如也

空空如也

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

TA关注的人

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