﻿<?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