﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-More than C++-随笔分类-details</title><link>http://www.cppblog.com/Lee/category/7131.html</link><description>Beyond  C++</description><language>zh-cn</language><lastBuildDate>Mon, 01 Mar 2010 09:36:04 GMT</lastBuildDate><pubDate>Mon, 01 Mar 2010 09:36:04 GMT</pubDate><ttl>60</ttl><item><title>站姿和坐姿判断人</title><link>http://www.cppblog.com/Lee/archive/2010/03/01/108658.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Mon, 01 Mar 2010 06:00:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2010/03/01/108658.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/108658.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2010/03/01/108658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/108658.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/108658.html</trackback:ping><description><![CDATA[
		<font size="2">每个人都有自己习惯的站立姿势。美国夏威夷大学心理学家指出，不同的站姿可以显示出一个人的性格特征。 <br /><br />站立时习惯把双手插入裤袋的人：城府较深，不轻易向人表露内心的情绪。性格偏于保守、内向。凡事步步为营，警觉性极高，不肯轻信别人。 <br /><br />站立时常把双手置于臀部的人：自主心强，处事认真而绝不轻率，具有驾驭一切的能力。他们最大的缺点是主观，性格表现固执、顽固。 <br /><br />站立时喜欢把双手叠放于胸前的人：这种人性格坚强，不屈不挠，不轻易向困境压力低头。但是由于过分重视个人利益，与人交往经常摆出一副自我保护的防范姿态，拒人于千里之外，令人难以接近。 <br /><br />站立时将双手握置于背后的人：性格特点是奉公守法，尊重权威，极富责任感，不过有时情绪不稳定，往往令人莫测高深，最大的优点是富于耐性，而且能够接受新思想和新观点。 <br /><br />站立时习惯把一只手插入裤袋，另一只手放在身旁的人：性格复杂多变，有时会极易与人相处，推心置腹。有时则冷若冰霜，对人处处提防，为自己筑起一道防护网。 <br /><br />站立时两手双握置于胸前的人：其性格表现为成竹在胸，对自己的所作所为充满成功感，虽然不至于睥睨一切，但却踌躇满志，信心十足。 <br /><br />站立时双脚合并，双手垂置身旁的人：性格特点诚实可靠，循规蹈矩而且生性坚毅，不会向任何困难屈服低头。 <br /><br />站立时不能静立，不断改变站立姿态的人：性格急躁，暴烈，身心经常处于紧张的状态，而且不断改变自己的思想观念。在生活方面喜欢接受新的挑战，是一个典型的行动主义者。 <br /></font>
		<p>
				<font size="2">       在电车或是普通座椅上，常将左脚跨在右脚之上者，通常均是患有脑溢血的人，而且他们的脸色较常人要红，这是由于右脚的关节不能自由活动而导致的现象，由于右脚有毛病，很难将其置放在左脚之上所造成的后果。 <br /><br />通常，不论哪只脚在上，大凡摆在上面的那只脚易于疲劳。当脚部出现疲劳现象时，可做脚腕部位的上下运动及扇形运动，促使毛细管扩张，促进血液循环，将会大大有益于缓解病症。 <br /><br />坐稳后两腿张开姿态懒散者，一般的说来都比较胖。这种人由于腿部的肉过多，行走不十分方便，说得比较多而做得相对要少。这类人属于豪言壮语型，头脑中想的事情经常是被夸大了的。 <br /><br />坐下时左肩上耸，膝部紧靠，致使双腿呈X字形的人，一般均比较谨慎，但他的决断力特差，也缺少男子汉的气魄。即使是一个男性，他也是比较女性化的男性。如果你对他有过多希望的话，其结果多为失望。 <br /><br />坐下手臂曲起，两脚向外伸的人，其决断力十分迟钝。每天他都在不断地计划些事物，但却什么也实现不了。这种人的理想与行动非常不协调，喜欢做白日梦。如果与此类人共事，相信一年中会出现不间断的纠纷。 <br /><br />坐下时两脚自然外伸，给人以一种十分沉着冷静印象的人，属直情径行类型。这些人大都身体健康，对疾病的抵抗力很强。就命运而言，他也是非常幸运的。 <br /><br />坐下时，一只手撑着下巴，另一只手搭在撑着下巴的那只手的手肘之上，且架着“二郎腿”的人，大都不拘小节，面对失败亦能泰然自若。不过，如果你被这种人迷惑住，他会厚颜无耻地去逃避责任，甚至对你使出各种利己而卑鄙的手段。 <br /><br />双肩端起，一脚架放在另一只脚之上作出庄重堂皇之态的人，虽然志向远大，但却缺乏具体计划，致使他的志向如空中楼阁一般，无法实现。 <br /><br />坐在车上两脚长伸在外，妨碍通道，同时将双手插在口袋里的人，大多是贫困潦倒之人。如果其相貌长得不好，通常伴有恐吓或胁迫他人的行为。对这种人，最好采取敬而远之的态度。 <br /><br />两脚弯曲，两手架在桌上伏身看书的人，容易患甲状腺异常及筋肿等疾病。如果是近视眼的人，他也可能会稍稍抬起屁股看书。 <br /><br />坐着看书时，脚尖坚起，同时眼睛不断向上翻的人，肯定是个急性子。这是一种天生的个性。即使他有很多看书的时间，但他还是显得非常匆忙，无法平心静气地看书。 <br /><br />驼着背看书的人，大多是高龄人，这种风貌是借着领取退休金颐养天年的作风。 <br /><br />在读书时，用手撑着下巴且姿势不良的人，其读书效率极差，同时此一姿态也是他的理解及记忆均有困难的人的象征。一个真正求学的人，是不会用这种不良姿态读书的。 <br /><br />跪坐在桌前，两手大张撑在桌上并不时左右观看者，如果他的神态又很怡然自若，那这就是一种计划大事业的姿态。 <br /><br />将脚伸出桌底，并经常用手抚弄桌角的人，是缺乏劳动意念的人，很难成就大事。 <br /><br />两脚前伸，同时作出俯卧姿态看书的人，常常是患有胃病的人。一个胃有毛病的人在进餐之后极易作出此种姿态。 <br /><br />一只脚跪坐，另一只脚直立下垂的看书姿态，通常是瘦型老人，多半把眼镜架在鼻梁下方。凡患胃及肾病之人，多属此类型的人。 <br /><br />坐下后，把一只脚伸出去，而把重心放在另一只脚的女性，是一位非凡的自豪家。可是，如果过份自信的话，反而会使她变成一位厚颜无耻的女性，使她的身心都无法正常发展，进而变得非常虚假。 <br /><br />坐下后两脚同时倒向一方的人，是一个长时间站立工作的人的特有的习惯。在百货公司里长期工作的女性，其坐姿通常如此。这种坐姿的人，常能坚持自己的立场，不论别人如何批评，她都不加理睬，也可以说是位脸皮很厚的女性。 <br /><br />坐下时，脚尖朝外，臂部与椅子紧密相贴，这种人非常耿直干脆，直觉感十分发达。 <br /><br />坐下时重心向中，第一脚趾轻触地面，脚尖部位稍稍离开而正坐的方式，是一种健康的坐姿。</font>
		</p>
<img src ="http://www.cppblog.com/Lee/aggbug/108658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2010-03-01 14:00 <a href="http://www.cppblog.com/Lee/archive/2010/03/01/108658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>exit()和return的区别</title><link>http://www.cppblog.com/Lee/archive/2009/04/09/79403.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Thu, 09 Apr 2009 15:26:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/04/09/79403.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/79403.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/04/09/79403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/79403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/79403.html</trackback:ping><description><![CDATA[
		<p>return   是　ｃ语言中的保留字，指示程序正常结束，而exit()是一个库函数，后面可以加参数；   <br />  ｅｘｉｔ（0）也可以正常退出，如果加其它的数值：1，2，....可以表示由于不同的错误原因而退出。</p>
		<p>按照书上说的,在main函数里面return跟exit是一样的   <br />  但是实际应用中总能发现一些区别,   比如C++中,return会自动调用全局对象的析构函数,   而exit不会.   </p>
<img src ="http://www.cppblog.com/Lee/aggbug/79403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-04-09 23:26 <a href="http://www.cppblog.com/Lee/archive/2009/04/09/79403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>托管代码（转）</title><link>http://www.cppblog.com/Lee/archive/2009/04/09/79400.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Thu, 09 Apr 2009 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/04/09/79400.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/79400.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/04/09/79400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/79400.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/79400.html</trackback:ping><description><![CDATA[
		<p>托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码，它们包括：C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合，并能被编码成为中间语言(IL)。运行库编译器（runtime-aware ompiler）在托管执行环境下编译中间语言（IL）使之成为本地可执行的代码，并使用数组边界和索引检查，异常处理，垃圾回收等手段确保类型的安全。 </p>
		<p>在托管执行环境中使用托管代码及其编译，可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样，许多不可靠的设计也自动的被增强了安全性，例如 类型安全检查，内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。 </p>
<img src ="http://www.cppblog.com/Lee/aggbug/79400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-04-09 23:24 <a href="http://www.cppblog.com/Lee/archive/2009/04/09/79400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不爱那么多只爱一点点    李敖</title><link>http://www.cppblog.com/Lee/archive/2009/04/09/79383.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Thu, 09 Apr 2009 14:27:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/04/09/79383.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/79383.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/04/09/79383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/79383.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/79383.html</trackback:ping><description><![CDATA[
		<br />不爱那么多只爱一点点，别人的爱情像海深我的爱情浅。不爱那么多只爱一点点，别人的爱情像天长我的爱情短。不爱那么多只爱一点点，别人眉来又眼去我只偷看你一眼。。。。。。 <img src ="http://www.cppblog.com/Lee/aggbug/79383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-04-09 22:27 <a href="http://www.cppblog.com/Lee/archive/2009/04/09/79383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>摘抄</title><link>http://www.cppblog.com/Lee/archive/2009/03/18/77064.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Wed, 18 Mar 2009 12:45:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/03/18/77064.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/77064.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/03/18/77064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/77064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/77064.html</trackback:ping><description><![CDATA[一直很喜欢电影《六楼后座》里的一段台词：“青春犹如方塘，有棱角的，易碎的，荒唐的，甜蜜的；有种甜蜜要用亲身用舌间能量才能融化，才能品尝。你总不能隔岸观火，人生总有这样一个阶段；一个做什么都快乐的阶段，一个说什么也真诚的阶段。他们可笑也可爱。笑他们皆因我们都曾经荒唐过，爱他们皆因我们也曾甜蜜过。”<img src ="http://www.cppblog.com/Lee/aggbug/77064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-03-18 20:45 <a href="http://www.cppblog.com/Lee/archive/2009/03/18/77064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux和unix的区别（转）</title><link>http://www.cppblog.com/Lee/archive/2009/03/15/76690.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Sun, 15 Mar 2009 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/03/15/76690.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/76690.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/03/15/76690.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/76690.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/76690.html</trackback:ping><description><![CDATA[
		<div class="textcontent" id="cl441993">
				<font size="4">Linux 的源头要追溯到最古老的UNIX。1969年，Bell实验室的Ken Thompson开始利用一台闲置的 PDP-7计算机开发了一种多用户，多任务操作系统。很快，Dennis Richie加入了这个项目，在他们共同努力下诞生了最早的UNIX。Richie受一个更早的项目——MULTICS的启发，将此操作系统命名为 Unix。早期UNIX是用汇编语言编写的，但其第三个版本用一种崭新的编程语言C重新设计了。C是Richie设计出来并用于编写操作系统的程序语言。通过这次重新编写，Unix得以移植到更为强大的 DEC PDP-11/45与11/70计算机上运行。后来发生的一切，正如他们所说，已经成为历史。Unix从实验室走出来并成为了操作系统的主流，现在几乎每个主要的计算机厂商都有其自有版本的Unix.<br /><br />Linux起源于一个学生的简单需求。Linus Torvalds,Linux的作者与主要维护者，在其上大学时所买得起的唯一软件是Minix. Minix是一个类似Unix，被广泛用来辅助教学的简单操作系统。Linus 对Minix不是很满意，于是决定自己编写软件。他以学生时代熟悉的Unix作为原型， 在一台Intel 386 PC上开始了他的工作。他的进展很快，受工作成绩的鼓舞，他将这项成果通过互连网与其他同学共享，主要用于学术领域。有人看到了这个软件并开始分发。每当出现新问题时，有人会立刻找到解决办法并加入其中，很快的， Linux成为了一个操作系统。值得注意的是Linux并没有包括Unix源码。它是按照公开的POSIX标准重新编写的。Linux大量使用了由麻省剑桥免费软件基金的GNU软件，同时Linux自身也是用它们构造而成。<br /><br /><br />另外两大区别：<br />1） UNIX系统大多是与硬件配套的，而Linux则可运行在多种硬件平台上.<br />2） UNIX是商业软件，而Linux是自由软件，免费、公开源代码的.<br />UNIX(5万美圆)而Linux免费 <br /></font>
		</div>
<img src ="http://www.cppblog.com/Lee/aggbug/76690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-03-15 21:43 <a href="http://www.cppblog.com/Lee/archive/2009/03/15/76690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>司马懿的人生规划(转贴)</title><link>http://www.cppblog.com/Lee/archive/2009/03/07/75802.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Fri, 06 Mar 2009 23:19:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/03/07/75802.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/75802.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/03/07/75802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/75802.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/75802.html</trackback:ping><description><![CDATA[
		<font size="4">什么是人生规划？是指一个人结合自身实际情况，根据眼前的机遇和制约因素，积极主动地确立自己的事业</font>
		<a onclick="javascript:tagshow(event, '%B7%A2%D5%B9');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font size="4">发展</font>
						</strong>
				</u>
		</a>
		<font size="4">方向、奋斗目标，然后为达到这一目标而确定行动时间和行动方案。<br />　　人生规划的正确与否，直接关系到一个人毕生的成败。而在生存竞争激烈的时代，一个人是否具有正确的人生规划以立身处世，就显得尤为重要。</font>
		<a onclick="javascript:tagshow(event, '%C0%FA%CA%B7');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font size="4">历史</font>
						</strong>
				</u>
		</a>
		<font size="4">上的魏、蜀、吴三国时期，就是一个生存竞争非常激烈的时代，“智者恃谋而立身，勇者恃力而行道”，能够脱颖而出、名垂青史的，如贾诩、荀攸、诸葛亮等人，都是正确把握了自己人生规划的高手。但三国群雄之中，称得上把自己的人生规划做得最完美最精彩的，笔者认为非魏国的</font>
		<a onclick="javascript:tagshow(event, '%CB%BE%C2%ED%DC%B2');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font size="4">司马懿</font>
						</strong>
				</u>
		</a>
		<font size="4">莫属。<br />　　司马懿是三国历史上一个至关重要的人物。如果没有他，三国纷争的历史大概不会那么快就结束，也许还会再演绎数十年；如果没有他，大晋王朝顺应民心的统一大业，也不可能那么水到渠成、来得轻轻巧巧。是他，上承魏之强盛，下启晋之统一，成就了秦皇汉帝那样的丰功伟业，将天下万民从乱世争战之中解救出来。所以，他堪称“命世之英，非常之雄”。<br />非常之人，必有非常之处。《晋书》上称司马懿“少有奇节，聪明多大略，博学洽闻，伏膺儒教。汉末大乱，常慨然有忧天下心”。在笔者看来，最能凸现司马懿善于规划自己人生的，便在“聪明多大略”五个字上。以史书资料为依据，让我们来看一看司马懿是如何施展他的聪明才智来进行人生规划的。<br />　　古人云：“良禽择木而栖，贤臣择主而事”。在封建</font>
		<a onclick="javascript:tagshow(event, '%C9%E7%BB%E1');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font size="4">社会</font>
						</strong>
				</u>
		</a>
		<font size="4">，一个人事业上的建树，主要在政治、军事方面；而在政治、军事方面有所建树，则全凭个人与上级的关系如何。所以，根据司马懿辅佐的四个君主，可以大致将他的人生规划分为四个阶段：魏武帝时期、魏文帝时期、魏明帝时期、魏少帝曹芳时期。而我们就可以从这四个时期分阶段来观察司马懿的人生规划。<br />　　一、魏武帝时期<br />　　首先，我们有必要了解一下魏武帝曹操的个性特色与为政风格。史书上称曹操“知人善察，难眩以伪，创造大业，文武并施”，同时又“持法峻刻，诸将有计谋胜出己者，随以法诛之，及故人旧怨，亦皆无余。”是一个名副其实的“雄猜之主”。<br />　　另外，曹操在自己的用人导向上存在着严重的“既重才，又忌才；既用人，又疑人”的双重性。他很看重部下的才能和实力，但又不允许部下的才能与实力超出他和他的后人的可驾驭范围。《三国志》上记载了这样一个事例：荆州少年周不疑，年十七，少有异才，聪明敏达，曹操欲以女妻之，周不疑不敢当。曹操爱子曹冲，亦有过人之智，可与周不疑相比。后曹冲病死，曹操心忌周不疑，欲除之。曹丕以为不可，曹操曰：“此人非汝所能驾御也。”遂遣刺客杀之。这一事例，完全证明了曹操用人路线的“双重取向”。<br />　　司马懿对曹操这种用人导向是认识得很深刻的。当年他出山任职时因不满曹操挟天子而令诸侯的叛臣行径，“知汉运方微，不欲屈节曹氏”，在曹操慕其名想把他收罗到帐下时，他假扮患“风痹”之症作为推辞的理由，并且还以“坚卧不动”的高超演技骗过了曹操派来刺探虚实的人。但骗得了一时，骗不过一世。曹操当了丞相之后，再次敦请司马懿出仕，而且明确地发出了“若复盘桓，便收之”的威胁。这时候的司马懿，自知不足以与权势显赫的曹操相抗衡，只得“惧而就职”。君己无礼于先，臣又怎能忠事于后？！显而易见，在这种极其被动的情况下，司马懿虽已加入到曹操阵营之中，却很难马上发挥其过人的抱负与谋略。<br /><br />即便进了丞相府，司马懿也是很不安全的。《晋书》上记载：“魏武察帝(指司马懿)有雄豪志，闻有狼顾相。欲验之，乃召使前行，令反顾，面正向后而身不动。又尝梦三马同食一槽，甚恶焉。因谓太子丕曰：‘司马懿非人臣，也必预汝家事。’”可见，曹操对他的猜忌之深，达到了“必欲除之而后快”的地步。<br />　　司马懿这时的人生规划第一个重点便是“韬光养晦，瞻前顾后，明哲保身”。他决定用自己的务实和苦干换取曹操的信任，“于是勤于吏职，夜以忘寝，至于刍牧之间，悉皆临履，由是魏武意遂安”。是啊，任何一位君主，看到有这样公而忘私、废寝忘食、尽心尽力的臣子为自己效忠，又怎会产生叵测之心以制之？曹操在最后终于接受了司马懿的效忠，并对他进行了提升，所以他能从当初刚入丞相府的“文学掾”(文牍之官)一直做到丞相府主簿(相当于现在的国务院秘书长)。<br />        但在明哲保身的同时，司马懿丝毫也没有放松对自己的历练。这是他这段时期人生规划的第二个重点。他在当时的丞相府中找到了两个榜样——荀彧和曹操。应该说，在丞相府的历练过程中，他时时处处都在学习这两个榜样的长处。但司马懿注意到了这一点：荀彧作为高明的谋略家，他的长处仅仅局限于运筹帷幄之中，</font>
		<a onclick="javascript:tagshow(event, '%B7%A2%D5%B9');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">发展</font>
						</strong>
				</u>
		</a>
		<font size="4">的空间太狭窄，始终只能隐在幕后，而无法驰骋疆场，登上</font>
		<a onclick="javascript:tagshow(event, '%C0%FA%CA%B7');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">历史</font>
						</strong>
				</u>
		</a>
		<font size="4">的大舞台。而曹操不同，他就是一个“能谋能战”的大枭雄，他的发展空间就比荀彧更广阔。从注意到这一点开始，素怀“治国平天下”大志的司马懿学会了有计划、有步骤的自我锻炼，使自己逐步完善成为集曹操、荀彧二者之长于一体的“文武双全、出将入相”的真正强者。<br />　　最后，我们来谈司马懿在魏武帝时期人生规划中，最重要也是最精彩的一笔了——扶助曹丕成为太子。《晋书》上讲他：“魏国既建，迁太子中庶子。每与大谋，辄有奇策，为太子所信重。”儒家学说里讲：“己欲立而先立人，己欲达而先达人”，司马懿为了摆脱处于中层官僚的命运，直接在曹丕身上痛下苦功，只要将在夺嫡之争中处于劣势的曹丕推上太子宝座，他就可以成为辅佐元勋而进入魏国最高统治阶层。于是，他想了种种策略，挫败了曹丕的政敌——曹植一党的攻击，终于使曹丕登上了太子之位。而这一步棋的</font>
		<a onclick="javascript:tagshow(event, '%B3%C9%B9%A6');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">成功</font>
						</strong>
				</u>
		</a>
		<font size="4">，直接影响了司马懿的一生。从此，他逐渐迈近了魏国的最高统治阶层。<br />　　这一时期，从司马懿初入丞相府时的二十九岁算起，到魏武帝逝世时他满四十岁为止，他为了“一跃而起、一飞冲天”而整整耗去了十一年的时间。<br />　　在这十一年里，可以看出司马懿的人生规划完全遵循儒家立身处世之道：修身、齐家、治国、平天下。司马懿牢牢把握住了儒家之道的核心环节——“修身”。只有“修身”功夫做得实、做得好，“治国平天下”的大志才不会是无本之木、无源之水。<br />　　“修身”这一课题，在司马懿看来，又可具体成“藏器于身，待时而动”八个字，也就是“识时务”：根据时势的需要，密切联系实际情况，以治国平天下之大志为导向，扎实锻炼自身各方面的能力，随时准备接受命运的考验与挑战。他最高明的一点就是——在什么时候、什么环境下需要突出自己哪一方面的能力以脱颖而出，他一向对此算计得十分精确。所以，司马懿能在魏武帝时期悄然无声而又不可遏制地崛起。<br />　　他的平步青云，也真正印证了《荀子》里那段名言：“无冥冥之志者，无昭昭之明；无惛惛之事者，无赫赫之功”。<br /><br /></font>
		<span style="FONT-SIZE: 12px">
				<font size="4">　　二、魏文帝时期<br />　　到了魏文帝曹丕时期，司马懿才真正迎来了他顺风顺水的人生阶段。<br />　　建安二十五年春正月，司马懿当时四十岁，汉丞相、魏王曹操于洛阳病逝。当时魏王府外有前来夺权的曹彰问罪之师，内有诸路兵马暴乱之迹，而汉室遗臣们也有蠢蠢欲动之相。史书上讲：“及魏武薨于洛阳，朝野危惧”。司马懿在这个时候毅然挺身而出，“纲纪丧事，内外肃然”，用自己的卓异才识镇了岌岌可危的时局，稳定了人心，并说服汉献帝正式册立曹丕为丞相、魏王。<br />　　他这初显身手之举，更是进一步赢得了曹丕的信任和重用。当曹丕一立为魏王，立即封他为封津亭侯，并转任丞相长史，成为魏王府中的核心人物之一。<br />　　这时，司马懿已消除了魏武帝时处处受到压制的威胁，可以直抒胸臆大显身手。他先是</font>
				<a onclick="javascript:tagshow(event, '%B2%DF%BB%AE');" href="javascript:;" target="_self">
						<u>
								<strong>
										<font color="#176209" size="4">策划</font>
								</strong>
						</u>
				</a>
				<font size="4">了以魏代汉受禅的“大略”，后又为魏文帝南征而“留守许昌，内镇百姓，外供军资”，并被魏文帝称为“萧何”之材。魏文帝病重时，仍不忘封他和曹真、陈群为顾命辅政大臣，并诏太子曹睿 ：“有间此三公者，慎勿疑之”。显而易见，司马懿已跻身于曹魏政权最高决策者的行列。<br />　现在我们可以来分析司马懿这段时期的人生规划：首先，曹丕能当太子、能当魏帝，出力最多、功劳最大的，应属司马懿(史书上虽没有清楚地描绘司马懿的种种谋略，这更显出了他的“阴”和“深”)。而曹丕本人对司马懿亦是非常感激，所以司马懿用不着再畏惧君主的猜忌了。加之，曹丕给了他宽松的</font>
				<a onclick="javascript:tagshow(event, '%B7%A2%D5%B9');" href="javascript:;" target="_self">
						<u>
								<strong>
										<font color="#176209" size="4">发展</font>
								</strong>
						</u>
				</a>
				<font size="4">环境和广阔的</font>
				<a onclick="javascript:tagshow(event, '%C0%FA%CA%B7');" href="javascript:;" target="_self">
						<u>
								<strong>
										<font color="#176209" size="4">历史</font>
								</strong>
						</u>
				</a>
				<font size="4">舞台，这对他“成大器、胜大任”来说，是一种极佳的铺垫。<br />　　但曹丕一向喜欢耀武扬威、好大喜功，自己并无军事才能，又爱征战杀伐。于是，在武事方面，司马懿不敢暴露自己的真才实学，任由这个虚荣心极强的君主去大出风头。但他却是埋下头来，扎扎实实担负起了丞相的重任，在文政方面做到了有所建树。这时候的司马懿还不想锋芒毕露，显得有些低调，这是有原因的：虽说曹丕对他极为信任，但在军事大政方面，他还是偏向于倚重自己的曹氏宗亲。而司马懿也没有必要急于显出掌握兵权的意图——“先安内，后取外”，毕竟丞相之职，对司马懿而言，亦可算是不错的平台。<br />　　司马懿立身行事的特长，我们这时也可以清楚地看出来了：目光远大，计谋深沉，遇事主动，办事缜密，滴水不漏，毫无瑕疵。所以，他能在曹丕时期稳打稳扎地真正崛起，而始终立于不败之地。<br />　　曹丕死时，他年龄为四十七岁。在曹丕为帝的这七年里，司马懿迎来了崭露头角的辉煌时期。但这七年里，他的舞台还不够广阔，他只是默默地在后方夯实着魏室的基业。但司马懿已不甘于隐在幕后了，他准备着走上历史前台大展身手。而这一机遇很快就要到来。</font>
		</span>
		<br />
		<br />
		<br />
		<font size="4">三、魏明帝时期<br />　　公元227年，魏太和元年，曹丕的儿子曹睿登基为明帝。他给了司马懿表现军事才能的机会。当时，东吴孙权率领数万雄师围困了魏国的江夏城，并派大将诸葛瑾、张霸攻打襄阳城。司马懿立刻率军出击，大败吴寇，诸葛瑾逃走，张霸被斩。司马懿这一赫赫战功，立刻得到了回报，他被任命为骠骑大将军。<br />　　至此，司马懿可以开府治事——有了自己的办事机构和统归自己指挥的军队，可以培植自己的力量。作为曹丕“东宫四友”之一的老臣吴质也在曹睿面前称赞他：“忠智至公，社稷之臣”。司马懿的威望，日渐隆盛。<br />　　随着魏室最得力的宗氏大臣曹真的死去，司马懿开始在魏国军政界独领风骚。魏明帝对他的放手任用，更加有利于他文韬武略的进一步发挥。在魏明帝时期，他从一个谋臣顺利转型为一个充满了戏剧色彩的武将。他深藏不露的军事才能得到了进一步淋漓尽致的发挥。他在明帝当政的十三年里，南平叛臣孟达，西拒诸葛亮，北摧公孙渊，招招见血封喉、凌厉之极，连吴国国主孙权也不得不为之惧服：“司马懿善用兵，变化若神，所向无前”。<br />　　司马懿这时人生规划的重点是：用显赫的军事业绩巩固自己的政治地位，同时利用“养寇以自重”的策略来慢慢蚕食魏室的军政基业。<br />　应该说，这时候的司马懿目光并没有局限于维护魏室的一国之安，他早已开始着手实施“肃清万里，总齐八荒、平一天下”的大志与大略。他少年时代便“慨然有忧天下心”，到了接近老年时才终于获得了“为天下解忧，为万民解困”的机遇和条件。这个历程，让他苦心经营了整整三十七年！<br />　　首先来看司马懿军事上精彩的第一笔——旬月之间擒灭叛臣孟达。他是精于使用急行军和潜行军的大师，当他陡然从天而降兵临上庸城下时，孟达还在做他的春秋大梦呢！于是，可怜的孟达便被他迅速而有力地一下扫平了，干净利落，毫不拖泥带水。这可以看出司马懿的用兵特色：静则隐于九地之下，令人无从发觉；动则发于九天之上，令人猝不及防。而从他与明帝论兵时自言：“凡攻敌，必先扼其喉而捣其心”，更见他善于集中优势兵力直攻敌之要害。所以，他往往是不发则已，一发必中，殄敌于鬼神莫测之际。<br />　　但为什么到了与诸葛亮对阵时，他又怎么不采用这种敏捷、果决、刚猛的战术呢？这正是笔者要讲的——他人生规划的重点并不是一味炫耀军事才能，他要着手实施他“扫平三国，一统天下”的大略了！<br /><br />下面我们来仔细分析诸葛亮和司马懿的祁山之战。这是一场持久战，司马懿从四十九岁打到五十五岁，整整打了六年，打出了诸葛亮“鞠躬尽瘁，死而后已”的千古盛誉，也打出了司马懿“扫平三国、统一天下”的雄厚资本。受罗贯中《三国演义》的影响，人们总以为司马懿军事才能不如诸葛亮，处处被诸葛亮牵着鼻子走。然而根据史书记载来看，事实根本不是这样的。首先，我们要弄清他俩在祁山之战的真正目的。诸葛亮的</font>
		<a onclick="javascript:tagshow(event, '%D5%BD%C2%D4');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">战略</font>
						</strong>
				</u>
		</a>
		<font size="4">目的很简单：攻下中原，消灭曹魏，光复汉室。司马懿的战略目的就复杂多了：一、挫败蜀军进攻；二、积蓄力量，取曹魏而代之；三、养兵千日，伺机统一天下。这多重性质的战略目的，让司马懿在表面上显得似乎有些被动。但根据自己的战略目的，他第一步做到了维持现状的平衡战略：一方面防止诸葛亮获得大的优势，对魏国和自己造成致命威胁；另一方面又不能击溃诸葛亮，还要保持诸葛亮的攻击力。“空城计”如果是真的史实，就验证了司马懿的这个平衡战略——所以，他宁可被部下称为“畏蜀如虎”，也不愿冲进西城小县抓住诸葛亮。真要是抓住了诸葛亮，司马懿就只能重复历代功臣“兔死狗烹”的戏剧性命运了。<br />　　第二步，司马懿实施了“偷天换日”的篡位战略。在祁山之战期间，他慢慢树立了自己在军队中的绝对权威，并肃清了军中的异己分子，重用牛金、郭淮等忠于自己的将领，夯实了自己的军权基础。我们可以通过后来的</font>
		<a onclick="javascript:tagshow(event, '%C0%FA%CA%B7');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">历史</font>
						</strong>
				</u>
		</a>
		<font size="4">来验证，当他的儿子司马师、司马昭叛魏之时，魏国大臣很少有站出来反抗的，甚至史书上都是寥寥几笔带过。曹氏政权如同纸屋一般一下就崩溃了，这个量的积累可不是司马师、司马昭当时所能造就的，应该是司马懿从掌握军政实权开始就着手为儿子们做好的铺垫。<br />     <br />　　第三步，司马懿已在祁山之战中开始积蓄“扫平吴蜀、统一天下”的资本了。他指挥大军与诸葛亮对峙，大战必避，小战必迎，以实战练军士，以实战养军威，</font>
		<a onclick="javascript:tagshow(event, '%B3%C9%B9%A6');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">成功</font>
						</strong>
				</u>
		</a>
		<font size="4">地建立了一支能征善战的军队，为将来消灭吴蜀、统一天下作好了军事上的准备。而魏国后期抗吴灭蜀的大将郭淮、王昶、邓艾等</font>
		<a onclick="javascript:tagshow(event, '%C8%CB%B2%C5');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">人才</font>
						</strong>
				</u>
		</a>
		<font size="4">，就是司马懿那时在祁山之战中一手培养和提拔起来的。<br />　　第四步，司马懿已着手历练自己事业的继承者——他的儿子司马师与司马昭。他将两个儿子带到祁山之战中，接受血与火、生与死的锻炼，为他俩将来顺利继承自己“一统天下”的事业做好了充足的素质准备。<br />　　这四步高招，是司马懿在祁山对峙中真正的事业，也是他这段时期人生规划中的神来之笔。虽然，他在和诸葛亮的对抗中，似乎没有取得表面上的胜利，但他的所有战略目的都达到了。这便是他的最大胜利——更何况他还拖死了积劳成疾的诸葛亮。<br />　　诸葛亮死后没多久，司马懿刚一返回朝廷，又被曹睿派往辽东攻打公孙渊。这是一场大规模的远征战役，但用兵如神的司马懿只率四万人马，“往百日，返百日，攻百日，以六十日为休息”，仅仅用了一年的时间，便彻底扫平了公孙渊，巩固了魏国的后方。<br />　　而这时曹睿已身患笃疾，一场朝廷权力交接战又拉开了帷幕。司马懿煞费苦心安插在明帝身侧的“内应”——魏中书监刘放、中书令孙资拼死力争，将远在万里之外得胜归来的司马懿再一次推上了顾命辅政之位。至此，身为“三朝元老”的司马懿重返魏国政坛，新的征程在他脚下延伸开来。虽然这时司马懿已年满六旬，但他雄心不减当年，积极准备着继往开来、再创辉煌。吴国、蜀国此刻才深深感到了司马懿的巨大威胁，然而一切都晚了，他们国中已经没有任何人可以与司马懿对敌了。<br />　　四、魏少帝曹芳时期<br />　　魏少帝曹芳时，司马懿已站到了权力的顶峰。这个时候能够阻止他大展雄才的人应该没有了。他挟“四朝元老”之威望，负“伊尹、周公”之才德，谁也不敢和他的远见卓识相抗。他在魏国军政大事上的每一次决策和行动，都是完美无缺的。<br />　　但另一个顾命辅政大臣曹爽却害怕司马家族终有一天会垄断朝政。于是他用了“欲抑先扬”之术，敬事司马懿如父，推举他为“太傅”，外示尊崇，而实则夺了他的军政大权。<br />　　司马懿处空名而无实权，一晃就是十年。在这十年里，他处处示弱，隐忍不发，静观其变。果然，曹爽志得意满之后走向了狂悖与淫慢。他作威作福，秽政横行，以致大臣离心、物议沸腾，魏国国势也渐趋衰弱。<br />　　这是司马懿无法忍受的。他可以忍受曹爽夺权，也可以忍受曹爽胡作非为，但他绝不能忍受曹爽毁掉他辛辛苦苦为魏国夯实的“一统天下”的大业根基。他为自己“达则兼济天下”的大志已不懈奋斗了近四十年，怎么可能让无知小儿曹爽来阻断！<br />　　于是，“高平陵事变”不可避免地发生了。曹爽一派被司马懿用雷霆手段一举摧灭。<br />　　司马懿在最后处置曹爽时，用了“斩草除根”之法，将曹氏宗亲翦灭殆尽。这一举措甚至招致了他的好友蒋济的反对。但他必须这么做。只有不留后患，才能保证朝局的稳定啊！况且，司马懿已走上了一条与曹魏政权决裂的不归之路。<br />　　公元251年，魏嘉平三年，司马懿已七十二岁了。他在除掉最后一个政敌王凌后，病死于洛阳，真可谓“生命不息，战斗不止”。<br />　　司马懿临终前，把两个儿子司马师、司马昭叫到榻前说：“吾事魏历年，官授太傅，人臣之位极矣；人皆疑吾有异志，吾尝怀恐惧。吾死之后，汝二人善理国政，慎之！慎之！”<br /><br />对于司马懿所言的“慎之”，也许有两层意思可以理解：其一是让二子善理国政，不可以心生异志；其二是让二子善保国政，不可轻易托付他人。但是无论司马懿本人有没有异志，有一点是可以肯定的，那就是通过他的不懈经营和艰苦努力，已经为后人的事业创造了最佳的政治、军事和</font>
		<a onclick="javascript:tagshow(event, '%BE%AD%BC%C3');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">经济</font>
						</strong>
				</u>
		</a>
		<font size="4">条件。司马懿死后，司马师和司马昭分别被封为大将军和骠骑上将军，总领尚书机密大事。从此对于曹魏而言，皇帝之势微而国家之势强，军政大权，尽归司马氏专断。<br />　　“山海争水，水必归海，非海求之，其势顺也。”继司马懿之后，呈现在司马昭、司马炎面前的天下大势，可谓“居高视下，势如劈竹”。他们所要做的，只是顺流而下，去完成</font>
		<a onclick="javascript:tagshow(event, '%C0%FA%CA%B7');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">历史</font>
						</strong>
				</u>
		</a>
		<font size="4">所赋予的某种必然。<br />　　公元262年，魏将邓艾偷渡阴平、奇袭成都得手。次年，蜀后主刘禅降魏，至此，蜀汉政权历二帝，前后42年，终于宣告结束。<br />　　公元265年，司马昭之子司马炎逼魏主曹奂禅位，司马炎登基，改国号为晋；公元280年，司马炎进讨吴国，吴主孙皓降晋，吴国灭亡。从而结束了魏蜀吴三国之间长达七十二年的混战局面，这就是</font>
		<a onclick="javascript:tagshow(event, '%D6%D0%B9%FA');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">中国</font>
						</strong>
				</u>
		</a>
		<font size="4">历史上的“三分归晋”。<br />　　总 结<br />　　司马懿是一个集政治家、军事家、权谋家于一身的儒家奇才。当然，这是他</font>
		<a onclick="javascript:tagshow(event, '%B3%C9%B9%A6');" href="javascript:;" target="_self">
				<u>
						<strong>
								<font color="#176209" size="4">成功</font>
						</strong>
				</u>
		</a>
		<font size="4">之后，人们给他定的性质。<br />　　人们会说，儒家以“忠孝”为本。司马懿本就不是魏之纯臣，也不尽忠于曹氏，怎么还能说他是儒家奇才呢？其实，儒学的根基是一个“仁”字。司马懿除魏之苛政、抚民于安乐，这不是“仁”吗？司马懿消乱世之纷争，统一天下，拯万民于战火之中，这不是“仁”吗？——“仁”比“忠”更大呀！这才是真正的儒者应持的观点。<br />　　因为仁者无敌，所以司马懿无敌。<br />　　司马懿从一个有志有才的青年，到一个内政军事名满天下的奇才，再到一个治国平天下的英雄。这完全应归功于他的人生规划做得完美无缺。在他人生的每一个重要机遇期里，他总能把握住最佳时机出手，而且一抓就是硕果累累，这是难能可贵的。<br />　　更可贵的，是他能忍：面对曹操的歧视和压制，他能忍；面对同僚的排挤和陷害，他能忍；面对诸葛亮的“巾帼之辱，”他能忍；面对小辈曹爽的欺侮，他也能忍。他人生规划中最璀灿的亮点，就是他的“忍”——坚百忍以图功业之终成。一个“忍”字贯穿了司马懿的整个人生规划；一个“忍”字，造就了千古一帝司马懿。<br /><br /></font>
<img src ="http://www.cppblog.com/Lee/aggbug/75802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-03-07 07:19 <a href="http://www.cppblog.com/Lee/archive/2009/03/07/75802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]VC 常用插件</title><link>http://www.cppblog.com/Lee/archive/2009/02/25/74812.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Tue, 24 Feb 2009 16:27:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/02/25/74812.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/74812.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/02/25/74812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/74812.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/74812.html</trackback:ping><description><![CDATA[1.Visual Assist（强烈推荐）
<p><a href="http://www.wholetomato.com/">http://www.wholetomato.com/</a></p><p>VA从5.0一直到现在的VAX，功能越来越强大，除了以前版本中的自动识别各种关键字，系统函数，成员变量，自动给出输入提示，自动更正大小写错误，自动标示错误等等以外，最新的版本中还在</p><p>WorkSpace窗口中加入一个VA View，可以更方便的查找工程中的文件、类和变量。</p><p> </p><p>2.WndTabs（强烈推荐）</p><p><a href="http://www.wndtabs.com/">http://www.wndtabs.com/</a></p><p>WndTabs主要是在编辑窗口中显示了所有已经打开的文件，在VC中能够更方便的操作这些文件，比如修改文件属性，copy文件路径、文件名等，并且还开放源代码，你要是愿意的话，可以添加自己很兴趣的功能。</p><p> </p><p>3.LineCounter</p><p><a href="http://www.wndtabs.com/">http://www.wndtabs.com/</a></p><p>用来统计整个工程的代码行数，包括总行数、代码行数、注释行数、空行数等，并且对多个工程一起统计时，不会把相同的文件计算多次.</p><p> </p><p>4.Spelly</p><p><a href="http://www.wndtabs.com/">http://www.wndtabs.com/</a></p><p>一个拼写检查的插件，可以对整个文件或所选部分进行拼写检查，支持C/C++/C#, VB, Fortran 和HTML。</p><p> </p><p>5.SourceStyler C++</p><p><a href="http://www.sourcestyler.com/">http://www.sourcestyler.com/</a></p><p>此插件是针对C++的一个格式化工具，可以针对自己的编码习惯，选择一种编码风格，也可以自己定义，而且定义非常详细，有表达式、指针、模板、类、枚举等十几种，肯定能满足你的需要。</p><p> </p><p><br />6.Numega BoundsChecker（强烈推荐）</p><p>下载：百度一下……</p><p>是针对Visual C++6.0应用程序的最为全面的错误检测工具。BoundsChecker 能自动指出静态，堆栈内存错误和资源泄漏问题。BoundsChecker 能够校验最新的 Windows APIs，包括 ActiveX, DirectX, OLE/COM, ODBC等等。能够发现与 Windows 平台兼容性。</p><p> </p><p>7.BCGControlBar Library </p><p>下载：百度一下……</p><p>非常好的一套应用于vc6的界面扩展类库，轻松的作出 vc2003 的界面。并且给了各种界面例子，如vc.net、outlook、更换皮肤等等。</p><p> </p><p>8.Comment Wizard</p><p>下载：百度一下……</p><p>Visual C++插件，提供了Visual C++源代码注解标准化与自动化功能。在它的帮助下，您可快速创建标头文件信息注解，文件中模块注解， C++处理方式，以及Ｃ语言功能与历史校正功能注解，等等。</p><p><br />AutoComment:源代码（注释插件）<br />UploadFiles/2006-12/127265382.zip</p><p>FastUtilities(注释插件)<br />UploadFiles/2006-12/127179180.rar </p><img src ="http://www.cppblog.com/Lee/aggbug/74812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-02-25 00:27 <a href="http://www.cppblog.com/Lee/archive/2009/02/25/74812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>悲观程序员的五件武器(转)</title><link>http://www.cppblog.com/Lee/archive/2009/02/25/74809.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Tue, 24 Feb 2009 16:21:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/02/25/74809.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/74809.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/02/25/74809.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/74809.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/74809.html</trackback:ping><description><![CDATA[
		<p>
				<a href="http://blog.gkong.com/more.asp?name=linkman&amp;id=27854">http://blog.gkong.com/more.asp?name=linkman&amp;id=27854</a>
				<br />我不知道，自己现在还算不算一个程序员。如果还算程序员的话，我肯定不是那种绝顶聪明的程序员。</p>
		<p>我不是一个聪明的程序员，不能在键盘上手指翻飞，灵光似剑，一日千行，闭目成章。大师的高度，远非我能指望，我会犯很多错误，只是一个普通的程序员。</p>
		<p>所以，对于编程，我是一个悲观主义者。</p>
		<p>我不相信，所编写的程序能够一次编译通过；也不相信，能在家里将程序的所有错误都找出，而不需要出差现场；更不相信，我的程序能够在不同的环境下，对各种异常，都处理得非常完美；尤不相信，我的程序没有任何内存丢失，可以连续运行一周。</p>
		<p>我本来不是一个悲观主义者，曾经的我，是那么激扬那么狂妄，只是一次次被打击，让我越来越务实，越来越冷静，越来越清醒地看待自己。随着岁月的增长，我编程的次数已越来越少，但是，我的悲观主义思想却越来越浓。</p>
		<p>一打开程序，我便想到，因为软件出错，而不得不给用户写检讨；便想到，因为每月死机一次，客户对我大发雷霆；便想到，因为产品质量问题，而陪客户喝酒，连饮七大瓶啤酒。</p>
		<p>那七瓶要命的啤酒，依然不能让客户回心转意，于是，我成了一个悲观程序员。</p>
		<p>我是悲观主义程序员，好在还有五件武器。</p>
		<p>第一件武器：断言（ASSERT）；</p>
		<p>我希望，任何调用我的模块的程序，都能按照希望的参数格式和调用方法，正确地调用我的模块。因此，在我所编写的每一个模块内，都会大量地使用断言（ASSERT），在模块中加上了断言，我便相信，程序模块有了一个一个相对真实的调用环意，便有了一种虚幻的安全感。</p>
		<p>第二件武器：静态代码检测工具，如PC-lint，有时也使用编译器的最严格的编译级别；</p>
		<p>我从不认为，自己是一个对C/C++/VC等，都非常熟悉的程序员，经常会不小心使用一些不正常的语法，或是不太考虑字段的边界，因此，在程序编到一定的阶段，都会采用pc-lint，对我所编写的程序，进行严格的编译检查。</p>
		<p>第三件武器：动态代码检测工具，如boundcheck；</p>
		<p>对于C/C++程序员而言，最大的痛苦就是内存泄漏，或其它资源泄漏了，我对内存泄漏有天生的恐惧，也经常在内存丢失方面犯错误，因此，在产品发布给用户前，一定会采用动态代码检测工具，进行一次彻底的测试。</p>
		<p>第四件武器：单元测试工具，如cppunit；</p>
		<p>我没有足够的自信，认为自己能够很好地驾驭多个模块的大型程序，也不相信自己写过的、超过50行的程序会没有问题，因此，我会尽量引入单元测试，对每一个重要的函数或模块进行地毯式单元测试，当看到那一遍测试通过的绿色，才能够安心地回家睡觉。</p>
		<p>第五件武器：调试信息；</p>
		<p>我相信，我所编写的所有程序，都不可能一次成功，即便再认真地调试检查，再多地厂内工作，在现场还是免不了会出问题。因为，不可能在家里模拟现场所有的情况，也不能够对各种异常情况进行完整地猜测。因此，在我所编写的很多程序中，特别是与监控有关的、需要长期、连续运行的程序，都会加上尽可能多的调试信息。</p>
		<p>在程序中加上调试信息，是我最后的稻草，有了它，我终于敢将产品战战兢兢地交给客户。</p>
		<p>那么，调试信息应该记录哪些内容？我想说的是，调试信息应该能够记录现场所有的信息，包括：</p>
		<p>程序的启停状态；<br />调用它人程序的边界参数；<br />被它人调用的程序的边界参数；<br />与外部环境的边界，包括操作系统、文件系统、硬件、数据库等；<br />与网络交互的两端边界；<br />重要模块的被调用参数；<br />模块内的重要过程的当前参数；</p>
		<p>有了这些调试信息，我便可以不出差了，当现场发生了事情时，我的第一反应便是要求查看这些调试信息。</p>
		<p>今天一位朋友问我，你如何保证你的程序能够稳定，我告诉他：我有五件武器。</p>
		<p>宝刀配英雄，现在我已很少编写程序了，这些武器，就送给战斗在第一线的程序员吧，也许你们现在不觉得它们有多重要，但总有一天，你们会自觉地将它们带在身边的。</p>
<img src ="http://www.cppblog.com/Lee/aggbug/74809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-02-25 00:21 <a href="http://www.cppblog.com/Lee/archive/2009/02/25/74809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言错题集</title><link>http://www.cppblog.com/Lee/archive/2009/02/09/73283.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Mon, 09 Feb 2009 03:11:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/02/09/73283.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/73283.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/02/09/73283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/73283.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/73283.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" width="600" align="center">
				<tbody>
						<tr>
								<td>
										<b>若变量已正确说明为float类型，要通过语句scanf("%f %f %f ",&amp;a,&amp;b,&amp;c);给a赋于10.0，b赋予22.0，c赋予33.0，不正确的输入形式是：</b>
										<br />
										<input type="radio" value="1" name="18" />A.10&lt;回车&gt;22&lt;回车&gt;33&lt;回车&gt;    <input type="radio" value="2" name="18" />B.10.0,22.0,33.0&lt;回车&gt;<br /><input type="radio" value="3" name="18" />C.10.0&lt;回车&gt;22.0 33.0&lt;回车&gt;    <input type="radio" value="4" name="18" />D.10 22&lt;回车&gt;33&lt;回车&gt;<br /><font color="red">错误:您选择的是C,正确答案为B</font><p> </p></td>
						</tr>
						<tr>
								<td>
										<b>为表示关系x大于等于y大于等于z,应使用C语言表达式</b>
										<br />
										<input type="radio" value="1" name="32" />A.(x&gt;=Y)&amp;&amp;(Y&gt;=z)    <input type="radio" value="2" name="32" />B.(x&gt;=Y)AND(y&gt;=z)<br /><input type="radio" checked="" value="3" name="32" />C.(x&gt;=Y&gt;=z)    <input type="radio" value="4" name="32" />D.(x&gt;=Y)&amp;(Y&gt;=z)<br /><font color="red">错误:您选择的是C,正确答案为A</font><p> </p></td>
						</tr>
						<tr>
								<td>
										<b>用数组名作为函数调用时的实参，实际上传送给形参的是</b>
										<br />
										<input type="radio" value="1" name="40" />A.数组首地址    <input type="radio" value="2" name="40" />B.数组的第一个元素值<br /><input type="radio" value="3" name="40" />C.数组中全部元素的值    <input type="radio" value="4" name="40" />D.数组元素的个数<br /><font color="red">错误:您选择的是B,正确答案为A</font><p> </p></td>
						</tr>
						<tr>
								<td>
										<b>表达式1&amp;3&amp;5&amp;7的值为：</b>
										<br />
										<input type="radio" value="1" name="71" />A.1    <input type="radio" value="2" name="71" />B.3<br /><input type="radio" value="3" name="71" />C.5    <input type="radio" value="4" name="71" />D.7<br /><font color="red">错误:您选择的是D,正确答案为A</font><p> </p></td>
						</tr>
						<tr>
								<td>
										<b>假设指针p1已经指向了某个整型变量，要使指针p2也指向同一个变量，则下面各项中正确的是：</b>
										<br />
										<input type="radio" value="1" name="80" />A.p2=**p1    <input type="radio" value="2" name="80" />B.p2=*&amp;p1<br /><input type="radio" value="3" name="80" />C.p2=*p1    <input type="radio" value="4" name="80" />D.p2=&amp;*p1<br /><font color="red">错误:您选择的是B,正确答案为D</font><p><strong>若x=4，则x*=x+2的值为：<br /><input type="radio" value="1" name="77" /></strong>A.36    <input type="radio" value="2" name="77" />B.24<br /><input type="radio" value="3" name="77" />C.18    <input type="radio" value="4" name="77" />D.20<br /><font color="red">错误:您选择的是C,正确答案为B</font></p></td>
						</tr>
				</tbody>
		</table>                  <br />                 <strong>若fp是指向某文件的指针，且feof(fp)的返回值是非零值，则表示：<br />               <input type="radio" value="1" name="75" /></strong>A.已读到此文件末尾    <input type="radio" value="2" name="75" />B.未读到此文件的末尾<br />               <input type="radio" value="3" name="75" />C.此文件已关闭    <input type="radio" value="4" name="75" />D.此文件尚未被打开<br /><font color="red">                错误:您未做出选择,正确答案为A</font> <br /><br /><strong>               以下所列的C语言常量中，错误的是<br />            <input type="radio" value="1" name="13" /></strong>A.0xFF    <input type="radio" value="2" name="13" />B.1.2e0.5<br />            <input type="radio" value="3" name="13" />C.2L    <input type="radio" value="4" name="13" />D.'\72'<br /><font color="red">              错误:您选择的是C,正确答案为B</font><img src ="http://www.cppblog.com/Lee/aggbug/73283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-02-09 11:11 <a href="http://www.cppblog.com/Lee/archive/2009/02/09/73283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小知识点</title><link>http://www.cppblog.com/Lee/archive/2009/02/06/73091.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Fri, 06 Feb 2009 03:08:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/02/06/73091.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/73091.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/02/06/73091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/73091.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/73091.html</trackback:ping><description><![CDATA[源代码从编写到执行整个过程，预处理 编译 汇编 链接 生成 执行 <br /><br />一. 获得主框架的指针  AfxGetMainWnd()<br />AfxGetMainWnd()-&gt;PostMessage(WM_CLOSE, 0, 0);<br /><br />二.<br />静态与动态拆分窗口的区别：   <br />  1、静态拆分窗口的不同子窗口允许是不同窗口类的窗口，   <br />        而且你只能改变窗口切分的尺寸，不能动态地改变窗口   <br />        切分的个数。   <br />    <br />  2、动态拆分窗口只能用于同一个窗口类的切分，   <br />        但是可以动态地改变窗口切分的尺寸和动态地改变窗口   <br />        切分的个数。 <br /><br />三.<br />  在Unicode转换中，_T()与L到底怎么用，有什么区别 <br />_T会根据你工程的设置自动转换UNICODE和非UNICODE.   <br />  加L就是转为UNICODE <br /><br />_T是将字符串转换为TCHAR，TCHAR是一个宏定义，当定义了UNICODE时TCHAR等同于WCHAR，否则等同于CHAR。为了和以后的平台兼容，建议使用TCHAR，而不要使用普通的CHAR。例子：TCHAR   *s   =   _T("FSDF")   <br />    <br />  L将字符串转换为WCHAR，用于需要UNICODE的环境。例子：WCHAR   *s   =   L"FSDF" <br /><br />四<br />Unicode   ：宽字节字符集   <br />  1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数？   <br />  可以调用Microsoft   Visual   C++的运行期库包含函数_mbslen来操作多字节（既包括单字节也包括双字节）字符串。   <br />  调用strlen函数，无法真正了解字符串中究竟有多少字符，它只能告诉你到达结尾的0之前有多少个字节。   <br />  2. 如何对DBCS（双字节字符集）字符串进行操作？   <br />  函数 描述   <br />  PTSTR   CharNext   （   LPCTSTR   ）; 返回字符串中下一个字符的地址   <br />  PTSTR   CharPrev   （   LPCTSTR,   LPCTSTR   ）； 返回字符串中上一个字符的地址   <br />  BOOL   IsDBCSLeadByte(   BYTE   )； 如果该字节是DBCS字符的第一个字节，则返回非0值   <br />  3. 为什么要使用Unicode？   <br />  （1） 可以很容易地在不同语言之间进行数据交换。   <br />  （2） 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。   <br />  （3） 提高应用程序的运行效率。   <br />  Windows   2000是使用Unicode从头进行开发的，如果调用任何一个Windows函数并给它传递一个ANSI字符串，那么系统首先要将字符串转换成Unicode，然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串，系统就会首先将Unicode字符串转换成ANSI字符串，然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序，就能够使你的应用程序更加有效地运行。   <br />  Windows   CE   本身就是使用Unicode的一种操作系统，完全不支持ANSI   Windows函数   <br />  Windows   98   只支持ANSI，只能为ANSI开发应用程序。   <br />  Microsoft公司将COM从16位Windows转换成Win32时，公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。   <br />  4. 如何编写Unicode源代码？   <br />  Microsoft公司为Unicode设计了WindowsAPI，这样，可以尽量减少代码的影响。实际上，可以编写单个源代码文件，以便使用或者不使用Unicode来对它进行编译。只需要定义两个宏（UNICODE和_UNICODE），就可以修改然后重新编译该源文件。   <br />  _UNICODE宏用于C运行期头文件，而UNICODE宏则用于Windows头文件。当编译源代码模块时，通常必须同时定义这两个宏。   <br />  5. Windows定义的Unicode数据类型有哪些？   <br />  数据类型 说明   <br />  WCHAR Unicode字符   <br />  PWSTR 指向Unicode字符串的指针   <br />  PCWSTR 指向一个恒定的Unicode字符串的指针   <br />  对应的ANSI数据类型为CHAR，LPSTR和LPCSTR。   <br />  ANSI/Unicode通用数据类型为TCHAR，PTSTR,LPCTSTR。   <br />  6. 如何对Unicode进行操作？   <br />  字符集 特性 实例   <br />  ANSI 操作函数以str开头 strcpy   <br />  Unicode 操作函数以wcs开头 wcscpy   <br />  MBCS 操作函数以_mbs开头 _mbscpy   <br />  ANSI/Unicode 操作函数以_tcs开头 _tcscpy（C运行期库）   <br />  ANSI/Unicode 操作函数以lstr开头 lstrcpy（Windows函数）   <br />  所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示；Unicode版本函数结尾以W表示。Windows会如下定义：   <br />  #ifdef     UNICODE   <br />  #define     CreateWindowEx     CreateWindowExW   <br />  #else   <br />  #define     CreateWindowEx     CreateWindowExA   <br />  #endif       //   !UNICODE   <br />  7. 如何表示Unicode字符串常量？   <br />  字符集 实例   <br />  ANSI “string”   <br />  Unicode L“string”   <br />  ANSI/Unicode T(“string”)或_TEXT(“string”)if(   szError[0]   ==   _TEXT(‘J’)   ){   }   <br />  8. 为什么应当尽量使用操作系统函数？   <br />  这将有助于稍稍提高应用程序的运行性能，因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很多，因此，在应用程序运行时，它们可能已经被装入RAM。   <br />  如：StrCat，StrChr，StrCmp和StrCpy等。   <br />  9. 如何编写符合ANSI和Unicode的应用程序？   <br />  （1） 将文本串视为字符数组，而不是chars数组或字节数组。   <br />  （2） 将通用数据类型（如TCHAR和PTSTR）用于文本字符和字符串。   <br />  （3） 将显式数据类型（如BYTE和PBYTE）用于字节、字节指针和数据缓存。   <br />  （4） 将TEXT宏用于原义字符和字符串。   <br />  （5） 执行全局性替换（例如用PTSTR替换PSTR）。   <br />  （6） 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小，而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递（sizeof(szBuffer)/sizeof(TCHAR)。另外，如果需要为字符串分配一个内存块，并且拥有该字符串中的字符数目，那么请记住要按字节来分配内存。这就是说，应该调用malloc(nCharacters   *sizeof(TCHAR)),而不是调用malloc(nCharacters)。   <br />  10. 如何对字符串进行有选择的比较？   <br />  通过调用CompareString来实现。   <br />  标志 含义   <br />  NORM_IGNORECASE 忽略字母的大小写   <br />  NORM_IGNOREKANATYPE 不区分平假名与片假名字符   <br />  NORM_IGNORENONSPACE 忽略无间隔字符   <br />  NORM_IGNORESYMBOLS 忽略符号   <br />  NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符   <br />  SORT_STRINGSORT 将标点符号作为普通符号来处理   <br />  11. 如何判断一个文本文件是ANSI还是Unicode？   <br />  判断如果文本文件的开头两个字节是0xFF和0xFE，那么就是Unicode，否则是ANSI。   <br />  12. 如何判断一段字符串是ANSI还是Unicode？   <br />  用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法，以便猜测缓存的内容。由于这不是一种确切的科学方法，因此   IsTextUnicode有可能返回不正确的结果。   <br />  13. 如何在Unicode与ANSI之间转换字符串？   <br />  Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串；函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。   <img src ="http://www.cppblog.com/Lee/aggbug/73091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-02-06 11:08 <a href="http://www.cppblog.com/Lee/archive/2009/02/06/73091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库基本种类以及各家所长(转)</title><link>http://www.cppblog.com/Lee/archive/2009/01/06/71279.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Mon, 05 Jan 2009 21:57:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2009/01/06/71279.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/71279.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2009/01/06/71279.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/71279.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/71279.html</trackback:ping><description><![CDATA[随着数据库的不断发展，数据库与我们的日常工作是密不可分的，下面我们就对数据库的分类及相关概念进行一下扫盲讲解。 
<p>　　<strong>关系型数据库</strong></p><p>　　关系型数据库以行和列的形式存储数据，以便于用户理解。这一系列的行和列被称为表，一组表组成了数据库。用户用查询（Query）来检索数据库中的数据。一个Query是一个用于指定数据库中行和列的SELECT语句。关系型数据库通常包含下列组件：</p><p>客户端应用程序（Client）</p><p>数据库服务器（Server）</p><p>数据库（Database）</p><p>　　Structured Query Language（SQL）是Client端和Server端的桥梁，Client用SQL来向Server端发送请求，Server返回Client端要求的结果。现在流行的大型关系型数据库有IBM DB2、IBM UDB、Oracle、SQL Server、SyBase、Informix等。</p><p>　　关系型数据库管理系统中储存与管理数据的基本形式是二维表。</p><p>　　<strong>网状数据库</strong></p><p>　　处理以记录类型为结点的网状数据模型的数据库。处理方法是将网状结构分解成若干棵二级树结构，称为系。系类型是二个或二个以上的记录类型之间联系的一种描述。在一个系类型中，有一个记录类型处于主导地位，称为系主记录类型，其它称为成员记录类型。</p><p>　　系主和成员之间的联系是一对多的联系。网状数据库的代表是DBTG系统。1969年美国的CODASYL组织提出了一份“DBTG报告”，以后，根据DBTG报告实现的系统一般称 为DBTG系统。现有的网状数据库系统大都是采用DBTG方案的。DBTG系统是典型的三级结构体系：子模式、模式、存储模式。相应的数据定义语言分别称为子模式定义语言SSDDL，模式定义语言SDDL，设备介质控制语言DMCL.另外还有数据操纵语言DML。</p><p>　　<strong>层次型数据库</strong></p><p>　　层次型数据库管理系统是紧随网状数据库而出现的。现实世界中很多事物是按层次组织起来的。层次数据模型的提出，首先是为了模拟这种按层次组织起来的事物。层次数据库也是按记录来存取数据的。层次数据模型中最基本的数据关系是基本层次关系，它代表两个记录型之间一对多的关系，也叫做双亲子女关系（PCR）。</p><p>　　数据库中有且仅有一个记录型无双亲，称为根节点。其他记录型有且仅有一个双亲。在层次模型中从一个节点到其双亲的映射是惟一的，所以对每一个记录型（除根节点外）只需要指出它的双亲，就可以表示出层次模型的整体结构。层次模型是树状的。最著名最典型的层次数据库系统是IBM公司的IMS（Information Management System），这是IBM公司研制的最早的大型数据库系统程序产品。从60年代末产生起，如今已经发展到IMSV6，提供群集、N路数据共享、消息队列共享等先进特性的支持。这个具有30年历史的数据库产品在如今的WWW应用连接、商务智能应用中扮演着新的角色。</p><p>　　web应用程序或者winform应用程序在存储数据的时候，一般的做法是将数据存放于数据库中，而根据程序的性能要求和实际需求我们可以选择不同类型的数据库，下面我们就对各种常用数据库的历史和特点加以简单的分析和介绍。</p><p>　　<strong>Access数据库</strong></p><p>　　美国Microsoft公司于1994年推出的微机数据库管理系统。它具有界面友好、易学易用、开发简单、接口灵活等特点，是典型的新一代桌面数据库管理系统。其主要特点如下： </p><p>　　(1)完善地管理各种数据库对象，具有强大的数据组织、用户管理、安全检查等功能。 </p><p>　　(2)强大的数据处理功能，在一个工作组级别的网络环境中，使用Access开发的多用户数据库管理系统具有传统的XBASE(DBASE、FoxBASE的统称)数据库系统所无法实现的客户服务器(Cient/Server)结构和相应的数据库安全机制，Access具备了许多先进的大型数据库管理系统所具备的特征，如事务处理/出错回滚能力等。 </p><p>　　(3)可以方便地生成各种数据对象，利用存储的数据建立窗体和报表，可视性好。</p><p>　　(4)作为Office套件的一部分，可以与Office集成，实现无缝连接。 </p><p>　　(5)能够利用Web检索和发布数据，实现与Internet的连接。 Access主要适用于中小型应用系统，或作为客户机/服务器系统中的客户端数据库。<br /><br /><strong>Informix数据库</strong></p><p>　　美国InfomixSoftware公司研制的关系型数据库管理系统。Informix有Informix-SE和Informix-Online两种版本。Informix-SE适用于UNIX和WindowsNT平台，是为中小规模的应用而设计的;Informix-Online在UNIX操作系统下运行，可以提供多线程服务器，支持对称多处理器，适用于大型应用。</p><p>　　Informix可以提供面向屏幕的数据输入询问及面向设计的询问语言报告生成器。数据定义包括定义关系、撤销关系、定义索引和重新定义索引等。Informix不仅可以建立数据库，还可以方便地重构数据库，系统的保护措施十分健全，不仅能使数据得到保护而不被权限外的用户存取，且能重新建立丢失了的文件及恢复被破坏了的数据。其文件的大小不受磁盘空间的限制，域的大小和记录的长度均可达2K。采用加下标顺序访问法，Informix与COBOL软件兼容，并支持C语言程序。 Informix可移植性强、兼容性好，在很多微型计算机和小型机上得到应用，尤其适用于中小型企业的人事、仓储及财务管理。 </p><p>　　<strong>Orcale数据库</strong></p><p>　　美国Orcale公司研制的一种关系型数据库管理系统，是一个协调服务器和用于支持任务决定型应用程序的开放型RDBMS。它可以支持多种不同的硬件和操作系统平台，从台式机到大型和超级计算机，为各种硬件结构提供高度的可伸缩性，支持对称多处理器、群集多处理器、大规模处理器等，并提供广泛的国际语言支持。 Orcale是一个多用户系统，能自动从批处理或在线环境的系统故障中恢复运行。系统提供了一个完整的软件开发工具Developer2000，包括交互式应用程序生成器、报表打印软件、字处理软件以及集中式数据字典，用户可以利用这些工具生成自己的应用程序。Orcale以二维表的形式表示数据，并提供了SQL(结构式查询语言)，可完成数据查询、操作、定义和控制等基本数据库管理功能。Orcale具有很好的可移植性，通过它的通信功能，微型计算机上的程序可以同小型乃至大型计算机上的Orcale，并且能相互传递数据。另外Orcale还具有与C语言的接电子表格、图形处理等软件。 Orcale属于大型数据库系统，主要适用于大、中小型应用系统，或作为客户机/服务器系统中服务器端的数据库系统。</p><p>　　<strong>DB2数据库</strong></p><p>　　IBM公司研制的一种关系型数据库系统。DB2主要应用于大型应用系统，具有较好的可伸缩性，可支持从大型机到单用户环境，应用于OS/2、Windows等平台下。 DB2提供了高层次的数据利用性、完整性、安全性、可恢复性，以及小规模到大规模应用程序的执行能力，具有与平台无关的基本功能和SQL命令。DB2采用了数据分级技术，能够使大型机数据很方便地下载到LAN数据库服务器，使得客户机/服务器用户和基于LAN的应用程序可以访问大型机数据，并使数据库本地化及远程连接透明化。 它以拥有一个非常完备的查询优化器而著称，其外部连接改善了查询性能，并支持多任务并行查询。 DB2具有很好的网络支持能力，每个子系统可以连接十几万个分布式用户，可同时激活上千个活动线程，对大型分布式应用系统尤为适用。 </p><p>　　<strong>SQL Server数据库</strong></p><p>　　Microsoft公司推出的一种关系型数据库系统。SQLServer是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统，实现了与WindowsNT的有机结合，提供了基于事务的企业级信息管理系统方案。 </p><p>　　其主要特点如下：</p><p>　　(1)高性能设计，可充分利用Windows的优势。 </p><p>　　(2)系统管理先进，支持Windows图形化管理工具，支持本地和远程的系统管理和配置。 </p><p>　　(3)强壮的事务处理功能，采用各种方法保证数据的完整性。</p><p>　　(4)支持对称多处理器结构、存储过程、ODBC，并具有自主的SQL语言。 SQLServer以其内置的数据复制功能、强大的管理工具、与Internet的紧密集成和开放的系统结构为广大的用户、开发人员和系统集成商提供了一个出众的数据库平台。</p><p>　　<strong>Sybase数据库</strong></p><p>　　美国Sybase公司研制的一种关系型数据库系统，是一种典型的UNIX或Windows平台上客户机/服务器环境下的大型数据库系统。 Sybase提供了一套应用程序编程接口和库，可以与非Sybase数据源及服务器集成，允许在多个数据库之间复制数据，适于创建多层应用。系统具有完备的触发器、存储过程、规则以及完整性定义，支持优化查询，具有较好的数据安全性。Sybase通常与SybaseSQLAnywhere用于客户机/服务器环境，前者作为服务器数据库，后者为客户机数据库，采用该公司研制的PowerBuilder为开发工具，在我国大中型系统中具有广泛的应用。美国Sybase公司研制的一种关系型数据库系统，是一种典型的UNIX或Windows平台上客户机/服务器环境下的大型数据库系统。 Sybase提供了一套应用程序编程接口和库，可以与非Sybase数据源及服务器集成，允许在多个数据库之间复制数据，适于创建多层应用。系统具有完备的触发器、存储过程、规则以及完整性定义，支持优化查询，具有较好的数据安全性。Sybase通常与SybaseSQLAnywhere用于客户机/服务器环境，前者作为服务器数据库，后者为客户机数据库，采用该公司研制的PowerBuilder为开发工具，在我国大中型系统中具有广泛的应用。 </p><p>　　<strong>FoxPro数据库</strong></p><p>　　最初由美国Fox公司1988年推出，1992年Fox公司被Microsoft公司收购后，相继推出了FoxPro2.5、2.6和VisualFoxPro等版本，其功能和性能有了较大的提高。 FoxPro2.5、2.6分为DOS和Windows两种版本，分别运行于DOS和Windows环境下。FoxPro比FoxBASE在功能和性能上又有了很大的改进，主要是引入了窗口、按纽、列表框和文本框等控件，进一步提高了系统的开发能力。</p><img src ="http://www.cppblog.com/Lee/aggbug/71279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2009-01-06 05:57 <a href="http://www.cppblog.com/Lee/archive/2009/01/06/71279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>_stdcall 与_cdecl 的区别</title><link>http://www.cppblog.com/Lee/archive/2008/12/12/69237.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Fri, 12 Dec 2008 01:37:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/12/12/69237.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/69237.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/12/12/69237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/69237.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/69237.html</trackback:ping><description><![CDATA[
		<div class="content" id="fontzoom">
				<p>
				</p>
				<p>_stdcall 与 _cdecl 的区别<br />几乎我们写的每一个WINDOWS API函数都是__stdcall类型的，首先，需要了解两者之间的区别： WINDOWS的函数调用时需要用到栈（STACK，一种先入后出的存储结构）。当函数调用完成后，栈需要清除，这里就是问题的关键，如何清除？？如果我们的函数使用了_cdecl，那么栈的清除工作是由调用者，用COM的术语来讲就是客户来完成的。这样带来了一个棘手的问题，不同的编译器产生栈的方式不尽相同，那么调用者能否正常的完成清除工作呢？答案是不能。如果使用__stdcall，上面的问题就解决了，函数自己解决清除工作。所以，在跨（开发）平台的调用中，我们都使用__stdcall（虽然有时是以WINAPI的样子出现）。那么为什么还需要_cdecl呢？当我们遇到这样的函数如fprintf()它的参数是可变的，不定长的，被调用者事先无法知道参数的长度，事后的清除工作也无法正常的进行，因此，这种情况我们只能使用_cdecl。到这里我们有一个结论，如果你的程序中没有涉及可变参数，最好使用__stdcall关键字。<br /> <br />另：<br />_cdecl<br />按从右至左的顺序压参数入栈，由调用者把参数弹出栈。对于“C”函数或者变量，修饰名是在函数名前加下划线。对于“C++”函数，有所不同。<br />如函数void test(void)的修饰名是_test；对于不属于一个类的“C++”全局函数，修饰名是<a href="mailto:?test@@ZAXXZ"><u>?test@@ZAXXZ</u></a>。<br />这是MFC缺省调用约定。由于是调用者负责把参数弹出栈，所以可以给函数定义个数不定的参数，如printf函数。</p>
				<p>stdcall 和pascal一样,都是pascal的调用习惯<br />按从右至左的顺序压参数入栈，由被调用者把参数弹出栈。对于“C”函数或者变量，修饰名以下划线为前缀，然后是函数名，然后是符号“@”及参数的字节数，如函数int func(int a, double b)的修饰名是<a href="mailto:_func@12"><u>_func@12</u></a>。对于“C++”函数，则有所不同。</p>
				<p>
				</p>
		</div>
<img src ="http://www.cppblog.com/Lee/aggbug/69237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-12-12 09:37 <a href="http://www.cppblog.com/Lee/archive/2008/12/12/69237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汇编语言的准备知识--给初次接触汇编者(1)</title><link>http://www.cppblog.com/Lee/archive/2008/11/04/65960.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Tue, 04 Nov 2008 12:48:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/11/04/65960.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/65960.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/11/04/65960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/65960.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/65960.html</trackback:ping><description><![CDATA[
		<font size="4">汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机) ============================ x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx. 在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处: 1. 通用寄存器: EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途) 这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数. 这4个寄存器的低16位可以被单独访问,分别用AX,BX,CX和DX. AX又可以单独访问低8位(AL)和高8位(AH), BX,CX,DX也类似. 函数的返回值经常被放在EAX中. ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串. EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码: push ebp ;保存当前ebp mov ebp,esp ;EBP设为当前堆栈指针 sub esp, xxx ;预留xxx字节给函数临时变量. ... 这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可. ESP 专门用作堆栈指针. 2. 段寄存器: CS(Code Segment，代码段) 指定当前执行的代码段. EIP (Instruction pointer, 指令指针)则指向该段中一个具体的指令. CS:EIP指向哪个指令, CPU 就执行它. 一般只能用jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值. DS(DATA SEGMENT, 数据段) 指定一个数据段. 注意:在当前的计算机系统中, 代码和数据没有本质差别, 都是一串二进制数, 区别只在于你如何用它. 例如, CS 制定的段总是被用作代码, 一般不能通过CS指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段描述符"别名"而通过DS来访问/修改. 自修改代码的程序常如此做. ES,FS,GS 是辅助的段寄存器, 指定附加的数据段. SS(STACK SEGMENT)指定当前堆栈段. ESP 则指出该段中当前的堆栈顶. 所有push/pop 系列指令都只对SS:ESP指出的地址进行操作. 3. 标志寄存器(EFLAGS): 该寄存器有32位,组合了各个系统标志. EFLAGS一般不作为整体访问, 而只对单一的标志位感兴趣. 常用的标志有: 进位标志C(CARRY), 在加法产生进位或减法有借位时置1, 否则为0. 零标志Z(ZERO), 若运算结果为0则置1, 否则为0 符号位S(SIGN), 若运算结果的最高位置1, 则该位也置1. 溢出标志O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置1. JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多JXX 指令是等价的, 对应相同的机器码. 例如, JE 和JZ 是一样的,都是当Z=1是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作. JXX 后面的"XX" 有如下字母: 无符号操作: 带符号操作: A = "ABOVE", 表示"高于" G = "GREATER", 表示"大于" B = "BELOW", 表示"低于" L = "LESS", 表示"小于" C = "CARRY", 表示"进位"或"借位" O = "OVERFLOW", 表示"溢出" S = "SIGN", 表示"负" 通用符号: E = "EQUAL" 表示"等于", 等价于Z (ZERO) N = "NOT" 表示"非", 即标志没有置位. 如JNZ "如果Z没有置位则跳转" Z = "ZERO", 与E同. 如果仔细想一想,就会发现 JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, .... 4. 端口 端口是直接和外部设备通讯的地方。外设接入系统后，系统就会把外设的数据接口映射到特定的端口地址空间，这样，从该端口读入数据就是从外设读入数据，而向外设写入数据就是向端口写入数据。当然这一切都必须遵循外设的工作方式。端口的地址空间与内存地址空间无关，系统总共提供对64K个8位端口的访问，编号0-65535. 相邻的8位端口可以组成成一个16位端口，相邻的16位端口可以组成一个32位端口。端口输入输出由指令IN,OUT,INS和OUTS实现，具体可参考汇编语言书籍。 <img height="1" src="http://www.ddvip.net/program/masm/down_info.asp?id=218" width="1" /><br /><!-- 2 --></font>
<img src ="http://www.cppblog.com/Lee/aggbug/65960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-11-04 20:48 <a href="http://www.cppblog.com/Lee/archive/2008/11/04/65960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《发如雪》之程序员版</title><link>http://www.cppblog.com/Lee/archive/2008/09/17/62108.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Wed, 17 Sep 2008 14:33:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/09/17/62108.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/62108.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/09/17/62108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/62108.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/62108.html</trackback:ping><description><![CDATA[头文件， <br />处理憔悴， <br />编译器， <br />报错如风雪。 <br />是谁混淆基本类， <br />惹变量是非。 <br /> <br />虚基类， <br />构造轮回， <br />动态堆， <br />字符串唤不回。 <br />纵然代码已经成灰， <br />内存不灭。 <br /> <br />循环如三千东流水， <br />我嵌套一瓢爱了解， <br />只恋函数的递归。 <br /> <br />你发如雪， <br />定义了离别， <br />我指针指向了谁， <br /> <br />邀明月， <br />让地址皎洁， <br />爱在数组里倾颓。 <br /> <br />你发如雪， <br />初始化眼泪， <br />我联编继承了谁， <br />数据醉， <br />编程的岁月， <br />我用后悔， <br />刻电脑崩溃的碑。 <br /> <br />啦儿啦 啦儿啦 啦儿啦儿啦 <br />啦儿啦 啦儿啦 啦儿啦儿啦 <br /> <br />去约会她斜扎儿马尾只因为学C++学到了崩溃<img src ="http://www.cppblog.com/Lee/aggbug/62108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-09-17 22:33 <a href="http://www.cppblog.com/Lee/archive/2008/09/17/62108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件工程 (转自百度百科)</title><link>http://www.cppblog.com/Lee/archive/2008/09/11/61635.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Thu, 11 Sep 2008 14:02:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/09/11/61635.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/61635.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/09/11/61635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/61635.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/61635.html</trackback:ping><description><![CDATA[
		<span class="t1">
				<a name="1">
				</a>
				<strong>软件工程概述<br />软件工程 </strong>(<strong>Software Engineering</strong>，简称为<strong>SE</strong>)是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言，数据库，软件开发工具，系统平台，标准，设计模式等方面。<br /><br />在现代社会中，软件应用于多个方面。典型的软件比如有电子邮件，嵌入式系统，人机界面，办公套件，操作系统，编译器，数据库，游戏等。同时，各个行业几乎都有计算机软件的应用，比如工业，农业，银行，航空，政府部门等。这些应用促进了经济和社会的发展，使得人们的工作更加高效，同时提高了生活质量。<br /><br /><strong>软件工程师</strong>是对应用软件创造软件的人们的统称，软件工程师按照所处的领域不同可以分为系统分析员，软件设计师，系统架构师，程序员，测试员等等。人们也常常用程序员来泛指各种软件工程师。<br /><br /><strong>软件工程的主要课程</strong>：<br />外语、<a href="http://baike.baidu.com/view/14041.htm" target="_blank"><font color="#002c99">高等数学</font></a>、<a href="http://baike.baidu.com/view/32243.htm" target="_blank"><font color="#002c99">线性代数</font></a>、高等代数、电子技术基础、离散数学、计算机引论（C语言）、数据结构、C++程序设计、汇编语言程序设计、算法设计与分析、计算机组成原理与体系结构、数据库系统、计算机网络、软件工程、软件测试技术、软件需求与项目管理、软件设计实例分析、CMM/ISO9000等。<br /><br />软件工程(SoftWare Engineering)的框架可概括为：目标、过程和原则。<br />(1)软件工程目标：生产具有正确性、可用性以及开销合宜的产品。正确性指软件产品达到预期功能的程度。可用性指软件基本结构、实现及文档为用户可用的程度。开销合宜是指软件开发、运行的整个开销满足用户要求的程度。这些目标的实现不论在理论上还是在实践中均存在很多待解决的问题，它们形成了对过程、过程模型及工程方法选取的约束。<br />(2)软件工程过程：生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义，又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构，包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明，包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程，实现完成后的确认，保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。伴随以上过程，还有管理过程、支持过程、培训过程等。<br />(3)软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则。<br /><br /><span class="t1"><a name="2"></a><strong>软件工程的定义<br />软件工程</strong>一直以来都缺乏一个统一的定义，很多学者、组织机构都分别给出了自己的定义：<br /><br /><strong>（1）。Barry Boehm</strong>：运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。 <br /><br /><strong>（2）。IEEE在软件工程术语汇编中的定义</strong>：软件工程是：1.将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护，即将工程化应用于软件；2.在1中所述方法的研究<br /><br /><strong>（3）。Fritz Bauer在NATO会议上给出的定义：</strong>建立并使用完善的工程化原则，以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。<br />目前比较认可的一种定义认为：软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件，以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。<br /><br /><strong>（4）。《计算机科学技术百科全书》中的定义：</strong>软件工程是应用计算机科学、数学及管理科学等原理，开发软件的工程。软件工程借鉴传统工程的原则、方法，以提高质量、降低成本。其中，计算机科学、数学用于构建模型与算法，工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡，管理科学用于计划、资源、质量、成本等管理。<br /><br /><span class="t1"><a name="3"></a><strong>软件工程学的内容<br /></strong></span>　　软件工程学的主要内容是软件开发技术和软件工程管理．<br />　　软件开发技术包含软件工程方法学、<a href="http://baike.baidu.com/view/182339.htm" target="_blank"><font color="#002c99">软件工具</font></a>和<a href="http://baike.baidu.com/view/127400.htm" target="_blank"><font color="#002c99">软件开发环境</font></a>；软件工程管理学包含软件工程经济学和软件管理学。<br /><br /><span class="t1"><a name="4"></a><strong>软件工程基本原理<br /></strong>著名软件工程专家<strong>B.Boehm</strong>综合有关专家和学者的意见并总结了多年来开发软件的经验，于1983年在一篇论文中提出了软件工程的七条基本原理。<a href="http://imgsrc.baidu.com/baike/pic/item/966aca070e8274d57b8947b5.jpg" target="_blank"><img class="editorImg" title="Boehm" style="FLOAT: right" src="http://imgsrc.baidu.com/baike/abpic/item/966aca070e8274d57b8947b5.jpg" /></a><br />（1）用分阶段的生存周期计划进行严格的管理。<br />（2）坚持进行阶段评审。<br />（3）实行严格的产品控制。<br />（4）采用现代程序设计技术。<br />（5）软件工程结果应能清楚地审查。<br />（6）开发小组的人员应该少而精。<br />（7）承认不断改进软件工程实践的必要性。<br /><strong>B.Boehm</strong>指出，遵循前六条基本原理，能够实现软件的工程化生产；按照第七条原理，不仅要积极主动地采纳新的软件技术，而且要注意不断总结经验。<br /><strong>软件工程(SoftWare Engineering)的框架可概括为：目标、过程和原则。<br /></strong>　　(1)软件工程目标：生产具有正确性、可用性以及开销合宜的产品。正确性指软件产品达到预期功能的程度。可用性指软件基本结构、实现及文档为用户可用的程度。开销合宜是指软件开发、运行的整个开销满足用户要求的程度。这些目标的实现不论在理论上还是在实践中均存在很多待解决的问题，它们形成了对过程、过程模型及工程方法选取的约束。<br />　　(2)软件工程过程：生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义，又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构，包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明，包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程，实现完成后的确认，保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。伴随以上过程，还有管理过程、支持过程、培训过程等。<br />　　(3)软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则<br /><br /><span class="t1"><a name="6"></a><strong>软件工程必须遵循什么原则<br /></strong>围绕工程设计、工程支持以及工程管理已提出了以下四条基本原则：<br /><br />(1)选取适宜的开发模型<br /><br />该原则与系统设计有关。在系统设计中，软件需求、硬件需求以及其它因素间是相互制约和影响的，经常需要权衡。因此，必需认识需求定义的易变性，采用适当的开发模型，保证软件产品满足用户的要求。<br /><br />(2)采用合适的设计方法<br /><br />在软件设计中，通常需要考虑软件的模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。合适的设计方法有助于这些特征的实现，以达到软件工程的目标。<br /><br />(3)提供高质量的工程支撑<br /><br />工欲善其事，必先利其器。在软件工程中，软件工具与环境对软件过程的支持颇为重要。软件工程项目的质量与开销直接取决于对软件工程所提供的支撑质量和效用。<br /><br />(4)重视软件工程的管理<br /><br />　　软件工程的管理直接影响可用资源的有效利用，生产满足目标的软件产品以及提高软件组织的生产能力等问题。因此，仅当软件过程予以有效管理时，才能实现有效的软件工程。<br /><br /><br />　　软件工程是指导计算机软件开发和维护的工程学科。<br /><br />　　采用工程的概念、原理、 技术和方法来开发与维护软件，把经过时间考验而证明正确的管理技术和当前能够 得到的最好的技术方法结合起来，这就是软件工程。<br /><br />　　软件工程强调使用生存周期方法学和各种结构分析及结构设计技术。它们是在七十年代为了对付应用软件日益增长的复杂程度、漫长的开发周期以及用户对软件产品经常不满意的状况而发展起来的。人类解决复杂问题时普遍采用的一个策略就是“各个击破”，也就是对问题进行分解然后再分别解决各个子问题的策略。软件工程采用的生存周期方法学就是从时间角度对软件开发和维护的复杂问题进行分解，把软件生存的漫长周期依次划分为若干个阶段，每个阶段有相对独立的任务，然后逐步完成每个阶段的任务。采用软件工程方法论开发软件的时候，从对任务的抽象逻辑分析开始，一个阶段一个阶段地进行开发。前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础，而后一阶段任务的完成通常是使前一阶段提出的解法更进一步具体化，加进了更多的物理细节。每一个阶段的开始和结束都有严格标准，对于任何两个相邻的阶段而言，前一阶段的结束标准就是后一阶段的开始标准。在每一个阶段结束之前都必须进行正式严格的技术审查和管理复审，从技术和管理两方面对这个阶段的开发成果进行检查，通过之后这个阶段才算结束；如果检查通不过，则必须进行必要的返工，并且返工后还要再经过审查。审查的一条主要标准就是每个阶段都应该交出“最新式的”（即和所开发的软件完全一致的）高质量的文档资料，从而保证在软件开发工程结束时有一个完整准确的软件配置交付使用。文档是通信的工具，它们清楚准确地说明了到这个时候为止，关于该项工程已经知道了什么，同时确立了下一步工作的基础。此外，文档也起备忘录的作用，如果文档不完整，那么一定是某些工作忘记做了，在进入生存周期的下一阶段之前，必须补足这些遗漏的细节。在完成生存周期每个阶段的任务时，应该采用适合该阶段任务特点的系统化的技术方法──结构分析或结构设计技术。<br /><br />　　把软件生存周期划分成若干个阶段，每个阶段的任务相对独立，而且比较简单，便于不同人员分工协作，从而降低了整个软件开发工程的困难程度；在软件生存周期的每个阶段都采用科学的管理技术和良好的技术方法，而且在每个阶段结束之前都从技术和管理两个角度进行严格的审查，合格之后才开始下一阶段的工作，这就使软件开发工程的全过程以一种有条不紊的方式进行，保证了软件的质量，特别是提高了软件的可维护性。总之，采用软件工程方法论可以大大提高软件开发的成功率，软件开发的生产率也能明显提高。<br /><br />　　目前划分软件生存周期阶段的方法有许多种，软件规模、种类、开发方式、开发环境以及开发时使用的方法论都影响软件生存周期阶段的划分。在划分软件生存周期的阶段时应该遵循的一条基本原则就是使各阶段的任务彼此间尽可能相对独立，同一阶段各项任务的性质尽可能相同，从而降低每个阶段任务的复杂程度，简化不同阶段之间的联系，有利于软件开发工程的组织管理。一般说来，软件生存周期由软件定义、软件开发和软件维护三个时期组成，每个时期又进一步划分成若干个阶段。下面的论述主要针对应用软件，对系统软件也基本适用。<br /><br />　　软件定义时期的任务是确定软件开发工程必须完成的总目标；确定工程的可行性，导出实现工程目标应该采用的策略及系统必须完成的功能；估计完成该项工程需要的资源和成本，并且制定工程进度表。这个时期的工作通常又称为系统分析，由系统分析员负责完成。软件定义时期通常进一步划分成三个阶段，即问题定义、可行性研究和需求分析。<br /><br />　　开发时期具体设计和实现在前一个时期定义的软件，它通常由下述四个阶段组成：总体设计，详细设计，编码和单元测试，综合测试。<br /><br />　　维护时期的主要任务是使软件持久地满足用户的需要。具体地说，当软件在使用过程中发现错误时应该加以改正；当环境改变时应该修改软件以适应新的环境；当用户有新要求时应该及时改进软件满足用户的新需要。通常对维护时期不再进一步划分阶段，但是每一次维护活动本质上都是一次压缩和简化了的定义和开发过程。<br /><br /><br /><strong>下面扼要介绍软件生存周期每个阶段的基本任务和结束标准。 <br /></strong></span><strong>１问题定义 </strong><a href="http://imgsrc.baidu.com/baike/pic/item/b3ba5d16fca9dd5220a4e981.jpg" target="_blank"><strong><img class="editorImg" title="" style="FLOAT: right" src="http://imgsrc.baidu.com/baike/abpic/item/b3ba5d16fca9dd5220a4e981.jpg" /></strong></a><br /><br />　　问题定义阶段必须回答的关键问题：“要解决的问题是什么？”如果不知道问题是什么就试图解决这个问题，显然是盲目的，只会白白浪费时间和金钱，最终得出的结果很可能是毫无意义的。尽管确切地定义问题的必要性是十分明显的，但是在实践中它却可能是最容易被忽视的一个步骤。<br /><br />　　通过问题定义阶段的工作，系统分析员应该提出关于问题性质、工程目标和规模的书面报告。通过对系统的实际用户和使用部门负责人的访问调查，分析员扼要地写出他对问题的理解，并在用户和使用部门负责人的会议上认真讨论这份书面报告，澄清含糊不精的地方，改正理解不正确的地方，最后得出一份双方都满意的文档。<br /><br />　　问题定义阶段是软件生存周期中最简短的阶段，一般只需要一天甚至更少的时间。<br /><br /><b>２可行性研究 </b><br /><br />　　这个阶段要回答的关键问题：“对于上一个阶段所确定的问题有行得通的解决办法吗？”为了回答这个问题，系统分析员需要进行一次大大压缩和简化了的系统分析和设计的过程，也就是在较抽象的高层次上进行的分析和设计的过程。<br /><br />　　可行性研究应该比较简短，这个阶段的任务不是具体解决问题，而是研究问题的范围，探索这个问题是否值得去解，是否有可行的解决办法。<br /><br />　　在问题定义阶段提出的对工程目标和规模的报告通常比较含糊。可行性研究阶段应该导出系统的高层逻辑模型（通常用数据流图表示），并且在此基础上更准确、更具体地确定工程规模和目标。然后分析员更准确地估计系统的成本和效益，对建议的系统进行仔细的成本／效益分析是这个阶段的主要任务之一。<br /><br />　　可行性研究的结果是使用部门负责人做出是否继续进行这项工程的决定的重要依据，一般说来，只有投资可能取得较大效益的那些工程项目才值得继续进行下去。可行性研究以后的那些阶段将需要投入要多的人力物力。及时中止不值得投资的工程项目，可以避免更大的浪费。<br /><br /><b>３需求分析 </b><br /><br />　　这个阶段的任务仍然不是具体地解决问题，而是准确地确定“为了解决这个问题，目标系统必须做什么”，主要是确定目标系统必须具备哪些功能。<br /><br />　　用户了解他们所面对的问题，知道必须做什么，但是通常不能完整准确地表达出他们的要求，更不知道怎样利用计算机解决他们的问题；软件开发人员知道怎样使用软件实现人们的要求，但是对特定用户的具体要求并不完全清楚。因此系统分析员在需求分析阶段必须和用户密切配合，充分交流信息，以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法描述表示系统的逻辑模型。<br /><br />　　在需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础，因此必须准确完整地体现用户的要求。系统分析员通常都是计算机软件专家，技术专家一般都喜欢很快着手进行具体设计，然而，一旦分析员开始谈论程序设计的细节，就会脱离用户，使他们不能继续提出他们的要求和建议。较件工程使用的结构分析设计的方法为每个阶段都规定了特定的结束标准，需求分析阶段必须提供完整准确的系统逻辑模型，经过用户确认之后才能进入下一个阶段，这就可以有效地防止和克服急于着手进行具体设计的倾向。<br /><br /><b>４总体设计</b><br /><br />　　这个阶段必须回答的关键问题是：“概括地说，应该如何解决这个问题？”<br /><br />　　首先，应该考虑几种可能的解决方案。列如，目标系统的一些主要功能是用计算机自动完成还是用人工完成；如果使用计算机，那么是使用批处理方式还是人机交互方式；信息存储使用传统的文件系统还是数据库……。通常至少应该考虑下述几类可能的方案：<br /><br />　　低成本的解决方案。系统只能完成最必要的工作，不能多做一点额处的工作。<br /><br />　　中等成本的解决方案。这样的系统不仅能够很好地完成预定的任务，使用起来很方便，而且可能还具有用户没有具体指定的某些功能和特点。虽然用户没有提出这些具体要求，但是系统分析员根据自己的知识和经验断定，这些附加的能力在实践中将证明是很有价值的。<br /><br />　　高成本的“十全十美”的系统。这样的系统具有用户可能希望有的所有功能和特点。<br /><br />　　系统分析员应该使用系统流程图或其他工具描述每种可能的系统，估计每种方案的成本和效益，还应该在充分权衡各种方案的利弊的基础上,推荐一个较好的系统 (最佳方案),并且制定实现所推荐的系统的详细计划。如果用户接受分析员推荐的系统，则可以着手完成本阶段的另一项主要工作。<br /><br />　　上面的工作确定了解决问题的策略以及目标系统需要哪些程序，但是，怎样设计这些程序呢？结构设计的一条基本原理就是程序应该模块化，也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构，也就是确定程序由哪些模块组成以及模块间的关系。通常用层次图或结构图描绘软件的结构。<br /><br /><b>５详细设计</b><br /><br />　　总体设计阶段以比较抽象概括的方式提出了解决问题的办法。详细设计阶段的任务就是把解法具体化，也就是回答下面这个关键问题：“应该怎样具体地实现这个系统呢？”<br /><br />　　这个阶段的任务还不是编写程序，而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图，它们应该包含必要的细节，程序员可以根据它们写出实际的程序代码。<br /><br />　　通常用ＨＩＰＯ图（层次图加输入／处理／输出图）或ＰＤＬ语言（过程设计语言）描述详细设计的结果。<br /><br /><b>６编码和单元测试</b><br /><br />　　这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块。<br /><br />　　程序员应该根据目标系统的性质和实际环境，选取一种适当的高级程序设计语言（必要时用汇编语言），把说细设计的结果翻译成用选定的语言书写的程序，并且仔细测试编写出的每一个模块。<br /><br /><b>７综合测试</b><br /><br />　　这个阶段的关键任务是通过各种类型的测试（及相应的调试）使软件达到预定的要求。<br /><br />　　最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构，把经过单元测试检验的模块按某种选定的策略装配起来，在装配过程中对程序进行必要的测试。所谓验收测试则是按照规格说明书的规定（通常在需求分析阶段确定），由用户（或在用户积极参加下）对目标系统进行验收。<br /><br />　　必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。<br /><br />　　为了使用户能够积极参加验收测试，并且在系统投入生产性运行以后能够正确有效地使用这个系统，通常需要以正式的或非正式的方式对用户进行培训。<br /><br />　　通过对软件测试结果的分析可以预测软件的可靠性；反之，根据对软件可靠性的要求也可以决定测试和调试过程什么时候可以结束。<br /><br />　　应该用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来，做为软件配置的一个组成成分。<br /><br /><b>８软件维护</b><br /><br />　　维护阶段的关键任务是，通过各种必要的维护活动使系统持久地满足用户的需要。<br /><br />　　通常有四类维护活动：改正性维护，也就是诊断和改正在使用过程中发现的软件错误；适应性维护，即修改软件以适应环境的变化；完善性维护，即根据用户的要求改进或扩充软件使它更完善；预防性维护，即修改软件为将来的维护活动预先做准备。<br /><br />　　虽然没有把维护阶段进一步划分成更小的阶段，但是实际上每一项维护活动都应该经过提出维护要求（或报告问题），分析维护要求，提出维护要求，提出维护方案，审批维护方案，确定维护计划，修改软件设计，修改程序，测试程序，复查验收等一系列步骤，因此实质上是经历了一次压缩和简化了的软件定义和开发的全过程。<br /><br />　　都应该经过提出维护要求（或报告问题），分析维护要求，提出维护要求，提出维护方案，审批维护方案，确定维护计划，修改软件设计，修改程序，测试程序，复查验收等一系列步骤，因此实质上是经历了一次压缩和简化了的软件定义和开发的全过程。 <br /><b>软件开发模型</b><br />1.瀑布模型<br />瀑布模型是1970年<b>Winston Royce</b>提出的最早出现的软件开发模型。<br />2.渐增模型<br />3.演化模型<br />4.螺旋模型<br />5.<a href="http://baike.baidu.com/view/756139.htm" target="_blank"><font color="#002c99">喷泉模型</font></a><br />6.转换模型<br />7.<a href="http://baike.baidu.com/view/551042.htm" target="_blank"><font color="#002c99">智能模型</font></a><br /><br /></span><br /></span></span>
<img src ="http://www.cppblog.com/Lee/aggbug/61635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-09-11 22:02 <a href="http://www.cppblog.com/Lee/archive/2008/09/11/61635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>临界资源的概念（转自百度）</title><link>http://www.cppblog.com/Lee/archive/2008/09/10/61462.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Wed, 10 Sep 2008 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/09/10/61462.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/61462.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/09/10/61462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/61462.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/61462.html</trackback:ping><description><![CDATA[临界资源是指每次仅允许一个进程访问的资源。<br />属于临界资源有硬件打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。 <br />每个进程中访问临界资源的那段程序称为临界区（临界资源是一次仅允许一个进程使用的共享资源）。每次只准许一个进程进入临界区，进入后不允许其他进程进入。<img src ="http://www.cppblog.com/Lee/aggbug/61462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-09-10 10:28 <a href="http://www.cppblog.com/Lee/archive/2008/09/10/61462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 十二球升级版   称球问题的一般解法 (转)</title><link>http://www.cppblog.com/Lee/archive/2008/09/04/60870.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Wed, 03 Sep 2008 16:11:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/09/04/60870.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/60870.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/09/04/60870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/60870.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/60870.html</trackback:ping><description><![CDATA[
		<h2> </h2>
		<font face="宋体">    称球问题相信大家已经很熟悉了，并且已经知道从12个球中找出坏球并判断其轻重最多只需要3次称量。但如果把球数改变一下，比如说13个球，答案又是几次呢？本文将对这一问题进行“深入”分析。为了后面叙述方便，先在这里把一般化后的问题重复一下：</font>
		<p>
				<font face="宋体">    有m（m≥3）个球，记为q<sub>1</sub>、q<sub>2</sub>、…、q<sub>m</sub>，其中有且仅有一个坏球，其重量与其他的不同，现使用无砝码的天平进行称量，令n为称量次数，问：能确保找到坏球并指出它与好球的轻重关系的n的最小值是多少？</font>
		</p>
		<p>
				<font face="宋体">    先来看理论上要多少次。每次称量有左边轻、平衡和右边轻共3种可能的情况，而坏球的可能结果有q<sub>1</sub>轻、q<sub>1</sub>重、q<sub>2</sub>轻、q<sub>2</sub>重、…、q<sub>m</sub>轻、q<sub>m</sub>重等共2m种。因此，根据商农的信息论，此问题的熵就是需要的称量次数，又因为n是整数，所以有：<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-01.gif" border="0" /></font>
		</p>
		<p>
				<font face="宋体">    不过理论终归是理论，直接拿到现实生活中往往行不通。一个很简单的情况：4个球，上面的公式说2次称量就够了。但你可以想想办法，反正我是没找到两次解决问题的方案。 </font>
		</p>
		<p>
				<font face="宋体">    那，是理论错了吗？唔，我可不敢怀疑商农，我只敢怀疑我自己。来看看我们错在哪了吧。对4个球的情况，第一次称量只有两个可选的方案：方案1：q<sub>1</sub>放左盘，q<sub>2</sub>放右盘。若不平衡（由于对称性，只分析左边轻的情况，下同），则可能的结果还剩q<sub>1</sub>轻和q<sub>2</sub>重，再称一次就能找到坏球；若平衡，则可能的结果还剩q<sub>3</sub>轻、q<sub>3</sub>重、q<sub>4</sub>轻和q<sub>4</sub>重4个，再套用一下商农的定理，此时还要称<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-02.gif" border="0" />次。所以方案1被否决。方案2：q<sub>1</sub>、q<sub>2</sub>放左盘，q<sub>3</sub>、q<sub>4</sub>放右盘。此时天平肯定不会平衡，称量后，可能的结果有q<sub>1</sub>轻、q<sub>2</sub>轻、q<sub>3</sub>重和q<sub>4</sub>重4个。同样的道理，方案2也难逃被否决的命运。</font>
		</p>
		<p>
				<font face="宋体">    在4个球这么简单的情况下就撞得满头是包，未免让人难以接受，总结一下经验教训吧，把上面的分析归纳一下并推广到一般情况，就是：整个称量过程中，要达到目的，倒数第k次称量前的可能结果数h，必须满足条件h≤3<sup>k</sup>。</font>
		</p>
		<p>
				<font face="宋体">    上面的得出的结论虽然不能让我们找到问题的答案，但却有助于我们确定每次称量的方案，特别是第一次如何做。假设我们计划的称量次数是n，第一次在左右两盘中各放x个球，则保证下面两个不等式同时成立是解决问题的必要条件：</font>
		</p>
		<p>
				<font face="宋体">    2(m-2x)≤3<sup>n-1</sup>  （平衡时）</font>
		</p>
		<p>
				<font face="宋体">    2x≤3<sup>n-1</sup> （不平衡时）</font>
		</p>
		<p>
				<font face="宋体">把这两个不等式稍加变换，就成了下面的样子：</font>
		</p>
		<p>
				<font face="宋体">
				</font>
		</p>
		<p>
				<font face="宋体">
						<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-03.gif" border="0" />
						<br />注意到x是整数，3n-1是奇数，2m是偶数，所以上面的不等式等价于：</font>
		</p>
		<p>
				<font face="宋体">
				</font>
		</p>
		<p>
				<font face="宋体">
						<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-04.gif" border="0" />
						<br />显然，在n一定的情况下，m越大，x的取值范围越小，而当x只能取值<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-05.gif" border="0" />时，m继续增大，就会导致n次称量找到坏球的计划破产。籍此，可以得出在n一定的情况下m的取值范围：<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-06.gif" border="0" />。发现了吗？现在m的最大值正好比我们最初的结果少了1。同时此结果也与前面提到的4个球的实际情况相符。</font>
		</p>
		<p>
				<font face="宋体">    但分析了半天，我们只证明了m不在取值范围内时，n次称量不能确保找到坏球。那m在取值范围内的时候，肯定能找到吗？答案是肯定的，不过马上证明它有点难，先来看两个简单一点的命题。</font>
		</p>
		<p>
				<font face="宋体">    命题1：有A、B两组球，球的个数分别为a、b，且0≤b-a≤1，已知这些球中有且仅有一个坏球，若它在A组中，则比正常球轻，在B组中则比正常球重。另有一个好球。先使用无砝码的天平称量，令<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-07.gif" border="0" />，则可以找到一个称量方案，使得最多经过n次称量，就可以找到坏球（此时肯定能指出它与好球的重量关系）。</font>
		</p>
		<p>
				<font face="宋体">    使用数学归纳法证明如下：</font>
		</p>
		<p>
				<font face="宋体">    ①当n=1时，a、b的取值可能有{0，1}、{1，1}、{1，2}三组，由于还有一个已知的好球，所以不难验证此时命题成立。<br />    ②假设当n=k时命题也成立。<br />    ③当n=k+1时。我们将A、B两组球分别尽量平均得分为三组，记为A1、A2、A3、B1、B2和B3。不影响一般性，假设这六组球按球数从少到多的排列次序也与前面的顺序一致，且A1有球a1个。则第一次称量时的称量方案与每组球个数的对应关系如下，其中需要注意的是：在带蓝色的两种情况下，必有<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-08.gif" border="0" />，否则就与命题的前提不符了。</font>
		</p>
		<p>
		</p>
		<table id="Table1" cellspacing="1" cellpadding="1" width="100%" border="1">
				<tbody>
						<tr>
								<td>
										<font face="宋体">A1</font>
								</td>
								<td>
										<font face="宋体">A2</font>
								</td>
								<td>
										<font face="宋体">A3</font>
								</td>
								<td>
										<font face="宋体">B1</font>
								</td>
								<td>
										<font face="宋体">B2</font>
								</td>
								<td>
										<font face="宋体">B3</font>
								</td>
								<td>
										<font face="宋体">称量方案</font>
								</td>
						</tr>
						<tr>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">A1、B1放左盘；A2、B2放右盘 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1+1</font>
								</td>
								<td>
										<font face="宋体">A1、B1放左盘；A2、B2放右盘 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1+1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1+1</font>
								</td>
								<td>
										<font face="宋体">A1、B3放左盘；A3、B1放右盘 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1+1</font>
								</td>
								<td>
										<font face="宋体">a1</font>
								</td>
								<td>
										<font face="宋体">a1+1</font>
								</td>
								<td>
										<font face="宋体">a1+1</font>
								</td>
								<td>
										<font face="宋体">A1、B2放左盘；A2、B3放右盘 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font face="宋体" color="#0000ff">a1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">A2、B2放左盘；A3、B3放右盘 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font face="宋体" color="#0000ff">a1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">a1+1</font>
								</td>
								<td>
										<font face="宋体" color="#0000ff">A2、B2放左盘；A3、B3放右盘</font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font face="宋体">很明显，不管结果是什么，第一次称量之后，问题都能转化为n=k时的情形。所以，命题1是真命题。</font>
		</p>
		<p>
				<font face="宋体">    前面已经证明<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-09.gif" border="0" />时，n次称量无法确保找到坏球并指出其轻重关系。但如果此时也有一个已知的好球的话，答案就不一样了，这时n次称量就已经足够（命题2）。仍使用数学归纳法。</font>
		</p>
		<p>
				<font face="宋体">    ①当n=2时，m=4，验证一下可知命题成立。 <br />    ②假设当n=k时命题也成立。 <br />    ③当n=k+1时。我们把这些球尽量平均的分成三组，则每组球的个数分别为：<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-10.gif" border="0" />、<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-10.gif" border="0" />、<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-11.gif" border="0" />。第一次称量时，第一组和那个好球放左盘，第三组放右盘。若平衡，问题转化为n=k时的情形，不平衡，问题转化为命题1的情形。命题成立。 </font>
		</p>
		<p>
				<font face="宋体">    有了前面两个证明作基础，最初的问题就很简单了，再次祭出数据学归纳法。由于m&lt;5时的情况有些特殊(考虑只有一个球或两个球的情况)，不能作为递推得依据，所以我们从n=3，也就是m=5开始。</font>
		</p>
		<p>
				<font face="宋体">    ①当n=3时，m在5和12之间（13的情况已经被排除在外），通过一一验证可知命题成立。 <br />    ②假设当n=k时命题也成立。 <br />    ③当n=k+1时，找到一个满足不等式<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-04.gif" border="0" />的x，在天平左右两盘中各放x个球。如果天平平衡，问题转化为n=k时的情形或命题2中的情形；不平衡，则转化为命题1的情形。命题成立。</font>
		</p>
		<p>
				<font face="宋体">    综上所述，称球问题的完整答案是：当球数<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-06.gif" border="0" />时，n次称量时就能确保找到坏球，并指出它与好球的轻重关系；当球数<img alt="" hspace="0" src="http://blog.vckbase.com/images/vckbase_com/localvar/701/o_ball-09.gif" border="0" />时，n次称量只能确保找到坏球，而无法指出它与好球的轻重关系。要想指出轻重关系，就可能需要多进行一次称量。但如果此时再有一个好球，就又可以把这次称量省掉了。 </font>
		</p>
<img src ="http://www.cppblog.com/Lee/aggbug/60870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-09-04 00:11 <a href="http://www.cppblog.com/Lee/archive/2008/09/04/60870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十二个球的称重问题（转）</title><link>http://www.cppblog.com/Lee/archive/2008/09/03/60864.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Wed, 03 Sep 2008 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/09/03/60864.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/60864.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/09/03/60864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/60864.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/60864.html</trackback:ping><description><![CDATA[
		<h4 id="subjcns!F7A152EB74B9576E!655" style="MARGIN-BOTTOM: 0px"> </h4>
		<div class="bvMsg" id="msgcns!F7A152EB74B9576E!655">
				<div>问题：有十二个小球特征相同，其中只有一个质量异常，要求用一部没有砝码的天平称三次，将那个质量异常的球找出来。</div>
				<div> </div>
				<div>众网友议论纷纷，都认为这是不可能实现的任务。</div>
				<div>然后有人给出了解答：</div>
				<div> </div>
				<div>将球分为3组，每组4个，任取两组称一次。若两边等重，则异常球在其余一组中，通过3个正常球和其余一组中3个称重，很容易就能找出异常球。<br />若两组不等重，假设A组重，B组轻。从A组取两个、B组取一个为甲组；取A组一个、B组1个，正常球一个为乙组，进行称重。<br />若两者相等，则异常球没有进入甲乙两组中，可能是A组剩余那个超重或是B组剩余的两个轻，将B组剩余的两个称重，若等重则A组剩余那个异常，否则两个中较轻的异常。<br />若甲组重，则甲组中的两个原A组的重或是乙组中原B组的轻，将A组那两个称重，若等重则乙组中原B组的球异常，否则A组中较重的为异常球。<br />若甲组轻，则甲组中原B组的轻或是乙组中原A组的重，任取一个与正常球对比即可找出异常球。 </div>
				<div> </div>
				<div>此人的分析更加精彩：</div>
				<div> </div>
				<div>从信息论来看，12个球一个重量异常，出现概率1/12；该球质量可能轻也可能重，那么出现概率为1/2。<br />那么要得到结果所需信息量为log2+log12。<br />称一次可能有轻、重、相等三种结果，信息量为log3。log24/log3&lt;3，三次应该能称出来。</div>
				<div> </div>
				<div>信息论运用到这种地步，实在是精辟啊。高人就是高人，赞！</div>
		</div>
<img src ="http://www.cppblog.com/Lee/aggbug/60864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-09-03 23:36 <a href="http://www.cppblog.com/Lee/archive/2008/09/03/60864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[VC++]编译，没有找到 mspdb80.dll 的解决办法 </title><link>http://www.cppblog.com/Lee/archive/2008/08/01/57720.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Fri, 01 Aug 2008 03:02:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/08/01/57720.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/57720.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/08/01/57720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/57720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/57720.html</trackback:ping><description><![CDATA[
		<div class="postTitle"> </div>    <span style="FONT-SIZE: 10pt">在cmd中键入cl执行编译（或lib）时会出现mspdb80.dll无法找到的情况，是因为VC\Bin\下没有“msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”这四个文件，直接从Common7\IDE\下复制这四个文件到VC\Bin\下即可解决。</span><img src ="http://www.cppblog.com/Lee/aggbug/57720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-08-01 11:02 <a href="http://www.cppblog.com/Lee/archive/2008/08/01/57720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>