﻿<?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++博客-编程小区-随笔分类-关于编程</title><link>http://www.cppblog.com/3522021224/category/4434.html</link><description>我们的目标--中国IT精英
大家加油
我自己也加油,嘿嘿
</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 13:34:15 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 13:34:15 GMT</pubDate><ttl>60</ttl><item><title>COM组件简介</title><link>http://www.cppblog.com/3522021224/archive/2007/06/22/26803.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Thu, 21 Jun 2007 17:15:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/22/26803.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26803.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/22/26803.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26803.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26803.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 面向对象的思想难以适应这种分布式软件模型，于是组件化程序设计思想得到了迅速的发展。<br><br>按照组件化的程序设计的思想，复杂的应用程序被设计成一些小的，功能单一的组件模块，这些组件模块可以运行在同一台机器上，也可以运行在不同的机器上。<br><br>&nbsp;&nbsp;<a href='http://www.cppblog.com/3522021224/archive/2007/06/22/26803.html'>阅读全文</a><img src ="http://www.cppblog.com/3522021224/aggbug/26803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-22 01:15 <a href="http://www.cppblog.com/3522021224/archive/2007/06/22/26803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>贪心算法精讲</title><link>http://www.cppblog.com/3522021224/archive/2007/06/16/26429.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Sat, 16 Jun 2007 03:40:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/16/26429.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26429.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/16/26429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26429.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26429.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 很详细,很精细的贪心&nbsp;&nbsp;<a href='http://www.cppblog.com/3522021224/archive/2007/06/16/26429.html'>阅读全文</a><img src ="http://www.cppblog.com/3522021224/aggbug/26429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-16 11:40 <a href="http://www.cppblog.com/3522021224/archive/2007/06/16/26429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACM大量习题题库</title><link>http://www.cppblog.com/3522021224/archive/2007/06/14/26292.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Wed, 13 Jun 2007 17:08:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/14/26292.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26292.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/14/26292.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26292.html</trackback:ping><description><![CDATA[现在网上有许多题库，大多是可以在线评测，所以叫做Online Judge。除了USACO是为IOI准备外，其余几乎全部是大学的ACM竞赛题库。 <br><br>USACO <br><br><a href="http://ace.delos.com/usacogate" target=_blank><u><font color=#0000ff>http://ace.delos.com/usacogate</font></u></a> <br><br>美国著名在线题库，专门为信息学竞赛选手准备 <br><br><br><br>TJU <br><br><a href="http://acm.tongji.edu.cn/" target=_blank><u><font color=#800080>http://acm.tongji.edu.cn/</font></u></a> <br><br>同济大学在线题库，唯一的中文题库，适合NOIP选手 <br><br><br><br>ZJU <br><br><a href="http://acm.zju.edu.cn/" target=_blank><u><font color=#800080>http://acm.zju.edu.cn/</font></u></a> <br><br>浙江大学在线题库 <br><br><br><br>JLU <br><br><a href="http://acm.jlu.edu.cn/" target=_blank><u><font color=#0000ff>http://acm.jlu.edu.cn/</font></u></a> <br><br>吉林大学在线题库（一直上不去） <br><br><br><br>PKU <br><br><a href="http://acm.pku.edu.cn/" target=_blank><u><font color=#800080>http://acm.pku.edu.cn</font></u></a> <br><br>北京大学在线题库 <br><br><br><br>URAL <br><br><a href="http://acm.timus.ru/" target=_blank><u><font color=#0000ff>http://acm.timus.ru</font></u></a> <br><br>俄罗斯乌拉尔大学在线题库 <br><br><br><br>SGU <br><br><a href="http://acm.sgu.ru/" target=_blank><u><font color=#0000ff>http://acm.sgu.ru/</font></u></a> <br><br>俄罗斯圣萨拉托夫州大学在线题库 <br><br><br><br>ELJ <br><br><a href="http://acm.mipt.ru/judge/bin/problems.pl?lang=en" target=_blank><u><font color=#0000ff>http://acm.mipt.ru/judge/bin/problems.pl?lang=en</font></u></a> <br><br>俄罗斯莫斯科物理技术学院 <br><br><br><br>SPOJ <br><br>https://spoj.sphere.pl/ <br><br>波兰格但斯克理工大学 <br><br><br><br>UVA <br><br><a href="http://acm.uva.es/" target=_blank><u><font color=#0000ff>http://acm.uva.es/</font></u></a> <br><br>西班牙的Universidad de Valladolid在线题 
<img src ="http://www.cppblog.com/3522021224/aggbug/26292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-14 01:08 <a href="http://www.cppblog.com/3522021224/archive/2007/06/14/26292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC调试进阶(3)--调试COM对象 </title><link>http://www.cppblog.com/3522021224/archive/2007/06/13/26242.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Wed, 13 Jun 2007 04:32:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/13/26242.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26242.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/13/26242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26242.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26242.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 调试进阶(3)&nbsp;&nbsp;<a href='http://www.cppblog.com/3522021224/archive/2007/06/13/26242.html'>阅读全文</a><img src ="http://www.cppblog.com/3522021224/aggbug/26242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-13 12:32 <a href="http://www.cppblog.com/3522021224/archive/2007/06/13/26242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACM联系建议</title><link>http://www.cppblog.com/3522021224/archive/2007/06/13/26222.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Tue, 12 Jun 2007 16:47:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/13/26222.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26222.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/13/26222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26222.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26222.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ACM练习的建议...................&nbsp;&nbsp;<a href='http://www.cppblog.com/3522021224/archive/2007/06/13/26222.html'>阅读全文</a><img src ="http://www.cppblog.com/3522021224/aggbug/26222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-13 00:47 <a href="http://www.cppblog.com/3522021224/archive/2007/06/13/26222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC调试进阶(2)--多个exe </title><link>http://www.cppblog.com/3522021224/archive/2007/06/12/26213.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Tue, 12 Jun 2007 14:31:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/12/26213.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26213.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/12/26213.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26213.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/3522021224/archive/2007/06/12/26213.html'>阅读全文</a><img src ="http://www.cppblog.com/3522021224/aggbug/26213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-12 22:31 <a href="http://www.cppblog.com/3522021224/archive/2007/06/12/26213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC调试进阶(1)</title><link>http://www.cppblog.com/3522021224/archive/2007/06/12/26145.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Tue, 12 Jun 2007 05:54:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/12/26145.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26145.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/12/26145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26145.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26145.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 调试进阶................&nbsp;&nbsp;<a href='http://www.cppblog.com/3522021224/archive/2007/06/12/26145.html'>阅读全文</a><img src ="http://www.cppblog.com/3522021224/aggbug/26145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-12 13:54 <a href="http://www.cppblog.com/3522021224/archive/2007/06/12/26145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保证你现在和未来不失业的十种关键技术</title><link>http://www.cppblog.com/3522021224/archive/2007/06/12/26143.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Tue, 12 Jun 2007 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/12/26143.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26143.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/12/26143.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26143.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26143.html</trackback:ping><description><![CDATA[<p>在当今的IT就业市场，有人欢喜有人忧。有人对目前的工作和薪水很满意，有人目前正面临着下岗，或者已经下岗&#8230;&#8230;<br>可能你是公司里唯一谙熟某项关键技术的高手，缺了你，公司便玩不转了；也可能你所在的公司对你现有的专业技能高枕无忧，认为你在任期内足以胜任公司给你的开发任务（当然就不会再花银子去培训你啦）。<br>不要告诉我你们公司对原来用VB3开发的业务处理系统很满意，而你呢，也认为自己除了用C语言开发程序以外，不会再去做别的什么事情。<br>你是不是对.NET和Java为争夺开发工具市场撕破脸皮而熟视无睹，你是不是对XML将要取代关系数据库而无动于衷以及不屑一顾。你是不是认为你能用汇编或C开发任何东西，所以觉得其它开发工具都不再重要&#8230;&#8230;<br>如果真是这样，那么你离失业的日子不远了，<br>俗话说--未雨绸缪&#8230;&#8230; </p>
<p>想一想如果你现在失业没有工作会怎么样， <br>想一想现在还有如此之多的弟兄们为了找一个饭碗而四处奔波。 <br>想一想如果现在你们公司为了抢占市场，突然要进行技术转向，你该怎么办？ <br>想一想你现在为了自己的前途，突然需要改变技术领域，你该怎么办？或者你不满足于现在自己的知识结构，想要再充实一下，但又不知选择那些内容来学习。那么继续往下看，并一起参加讨论吧，相信会有收获的。 <br>在人才招聘市场，人事经理们关注的是实际技能，要求现在和将来从事开发工作所需要的实际技能。作为一个技术开发人员，自己的知识结构是就业和保持自身岗位的关键。此外还有一点也很重要，那就是即便你不再从事或者寻求实际的开发工作，也必须尽可能多地了解和熟悉当今你所从事的领域中最前沿的技术和信息，只有这样才能跟上技术发展的步伐。以便使自己始终处于不败之地。<br>本文列出了当今计算机软件开发和应用领域最重要十种关键技术排名，如果你想保证你现在以及未来的几年不失业，那么你最好跟上这些技术的发展。虽然你不必对这十种技术样样精通，但至少应该对它们非常熟悉。</p>
<p>一、XML<br>在十种技术中，最重要的一种技术我想应该非XML莫属。这里不仅仅指XML规范本身，还包括一系列有关的基于XML的语言：主要有XHTML，XSLT，XSL，DTDs，XML Schema（XSD），XPath，XQuery和SOAP。如果你现在还对XML一无所知，那么赶快狂补吧。XML是包含类似于HTML标签的一个文本文件，在这个文件中定义了一个树型结构来描述它所保存的数据。<br>XML最大的优点是你既可以在这个文本文件中存储结构化数据，也可以在其中存储非结构化数据——也就是说，它能包含和描述"粗糙的"文档数据，就象它描述"规则的"表格数据一样。 <br>XHTML是目前编写HTML的首选方法；因为XHTML本身就是格式良好的XML，与通常畸形的HTML文档相比， XHTML格式文档更容易处理。 <br>XSLT和XSL是对XML文档进行转换的语言。它们可以将XML文档转换成各种格式，比如另一个文本文件、PDF文件、HTML文件、逗号分割的文件，或者转换成其它的XML文档。 <br>DTDs 和XML Schema用来描述XML文件所包含的数据内容的类型，使你不用编写定制的代码就能对XML文档的内容进行"有效性"检查，使内容强行遵守给出的规则。 <br>XPath 和 XQuery是查询语言，用它们可以从XML文档中吸取单个的数据项或者数据项列表。XQuery的功能特别强大，因为它对XPath查询进行了扩展。实际上，XQuery和XML的关系就像SQL之于关系数据库一样。 <br>SOAP是Web services间进行通讯的标准协议。你不必知道SOAP协议的所有细节，但是你应该熟悉其常用规则及其工作原理，这样你才能使用它。 <br>二、Web Services<br>Web服务是XML流行后的直接产物。因为XML可以描述数据和对象，XML大纲可以保证XML文档数据的有效性，因为XML的基于文本的规范，因而XML文档极其适合于作为一种跨平台通讯标准的基本格式。如果你还没有接触过Web服务，那么过不了多久你肯定会碰到它，所以必须熟练掌握Web服务，最好是精通它，因为它是迄今为止应用程序间跨不同种类机器、语言、平台和位置通讯的最简单的一种方式。不管你需不需要它，Web服务都会是将来互用性的主要趋势。<br>XML工作组的John Bosak曾说过："XML使得Java有事可做"，那么，我们也可以说，Web服务使得所有语言都有事可做。Web服务让运行在大型机上的COBOL应用程序与运行在手持设备上的应用程序相互沟通；让Java小应用与.NET服务器相互通讯，让桌面应用与Web服务器进行无缝交互，不但为商业数据处理，同时也为商业功能提供了方便的实现——并且这种实现与语言、平台、和位置无关。</p>
<p>三、面向对象编程<br>许多程序员仍然认为OOP乃技术的象牙之塔，但是细细想一下过去十年里在面向对象领域里占据过统治地位的开发语言之后，你就不会这么认为了，OOP理念从Smalltalk开始，然后蔓延到C++和Pascal（Delphi），到Java成为真正的主流，几年之后，VB.NET 和 C#的出现可以说是OOP发展到了登峰造极的地步。虽然使用这些语言不必了解OOP的概念，但如果你缺乏一些OOP的基本知识和方法，我想你很难在逐渐疲软的就业市场中找到工作。</p>
<p>四、Java, C++, C#, VB.NET<br>如果你热衷于技术，并且热爱编程，那么我想你应该轻松玩转这些高级语言，我说的玩转并不一定要你成为超级编程高手。而是能看懂用这些语言编写的代码即可。如果你还有精力用它们编码那就更好了。其实这种机会甚少。但是看代码的机会很多，学习编程的最有效的一种方式就是看源代码——浩如烟海的源代码中很多都不是用你所钟爱的开发语言编写的。<br>在过去的几年里，各个语言功能的发展基本上都差不多。现在你完全可以用VB.NET来写Windows服务、Web应用或者命令行程序。即使你只用其中的一种语言写程序。我认为也完全有必要学习另外一种语言，使自己能阅读和理解它们现有的例子代码，并且能将一种语言编写的代码转换成你首选的编程语言代码。这里列出的四种语言可谓是一个强大的开发语言工具箱，如果你掌握了它们，毫无疑问你一定是一个众人仰慕的高手。这里我要声明一下：那就是我并没有要忽略和排除其它的高级语言，如：FORTRAN、COBOL、APL、ADA、Perl和Lisp等等，根据你所从事的领域不同，应该选择适合的语言和工具。</p>
<p>五、javascript<br>Java 和javascript两者的名字尽管很类似，但它们之间并没有什么关系。为什么一种脚本语言会如此重要，以至于将它列入十种关键技术之一呢？仔细想一下就知道了，目前所有主流的浏览器都使用javascript。如果你要编写Web应用程序，那么javascript不可或缺。此外，javascript还能作为一种服务器端的脚本语言，如将它嵌入在ASP、ASP.NET中，或者嵌入XSLT来扩展功能。目前javascript在Mozilla/Netscape中是激活基于XUL界面的首选语言，它派生出了ActionScript，成为Flash MX应用的编程语言。还有就是javascript极有可能成为未来新设备的脚本语言以及主流应用的宏语言。<br>相比之下，VBScript虽然在微软的产品中得到很好的支持，但从长远来看，没有迹象表明它会有美好前途。微软自己都趋向于用javascript（或者用由javascript派生的JScript）来编写其客户端脚本代码。因此，如果你要选择脚本语言，非javascript莫属。</p>
<p>六、Regular Expressions<br>从所周知，关系数据库的查询使用SQL，搜索XML文档用XPath 和XQuery，而正则表达式则用来搜索纯文本。例如，你可以用一个命令来查找或删除HTML格式文件中的注释内容。大家都用过"IndexOf"、"InStr"以及"Like"这些内建在javascript或VB中的文本搜索函数，这些函数虽然很容易使用，但是它们的功能却无法与正则表达式同日而语——现在每一种主流的开发语言都提供对正则表达式的存取。尽管有人认为正则表达式本身的读写艰涩难懂，但毕竟它的功能强大，使用它的领域也越来越多。</p>
<p>七、Design Patterns<br>就像OOP通过创建和分类对象来简化编程一样，设计模式将普通的对象交互分类成指定的模型，这是一个从一般到具体的过程。OOP的成分使用得越多，设计模式就显得越有用武之地。所以你必须理解它们，跟上其总体理论的发展。</p>
<p>八、Flash MX<br>当你需要比HTML和CSS所能提供的更多的客户端图形和编程能力时，Flash是最佳选择。在Flash中编程比用Java小应用或者.NET代码来得快得多，也容易得多。<br>在最新版本中（MX），Flash不仅可以画图和进行动画打包，它还是个高度的可编程应用环境。具备强大的与SOAP Web服务沟通的能力，可以调用运行在远端服务器上的ColdFusion、Java或.NET代码。可以说Flash几乎无处不在，包括手持设备、置顶盒、甚至是新的平板电脑，你到处都可以见到它的身影，所以使用它实际上可以扩展和延伸你的应用程序使用领域。</p>
<p>九、Linux/Windows<br>这是当今PCs机操作系统的两大阵容，如果你想在计算机行业里混，就一定要熟悉它们。对于Linux，最好能自己安装，配置，下载它的图形用户界面以及一些应用程序。自己安装Apache并会编写Web应用程序。要清醒地认识到这个世界除了Windows之外，还有Linux的存在。并且这种局面将会长期存在。反过来，如果你是一个死忠的Linux开发者，不要再继续对Windows的憎恶，要相互学习，取长补短，看看Windows有什么好的东东可以采纳。记住Windows仍然是桌面之王。<br>谁也说不准你们公司什么时候会决定从Linux转向Windows，或者从Windows转向Linux。谁也说不准什么时候你会跳槽跑到另外一个使用不同平台的公司上班——或者即便不跳槽，也有可能在不同平台上开始另外一个杀手级项目——所以最好在每个平台上都积累一些经验，而不要在一棵树上吊死。</p>
<p>十、SQL<br>尽管SQL在当今众多的技术中已不是什么新东西，而且在未来的十年里它的作用很有可能被削弱，甚至整个被淘汰，但它仍然是一种基本技能——别看它是一种基本技能，至今仍有许多开发人员不懂什么是SQL或对它了解不多。不要指望基于图形用户界面的SQL构造器会帮你的忙，还是自己亲手写SQL查询吧，确定你掌握了SQL的基本语法。现在理解了SQL，不仅对以后学习XQuery有所裨益，而且可以使你很快找到简化或改进当前开发项目的途径。<br>&nbsp;<br></p>
<img src ="http://www.cppblog.com/3522021224/aggbug/26143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-12 13:49 <a href="http://www.cppblog.com/3522021224/archive/2007/06/12/26143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员的十种级别</title><link>http://www.cppblog.com/3522021224/archive/2007/06/12/26119.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Mon, 11 Jun 2007 16:56:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/12/26119.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26119.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/12/26119.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26119.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 程序员的十个级别...看看你在哪个位置<br><br>对的就顶一下&nbsp;&nbsp;<a href='http://www.cppblog.com/3522021224/archive/2007/06/12/26119.html'>阅读全文</a><img src ="http://www.cppblog.com/3522021224/aggbug/26119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-12 00:56 <a href="http://www.cppblog.com/3522021224/archive/2007/06/12/26119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>matlab遗传算法工具箱函数及实例讲解</title><link>http://www.cppblog.com/3522021224/archive/2007/06/12/26118.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Mon, 11 Jun 2007 16:54:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/12/26118.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26118.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/12/26118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26118.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26118.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 8pt">核心函数： <br>(1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 <br>【输出参数】 <br>pop--生成的初始种群 <br>【输入参数】 <br>num--种群中的个体数目 <br>bounds--代表变量的上下界的矩阵 <br>eevalFN--适应度函数 <br>eevalOps--传递给适应度函数的参数 <br>options--选择编码形式(浮点编码或是二进制编码)[precision F_or_B],如 <br>precision--变量进行二进制编码时指定的精度 <br>F_or_B--为1时选择浮点编码，否则为二进制编码,由precision指定精度) <br><br>(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,... <br>termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--遗传算法函数 <br>【输出参数】 <br>x--求得的最优解 <br>endPop--最终得到的种群 <br>bPop--最优种群的一个搜索轨迹 <br>【输入参数】 <br>bounds--代表变量上下界的矩阵 <br>evalFN--适应度函数 <br>evalOps--传递给适应度函数的参数 <br>startPop-初始种群 <br>opts[epsilon prob_ops display]--opts(1:2)等同于initializega的options参数，第三个参数控制是否输出，一般为0。如[1e-6 1 0] <br>termFN--终止函数的名称,如['maxGenTerm'] <br>termOps--传递个终止函数的参数,如[100] <br>selectFN--选择函数的名称,如['normGeomSelect'] <br>selectOps--传递个选择函数的参数,如[0.08] <br>xOverFNs--交叉函数名称表，以空格分开，如['arithXover heuristicXover simpleXover'] <br>xOverOps--传递给交叉函数的参数表，如[2 0;2 3;2 0] <br>mutFNs--变异函数表，如['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation'] <br>mutOps--传递给交叉函数的参数表,如[4 0 0;6 100 3;4 100 3;4 0 0] <br><br><span style="FONT-SIZE: 10pt"><font size=3>【问题】求<span lang=EN-US>f(x)=x+10*sin(5x)+7*cos(4x)</span>的最大值，其中</font><font size=3><span lang=EN-US>0&lt;=x&lt;=9 <br></span>【分析】选择二进制编码，种群中的个体数目为<span lang=EN-US>10</span>，二进制编码长度为<span lang=EN-US>20</span>，交叉概率为<span lang=EN-US>0.95,</span>变异概率为</font><font size=3><span lang=EN-US>0.08 <br></span>【程序清单】</font><font size=3><span lang=EN-US> <br>%</span>编写目标函数</font><font size=3><span lang=EN-US> <br>function[sol,eval]=fitness(sol,options) <br>x=sol(1); <br>eval=x+10*sin(5*x)+7*cos(4*x); <br>%</span>把上述函数存储为<span lang=EN-US>fitness.m</span>文件并放在工作目录下</font><font size=3><span lang=EN-US> <br><br>initPop=initializega(10,[0 9],'fitness');%</span>生成初始种群，大小为</font><font size=3><span lang=EN-US>10 <br>[x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',... <br>[0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25</span>次遗传迭代</font><font size=3><span lang=EN-US> <br><br></span>运算借过为：</font><font size=3><span lang=EN-US>x = <br>7.8562 24.8553(</span>当<span lang=EN-US>x</span>为<span lang=EN-US>7.8562</span>时，<span lang=EN-US>f</span>（<span lang=EN-US>x</span>）取最大值</font><font size=3><span lang=EN-US>24.8553) <br><br></span>注：遗传算法一般用来取得近似最优解，而不是最优解。</font><font size=3><span lang=EN-US> <br><br><br><br></span>遗传算法实例</font><font size=3><span lang=EN-US>2 <br><br></span>【问题】在－<span lang=EN-US>5&lt;=Xi&lt;=5,i=1,2</span>区间内，求解</font><font size=3><span lang=EN-US> <br>f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282</span>的最小值。</font><font size=3><span lang=EN-US> <br></span>【分析】种群大小<span lang=EN-US>10</span>，最大代数<span lang=EN-US>1000</span>，变异率<span lang=EN-US>0.1,</span>交叉率</font><font size=3><span lang=EN-US>0.3 <br></span>【程序清单】</font><font size=3><span lang=EN-US> <br></span>％源函数的<span lang=EN-US>matlab</span>代码</font><font size=3><span lang=EN-US> <br>function [eval]=f(sol) <br>numv=size(sol,2); <br>x=sol(1:numv); <br>eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282; <br>%</span>适应度函数的<span lang=EN-US>matlab</span>代码</font><font size=3><span lang=EN-US> <br>function [sol,eval]=fitness(sol,options) <br>numv=size(sol,2)-1; <br>x=sol(1:numv); <br>eval=f(x); <br>eval=-eval; <br>%</span>遗传算法的<span lang=EN-US>matlab</span>代码</font><font size=3><span lang=EN-US> <br>bounds=ones(2,1)*[-5 5]; <br>[p,endPop,bestSols,trace]=ga(bounds,'fitness') <br><br></span>注：前两个文件存储为<span lang=EN-US>m</span>文件并放在工作目录下，运行结果为</font><font size=3><span lang=EN-US> <br>p = <br>0.0000 -0.0000 0.0055 <br><br><br><br></span>大家可以直接绘出<span lang=EN-US>f(x)</span>的图形来大概看看<span lang=EN-US>f</span>（<span lang=EN-US>x</span>）的最值是多少，也可是使用优化函数来验证。<span lang=EN-US>matlab</span>命令行执行命令：</font><span lang=EN-US><font size=3> <br>fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9]) </font><br></span><br><br></span><br><br></span>
<img src ="http://www.cppblog.com/3522021224/aggbug/26118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-12 00:54 <a href="http://www.cppblog.com/3522021224/archive/2007/06/12/26118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于COM接口的VC++与MATLAB混合编程</title><link>http://www.cppblog.com/3522021224/archive/2007/06/11/26046.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Mon, 11 Jun 2007 04:59:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/11/26046.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26046.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/11/26046.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26046.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26046.html</trackback:ping><description><![CDATA[&nbsp;
<p align=left><strong><span>0&nbsp; </span></strong><strong><span>引言</span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>目前，<span>Matlab</span>广泛的应用于自动控制、数学运算、信号分析、图像处理、财务分析等各行各业。<span>MATLAB</span>也存在着某些缺点：<span>Matlab</span>是一种解释性语言，其特点是以矩阵为基本数据结构，导致其执行效率相对<span>C</span>或<span>C+ +</span>语言要低很多；因为<span>Matlab</span>程序不能脱离其环境运行，故不能直接用于商用软件的开发。与此相反，<span>VC++</span>由于其丰富得人机界面，高效的执行效率已经成为基于<span>Windows</span>平台下开发商业软件的必备工具。然而，<span>VC++</span>对于复杂的数值运算就有点&#8220;力不从心&#8221;了。所以将<span>VC++</span>与<span>Matlab</span>完美的结合，发挥各自的优势具有现实意义。自<span>Matlab6.5</span>版本开始，新推出来的<span>Combuilder</span>支持把用<span>Matlab</span>编写的程序做成<span>com</span>组件，供其他语言调用。该方法实现简单，通用性强，成为<span>VC</span>与<span>Matlab</span>混合编程最有效的方法。</span></p>
<p align=left><strong><span>1&nbsp; VC</span></strong><strong><span>与<span>Matlab</span>混合编程的方法</span></strong><strong></strong></p>
<p align=left><strong><span>1.1 </span></strong><strong><span>通过<span>Matlab Engine</span>方式</span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>Matlab Engine</span><span>是指一组<span>Matlab</span>提供的接口函数，支持<span>C</span>语言，<span> Matlab Engine</span>采用<span>C/S(</span>客户机<span>/</span>服务器<span>)</span>模式，<span>Matlab</span>作为后台服务器，而<span>C</span>程序作为前台客户机，通过<span>Windows</span>的动态控件与服务器通信，向<span>Matlab Engine</span>传递命令和数据信息，从<span>Matlab Engine</span>接受数据信息。用户可以在前台应用程序中调用这些接口函数，实现对<span>Matlab Engine</span>的控制。采用这种方法几乎能利用<span>Matlab</span>全部功能，但是需要在机器上安装<span>Matlab</span>软件，而且执行效率低，因此在实际应用中不采用这种方法，在软件开发中也不可行，这种模式只适合个人使用或做演示。<span> </span></span></p>
<p align=left><strong><span>1.2 </span></strong><strong><span>直接调用<span>Matlab</span>的<span>C/C++</span>数学函数库</span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>Matlab</span><span>中提供了可以供<span>C/C++</span>语言调用的<span>C/C++</span>数学函数库，其中包含了大量用<span>C/C++</span>语言重新编写的<span>Matlab</span>数学函数，这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等，并且函数库中提供了大量各种矩阵操作函数，在<span>VC</span>中可以直接使用这些函数，通过这些函数可以在<span>VC</span>中方便的实现在<span>Matlab</span>中矩阵运算功能。用这种方法可以很灵活的调用<span>Matlab</span>来编写应用程序，但要求读者对<span>C/C++</span>语言非常熟悉，并且这种模式不能包括所有的<span>Matlab</span>函数，尤其是无法充分使用<span>Matlab</span>提供的详尽的绘图函数。</span></p>
<p align=left><strong><span>1.3 </span></strong><strong><span>用<span>Matlab</span>自带的<span>Matlab Compiler</span></span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>Matlab Compiler</span><span>的作用是将<span>m</span>文件转化成<span>C/C++</span>代码（也就是通常所用的<span>mcc</span>命令）<span>,</span>这种源代码需要用<span>C/C++</span>编译器编译连接成独立应用程序，在将<span>m</span>文件转成独立应用程序的过程中生成的<span>C/C++</span>文件，原则上是可以被其它的<span>C/C++</span>代码调用的，编译器可以通过设置<span>mcc</span>命令的选项，将<span>m</span>文件编译成动态链接库文件、<span>C/C++</span>文件、可执行文件等一系列文件。到<span>matlab R21.1</span>为止，<span>Matlab Compiler</span>的<span>m</span>程序转换成<span>C/C++</span>代码功能有很多限制：<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑴不能转换脚本<span>m</span>文件，只能转换<span>m</span>函数；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑵不能使用<span>matlab</span>对象；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑶不能用<span>input</span>或者<span>eval</span>操作<span>matlab</span>空间变量；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑷不能动态地命名变量，然后用<span>load</span>或者<span>save</span>命令来操作；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑸不能处理具有嵌套调用其他<span>m</span>文件的<span>m</span>文件；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑹不能使用<span>MATLAB</span>内联函数；<span> </span></span></p>
<p align=left><strong><span>1.4 </span></strong><strong><span>使用<span>matcom</span>工具</span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>这是第三方控件，很小<span>(<st1:chmetcnv TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="8" UnitName="m" w:st="on">8M</st1:chmetcnv></span>多<span>),</span>原本属于<span>mathtool</span>公司，后来被<span>Mathworks</span>公司合并了，使用该工具可以将<span>m</span>脚本文件和<span>m</span>函数转化成相同功能的<span>C/C++</span>文件，相比其它方法使用<span>matcom</span>具有如下优点：<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑴转换过程简单<span>(</span>由<span>matcom</span>工具自动实现<span>)</span>，容易实现；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑵可以方便的生成动态链接库文件<span>(dll)</span>和可执行文件<span>(exe)</span>；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑶不仅可以转换独立的脚本文件，也可以转换嵌套脚本文件；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑷设置环境后，可以使用<span>Matlab</span>的工具箱函数；<span> </span></span></p>
<p align=left><span>但<span>matcom</span>也有以下不足：<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑴对<span>struct</span>等类的支持有缺陷，对<span>class</span>数据类型；<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑵部分绘图语句无法实现或得不到准确图象，尤其是三维图象；</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>⑶当涉及到的复杂函数调用时嵌套的文件数量很多。<span> </span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>因此在不涉及到三维做图以及<span>m</span>文件不大的情况下推荐使用。</span></p>
<p align=left><strong><span>1.5&nbsp; </span></strong><strong><span>使用<span>Matlab</span>的<span>Combuilde</span>工具</span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>COM</span><span>是<span>component object module</span>的简称，它是一种通用的对象接口，任何语言只要按照这种接口标准，就可以实现调用它。<span>Matlab6.5</span>新推出来的<span>Combuilder</span>就是把用<span>Matlab</span>编写的程序做成<span>com</span>组件，供其他语言调用。该方法实现简单，通用性强，而且几乎可以使用<span>Matlab</span>的任何函数<span>(</span>注意：不支持脚本文件，脚本文件使用时要改为函数文件<span>)</span>，因此在程序较大、调用工具箱函数或调用函数较多时推荐使用，这也是<span>Matlab</span>公司推荐的使用方法。</span></p>
<p align=left><strong><span>2&nbsp; </span></strong><strong><span>基于<span>COM</span>接口的<span>Matlab</span>与<span>VC</span>混合编程实现<span>FFT</span>转换</span></strong><strong></strong></p>
<p align=left><strong><span>2.1 </span></strong><strong><span>创建<span>Matlab</span>源文件</span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>在<span>Matlab</span>中实现<span>FFT</span>转换只需要一个函数即可。</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(1) </span><span>新建<span>M</span>文件，在<span>M</span>文件中输入以下两条语句：</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>Function FFT(X,Y) %</span><span>实现<span>FFT</span>转换。函数名为<span>FFT</span>，<span>x</span>为输入参数，<span>y</span>为输出参数</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>Y=fft(X);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %fft</span><span>转换实现函数</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; (2</span><span>）保存为<span>FFT.m </span>的<span>M</span>文件。</span></p>
<p align=left><strong><span>2.2&nbsp; </span></strong><strong><span>在<span>Matlab</span>下创建<span>COM</span>组建</span></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(1</span><span>）在<span>matlab command window</span>输入如下命令：</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>&gt;&gt;comtool</span></p>
<p align=center></p>
<p align=left><span><br clear=all></span></p>
<p align=left><span><br clear=all></span></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(2</span><span>）出现<span>com</span>编辑界面后，选择<span>File-&gt;New Project</span>建立新工程<span>testfft</span>，并将<span>FFT.m</span>加入到新建工程中。</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(3</span><span>）点击<span>Build-&gt;COM Object</span>&#8230;生成<span>COM</span>组件。</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>至此<span>com</span>组件已经由<span>matlab</span>做好，默认的保存位置为：<span>matlab</span>安装位置<span>\work\component</span>。</span></p>
<p align=left><strong><span>2.3 &nbsp;VC</span></strong><strong><span>下调用<span>COM</span>组件</span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(1</span><span>）将<span>testfft_idl.h </span>和<span>testfft_idl_i.c</span>文件拷贝到<span>VC</span>建立的工程目录下。两文件默认目录为<span>\work\component\src</span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(2</span><span>）将目录<span>/extern/include/</span>下的<span>mwcomtypes.h</span>文件拷贝的<span>VC</span>建立的目录下。</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(3</span><span>）将上面三个文件加入<span>VC</span>工程：工程<span>-&gt;</span>添加工程<span>-&gt;Files</span>，选择刚刚拷到目录下的<span>testfft_idl.h </span>和<span>testfft_idl_i.c</span>文件。</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(4) </span><span>为程序添加头文件<span>testfft_idl.h </span>、<span>testfft_idl_i.c</span>和<span>mwcomtypes.h</span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>(5</span><span>）填写调用<span>COM</span>组件代码：</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>if(FAILED(CoInitialize(NULL)))&nbsp;&nbsp;&nbsp; //</span><span>初始化调用<span>com</span></span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>{</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><span>&nbsp; AfxMessageBox("unable to initialize COM");</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><span>}</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>Itestfft *st=NULL;</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>HRESULT hr=CoCreateInstance(CLSID_testfft,NULL,CLSCTX_ALL,IID_Itestfft,(void **)&amp;st);</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>if(SUCCEEDED(hr))</span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><span>&nbsp;{</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARIANT x,y;</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VariantInit(&amp;x);</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VariantInit(&amp;y);</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x.vt=VT_I4;</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x.lVal=4;</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; st-&gt;fte(x,y);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //x</span><span>为输入参数，<span>y</span>为输出参数</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; st-&gt;Release();</span></p>
<p align=left><span>&nbsp;}</span></p>
<p align=left>&nbsp;<strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>else</span></p>
<p align=left><span>&nbsp;{</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; AfxMessageBox("unsucceed");</span></p>
<p align=left><span>&nbsp;}&nbsp;&nbsp;&nbsp; </span></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>至此实现<span>VC</span>下调用<span>COM</span>组件实现<span>FFT</span>转换。</span></p>
<p align=left><strong><span>3&nbsp; </span></strong><strong><span>结论</span></strong><strong></strong></p>
<p align=left><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><span>实践表明用<span>COM</span>方法实现<span>VC</span>与<span>Matlab</span>混合编程具有实现简单、执行效率高、几乎支持所有的<span>matlab</span>函数、易移植等优点。</span></p>
<img src ="http://www.cppblog.com/3522021224/aggbug/26046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-11 12:59 <a href="http://www.cppblog.com/3522021224/archive/2007/06/11/26046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VC++6.0为对话框添加最小化按钮和提示条</title><link>http://www.cppblog.com/3522021224/archive/2007/06/11/26045.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Mon, 11 Jun 2007 04:54:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/11/26045.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/26045.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/11/26045.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/26045.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/26045.html</trackback:ping><description><![CDATA[&nbsp;
<p style="FONT-SIZE: 10pt" align=left>我们在使用对话框窗体时，会有这样一种感受：当对话框窗体位于其它程序窗口界面上时，单击对话框外区域时，可使对话框窗体最小化；而当对话框窗体位于桌面上时，无论怎样单击对话框外区域，对话框均不能最小化，只能选择关闭。但有时我们在使用对话框时，还希望能根据需要使对话框具有最小化功能。本文的设计思想就是据此提出来的。</p>
<p style="FONT-SIZE: 10pt" align=left>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;实例程序设计要点</p>
<p style="FONT-SIZE: 10pt" align=left>⑴ 取得对话框标题栏位置和大小，在标题栏的适当位置绘制最小化按钮，并记住按钮的位置。</p>
<p style="FONT-SIZE: 10pt" align=left>⑵ 在最小化按钮所在区域检测鼠标是否在该区域内、是否按下，是否发送最小化消息使对话框最小化，否则不变。</p>
<p style="FONT-SIZE: 10pt" align=left>⑶ 将最小化按钮矩形区域向工具提示条控件注册，这样当鼠标在最小化按钮矩形区域时，显示提示文本。</p>
<p style="FONT-SIZE: 10pt" align=left>2&nbsp; 实例程序实现的步骤及说明</p>
<p style="FONT-SIZE: 10pt" align=left>⑴ 准备二个位图，一个位图表示最小化按钮正常显示状态，另一个位图表示最小化按钮被按下时的状态。</p>
<p style="FONT-SIZE: 10pt" align=left>⑵ 使用MFC AppWizard(exe)创建工程名为MinButton的对话框窗体，如图所示，将二个按钮位图导入对话框的资源里。</p>
<p style="FONT-SIZE: 10pt" align=left></p>
<p style="FONT-SIZE: 10pt" align=left>⑶ 在CMinButtonDlg对话框类中进行变量定义和函数声明。</p>
<p style="FONT-SIZE: 10pt" align=left>⑷ 利用ClassWizard为对话框类添加消息WM_NCPAINT，WM_ACTIVATE和WM_NCMOUSEMOVE的消息处理函数，在这三个函数中调用成员函数DrawButton()来绘制按钮。</p>
<p style="FONT-SIZE: 10pt" align=left>⑸ 利用ClassWizard为最小化按钮关联对应的消息WM_NCLBUTTONDOWN和消息处理函数OnNcLButtonDown(UINT nHitTest, CPoint point)。</p>
<p style="FONT-SIZE: 10pt" align=left>⑹ 函数DrawButton()用于绘制按钮。由于最小化按钮并不是一个真实的按钮控件，而是一个画在标题栏上的位图。因此，为了在对话框窗体标题上绘画，必须创建一个窗口设备环境类（相当于创建一个画布，有了这个画布，才能在画布上绘画，也就是才能在标题栏上绘画。）</p>
<p style="FONT-SIZE: 10pt" align=left>①&nbsp;调用函数GetWindowDC()取得指向CDC的指针 CDC* pDC；</p>
<p style="FONT-SIZE: 10pt" align=left>② 调用函数 CreateCompatibleDC(CDC* pDC)创建一个内存设备环境，以便在内存中保存位图，并与指定的窗口设备环境相兼容；</p>
<p style="FONT-SIZE: 10pt" align=left>③ 调用函数SelectObject(CBitmap *pBitmap)，将位图选入内存设备环境中；</p>
<p style="FONT-SIZE: 10pt" align=left>④ 调用函数 BitBlt(int x, int y, int nWidth, int nHeight, CDC *pSrc, int xSrc, int ySrc, DWORD dwRop)将位图复制到实际设备环境中。其中，参数x, y 表示位图目标矩形左上角的x, y 逻辑坐标值；nWidth, nHeight 表示位图目标矩形的逻辑宽度和高度；pSrc 表示源设备环境CDC指针；xSrc, ySrc 表示位图源矩形的左上角的x, y 逻辑坐标值；dwRop 表示显示位图的光栅操作方式。光栅操作方式有多种，这里使用的是SRCCOPY，表示将位图直接复制到目标内存设备环境中。这里要说明一点：函数BitBlt()只能&#8220;一比一&#8221;的显示位图，如要任意缩放显示位图须使用函数StretchBlt()，该函数的使用方法，请参考相关书籍。</p>
<p style="FONT-SIZE: 10pt" align=left>⑤ 位图选入内存环境中显示后，应调用函数SelectObject(CBitmap *pOldBitmap)恢复原来的内存设备环境。</p>
<p style="FONT-SIZE: 10pt" align=left>⑺ 提示条实质上是一个小的弹出窗口，在窗口中显示一行文本，用来描述工具（或区域）的用途或其它信息。在MFC中提供了工具提示条控件类CToolTipCtrl，由它来管理提示条。在这里，我们从CToolTipCtrl类派生子类CToolTips。在子类的定义中添加函数BOOL AddToolTip( UINT nID, LPRECT lpRect, LPCTSTR lpszText)，该函数用于向工具提示条控件注册按钮区域和提示文本，当鼠标在最小化按钮区域时，显示提示文本。</p>
<p style="FONT-SIZE: 10pt" align=left>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要的程序代码</p>
<p style="FONT-SIZE: 10pt" align=left>⑴ 在对话框类中定义相应的变量和函数声明</p>
<p style="FONT-SIZE: 10pt" align=left>class CMinButtonDlg : public CDialog</p>
<p style="FONT-SIZE: 10pt" align=left>{ </p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;&#8230;&#8230;</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp; public:</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect m_rtButtMin; //记录最小化按钮位置</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void DrawButton(); //绘制最小化按钮</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL m_BMPPressed;//最小化按钮状态标志</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect m_ButtMinTips;//记录最小化按钮区域</p>
<p style="FONT-SIZE: 10pt" align=left>protected:</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp; CToolTips m_ToolTip;//定义工具提示条控件变量</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp; void GetMinButRect();//获取最小化按钮所在区域</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp; //消息处理函数</p>
<p style="FONT-SIZE: 10pt" align=left>afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp; &nbsp;afx_msg void OnNcPaint();</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp; &nbsp;afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp; &nbsp;afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point);</p>
<p style="FONT-SIZE: 10pt" align=left>&#8230;&#8230;&#8230;&#8230;</p>
<p style="FONT-SIZE: 10pt" align=left>}；</p>
<p style="FONT-SIZE: 10pt" align=left>⑵ 对话框类中三个消息处理函数定义如下：</p>
<p style="FONT-SIZE: 10pt" align=left>//对应消息WM_NCPAINT的消息处理函数</p>
<p style="FONT-SIZE: 10pt" align=left>void CMinButtonDlg::OnNcPaint() </p>
<p style="FONT-SIZE: 10pt" align=left>{</p>
<p style="FONT-SIZE: 10pt" align=left>CDialog::OnNcPaint();</p>
<p style="FONT-SIZE: 10pt" align=left>DrawButton(); //绘制最小化按钮</p>
<p style="FONT-SIZE: 10pt" align=left>}</p>
<p style="FONT-SIZE: 10pt" align=left>//对应消息WM_ACTIVATE的消息处理函数</p>
<p style="FONT-SIZE: 10pt" align=left>void CMinButtonDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) </p>
<p style="FONT-SIZE: 10pt" align=left>{</p>
<p style="FONT-SIZE: 10pt" align=left>CDialog::OnActivate(nState, pWndOther, bMinimized);</p>
<p style="FONT-SIZE: 10pt" align=left>DrawButton(); //绘制最小化按钮</p>
<p style="FONT-SIZE: 10pt" align=left>}</p>
<p style="FONT-SIZE: 10pt" align=left>//对应消息WM_NCMOUSEMOVE的消息处理函数</p>
<p style="FONT-SIZE: 10pt" align=left>void CMinButtonDlg::OnNcMouseMove(UINT nHitTest, CPoint point) </p>
<p style="FONT-SIZE: 10pt" align=left>{</p>
<p style="FONT-SIZE: 10pt" align=left>DrawButton(); //绘制最小化按钮</p>
<p style="FONT-SIZE: 10pt" align=left>CDialog::OnNcMouseMove(nHitTest, point);</p>
<p style="FONT-SIZE: 10pt" align=left>}</p>
<p style="FONT-SIZE: 10pt" align=left>⑶ 绘制最小化按钮的函数</p>
<p style="FONT-SIZE: 10pt" align=left>void CMinButtonDlg::DrawButton()</p>
<p style="FONT-SIZE: 10pt" align=left>{</p>
<p style="FONT-SIZE: 10pt" align=left>CDC* pDC = GetWindowDC();</p>
<p style="FONT-SIZE: 10pt" align=left>CDC* pMemDC=new CDC;</p>
<p style="FONT-SIZE: 10pt" align=left>CBitmap *pBitmap1=new CBitmap;&nbsp; </p>
<p style="FONT-SIZE: 10pt" align=left>CBitmap *pBitmap2=new CBitmap;</p>
<p style="FONT-SIZE: 10pt" align=left>CBitmap *pOldBitmap;</p>
<p style="FONT-SIZE: 10pt" align=left>CRect rtWnd, rtButtons, rtTitle;</p>
<p style="FONT-SIZE: 10pt" align=left>//创建一个内存设备环境</p>
<p style="FONT-SIZE: 10pt" align=left>pMemDC-&gt;CreateCompatibleDC(pDC);</p>
<p style="FONT-SIZE: 10pt" align=left>if(!pDC) return;</p>
<p style="FONT-SIZE: 10pt" align=left>GetWindowRect(&amp;rtWnd);</p>
<p style="FONT-SIZE: 10pt" align=left>//取得标题栏的矩形</p>
<p style="FONT-SIZE: 10pt" align=left>rtTitle.left = GetSystemMetrics(SM_CXFRAME);</p>
<p style="FONT-SIZE: 10pt" align=left>rtTitle.top = GetSystemMetrics(SM_CYFRAME);</p>
<p style="FONT-SIZE: 10pt" align=left>rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);</p>
<p style="FONT-SIZE: 10pt" align=left>rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);</p>
<p style="FONT-SIZE: 10pt" align=left>//计算最小化按钮的位置，位图大小为15X15</p>
<p style="FONT-SIZE: 10pt" align=left>rtButtons.top=rtTitle.top+1;</p>
<p style="FONT-SIZE: 10pt" align=left>rtButtons.bottom=rtButtons.top+15;</p>
<p style="FONT-SIZE: 10pt" align=left>rtButtons.right = rtTitle.right-20;</p>
<p style="FONT-SIZE: 10pt" align=left>rtButtons.left = rtButtons.right-15;</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;</p>
<p style="FONT-SIZE: 10pt" align=left>m_rtButtMin = rtButtons;</p>
<p style="FONT-SIZE: 10pt" align=left>pBitmap1-&gt;LoadBitmap(IDB_BITMAP1); //调入正常状态按钮的位图 </p>
<p style="FONT-SIZE: 10pt" align=left>pBitmap2-&gt;LoadBitmap(IDB_BITMAP2);&nbsp; //调入按钮按下状态的位图</p>
<p style="FONT-SIZE: 10pt" align=left>m_rtButtMin.OffsetRect(rtWnd.TopLeft());//记录最小化按钮的位置</p>
<p style="FONT-SIZE: 10pt" align=left>//将按钮位图调入内存设备环境中，m_BMPPressed为TRUE</p>
<p style="FONT-SIZE: 10pt" align=left>//调入正常状态按钮的位图</p>
<p style="FONT-SIZE: 10pt" align=left>pOldBitmap=pMemDC-&gt;SelectObject(m_BMPPressed ? pBitmap1: pBitmap2);</p>
<p style="FONT-SIZE: 10pt" align=left>//将按钮位图复制到实际的内存设备环境中</p>
<p style="FONT-SIZE: 10pt" align=left>pDC-&gt;BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), </p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtButtons.Height(), pMemDC, 0, 0, SRCCOPY);</p>
<p style="FONT-SIZE: 10pt" align=left>pMemDC-&gt;SelectObject(pOldBitmap);//恢复原来的内存设备环境</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;//释放资源</p>
<p style="FONT-SIZE: 10pt" align=left>ReleaseDC(pMemDC);</p>
<p style="FONT-SIZE: 10pt" align=left>ReleaseDC(pDC); </p>
<p style="FONT-SIZE: 10pt" align=left>delete pMemDC;</p>
<p style="FONT-SIZE: 10pt" align=left>delete pBitmap1; </p>
<p style="FONT-SIZE: 10pt" align=left>delete pBitmap2;</p>
<p style="FONT-SIZE: 10pt" align=left>}</p>
<p style="FONT-SIZE: 10pt" align=left>⑷ 对应鼠标左键的WM_NCLBUTTONDOWN消息处理函数</p>
<p style="FONT-SIZE: 10pt" align=left>void CMinButtonDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) </p>
<p style="FONT-SIZE: 10pt" align=left>{</p>
<p style="FONT-SIZE: 10pt" align=left>CDialog::OnNcLButtonDown(nHitTest, point);</p>
<p style="FONT-SIZE: 10pt" align=left>//检测是否在最小化按钮区域内按下按钮</p>
<p style="FONT-SIZE: 10pt" align=left>if (m_rtButtMin.PtInRect(point))</p>
<p style="FONT-SIZE: 10pt" align=left>{</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_BMPPressed=FALSE;//绘制按钮按下时的状态</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrawButton(); //绘制最小化按钮</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_BMPPressed=TRUE;//绘制按钮的正常状态</p>
<p style="FONT-SIZE: 10pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));//发送最小化消息</p>
<p style="FONT-SIZE: 10pt" align=left>}</p>
<p style="FONT-SIZE: 10pt" align=left>}</p>
<p style="FONT-SIZE: 10pt" align=left>⑸ //在最小化按钮区域实现提示文本</p>
<p style="FONT-SIZE: 10pt" align=left>BOOL CToolTips::AddToolTip( UINT nID, LPRECT lpRect, LPCTSTR lpszText&nbsp; )</p>
<p style="FONT-SIZE: 10pt" align=left>{</p>
<p style="FONT-SIZE: 10pt" align=left>TOOLINFO Tips;</p>
<p style="FONT-SIZE: 10pt" align=left>memset(&amp;Tips, 0, sizeof(TOOLINFO));</p>
<p style="FONT-SIZE: 10pt" align=left>Tips.cbSize = sizeof(TOOLINFO);</p>
<p style="FONT-SIZE: 10pt" align=left>Tips.hwnd = GetOwner()-&gt;GetSafeHwnd();</p>
<p style="FONT-SIZE: 10pt" align=left>Tips.uFlags = TTF_SUBCLASS;</p>
<p style="FONT-SIZE: 10pt" align=left>Tips.uId = nID;</p>
<p style="FONT-SIZE: 10pt" align=left>memcpy(&amp;Tips.rect, lpRect, sizeof(RECT));</p>
<p style="FONT-SIZE: 10pt" align=left>Tips.lpszText = (LPSTR)lpszText;</p>
<p style="FONT-SIZE: 10pt" align=left>return (BOOL)SendMessage(TTM_ADDTOOL, 0, (LPARAM)&amp;Tips);</p>
<p style="FONT-SIZE: 10pt" align=left>}</p>
<p style="FONT-SIZE: 10pt" align=left>⑹ 在对话框初始化函数OnInitDialog()中添下列代码：</p>
<p style="FONT-SIZE: 10pt" align=left>m_ToolTip.Create(this,TTS_ALWAYSTIP);//创建工具提示控件，TTS_ALWAYSTIP表示，//不论控件所属窗体是否活动，提示条始终有效</p>
<p style="FONT-SIZE: 10pt" align=left>GetMinButRect();</p>
<p style="FONT-SIZE: 10pt" align=left>ScreenToClient(&amp;m_ButtMinTips);//屏幕坐标转换为窗体坐标</p>
<p style="FONT-SIZE: 10pt" align=left>m_ToolTip.AddToolTip(1,&amp;m_ButtMinTips,"最小化");</p>
<img src ="http://www.cppblog.com/3522021224/aggbug/26045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-11 12:54 <a href="http://www.cppblog.com/3522021224/archive/2007/06/11/26045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库规范化设计技巧</title><link>http://www.cppblog.com/3522021224/archive/2007/06/09/25926.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Sat, 09 Jun 2007 14:31:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/09/25926.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25926.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/09/25926.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25926.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25926.html</trackback:ping><description><![CDATA[<h2 class=dtH1><a name=odc_fmsnormalization_topic1></a>简介</h2>
<p>在设计数据库时，最重要的步骤是要确保数据正确分布到数据库的表中。使用正确的数据结构，可以极大地简化应用程序的其他内容（查询、窗体、报表、代码等）。正确进行表设计的正式名称是&#8220;数据库规范化&#8221;。</p>
<p>本文简要介绍数据库规范化的基本概念和一些需要注意并力求避免的常见问题。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic2></a>理解您的数据</h2>
<p>在设计表之前，应明确您打算如何处理数据，还要了解随着时间的推移数据会发生什么样的变化。您所做的假设将会影响最终的设计。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic3></a>您需要什么样的数据？</h2>
<p>设计应用程序时，关键要了解设计的最终结果，以便确保您准备好所有必需的数据并知道其来源。例如，报表的外观、每个数据的来源以及所需的所有数据是否都存在。对项目损失最大的莫过于在项目后期发现重要报表缺少数据。</p>
<p>知道需要什么样的数据后，就必须确定数据的来源。数据是否从其他数据源中导入？数据是否需要清理或验证？用户是否需要输入数据？</p>
<p>明确所需数据的类型和来源是数据库设计的第一步。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic4></a>您打算如何处理这些数据？</h2>
<p>用户是否需要编辑这些数据？如果需要，应如何显示数据以便于用户理解和编辑？有没有验证规则和相关的查找表？要求对编辑和删除保留备份的数据输入有没有相关联的审核问题？需要为用户显示哪些摘要信息？是否需要生成导出文件？了解这些信息后，就可以想象字段之间是如何相互关联的了。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic5></a>数据之间如何相互关联？</h2>
<p>将数据分组放入相关字段（例如与客户相关的信息、与发票相关的信息等），每个字段组都代表要建立的表。然后考虑如何将这些表相互关联。例如，哪些表具有一对多关系（例如，一个客户可能持有多张发票）？哪些表具有一对一关系（这种情况下，通常会考虑将其组合到一个表中）？</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic6></a>随着时间的推移数据会发生什么样的变化？</h2>
<p>设计表之后，常常会由于没有考虑时间的影响而导致以后出现严重问题。许多表设计在当时使用时效果非常好，但是，常常会因为用户修改数据、添加数据以及随时间的推移而崩溃。开发人员经常会发现需要重新设计表的结构来适应这些变化。表的结构发生变化时，所有相关的内容（查询、窗体、报表、代码等）也必须随之更新。理解并预测数据会随时间推移发生哪些变化，可以实现更好的设计，减少问题的发生。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic7></a>学习如何使用查询</h2>
<p>了解如何分析和管理数据同样很重要。您应该深刻理解查询的工作原理，理解如何使用查询在多个表之间链接数据，如何使用查询对数据进行分组和汇总，以及如何在不需要以规范化格式显示数据时使用交叉表查询。</p>
<p>好的数据设计的最终目标就是要平衡两个需要：既要随着时间的推移有效地存储数据，又要轻松地检索和分析数据。理解查询的功能对正确设计表很有帮助。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic8></a>数据库规范化概念</h2>
<p>这部分介绍数据库规范化所涉及的基本概念，而不是对数据库规范化进行理论性的探讨。如何在您的实际情况中应用这些概念可能会随着应用程序需要的不同而有所变化。这部分的目的是理解这些基本概念、根据实际需要应用它们，并理解偏离这些概念将会出现哪些问题。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic9></a>将唯一信息存储在一个地方</h2>
<p>大部分数据库开发人员都理解数据库规范化的基本概念。理想情况下，您希望将相同的数据存储在同一个地方，并在需要引用时使用 ID 来进行引用。因此，如果某些信息发生了变化，则可以在一个地方进行更改，而整个程序中的相应信息也会随之更改。</p>
<p>例如，客户表会存储每个客户的记录，包括姓名、地址、电话号码、电子邮件地址以及其他特征信息。客户表中可能包含唯一的 CustomerID 字段（通常是 <strong>Autonumber</strong> 字段），这个字段即该表的主键字段，其他表使用它来引用该客户。因此，发票表可以只引用客户的 ID 值，而不是在每张发票中存储客户的所有信息（因为同一个客户可能会持有多张发票），这样利用客户的 ID 值即可从客户表中查找客户的详细信息。使用 Access 中功能强大的窗体（使用组合框和子窗体），可以轻松地完成这项工作。如果需要修改客户信息（例如新增电话号码），只需在客户表中修改，应用程序中引用该信息的任何其他部分都会随之自动更新。</p>
<p>使用正确规范化的数据库，通过简单的编辑即可轻松处理数据随时间推移而发生的更改。使用未正确规范化的数据库，通常需要利用编程或查询来更改多条记录或多个表。这不仅会增加工作量，还会增加由于未正确执行代码或查询而导致数据不一致的可能性。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic10></a>记录是免费的，而新字段非常昂贵</h2>
<p>理想的数据库应该只需要随着时间的推移添加新的记录，数据库表应该能够保存大量记录。但是，如果您发现需要增加更多字段，则可能会碰到设计问题。</p>
<p>电子表格专家经常会遇到上述问题，因为他们习惯于按照设计电子表格的方式设计数据库。设计经常随时间变化的字段（例如，年、季度、产品和销售人员）需要在将来添加新字段。而正确的设计应该是转换信息并将随时间变化的数据放在一个字段内，这样就可以添加更多记录。例如，只需创建&#8220;年&#8221;字段，然后在该字段中输入各记录相应的年份值即可，无需为每年创建一个单独的字段。</p>
<p>增加额外的字段可能会产生问题，因为表结构的变化会对应用程序的其他部分产生影响。在表中添加更多字段时，依赖该表的对象和代码也需要更新。例如，查询需要获取额外的字段，窗体需要显示这些字段，而报表则需要包含这些字段，等等。但是，如果数据已经规范化，则现有对象会自动检索新数据，并正确计算或显示这些数据。查询功能尤其强大，因为它允许您按&#8220;年&#8221;字段进行分组，以逐年显示摘要（不管表中包含哪些年份）。</p>
<p>但是，数据规范化并不意味着不能显示或使用随时间而变化或依赖时间的字段。需要浏览或显示这类信息的开发人员通常可以使用交叉表查询来达到这一目的。如果您不熟悉交叉表查询，应该学习如何使用它们。虽然它们与表有所不同（尤其是用户无法编辑交叉表查询的结果），但它们的确可以用于在数据表中显示信息（最多可以达到 255 个字段）。如果要在报表中使用它们，则会更加复杂，因为报表需要包含额外的或不断变化的字段名。这就是为什么大多数报表将数据作为独立的分组（而不是独立的列）显示的原因。对于那些别无选择的情况，您必须花时间去解决这个问题。希望所有人都能够理解这种决定会随着时间的变化对其他资源产生的影响。</p>
<p>这就是为什么增加记录是免费的（这是数据库的巨大优势）而增加字段是如此昂贵的原因。如果数据库设计正确，则可以适应各种各样的变化。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic11></a>了解何时需要复制数据</h2>
<p>有时数据需要反规范化，以便保存可能会随时间变化的信息。</p>
<p>在通过客户 ID 号将发票链接到客户表的简单示例中，我们可能需要保留开出发票时的客户地址（而不是制作发票时的地址，因为客户信息在这两个事件之间可能会有所变化）。如果开出发票时未保留客户地址，而将来又必须更新客户信息，则可能无法确定发送某些发票的确切地址。这可能会导致非常严重的商业问题。当然，有些信息（如客户的电话号码）可以不保存。因此，应该有选择地决定需要复制哪些数据。</p>
<p>需要复制数据的另一个例子是填写发票的明细项。报价单通常用于挑选客户订购的商品。我们可以只存储报价单 ID，而 ID 指向包含产品说明、价格和其他详细信息的报价单。但是，产品说明和价格会随着时间而改变。如果不将数据从报价单复制到明细表中，将来则无法准确地重新打印原始发票。如果您尚未收到付款，问题将非常严重。</p>
<p>因此，虽然规范化可以将相同的数据很好地保存在一个地方并能简化编辑工作，但某些情况下却不需要这些优势。如果以后由于历史原因需要数据的快照，则必须从一开始就在数据库中设计好。否则，一旦数据被覆盖就无法再找回。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic12></a>使用没有确切含义的字段作为主键字段</h2>
<p>为了提高效率，每个表都应该有一个主键字段。主键字段定义了在表中的唯一性，并由索引在其他字段中使用，以提高搜索性能。例如，客户表可以包含为每个客户定义唯一编号的 CustomerID 字段。为了便于讨论，假定表中包含多个字段，而不仅仅是简单的单一表查找（例如国家/地区列表）。</p>
<p>一般来说，主键字段应具有如下特征：
<ul type=disc>
    <li>应该只包含一个字段<br>可以将多个字段定义为表的主键字段，但最好是使用一个字段。首先，如果需要使用多个字段来定义唯一性，则需要占用更多的空间来存储主键。其次，表中的其他索引还必须使用主键字段的组合，这样所占用的空间比使用一个字段所占用的空间要多。最后，在表中标识记录需要获取字段组合。使用一个 CustomerID 字段定义客户比使用其他字段组合要好得多。&nbsp;
    <li>应该为数字类型<br>Access 提供的 <strong>AutoNumber</strong> 字段类型是一个 <strong>Long Integer</strong>（长整数），非常适用于主键字段。这些值可以自动保证每个记录的唯一性，同时也支持多用户数据输入。&nbsp;
    <li>不会随时间而改变<br>主键字段不应该随时间而改变。一旦标识了主键字段，就应该永远不变（象社会保障号一样）。更改过的主键字段将很难再使用历史数据，因为其中的链接被破坏了。&nbsp;
    <li>应该没有确切含义<br>要确保主键字段不会随时间而更改，它应该没有确切含义。没有确切含义的主键值在其他数据不完整时也非常有用。例如，您可以指定一个客户编号，而无需该客户的完整地址。应用程序的其余部分可以很好地工作，您也可以在检索记录时添加信息。如果表中使用了国家/地区字段或其他您没有的标识字段作为主键的一部分，则很可能会导致无法使用应用程序。 </li>
</ul>
<p>鉴于上述原因，我们建议在大部分表中使用 <strong>AutoNumber</strong> 字段作为主键字段。通过使用组合框和隐藏列，可以将字段绑定到 <strong>AutoNumber</strong> 字段并将其隐藏，使用户无法看到。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic13></a>使用引用完整性</h2>
<p>对表进行定义并理解各表是如何关联的之后，请确保添加引用完整性来巩固各表之间的关系。这样可以避免错误地修改链接字段而留下孤立的记录。Microsoft Jet 数据库引擎支持复杂的引用完整性，允许用户进行级联更新和删除。一般情况下，不应修改 ID 字段。因此，级联更新用得较少，但级联删除却非常有用。</p>
<p>例如，如果发票表与订单表相关联，其中的一张发票可能有无限多个订单（明细项），并且每个订单记录包含它所链接的发票编号，则可以使用级联删除操作来删除发票记录，并自动删除所有相应的订单记录。这样可以避免出现没有相应发票记录的订单记录。</p>
<h2 class=dtH1><a name=odc_fmsnormalization_topic14></a>小结</h2>
<p>我们希望您能尽快将这些数据库设计概念应用到您的应用程序设计中，从而最大程度地减少问题，减少未实现此类设计时需要进行的修正。祝您好运。</p>
<img src ="http://www.cppblog.com/3522021224/aggbug/25926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-09 22:31 <a href="http://www.cppblog.com/3522021224/archive/2007/06/09/25926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员进阶必看</title><link>http://www.cppblog.com/3522021224/archive/2007/06/09/25925.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Sat, 09 Jun 2007 14:19:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/09/25925.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25925.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/09/25925.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25925.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25925.html</trackback:ping><description><![CDATA[<p>高质量自然是程序员的技术追求，也是职业道德的要求。</p>
<p>宁可进度慢些，也要保证每个环节的质量，以图长远利益。</p>
<p>人员管理，项目管理，可行性与需求分析，系统设计，程序设计，测试。</p>
<p>软件开发中的三种基本策略：&#8220;复用&#8221;、&#8220;分而治之&#8221;、&#8220;优化——折衷&#8221;。</p>
<p>进步是应该的，但不进步则是可耻的。</p>
<p>在一个新系统中，大部分的内容是成熟的，只有小部分内容是创新的。</p>
<p>面向对象（Object Oriented）学者的口头禅就是&#8220;请不要再发明相同的车轮子了&#8221; 。</p>
<p>将具有一定集成度并可以重复使用的软件组成单元称为软构件(Software Component)。</p>
<p>分而治之是指把一个复杂的问题分解成若干个简单的问题，然后逐个解决。</p>
<p>优化工作不是可有可无的事情，而是必须要做的事情。当优化工作成为一种责任时，程序员才会不断改进软件中的算法，数据结构和程序组织，从而提高软件质量。</p>
<p><br>&nbsp;一些不正确的观念：<br>观念之一：我们拥有一套讲述如何开发软件的书籍，书中充满了标准与示例，可以帮助我们解决软件开发中遇到的任何问题。<br>客观情况：好的参考书无疑能指导我们的工作。充分利用书籍中的方法、技术和技巧，可以有效地解决软件开发中大量常见的问题。但实践者并不能因此依赖于书籍，这是因为：（1）现实的工作中，由于条件千差万别，即使是相当成熟的软件工程规范，常常也无法套用。（2）软件技术日新月异，没有哪一种软件标准能长盛不衰。祖传秘方在某些领域很吃香，而在软件领域则意味着落后。</p>
<p>观念之二：我们拥有最好的开发工具、最好的计算机，一定能做出优秀的软件。<br>客观情况：良好的开发环境只是产出成果的必要条件，而不是充分条件。如果拥有好环境的是一群庸人，难保他们不干出南辕北辙的事情。</p>
<p>观念之三：如果我们落后于计划，可以增加更多的程序员来解决。<br>客观情况：软件开发不同于传统的农业生产，人多不见得力量大。如果给落后于计划的项目增添新手，可能会更加延误项目。因为：（1）新手会产生很多新的错误，使项目混乱。（2）老手向新手解释工作以及交流思想都要花费时间，使实际开发时间更少。所以科学的项目计划很重要，不在乎计划能提前多少，重在恰如其分。如果用&#8220;大跃进&#8221;的方式奔向共产主义，只会产生倒退的后果。</p>
<p>观念之四：既然需求分析很困难，不管三七二十一先把软件做了再说，反正软件是灵活的，随时可以修改。<br>客观情况：对需求把握得越准确，软件的修修补补就越少。有些需求在一开始时很难确定，在开发过程中要不断地加以改正。软件修改越早代价越少，修改越晚代价越大，就跟治病一样道理。</p>
<p><br>程序设计是自由与快乐的事情，不要发誓忠于某某主义而自寻烦恼。</p>
<p>失败的技巧通常是技俩.</p>
<p><br>开发人员应该意识到：所有的错误都是严重的，不存在微不足道的错误。这样才能少犯错误。</p>
<p><br>管理的目的是让大家一起把工作做好，并且让各人获得各自的快乐和满足。当一个组织被出色地领导时，雇员甚至不知道他们已被领导。在项目完成时，他们会自豪地说：&#8220;看看我们通过努力取得的成绩吧&#8221;。所以管理者不能老惦记着自己是一个官，而应时刻意识到自己是责任的主要承担者。</p>
<p>&nbsp;</p>
<p>真正的程序员都有如下秉性： <br>一、诚实<br>程序员在学习与工作期间几乎天天与机器打交道，压根就没有受欺骗或欺骗人的机会。勤奋的程序员在调试无穷多的程序Bug时，已经深深地接受了&#8220;诚实&#8221;的教育。不诚实的人，他肯定不想做、也做不好程序员。<br>二、简单——实用主义<br>目前即使最先进的计算机也不具备智能，程序员的基本工作就是把复杂的问题转化为计算机能处理的简单的程序。如果一个问题复杂到连程序员自己都不能理解，他就无法编出程序让更笨的计算机来处理。所以程序员信奉&#8220;简单——实用&#8221;主义。<br>三、爱憎分明<br>程序员大都喜欢技术挑战，不喜欢搞测试与维护。高水平的程序员喜欢与高水平的程序员一起工作，因为他们怕&#8220;与臭棋佬下棋，棋越下越臭&#8221;。程序员大都厌恶拉帮结派、耍政治手腕。不信，数一数你认识的程序员，有几个是党派人士？<br>四、工作单调但不乏味<br>有人问编程大师：&#8220;程序设计的真正含义是什么 ？&#8221;<br>大师回答说：&#8220;饿了的时候就吃，困的时候就睡，只要时机恰当就进行程序设计。&#8221;<br>其实程序员的生活和工作已融为一体，尽管单调却不乏味，还能独享孤独。有诗为证：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我编程三日<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两耳不闻人声<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只有硬盘在歌唱</p>
<p>结论：优秀的程序员没有理由不让人喜欢，他们远比怪僻来得可爱。</p>
<p>&nbsp;</p>
<p>微软公司在选择经理人员时，总是把他们的技术知识和运用技术去赚钱的能力放在首位。</p>
<p>比盖曾这样描述聪明：人聪明人一定反应敏捷，善于接受新事物。他能迅速进入一个新领域，给你一个头头是道的解释。他提出的问题往往一针见血、击中要害。他能及时掌握所学知识，并且博闻强记，他能把本来认为互不相干的领域联系在一起使问题得到解决。他富有创新精神与合作精神&#8230;&#8230;</p>
<p><br>好的程序经理应该具备以下几个条件：<br>一、技术水平是程序员队伍中的最高级别<br>每个程序员骨子里头都有一股傲气，如果你不能技压群雄，他们就不会听你指挥。一个技术水平较差的人被任命为程序经理真是个悲剧，就象一个略有权势的太监，表面上有人对他点头哈腰，背后却被人鄙视。<br>二、能做最多且最难的工作<br>程序经理编程要快且好。别人要干一天的活，他半天就能做完，这样才会有精力去搞管理。程序经理应负责系统分析、系统设计这类最难的开发工作，并指导不同水平的程序员把各自的工作做好。如果人手不够，程序经理要能同时干几个人的活。<br>三、有人格魅力<br>软件开发是智力创作过程，你不能指望仅通过执行规章制度来产生好的作品。很多软件公司的程序经理都不是管理专业出身的，他们也不可能为了搞好管理而成天玩弄心机。技术出色的程序经理一般少有心术不正的，所以管理的重点应是&#8220;以身作则&#8221;、&#8220;公正待人&#8221;。如果程序经理在上班时趴在桌上睡觉，其他程序员也会这样干。如果程序经理发现有两个程序员趴在机器旁睡觉，不能只对其中一个大声吼叫：&#8220;你一编程就想睡觉，看看人家，在睡觉时都想着编程。&#8221;<br>如果管理者没有人格魅力，就没有人信服你，团队就不会有凝聚力，乌合之众不可能开发出优秀的软件。<br>结论：一个有活力的软件公司的各级经理都不会这样感叹，&#8220;因为我啥也不会干，所以只好当领导。&#8221;</p>
<p><br>在软件领域，技术的力量是无穷的，一天之内就可使整个产业发生巨变。</p>
<p><br>好兵好将都不是天生的，是后天练出来的；既要学会冷静地分析问题，又要充满激情地去工作。</p>
<p><br>等级制度并不限制自由和民主，它能让自以为聪明绝顶、谁也不服的人们懂得如何合作与奋斗。就象有了一架梯子，每个人才有机会爬上墙头摘下那向往已久的野花。当梯子散成一堆木棍时，只可能造就几个卖炭翁。</p>
<p>&nbsp;</p>
<p>把技术水平分为四级，第一级最低，第四级最高。第一级技术水平的程序员主要考核编程基本功，要求质量合格（他们主要来自刚毕业的大学生）。第二级技术水平的程序员编程质量要高，做过几个软件项目，有数年的工作经验，并能指导新手的工作。第三级技术水平的程序员主要考核系统分析与系统设计的能力，要求其技术有足够的深度和广度。第四级技术水平的程序员是成功的软件产品的设计师，他不仅技术超群，并且能使技术转化为有价值的商品。<br>把管理（这里仅指软件业务的管理，不考虑行政事务）水平也分成四级。第零级最低，第三级最高。第零级管理水平的人没有管理职务，就是普通员工。第一级管理水平的人是开发小组的组长，可带领几名程序员工作。第二级管理水平的人是项目经理。第三级管理水平的人决定某些产品是否要开发，以及如何去占领市场。</p>
<p><br>当我们在工作中碰到挫折时，先要冷静地分析问题（事出有因哪），找出问题的内因与外因。内因是最主要的，应该予以最先解决。</p>
<p><br>&#8220;迷信&#8221;是傻子碰到骗子的结果。</p>
<p><br>为了不让自己&#8220;傻&#8221;，善良的人们应该用脑子去多学一些知识，努力让自己来把握命运，不要急着把一生托给某个人或某个组织。</p>
<p>上天不可能赋于一个人太多的优点，以致于他没有表示谦虚的余地。</p>
<p><br>我们在求学时可能太功利太挑剔，导致知识结构非常单薄，只怕到了晚年也成不了大器。当程序员擅长技术时，还要时刻留意弥补自己并不擅长的非技术才能。扬长补短才能提高综合素质。</p>
<p>人是最有价值的资源。</p>
<p>进度安排并不见得一定要符合逻辑顺序。应尽可能地先做技术难度高的事，后做难度低的事。也就是辛苦在前，轻松在后。</p>
<p>里程碑就象心灵的灯塔，使忙碌的人群不混乱，不迷失方向。</p>
<p>人在做一件事情时，由于存在很多不确定的因素，一般不可能100% 地达到目标。假设平常人做事能完成目标的80%。如果某个人的目标是100分，那么他最终成绩可达80分。如果某个人的目标只是60分，那么他最终成绩只有48分。</p>
<p>如果没有高目标，人的堕落就很快。如果没有&#8220;零缺陷&#8221;的质量目标，也许缺陷就会成堆。</p>
<p>软件是如此的灵活，如果没有规范来制约，就容易因无序的喜好而导致混沌；但规范如果太严密了，就会扼杀程序员生机勃勃的创造力。</p>
<p>简洁是一种美!</p>
<p>每当我们沉迷于短期利益不思进取时，应该好好回忆童年时代那些伟大的抱负，给自己一些激励。</p>
<p>&#8220;人分四类——人物，人才，人手，人渣。&#8221;</p>
<p>我曾得到很多炫目的荣誉，但学生时代的荣誉只是一种鼓励，并不是对我才能和事业的确认。</p>
<p>&#8220;当你没法扶一个人上马时，也许应该拉他下马&#8221;------李敖</p>
<p><br>为什么软件系统分析员的工资要比普通程序员高？就是因为需求分析困难嘛。</p>
<p>如果您学会了客观、科学的可行性分析，在作决策时就要果断。</p>
<p>系统设计的优劣在根本上决定了软件系统的质量。</p>
<p>文学中有科学，音乐中有数学，漫画中有现代数学的拓扑学。漫画家可以&#8220;几笔&#8221;就把一个人画出来，不管怎么美化或丑化，就是活像。为什么？因为那&#8220;几笔&#8221;不是别的，而是拓扑学中的特征不变量，这是事物最本质的东西。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------杨叔子</p>
<p>体系结构是软件系统中最本质的东西。</p>
<p>&nbsp; 内聚（Cohesion）是一个模块内部各成分之间相关联程度的度量。耦合（Coupling）是模块之间依赖程度的度量。</p>
<p>技术进步最快也快不过人们欲望的增长。</p>
<p>对象（Object）是类（Class）的一个实例（Instance）。</p>
<p><br>医生可以把他的错误埋葬在地下了事，但程序员不能。我们必须要学会测试与改错，并且把测试与改错工作做好。</p>
<p>测试并不仅是个技术问题，更是个职业道德问题。</p>
<p>测试只能证明缺陷存在，而不能证明缺陷不存在。</p>
<p>改错是个大悲大喜的过程，一天之内可以让人在悲伤的低谷和喜悦的颠峰之间跌荡起伏。</p>
<p>程序中的错误只有开发者自己才能找出并改掉。如果因畏惧而拖延，会让你终日心情不定，食无味，睡不香。所以长痛不如短痛，要集中精力对付错误。</p>
<p>编程大师曾说：&#8220;哪怕程序只有三行长，总有一天你也不得不对它维护。&#8221;</p>
<img src ="http://www.cppblog.com/3522021224/aggbug/25925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-09 22:19 <a href="http://www.cppblog.com/3522021224/archive/2007/06/09/25925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++书籍总汇</title><link>http://www.cppblog.com/3522021224/archive/2007/06/09/25916.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Sat, 09 Jun 2007 11:42:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/09/25916.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25916.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/09/25916.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25916.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25916.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">利用假日，把我所有的书籍整理了一下，以前也整理过，但算不上很全。以下的书籍全部是我自己传上去的，基本上是国内外比较经典的C++学习资料。大部分为PDF格式，少数几个为PDG格式，都能够下载。感谢CSDN提供如此大的空间，前面的有少数部分下载可能需要积分，那是以前传的，不过积分很少，也很容易赚，今天上传的就不会要了，大家如果看到自己喜欢的书，就下载吧。由于书籍比较多，不可能对书一一作介绍，以后有时间会补充，<img src="http://bbs.bc-cn.net/Skins/Default/emot/em01.gif" onload="javascript:if(this.width>650)this.style.width=650;" align=middle border=0 src_cetemp="http://bbs.bc-cn.net/Skins/Default/emot/em01.gif"><br><br><span style="FONT-SIZE: 18pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 认为有用就顶一下<br><span style="FONT-SIZE: 8pt">===1===《C++沉思录完整版》（中文版）<br></span><a href="http://download.csdn.net/source/172842" target=_blank><a href="http://download.csdn.net/source/172842" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172842</span></a></a><br><br><span style="FONT-SIZE: 8pt">===2===《C++Primer 3rd》英文版&nbsp;&nbsp;<br></span><a href="http://download.csdn.net/source/172847" target=_blank><a href="http://download.csdn.net/source/172847" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172847</span></a></a><br><span style="FONT-SIZE: 8pt">C++ Primer的第三版结合了Stanley Lippman的实践经验和Jos&#233;e Lajoie对于ANSI/ISO标准C++的深入理解。这本指导书的第三版已经被重新改写过，以便更加精确地讲述标准C++的特性和用法。在本书中，对于C++初学者特别有价值的是一些来自真实世界中的程序例子，它们说明了泛型程序(generic program)的设计、面向对象程序的设计、模板的用法，以及使用标准C++进行程序设计的方方面面。而且，本书也在适当的地方讲到了一些习惯用法以及效率指导。<br><br><br>===3===《C++代码设计与重用》<br></span><a href="http://download.csdn.net/source/172849" target=_blank><a href="http://download.csdn.net/source/172849" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172849</span></a></a><br><br><span style="FONT-SIZE: 8pt">===4===《C++编程思想》<br></span><a href="http://download.csdn.net/source/172854" target=_blank><a href="http://download.csdn.net/source/172854" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172854</span></a></a><br><br><span style="FONT-SIZE: 8pt">===5===《c++语言命令详解 》<br></span><a href="http://download.csdn.net/source/172856" target=_blank><a href="http://download.csdn.net/source/172856" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172856</span></a></a><br><br><span style="FONT-SIZE: 8pt">===6===《C++专家编程 》<br></span><a href="http://download.csdn.net/source/172857" target=_blank><a href="http://download.csdn.net/source/172857" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172857</span></a></a><br><br><span style="FONT-SIZE: 8pt">===7===《STL中文版》<br></span><a href="http://download.csdn.net/source/172860" target=_blank><a href="http://download.csdn.net/source/172860" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172860</span></a></a><br><span style="FONT-SIZE: 8pt">本书对C++ STL进行了全面而深入的阐述。STL（标准模板库）是在惠普实验室中开发的，已纳入ANSI/ISO C++标准。其中的代码采用模板类及模板函数的方式，可以极大地提高编程效率。本书由P.J. Plauger等四位对C++ STL的实现有着卓越贡献的大师撰写，详细讨论了C++ STL的各个部分。全书分为16章，其中的13章通过背景知识、功能描述、头文件代码、测试程序和习题，分别讲述了C++ STL中的13个头文件，其他章节介绍了STL中广泛涉及的三个主题--迭代器、算法和容器。本书附录列出了接口和术语表，最后列出了参考文献。 本书适合对C++有一定了解的程序员及高等院校师生阅读。<br><br><br>===8===《C++程序设计语言特别版》(中文版+英文原版）<br></span><a href="http://download.csdn.net/source/172869" target=_blank><a href="http://download.csdn.net/source/172869" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172869</span></a></a><br><span style="FONT-SIZE: 8pt">图书类型：pdg &amp; pdf<br>知子莫若父 C++程序设计语言特别版(中文版) (pdg) &amp;&amp;The C++ Programming Language Special 3rd Edition(pdf) (中文版+原版)<br>本书是讲述标准C++的最完整和最新著作，他拥有最多的读者，使用也最广泛，按我目前的统计，本书已经被翻译成17种语言。所以，这个译本所依据的原文，已经从成千上万的读者建议中获益匪浅 <br><br><br>===9===《C++.编程思想.第2卷.实用编程技术》<br></span><a href="http://download.csdn.net/source/172872" target=_blank><a href="http://download.csdn.net/source/172872" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172872</span></a></a><br><span style="FONT-SIZE: 8pt">《C++编程思想》(第1版) 荣获1996年度《软件开发》杂志的图书震撼大奖 (Jolt Award)，成为该年度最佳图书。 <br>本书内容：<br>&#183;介绍实用的编程技术和最佳的实践方法，解决C++开发中最困难的课题<br>&#183;深入研究标准C++库的功能，包括：字符串、输入输出流、STL算法和容器<br>&#183;讲述模板的现代用法，包括模板元编程<br>&#183;解开对多重继承的困惑，展示RTTI的实际使用<br>&#183;深入探究异常处理方法，清晰解释异常安全设计<br>&#183;介绍被认为是标准C++下一版特征之一的多线程处理编程技术，并提供最新研究成果<br>&#183;对书中包含的所有示例代码都提供免费下载，这些代码段经过多个软件平台和编译器(包括基于Windows/Mac/Linux的GNU C++编译器) 的测试，稳定可靠。<br>在本书作者的个人网站</span><a href="http://www.bruceeckel.com/" target=_blank><a href="http://www.bruceeckel.com/" target=_blank><span style="FONT-SIZE: 8pt">www.BruceEckel.com</span></a></a><span style="FONT-SIZE: 8pt">上提供：<br>&#183;本书的英文原文、源代码、练习解答指南、勘误表及补充材料<br>&#183;本书相关内容的研讨和咨询<br>&#183;本书第1卷及第2卷英文电子版的免费下载链接</span><br><br><span style="FONT-SIZE: 8pt">===10===《面向对象分析与设计(UML.2.0版)》<br></span><a href="http://download.csdn.net/source/173086" target=_blank><a href="http://download.csdn.net/source/173086" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/173086</span></a></a><br><br><span style="FONT-SIZE: 8pt">===11===《程序设计语言实践之路 》<br></span><a href="http://download.csdn.net/source/173098" target=_blank><a href="http://download.csdn.net/source/173098" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/173098</span></a></a><br><br><span style="FONT-SIZE: 8pt">===12===《数据结构.C++语言描述》<br></span><a href="http://download.csdn.net/source/175821" target=_blank><a href="http://download.csdn.net/source/175821" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175821</span></a></a><br><br><span style="FONT-SIZE: 8pt">===13===《深入浅出MFC》<br></span><a href="http://download.csdn.net/source/175825" target=_blank><a href="http://download.csdn.net/source/175825" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175825</span></a></a><br><br><span style="FONT-SIZE: 8pt">===14===《现代C++.程序设计》<br></span><a href="http://download.csdn.net/source/175829" target=_blank><a href="http://download.csdn.net/source/175829" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175829</span></a></a><br><br><span style="FONT-SIZE: 8pt">===15===《数据结构C++.语言描述.应用标准摸板库STL第2版》<br></span><a href="http://download.csdn.net/source/175837" target=_blank><a href="http://download.csdn.net/source/175837" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175837</span></a></a><br><span style="FONT-SIZE: 8pt">《数据结构C++语言描述—应用标准模板库（STL）（第2版）》<br>本书是Ford和Topp两位教授于1996年出版的名着Data Structures with C++的第2版，在全球范围内已经有数以万计的学生从中受益。<br>作者将C＋＋语言作为算法描述语言，应用包含规范化的数据结构的标准模板库，集中讲述了数组、向量、表、关联树容器，以及集合、映射、堆、哈希表和图等数据结构及其算法，重点讨论了如何高效地存储大型数据集合，涵盖了数据结构初级和高级教程的最新内容。书中各章章前提出学习目标，章后附有丰富的练习题、答案以及书面练习和上机编程练习，指导读者迅速、全面地掌握核心知识点和编程技巧。<br>本书可作为计算机及相关专业数据结构课程的核心教材，对于广大研发人员，也是一本数据结构与面向对象技术完整结合的全新技术参考用书。<br><br>===16===《STL.源码剖析》<br></span><a href="http://download.csdn.net/source/175842" target=_blank><a href="http://download.csdn.net/source/175842" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175842</span></a></a><br><span style="FONT-SIZE: 8pt">这本书不适合C++ 初学者，不适合 Genericity（泛型技术）初学者，或 STL 初学者。这本书也不适合带领你学习面向对象（Object Oriented）技术 — 是的，STL 与面向对象没有太多关连。本书前言清楚说明了书籍的定位和合适的读者，以及各类基础读物。如果你的Generic Programming/STL实力足以阅读本书所呈现的源码，那么，恭喜，你踏上了基度山岛，这儿有一座大宝库等着你。源码之前了无秘密，你将看到vector的实现、list的实现、heap的实现、deque的实现、RB-tree的实现、hash-table的实现、set/map 的实现；你将看到各种算法（排序、搜寻、排列组合、数据移动与复制&#8230;）的实现；你甚至将看到底层的memory pool 和高阶抽象的traits 机制的实现。那些数据结构、那些算法、那些重要观念、那些编程实务中最重要最根本的珍宝，那些蜇伏已久彷佛已经还给老师的记忆，将重新在你的脑中闪闪发光。 <br><br><br>===17===《C++.多范型设计》<br></span><a href="http://download.csdn.net/source/175846" target=_blank><a href="http://download.csdn.net/source/175846" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175846</span></a></a><br><span style="FONT-SIZE: 8pt">C++是一种支持多种范型的编程语言：类、重载函数、模板、模块以及过程编程，等等。除了该语言的灵活性和丰富性以外，此前创建一种设计模式以支持在单个应用中使用多种范型的努力还很欠缺。<br>本书介绍了使用多范型设计的一连串框架，提供了形成正式多范型设计方法的基础的一系列超前的设计实践。 <br>本书提供了利用C++的多范型能力的分析过程和设计过程的知识。书中使用易于理解的记法和易读的解释来帮助所有的C++程序员(不仅是系统构建工程师或设计者)在他们的应用开发中组合多种范型，以获得更加高效、健壮、更具可移植性和更容易复用的软件。 <br>读者将获得对支持多范型设计的领域工程方法的理解、本书揭示了如何使用共同性和差异性的原则来分析应用领域，从而根据最适合每个领域的范型来定义子领域。多范型设计比任何一种技术或方法挖掘得更深，以处理软件抽象和设计的基本问题。<br>本书介绍了所有形成领域工程基础的概念和技术、这些概念包括：深入了解共同性和差异性分析，领域工程如何与常用设计模式相互影响，如何找到应用领域中的抽象，以及领域工程的原则如何用作对象范型的抽象技术的基础。最重要的是，本书讨论了在设计阶段如何将最适当的范型应用于实现的分析技术。<br><br><br>===18===《C++.参考大全第四版》<br></span><a href="http://download.csdn.net/source/175851" target=_blank><a href="http://download.csdn.net/source/175851" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175851</span></a></a><br><span style="FONT-SIZE: 8pt">本书是根据着名C语言专家Herbert Schildt的着作翻译的。这是一本关于C++语言的百科全书，包括C 和C++的命令、功能、编程和应用等方面的内容。全书分为五个部分：C++基础：C子集；C++的专有特征；标准函数库；标准C++类库；C++应用程序范例。详细描述和演示了定义C++语言的关键字、语法、函数、类和特征。其中第一部分全面讨论了C++的C子集；第二部分详细介绍了C++本身的特性，如类和对象、构造函数、析构函数和模板等；第三部分描述了标准函数库；第四部分讨论了标准类库，包括STL（标准模板库）；第五部分显示了两个应用C++和面向对</span><span style="FONT-SIZE: 8pt">象编程的实际例子。 本书内容全面、翔实，是学习C++编程语言的广大学生的一部有用的工具书，也是对C++感兴趣的读者的必备参考书。 <br><br>===19===《C++编程艺术》<br></span><a href="http://download.csdn.net/source/175852" target=_blank><a href="http://download.csdn.net/source/175852" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175852</span></a></a><br><span style="FONT-SIZE: 8pt">本书揭示了C++程序员创建世界级软件的奥秘。程序设计大师Herbert Schildt通过将C++语言广泛应用于功能强大的编程任务中，全面展示了C++语言的多功能性，敏捷性，和艺术性。本书内容包括探索C++的功能，创建内存管理的垃圾回收器子系统，开发线程控制面板，建立译码器以扩展C++的功能，开发可断点续传的Internet文件下载工具，创建财务分析库，用基于AI的搜索技术探索人工智能，建立定制的STL容器，以及开发Mini C++解释程序。书中所有示例和项目的源代码都可以从</span><a href="http://www.osborne.com/" target=_blank><a href="http://www.osborne.com/" target=_blank><span style="FONT-SIZE: 8pt">www.osborne.com</span></a></a><span style="FONT-SIZE: 8pt"> 上免费下载。 <br><br>===20===《C++.编程惯用法.高级程序员常用方法和技巧》<br></span><a href="http://download.csdn.net/source/175854" target=_blank><a href="http://download.csdn.net/source/175854" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175854</span></a></a><br><br><span style="FONT-SIZE: 8pt">===21===《C++必知必会——图灵程序设计丛书》<br></span><a href="http://download.csdn.net/source/175857" target=_blank><a href="http://download.csdn.net/source/175857" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175857</span></a></a><br><span style="FONT-SIZE: 8pt">本书面向进阶C++的初学者，以及那些想把C++水平提高到专业水准的程序员和开发人员。... <br>本书描述了C++编程和设计中必须掌握但通常被误解的主题，这些主题涉及的范围较广，包括指针操作、模板、泛型编程、异常处理、内存分配、设计模式等。作者根据本人以及其他有经验的管理人员和培训老师的经验总结，对与这些主题相关的知识进行了精心挑选，最终浓缩成63条。每一条款所包含的内容均为进行产品级C++编程所需的关键知识。作者称这些知识为C++程序员必备的&#8220;常识&#8221;，其实并非意味简单或平庸，而是&#8220;必不可少&#8221;。<br>本书适合于中、高级C++程序员，也适合C或Java程序员转向C++程序设计时参考<br><br>===22===《C++.Primer第三版中文版》<br></span><a href="http://download.csdn.net/source/175861" target=_blank><a href="http://download.csdn.net/source/175861" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175861</span></a></a><br><span style="FONT-SIZE: 8pt">======== C++Primer第三版中文版题解<br></span><a href="http://download.csdn.net/source/172893" target=_blank><a href="http://download.csdn.net/source/172893" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/172893</span></a></a><br><br><br><span style="FONT-SIZE: 8pt">===23===《C++.语言的设计和演化》<br></span><a href="http://download.csdn.net/source/175864" target=_blank><a href="http://download.csdn.net/source/175864" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175864</span></a></a><br><span style="FONT-SIZE: 8pt">C++程序设计语言是由来自AT&amp;T Bell Laboratories的Bjarne Stroustrup（即本文作者）设计和实现的，它兼具Simula语言在组织与设计方面的特性以及适用于系统程序设计的C语言设施。C++最初的版本被称作&#8220;带类的C（C with classes）&#8221;[Stroustrup,1980]，在1980年被第一次投入使用；当时它只支持系统程序设计（&#167;3）和数据抽象技术（&#167;4.1）。支持面向对象程序设计的语言设施在1983年被加入C++；之后，面向对象设计方法和面向对象程序设计技术就逐渐进入了C++领域。在1985年，C++第一次投入商业市场[Stroustrup,1986][ Stroustrup,1986b]。在1987至1989年间，支持范型程序设计的语言设施也被加进了C++[Ellis,1990][Stroustrup,1991]。<br>本书是由C＋＋语言的设计师本人所写，描述C＋＋语言的发展历史、设计理念及技术细节的著作。在计算机发展史上，这种从多方面多角度描述一种主流语言各个方面的综合性著作，至今我还只看到这一本。阅读</span><span style="FONT-SIZE: 8pt">本书，不仅可以了解有关C＋＋语言的许多重要技术问题和细节，还可以进一步理解各种C＋＋特征的设计出发点、设计过程中所考虑的方方面面问题，以及语言成形过程中的各种权衡与选择。<br>作为C++语言的创造者，作者对于自己的作品自然是珍爱有加。对某些针对C++语言的批论，本书中也有一些针锋相对的的比较尖锐的观点。但纵观全书，作者的观点和意见还是比较客观的，并没有什么过于情绪化的东西。<br><br>===24===《Essential.C++》...中文版.候捷译<br></span><a href="http://download.csdn.net/source/175865" target=_blank><a href="http://download.csdn.net/source/175865" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175865</span></a></a><br><span style="FONT-SIZE: 8pt">stanley B.Lippman所著的《C++ Essential》雄距书坛历久不衰，堪称C++最佳教本，但是走过10个年头之后，继1237页的《C++ Essential》第三版，Lippman 又朴归真地写了这本276页的《Essential C++》，有了满汉全席，为何还眷顾清粥小菜？完成了伟大的巨著，何必回头再写这么一本轻薄短小的初学者用书呢？<br>所有知道Lippman和《C++ Essential》的人，脸上都浮现相同的问号。 <br><br>===25===《Effective STL-revised》英文版<br></span><a href="http://download.csdn.net/source/175867" target=_blank><a href="http://download.csdn.net/source/175867" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175867</span></a></a><br><br><span style="FONT-SIZE: 8pt">===26===《Effective C++ &amp; More Effective C++》.chm<br></span><a href="http://download.csdn.net/source/175868" target=_blank><a href="http://download.csdn.net/source/175868" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175868</span></a></a><br><br><span style="FONT-SIZE: 8pt">===27===&lt;c++设计新思维〉mcd-c-ch1-4.pdf<br></span><a href="http://download.csdn.net/source/175869" target=_blank><a href="http://download.csdn.net/source/175869" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175869</span></a></a><br><span style="FONT-SIZE: 8pt">一般對C++ templates 的粗淺印象，大約停留在「容器（containers）」的製作。稍有研究則會發現，templates衍生出來的C++ Generic Programming（泛型編程）技術，在C++ 標準程式庫已經遍開花結果。以STL為重要骨幹的C++ 標準程式庫，將templates 廣泛運用於容器（containers）、演算法（algorithms）、仿函式（functors）、配接器（adapters）、配置器（allocators）、迭代器（iterators）頭，無處不在，無役不與，乃至於原有的class-based iostream都被改寫為template-based iostream<br><br><br>===28===&lt;C++高级参考手册&gt;<br></span><a href="http://download.csdn.net/source/175872" target=_blank><a href="http://download.csdn.net/source/175872" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175872</span></a></a><br><br><span style="FONT-SIZE: 8pt">===29===〈c++&nbsp;&nbsp;多范型设计〉<br></span><a href="http://download.csdn.net/source/175873" target=_blank><a href="http://download.csdn.net/source/175873" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175873</span></a></a><br><br><span style="FONT-SIZE: 8pt">===30===现代计算机常用数据结构和算法<br></span><a href="http://download.csdn.net/source/175878" target=_blank><a href="http://download.csdn.net/source/175878" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/175878</span></a></a><br><br><span style="FONT-SIZE: 8pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>====31====算法导论（原书第2版)&nbsp;&nbsp;（美）Thomas H.Cormen, Charles E.Leiserson 等<br></span><a href="http://download.csdn.net/source/177102" target=_blank><a href="http://download.csdn.net/source/177102" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/177102</span></a></a><br><span style="FONT-SIZE: 8pt">算法领域的标准教材，全球多所知名大学选用<br>本书以相当的深度介绍了许多常用的数据结构和有效的算法，使得这些算法的设计和分析易于被各个层次的读者所理解。<br>本书编写上采用了&#8220;五个一&#8221;，即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。<br>　　●MIT名师联手铸就，被誉为&#8220;计算机算法的圣经&#8221;<br>　　●教学网址、视频课程及在线学习中心，全方位学习模式<br>　　本书深入浅出，全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣，并保持了数学严谨性。本书的设计目标全面，适用于多种用途。涵盖的内容有：算法在计算中的作用，概率分析和随机算法的介绍。本书专门讨论了线性规划，介绍了动态规划的两个应用，随机化和线性规划技术的近似算法等，还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法，以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明，对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。<br>　　本书内容丰富，对本科生的数据结构课程和研究生的算法课程都是很实用的教材。本书在读者的职业生涯中，也是一本案头的数学参考书或工程实践手册。<br>　　在有关算法的书中，有一些叙述非常严谨，但不够全面，另一些涉及了大量的题材，但又缺乏严谨性。《算法导论》将严谨性和全面性融为一体。<br></span>　<span style="FONT-SIZE: 8pt">　本书深入讨论各类算法，并着力使这些算法的设计和分析能为各个层次的读者接受。各章自成体系，可以作为独立的学习单元。算法以英语和伪代码的形式描述，具备初步程序设计经验的人就能看懂。说明和解释力求浅显易懂，不失深度和数学严谨性。<br>　　本书自第1版出版以来，已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。第2版增加了论述算法作用、概率分析与随机算法、线性规划等几章。同时，对第1版的几乎每一节都作了大量的修订。一项巧妙而又重要的修改是提前引入循环不变式，并在全书中用来证明算法的正确性。在不改变数学和分析重点的前提下，作者将许多数学基础知识从第一部分移到了附录中，并在开始部分加入了一些富有诱导性的题材。<br><br>===32===算法导论答案<br></span><a href="http://download.csdn.net/source/174789" target=_blank><a href="http://download.csdn.net/source/174789" target=_blank><span style="FONT-SIZE: 8pt">http://download.csdn.net/source/174789</span></a><br></a><span style="FONT-SIZE: 8pt">不用多介绍了，看标题就知道了，~-~</span><br>
<p style="FONT-SIZE: 8pt">===33===《计算机程序设计艺术》第三版第二卷半算值算法<br><a href="http://download.csdn.net/down/165775" target=_blank><a href="http://download.csdn.net/down/165775" target=_blank>http://download.csdn.net/down/165775</a><br></a><br>===34===《计算机程序设计艺术》第三版第一卷基本算法<br><a href="http://download.csdn.net/down/168064" target=_blank><a href="http://download.csdn.net/down/168064" target=_blank>http://download.csdn.net/down/168064</a></a></p>
<p style="FONT-SIZE: 8pt">===35===计算机程序设计艺术》第三版第三卷排序和查找<br><a href="http://download.csdn.net/source/165459" target=_blank><a href="http://download.csdn.net/source/165459" target=_blank>http://download.csdn.net/source/165459</a></a><br><br>另外提供一个包含以上三卷的中文版<a href="http://www.gz183.com.cn/downloadpage/download_1438.htm" target=_blank><a href="http://www.gz183.com.cn/downloadpage/download_1438.htm" target=_blank>http://www.gz183.com.cn/downloadpage/download_1438.htm</a><br></a></p>
</span></span>
<img src ="http://www.cppblog.com/3522021224/aggbug/25916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-09 19:42 <a href="http://www.cppblog.com/3522021224/archive/2007/06/09/25916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样实现数目不定的函数参数 </title><link>http://www.cppblog.com/3522021224/archive/2007/06/09/25869.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Fri, 08 Jun 2007 16:05:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/09/25869.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25869.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/09/25869.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25869.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25869.html</trackback:ping><description><![CDATA[<p><strong><span>怎样实现数目不定的函数参数</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong>2006-12-28</strong> </span></p>
<p><span><strong>erran</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>实现方法一：自定义指针找到函数参数的下一个参数；</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>//</span> <span>例子</span> <span>A</span> <span>：</span> </strong></p>
<p><span><strong>template&lt;class T&gt;</strong> </span></p>
<p><span><strong>T umin(T _a, ...)</strong> </span></p>
<p><span><strong>{<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>T _r = _a;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>T* _p = &amp;_a;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int count = 1;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>while ((*_p) != -1)</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (_r &gt; (*_p)) _r = (*_p);</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; "No." &lt;&lt; count &lt;&lt; ": " &lt;&lt; (*_p) &lt;&lt; endl;<br></strong></span></p>
<p><strong><span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span> <span>计算第二个参数的地址，并且输出该地址</span> </strong></p>
<p><strong><span>//</span> <span>注：</span> <span>在３２位（４字节）机器上表现为所有的变量地址都能被４整除</span> </strong></p>
<p><strong><span>//</span> <span>相当于</span> <span>_INTSIZEOF(n):&nbsp;((sizeof(n) + sizeof(int) - 1) &amp; ~(sizeof(int) - 1) )</span> </strong></p>
<p><strong><span>//</span> <span>问题是用这个式子去算，是无法知道哪个才是最后哪个参数。所以用－</span> <span>1</span> <span>做结束参数。</span> </strong></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_p = (T*)((char *)_p + (sizeof(T) + sizeof(int) - 1) / sizeof(int) * sizeof(int));<br></strong></span></p>
<p><span><strong><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>count++;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return _r;</strong> </span></p>
<p><span><strong>}</strong> </span></p>
<p><strong><span>//</span> <span>调用：</span> </strong></p>
<p><span><strong>int main(int argc, char* argv[])</strong> </span></p>
<p><span><strong>{</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int a, b, c, d, e;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>a = 1;<span>&nbsp;&nbsp;&nbsp; </span>b = 3;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>c = 2;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>d = 12;&nbsp;e = 34;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; umin&lt;int&gt;( a, b, c, d, e, -1) &lt;&lt; endl;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong>cout &lt;&lt; umin&lt;int&gt;(1, 4, 2, 5, 2, -1) &lt;&lt; endl;</strong> </span></p>
<p><span><strong>cout &lt;&lt; umin&lt;char&gt;('a', 'b', 'c', 'd', 'e', -1) &lt;&lt; endl; </strong></span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return 0;</strong> </span></p>
<p><span><strong>}</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>实现方法二：利用</span> <span>ＡＮＳＩＣ提供的三个宏</span> <code><span>va_arg，</span> </code><code><span>va_end, va_start</span> </code><span>来实现</span> <span>；</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>这三个宏定义在头文件</span> <span>stdarg.h</span> <span>中</span> <span>,</span> <span>主要有：</span> <span>va_arg, va_end, va_start</span> <span>，</span> <span>va_list</span> </strong></p>
<p><strong><span><br>在</span> <span>_WIN32</span> <span>下：</span> </strong></p>
<p><span><strong>typedef char * va_list; <br></strong></span></p>
<p><strong><span><br>其它的三个</span> <span>(</span> <span>不同的平台会有不太一样</span> <span>)<br></span></strong></p>
<p><span><strong><br>/* A c at the proper definitions for other platforms */ </strong></span></p>
<p><span><strong>#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) &amp; ~(sizeof(int) - 1) ) </strong></span></p>
<p><span><strong>#define va_start(ap,v) ( ap = (va_list)&amp;v + _INTSIZEOF(v) ) </strong></span></p>
<p><span><strong>#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) </strong></span></p>
<p><span><strong>#define va_end(ap) ( ap = (va_list)0 )<br></strong></span></p>
<p><strong><span><br>其实这个方法的实现原理同方法一是一样的。<br></span></strong></p>
<p><strong><span><br>//</span> <span>例子</span> <span>B</span> <span>：</span> </strong></p>
<p><span><strong>template&lt;class T&gt;</strong> </span></p>
<p><span><strong>T umin(T _a, ...)</strong> </span></p>
<p><span><strong>{<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>T _p = _a;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>T _r = _a;</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int count = 1;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>va_list arg_ptr;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>va_start(arg_ptr, _a);</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>while (_p != -1)//</span> <span>所以用－</span> <span>1</span> <span>做结束参数。</span> </strong></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (_r &gt; _p) _r = _p;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; "No." &lt;&lt; count &lt;&lt; ": " &lt;&lt; _p &lt;&lt; endl;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>_p = va_arg(arg_ptr, int);</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>count++;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>va_end(arg_ptr);</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return _r;</strong> </span></p>
<p><span><strong>}<br></strong></span></p>
<p><strong><span><br>//</span> <span>调用：</span> </strong></p>
<p><span><strong>int main(int argc, char* argv[])</strong> </span></p>
<p><span><strong>{</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int a, b, c, d, e;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>a = 1;<span>&nbsp;&nbsp;&nbsp; </span>b = 3;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>c = 2;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>d = 12;&nbsp;e = 34;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; umin&lt;int&gt;( a, b, c, d, e, -1) &lt;&lt; endl;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong>cout &lt;&lt; umin&lt;int&gt;(1, 4, 2, 5, 2, -1) &lt;&lt; endl;</strong> </span></p>
<p><span><strong>cout &lt;&lt; umin&lt;char&gt;('a', 'b', 'c', 'd', 'e', -1) &lt;&lt; endl; </strong></span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return 0;</strong> </span></p>
<p><span><strong>}</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>方法一和方法二都会遇到同一个问题：那就是没有办法知道该函数中一共到底有多少个参数。因为你</span> <span>没有办法去判断到底哪个指针才是最后的哪个参数的地址。</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>想到一个解决方法是在该函数最后添加一个标志参数，以标志该参数是最后一个参数，但是应该注意的是：作为标志参数的条件是，该标志是不可能出现在此前的参数表中。如以上函数调用的最后那个参数（－</span> <span>1</span> <span>）。</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>我想</span> <span>c</span> <span>语言里面的</span> <span>scanf</span> <span>和</span> <span>printf</span> <span>等函数应该做过一些特殊处理。</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>函数的参数地址是连续的，但是</span> <code><span>可变参数列表提供了很大的灵活性，且对可变部分的参数<span>C语言编译器不会进行类型检查，所以程序中要特别小心，必须确保参数的传递和接受是正确的；而且C语言的实现也依赖于ｃｐｕ和操作系统，所以并不适用于所有的计算机和系统，而且随机器的不同会由很大的区别。所以</span></span> </code><span>stdarg.h</span> <span>定义很多宏。如：</span> </strong></p>
<p><span><strong>#if<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>!defined(_WIN32) &amp;&amp; !defined(_MAC)</strong> </span></p>
<p><span><strong>#error ERROR: Only Mac or Win32 targets supported!</strong> </span></p>
<p><span><strong>#endif</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>关于函数参数的地址</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>写了一下测试代码，来测试函数的参数地址是不是连续的。</span> </strong></p>
<p><strong><span>测试代码如下</span> <span>:<br></span></strong></p>
<p><strong><span><br>//</span> <span>例子</span> <span>C</span> </strong></p>
<p><span><strong>#include &lt;iostream&gt;</strong> </span></p>
<p><span><strong>using namespace std; </strong></span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong>template&lt;class T&gt;</strong> </span></p>
<p><span><strong>T umin(T _a, T _b, T _c, T _d, T _e)</strong> </span></p>
<p><span><strong>{<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><strong><span>//</span> <span>输出各个参数的地址</span> </strong></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; "_a : " &lt;&lt; hex &lt;&lt; (int*)(&amp;_a) &lt;&lt; endl;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; "_b : " &lt;&lt; hex &lt;&lt; (int*)(&amp;_b) &lt;&lt; endl;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; "_c : " &lt;&lt; hex &lt;&lt; (int*)(&amp;_c) &lt;&lt; endl;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; "_d : " &lt;&lt; hex &lt;&lt; (int*)(&amp;_d) &lt;&lt; endl;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; "_e : " &lt;&lt; hex &lt;&lt; (int*)(&amp;_e) &lt;&lt; endl;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span> <span>取得最小值</span> </strong></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>T _r = _a;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>if (_r &gt; _b) _r = _b;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>if (_r &gt; _c) _r = _c;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>if (_r &gt; _d) _r = _d;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return _r;</strong> </span></p>
<p><span><strong>}</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong>int main(int argc, char* argv[])</strong> </span></p>
<p><span><strong>{</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int a, b, c, d, e;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>a = 1;<span>&nbsp;&nbsp;&nbsp; </span>b = 3;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>c = 2;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>d = 12;&nbsp;e = 34;</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; umin&lt;int&gt;(a, b, c, d, e) &lt;&lt; endl;//</span> <span>调用一</span> </strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; umin&lt;int&gt;(1, 4, 2, 5, 2) &lt;&lt; endl; //</span> <span>调用二</span> </strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; umin&lt;char&gt;('a', 'b', 'c', 'd', 'e') &lt;&lt; endl;//</span> <span>调用三</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return 0;</strong> </span></p>
<p><span><strong>}</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<p><strong><span>在</span> <span>VC6.0</span> <span>下编译，发现：</span> </strong></p>
<p><strong><span>对于例子</span> <span>C</span> <span>：</span> <span>在编译器不作任何优化的时候（及编译选项选择</span> <span>Disable(Debug)</span> <span>），对于调用一、二、三的参数</span> <span>_a, _b, _c, _d, _e</span> <span>都是连续的。在选择优化运行速度</span> <span>(</span> <span>及编译选项选择</span> <span>Maximize Speed), min</span> <span>的参数地址并不都是连续的。而用对于例子</span> <span>A</span> <span>和例子</span> <span>B</span> <span>：两种情况都是连续的</span> <span>(</span> <span>测试的时候要更改相应的代码</span> <span>).</span> </strong></p>
<p><span><strong>&nbsp;</strong> </span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=127>
            <p><strong><span>例</span> <span>C Disable(Debug)</span> </strong></p>
            </td>
            <td vAlign=top width=132>
            <p><strong><span>例</span> <span>C Maximize Speed</span> </strong></p>
            </td>
            <td vAlign=top width=132>
            <p><strong><span>例</span> <span>A Maximize Speed</span> </strong></p>
            </td>
            <td vAlign=top width=132>
            <p><strong><span>例</span> <span>A Disable(Debug)</span> </strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=127>
            <p><span>_a : 0012FF58</span> </p>
            <p><span>_b : 0012FF5C</span> </p>
            <p><span>_c : 0012FF60</span> </p>
            <p><span>_d : 0012FF64</span> </p>
            <p><span>_e : 0012FF68</span> </p>
            <p>&nbsp; </p>
            <p><span>_a : 0012FF58</span> </p>
            <p><span>_b : 0012FF5C</span> </p>
            <p><span>_c : 0012FF60</span> </p>
            <p><span>_d : 0012FF64</span> </p>
            <p><span>_e : 0012FF68</span> </p>
            <p>&nbsp; </p>
            <p><span>_a : 0012FF58</span> </p>
            <p><span>_b : 0012FF5C</span> </p>
            <p><span>_c : 0012FF60</span> </p>
            <p><span>_d : 0012FF64</span> </p>
            <p><span>_e : 0012FF68</span> </p>
            </td>
            <td vAlign=top width=132>
            <p><span>_a : 0012FF70</span> </p>
            <p><span>_b : 0012FF74</span> </p>
            <p><span>_c : 0012FF78</span> </p>
            <p><span>_d : 0012FF7C</span> </p>
            <p><span>_e : 0012FF80</span> </p>
            <p>&nbsp; </p>
            <p><span>_a : 0012FF70</span> </p>
            <p><span>_b : 0012FF80</span> </p>
            <p><span>_c : 0012FF7C</span> </p>
            <p><span>_d : 0012FF78</span> </p>
            <p><span>_e : 0012FF74</span> </p>
            <p>&nbsp; </p>
            <p><span>_a : 0012FF58</span> </p>
            <p><span>_b : 0012FF5C</span> </p>
            <p><span>_c : 0012FF60</span> </p>
            <p><span>_d : 0012FF64</span> </p>
            <p><span>_e : 0012FF68</span> </p>
            </td>
            <td vAlign=top width=132>
            <p><span>No.1: 0012FF50</span> </p>
            <p><span>No.2: 0012FF54</span> </p>
            <p><span>No.3: 0012FF58</span> </p>
            <p><span>No.4: 0012FF5C</span> </p>
            <p><span>No.5: 0012FF60</span> </p>
            <p>&nbsp; </p>
            <p><span>No.1: 0012FF50</span> </p>
            <p><span>No.2: 0012FF54</span> </p>
            <p><span>No.3: 0012FF58</span> </p>
            <p><span>No.4: 0012FF5C</span> </p>
            <p><span>No.5: 0012FF60</span> </p>
            <p>&nbsp; </p>
            <p><span>No.1: 0012FF50</span> </p>
            <p><span>No.2: 0012FF54</span> </p>
            <p><span>No.3: 0012FF58</span> </p>
            <p><span>No.4: 0012FF5C</span> </p>
            <p><span>No.5: 0012FF60</span> </p>
            </td>
            <td vAlign=top width=132>
            <p><span>No.1: 0012FF50</span> </p>
            <p><span>No.2: 0012FF54</span> </p>
            <p><span>No.3: 0012FF58</span> </p>
            <p><span>No.4: 0012FF5C</span> </p>
            <p><span>No.5: 0012FF60</span> </p>
            <p>&nbsp; </p>
            <p><span>No.1: 0012FF50</span> </p>
            <p><span>No.2: 0012FF54</span> </p>
            <p><span>No.3: 0012FF58</span> </p>
            <p><span>No.4: 0012FF5C</span> </p>
            <p><span>No.5: 0012FF60</span> </p>
            <p>&nbsp; </p>
            <p><span>No.1: 0012FF50</span> </p>
            <p><span>No.2: 0012FF54</span> </p>
            <p><span>No.3: 0012FF58</span> </p>
            <p><span>No.4: 0012FF5C</span> </p>
            <p><span>No.5: 0012FF60</span> </p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><strong>&nbsp;</strong> </span></p>
<p><span><strong>&nbsp;</strong> </span></p>
<img src ="http://www.cppblog.com/3522021224/aggbug/25869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-09 00:05 <a href="http://www.cppblog.com/3522021224/archive/2007/06/09/25869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>遗传算法和易算算法</title><link>http://www.cppblog.com/3522021224/archive/2007/06/08/25860.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Fri, 08 Jun 2007 15:34:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/08/25860.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25860.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/08/25860.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25860.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25860.html</trackback:ping><description><![CDATA[&nbsp;
<p align=center><span>一、引</span><span>&nbsp;&nbsp;&nbsp; </span><span>言</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>从伏羲画卦到《连山》易的出现，即有象的观念，数已开始萌芽，数与筮联系即有筮数，主要用于占卜。春秋时期，</span><span>&#8220;</span><span>象</span><span>&#8221;</span><span>和</span><span>&#8220;</span><span>数</span><span>&#8221;</span><span>同时出现在《管子</span><span>&#183;</span><span>七法》篇中：</span><span>&#8220;</span><span>则，象，法，化，决塞，心术，计数。</span><span>&#8221;</span><span>但象数在春秋初期仍是两个松散联系的概念。到春秋末期，象与数的概念联系比较密切，在《周易</span><span>&#183;</span><span>系辞传》中提到</span><span>&#8220;</span><span>极数定象</span><span>&#8221;</span><span>，已初步出现象数理论。这时，《系辞传》中只初步论及象数的内在联系，并未详细谈到象数理论的程序。孔子在教书时六艺教学大纲</span><span>&#8220;</span><span>礼乐射御书数</span><span>&#8221;</span><span>中的数，是当时日常用的实用数。到孟子时代，即到战国末期，象数理论乃大备，历法推步术也成熟。当时的不少学者会推步术，而星命学为孟、荀二位大儒所不齿。孟子所说的</span><span>&#8220;</span><span>苟求其故，千岁之日至可坐而致也</span><span>&#8221;</span><span>，是谈的历法推步术；荀子说：</span><span>&#8220;</span><span>善为易者不占</span><span>&#8221;</span><span>。这时，在古算经算法和历法推步术之外，已有经典术数如</span><span>&#8220;</span><span>三式</span><span>&#8221;</span><span>等的出现和应用。这两类数的算法，在后汉徐岳《数术记遗》中有提要式的概括总结。对其中提出的</span><span>14</span><span>种算法，没有明确指出何者为历法推步术算法，何者为术数算法程序。亦可能是综合的、浑元一体的算法程序。总的看来，有数必有算，有算必有法。形成古算经算法和术数算法是很自然的。在古代可能有互补的趋势。《周易》大衍之数很可能与古六历所用的算法程序有关。唐代张遂的大衍历以及宋秦九韶《数书九章》均涉及大衍算法，而秦汉时期的《九章数学》中则对大衍算法避而不谈。这可能是由于古代大儒亦是视大衍之数带有神秘内容，不敢与正规的应用数学算法相提并论。实际上，大衍之数只是一种现代所说的</span><span>&#8220;</span><span>不定分析</span><span>&#8221;</span><span>而已</span><span>!</span><span>阮元论曰：</span><span>&#8220;</span><span>推步之法至大衍备矣，</span><span>&#8230;&#8230;</span><span>后来算造者未能及也。然推本易象，终为傅合，昔人谓一行窜入于《易》以眩众，是乃千古定论也</span><span>&#8221;</span><span>。［</span><span>1</span><span>］由此可知，就算法而论，推步术自为推步术，数术自为数术，各成系统，不相涉也。然而，这并不意味着数术算法程序中无合理内容。英人李约瑟常提到术数</span><span>&#8220;</span><span>内算</span><span>&#8221;</span><span>很有用。［</span><span>2</span><span>］但未作深入探究。宋秦九韶《数书九章》序中论内外算，涉及经典术数三式，其论颇正：</span><span>&#8220;</span><span>今数术之书尚三十余家，天象历度，谓之缀术。太乙壬甲谓之三式，皆曰内算，言其秘也。九章所载即周官九数，系于方圆者为镚术，皆曰外算，对内而言也。其用相通，不可歧二</span><span>&#8221;</span><span>。［</span><span>3</span><span>］以上所论均涉及数字信息。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; 21</span><span>世纪已成为信息时代，信息与象数息息相通。故《系辞传》象数思维应当在今后大放光芒，与西方计算机文化成就携手并进，逐渐融汇成一体。《周易</span><span>&#183;</span><span>系辞传》</span><span>&#8220;</span><span>天地之大德曰生</span><span>&#8221;</span><span>，</span><span>&#8220;</span><span>生生之谓《易》</span><span>&#8221;</span><span>，强调生命演化思想；卦爻的设置上采取乾坤六子的形式，这都与西方新近兴起的遗传算法的精神与具体计算步骤内容相近。</span><span></span></p>
<p align=center><span>二、遗传密码与象数</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>近些年来，国内外对于科学易感兴趣的学者，无不重视生物遗传密码的研究成果，并展开《周易》象数与遗传密码细部结构对比的探讨。这方面，尤以已故著名科学易学家潘雨廷教授的研究具有代表性。潘先生博古通今，既深钻过象数理论，又熟悉分子生物学和遗传密码的生物化学含义，他在</span><span>&#8220;</span><span>科学易</span><span>&#8221;</span><span>一文中以</span><span>DNA</span><span>（脱氧核糖核酸）和</span><span>RNA</span><span>（核糖核酸）为例，来考察其分子结构的变化情况，及其化学键的</span><span>&#8220;</span><span>象数</span><span>&#8221;</span><span>。［</span><span>4</span><span>］</span><span></span><span>讨论结果如下表所示（暂略）：</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>为了使读者深入理解象数与生物遗传学及遗传密码的对应关系，有必要将有关科学名词加以扼要的解释：</span><span></span></p>
<p align=left><span>&nbsp; 1</span><span>、遗传密码：</span><span> DNA</span><span>（脱氧核糖核酸）中核苷酸顺序和蛋白质中的氨基酸顺序之间的关系称为遗传密码。遗传密码是由碱基的三联体（相当于《易经》八卦的三爻），可在</span><span>DNA</span><span>分子上顺序读出，且互不重迭）。</span><span>DNA</span><span>是一切生命形式的普遍遗传物质。</span><span>DNA</span><span>有四种不同的碱基：两种嘌呤，即腺嘌呤和鸟嘌呤，以及两种嘧啶，即胸腺嘧啶和胞嘧啶。</span><span>DNA</span><span>的结构呈双螺旋结构形式。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>由三联体密码重迭，可形成与六十四卦相对应的符号系统。这并非出自偶然，而是自然物的发生和演化合乎易数的自组织作用造成的。潘雨廷教授在《周易纵横录》论文中已作了详细的象数论述，可以参看。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp; 2</span><span>、核苷酸：上述四种碱基之一与脱氧核糖结合，叫作核苷。核苷的磷酸酯衍生物称之为核苷酸。</span><span>DNA</span><span>分子是由核苷酸构成的，许多单元接在一起就形成了多核苷酸长链。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp; 3</span><span>、核糖核酸（</span><span>RNA</span><span>）：</span><span>RNA</span><span>和</span><span>DNA</span><span>一样，都是长链分子，亦是由重复的核苷酸单元组成。</span><span>RNA</span><span>的构成单元有两点与</span><span>DNA</span><span>不同。首先，</span><span>RNA</span><span>的糖组分不是脱氧核糖，而是核糖。其次，四种碱基中虽然有三种，即腺嘌呤、鸟嘌呤和胞嘧啶，在</span><span>RNA</span><span>和</span><span>DNA</span><span>中都一样。但第四种，即胸腺嘧啶，在</span><span>RNA</span><span>中为尿嘧啶所代替，它少了一个甲基。在三种</span><span>RNA</span><span>类型的一种类型中，还偶尔出现别的碱基。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; 4</span><span>、信使核糖核酸（</span><span>mRNA</span><span>）：〖</span><span>HTSS</span><span>〗</span><span>mRNA</span><span>在把密码翻译成专一性蛋白质时起模板作用，并且能把遗传密码的信息从细胞核的</span><span>DNA</span><span>运送到细胞质，以便促进合成蛋白质的作用。携带着所需要的信息，以决定一个蛋白质分子的整个多肽链的</span><span>mRNA</span><span>的长度，称为作用子。某些</span><span>mRNA</span><span>分子携带着不仅合成一个蛋白质分子的信息，这样的</span><span>mRNA</span><span>称为多作用子。在合成过程中，当密码由</span><span>DNA</span><span>转录到</span><span>mRNA</span><span>上时，后者即离开细胞核，通过核膜进到细胞质中。在细胞质中它移动到蛋白质合成的场所，即转移到核糖核蛋白体处。核糖核蛋白体由</span><span>DNA</span><span>和蛋白质组成。</span><span></span></p>
<p align=left><span>&nbsp; 5</span><span>、转移核糖核酸（</span><span>tRNA</span><span>）：〖</span><span>HTSS</span><span>〗其作用是把细胞质中的氨基酸转移到核糖核蛋白体上蛋白质合成的场所。因此，</span><span>tRNA</span><span>是在特定氨基酸与对它编码的</span><span>mRNA</span><span>三联体之间起媒介物或转接分子的作用。每个氨基酸都有其互不相同的、专一的</span><span>tRNA</span><span>分子。每种</span><span>tRNA</span><span>含有大约</span><span>80</span><span>个核苷酸。</span><span></span></p>
<p align=left><span>&nbsp; 6</span><span>、反密码子：</span><span>tRNA</span><span>分子上与</span><span>mRNA</span><span>连接的一定部位是一个由三个碱基组成的顺序，与</span><span>mRNA</span><span>上的密码子互补，称为反密码子。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp; 7</span><span>、简并密码：试验表明，虽然任何特定氨基酸密码子的开始两个字母总是不变，然而第三个字母有时却不同。例如，编码丝氨酸的不仅是</span><span>AGU</span><span>，也有</span><span>AGC</span><span>。因此，</span><span>Crick 1966</span><span>年提出</span><span>&#8220;</span><span>摇摆</span><span>&#8221;</span><span>假设，这种摇摆在于第三对碱基之间的配合与前两对碱基的精确要求相比多少有些松弛。凡是同一个氨基酸有不同的密码者，这种密码称为简并密码。</span><span></span></p>
<p align=center><span>三、遗传算法概要</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>在遗传算法中，可以将模型的一个参数表示为一个二进制数码，全部参数用许多串联在一起的二进制数码组成的字符串</span><span>(</span><span>类似一个染色体</span><span>)</span><span>代表。从一组初始模型，即一些具有不同染色体的个体组成的种群开始。［</span><span>5</span><span>］</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>遗传算法的基本思想正是基于模仿生物界的遗传过程。它把问题的参数用基因代表，把问题的解用染色体代表</span><span>(</span><span>在计算机里为字符串</span><span>)</span><span>，从而得到一个由具有不同染色体的个体组成的群体。这个群体在问题特定的环境里生存竞争，适者有最好的机会生存和产生后代。后代随机化地继承了父代的最好特征，并也在生存环境的控制支配下继续这一过程。群体的染色体都将逐渐适应环境，不断进化，最后收敛到一族最适应环境的类似个体，即得到问题最优的解。值得注意的一点是，现在的遗传算法是受生物进化论学说的启发提出的，这种学说对我们用计算机解决复杂问题很有用，而它本身是否完全正确并不重要</span><span>(</span><span>目前生物界对此学说尚有争议</span><span>)</span><span>。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>遗传算法的基础思想是在本世纪</span><span>50</span><span>年代初，由于一些生物学家尝试用计算机模拟生物系统演化时而提出的。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>遗传算法是模拟生物通过基因的遗传和变异，有效地达到一种稳定的优化状态的繁殖和选择的过程，从而建立的一种简单而又有效的搜索方法。它运用随机而非确定性的规则对一族而非一个点进行全局而非局部地搜索，它仅利用目标函数而不要求其导数或其它附加限制，它虽然在特定问题上效率也许不是最高，但效率远高于传统随机算法，是一种普遍适用于各种问题的有效方法。遗传算法的主要思路有：</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; 1</span><span>、繁殖</span><span>(reproduction)</span><span>：繁殖是根据现有各个体的目标函数值，确定其生存概率，模拟生物界的自然选择，劣者淘汰，适者生存。在遗传算法中，我们人为地保持种群包含的个体总数不变。比较优秀的个体</span><span>(</span><span>模型</span><span>)</span><span>有较大的生存概率，并可能繁衍，比较差的个体</span><span>(</span><span>模型</span><span>)</span><span>可能会淘汰。这样产生的下一代的个体，一般都具有较大目标函数值，因而有较大的生存概率。</span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; 2</span><span>、交配</span><span>(crossover)</span><span>：从种群中随机地选择两两一组的双亲，分别随机地交换部分染色体，各自产生两个新染色体。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; 3</span><span>、变异</span><span>(mutation)</span><span>：染色体按一定概率</span><span>(</span><span>一般很小</span><span>)</span><span>可随机地产生变异。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>遗传算法能够解决的问题不仅限于最优化问题，但无论哪种问题，都要解决两个关键问题：</span><span>(1)</span><span>必须能将问题的解答用一组二进制数码表示，即建立解答与二进制数码间的映射</span><span>(mapping)</span><span>关系。</span><span>(2)</span><span>定义一种对最佳解的定量量度，即适度函数。</span><span></span></p>
<p align=center><span>四、自然</span><span>DNA&#8220;</span><span>计算机</span><span>&#8221;</span><span>的</span><span>&#8220;</span><span>硬件</span><span>&#8221;</span><span>与软件</span><span>——</span><span>象、数</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>算盘由木框、竹棍、算珠构成，其各类珠算口诀和规则是计算程序。算盘建立了一个珠算空间；易算卦爻，杭辛斋称之为卦材、爻材，相当于易算硬件，《系辞传》所论</span><span>&#8220;</span><span>八卦成列，象在其中矣</span><span>&#8221;</span><span>，是八卦空间。《序卦》所论相当于宏观程序。</span><span>&#8220;</span><span>蓍之德圆而神，卦之德方以智</span><span>&#8221;</span><span>等有关卦爻功能的论述，相当于基因染色体数的作用。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>遗传算法所取法的自然</span><span>DNA</span><span>的</span><span>&#8220;</span><span>硬件</span><span>&#8221;(</span><span>象</span><span>)</span><span>经生物化学家多年进行的</span><span>DNA</span><span>结构分析的研究，相当</span><span> </span><span>图</span><span>1 DNA</span><span>四种碱基糖环系统及其原子标准指数（暂略）于高分子结构式所表示的原子结构。［</span><span>6</span><span>］具体化到</span><span>DNA</span><span>，则是双链螺旋结构的形象。</span><span>DNA</span><span>的参数有化学边界距离</span><span>(</span><span>以旋转角度表示</span><span>)</span><span>，边界角</span><span>(</span><span>两相邻化学边界间的夹角</span><span>)</span><span>，扭力角</span><span>(DNA</span><span>螺旋的扭转角度，</span><span>0</span><span>～</span><span>360&#176;)</span><span>。然而，前二者是常量。只有扭力角是时常变动的变量。遗传算法主要利用扭力角变量。今将遗传算法所取法的象数</span><span>——</span><span>碱基结构式及</span><span>DNA</span><span>中轴</span><span>(</span><span>只表示一个核苷酸单位</span><span>)</span><span>扭力角分布等叙述如下：</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>图</span><span>1</span><span>表示</span><span>DNA</span><span>四个碱基系统及其原子标准指数，图</span><span>2</span><span>（暂略）上部表示基本环，其扭力角为</span><span>&#967;i</span><span>，其下表示糖环，其扭力角为</span><span>P(i)</span><span>，</span><span>&#947;n(i)</span><span>，碱基系统的全过程是自由的，原则上沿单个化学边界</span><span>&#8220;</span><span>摆动</span><span>&#8221;</span><span>，就这样与</span><span>DNA</span><span>糖环连接起来。意即基本环与糖环沿公共边界而</span><span>&#8220;</span><span>摆动</span><span>&#8221;</span><span>。这种摆动可能是在传递信息。沿化学界面在糖环上的内循环扭力角</span><span>&#967;</span><span>在空间上受到制约，因为糖环需要闭合。已发现每一核苷酸单位都有八个主要结构参数：</span><span>&#967;</span><span>，</span><span>&#957;m</span><span>，</span><span>P</span><span>，</span><span>&#945;</span><span>，</span><span>&#946;</span><span>，</span><span>&#947;</span><span>，</span><span>&#949;</span><span>，</span><span>&#950;(2)</span><span>，〖ＪＰ〗这八个参数都限制在一个有限的距离内，原则上，扭力角</span><span>&#945;</span><span>，</span><span>&#946;</span><span>，</span><span>&#947;</span><span>，</span><span>&#949;</span><span>，</span><span>&#950;(2)</span><span>及</span><span>&#967;</span><span>位于</span><span>0</span><span>～</span><span>360&#176;</span><span>之间；</span><span>&#948;</span><span>是中轴和糖环的一部分，这里把</span><span>&#948;</span><span>叫做</span><span>&#957;3</span><span>，</span><span>&#948;</span><span>是一种冗余信息。</span><span>P</span><span>，</span><span>&#957;m</span><span>距离可以推导出。典型的距离分别是</span><span>150&#176;</span><span>～２２５</span><span>&#176;</span><span>，２５．０</span><span>&#176;</span><span>～５０．０</span><span>&#176;(</span><span>距离用扭力角变化值表示</span><span>)</span><span>。如果</span><span>DNA</span><span>的</span><span>8</span><span>个结构参数已知，则排列位置已知的</span><span>DNA</span><span>，包括其中所含的</span><span>N</span><span>个核苷酸即可完全确定。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; DNA</span><span>探针：这种探针</span><span>(</span><span>图</span><span>3)</span><span>（暂略）在探测环境信息方面，从最原始的单细胞生物变形虫原生质中就存在其原始形态。这种探针机构随宇宙和生物演化而逐渐变得复杂起来。瑞士学者方迪《微精神分析学》一书把这种探针式的尝试作用叫做</span><span>&#8220;</span><span>伊德</span><span>&#8221;</span><span>。［</span><span>7</span><span>］</span><span>&#8220;</span><span>伊德</span><span>&#8221;</span><span>在心理学界受到重视。</span><span>DNA</span><span>的探针是一种复杂的综合体，在生物分子结构研究方面享有广泛的盛名，称之为</span><span>DNA</span><span>探针级的研究。探针综合体一部分是由于其核苷酸自补偿作用而出名的。</span><span>DNA</span><span>探针由一个双链杆和一个环组成。探针最重要的部分是这个环。探针在演化过程中非常守恒</span><span>(</span><span>稳定</span><span>)</span><span>，因此具有重要的生物功能。探针形成于细菌噬菌体最原始的重复功能。</span><span>DNA</span><span>染色体组存在有复杂的相互作用。这种作用能被其他生物分子所识别、利用，亦可由原生质来识别。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; DNA</span><span>相当于一个微观世界，其细部结构和功能远未认识到。可以预料，它作为遗传算法的自然样板，其有用信息，取之不尽，用之不竭。要想改进遗传算法，一定要先取得自然</span><span>DNA</span><span>的新探索成就。最近对</span><span>DNA</span><span>的假结点的观测，对</span><span>DNA</span><span>三叉结构的观测就属于这方面的新探索。</span><span>DNA</span><span>双链结构相当于太极生两仪，两仪生四象，一分为二的浑沌二分叉结构。将来对</span><span>DNA</span><span>三叉结构的认识可能引导到对《太玄经》一分为三，中医</span><span>&#8220;</span><span>三阴三阳</span><span>&#8221;</span><span>的认识。这并非遥远的呓想，可能是不久的事情了。</span><span></span></p>
<p align=center><span>五、易算程序问题</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>易学象数理论自战国形成后，由于社会制度与士大夫意识形态的原因，易数不能走西方公理化的道路。徐岳《数术记遗》积算、太乙算、九宫算都有比较独立的算法。其余不一定有独立的算法。其中提出的</span><span>14</span><span>种算法是：积算，太一算，两仪算，三才算，五行算，八卦算，九宫算、运筹算，了知算，成数算，把头算，龟算，珠算，计算</span><span>(</span><span>心算</span><span>)</span><span>。对每种算法的叙述，只有三言两语，看不出所以然。迄今尚未有人作深入研究。原因是</span><span>&#8220;</span><span>文献不足故也</span><span>&#8221;</span><span>。要想恢复</span><span>14</span><span>种算法的原样，只有走到基层农民和隐居型的知识分子那里作调查。可惜多少年来无人问津，所以困惑一直未解。我认为调查重点主要是山东半岛蓬莱，镠罘沿海一带山区农村。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>《九章数学》</span><span>&#8220;</span><span>寓理于术</span><span>&#8221;</span><span>，文中的</span><span>&#8220;</span><span>术曰</span><span>&#8221;</span><span>会有算法理论和程序背景。</span><span></span><span>［</span><span>8</span><span>］现在唯一可了解的就是珠算算法，此已有全国珠算学会在研究。其中不少口诀规则，堪称算法。可从此入手以及从历代历法推步术的演化中追索易算算法。古有《缀术》，为南北朝祖冲之所创，用于五星的推步</span><span>(</span><span>宋秦九韶《数书九章》第三卷天时类有</span><span>&#8220;</span><span>缀术推星</span><span>&#8221;</span><span>章</span><span>)</span><span>。《缀术》在《算经十书》中有名无书，书已失传。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>总之，恢复古代易算程序的研究是一大课题。南京大学天文系朱灿生教授曾拟研究恢复缀术。究竟古代易算详细内容如何，尚待考证恢复。秦汉前后出现的三式</span><span>(</span><span>太乙、六壬、奇门</span><span>)</span><span>经典术数的推演中可能有易算算法程序的影子。其中既含科学因素，又有不少神秘内容，今后应作开发研究。</span><span></span></p>
<p align=center><span>六、象数思维与遗传算法的比较</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>本人研究科学易多年，研究遗传算法已有七、八年，迄今已初步得出易的象数思维基本上等价于遗传算法的性质与功能的初步看法。所谓象数思维主要是包含在孔子及其弟子所作的《易传》中，且主要是《系辞传》。经对比发现，无论用自然遗传过程，生物演化观念，整体观或根据实际观测来认识自然，在问题优化，生物遗传基因交配、变异，以及在溯往和预测问题上都表现了象数思维与遗传算法的相似性。《诗经</span><span>&#183;</span><span>小雅》说：</span><span>&#8220;</span><span>唯其有之，是以似之。</span><span>&#8221;</span><span>意即两种事物相似的根本原因是二者之间有共同的东西。这亦是《内经》</span><span>&#8220;</span><span>贤者察同，愚者察异</span><span>&#8221;</span><span>之意。今将二者比较如下：</span><span></span></p>
<p align=left>&nbsp;<span>１．遗传算法</span><span>(</span><span>以下用</span><span>GA</span><span>简写表示</span><span>)</span><span>和《易》都重视生命现象，特别是遗传过程。《系辞传》说</span><span>&#8220;</span><span>生生之谓易</span><span>&#8221;</span><span>，</span><span>&#8220;</span><span>天地之大德曰生</span><span>&#8221;</span><span>。</span><span></span></p>
<p align=left>&nbsp;<span>２．</span><span>GA</span><span>和《易》都重视演化，重视从混沌到有序的观念，而认为确定不变的存在是暂时的。实际上，</span><span>GA</span><span>和《易》都有逼近论思想。</span><span></span></p>
<p align=left>&nbsp;<span>３．二者都有整体观思想：</span><span>GA</span><span>用相当染色体的种群</span><span>(population)</span><span>数作为基础，用相当基因的二进制数串输入计算机运算。所用数的设计都是一个集合，而不是用单个数。易算用大衍之数</span><span>50(</span><span>虚一不用</span><span>)</span><span>作为演算基础，亦是整体观。</span><span></span></p>
<p align=left>&nbsp;<span>４．二者都是以实际观测为研究根据。</span><span>GA</span><span>是西方实测方法的继续，自不待言。伏羲氏是根据仰观俯察、远取近取进行比较后而画八卦的，不是凭空臆造。</span><span></span></p>
<p align=left>&nbsp;<span>５．</span><span>GA</span><span>以求得问题优化解见长。孔子谓《易》是寡过之书，趋吉避凶之书，从广义上看也是一种优化。元吉</span><span>(</span><span>大吉</span><span>)</span><span>为全局优化，吉或悔而后吉是局部优化。</span><span> </span><span>特别是《易》有《既济》、《未济》二卦作为纲领卦。《既济》乃优化的结果，《未济》也设法使其转变，向《既济》发展，很多卦爻辞字里行间，多有此意。</span><span></span></p>
<p align=left>&nbsp;<span>６．二者重事物之间的相互作用和关系。</span><span>GA</span><span>用交配来表达此意，《易》则以</span><span>&#8220;</span><span>天地镮</span><span></span><span>，万物化醇，男女构精，万物化生</span><span>&#8221;</span><span>；</span><span>&#8220;</span><span>天气下降，地气上腾</span><span>&#8221;(</span><span>《礼记</span><span>&#183;</span><span>月令》</span><span>)</span><span>来表示。</span><span></span></p>
<p align=left>&nbsp;<span>７．二者均重视质变，</span><span>GA</span><span>谓之变异，《周易</span><span>&#183;</span><span>系辞传》则说：</span><span>&#8220;</span><span>穷则变，变则通。</span><span>&#8221;</span></p>
<p align=left>&nbsp;<span>８．二者均涉及数学空间的理论和应用。</span><span>GA</span><span>常用结构参数空间，《易》则有八卦空间：</span><span>&#8220;</span><span>八卦成列，象在其中矣</span><span>&#8221;</span><span>；</span><span>&#8220;</span><span>乾坤成列而易立乎其中矣</span><span>&#8221;</span><span>。</span><span></span></p>
<p align=left>&nbsp;<span>９．《系辞传》说：</span><span>&#8220;</span><span>神以知来，智以藏往</span><span>&#8221;</span><span>。</span><span>GA</span><span>既能探索已往解决问题，又能用于地震预报。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GA</span><span>的作者提出算法的改进问题，主要是深入挖掘</span><span>DNA</span><span>结构的潜力。而东方思维则有</span><span>&#8220;</span><span>巢居知风，穴居知雨</span><span>&#8221;</span><span>的说法，这种说法是科学的，即鸟类和昆虫类</span><span>(</span><span>如蚂蚁</span><span>)</span><span>均有预测天气变化的功能。如能开发鸟类和蚂蚁体内信息大分子结构奥秘，可以用以改进</span><span>GA</span><span>算法的功能。</span><span></span></p>
<p align=left><span>&nbsp;&nbsp;&nbsp; </span><span>附注：已故学者刘绍光一元数理论的研究是根据易学象数发展出的一种易算数学分支。这一分支后继乏人或无人。关于一元数理论已出版《一元数理论初探》</span><span></span><span>［９］一书，其中不少与</span><span>GA</span><span>有相通之处，如其中提出的位元、序元、结元三个计算程序理论概念，以及磁子、电子、声子、光子、热子、引子、张子等开阖角的问题。均可与</span><span>GA</span><span>相互作用，而创造新的算法。</span></p>
<img src ="http://www.cppblog.com/3522021224/aggbug/25860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-08 23:34 <a href="http://www.cppblog.com/3522021224/archive/2007/06/08/25860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC调试入门</title><link>http://www.cppblog.com/3522021224/archive/2007/06/07/25778.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Thu, 07 Jun 2007 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/07/25778.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25778.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/07/25778.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25778.html</trackback:ping><description><![CDATA[<img src="http://www.vckbase.com/document/image/paragraph.gif"> 概述<br>调试是一个程序员最基本的技能，其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言，却不能编制出任何好的软件。<br>这里我简要的根据自己的经验列出调试中比较常用的技巧，希望对大家有用。<br>本文约定，在选择菜单时，通过/表示分级菜单，例如File/Open表示顶级菜单File的子菜单Open。<br>&nbsp;<br><img src="http://www.vckbase.com/document/image/paragraph.gif"> 设置<br>为了调试一个程序，首先必须使程序中包含调试信息。一般情况下，一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息，但是是不是Debug版本并不是程序包含调试信息的决定因素，程序设计者可以在任意的Configuration中增加调试信息，包括Release版本。<br>为了增加调试信息，可以按照下述步骤进行：
<ul>
    <li>打开Project settings对话框（可以通过快捷键ALT+F7打开，也可以通过IDE菜单Project/Settings打开)
    <li>选择C/C++页，Category中选择general ，则出现一个Debug Info下拉列表框，可供选择的调试信息 方式包括： <br>　
    <table id=AutoNumber1 style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0 cellPadding=0 width=614 border=1>
        <tbody>
            <tr>
                <td align=middle width=56><strong>命令行</strong></td>
                <td align=middle width=160><strong>Project settings</strong></td>
                <td align=middle width=394><strong>说明</strong></td>
            </tr>
            <tr>
                <td width=56>无</td>
                <td width=160>None</td>
                <td width=394>没有调试信息</td>
            </tr>
            <tr>
                <td width=56>/Zd</td>
                <td width=160>Line Numbers Only</td>
                <td width=394>目标文件或者可执行文件中只包含全局和导出符号以及代码行信息，不包含符号调试信息</td>
            </tr>
            <tr>
                <td width=56>/Z7</td>
                <td width=160>C 7.0- Compatible</td>
                <td width=394>目标文件或者可执行文件中包含行号和所有符号调试信息，包括变量名及类型，函数及原型等</td>
            </tr>
            <tr>
                <td width=56>/Zi</td>
                <td width=160>Program Database</td>
                <td width=394>创建一个程序库(PDB)，包括类型信息和符号调试信息。</td>
            </tr>
            <tr>
                <td width=56>/ZI</td>
                <td width=160>Program Database for Edit and Continue</td>
                <td width=394>除了前面/Zi的功能外，这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效</td>
            </tr>
        </tbody>
    </table>
    <br>
    <li>选择Link页，选中复选框"Generate Debug Info"，这个选项将使连接器把调试信息写进可执行文件和DLL
    <li>如果C/C++页中设置了Program Database以上的选项，则Link incrementally可以选择。选中这个选项，将使程序可以在上一次编译的基础上被编译（即增量编译），而不必每次都从头开始编译。 </li>
</ul>
<img src="http://www.vckbase.com/document/image/paragraph.gif"> 断点<br>断点是调试器设置的一个代码位置。当程序运行到断点时，程序中断执行，回到调试器。断点是 最常用的技巧。调试时，只有设置了断点并使程序回到调试器，才能对程序进行在线调试。<br><br>设置断点：可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上，然后
<ul>
    <li>按F9快捷键
    <li>弹出Breakpoints对话框，方法是按快捷键CTRL+B或ALT+F9，或者通过菜单Edit/Breakpoints打开。打开后点击Break at编辑框的右侧的箭头，选择 合适的位置信息。一般情况下，直接选择line xxx就足够了，如果想设置不是当前位置的断点，可以选择Advanced，然后填写函数、行号和可执行文件信息。 </li>
</ul>
去掉断点：把光标移动到给定断点所在的行，再次按F9就可以取消断点。同前面所述，打开Breakpoints对话框后，也可以按照界面提示去掉断点。<br><br>条件断点：可以为断点设置一个条件，这样的断点称为条件断点。对于新加的断点，可以单击Conditions按钮，为断点设置一个表达式。当这个表达式发生改变时，程序就 被中断。底下设置包括&#8220;观察数组或者结构的元素个数&#8221;，似乎可以设置一个指针所指向的内存区的大小，但是我设置一个比较的值但是改动 范围之外的内存区似乎也导致断点起效。最后一个设置可以让程序先执行多少次然后才到达断点。<br><br>数据断点：数据断点只能在Breakpoints对话框中设置。选择&#8220;Data&#8221;页，就显示了设置数据断点的对话框。在编辑框中输入一个表达式，当这个 表达式的值发生变化时，数据断点就到达。一般情况下，这个表达式应该由运算符和全局变量构成，例如：在编辑框中输入 g_bFlag这个全局变量的名字，那么当程序中有g_bFlag= !g_bFlag时，程序就将停在这个语句处。<br><br>消息断点：VC也支持对Windows消息进行截获。他有两种方式进行截获：窗口消息处理函数和特定消息中断。<br>在Breakpoints对话框中选择Messages页，就可以设置消息断点。如果在上面那个对话框中写入消息处理函数的名字，那么 每次消息被这个函数处理，断点就到达（我觉得如果采用普通断点在这个函数中截获，效果应该一样）。如果在底下的下拉 列表框选择一个消息，则每次这种消息到达，程序就中断。<br><br><img src="http://www.vckbase.com/document/image/paragraph.gif"> 值<br><strong>Watch</strong><br>VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。<br>观看变量的值最简单，当断点到达时，把光标移动到这个变量上，停留一会就可以看到变量的值。<br>VC提供一种被成为Watch的机制来观看变量和表达式的值。在断点状态下，在变量上单击右键，选择Quick Watch， 就弹出一个对话框，显示这个变量的值。<br>单击Debug工具条上的Watch按钮，就出现一个Watch视图（Watch1,Watch2,Watch3,Watch4），在该视图中输入变量或者表达式，就可以观察 变量或者表达式的值。注意：这个表达式不能有副作用，例如++运算符绝对禁止用于这个表达式中，因为这个运算符将修改变量的值，导致 软件的逻辑被破坏。<br><br><strong>Memory</strong><br>由于指针指向的数组，Watch只能显示第一个元素的值。为了显示数组的后续内容，或者要显示一片内存的内容，可以使用memory功能。在 Debug工具条上点memory按钮，就弹出一个对话框，在其中输入地址，就可以显示该地址指向的内存的内容。<strong><br><br>Varibles</strong><br>Debug工具条上的Varibles按钮弹出一个框，显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量，以红色显示。<br><br><strong>寄存器</strong><br>Debug工具条上的Reigsters按钮弹出一个框，显示当前的所有寄存器的值。<br><br><img src="http://www.vckbase.com/document/image/paragraph.gif"> 进程控制<br>VC允许被中断的程序继续运行、单步运行和运行到指定光标处，分别对应快捷键F5、F10/F11和CTRL+F10。各个快捷键功能如下： <br>　
<table id=AutoNumber2 style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0 cellPadding=0 width="91%" border=1>
    <tbody>
        <tr>
            <td align=middle width="30%"><strong>快捷键</strong></td>
            <td align=middle width="70%"><strong>说明</strong></td>
        </tr>
        <tr>
            <td align=middle width="30%">F5</td>
            <td width="70%">继续运行</td>
        </tr>
        <tr>
            <td align=middle width="30%">F10</td>
            <td width="70%">单步，如果涉及到子函数，不进入子函数内部</td>
        </tr>
        <tr>
            <td align=middle width="30%">F11</td>
            <td width="70%">单步，如果涉及到子函数，进入子函数内部</td>
        </tr>
        <tr>
            <td align=middle width="30%">CTRL+F10</td>
            <td width="70%">运行到当前光标处。</td>
        </tr>
    </tbody>
</table>
<p><img src="http://www.vckbase.com/document/image/paragraph.gif"> Call Stack<br>调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。单击Debug工具条上的Call stack就显示Call Stack对话框。在CallStack对话框中显示了一个调用系列，最上面的是当前函数，往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。<br><br><img src="http://www.vckbase.com/document/image/paragraph.gif"> 其他调试手段<br>系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息，如下： </p>
<table id=AutoNumber3 style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0 cellPadding=0 width="86%" border=1>
    <tbody>
        <tr>
            <td align=middle width="42%"><strong>宏名/函数名</strong></td>
            <td align=middle width="58%"><strong>说明</strong></td>
        </tr>
        <tr>
            <td align=middle width="42%">TRACE</td>
            <td width="58%">使用方法和printf完全一致，他在output框中输出调试信息</td>
        </tr>
        <tr>
            <td align=middle width="42%">ASSERT</td>
            <td width="58%">它接收一个表达式，如果这个表达式为TRUE，则无动作，否则中断当前程序执行。对于系统中出现这个宏 导致的中断，应该认为你的函数调用未能满足系统的调用此函数的前提条件。例如，对于一个还没有创建的窗口调用SetWindowText等。</td>
        </tr>
        <tr>
            <td align=middle width="42%">VERIFY</td>
            <td width="58%">和ASSERT功能类似，所不同的是，在Release版本中，ASSERT不计算输入的表达式的值，而VERIFY计算表达式的值。</td>
        </tr>
    </tbody>
</table>
<p><img src="http://www.vckbase.com/document/image/paragraph.gif"> 关注<br>一个好的程序员不应该把所有的判断交给编译器和调试器，应该在程序中自己加以程序保护和错误定位，具体措施包括：
<ul>
    <li>对于所有有返回值的函数，都应该检查返回值，除非你确信这个函数调用绝对不会出错，或者不关心它是否出错。
    <li>一些函数返回错误，需要用其他函数获得错误的具体信息。例如accept返回INVALID_SOCKET表示accept失败，为了查明 具体的失败原因，应该立刻用WSAGetLastError获得错误码，并针对性的解决问题。
    <li>有些函数通过异常机制抛出错误，应该用TRY-CATCH语句来检查错误
    <li>程序员对于能处理的错误，应该自己在底层处理，对于不能处理的，应该报告给用户让他们决定怎么处理。如果程序出了异常， 却不对返回值和其他机制返回的错误信息进行判断，只能是加大了找错误的难度。 </li>
</ul>
另外：VC中要编制程序不应该一开始就写cpp/h文件，而应该首先创建一个合适的工程。因为只有这样，VC才能选择合适的编译、连接 选项。对于加入到工程中的cpp文件，应该检查是否在第一行显式的包含stdafx.h头文件，这是Microsoft Visual Studio为了加快编译 速度而设置的预编译头文件。在这个#include "stdafx.h"行前面的所有代码将被忽略，所以其他头文件应该在这一行后面被包含。<br>对于.c文件，由于不能包含stdafx.h，因此可以通过Project settings把它的预编译头设置为&#8220;不使用&#8221;，方法是：
<ul>
    <li>弹出Project settings对话框
    <li>选择C/C++
    <li>Category选择Precompilation Header
    <li>选择不使用预编译头。 </li>
</ul>
<img src ="http://www.cppblog.com/3522021224/aggbug/25778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-07 22:54 <a href="http://www.cppblog.com/3522021224/archive/2007/06/07/25778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C程序高效编程</title><link>http://www.cppblog.com/3522021224/archive/2007/06/07/25777.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Thu, 07 Jun 2007 14:45:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/07/25777.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25777.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/07/25777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25777.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25777.html</trackback:ping><description><![CDATA[引言：<br>　　编写高效简洁的C语言代码，是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述，不对的地方请各位指教。<br><br>第1招：以空间换时间<br><br>　　计算机程序中最大的矛盾是空间和时间的矛盾，那么，从这个角度出发逆向思维来考虑程序的效率问题，我们就有了解决问题的第1招——以空间换时间。<br>例如：字符串的赋值。<br>方法A，通常的办法：<br>#define LEN 32<br>char string1 [LEN];<br>memset (string1,0,LEN);<br>strcpy (string1,&#8220;This is a example!!&#8221;）;<br>方法B：<br>const char string2[LEN] =&#8220;This is a example!&#8221;;<br>char * cp;<br>cp = string2 ;<br>(使用的时候可以直接用指针来操作。)<br><br>　　从上面的例子可以看出，A和B的效率是不能比的。在同样的存储空间下，B直接使用指针就可以操作了，而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候，A具有更好的灵活性；如果采用方法B，则需要预存许多字符串，虽然占用了大量的内存，但是获得了程序执行的高效率。<br><br>　　如果系统的实时性要求很高，内存还有一些，那我推荐你使用该招数。<br><br>　　该招数的变招——使用宏函数而不是函数。举例如下：<br>方法C：<br>#define bwMCDR2_ADDRESS 4<br>#define bsMCDR2_ADDRESS 17<br>int BIT_MASK(int __bf)<br>{<br>return ((1U &lt;&lt; (bw ## __bf)) - 1) &lt;&lt; (bs ## __bf);<br>}<br>void SET_BITS(int __dst, int __bf, int __val)<br>{<br>__dst = ((__dst) &amp; ~(BIT_MASK(__bf))) | \<br>(((__val) &lt;&lt; (bs ## __bf)) &amp; (BIT_MASK(__bf))))<br>}<br><br>SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);<br>方法D：<br>#define bwMCDR2_ADDRESS 4<br>#define bsMCDR2_ADDRESS 17<br>#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)<br>#define BIT_MASK(__bf) (((1U &lt;&lt; (bw ## __bf)) - 1) &lt;&lt; (bs ## __bf))<br>#define SET_BITS(__dst, __bf, __val) \<br>((__dst) = ((__dst) &amp; ~(BIT_MASK(__bf))) | \<br>(((__val) &lt;&lt; (bs ## __bf)) &amp; (BIT_MASK(__bf))))<br><br>SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);<br><br>　　函数和宏函数的区别就在于，宏函数占用了大量的空间，而函数占用了时间。大家要知道的是，函数调用是要使用系统的栈来保存数据的，如果编译器里有栈检查选项，一般在函数的头会嵌入一些汇编语句对当前栈进行检查；同时，CPU也要在函数调用时保存和恢复当前的现场，进行压栈和弹栈操作，所以，函数调用需要一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序，不会产生函数调用，所以仅仅是占用了空间，在频繁调用同一个宏函数的时候，该现象尤其突出。<br><br>　　D方法是我看到的最好的置位操作函数，是ARM公司源码的一部分，在短短的三行内实现了很多功能，几乎涵盖了所有的位操作功能。C方法是其变体，其中滋味还需大家仔细体会。<br><br>第2招：数学方法解决问题<br><br>　　现在我们演绎高效C语言编写的第二招——采用数学方法来解决问题。<br><br>　　数学是计算机之母，没有数学的依据和基础，就没有计算机的发展，所以在编写程序的时候，采用一些数学方法会对程序的执行效率有数量级的提高。<br>举例如下，求 1~100的和。<br>方法E<br>int I , j;<br>for (I = 1 ;I&lt;=100; I ++）{<br>j += I;<br>}<br>方法F<br>int I;<br>I = (100 * (1+100)) / 2<br><br>　　这个例子是我印象最深的一个数学用例，是我的计算机启蒙老师考我的。当时我只有小学三年级，可惜我当时不知道用公式 N&#215;（N+1）/ 2 来解决这个问题。方法E循环了100次才解决问题，也就是说最少用了100个赋值，100个判断，200个加法（I和j）；而方法F仅仅用了1个加法，1 次乘法，1次除法。效果自然不言而喻。所以，现在我在编程序的时候，更多的是动脑筋找规律，最大限度地发挥数学的威力来提高程序运行的效率。<br><br>第3招：使用位操作<br><br>　　实现高效的C语言编写的第三招——使用位操作，减少除法和取模的运算。<br><br>　　在计算机程序中，数据的位是可以操作的最小数据单位，理论上可以用&#8220;位运算&#8221;来完成所有的运算和操作。一般的位操作是用来控制硬件的，或者做数据变换使用，但是，灵活的位操作可以有效地提高程序运行的效率。举例如下：<br>方法G<br>int I,J;<br>I = 257 /8;<br>J = 456 % 32;<br>方法H<br>int I,J;<br>I = 257 &gt;&gt;3;<br>J = 456 - (456 &gt;&gt; 4 &lt;&lt; 4);<br><br>　　在字面上好像H比G麻烦了好多，但是，仔细查看产生的汇编代码就会明白，方法G调用了基本的取模函数和除法函数，既有函数调用，还有很多汇编代码和寄存器参与运算；而方法H则仅仅是几句相关的汇编，代码更简洁，效率更高。当然，由于编译器的不同，可能效率的差距不大，但是，以我目前遇到的MS C ,ARM C 来看，效率的差距还是不小。相关汇编代码就不在这里列举了。<br>运用这招需要注意的是，因为CPU的不同而产生的问题。比如说，在PC上用这招编写的程序，并在PC上调试通过，在移植到一个16位机平台上的时候，可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。<br><br>第4招：汇编嵌入<br><br>　　高效C语言编程的必杀技，第四招——嵌入汇编。<br><br>　　&#8220;在熟悉汇编语言的人眼里，C语言编写的程序都是垃圾&#8221;。这种说法虽然偏激了一些，但是却有它的道理。汇编语言是效率最高的计算机语言，但是，不可能靠着它来写一个操作系统吧?所以，为了获得程序的高效率，我们只好采用变通的方法 ——嵌入汇编，混合编程。<br><br>　　举例如下，将数组一赋值给数组二,要求每一字节都相符。<br>char string1[1024],string2[1024];<br>方法I<br>int I;<br>for (I =0 ;I&lt;1024;I++)<br>*(string2 + I) = *(string1 + I)<br>方法J<br>#ifdef _PC_<br>int I;<br>for (I =0 ;I&lt;1024;I++)<br>*(string2 + I) = *(string1 + I);<br>#else<br>#ifdef _ARM_<br>__asm<br>{<br>MOV R0,string1<br>MOV R1,string2<br>MOV R2,#0<br>loop:<br>LDMIA R0!, [R3-R11]<br>STMIA R1!, [R3-R11]<br>ADD R2,R2,#8<br>CMP R2, #400<br>BNE loop<br>}<br>#endif<br><br>　　方法I是最常见的方法，使用了1024次循环；方法J则根据平台不同做了区分，在ARM平台下，用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说，为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节，这样的话，标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU，熟练使用相应的嵌入汇编，可以大大提高程序执行的效率。<br><br>　　虽然是必杀技，但是如果轻易使用会付出惨重的代价。这是因为，使用了嵌入汇编，便限制了程序的可移植性，使程序在不同平台移植的过程中，卧虎藏龙，险象环生！同时该招数也与现代软件工程的思想相违背，只有在迫不得已的情况下才可以采用。切记，切记。 
<img src ="http://www.cppblog.com/3522021224/aggbug/25777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-07 22:45 <a href="http://www.cppblog.com/3522021224/archive/2007/06/07/25777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学C语言的阶段</title><link>http://www.cppblog.com/3522021224/archive/2007/06/05/25612.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Tue, 05 Jun 2007 15:32:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/05/25612.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25612.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/05/25612.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25612.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25612.html</trackback:ping><description><![CDATA[<p>人生中的许多事情就像程序员在设计程序。于是，我爱上了程序，而网络为我提供了学习他人经验的一个桥梁，这是一个捷径，使我很快学会了很多知识和技巧。所以，我也想通过网络把我的一点经验献给那些需要它的人。这简直太奇妙了！！&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------vcok总坛主</p>
<p><br>我学C语言已经近两个月，《C语言程序设计》这本书我现在正在看第三遍，虽然上次考C等级时二级没过，但我相信以我现在水平是肯定可以通过考试，并且我已经第二次报了名。 <br>学到现在我却仍然不知道该怎么去编程，当我想写一个游戏的时候才发现自己什么也不懂，我应该再看看什么书好呢？学之致用。 <br>我询问了许多高手他们告诉我-----初学者都有这种困惑的。 </p>
<p>选择了IT，就意味着艰辛，困苦与挑战！要学的东西还很多很多......不要想一步登天，不要想走捷径！（除非你只是玩玩，或者你有TALENT！）基础最重要！IT任重而道远，朋友，原你有一颗坚定的心，走下去，不会错！！！ <br>在你学习的同时，还要注意一下IT的行情，多了解了解，摆好自己的位子，正确对待每一件事！我相信你一定会成功的！！！ <br>真正的程序员用C，最有价值的程序员是用C的程序员。不是开玩笑！ </p>
<p>C语言只是一个基础。一个能够向表达你的想法的基础，会了C能够写程序，但是不见得能够写出有实际意义的软件。（建议学习架构） <br>当你学到不自觉地使用这门语言时（大约写3万行代码就差不多了），你的c语言才可以说学会了。不是有个笑话吗？说的就是程序员的痴迷程度。我想应该有这样的精神才行。建议暂时不要看高级编程，多写代码、多看代码、培养风格、熟悉语法、最关键的是把握思想。 <br>学C语言并不只是学语法那么简单，重要的是编程思想，难的是它在不同环境下的应用。这是一个漫长的过程，需要经验的积累。当燃，并不是说死死抓住C不放，但如果你目前还不知该怎样编程，建议在你有一种游刃有余的感觉之前，还是不要去碰什么C++,Java之类，那样你遇到的困难会更大。自己独立写完一个程序（无论大小）并看到他的正常运行时便会有一种成就感。不断培养这种成就感，循序渐进，进步是自然的事情。 <br>首先 <br>C语言是一个漫长的过程，它是基础，在很长很长......的时期内不会被淘汰。把C语言学好了，其他的，FOR EXAMPLE：C++，C#，JAVA，VC，VC++，VB，DELPHI......这些学起来就会比那些C语言基础不扎实的人要轻松得多！ <br>了解一下库函数。连库函数都不了解怎么去编程？我也是刚听人家说要看库函数的。 <br>初级阶段建议 <br>我是听人说的，我现在可没这么大本事： <br>1.我觉的可以先试着去划一条sin曲线。 <br>2.自己做一个类似tc的界面，这是菜单的练习。 <br>3.练习中断的调用，键盘，鼠标，时间等。 <br>4.tc是一个工具箱，tc下的库函数是各种各种的工具，我们要完成一件工作必须对工具熟悉，即使用的不熟悉，但至少也要有印象。所以《tc函数大全》是必备之物。所以要经常看tc下的库函数。 <br>5.这是最重要的一条：just do it！我现在才明白nike 的广告的真谛，其实也是这个世界的很重要的一条just do it！ <br>6.对于指针，我也不知到如何去用它，那些地方必须用它，我把握不住。 </p>
<p>在TC程序中你可以嵌入汇编、可以混合编程。我觉得嵌入汇编这一点很诱人。它使你在理论上无所不能。混合编程有利于提高对编译方法的理解。 <br>然后可以写俄罗斯方块，汉诺塔，贪食蛇，空间作战，吃豆等游戏 <br>接着可以学MASM，C+MASM=NUCLAER！当然是做系统了。 <br>学到这里就可以说C基本上是学会了。 </p>
<p>c ------&gt; c++ -----&gt;数字逻辑设计、离散数学、数据结构与算法（这是一个学校的课程） </p>
<p>第二阶段 <br>c++是c的提高，是面向对象的语言，也是到visual c的必经之路。现在就谈谈visual c的选择问题。 <br>我想在国内来讲VC算不上RAD（快速应用开发）工具，因为VC开发的效率是很差的，对于一些客户端应用来讲开发效率是让人难以忍受的。此外还有一个开发的误区就是&#8220;只要用VC就可以什么事都自己做！&#8221;我想最致命的就是这一点，要修一栋楼我想不需要连砖瓦都要自己烧吧！ <br>我上面的说法并不是在否定VC，我只说了开发中的一个方面，如果从维护的角度上来讲VC可以说是最好的工具。VC的好处在维护的过程中就会体现出来，我个人认为用VC开发出来的软件在维护过程中所花费的工作量要小于其他图形界面开发工具所开发的软件。当然这要求维护人员也必须是一个比较优秀的VC开发人员。 <br>最后我说点在选择VC开发时的一些看法： <br>无论谁只要愿意都可以选择VC作为开发工具，但你必须有耐心和精力。 <br>如果你更偏重于开发Windows后台服务，那么请选择VC，不要犹豫。 <br>如果你软件执行效率是非常重要的衡量因素而且外部条件有限，那么请选择VC，不要犹豫。 <br>如果你想完全的把握开发过程中的每一个环节，那么请选择VC，不要犹豫。 <br>如果你的软件很复杂，而且以后会有其他人接手你的工作，建议在主程序中使用VC，并准备好充足的文档。 <br>如果你想更多的了解系统的各种特性，而且希望自己的软件能够有更多的灵活性，那么请选择VC，不要犹豫。 <br>如果你想开发一套好的开发包，那么请选择VC，不要犹豫。（因为C/C++更接近系统，C/C++开发出来的开发包可以很方便的被其他开发工具调用） <br>&#8230;&#8230; <br>如果你下定决心，非VC不学，我祝贺你，你的选择没有错。 <br>如果你因为什么原因放弃VC，我也祝贺你，你的选择没有错。 <br>但是一个真正的程序员应选vc！ </p>
<p>结 束 语 <br>要学的还很多 慢慢来你会行的。祝你编程愉快!!!!! <br>推荐书籍 <br>--------------------------------------------------------------------------------------------------------------------------- <br>C语言： <br>清华谭浩强的《C语言程序设计》 <br>清华钱能的《c++》 <br>清华的《8086/8088汇编语言》 </p>
<p>数据结构： <br>电子工业出版社de &lt;&lt;设计模式&gt;&gt;很不错. </p>
<p>学习心得 <br>--------------------------------------------------------------------------------------------------------------------------- <br>1.如果你是真的喜欢编程，那什么都不是问题的 <br>2.实践。 <br>3.找点趣味的小程序编一遍。看看数据结构。找更高级的c程序书看看 <br>4.学习数据结构用c语言实现 <br>5.找源代码看 <br>6.自己编一个多模块的程序 <br>7.再学一编C <br>8.继续学，然后找工作 </p>
<p>多看书！ <br>多实践！ <br>多请教！ </p>
<p>学学数据结构之后你会有新的发现一定 </p>
<p>我前天去了一 家软件公司询问了一下啊，他们经理说用C 也行，但要很熟悉很熟练！！<br>--<br>天使是上帝选召的优秀人类，彼此孤独的活着。在遇到另一个天使之前，天使总是试图接近人类，人类畏惧天使的美丽，美丽因为天使在空中而美丽，人与天使之间总有隔膜--因为畏惧。天使为此收起翅膀，最终天使终于决心品味孤独，展翅高飞。 </p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/3522021224/aggbug/25612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-05 23:32 <a href="http://www.cppblog.com/3522021224/archive/2007/06/05/25612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成为程序设计高手的几大忌讳</title><link>http://www.cppblog.com/3522021224/archive/2007/06/05/25609.html</link><dc:creator> 星梦情缘</dc:creator><author> 星梦情缘</author><pubDate>Tue, 05 Jun 2007 15:29:00 GMT</pubDate><guid>http://www.cppblog.com/3522021224/archive/2007/06/05/25609.html</guid><wfw:comment>http://www.cppblog.com/3522021224/comments/25609.html</wfw:comment><comments>http://www.cppblog.com/3522021224/archive/2007/06/05/25609.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/3522021224/comments/commentRss/25609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/3522021224/services/trackbacks/25609.html</trackback:ping><description><![CDATA[: 1） 不会英语：CS源于美国，重量级的文档都是英文的。不会英语，那么你只能忍受..<br>: 劣的翻译和大延迟的文档（翻译出来的文档几乎都是很久以前出版的东西）。<br>: 2） 急于求成：什么都没学习就开始编程是最大的忌讳。写C++程序语法都能错，数?.<br>: 构连线性表都不知道，数据库不知道关系模型，TCP编程不知道socket，还是先坐下?.<br>: 习几年再说（如果说工作急需，我只能说：早干嘛去了）<br>: 3） 过于好问：勤学好问是一种很好的品质，但是如果把勤学丢了，只留下好问，就..<br>: 一个恶劣的素质了。事无巨细都去请教别人，一则会让人厌烦，二则由于没有系统学..<br>: 过程，也是不可能学习好的。<br>: 4） 只会艳羡别人和说别人不该拿那么多钱，而自己却收入微薄：老实说，绝大多数..<br>: 况下，收入的高低和你的水平是有正相关关系的。不是否认有关系的存在，但是绝对..<br>: 会10个人中9个人有关系而独独你没有。少抱怨一些多学习一些，提升自己才是最重?.<br>: 。<br>: 5） 过于不求甚解和过于求甚解。了解为什么是很重要的，但是要学习的东西很多，..<br>: 果什么都弄明白，那么估计头发白了还没有找到所有答案。当然如果什么都不想细致..<br>: 解，那么只能去做蓝领了。<br>: 6） 过分崇拜他人：我相信很多人都是很厉害的，值得大家崇拜，但是如果过于崇拜..<br>: 把他们的话当成圣经就没有必要了。你需要突破他们，而不是崇拜他们。<br>: 7） 不想吃苦：IT业高收入和高竞争是联系在一起的。没有付出永远别想进步。 
<img src ="http://www.cppblog.com/3522021224/aggbug/25609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/3522021224/" target="_blank"> 星梦情缘</a> 2007-06-05 23:29 <a href="http://www.cppblog.com/3522021224/archive/2007/06/05/25609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>