自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 软件测试基础教程学习4

*黑盒测试:**已知产品的用户需求规格,可以通过测试证明整个软件系统是否符合用户的最终需求。**白盒测试:**已知产品的详细设计过程,可以通过测试证明所有内部操作是否符合设计规格要求,所有内部成分是否已经通过检查。黑盒测试的出发点是用户需求,而白盒测试的出发点是程序实现。

2023-07-03 21:51:58 423

原创 软件测试基础教程学习3

对于软件质量的衡量,就是高质量的软件系统能够准时交付给用户,所耗费的成本不超过预算,且能够正常地运行,即该软件必须尽可能地没有BUG。软件质量好坏程度的基础是软件需求,与需求不符的软件就不是高质量的软件。如果安装能由用户来完成,则按照安装手册中的信息应能成功安装产品描述中指出的每种所要求的系统对于程序的安装应是充分的。软件可靠性测试由可靠性目标的确定,运行剖面的开发,测试的计划与执行,测试结果的分析与反馈四个主要的活动组成。软件有没有多余或者遗漏的功能,或者某些功能是否执行了与市场宣传材料不符的操作。

2023-06-16 15:13:40 1438

原创 软件测试基础教程学习2

软件开发流程以V模型为例,介绍软件开发生命周期(1)需求分析阶段。需求分析人员进行需求获取和分析,这个阶段的输出是需求规格说明书。在这个阶段,测试工程师就可以开始制定系统测试计划,并且根据需求规格说明书着手进行系统测试说明的编写。(2)概要设计阶段。设计人员根据需求规格说明书进行概要设计,这个阶段的输出是概要设计说明书,测试工程师开始制定集成测试计划,并且根据概要设计说明书编写集成测试说明。(3)详细设计阶段。

2023-06-06 15:51:58 519

原创 软件测试基础教程学习1

1)软件测试要发现软件的错误。2)软件测试最终要以软件满足用户需求为目标。

2023-05-27 16:38:36 1035

原创 数据结构与算法——二叉树

二叉树一、树的定义:二、二叉树的概念2.1二叉树的定义:2.2二叉树的性质2.3 二叉树的存储表示2.4.二叉树的遍历(Binary Tree Traversal)递归实现先、中、后序遍历:构建二叉树:非递归实现先、中、后序遍历层次遍历:Z型层次遍历2.5计算二叉树的结点个数和深度三、二叉树的判定3.1判断是否为满二叉树3.2是否是完全二叉树3.3是否是BST树3.4是否是平衡二叉树3.5是否是对称二叉树3.6是否是一棵树的子树3.7两个二叉树是否相同一、树的定义:树是由n个结点组成的优先级合。如果n=

2022-03-20 16:01:23 2178

原创 数据结构与算法——BST树

BST树的定义:二叉排序树,二叉搜索树。二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同。左子树(如果存在)上所有结点的关键码都小于根结点的关键码。右子树(如果存在)上所有结点的关键码都大于根结点的关键码。左子树 和右子树也是二叉搜索树。总结:如果一棵二叉搜索树进行中序遍历,可以按从小到大的顺序,将各个节点关键码排列起来,所以也称二叉搜索树为二叉排序树。结构设计:typedef int KeyType;

2022-03-20 15:59:23 795

原创 算法:递归与分治策略

分治策略与递归分治策略与递归分治策略与递归一、分治策略与递归概念二、求解n的阶乘。(不考虑int溢出)三、打印函数四、查找函数一、分治策略与递归概念分治策略:是将规模比较大的问题可分割成规模较小的相同问题。问题不变,规模变小。这自然导致送归过程的产生。分治与递归像一对李生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。递归:若一个函数直接地或间接地调用自己则称这个函数是递归的函数。(简单地描述为"自己调用自己”)。分治法所能解决的问题一股具有以下四个特征:●该问题的规模缩小到一定

2022-02-21 21:27:52 817

原创 C++: C和C++的区别

C和C++的区别C和C++的区别C和C++的区别一、输入与输出二、引用1.引入库2.读入数据三、inline内联函数四、函数默认值五、函数重载六、模板函数七、new和delete八、namespace命名空间一、输入与输出C:#include<stdio.h>int main(){ int a=0; char b='\0'; scanf_s("%d%c",&a,&b); printf("a=%d,b=%c",a,b); return 0;}C+

2022-02-19 23:03:15 5086 1

原创 数据库——视图

视图一、视图概念二、 为什么要使用视图三、 性能问题四、 定义视图五、 查看视图六、 删除视图一、视图概念视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库中实际存放数据,它的数据来自定义视图时使用的基本表,并且是在使用视图时动态生成的。创建视图,名字一般以v开头,为了查询方便可以直接查询视图(虚拟表)。二、 为什么要使用视图简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道它的查询细节。重复使用该sql语句。使用表的组成部分而不是整个

2022-02-09 11:51:07 1048

原创 数据库——事务

数据库事务事务1. 什么是事务,为什么需要事务?2. 事务四大特性(ACID)3. 四种隔离级别4. 事务命令事务事务是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有地语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。1. 什么是事务,为什么需要事务?所谓事务,它是一个操作系列,这些操作要么都执行,要么都不执行,它是一个不可分割的工

2022-02-09 11:19:46 3118 3

原创 C++: 总结const与指针和引用的关系

C++ 总结const与指针和引用的关系总结const与指针的关系4种const位置int a=10,int b=20;int *p1=&a; //自由的指针int const *p2=&a;const int *p2=&a; //约束指向的能力,指向为常性int *const p3=&a; //p3自身为常性const int * const p4=&a; //约束自身和指向能力只能进行收缩而不能扩张int a=1

2022-01-10 22:46:59 566

原创 mysql 用户管理与授权

mysql 用户管理与授权查看用户信息创建用户 :创建本地登陆用户:创建远程登陆用户:远程登陆授权用户对哪些数据库的哪些表可以进行操作设置本地用户登陆database_neme数据库table_name数据表的权限给user_name用户可以从任意地点登录访问所有数据库的所有表取消刚赋予用户的一个权限。给远程用户查询的权限查看用户信息mysql> select user,host,plugin from mysql.user;创建用户 :创建本地登陆用户:mysql> create

2021-12-12 21:45:03 526

原创 数据库C程序连接

C语言访问mysql1、连接数据库使用的头文件和库文件2、初始化连接句柄3、连接数据库4、关闭连接5、执行sql语句6、提取结果7、获取结果集中有多少行8、取出结果集中的一行记录9、查看记录行的列数10、释放结果集占用的内存11、获取错误信息12、程序示例用C语言对数据表进行增删改查操作(不需要返回结果)用C语言对数据表操作(有返回结果)1、连接数据库使用的头文件和库文件#include <mysql/mysql.h>有些也在 #include <mysql.h>程序

2021-12-12 20:45:00 4707 2

原创 高性能I/O框架库Libevent

Linux服务器程序处理的三类事件:I/O事件、信号事件和定时事件。I/O框架库以库函数的形式,封装了较为底层的系统调用。基于Reactor模式的I/O框架库包含的组件:句柄、事件多路分发器、事件处理器和具体的事件处理器。句柄I/O框架库要处理的对象,即I/O事件、信号事件和定时事件,统一称为事件源。I/O事件对应的句柄是文件描述符,信号事件对应的句柄是信号值。事件多路分发器即事件循环。内部调用的是select、poll、epoll_wait.事件处理器和具体事件处理器L

2021-12-08 14:20:39 543 2

原创 I/O复用方法——epoll

epollselect 和poll的问题找到就绪描述符 遍历所有描述符 ,时间复杂度O(n);内核中是轮询的方式,时间复杂度O(n);每次都需要向内核传递描述符和事件;epoll 处理较多的客户端数目epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 select、poll 有很大差异。首先,epoll 使用一组函数来完成任务,而不是单个函数。其次,epoll 把用户关心的文件描述符上的事件放在内核里的一个事件表中。从而无需像select 和 poll 那样每次调用

2021-12-06 17:50:23 1325 2

原创 I/O复用方法——poll

select 和 poll 的区别:在内核实现上,两者都采用轮询方式;时间复杂度:O(n)。select 传的是一个集合,上限1024;poll 支持更多的描述符;因为它传的是一个数组可以动态开辟。select 支持三种事件类型,读、写、异常;poll支持更多的事件类型。...

2021-12-06 00:00:00 271 1

原创 数据库安装使用

mysql数据库一、数据库数据库概念数据库 :是存放数据的仓库(文件),它是一个按数据结构来存储和管理数据的计算机软件系统。数据库管理系统 : 是数据库系统的核心组成部分,主要完成对数据库的操作与管理功能,例如实现数据的存储,查询,修改,删除,及数据库用户的管理,权限管理等。RDBMS : 关系数据库管理系统(Relational Database Management System)。关系型数据库 :指采用了关系模型来组织数据的数据库,关系模型就是指二维表格模型,而一个关系型数据库就是由二维表

2021-12-05 12:06:27 1099 2

原创 I/O复用方法——select

IO服用方法:select poll epoll作用:可以同时监听多个文件描述符,使服务器在不引入多进程的情况下同时处理多个文件描述符。socket 有读事件产生:socket 通信的对方关闭连接。监听socket 上有新的链接请求。socket 上有未处理的错误。...

2021-12-03 11:30:19 489

原创 C++ 智能指针

智能指针输入问题:给定一个字符串,不知道有几个字符,怎样输入?使用cin.getline(); 输入一行。智能指针概念智能指针主要是针对裸指针进行了一次面向对象的封装,在构造函数中初始化资源地址,在析构函数中释放资源。当资源应该被释放时,指向它的智能指针可以确保自动释放它。RAIIRAII 对堆上空间进行自动化管理——利用对象自动析构的机制。malloc, new 等动态分配的对象,很有可能忘记了去释放资源而导致泄露。对于一个对象而言,在构造函数的时候申请空间,而在析构函数(在离开

2021-12-01 20:42:05 3641 3

原创 模拟实现vector

vector的基本使用容器string ——近容器int arr[10]char str[10]vector ——真正的容器——当作数组来用v.resize(),增加数组容量,新增加的用默认值0填充;减少数组元素时会将元素清除掉。v.reverse(),扩容,不改变数组元素。max_size(), 当前数组元素最多能填充的数据。void show(vector<int>& v){ for (int i = 0; i < v.size(); i+

2021-11-30 17:31:18 607

原创 生产者消费者

生产者消费者生产者消费者问题概述生产者/消费者问题,也被称作有限缓冲问题。可以描述为:两个或者更多的线程共享同一个缓冲区,其中一个或多个线程作为“生产者”会不断地向缓冲区中添加数据,另一个或者多个线程作为“消费者”从缓冲区中取走数据。生产者/消费者模型关注的是以下几点:生产者和消费者必须互斥的使用缓冲区;缓冲区空时,消费者不能读取数据;缓冲区满时,生产者不能添加数据。生产者消费者模型优点:解耦:因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这样生产者和消费者的代码发生变化,都

2021-11-27 21:39:52 1080

原创 什么是守护进程

守护进程守护进程特点:运行周期长;在后台执行,不需要和用户进行交互。在windows上称为服务。会话:终端的打开会伴随着会话的建立,直到exit退出终端会话才会结束。会话首进程:在会话中运行的第一个进程就是首进程。在终端中,bash就是第一个进程(会话首进程)。进程组:在终端中执行命令,就会创建一个进程组,是进程组中唯一的进程。当命令结束时,整个进程组就会消失。一个进程组中可以包含一个进程,也可以包含两个或多个进程。组长进程:父进程(组长进程),子进程(组员进程)。守护进

2021-11-27 19:58:35 826 4

原创 顺序表与链表的区别

顺序表与链表的区别一、底层实现顺序表:连续存储的容器,动态数组,在堆上分配空间;链表:动态链表,在堆上分配空间;二、空间利用率顺序表:连续空间,不易造成内存碎片,空间利用率高;链表:节点不连续,易造成内存碎片,小元素使节点密度低,空间利用率低;三、查询元素顺序表:find O(n);binary_search O(logn); 排序后链表:find O (n);四、插入和删除顺序表:插入:在最后插入(空间够):Push_back; O(1);在最后

2021-11-26 20:47:34 179

原创 泛型算法和函数对象

TOC泛型算法和函数对象泛型算法copy 拷贝//模拟实现拷贝template <typename INSERT_IT, typename IT>void my_copy(const IT &first,const IT &last, INSERT_IT insert_it){ IT tmp = first; for (; tmp != last; tmp++) { *insert_it = *tmp; }}int main(){ vector&

2021-11-26 11:48:14 67

原创 STL迭代器

STL迭代器顺序迭代器——遍历型迭代器iterator 正向迭代器reverse_iterator 反向迭代器const_iterator 常量正向迭代器reverse_const_iterator 常量反向迭代器插入型迭代器insert_iterator 随机插入型迭代器 ——依赖insertback_insert_iterator 后插型迭代器 ——push_backfront_insert_iterator 前插型迭代器 ——push_front流

2021-11-24 22:34:11 174

原创 单链表的插入排序

单链表的插入排序思路:确定窗体的头和尾,先和头比较,小于头,在头之前插入;大于尾,在尾后面链,否则在中间插入。ListNode* InsertSort(LinkList head){ if (head == NULL || head->next == NULL)return head; ListNode* sort_head = head; ListNode* sort_tail = head; ListNode* ip = head->next; ListNode* n

2021-11-21 21:32:46 1398

原创 STL容器

STLSTL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。算法:各种常用的算法,如sort、find、copy、for_each等迭代器:扮演了容器与算法之间的胶合剂。仿函数:行为类似函数,可作为算法的某种策略。适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。空间配置器:负责空间的配置与管理。STL容器近容器int arr[ ]string str

2021-11-19 23:05:40 850

原创 继承和多态3

继承—— 菱形继承定义:两个派生类继承同一个基类,又有某个类同时继承者两个派生类。class A{public: A(int a) { _a = a; } int _a; int funa() { cout << "A::funa()" << endl; }};class B:virtual public A{public: B(int a, int b) :A(a) { _b = b; } int _b; int funab

2021-11-17 15:04:38 175

原创 打印杨辉三角——一维数组实现

打印杨辉三角——一维数组实现 逆向#define N 20int main(){ int ar[N] = { 0 }; for (int i = 0; i < N; i++)//0-19行 循环20次 { printf("第%d行:",i+1); for (int j = i; j >= 0; j--) { if (j == 0 || j == i) { ar[j] = 1; printf("%9d", ar[j]); }

2021-11-12 16:54:23 226

原创 继承和多态2

多态:多态分为静多态和动多态。静多态——在编译时期产生——又被称为早绑定;代表:函数重载 , 模板。动多态——运行时期的多态——有被称为晚绑定;代表:继承中的多态。为什么c语言没有重载,C++有重载?因为c语言隐藏子类中的成员会隐藏父类中同名的成员。覆盖子类中的成员方法会覆盖父类中相同(同返回值,同函数名,同参数列表)的成员函数。动多态的产生条件:指针或引用调用虚函数, +对象必须完整;完整对象:构造函数执行完毕,析构函数还未开始;动多态的过程:使用指针或引用调用虚函数;

2021-11-12 11:38:07 498

原创 编译链接原理

编译的过程可以分解为四个步骤,分别是预编译、编译、汇编、链接和运行。预编译是将源代码文件如拓展名为.c、.cpp或.cxx预编译成一个.i或.ii的文件。预编译过程主要处理那些源代码中的“#”开始的预编译指令。比如“#include”、“#define”等,主要的处理规则如下:(1)删除#define并进行文本替换(2)处理#if、#endif、#elif(3)递归展开#include(4)删除注释(5)添加行号和文件标识(6)保留#program经过预编译后的.i文件不包含任何宏定义,因为

2021-11-10 17:51:58 122

原创 面向对象I

面向对象三大特性:封装 继承 多态四大特性:抽象 封装 继承 多态this 指针指向本对象的指针。编译时期加上:普通成员方法的第一个参数,默认加上this指针;在普通成员方法内使用到普通成员的地方加上this指针的解引用;在调用成员方法的时候加上参数this指针。构造函数(产生时调用)使用构造函数的目的是,给成员属性进行初始化。浅拷贝:指针直接给指针赋值。(一般不使用浅拷贝)深拷贝:重新申请空间,将数值拷贝过来。当对象进行构造的时候默认调用的成员方法;如果没有实现构造函数,

2021-11-10 17:42:28 56

原创 继承和多态

继承类与类之间的关系:友元组合 成员对象 嵌套——一个类中声明了另一个类一个类是另一个类的一部分;代理——一个类的接口是另一个类接口的子集一个类的功能需要依赖另一个类的功能实现;class Person{public: Person(string name,int age,string sex,string wife=string()) { _name = name; _age = age; _sex = sex; } void eat() { cout &lt

2021-11-10 17:38:06 54

原创 函数调用过程

函数调用过程参数入栈函数栈帧开辟返回值返回函数栈退出寄存器:cpu 中的变量esp:栈顶寄存器ebp:栈顶寄存器

2021-11-08 22:53:57 192

原创 (不带头结点的)单链表逆置

ListNode* NotHeadReverse(LinkList head){ if (head == NULL || head->next == NULL) { return head; } ListNode* pre = NULL, * s = NULL, * p = head; while (p != NULL) { s = p; p = p->next; s->next = pre; pre = s; } return pre;}

2021-10-13 14:21:56 2078

原创 单链表的逆置(带头结点)

单链表逆置方法1 使用三个指针void ReverseList(LinkList head){ assert(head != NULL); if (head->next == NULL || head->next->next == NULL) { return; } ListNode* pre = NULL, *s = NULL; ListNode* p = head->next; while (p != NULL) { s = p; p = p.

2021-10-13 11:54:35 6728 1

原创 顺序表--

#include<stdio.h>#include<iostream>#include<assert.h>#include<vector>#include<map>#include<stack>#include<queue> //C++中本身提供了栈和队列#include<unordered_map>using namespace std;#define TRUE 1#defin

2021-10-10 18:00:49 32

原创 如何编程?

如何实现代码?我们要完成的功能就是一个模块,一个模块就是一个函数。起一个函数名,要见名知意确定函数的形参,就是调用此函数时传递的资源(实参)。确定函数的返回值。在确定函数名称,参数列表,和返回值后开始编写程序。a.首先检查形参的值是否符合要求。b.根据功能(逻辑步骤)。定义相应的变量,指针等等,并且初始值,是程序能到达循环的开始。c.编写循环体。d.当循环体编写完成。进行善后处理程序的编写。(比如边界条件)e.返回值...

2021-10-06 20:15:26 116

原创 C和C++的区别

函数的默认参数定义:在函数声明或定义的时候,给定参数默认值,如果实参传递时候,不给该形参传值,则会按照默认值传参。函数参数的默认值是在编译期生辰指令时候,直接生成入参指令。函数参数的默认值只能传递常量。函数的默认值参数在同一作用域只能复制一次,不能跳过函数的默认值参数是在编译期代入得,所以函数的参数的默认值只在本文件生效。内联函数在release版本,在调用内联函数时候,该函数会在调用点展开——编译时期展开;在debug版本,内联函数和正常函数调用方式一致。由于内联函数在编译展开,编译器无

2021-09-28 17:08:18 54

原创 单链表题目

1.单链表的逆置方法一:一直头插void Reverse(PNode plist){ //assert //保证头结点存在 Node *p = plist->next;//让p指向第一个有效节点的地址(但是这个地址有可能为NULL) Node *q = NULL; plist->next = NULL;//或者调用初始化函数让next变成NULL while(p != NULL) { q = p->next; Insert_head(plist, p->

2021-09-17 18:24:10 77

空空如也

空空如也

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

TA关注的人

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