
C++ 语言进阶使用
文章平均质量分 79
自己学习中遇到的一些疑问和问题的解决
NK_test
大部分人愿意做任何事来逃避真正的思考
展开
-
Effective C++ 简要条款分析(一)
Effective C++ 简要条款分析(一)c++实在是一门深奥晦涩的语言,不同专业水准的程序员写出来的代码质量有着天壤之别,以至于必须出版一本图书提供一些“专家经验”来引导c++程序员写出更加高质量的代码。《Effective C++》就是这样一本书。建议你在有一定的代码积累后阅读这本书,这里我总结一些我读完有感触的条款,和大家一起分析。 为驳回编译器(暗自)提供的机能,可将相应的成员函数声原创 2016-10-01 22:57:44 · 1463 阅读 · 0 评论 -
编译原理:LL(1)文法 语法分析器(预测分析表法)
设计要求:对于任意输入的一个LL(1)文法,构造其预测分析表,并对指定输入串分析其是否为该文法的句子。思路:首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再根据FIRST和FOLLOW集合构造出预测分析表,并对指定的句子打印出分析栈的分析过程,判断是否为该文法的句子。指定文法://文法E->TKK->+TKK->$T->FMM->*FMM原创 2016-05-22 20:54:31 · 82961 阅读 · 34 评论 -
C++ 捕获本机网卡的IP包并对其解析的实现
编程要求:捕获本机网卡的IP包,对捕获的IP包进行解析。要求必须输出以下字段:版本号、总长度、标志位、片偏移、协议、源地址和目的地址。TCP/IP协议定义了一个在因特网上传输的包,称为IP数据报(IP Datagram).这是一个与硬件无关的虚拟包,由首部和数据两部分组成.首部的前一部分是固定长度,共 20 字节,是所有IP数据报必须具有的.在首部的固定部分的后面是一些可选字段,其长度原创 2016-05-08 21:54:19 · 23988 阅读 · 31 评论 -
编译原理:C语言词法分析器
编译原理的实验:完成对C++语言的词法分析先说一下整体框架:基类:Base 封装了一些基础的字符判断函数,如下:int charkind(char c);//判断字符类型 int spaces(char c); //当前空格是否可以消除 int characters(char c);//是否是字母 int keyword(char str[]);//是否是关键字 in原创 2016-04-25 22:09:57 · 17725 阅读 · 0 评论 -
连接两个链表的实现
题目:有以ha为头结点的链表,元素个数为m;以hb为头结点的链表,元素个数为n。现在需要你把这两个链表连接起来,并使时间复杂度最小,请分析并实现。思路:很简单的链表操作的题目,逆序头部插入,并将长度较长的一方接到较短的后面,时间复杂度为O(min(m,n))。#include #include #include using namespace std;typedef int原创 2016-04-04 15:38:59 · 8947 阅读 · 0 评论 -
详解Boost库智能指针(shared_ptr && scoped_ptr && weak_ptr )
我们先来解释一下什么叫智能指针?智能指针是利用RAII(在对象的构造函数中执行资源的获取(指针的初始化),在析构函数中释放(delete 指针):这种技法把它称之为RAII(Resource Acquisition Is Initialization:资源获取即初始化))来管理资源。其本质思想是:将堆对象的生存期用栈对象(智能指针)来管理。也就是当new一个堆对象的时候,立刻用智能指针来接原创 2016-01-30 10:53:48 · 4092 阅读 · 1 评论 -
单片机远程控制步进电机、LED灯和蜂鸣器
通过采用C#语言实现的上位机控制单片机的步进电机模块、LED灯和蜂鸣器模块,使步进电机进行正、反转和停止并控制转速;LED灯模块进行有选择的呼吸式表达;蜂鸣器模块的开始和终止。上位机通过串口和自定义的通信协议(8字节)控制单片机的步进电机、LED灯和蜂鸣器模块。其中在控制步进电机的过程中,为了使操作能够及时响应,使用了INT0中断来进行及时性速度响应;LED灯使用位运算控制灯的闪烁位置,合原创 2016-01-09 10:08:06 · 6220 阅读 · 1 评论 -
单片机: 基于SIM900A的温度报警通信系统
帮室友做的一个简单的单片机实验: 使用热敏电阻测温,当温度超过34摄氏度之后就会向指定手机拨打报警电话。硬件要求: STC89C52单片机,SIM900A GSM模块,价格都在60元左右;另外还需要3根杜邦线,一个SIM卡(移动/联通)仔细查看用户手册,按照下图连线:另外我们使用TTL电平,注意以下问题:好了,硬件连接完毕。单片机的代码没啥好说的,以前做原创 2016-01-04 20:47:58 · 6753 阅读 · 4 评论 -
C++ 大数版的加减乘除代码实现总结
1)大正整数的加法具体思路就是模仿手算的加法,我在这里先将输入的字符串reverse便于操作,最后去掉结果的前置0即可。注意:如果答案就是0,那么需要特殊处理。大量的测试数据可以 上交至hdu 1002[cpp] view plaincopy#include #include #include using n原创 2015-10-05 10:39:12 · 15120 阅读 · 1 评论 -
操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)
实现动态分区的分配算法。(1) 最佳适配算法:选择内存空闲块中最适合进程大小的块分配。(2) 邻近适配算法:从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程。模拟添加进程的时候,假定内存是一块完整的空闲区,对于算法(1)来说,分配的时候遍历所有的空闲内存块,找出其中最适合的一块,注意此时内存分区的总块数可能已经发生了变化;对于算法(2)来说,则需原创 2015-12-27 19:42:27 · 7994 阅读 · 2 评论 -
单片机: 简易计算器的实现(键盘)
利用矩阵键盘实现一个简易的计算器。为了简化问题,我们假设只支持小于100的非负整数之间的加、减、乘的运算,并且支持连续运算(结果的数值可以再进行运算)。本程序中C为加号,D为减号,E为乘号,F为等于号。代码中有详细的注释。/* 注:本程序 C 为+, D 为- E为* F 为=号,支持非负整数连续运算。输入的数值小于100,运算结果不超过1000.by Tach----原创 2015-12-27 19:51:18 · 20033 阅读 · 13 评论 -
操作系统: 二级目录文件系统的实现(c/c++语言)
操作系统的一个课程设计,实现一个二级目录文件系统。用disk.txt模拟磁盘,使用Help查看支持的命令及其操作方式,root为超级用户(写在disk.txt中)文件的逻辑结构:流式文件。物理结构:链接文件。物理空间管理:空闲链法。目录结构:二级目录结构。目录搜索技术:线性搜索。FCB:含文件相关的全部属性。 物理盘块的设计(disk.txt)以一个文本文件d原创 2015-12-23 19:20:39 · 19327 阅读 · 2 评论 -
单片机: EEPROM和串口通信
名称:IIC协议 EEPROM24c02 通过串口通信存数读取数据 内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一个数据,然后在内存中改变这些数据, 掉电后主内存将失去这些信息,然后从24c02中调入这些数据。看是否与写入的相同。电脑通过串口发送一个十六进制的数据到单片机,存储进24c02,要求断电重启后在数码管上显示上一次发送的数据。(本例是1us机器周期,原创 2015-12-22 20:18:07 · 4700 阅读 · 1 评论 -
单片机: 热敏电阻测温并且显示到数码管(温度计)
如上图所示,PCF8591的9脚和10脚,一个是数据线SDA,一个是时钟线SCL。分别接到单片机的P2.0 , P2.1上面。为什么选这两个引脚?因为51单片机上没有IIC总线接口,需要用普通的IO模拟,所以它随便选了两个IO接上就行。VREF是什么?基准电压,也是它能测量的最大电压。如何控制?今天先不说IIC总线,只说控制流程。看器件手册可以知道:原创 2015-12-21 22:56:07 · 18615 阅读 · 1 评论 -
微机接口双色点阵-- 变化的表情动画
使用汇编语言通过双色点阵实现一个动画,这里是表情的变化。基本思路就是分别编写不同的帧,然后依次显示。 颜色的变化是 290h:黄色 288h: 红色。data segmentbuff1 db 00h,00h,00h,18h,18h,00h,00h,00h db 00h,00h,18h,24h,24h,18h,00h,00h db原创 2015-12-19 16:03:33 · 2922 阅读 · 0 评论 -
操作系统: 银行家算法的分析和代码实现(c++语言)
银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银原创 2015-12-11 23:00:30 · 14251 阅读 · 2 评论 -
单片机: 自定义串口通信协议的实现
使用51单片机完成一个简单的串口通信协议。要求:一个协议帧为8个字节,其中头部两个字节,分别是0xFF,0xFE;第3个字节代表第一个数据,第4个字节代表第二个数据(均为正数);第5个字节如果是0,代表两个数据的和,1的话代表两个数据的差;第6个字节为0,代表使用十进制显示,为1代表十六进制显示;最后两个字节代表协议尾部,值分别为0xFD,0xFC。将传输的两个原创 2015-12-09 20:20:24 · 16307 阅读 · 0 评论 -
C#随机数生成器(支持数字跳变)
今天同学说在准备一个晚会,有进行随机号码抽奖的环节,想让我做一个随机号码生成器,最好是那种开始之后数字进行跳变,按键后暂停。这玩意没啥技术含量,搁在c++里面也就是一个random的事,我总不能给人家一个控制台程序把。于是就用C#写了一个。写的时候遇到一个小问题,就是显示需要稍微的延迟,想用C#里面的Tread.Sleep()函数,但是发现界面程序卡住不动了,会造成线程阻塞。采用如下方原创 2015-11-30 13:53:50 · 4765 阅读 · 2 评论 -
单片机:c语言实现秒表计数(按键开始,结束,重置)
实现秒表计数功能,使用定时器和外部中断实现。8号按键代表计时开始/结束,C号按键代表重置为0,为了演示方便,这里上限定为15秒。代码中有详细的注释:#include sbit WEI=P2^7;sbit DUAN=P2^6;sbit L1=P3^4;unsigned char code dofly_DuanMa[11]={0x3f,0x06,0x5b,0x4f,0x66,0x原创 2015-11-27 13:20:02 · 21718 阅读 · 8 评论 -
单片机:按键(使用中断)控制数码管的数字加减(c语言实现)
本实验的目的:使用中断实现通过编号为8和C的按键控制数码管数字的加减,加至15之后再循环到0,减到0之后保持0不变。代码中有详细的注释:#include sbit WEI=P2^7;sbit DUAN=P2^6;void delay(int t){ while(t--);}unsigned char code dofly_DuanMa[10]={0x3f,0x原创 2015-11-25 22:31:55 · 29271 阅读 · 3 评论 -
教你快速在c#中调用C++代码(函数)
之前写过一段C++的代码,想给他用C#写个界面,也就是想让这段代码在C#中可以运行。看了百度的很多方法,都说是封装成dll调用,但是按照步骤来总会出现各种错误,像以下的这种:并且迟迟不能解决,今天竟然有人跟我说直接把dll提取到C#工程的bin文件下就可以了,三观都毁了....尝试了一下,真的成功了,在这里把具体步骤和大家说一下,避免在这种问题上浪费大量的时间。首先,我们随便建立一原创 2015-11-11 19:30:38 · 14834 阅读 · 2 评论 -
C++ Primer 学习笔记与思考_11 try..catch语句及相关疑点
在一个小的程序中,可以用比较简单的方法处理异常,例如用if语句判别除数是否为0,如果是0,则输出一个出错信息。但是在一个大的系统中,包含很多模块,每个模块又包含许多类和函数,函数之间又互相调用,比较复杂。如果在每一个函数中都设置处理异常的程序段,会使程序过于庞大和复杂。因此c++采用的办法是:如果在执行一个函数过程中出现异常,可以不在本函数中立即处理,而是发出一个信息,传给他的上一级(即调用他的函原创 2015-09-29 22:26:04 · 1324 阅读 · 0 评论 -
C++ Primer 学习笔记与思考_10 类型转换易错处大总结
(一)隐式转换先来看一组样例:int ival=0;ival=3.451+3;首先做加法操作,操作数分别为int和double类型,c++并没有直接把两个数加在一起,而是提供了一组转换规则,以便在执行算术操作之前,将两个操作数转换为同一种数据类型。在这里是自动执行的,所以他们被成为隐式转换。因为 C++定义了算术类型之间的内置转换以尽可能防止精度损失,所以这里3转换为doub原创 2015-08-31 10:56:49 · 1580 阅读 · 1 评论 -
C++ Primer 学习笔记与思考_9 表达式中过的那些容易忽略的地方
(一)移位操作符用于IO输入输出标准库分别重载了位操作符>>和cout将其执行为:( (cout在这个语句中个,操作数”hi”和第一个移位操作符具有中等优先级:其优先级比算术操作符低,但是比关系运算符、赋值运算符和条件操作符优先级高。若IP表达式的操作数包含了比IO操作符优先级低的操作符,相关的优先级将影响书写该表达式的方式。这种情况下,使用圆括号强制实现右集结合。原创 2015-08-27 21:33:32 · 1289 阅读 · 0 评论 -
C++ Primer 学习笔记与思考_8 指针和const的那些麻烦
(一)数组的下标和指针的关系我们以前知道,在表达式中使用数组名时,实际使用的是指向数组第一个元素的指针。当我们使用下标访问数组时,实际上是对指向数组元素的指针做下标操作,只要数组指向数组元素,就可以对它进行下标操作。像下面程序中的p[-1]这种表示方法,可能乍一看比较别扭,但是就像我们平常用的,数组名就可以看作是指向首元素地址的指针,后面[]内的只是偏移量,这样理解的话,哪怕是负值我们也很原创 2015-08-22 18:34:17 · 1531 阅读 · 0 评论 -
C++ Primer 学习笔记与思考_7 void和void*指针的用法
(一)void的含义void的字面意思是“无类型”,void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a;这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。void真正发挥的作用在于:(1) 对函数返回的限定;(2) 对函数原创 2015-08-18 10:21:09 · 2181 阅读 · 0 评论 -
C++ Primer 学习笔记与思考_6 数组和动态数组易错点解读
1. 数组的定义数组定义中的类型名可以是内置数据类型或者类类型;除了引用之外,数组元素的类型还可以是任意的复合类型。另外,非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。#include #include #include #include using namespace std;int main(){ const int MAXN1 =原创 2015-08-16 13:08:00 · 1524 阅读 · 0 评论 -
C++ Primer 学习笔记与思考_5 bitset你用的正确吗?
bitset类型比整型值上的低级位操作更容易使用,简化了位集的处理。在定义bitset时,要明确bitset含有的位数,在尖括号内给出它的长度值。注意位集合的编号从0开始,低位存低阶位。最重要的一个问题:bitset的下标是从右边开始的!!!!很多人的博客都写错了,希望引起大家注意。1.使用unsigned long值初始化bitset对象 若bitset类型长度大于uns原创 2015-08-15 10:20:32 · 2094 阅读 · 1 评论 -
C++ Primer 学习笔记与思考_4 ---getline&&size_type&&const_iterator混搭
(一)getline的用法 我们在使用string读入字符串的时候,其输入操作符:* 读取并忽略开头所有空白字符(如空格,换行符,制表符)* 读取字符直至再次遇到空白字符,读取终止。所以如果我们输入“hello world”,string将只输出hello。为了解决这个问题,我们引入getline函数,它接受两个参数:一个输入流对象和一个string对象,但是getlin原创 2015-08-14 10:45:47 · 1585 阅读 · 0 评论 -
C++ Primer 学习笔记与思考_3 ---头文件那些事儿(extern)
(一)extern在头文件中的用法因为头文件包含在多个源文件中,并且变量的定义只能出现一次,所以在头文件中, 只可以声明不可以出现定义。我们可以在头文件中用extern声明全局变量,这样在包含此头文件的cpp 中可直接使用 声明过的这个全局变量(如以下程序中的变量a)。但是有三个例外:1.头文件中可以定义类2.值在编译时就已经知道的const对象3.可以定义inline函数原创 2015-08-13 12:35:15 · 1598 阅读 · 0 评论 -
C++学习笔记与思考_2 --const限定符及其引用,typedef符号
1. 定义const对象因为常量在定义后就不能被修改,所以在定义时必须进行初始化。const int bufSize=512;const int i; // error; i is uninitialized const2. const 对象默认为文件中的局部变量我们知道,如果我们在一个文件中定义了一个非const变量,如果我们想在另一个文件中使用这个变量,只需要在使用前添加原创 2015-08-10 10:41:34 · 1444 阅读 · 0 评论 -
C++ Primer学习笔记与思考_1----变量和基本类型
C++ Primer学习笔记与思考_1----变量和基本类型 类型有什么作用?类型告诉我们数据代表什么意思以及可以对数据执行哪些操作。一:基本内置类型 C++标准规定了每个算术类型的最小存储空间,但是它并不阻止编译器使用更大的存储空间。对于int,几乎所有的编译器使用的存储空间都比所要求的大。字符类型有两种char和wchar_t,其中wchar_t用原创 2015-07-16 17:18:51 · 1414 阅读 · 0 评论