<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[Debug&nbsp;Life]]></title>
<link>http://blog.pfan.cn/shao</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[opencv编程入门3&nbsp;--图像处理]]></title>
		<link>http://blog.pfan.cn/shao/50151.html</link>
		<description><![CDATA[&nbsp;
图像处理 
&nbsp;
分配与释放图像空间 
&nbsp;


分配图像空间: IplImage* cvCreateImage(CvSize size, int depth, int channels);&nbsp;&nbsp; size:&nbsp;&nbsp; cvSize(width,height);&nbsp;&nbsp; depth: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F&nbsp;&nbsp; channels: 1, 2, 3 or 4. &nbsp;&nbsp;&nbsp;&nbsp; 注意数据为交叉存取.彩色图像的数据编排为b0 g0 r0 b1 g1 r1 ...
举例: // 分配一个单通道字节图像IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); // 分配一个三通道浮点图像IplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
&nbsp;
释放图像空间: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&amp;img);
&nbsp;
复制图像: IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage* img2;img2=cvCloneImage(img1);
&nbsp;
设定/获取兴趣区域: void&nbsp;&nbsp; cvSetImageROI(IplImage* image, CvRect rect);void&nbsp;&nbsp; cvResetImageROI(IplImage* image);vRect cvGetImageROI(const IplImage* image)]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-11-23 13:41:00</pubDate>
		</item>
				<item>
		<title><![CDATA[J2ME&nbsp;Polish学习心得]]></title>
		<link>http://blog.pfan.cn/shao/50006.html</link>
		<description><![CDATA[&nbsp;
最近在学习j2me，但没多久就发现很多头痛的问题，比如不同设备的不同硬件特性，jar和jad的自动打包，debug的困难等等。但后来我发现这个明为j2me plish的项目，发现他简直就是所有j2me编程折梦寐以求的东西，所以介绍给大家。 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j2me polish是德国人的一个开源项目，主页是：http://www.j2mepolish.org/，类似于一个java开发环境的插件。第一篇先介绍一下它的设备优化功能（device optimization）。
比如这种经常遇到的情况，你的midlet需要发出些声音，你知道支持mmapi或midp2.0设备可以用如下方法：
inputstream is = getclass().getresourceasstream("/mymid.mid");
player player = manager.createplayer(is, "audio/midi");
player.realize();
player.start();
&nbsp;&nbsp;&nbsp;&nbsp; 但目前mdip1.0的手机还很多，很多手机有自己的api，比如在nokia ui中，可以这样：
sound a=new sound(400,1000);
a.setgain(100);
a.play(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你要是你的程序在这两种手机上都能用，怎么办呢，难道维护两套源代码？这会非常麻烦的。所以，我就想如果java里有类似c++的编译预处理就好了，可以这样来：
#if 设备支持mmapi 或 midp2.0
//do something here
#elif 设备支持nokia ui
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //do something diference here&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
#endif
然后编译器能自动产生针对不同设备的class文件就好了。这样解决方案可为完美，而j2me polish就可以帮你做到这一]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-11-04 00:58:00</pubDate>
		</item>
				<item>
		<title><![CDATA[J2ME中使用TextField实现表单界面代码实战]]></title>
		<link>http://blog.pfan.cn/shao/49992.html</link>
		<description><![CDATA[&nbsp; J2ME中使用TextField实现表单界面代码实战 收藏 
本例主要借助Form和TextBox显示。
代码如下：
/**&nbsp;* @作者 Jcuckoo&nbsp;* @创建日期 2008-11-18&nbsp;* @版本 V 1.0&nbsp;*/public class TextFieldMIDlet extends MIDlet implements CommandListener{&nbsp;//声名&nbsp;private Display display;&nbsp;&nbsp;private Form myform;&nbsp;private TextField userName;&nbsp;private TextField userPwd;&nbsp;private TextField email;&nbsp;private TextField number;&nbsp;private TextField value;&nbsp;private TextField telnum;&nbsp;&nbsp;private TextBox showMessage;&nbsp;private Command saveCommand;&nbsp;private Command backCommand;&nbsp;private Command exitCommand;&nbsp;&nbsp;public TextFieldMIDlet() {&nbsp; display=Display.getDisplay(this);&nbsp; myform=new Form("TextField实例测试");&nbsp; &nbsp; userName=new TextField("姓名：","",20,TextField.ANY);&nbsp; userPwd=new TextField("密码：","",20,TextField.PASSWORD);&nbsp; email=new TextField("Email：","",20,TextField.EMAILADDR);&nbsp; number=new TextField("数字字符串：","",20,TextField.NUMERIC);&nbsp; value=new Tex]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-11-03 12:12:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[转]&nbsp;J2ME&nbsp;polish使用心得&nbsp;&nbsp;2]]></title>
		<link>http://blog.pfan.cn/shao/49990.html</link>
		<description><![CDATA[J2ME polish使用心得一(介绍j2mepolish) 收藏 1.简介2.特色2.1 预处理(Preprocessing)2.2 手机数据库2.3 高级UI2.4 资源文件2.5 其它　3.安装j2mepolish3.1 下载3.2 安装3.3 运行例子 4.新建第一个工程5.小结
1.简介近来在公司用j2mepolish开发了一个j2me的application，对j2mepolish的使用有所得，在此用这一系列文章记下对j2mepolish的心得，希望与大家共同交流进步。j2mepolish是德国的一个open source，致力于使j2me的开发得更快捷和方便，它的强大之处体现在只需要一套代码就可以兼容尽可能多的手机platform。
2.特色经过使用及介绍，j2mepolish具有以下特色2.1 . 预处理（Preprocessing）j2mepolish使用了一系列预处理指令（Preprocessing Directives），例如在代码中
//#if {test}&nbsp;&nbsp; System.out.println("is test mode");//#else &nbsp;&nbsp; System.out.println("is not test mode");//#endif当在build.xml中执行"ant emulator”时，运行到这段代码的时候就会输出"is test mode"，因为这里{test}的值为true; 直接执行"ant"，{test}值为false，则会输出"is not test mode"（这是因为在build.xml中，target为"emulator"时，把test设为了true，后面有详细解释）在使用这种预处理的方式下，j2mepolish提供了可以兼容各个手机platform的方法，例如如果手机支持MMAPI,我们则播放一段music（不管从网络还是手机本地)
//#if polish.api.mmapiPlayer player = Manager.createPlayer(url);player.realize();player.start();//#endif如果手机不支持MMAPI，则这段不会被包含到jar中，至于j2mepolish如何知道你的手机是否支持MMAPI，取决于：a]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-11-03 00:04:00</pubDate>
		</item>
				<item>
		<title><![CDATA[J2ME&nbsp;polish使用心得]]></title>
		<link>http://blog.pfan.cn/shao/49989.html</link>
		<description><![CDATA[&nbsp;
&nbsp;
1.简介2.特色&nbsp; 2.1 预处理(Preprocessing)&nbsp; 2.2 手机数据库&nbsp; 2.3 高级UI&nbsp; 2.4 资源文件&nbsp; 2.5 其它　3.安装j2mepolish&nbsp; 3.1 下载&nbsp; 3.2 安装&nbsp; 3.3 运行例子&nbsp; 4.新建第一个工程5.小结
1.简介&nbsp; 近来在公司用j2mepolish开发了一个j2me的application，对j2mepolish的使用有所得，在此用这一系列文章记下对j2mepolish的心得，希望与大家共同交流进步。&nbsp; j2mepolish是德国的一个open source，致力于使j2me的开发得更快捷和方便，它的强大之处体现在只需要一套代码就可以兼容尽可能多的手机platform。
2.特色&nbsp; 经过使用及介绍，j2mepolish具有以下特色&nbsp; 2.1 .&nbsp; 预处理（Preprocessing）&nbsp; j2mepolish使用了一系列预处理指令（Preprocessing Directives），例如在代码中
//#if {test}&nbsp;&nbsp; System.out.println("is test mode");//#else &nbsp;&nbsp; System.out.println("is not test mode");//#endif&nbsp;当在build.xml中执行"ant emulator”时，运行到这段代码的时候就会输出"is test mode"，因为这里{test}的值为true; 直接执行"ant"，{test}值为false，则会输出"is not test mode"（这是因为在build.xml中，target为"emulator"时，把test设为了true，后面有详细解释）&nbsp; 在使用这种预处理的方式下，j2mepolish提供了可以兼容各个手机platform的方法，例如如果手机支持MMAPI,我们则播放一段music（不管从网络还是手机本地)
//#if polish.api.mmapiPlayer player = Manager.createPlayer(url);play]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-11-02 23:56:00</pubDate>
		</item>
				<item>
		<title><![CDATA[J2ME&nbsp;--&nbsp;实现短信发送界面]]></title>
		<link>http://blog.pfan.cn/shao/49949.html</link>
		<description><![CDATA[&nbsp;
package Prj7_1;
import java.io.IOException;
import javax.microedition.lcdui.Command;import javax.microedition.lcdui.CommandListener;import javax.microedition.lcdui.Display;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Form;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.ImageItem;import javax.microedition.lcdui.Item;import javax.microedition.lcdui.ItemStateListener;import javax.microedition.lcdui.TextBox;import javax.microedition.lcdui.TextField;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;
public class MessageMIDlet extends MIDlet implements CommandListener, ItemStateListener{&nbsp;&nbsp;private Form welcomeForm = new Form("欢迎使用...");&nbsp;private Display dis;&nbsp;/**************** 欢迎界面&nbsp; ********************/&nbsp;private Command cmdExit = new Command("退出程序",Command.BACK,1);&nbsp;private Command cmdWriteMsg = new Command("写短信",Command.SCREEN,1);&nbsp;ImageItem we]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-30 00:44:00</pubDate>
		</item>
				<item>
		<title><![CDATA[推荐几本学习java的书]]></title>
		<link>http://blog.pfan.cn/shao/49836.html</link>
		<description><![CDATA[&nbsp;
推荐几本学习java的书
 
作者：子晨 发布于：2008年09月28日 12:35 

Thanking in Java(Java 编程思想)Sun JDK 上下
《精通JSP-Web开发技术与典型应用》Eclipse3.2+JDK1.5+Tomcat5.5
一、入门《Java 2从入门到精通》－ 推荐《Thinking in Java》－ 强烈推荐*O’reilly的Java编程基础系列 － 参考*二、进阶《Java Cook Book》－ 非常推荐* （包含了Java编程的Tips，适合当做手册来查阅）《O’reilly-Java IO》－ 推荐* （包含Java IO编程的各个方面）《O’reilly-Database Programming with JDBC》－ 推荐* （JDBC编程）《O’reilly-Java Programming with Oracle JDBC》－ 参考*
三、Java Web编程《O’reilly-Java Server Pages》－ 强烈推荐*《O’reilly-Java Servlet Programming》－ 非常推荐*《O’reilly-Jakarta Struts》－ 推荐* （Java Web编程的一个MVC实现框架Struts的书）
四、EJB编程《J2EE应用与BEA Weblogic Server》－ 强烈推荐《Mastering EJB 2.0》－ 非常推荐*《Enterprise Java Bean》－ 推荐*
五、Java XML编程《O’reilly-Java and XML》－ 推荐*《O’reilly-Java and SOAP》－ 参考* （Java的SOAP编程）
六、设计模式《Core J2EE Patterns》－ 强烈推荐* （J2EE设计模式，设计企业应用软件必备参考书）《EJB Design Patterns》－ 推荐*
七、其它《O’reilly Ant - The Definitive Guide》－ 推荐* （Ant是一种功能非常强大的Java工具）
Note:强烈推荐书籍：建议购买，重点学习非常推荐书籍：建议花时间学习推荐书籍：在学有余力的情况下，建议学习
参考书籍：有兴趣的情况下学习
首先学好j2se，然后学习j2ee或j2]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-26 00:28:00</pubDate>
		</item>
				<item>
		<title><![CDATA[常用查找算法]]></title>
		<link>http://blog.pfan.cn/shao/49748.html</link>
		<description><![CDATA[&nbsp;
//search.h包含了所有的常用查找算法
//使用顺序查找法的查找函数//seqSearch(const int arr[],int first,int last,int target)template &lt;typename T&gt;int seqSearch(const T arr[],int first,int last,const T&amp; target){&nbsp;int i=first;
&nbsp;//扫描下标范围first&lt;=i&lt;last; 测试是否有匹配&nbsp;//或下标超出范围&nbsp;while (!(i==last)&amp;&amp;!(arr[i]==target))&nbsp;&nbsp;i++;
&nbsp;return i;&nbsp;&nbsp;&nbsp; //i是匹配值的下标,或者,如果没有匹配,则i=last}
//模板函数find_last_of()的实现template &lt;typename T&gt;int find_last_of(const T arr[],int first,int last,const T&amp; target){&nbsp;int i=last-1;
&nbsp;//描扫下标范围first&lt;=i&lt;last;测试是否有匹配&nbsp;//或下标超出范围&nbsp;while(i&gt;=first&amp;&amp;target!=arr[i])&nbsp;&nbsp;i--;&nbsp;if (i&lt;first) return last; //没找到,则返回last&nbsp;return i;}
//二分查找算法函数binSearch()的实现template &lt;typename T&gt;int binSearch(const T arr[],int first,int last,const T&amp; target){&nbsp;int mid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //中间点的下标&nbsp;]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-23 13:04:00</pubDate>
		</item>
				<item>
		<title><![CDATA[acm之pku题目分类]]></title>
		<link>http://blog.pfan.cn/shao/49709.html</link>
		<description><![CDATA[&nbsp;
对ACM有兴趣的同学们可以看看DP:&nbsp;1011&nbsp;&nbsp; NTA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单题&nbsp;1013&nbsp;&nbsp; Great Equipment&nbsp;&nbsp;&nbsp;&nbsp; 简单题&nbsp;1024&nbsp;&nbsp; Calendar Game&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单题&nbsp;1027&nbsp;&nbsp; Human Gene Functions&nbsp;&nbsp; 简单题&nbsp;1037&nbsp;&nbsp; Gridland&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单题&nbsp;1052&nbsp;&nbsp; Algernon s Noxious Emissions 简单题&nbsp;1409&nbsp;&nbsp; Communication System&nbsp;&nbsp; 简单题，但是很容易看错~~~&nbsp;1425&nbsp;&nbsp; Crossed Matchings&nbsp;&nbsp; 简单题&nbsp;1438&nbsp;&nbsp; Asteroids!&nbsp;&nbsp; 简单题&nbsp;1459&nbsp;&nbsp; String Distance and Transform Process&nbsp;&nbsp; 简单题&nbsp;1462&nbsp;&nbsp; Team Them Up!&nbsp;&nbsp; 简单题&nbsp;1556&nbsp;&nbsp; Heroes Of Might And Magic&nbsp;&nbsp; 简单题，不过背景蛮有意思的……&nbsp;1520&nbsp;&nbsp; Duty Free Shop&nbsp;&nbsp; 简单题&nbsp;1524&nbsp;&nbsp; Supermarket&nbsp;&nbsp; 简单题&nbsp;130]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-22 23:59:00</pubDate>
		</item>
				<item>
		<title><![CDATA[ACM&nbsp;进阶之路（转）]]></title>
		<link>http://blog.pfan.cn/shao/49707.html</link>
		<description><![CDATA[&nbsp;






一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.ACM主要是考算法的,主要时间是花在思考算法上，不是花在写程序与debug上。
下面给个计划你练练：
第一阶段：练经典常用算法，下面的每个算法给我打上十到二十遍，同时自己精简代码，因为太常用，所以要练到写时不用想，10-15分钟内打完，甚至关掉显示器都可以把程序打出来。
1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集，不好写) 3.大数（高精度）加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘、判线段相交、然后写个凸包. 6.BFS、DFS,同时熟练hash表(要熟，要灵活,代码要简) 7.数学上的有：辗转相除（两行内），线段交点、多角形面积公式. 8. 调用系统的qsort, 技巧很多，慢慢掌握. 9. 任意进制间的转换
第二阶段：练习复杂一点，但也较常用的算法。 如： 1. 二分图匹配（匈牙利），最小路径覆盖 2. 网络流，最小费用流。 3. 线段树. 4. 并查集。 5. 熟悉动态规划的各个典型：LCS、最长递增子串、三角剖分、记忆化dp 6.博弈类算法。博弈树，二进制法等。 7.最大团，最大独立集。 8.判断点在多边形内。 9. 差分约束系统. 10. 双向广度搜索、A*算法，最小耗散优先.===========================================================
ACMer必备知识（任重而道远......）
图论&nbsp;&nbsp; 路径问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/1边权最短路径&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BFS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非负边权最短路径（Dijkstra）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以用Dijkstra解决问题的特征&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 负边]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-22 21:12:00</pubDate>
		</item>
				<item>
		<title><![CDATA[北大poj&nbsp;1166&nbsp;The&nbsp;Clocks解题报告源代码]]></title>
		<link>http://blog.pfan.cn/shao/49706.html</link>
		<description><![CDATA[&nbsp;
&nbsp;
北大poj 1166 The Clocks解题报告源代码
作者：贾晔
The Clocks
9只钟表排成3*3的方阵，每只钟表只能指向上、下、左、右四个位置9种作用方式，每种使一些钟表的指针右转90°使用这9种作用，使得所有钟表都指向正上方 (记为状态0)求使得总作用次数最少的策略
Sample
&nbsp;
Input Data3*3矩阵，元素为0，1，2或3，分别表示钟表指向上，右，下，左
&nbsp;
钟表矩阵的有限性由于矩阵结构及其元素取值范围相当有限，故可能出现的钟表矩阵也是很有限的，即4^9=262144种由此有限性可以考虑搜索解法
广度优先搜索从状态0开始搜索搜索过程：标记可以通过一次作用达到此状态的所有状态为已搜索，然后搜索新标记的状态。搜索过程中保存使用的作用方式每个状态用一个32位整数的低18位表示,可将结果存在长度为262144的数组中
&nbsp;
启发广度优先搜索的可行意味着作用次数的相当有限注意到作用的结果与作用的顺序无关，则显然每种作用最多只需使用3次于是，问题简化为求解同余方程组
同余方程组把钟表和作用分别从1到9标号，则同余方程组可写为[C(i) +∑E(i,j) * M (j)] mod 4= 0 (i=1..9)其中C(i),M(j),E(i,j)分别表示第i个钟表的初始状态，第j种作用的次数，第j种作用是否拨动第i个钟表
写成矩阵的形式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( C + E M ) mod 4 = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*)&nbsp; 我们所求为M的最小非负解M0=M mod 4显然，当k足够大时，方程&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C + E M’ = 4 * k&nbsp;&nbsp; 的解也是 (*) 式的解，故&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-22 19:37:00</pubDate>
		</item>
				<item>
		<title><![CDATA[广度优先搜索]]></title>
		<link>http://blog.pfan.cn/shao/49705.html</link>
		<description><![CDATA[&nbsp;
&nbsp;
广度优先搜索(Breadth-First Search, BFS, 台湾称“横向优先搜寻”)是最简单的图搜索算法之一。广度优先搜索的特点是总是沿已发现与未发现的边界，向外依次扩展。设起始节点为s，则广度优先搜索算法首先会发现与s距离为k的所有结点后，才会发现与s距离为k+1的结点。广度优先搜索在运行过程中将结点标识为三种状态：

白色：未被发现的结点； 
灰色：已被发现，但与其相连的结点尚未全部发现的结点（下一轮进行发现的结点，也是发现结点集的边界）； 
黑色：已被发现，且与之相连的其他结点也已经发现。 
广度优先搜索因为存在单一的起始结点s，因此整个发现过程可以看作是以s为根节点的一棵树，称为广度优先树，广度优先搜索的过程也是建立一棵以s为根的广度优先树的过程。广度优先树中对每个结点u记录三种信息：

π[u]：广度优先树中u的父结点，意味着u第一次被发现时所通过的上一级结点； 
d[u]：u与根节点s的距离，如果是无权图，也是s到u的最短距离； 
color[u]：u结点的颜色。 
设图G = (V, E)，V是顶点集，E是边集。s是起始节点。则广度优先搜索(Breadth-First Search, BFS)算法如下：


view sourceprint?

01.// 初始化整个图（除去起始结点s） 
02.foreach(Vertex u in V[G] - {s}) 
03.{ 
04.&nbsp;&nbsp;&nbsp;&nbsp;u.Color = BFSColor.WHITE; 
05.&nbsp;&nbsp;&nbsp;&nbsp;u.D = int.MaxValue; 
06.&nbsp;&nbsp;&nbsp;&nbsp;u.π = null; 
07.} 
08.&nbsp;&nbsp;
09.// 设置起始结点s 
10.s.Color = BFSColor.GRAY; 
11.s.D = 0; 
12.s.π = null; 
13.&nbsp;&nbsp;
14.// 初始化一个队列 
15.Queue&lt;Vertex&gt; q = new Queue&lt;Vertex&gt;(); 
16.q.Enqueue(s); 
17.wh]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-22 18:44:00</pubDate>
		</item>
				<item>
		<title><![CDATA[深入理解abstract&nbsp;class和interface]]></title>
		<link>http://blog.pfan.cn/shao/49501.html</link>
		<description><![CDATA[&nbsp;
abstract&nbsp;class和interface是Java语言中对于抽象类定义进行支持的两种机制，正是由于这两种机制的存在，才赋予了Java强大的面向对象能力。abstract&nbsp;class和interface之间在对于抽象类定义的支持方面具有很大的相似性，甚至可以相互替换，因此很多开发者在进行抽象类定义时对于abstract&nbsp;class和interface的选择显得比较随意。其实，两者之间还是有很大的区别的，对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析，试图给开发者提供一个在二者之间进行选择的依据。&nbsp; 理解抽象类&nbsp; abstract&nbsp;class和interface在Java语言中都是用来进行抽象类（本文中的抽象类并非从abstract&nbsp;class翻译而来，它表示的是一个抽象体，而abstract&nbsp;class为Java语言中用于定义抽象类的一种方法，请读者注意区分）定义的，那么什么是抽象类，使用抽象类能为我们带来什么好处呢？&nbsp; 在面向对象的概念中，我们知道所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念，是对一系列看上去不同，但是本质上相同的具体概念的抽象。比如：如果我们进行一个图形编辑软件的开发，就会发现问题领域存在着圆、三角形这样一些具体概念，它们是不同的，但是它们又都属于形状这样一个概念，形状这个概念在问题领域是不存在的，它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念，所以用以表征抽象概念的抽象类是不能够实例化的。&nbsp; 在面向对象领域，抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述，但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类，而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。熟悉OCP的读者一定知道，为]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-20 11:10:00</pubDate>
		</item>
				<item>
		<title><![CDATA[sprintf用法解析]]></title>
		<link>http://blog.pfan.cn/shao/49440.html</link>
		<description><![CDATA[&nbsp;
&nbsp;
版权声明：转载时请以超链接形式标明文章原始出处和作者信息及本声明http://fogblog.blogbus.com/logs/1437347.html                         sprintf用法解析

                                    作者  ：晨星

1：

sprintf 最常见的应用之一莫过于把整数打印到字符串中，所以，spritnf
在大多数场合可以替代itoa。
 
这样，一个整数的16 进制字符串就很容易得到，但我们在打印16 进制内容
时，通常想要一种左边补0 的等宽格式，那该怎么做呢？很简单，在表示宽
度的数字前面加个0 就可以了。

sprintf(s, "%08X", 4567); //产生："000011D7"

上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。

这里要注意一个符号扩展的问题：比如，假如我们想打印短整数（short）-1
的内存16 进制表示形式，在Win32 平台上，一个short 型占2 个字节，所
以我们自然希望用4 个16 进制数字来打印它：

short si = -1;

sprintf(s, "%04X", si);

产生“FFFFFFFF”，怎么回事？因为spritnf 是个变参函数，除了前面两个
参数之外，后面的参数都不是类型安全的，函数更没有办法仅仅通过一个
“%X”就能得知当初函数调用前参数压栈时被压进来的到底是个4 字节的整
数还是个2 字节的短整数，所以采取了统一4 字节的处理方式，导致参数压
栈时做了符号扩展，扩展成了32 位的整数-1，打印时4 个位置不够了，就
把32 位整数-1 的8 位16 进制都打印出来了。如果你想看si 的本来面目，
那么就应该让编译器做0 扩展而不是符号扩展（扩展时二进制左边补0 而不
是补符号位）：

sprintf(s, "%04X", (unsigned short)si);

就可以了。或者：

unsigned short si = -1;
sprintf(s, "%04X", si);


2：

浮点数的打印和格式控制是sprintf 的又一大常用功能]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-19 22:23:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Visual&nbsp;C++中的图形特技]]></title>
		<link>http://blog.pfan.cn/shao/49434.html</link>
		<description><![CDATA[&nbsp;
　Visual C++中的图形特技　　 　　Visual C++中的图形特技 随着计算机信息表示及实现的多媒体化，在许多学习软件、游戏软件，以及多媒体课件制作软件中，经常使用各种图形显示技巧，如图形的推拉、交错、雨滴状、百页窗、积木随机堆叠等显示模式。这样使画面变得更为生动活泼，更能吸引用户，也为更好地发挥软件的功能奠定了基础。本文就Visual C++ 6.0中实现图形的各种显示技巧的原理及具体方法做些探讨。 　　基本原理 　　在Visual C++6.0中，显示位图的方法及过程如下: 　　1. 显示程序资源中的位图(位图的所有数据均存在于可执行文件中) 　　(1)从资源中装入位图 　　● 定义位图对象数据成员CBitmap m_Bitmap; 　　● 调用CBitmap成员函数LoadBitmap()，如m_Bitmap.LoadBitmap(IDB_BITMAP1); 　　● 传入LoadBitmap的参数是位图在图形编辑器中生成或从位图文件中引入时赋予的识别符。 　　(2)生成与位图相联系的内存设备情境对象 　　CDC MemDC; 　　MemDC.CreateCompatibleDC(NULL); 　　MemDC.SelectObject(&amp;m_Bitmap); 　　(3)显示位图 　　CClientDC ClientDC(this); 　　BITMAP BM; 　　m_Bitmap.GetObject(sizeof(BM)，&amp;BM); 　　ClientDC.BitBlt 　　( X，Y, //目标设备逻辑横、纵坐标 　　BM.bmWidth, BM.bmHeight, //显示位图的像素宽、高度 　　&amp;MemDC, 　　//待显示位图数据的设备情境对象 　　0，0, //源数据中的横、纵坐标 　　SRCCOPY); //位操作方式 　　这种方法显示位图速度快，但不是很灵活，而且会使可执行文件增大。 　　2. 显示独立文件方式的位图(位图的所有数据独立于可执行文件) 　　HBITMAP *hBitmap; //定义位图对象句柄 　　BITMAP BM; 　　CDC MemDC; 　　CClientDC ClientDC(this); 　　MemDC.CreateCompatibleDC(&amp;ClientDC);]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-19 22:09:00</pubDate>
		</item>
				<item>
		<title><![CDATA[简单绘图]]></title>
		<link>http://blog.pfan.cn/shao/49433.html</link>
		<description><![CDATA[&nbsp;
&nbsp;











---------- 题目1:怎样新建? 创建--&gt; 新建一工程--&gt;MFC AppWizard[exe](注:取名必须遵照Mymfc.即必须为英文且第一个字母必须为大写) 选择Single document后按Finish&lt;--完成 题目2:按下鼠标左键怎样弹出对话框? 在CMyFirstMfcProjectView类(注:仅仅此类才可以显示出弹出的对话框) --&gt;右击选择Add Windows Message handler(可以选择其它不同的消息.如WM_CHAR,WM_PAINT等) MessageBox("您按下了左键VIEW!","窗口标题栏",MB_OK);(注:当达到消息成功后,就会弹出此窗口) 题目3:怎样画一条线? /*****************************************************/ 在CMyFirstMfcProjectView类中添加一个成员变量.变量类型:CPoint(注:点类型).变量名:任意取 定义之后初始化---&gt;打开构造函数CMyFirstMfcProjectView(),添加初始化代码 把所用消息的值赋给它---&gt;打开所要响应的消息机制.把里面的point值赋给它. 起点已找到.终点要新建---&gt;新建一个WM_LButtonUp(注:当鼠标左弹起来时.响应终点) 开始作图(画线)---&gt; (一)API的方法(用全局变量) &nbsp;&nbsp; (1)首先获取HDC(注:所有作图都必须定义1个HDC):用::GetDc(m_hwnd(注:是CWnd的句柄,公开且默认));&nbsp;&nbsp;&nbsp;&nbsp; 注:必须为全局变量 &nbsp;&nbsp; (2)其次获取称动时线的坐标可用MoveTo与MoveToEx,究竟用哪个?用MoveToEx &nbsp;&nbsp;&nbsp;&nbsp; 关于2者区别:MoveTo是Win16 API,MoveToEx是Win32 API.后者是前者的升级. &nbsp;&nbsp;&nbsp;&nbsp; 另外MFC也有个CDC:MoveTo,那个仅是封装了MoveToEx而已 &nbsp;&nbsp; (3)]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-19 21:55:00</pubDate>
		</item>
				<item>
		<title><![CDATA[如何在MFC窗口界面中插入图片？]]></title>
		<link>http://blog.pfan.cn/shao/49389.html</link>
		<description><![CDATA[&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先在资源里边插入位图（给它一个易记得命名），然后到你要插入图片的地方放入一个图片控件，点击它属性，选择刚刚你插入的位图（名字）即可。 &nbsp; &nbsp; 哈哈 &nbsp; &nbsp; 试试吧。]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-18 15:29:00</pubDate>
		</item>
				<item>
		<title><![CDATA[MFC版本的XO小游戏]]></title>
		<link>http://blog.pfan.cn/shao/49179.html</link>
		<description><![CDATA[//MFC_xoDLG.h
&nbsp;
// MFC_xoDlg.h : 头文件//
#pragma once
// CMFC_xoDlg 对话框class CMFC_xoDlg : public CDialog{// 构造public:&nbsp;CMFC_xoDlg(CWnd* pParent = NULL);&nbsp;// 标准构造函数
// 对话框数据&nbsp;enum { IDD = IDD_MFC_XO_DIALOG };
&nbsp;protected:&nbsp;virtual void DoDataExchange(CDataExchange* pDX);&nbsp;// DDX/DDV 支持
// 实现protected:&nbsp;HICON m_hIcon;
&nbsp;// 生成的消息映射函数&nbsp;virtual BOOL OnInitDialog();&nbsp;afx_msg void OnSysCommand(UINT nID, LPARAM lParam);&nbsp;afx_msg void OnPaint();&nbsp;afx_msg HCURSOR OnQueryDragIcon();&nbsp;DECLARE_MESSAGE_MAP()public:&nbsp;afx_msg void OnBnClickedButton1();&nbsp;afx_msg void OnBnClickedButton2();&nbsp;afx_msg void OnBnClickedButton3();&nbsp;afx_msg void OnBnClickedButton4();&nbsp;afx_msg void OnBnClickedButton5();&nbsp;afx_msg void OnBnClickedButton6();&nbsp;afx_msg void OnBnClickedButton7();&nbsp;afx_msg void OnBnClickedButton8();&nbsp;afx_msg void OnBnClickedButton9();&nbsp;// 用来记录当前显示的是X还是O&nbsp;// X的值用0表示，O的值用1表示&nbsp;&nbsp;&nbsp; // pl]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-12 22:20:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Java中的String数据类型]]></title>
		<link>http://blog.pfan.cn/shao/49129.html</link>
		<description><![CDATA[&nbsp;
&nbsp;
&nbsp; Java中的String数据类型
&nbsp;&nbsp; 1. 首先String不属于8种基本数据类型，String是一个对象。 
　　因为对象的默认值是null，所以String的默认值也是null；但它又是一种特殊的对象，有其它对象没有的一些特性。 
　　2. new String()和new String(“”)都是申明一个新的空字符串，是空串不是null； 
　　3. String str=”kvill”； String str=new String (“kvill”);的区别： 
　　在这里，我们不谈堆，也不谈栈，只先简单引入常量池这个简单的概念。 
　　常量池(constant pool)指的是在编译期被确定，并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量，也包括字符串常量。 
　　看例1：
String s0=”kvill”; String s1=”kvill”; String s2=”kv” + “ill”; System.out.println( s0==s1 ); System.out.println( s0==s2 );&nbsp; 
　　结果为：
true true&nbsp; 
　　首先，我们要知道Java会确保一个字符串常量只有一个拷贝。 
　　因为例子中的s0和s1中的”kvill”都是字符串常量，它们在编译期就被确定了，所以s0==s1为true；而”kv”和”ill”也都是字符串常量，当一个字符串由多个字符串常量连接而成时，它自己肯定也是字符串常量，所以s2也同样在编译期就被解析为一个字符串常量，所以s2也是常量池中”kvill”的一个引用。 
　　所以我们得出s0==s1==s2; 
　　用new String() 创建的字符串不是常量，不能在编译期就确定，所以new String() 创建的字符串不放入常量池中，它们有自己的地址空间。 
　　看例2：
String s0=”kvill”; String s1=new String(”kvill”); String s2=”kv” + new String(“ill”); System.out.println( s0==s1 ); System.out.printl]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-11 21:27:00</pubDate>
		</item>
				<item>
		<title><![CDATA[点击一个Button显示设定的信息的函数]]></title>
		<link>http://blog.pfan.cn/shao/49009.html</link>
		<description><![CDATA[&nbsp;
&nbsp;
SetWindowText函数可以实现。
void CMFC_xoDlg::OnBnClickedButton9(){&nbsp;// TODO: 在此添加控件通知处理程序代码&nbsp;CWnd* pWnd = GetDlgItem(IDC_BUTTON9);&nbsp;&nbsp;&nbsp; pWnd-&gt;SetWindowText(_T("X"));}]]></description>
		<author><![CDATA[lingshaohu619]]></author>
		<pubDate>2009-10-08 14:08:00</pubDate>
		</item>
		</channel>
</rss>