- 博客(195)
- 资源 (2)
- 问答 (5)
- 收藏
- 关注
原创 设计模式---适配器模式(C++实现)
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。意图将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼
2017-03-15 20:37:53 954
原创 设计模式---原型模式(C++实现)
找了一图:这就很好理解了什么是原型模式?在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这这个定义中,最重要的一个词是“拷贝”,也就是口头上的复制,而这个拷贝,也就是原型模式的精髓所在。为什么要使用原型模式?原型模式和建造者模式、工厂方法模式一样,都属于创建
2017-03-14 20:26:46 669
原创 设计模式---建造者模式(C++实现)
建造者模式(Builder Pattern)使用多个简单的对象一步步构建另一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。意图将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。解决问题主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复
2017-03-14 20:11:40 530
原创 设计模式--单例模式(C++实现)
单例模式也称单件模式、单子模式。意图保证一个类仅有一个实例,并提供一个全局访问点,该实例被所有程序模块共享。单例模式有很多实现方式,在C++中,甚至可以直接用一个全局变量做到这一点,但这样的代码就不是很优雅。使用全局对象能够保证方便地访问实例,但是不能保证只声明一个对象——也就是说除了一个全局实例外,仍然能创建相同类的本地实例。《设计模式》一书中给出了一种很不错的实现,定义
2017-03-14 19:58:45 644 3
原创 设计模式--抽象工厂模式(C++实现)
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。意图提供一个创建一系列相关或相互依赖对象的接口而不需指定他们具体的类。如何解决在一个产品族里面,定义多个产品解决问题解决接口选择的问题优点
2017-03-14 19:40:15 1721 1
原创 设计模式--工厂模式(C++实现)
前面已经对设计模式基础做了简介,没有看的朋友记得往前看看。本篇博客主要讲述工厂模式,以及使用C++实现工厂模式属于创建型模式,是java中最常见的设计模式之一。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。下面我会具体分析工厂模式各个方面。意图定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂,
2017-03-13 21:25:17 691
原创 设计模式--基础简介(了解)
这些都是学习设计模式需要了解的基础,我觉得应该看看,所以就以总结的方式记录下来,对一个阶段学习的总结和验证吧。设计模式设计模式(Design Pattern)代表了最佳实践通常被有经验的面向对象的软件开发所采用。设计模式使软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长长实践的实验和错误中总结出来的。设计模式是一套被反复使用的、
2017-03-13 20:58:57 505
转载 面向对象编程思想---OOP
在了解一些OOP知识后,觉得很有必要看看到底什么是面向对象编程,这篇文章写的很好,认真看下去收获很大,所以就转载了,感谢原创!面向对象的方法论: 来自c++primer第十章面向对象是一种程序设计的概念性方法,面向对象最重要的特征是抽象、封装和数据隐藏、多态、继承、代码的可重用性。下面用一个例子来展示面向过程和面向对象程序设计的差别要编写一个程序用于记录垒球队的统计数据,涉及的
2017-02-26 17:23:35 4284
原创 SQL学习总结以及学习网站
在寒假期间,也趁着大学最后一段美好的学习时间,来了解MSSQL,Oracle,MySQL等热门的的数据库开发语言,感觉很美妙(目前的基础操作部分,挺容易上手的)首先在开始接触SQL Server 时,安装个软件还把人折腾的(以前用的是VS,感觉easy)。当然,安装SQL Server 是从期末考试之后,闲下来慢慢折腾的,也算折腾了一段时间(后来才发现,浪费青春啊)。开始学习SQL的时候也没什
2017-02-23 19:26:16 1779
原创 DateTimePicker中自定义时间或日期显示格式
在DateTimePicker中把Format 选择为Cutstom,然后在CutstomFormat写入格式字符串,介绍如下:例如,若要将日期和时间显示为 06/01/2001 12:00 PM,应将此属性设置为"dd'/'MM'/'yyyy hh':'mm tt";注意'/'在使用自定义格式显示时间之前,必须把 Format 属性必须设置为 DateTimePicker
2017-01-05 11:32:28 8063
原创 C#C#textbox设置滚动条
在学习过程中总会遇到问题,所以记录下来首先,这个问题是我按照下图的方式修改,只能产生垂直滚动条而没有水平滚动条;很好奇为什么没有水平滚动条下面,我也会把 答案放在最后。文本框首先设置的都是 MutilLine为TRUE;原因就是因为:所以,你可以: 1、在属性窗口中把WordWrap改为false ,ScrollBars在按照上面的修改一下 就OK;
2017-01-05 09:48:46 36681
原创 聊天机器人--基础版本
利用C#语言,实现聊天机器人功能(例如:输入“天气:西安”,就能快速查询西安的天气)聊天机器人的基础版本适合刚开始学习C#语言的,我把这些学习的东西记下来,希望自己对知识的记忆更加深刻。Code: static void Main(string[] args) { Console.WriteLine("你好,我是机器人!");
2016-11-13 11:00:26 531
原创 虚继承总结(重点:虚继承与虚函数)
虚继承常考题目:下面我们进行分析:因为每个存在虚函数的类都要有一个4字节的指针指向自己的虚函数表,所以每种情况的类a所占的字节数应该是没有什么问题的。 那么类b的字节数怎么算呢?看“第一种”和“第三种”情况采用的是虚继承,那么这时候就要有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节;还要包括类a的字节数,所以类b的字节数就求出来了。而“第二种”和“第四种
2016-10-05 23:10:54 1006
原创 第一次出现一次的字符
题目:在字符串中找到第一个只出现一次的字符。例如:输入“abcdbbcdd” , 则输出‘a’。思路:最直观的想法就是从头遍历扫描字符串中的每一个 字符。当访问到某一个字符是=时和后面的每一个字符比较,如果没有重复的,那么这个字符就是出现一次的字符。这种思路的时间复杂度O(n2)。今天我们在探讨一种更快的方法。考虑到题目是与次数相关的,那么我们就统计每个字符出现的次数,并且存放下来
2016-10-04 22:59:34 512
原创 最小的k个数
题目:输入n个正整数,找出其中最小的k个数。例如:输入 1 3 5 7 9 8 2 其中 最小的3个数字是 1 2 3思路1:就像前面的快排一样 , 那我们可以找到前k个最小的数字(但是不保证最小数字是有序的)code1:int partation(int* numbers, int length, int begin, int end){ if (begin
2016-10-04 21:47:00 396
原创 数组中出现次数超过一半的数字
题目:数组中有一个数字出现次数超过数组长度的一半,请找出这个数字。例如输入长度为9的数组{1,2,3,2,2,2,5,2,3}。由于数字2在数组中出现了5次,超过数组的一半,因此输出2。思路1:如果我们考虑对数字进行排序,那么排序之后中间的数字一定是出现次数超过数组长度一半的数字。也就是,我们所说的“中位数 ”。考虑到我们并非一定要把整个数组排序完成,受到快速排序的partat
2016-10-04 18:41:46 322
原创 查找二叉树中和为某一个值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树节点中节点值的和为输入整数的所有路径 。从树的根节点往下所经过的节点的形成的路径。思路:先序遍历的方式访问某一个节点时,把该节点添加到路径上,并且累加节点中的值。如果当前节点时叶节点并且累加的值等于输入的值,那么我们就把这条路径打印出来。如果不是叶节点,那么就访问当前节点的左右子树。当前节点的左右子树都访问完了,那么久返回到父节点,(在返
2016-10-03 21:56:25 952
原创 从上到下打印二叉树——层序遍历二叉树
在几次笔试的过程中,都提到了二叉树层序遍历 ,那么我就好好整理下 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入: 8 / \ 6 10 /\ /\ 5 7 9 11输出8 6 10 5 7 9 11。二叉树节点定义:
2016-10-03 20:23:44 924
原创 打印1到最大的n位数
题目:输入数字n,按顺序打印从1到最大的n位十进制数。比如输入3 ,则打印1,2,3 一直到999当然有程序员会很容易想出一个答案:循环数字相乘-->打印仔细分析:如果相乘的数字溢出怎么办?那我们就得另外想办法了。code:void Print_1_To_Max(int n){ if (n <= 0) return; char *number = new
2016-10-03 11:11:21 304
原创 求数值的的整数次方(模拟实现pow函数)
求数值的的整数次方:实现double Power(double base , int exponent),求base的ponent次方。不能使用库函数,同时不考虑大数问题自以为很简单的解法:double Power(double base, int exponent){ double result = 0.0; for (int i = 1; i <= exponent;
2016-10-02 16:55:11 1163
原创 旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾 , 我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如:数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组最小值是1。int Min(int arr[], int len){ if (NULL == arr || len <= 0) throw std::exceptio
2016-10-02 14:50:29 287
原创 函数执行过程(预处理->编译->汇编->链接)
一般高级语言程序编译的过程:预处理、编译、汇编、链接具体过程如图:在Linux环境下,我们进行操作:具体内容 ,读者可以自己试试看
2016-10-01 21:18:16 460
原创 C++ list, vector, map, set 区别与用法比较
基本理解:list封装了链表 , vector封装了数组 , list和vector最大的区别在于vector使用了连续的内存存储的 ,支持[] ; list是以链表的形式实现的,地址不一定连续,不支持[]。vector 对于随机访问的速度很快 ,但是头插元素很慢(因为要搬移数据) ,尾插数据较快(用下标通过[ ]访问);list随机访问很慢(需要遍历链表),但是对于插入就很快了(不
2016-09-28 22:22:25 1587
原创 为什么是三次握手而不是两次握手,为什么是四次挥手
为什么是三次握手?三次握手可以简单看做是客户发送请求,服务器对客户的请求进行确认,客户对服务器的确认再进行确认。如果采用两次握手,假设下面这种情况,客户向服务器发送请求,服务器没有对客户的请求进行确认(因为网络的延迟他可能没有收到这个请求)。客户收不到这个确认于是过一段时间他在向服务器发起连接请求并顺利完成数据传输,但是过了一段时间这个请求到达了服务器而服务器误以为这是一个新的连接
2016-09-21 00:30:56 1744
原创 TCP三次握手四次挥手
TCP报文格式以及分析 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。 (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下: (A
2016-09-21 00:20:58 492
原创 TCP端口号范围及分类
端口号的范围是从1~65535端口的概念: 在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。我们这里将
2016-09-20 23:47:41 66650
原创 1-2+3-4+5...+n各种解法
在书上看到这个提的几种解法 , 前面的一种很简单 , 随着越来越考虑效率问题 , 那么难点就出来了, 希望读者和我一样能有所获。long fn(int num){ if (num <= 0) assert(false); int n = 0; int flag = 1; int i = 1; while (i <= num) { n += flag*i++; flag
2016-09-16 16:49:08 3845
转载 生产者/消费者模式
转载:http://blog.csdn.net/kaiwii/article/details/6758942在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该
2016-09-16 15:40:27 577
原创 Linux下死锁的必要条件及如何避免死锁
死锁产生的原因:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个
2016-09-10 23:58:14 2398
原创 守护进程 & 创建守护进程 & fork一次和fork两次的区别
要知道在创建守护进程的时候fork一次和fork两次两者有什么区别,就要先知道第一次fork和第二次fork都起到了什么作用?(1)调用一次fork的作用:第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用set
2016-09-10 21:24:16 549
原创 Linux进程间通信的几种方式
进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信
2016-09-10 14:45:38 805
转载 Linux命令——crontab命令
一、简介crond是Linux下用来周期性的执行某种任务 或等待某些 时间处理的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。Linux下的系统调度分为两类:系统任务调度和用户任务调度 系统任务调度:系统周期性要执行的工
2016-09-09 23:19:06 555
VS2013一直创建新的项目
2016-08-18
对于二分法查找,right是数组元素的个数
2016-08-05
c++友元函数和inline函数的区别
2016-06-23
c++友元函数和inline函数的区别
2016-06-23
C语言里面的EOF与\n傻傻分不清楚
2016-05-07
TA创建的收藏夹 TA关注的收藏夹
TA关注的人