代码改变世界

哈夫曼压缩算法

2011-12-26 19:41 by 捣乱小子, 33887 阅读, 17 推荐, 收藏, 编辑
摘要:编程独白 给你40分钟的时间,你可以思考十分钟,然后用三十分钟的时间来写代码,最后浪费在无谓的调试上;你也可以思考半个小时,彻底弄清问题的本质与程序的脉络,然后用十分钟的时间来编写代码,体会代码如行云流水而出的感觉。在编程过程当中,相信大家都深有体会,在调试上浪费时间,问题出现在下笔之前没有一个系统 阅读全文

我的第一个MFC小项目(4)之 位图转换(续)

2011-12-20 20:22 by 捣乱小子, 2332 阅读, 3 推荐, 收藏, 编辑
摘要:非常感谢Imageshop的指正,代码有修改,主要是:计算8位位图像素位使用了更高效的整点运算;去除多余的变量检测。求网友们支招:在32位位图中有Alpha值,在转换成8位灰阶位图的时候可以直接省略吗? 在《我的第一个MFC小项目(3)之 位图转换》中,有关于将24位的彩色位图转换为8位的灰阶位图,发散一下就很容易可以得到32位位图彩图转换为8位的灰阶位图,看图:32位位图多出一个Alpha字节,用来描述图片的透明度,根据这一特性,可以将Alpha特意忽略,然后将紧跟其后的RGB按照《我的第一个MFC小项... 阅读全文

STL swap潜在的危险

2011-12-18 19:48 by 捣乱小子, 5425 阅读, 2 推荐, 收藏, 编辑
摘要:背景:在学习C++编程的时候,都使用过标准库(STL)当中的swap,但更多的是swap(int,int)或 者等等一些基本的类型,发散一下是否也可以用来置换自定义的一个类型,比如说某一class(定义一个class相当于定义一个type了),先不从效率上来考虑,看看可行性如何。ps:欢迎讨论。正文:在STL中的swap大概是这样的实现:template<typename T>void swap(T& a,T& b){T temp(a);a = b;b = temp;} 在里面很清楚先先调用T类型的拷贝构造函数构造一个临时变量temp,然后利用这个中间变量将a和b进 阅读全文

(堆的应用)Huffman赫夫曼树的建立

2011-12-15 09:36 by 捣乱小子, 5304 阅读, 4 推荐, 收藏, 编辑
摘要:日后的纠正最近才发现自己的代码有问题,也是在后来做另一个有关哈夫曼实验的时候才发现,在代码当中有很多时候是用new来建立一个新的节点,就包括从最小堆中取出权重最小的节点(这个没有错误),根据两个权重最小节点得出新的节点和往最小堆中插入这个新的节点。问题出在后两个,因为在中间那一步就对left和right设置了parent(看了我的代码的就该很清楚了),其实如果这样下去是很繁琐的,因为new来new去,赋值来赋值去,非常容易搞混。我测试了一下,会把一部分孩子(left或者right)的parent指针搞错,所以今天2011-12-17我更新了Huffman哈夫曼代码。另外值得一提的是,网络上我看 阅读全文

C++对析构函数的误解

2011-12-09 11:56 by 捣乱小子, 15066 阅读, 12 推荐, 收藏, 编辑
摘要:C++析构前言 析构函数在什么时候会自动被调用,在什么时候需要手动来调用,真不好意思说偶学过C++…今日特此拨乱反正。 C++析构误解正文 对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化或者赋值;一个良好的class需要有资源回收的机制,而这一操作便落在了析构函数的头上,析构函数来负责类内的资源的free。来看一段代码: class myclass{ public: ... 阅读全文

我的第一个MFC小项目(3)之 位图转换

2011-12-08 16:20 by 捣乱小子, 3457 阅读, 2 推荐, 收藏, 编辑
摘要:关于位图的格式,文件头,信息头,颜色表,像素位等等,我在以前在《我的第一个MFC小项目(2)》有过简单的介绍,当时还操VISIO自己画图呢,不过当时真的非常非常的模糊,甚至还没有灰度图和彩图的概念。没有捧着一本书认真研究,纯粹是完成项目过程当中遇到什么不懂的就直接google...欢迎拍砖,欢迎讨论。8位位图除了可以索引彩色图像外,也可以是灰阶图像,相信更多的是用于灰度的图像,既然有8位的灰阶图像,也就是说从白到黑分成256种渐变,那16位灰阶图像也是存在的,只不过从白到黑分成2^16种渐变;但这是一种很大的浪费我觉得,因为灰阶图像应用不是非常广,在一些专业领域或许会用到。而如今PC下的更多的 阅读全文

C++虚函数和纯虚函数(2)

2011-12-04 16:16 by 捣乱小子, 3819 阅读, 3 推荐, 收藏, 编辑
摘要:书接上文......本来只想看看书就过了,但是最近在看《设计模式》和《effective C++》这两本书,其中将到很多关于C++中封装,继承和多态的思想,所以不得不做一些笔记。关于虚函数,在多态当中,一定要将基类的析构函数设置为虚函数并将其实现,只有这样,才能够达到按对象构造的逆序来析构对象;否则,析构的时候,只会析构基类的那一部分,那么派生类那一部分就无法成功析构了。class shape{public: shape(){}; virtual void draw() = 0; virtual ~shape(){cout draw(); delete s; s ... 阅读全文

C++虚函数和纯虚函数(1)

2011-12-04 13:16 by 捣乱小子, 13931 阅读, 6 推荐, 收藏, 编辑
摘要:§写在前面的学习过C++类的继承与多态的时候,但是很多的童鞋回过头来都忘记之中关于虚函数和纯虚函数的细节,甚至将他们混淆。§虚函数虚函数是动态多态性的基础,其调用的方式是动态联编(又称晚期联编,简单解释为只有在程序运行时才决定调用基类的还是子类的,系统会根据基类指针所指向的对象来决定要调用的函数);... 阅读全文

C++静态数据成员和静态成员函数

2011-12-03 13:35 by 捣乱小子, 965 阅读, 1 推荐, 收藏, 编辑
摘要:在C++面向对象编程过程当中,对象与对象之间的数据不是共享,在设计类的时候,有时候需要一些对象之间共享的数据,除了把所要共享的数据设置为全局数据或者函数之外,还可以利用C++的静态机制。1、静态数据成员class 类名 { …… static 类型说明符 成员名; …… };静态数据成员是所有对象共享的,其所占的内存空间不会因为某个对象的产生而分配,也不会因为对象的销毁而消失。跟类中其他的非静态数据成员一样,被定义为private时,不能被外界访问。但是可以被类内任意访问权限的函数访问。关于静态数据成员的初始化:非静态成员可以在构造函数当中初始化,但是static不能在构造... 阅读全文

我的第一个MFC小项目(2)之 初涉位图

2011-11-23 18:24 by 捣乱小子, 1052 阅读, 0 推荐, 收藏, 编辑
摘要:BitmapSize=bmp.bmWidthBytes*bmp.bmHeight; 在这一次实验当中,涉及到了比较多的BMP图片的学习,包括基本的组成和操作(放大缩小等)。下面是DIB的文件格式:这就是BMP图片的组成,可以当成是他的数据结构,这里面就存放了显示图片需要的数据。结构体内的数据比较复杂,但是在这里讲几点。offsetbit 为文件头到像素为的位移;imagesize为像素位的大小;size为整个DIB文件的大小。文件头当中,offsetbit 的计算其实很简单,就是文件头和信息头的大小加起来(当然默认是24位的位图),但是因为他们是固定大小的的所以比较简单。imagesize计算 阅读全文

我的第一个MFC小项目(1)之 初来咋到

2011-11-18 23:46 by 捣乱小子, 1953 阅读, 0 推荐, 收藏, 编辑
摘要:虽然是小项目,但是还是有点挑战性的,因为从来没有做过一个比较正式的项目;之前在编程过程当中,都是比较粗糙,想到什么就写什么,在没有一个系统的架构前提之下,虽可谓倚马可待,但bug很多,多到自己想法都没有了,最后不得不丢下个“四不像”的一堆代码。找个借口原谅自己就是自觉阅读之前写下的代码,然后认真总结和分析,谈谈自己的收获。其实也没什么,就一个处理图像的东西,很多的东西已经被sdk封装了,其实你能使用sdk到游刃有余的地步,那也是一种强的表现了,别被别人的闲言冷语冷落到“认为sdk没出息”。重要的不是你学会了sdk什么的,重要的是你在完成一个任务的过程当中的收获,more or less。 功能 阅读全文

MFC按钮CXPButton类,代码阅读起来还是挺不错的

2011-11-16 13:06 by 捣乱小子, 2078 阅读, 0 推荐, 收藏, 编辑
摘要:在操手MFC的时候,经常会抱怨MFC界面不如其他的框架或语言,比如VB,C#等等,面对MS在系统上的不断更新换代,我们也越来越追求软件的视觉效果,譬如我们会更喜欢win7下的玻璃效果,看起来很炫。在接触MFC的时候,实在忍不住对MFC的bulider的仰慕之情,因为他把之前的win32 c编程(注意,里面没有面向对象)和C++有机的结合起来了(这时OO跑进来了),让我们更多的专注于软件的功能设计方面,减少了程序繁杂(真心真诚的佩服win32走过来的那些来程序员们)。每天都有新的收获,当然不仅仅是软件方面的,因为最近讲师在教我们设计自己的U,其实这个看起来还是蛮有难度的,实际上也很有难度,但是讲 阅读全文

MFC中托盘(TRAYICON)实现

2011-11-12 20:42 by 捣乱小子, 3416 阅读, 0 推荐, 收藏, 编辑
摘要:写在最前面的将MFC中托盘功能模块抽象成一个类,把整个程序的功能模块细分了。这个想法在网上已经是俯拾即是了,但仍旧不能一下子明白其中的东西,特别是将其抽象之后。 在使用这个类的时候,需要注意:托盘菜单的ID要和图标资源的ID一样,否则会出错。具体实现代码添加新的类,选择父类是CCmdTarget,下面的代码中有足够的提醒:TrayIcon.h#pragmaonce//TrayIcon.h:头文件////继承自CCmdTarget才能接收消息,详见《深入浅出MFC》classCTrayIcon:publicCCmdTarget{DECLARE_DYNAMIC(CTrayIcon)public:C 阅读全文

基于顺序表哈夫曼树

2011-11-12 10:59 by 捣乱小子, 2408 阅读, 0 推荐, 收藏, 编辑
摘要:基于顺序表创建赫夫曼树说明:赫夫曼树在信息传输上有很多的用途,刚刚学习二叉树,就遇上了赫夫曼,在学习算法的时候学到了不少的的东西。代码实现: 1//哈弗曼节点数据结构2structHuffmanNode//数据结构的设计是本赫夫曼的一大败笔,我居然用了里面的很多东西我居然用了指针。3{4intweight;5chardata;6HuffmanNode*leftChild,*rightChild,*parent;7HuffmanNode():leftChild(NULL),rightChild(NULL),parent(NULL){}8HuffmanNode(intelem,HuffmanNod 阅读全文

对《VC中添加WM_DEVICECHANGE消息(经典)》的补充

2011-10-31 20:12 by 捣乱小子, 3198 阅读, 0 推荐, 收藏, 编辑
摘要:笔者在VC中添加WM_DEVICECHANGE消息(经典)中就做了关于消息WM_DEVICECHANGE的笔记,是酷狗的将歌曲发送至移动设备让我有感而发,其实在win下的右键菜单功能就已经有了这个功能。但是知道了有新的设备是完全不够的,为了能够达到更加客观的效果,至少让用户知道这个盘符(A,B,C,…)和其卷标。(相信通过盘符我们以后又可以对文件进行操作,到时一头雾水之时,兴许可以在此处找到答案)一开始便把头埋进msdn的瀚海里,准把我淹死,所以学习计算机的童鞋们要好好提高英语的水平,绝对没有害处。入主题。同样是在处理WM_DEVICECHANGE的函数内,现在知道了,DWORD dwData 阅读全文