<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>★既瑜★</title>
<link>http://blogger.org.cn/blog/blog.asp?name=njucs</link>
<description>既瑜(224499)的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[花语(中英文对照版)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10171</link>
<author>njucs</author>
<pubDate>2005/11/26 12:56:34</pubDate>
<description><![CDATA[A:&nbsp; <BR>ACACIA,&nbsp;Blossom&nbsp;-&nbsp;Concealed&nbsp;Love,&nbsp;Beauty&nbsp;in&nbsp;Retirement&nbsp; <BR>洋槐，花朵&nbsp;-&nbsp;隐秘的爱，隐居的美人&nbsp; <BR>ACORN&nbsp;-&nbsp;Nordic&nbsp;Symbol&nbsp;of&nbsp;Life&nbsp;and&nbsp;Immortality&nbsp; <BR>橡实&nbsp;-&nbsp;北欧人生命与不朽的象征&nbsp; <BR><BR>AMBROSIA&nbsp;-&nbsp;Your&nbsp;Love&nbsp;is&nbsp;Reciprocated&nbsp; <BR>(不知道是什么)&nbsp;-&nbsp;你的爱得到了回报&nbsp; <BR><BR>AMARYLLIS&nbsp;-&nbsp;Pride,&nbsp;Pastoral&nbsp;Poetry&nbsp; <BR>宫人草&nbsp;-&nbsp;自豪，田园诗&nbsp; <BR><BR>ANEMONE&nbsp;-&nbsp;Forsaken,&nbsp;Sincerity&nbsp; <BR>秋牡丹&nbsp;-&nbsp;被抛弃的，诚心诚意&nbsp; <BR><BR>ARBUTUS&nbsp;-&nbsp;Thee&nbsp;Only&nbsp;Do&nbsp;I&nbsp;Love&nbsp; <BR>杨梅&nbsp;-&nbsp;我只爱你&nbsp; <BR><BR>ASTER&nbsp;-&nbsp;Symbol&nbsp;of&nbsp;Love,&nbsp;Daintiness&nbsp; <BR>紫苑&nbsp;-&nbsp;爱的象征，优美&nbsp; <BR><BR>AZALEA&nbsp;-&nbsp;Take&nbsp;Care&nbsp;of&nbsp;Yourself&nbsp;For&nbsp;Me,&nbsp;Temperance,&nbsp;Fragile,&nbsp;Passion,&nbsp;Chinese&nbsp; <BR>Symbols&nbsp;of&nbsp;Womanhood&nbsp; <BR>杜鹃花&nbsp;-&nbsp;为了我保重你自己，温暖的，脆的，强烈的感情，在中国是子宫的象征&nbsp; <BR><BR>B:&nbsp; <BR>BACHELOR&nbsp;BUTTON&nbsp;-&nbsp;Single&nbsp;Blessedness&nbsp; <BR>矢车菊&nbsp;-&nbsp;单身的幸福&nbsp; <BR><BR>BEGONIA&nbsp;-&nbsp;Beware&nbsp; <BR>球海棠&nbsp;-&nbsp;小心&nbsp; <BR><BR>BELLS&nbsp;OF&nbsp;IRELAND&nbsp;-&nbsp;Good&nbsp;Luck&nbsp; <BR>爱尔兰风铃草&nbsp;-&nbsp;好运气&nbsp; <BR><BR>BITTERSWEET&nbsp;-&nbsp;Truth&nbsp; <BR>白英&nbsp;-&nbsp;事实&nbsp; <BR><BR>BLUEBELL&nbsp;-&nbsp;Humility&nbsp; <BR>野风信子&nbsp;-&nbsp;谦虚&nbsp; <BR><BR>BOUQUET&nbsp;OF&nbsp;WITHERED&nbsp;FLOWERS&nbsp;-&nbsp;Rejected&nbsp;Love&nbsp; <BR>凋零的花束&nbsp;-&nbsp;被拒绝的爱&nbsp; <BR><BR>C:&nbsp; <BR>CACTUS&nbsp;-&nbsp;Endurance&nbsp; <BR>仙人掌&nbsp;-&nbsp;忍耐&nbsp; <BR><BR>CAMELLIA&nbsp;-&nbsp;Admiration,&nbsp;Perfection,&nbsp;Good&nbsp;Luck&nbsp;Gift&nbsp;to&nbsp;a&nbsp;Man&nbsp; <BR>茶花&nbsp;-&nbsp;赞赏，完美，给男人以好运气的礼物&nbsp; <BR><BR>CAMELLIA&nbsp;(PINK)&nbsp;-&nbsp;Longing&nbsp;For&nbsp;You&nbsp; <BR>茶花(粉色)&nbsp;-&nbsp;渴望着你&nbsp; <BR><BR>CAMELLIA&nbsp;(RED)&nbsp;-&nbsp;You're&nbsp;A&nbsp;Flame&nbsp;In&nbsp;My&nbsp;Heart&nbsp; <BR>茶花(红色)&nbsp;-&nbsp;你是我心中的火焰&nbsp; <BR><BR>CAMELLIA&nbsp;(WHITE)&nbsp;-&nbsp;You're&nbsp;Adorable&nbsp; <BR>茶花(白色)&nbsp;-&nbsp;你值得敬慕&nbsp; <BR><BR>CANDYTUFT&nbsp;-&nbsp;Indifference&nbsp; <BR>白烛葵&nbsp;-&nbsp;不感兴趣&nbsp; <BR><BR>CARNATION&nbsp;(GENERAL)&nbsp;-&nbsp;Fascination,&nbsp;Womanized&nbsp;Love&nbsp; <BR>康乃馨（一般的说)&nbsp;-&nbsp;魅力使人柔弱的爱&nbsp; <BR><BR>CARNATION&nbsp;(PINK)&nbsp;-&nbsp;I'll&nbsp;Never&nbsp;Forget&nbsp;You&nbsp; <BR>康乃馨(粉色)&nbsp;-&nbsp;我永远不会忘了你&nbsp; <BR><BR>CARNATION&nbsp;(RED)&nbsp;-&nbsp;My&nbsp;Heart&nbsp;Aches&nbsp;For&nbsp;You,&nbsp;Admiration&nbsp; <BR>康乃馨（红色)&nbsp;-&nbsp;我的心为你而痛，赞赏&nbsp; <BR><BR>CARNATION&nbsp;(PURPLE)&nbsp;-&nbsp;Capriciousness&nbsp; <BR>康乃馨(紫色)&nbsp;-&nbsp;任性&nbsp; <BR><BR>CARNATION&nbsp;(SOLID&nbsp;COLOR)&nbsp;-&nbsp;Yes&nbsp; <BR>康乃馨（原色)&nbsp;-&nbsp;是&nbsp; <BR><BR>CARNATION&nbsp;(STRIPPED)&nbsp;-&nbsp;No!,&nbsp;Refusal,&nbsp;Sorry&nbsp;I&nbsp;Can't&nbsp;Be&nbsp;With&nbsp;You&nbsp; <BR>康乃馨(有斑纹)&nbsp;-&nbsp;不！拒绝，我不能和你在一起&nbsp; <BR><BR>CARNATION&nbsp;(WHITE)&nbsp;-&nbsp;Sweet&nbsp;and&nbsp;Lovely,&nbsp;Innocence,&nbsp;Pure&nbsp;Love,&nbsp;Womanize&nbsp;Good&nbsp;Luck&nbsp;Gift&nbsp; <BR>康乃馨（白色)&nbsp;-&nbsp;甜蜜而可爱，天真无邪，纯洁的爱，给女性带来好运气的礼物&nbsp; <BR><BR>CARNATION&nbsp;(YELLOW)&nbsp;-&nbsp;You&nbsp;Have&nbsp;Disappointed&nbsp;Me,&nbsp;Rejection&nbsp; <BR>康乃馨（黄色)&nbsp;-&nbsp;你让我感到失望，抛弃&nbsp; <BR><BR>CATTAIL&nbsp;-&nbsp;Peace,&nbsp;Prosperity&nbsp; <BR>香蒲&nbsp;-&nbsp;和平，幸运&nbsp; <BR><BR>CHRYSANTHEMUM&nbsp;(GENERAL)&nbsp;-&nbsp;You're&nbsp;A&nbsp;Wonderful&nbsp;Friend,&nbsp;Cheerfulness&nbsp;and&nbsp;Rest&nbsp; <BR>菊花(一般的说)&nbsp;-&nbsp;你是个了不起的朋友，快活与放松&nbsp; <BR><BR>CHRYSANTHEMUM&nbsp;(RED)&nbsp;-&nbsp;I&nbsp;Love&nbsp; <BR>菊花(红色)&nbsp;-&nbsp;我爱&nbsp; <BR><BR>CHRYSANTHEMUM&nbsp;(WHITE)&nbsp;-&nbsp;Truth&nbsp; <BR>菊花(白色)&nbsp;-&nbsp;事实&nbsp; <BR><BR>CHRYSANTHEMUM&nbsp;(YELLOW)&nbsp;-&nbsp;Slighted&nbsp;Love&nbsp; <BR>菊花(黄色)&nbsp;-&nbsp;忽视的爱&nbsp; <BR><BR>COREOPSIS&nbsp;-&nbsp;Always&nbsp;Cheerful&nbsp; <BR>波斯菊&nbsp;-&nbsp;永远快乐&nbsp; <BR><BR>CROCUS&nbsp;-&nbsp;Cheerfulness,&nbsp;Gladness&nbsp; <BR>番红花&nbsp;-&nbsp;快乐，高兴&nbsp; <BR><BR>CYCLAMEN&nbsp;-&nbsp;Resignation&nbsp;and&nbsp;Good&nbsp;Bye&nbsp; <BR>仙客来&nbsp;-&nbsp;辞职与再见&nbsp; <BR><BR>D：&nbsp; <BR>DAFFODIL&nbsp;-&nbsp;Regard,&nbsp;Unrequited&nbsp;Love,&nbsp;You're&nbsp;The&nbsp;Only&nbsp;One,&nbsp;The&nbsp;Sun&nbsp;Is&nbsp;Always&nbsp; <BR>Shining&nbsp;When&nbsp;I'm&nbsp;With&nbsp;You,&nbsp;Respect&nbsp; <BR>水仙花&nbsp;-&nbsp;关心，不计报答的爱，你是我的唯一，和你在一起时总是阳光明媚，尊敬&nbsp; <BR><BR>DAISY&nbsp;-&nbsp;Innocence,&nbsp;Loyal&nbsp;Love,&nbsp;I'll&nbsp;Never&nbsp;tell,&nbsp;Purity&nbsp; <BR>雏菊&nbsp;-&nbsp;天真无邪，忠诚的爱，我永远不会说的，纯正&nbsp; <BR><BR>DANDELION&nbsp;-&nbsp;Faithfulness,&nbsp;Happiness&nbsp; <BR>蒲公英&nbsp;-&nbsp;忠诚，幸福&nbsp;]]></description>
</item><item>
<title><![CDATA[各种花的花语]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10170</link>
<author>njucs</author>
<pubDate>2005/11/26 12:53:08</pubDate>
<description><![CDATA[1.野蔷薇の浪漫&nbsp; <BR><BR>　　人工栽培的蔷薇花并不会结果，不过野蔷薇却会长出娇欲滴的红色果实。除了模样可以比美其它蔷薇花外，果实也可以实用。这种花具有诗人般的气质，因此它的花语是－浪漫。 <BR>　　受到这种花祝福而生的人具有罗曼蒂克的浪漫性格，是个喜欢作梦的孩子。不过处理事情却具有敏锐的判断力，适合从事艺术方面的工作。在感情方面，也是一个完美主义者。 <BR><BR>2.月桂の蛊惑 <BR><BR>从月桂的叶片中可提炼出樱桃．月桂水，这是一种可以供香水或糕点使用的香料。不过这种香精是有毒的，大量使用的话会有危险。月桂花是一种既有魅力又恐怖的植物，所以它的花语就是－蛊惑。 <BR>　　受到这种花祝福而生的人，具备了明&nbsp;、奔放、危险的魅力，也许一生会有许多恋爱故事哦。 <BR><BR>3.银莲の期待 <BR><BR>银莲花的希腊语是风的意思。银莲花的高度从十到二十公分左右，是一年生的草本植物。开花时节，可爱的花朵迎风摇摆，就像在引颈期盼着什麽似的，所以它的花语是－期待。 <BR>　　凡是受到这种花祝福而生的人，浪漫、爱梦想。不过，也得明白现实不是那麽美好哦！ <BR><BR>4.葶苈の勇气 <BR><BR>葶苈是被献给四世纪的殉道者－圣沙拉哥沙的威肯帝斯的花朵。他即使受到严刑烤问，仍然鼓励同伴，一直到殉教身亡。因此葶苈的花语就是－勇气。 <BR>　　凡是受到这种花祝福而诞生的人，具有维护正道的勇气，并能坚持到底。适合你的恋人，最好是能与你分享全部人生，同时也能支持你的信念的人。 <BR><BR>5.凤尾の热情 <BR><BR>很久很久以前，铁角凤尾草就被当做迷恋要来使用。换句话说，只要把根茎的汁液让意中人喝下，就可以抓住对方的心。铁角凤尾草是一种具备特殊迷惑力的植物，因此它的花语是－热情。 <BR>　　受到这种花祝福的人，也是十分热情。一旦陷入情网便爱得死去活来不可自拔。如果是两人相爱，当然不成问题。但要是单相思，痛苦是他人的一倍哦，这一点要特别注意啊！ <BR><BR>6.风信子の休憩 <BR><BR>圣经上所谓「山谷的百合」或「荆蕀间的百合」可能就是风信子。原产於中东，在沙漠和荒地随处盛开，令疲惫的旅人倍感温馨与安慰。因此，它的花语就是－休憩。 <BR>　　受到这种花祝福而生的人心胸宽广，能带给与他接触的人心灵上的安慰。有时恋人也须要靠在你肩上休息片刻，这时候请好好的安慰他吧。 <BR><BR>7.郁金香の华丽 <BR><BR>像豪华郁金香这麼艳丽的花恐怕很少吧？不只花瓣是鲜艳的红色，花瓣的根部是黑色，而且在黑色的边缘还镶著金边。因此，它的花语就是－华丽。 <BR>　　凡是受到这种花祝福而生的人，无论穿什麼、做什麼，总是众人注目的焦点。不?，懂得你也有诗情画意的一面的人，也许只有你的情人吧？ <BR><BR>8.紫罗兰の清凉 <BR><BR>　　紫罗兰是一种盛开在五、六月间，成鞋钉状的花卉。这种花的香气逼人，虽然属於野生植物，但是园丁特别喜欢把它种在窗台下。主要是希望藉由紫罗兰，把芬芳的香气带进屋子里。因此紫罗兰的花语是－清凉。 <BR>　　凡是受到这种花祝福而诞生的人具有带给周遭的人爽朗的特质，纯纯的爱比较适合这样的你。至於目前流行的婚外情嘛还是少碰为妙。&nbsp; <BR><BR>9.鸢尾の优美 <BR><BR>鸢尾花虽然具有粗大的根，宽阔如刀的叶，非常强韧的生命力。但是由於它是制造香水的原料，因此相当受尊重，也广被使用。所以它的花语是－优美。 <BR>　　受到这种花祝福而生的人具有柔美娇媚的气质擅於社交，但却不是游戏人间的人。他对於将来有一番规划，会玩会读书会工作，可以说是这种人的生活形态。这样的人生不是很优美吗？ <BR><BR>10.罗勒の协助 <BR><BR>　罗勒的叶片自古以来不但被人们视为一种珍贵的香料，也是一种神圣之物，目前全世界都普遍栽培这种植物。烹煮食物时，加一点罗勒香料，可以增加食物的风味。因此罗勒的花语是－协助。 <BR>　　受到这种花祝福而生的人具有慧眼识英雄的特异功能，能一眼看透朋友的潜力，并协助他人发挥所长。甚至会鼓励自己的亲密伴侣，且适时的提供帮助，实在是&nbsp;一位不可多得的幕后英雄。 <BR><BR>11.小连翘の魔法 <BR><BR>　　这种花隐藏着一股不可思议的神奇力量，听说睡觉时在枕头下压着小连翘，会可以梦见未来丈夫的容貌。因此它的花语就是－魔法。不过这并不是邪恶的巫术，而是善意的魔法。 <BR>　　受到这种花祝福而生的人具有神奇且敏锐的洞察力，通灵般的第六感，会把一见锺情的对象，视为一生的伴侣。&nbsp; <BR><BR>12.龙芽の撒娇 <BR><BR>　　西洋龙芽草是开杏黄色花朵的植物，果实外表覆有一层绒毛。凡是经过的人或动物，都会沾到它的种子，并藉此广布到各处。所以它的繁殖方式就是依赖他人，因此西洋龙芽草的花语就是－撒娇。 <BR>　　受到这种花祝福而生的人依赖性特别强，而且缺乏自信。不过喜欢这种性格的异性朋友倒是不少，看来撒娇果然是情场上致胜的武器。 <BR><BR>13.青兰の顺从 <BR><BR>　　这是一种富趣味性的植物，盛开的花朵如果朝某个方向弯曲，整株植物就会维持这种状态生长下去。因此，这种花又%B]]></description>
</item><item>
<title><![CDATA[NTFS格式的7个精彩问答（pconline）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10169</link>
<author>njucs</author>
<pubDate>2005/11/26 12:52:16</pubDate>
<description><![CDATA[
<P class=content><SPAN class=content><B><FONT color=#0000ff>1、什么是NTFS？<BR></FONT></B><BR></SPAN>想要了解NTFS，我们首先应该认识一下FAT。FAT(File Allocation Table)是“文件分配表”的意思。对我们来说，它的意义在于对硬盘分区的管理。FAT16、FAT32、NTFS是目前最常见的三种文件系统。<BR><BR><B><FONT color=#ff0000>FAT16：</FONT></B>我们以前用的DOS、Windows 95都使用FAT16文件系统，现在常用的Windows 98/2000/XP等系统均支持FAT16文件系统。它最大可以管理大到2GB的分区，但每个分区最多只能有65525个簇（簇是磁盘空间的配置单位）。随着硬盘或分区容量的增大，每个簇所占的空间将越来越大，从而导致硬盘空间的浪费。<BR><BR><B><FONT color=#ff0000>FAT32：</FONT></B>随着大容量硬盘的出现，从Windows 98开始，FAT32开始流行。它是FAT16的增强版本，可以支持大到2TB（2048GB)的分区。FAT32使用的簇比FAT16小，从而有效地节约了硬盘空间。<BR><BR><B><FONT color=#ff0000>NTFS：</FONT></B>微软Windows NT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式。随着以NT为内核的Windows 2000/XP的普及，很多个人用户开始用到了NTFS。NTFS也是以簇为单位来存储数据文件，但NTFS中簇的大小并不依赖于磁盘或分区的大小。簇尺寸的缩小不但降低了磁盘空间的浪费，还减少了产生磁盘碎片的可能。NTFS支持文件加密管理功能，可为用户提供更高层次的安全保证。<BR><BR><B><FONT color=#0000ff>2、什么系统可以支持NTFS文件系统？</FONT></B><BR><BR>只有Windows NT/2000/XP才能识别NTFS系统，Windows 9x/Me以及DOS等操作系统都不能支持、识别NTFS格式的磁盘。由于DOS系统不支持NTFS系统，所以最好不要将C:盘制作为NTFS系统，这样在系统崩溃后便于在DOS系统下修复。<BR><BR><B>ntfs与操作系统支持情况表</B><BR>
<TABLE borderColor=#cccccc cellSpacing=1 cellPadding=0 width="90%" border=1>
<TBODY>
<TR>
<TD>文件系统</TD>
<TD>支持的操作系统</TD></TR>
<TR>
<TD>fat16</TD>
<TD>windows 95/98/me/nt/2000/xp unix，linux，dos</TD></TR>
<TR>
<TD>fat32</TD>
<TD>windows 95/98/me/2000/xp</TD></TR>
<TR>
<TD>ntfs</TD>
<TD>windows nt/2000/xp</TD></TR></TBODY></TABLE>
<P class=content><FONT color=#0000ff><B>3、我是不是需要NTFS？</B></FONT><BR><BR>Windows 2000/XP在文件系统上是向下兼容的，它可以很好地支持FAT16/FAT32和NTFS，其中NTFS是Windows NT/2000/XP专用格式，它能更充分有效地利用磁盘空间、支持文件级压缩、具备更好的文件安全性。如果你只安装Windows 2000/XP，建议选择NTFS文件系统。如果多重引导系统，则系统盘（C盘）必须为FAT16或FAT32，否则不支持多重引导。当然，其他分区的文件系统可以为NTFS。<BR><BR><B><FONT color=#0000ff>4、如何将FAT分区转换为NTFS？</FONT></B><BR><BR>Windows 2000/XP提供了分区格式转换工具“Convert.exe”。Convert.exe是Windows 2000附带的一个DOS命令行程序，通过这个工具可以直接在不破坏FAT文件系统的前提下，将FAT转换为NTFS。它的用法很简单，先在Windows 2000环境下切换到DOS命令行窗口，在提示符下键入：<BR><BR>D:&gt;convert 需要转换的盘符 /FS:NTFS<BR>如系统E盘原来为FAT16/32，现在需要转换为NTFS，可使用如下格式：<BR>D:&gt;convert e: /FS:NTFS<BR>所有的转换将在系统重新启动后完成。<BR><BR>此外，你还可以使用专门的转换工具，如著名的硬盘无损分区工具Partition Magic，使用它完成磁盘文件格式的转换也是非常容易的。首先在界面中的磁盘分区列表中选择需要转换的分区。从界面按钮条中选择“Convert Partition”按钮，或者是从界面菜单条“Operations”项下拉菜单中选择“Convert”命令。激活该项功能界面。在界面中选择转换输出为“NTFS”，之后单击“OK”按钮返回程序主界面。单击界面右下角的“Apply”添加设置。此后系统会重新引导启动，并完成分区格式的转换操作。<BR><BR><B><FONT color=#0000ff>5、虽然NTFS格式分区比较优越，但是在这个分区下如何找回意外丢失的文件？<BR></FONT></B><BR>你可以使用专门的软件，如Final Data for NTFS，或者是Get Data Back for NTFS。这两个软件的文件恢复效果都不错，如果在文件删除后没有任何文件操作，恢复率接近100%。所以不要等到文件删除后才安装这个软件，最好是与Windows系统一起安装，并在出现文件误删除后立刻执行恢复操作，一般可以将删除的文件恢复回来。<BR><BR><B><FONT color=#0000ff>6、我的Windows 2000/XP安装在C盘（NTFS格式），如果在DOS状态下不能进入C盘，当Windows崩溃时怎么办？<BR></FONT></B><BR>你可以使用Windows 2000/XP的安装光盘启动来修复Windows，或者是制作Windows 2000/XP的安装启动应急盘。注意：Windows 2000的安装盘制作程序在程序的安装光盘中，而Windows XP的应急盘制作是独立提供的，需要从微软的网站下载。<BR><BR><B><FONT color=#0000ff>7、Final Data for NTFS或Get Data Back for NTFS可以修复被意外格式化的硬盘吗？</FONT></B><BR><BR>可以。这两个软件都可以恢复格式化删除的数据（低级格式化除外）。常规格式化删除的只是数据信息，低级格式化则删除全部数据区，当硬盘技术还不像现在这样发达的时候，磁盘表面很容易磨损。硬盘使用者对经常出现的读错误，往往采用低级格式化。修复被格式化的硬盘，只能将这个硬盘拆下来，安装到其他的计算机中，之后执行文件修复操作。Final Data甚至可以修复由CIH病毒破坏的硬盘。（作者：Lily）</P>]]></description>
</item><item>
<title><![CDATA[童言无忌，有趣得一蹋]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10168</link>
<author>njucs</author>
<pubDate>2005/11/26 12:51:13</pubDate>
<description><![CDATA[童言无忌<BR><BR>一、动物天地<BR><BR>1、为什么动画片《猫和老鼠》里的老鼠要比猫厉害？<BR>答：这只老鼠肯定吃过菠菜的。　(大力水手血溅三尺……)<BR>　　因为这部动画片是老鼠写的。　(猫血溅三尺……)<BR><BR>2、为什么说“老虎屁股摸不得”？<BR>答：因为摸到老虎屁股，它尾巴一甩，会把人的手甩到地上去的，很疼的。<BR>　　老虎的屁股太大了。<BR>　　摸老虎屁股是不文明的。　(人间自有正气长存……)<BR><BR>3、怎么样让蚊子不叮我们呢？<BR>答：请一个保姆在门口守着。　(保姆血溅三尺……)<BR>　　在身上涂点油，蚊子蹬上去就会滑掉了。<BR>　　身上涂点胶水，就把蚊子粘在上面了。<BR>　　放《摇篮曲》，蚊子就去睡觉了，就不会咬人了。<BR><BR>4、螃蟹为什么会吐泡泡？<BR>答：螃蟹热得出汗了。<BR>　　它饿了，在流口水。<BR><BR>5、为什么现在没有恐龙了？<BR>答：有一次很大的地震把恐龙灭绝了。<BR>　　恐龙去拍电影了。　(……原来如此。)<BR><BR>6、小白兔为什么爱吃萝卜？<BR>答：因为它的眼睛是红的。<BR>　　萝卜有营养。<BR>　　因为小白兔买不起肉。　(小白兔血溅三尺……)<BR><BR>7、长颈鹿长长的脖子有什么作用？<BR>答：可以看见它的好朋友。<BR>　　脖子长戴金项链好看。　(……)<BR>　　这样能偷看农民种菜<BR><BR>8、如果有一天大海里没有水了，鱼怎么办呢<BR><BR>答：让小河里的水流到大海里去，再放点盐就变成大海了。　(明白海水和淡水的<BR>区别呀！)<BR>　　叫鱼学会在陆地上呼吸。　(动物就是酱紫进化的……)<BR><BR>9、小鸟的尾巴有什么作用？<BR>答：可以盖屁股。　(遮羞用的啊……)<BR>　　跳舞的时候张开很好看。<BR><BR>10、松鼠的尾巴有什么用？<BR>答：当被子盖。<BR>　　当降落伞。<BR>　　可以扫地。<BR>　　当枕头。<BR><BR>二、人的学问<BR>1、小朋友的脸是干什么用的？<BR>答：我的脸可以用来洗脸。　(捶地……)<BR>　　没有脸的话，舌头、牙齿、鼻子、眼睛和嘴巴都要露在外面了。<BR>　　刮老面皮的。<BR>　　我的脸是给爷爷奶奶捏的。<BR><BR><BR>2、人为什么不是蛋孵出来的？<BR>答：因为我妈妈是人，不是小鸡，所以只会生出人，不会生出蛋的。<BR>　　小鸡有尖嘴巴，人没有尖嘴巴，我们没办法从壳里钻出来的。<BR>　　有翅膀的动物才会从蛋里生出来。　(这个倒有些道理。)<BR>　　我妈妈一生完就把我抱出来了。<BR><BR>3、为什么小孩是从妈妈肚子里生出来的，不是从爸爸肚子里生出来的？<BR>答：男的生男孩子，女的生女孩子。<BR>　　爸爸肚子里都是啤酒，生出来的孩子都是醉的。<BR>　　爸爸没有产假，妈妈有产假。　(爸爸血溅三尺……)<BR>　　爸爸是男的，如果生孩子，就会难产。　(爸爸继续血溅三尺……)<BR>　　爸爸生不来的，因为奶奶没有教他。<BR><BR>4、谁记得自己刚出生时是什么样子？<BR>答：头很小的，像一个乒乓球。<BR>　　小时侯是光光头，头发还没长出来。<BR>　　很小的，像个热水瓶一样。<BR>　　我生出来的时候就爬呀爬的。<BR><BR>5、人的鼻子有什么用处？<BR><BR>答：没有鼻子就不能闻出饭菜的味道，吃了就很怪的。<BR>　　没鼻子的话，鼻毛和鼻涕就没地方住了。　(抱头……)<BR>　　没鼻子香水就卖不掉了。<BR><BR>6、头发有什么用处？<BR>答：冬天不会被雪砸破头。<BR>　　给理发师一点事做。　(理发师血溅三尺……)<BR><BR>7、爸爸为什么要刮胡子？<BR>答：胡子长了喝稀饭不方便。<BR>　　胡子长了他的脸会疼的。<BR>　　胡子长长了会变成头发的。<BR>　　我爸爸不刮胡子我妈妈就不喜欢他了。　(爸爸还是血溅三尺……)<BR><BR><BR>8、如果小朋友一天就长成大人好不好？<BR>答：时间过得太快，一会会儿就要吃饭了，肚子还没消化呢。<BR>　　如果时间过得很快，人一会会儿就死掉了，那么世界上就没人了。　<BR>(……好、好有远见。-o- )<BR>　　如果比爸爸妈妈大了，怎么叫爸爸妈妈呢？<BR><BR>9、人什么时候有四条腿？<BR>答：扮小狗的时候。<BR>　　两个人抱在一起。　(捶地……) <BR><BR>10、有什么办法让胖子瘦下来，让瘦子胖起来？<BR>答：瘦子多打拳击，胖子做靶。　(胖子血溅三尺……)<BR>　　叫胖子多喝点水，肚子就会变得很大很大，一揿，就瘦了。　(胖子继续血溅三尺……<BR>)<BR><BR>三、世界真奇妙<BR><BR>1、足球场上为什么那么多人抢一个球呢？<BR>答：他们没钱，只能买得起一个球。<BR>　　球多了来不及踢。<BR>　　因为球长得漂亮。<BR><BR>2、为什么儿童节要定在6月1日？<BR>答：妈妈爸爸过的节日很多，要给小朋友过点节日的。<BR>　　其他日子都没空。<BR><BR>3、火车的名字是怎么来的？<BR>答：它妈妈就给它起了这个名字。<BR>　　因为它在生气发火<BR><BR>4、为什么有的气球会往上飞？<BR>答：能飞上天的气球都是骨头轻的。　(……￣□￣;;; )<BR>　　气球生气的时候就飞上去了。<BR><BR>5、为什么叫浦东？<BR>答：有很多鸭子跳进去，扑通扑通的，所以叫浦东。　<BR>(……一切的谜都解开了！！！死鸭子出来给我捏！！！)<BR><BR>6、钱存在什么地方比较好？<BR>答：存在家里，因为没人知道你存钱了。<BR>　　藏在皮鞋里<BR><BR>7、海军帽后面的两根飘带有什么用？<BR>答：为了漂亮。<BR>　　飘带越多官越大。<BR>　　因为他想留小辫子。<BR><BR>四、肚子饿啦<BR><BR>1、过生日为什么要吃面条呢？<BR>答：吃了面条长得很快的。<BR>　　吃面条便宜。<BR><BR>2、小朋友们喜欢吃鸡的哪个部分？ <BR>答：我喜欢吃鸡肉，因为我天天在锻炼肌肉的。<BR>　　我想吃鸡爪子，因为吃了鸡爪子会走路。<BR><BR>3、汤圆为什么是圆的呢？<BR>答：因为它的名字就叫汤圆。<BR>　　方的汤圆吃不下去，会卡在喉咙里的。<BR>　　因为嘴巴是圆的。<BR><BR>4、牛奶是哪里来的？<BR>答：是用奶粉冲出来的。　(出现了！！！)<BR>　　牛小便小出来的。　(我血溅三尺……)<BR><BR>5、椰奶是从哪里来的？<BR>答：把椰子给牛吃，挤出来的奶就是椰奶。　(出现了！！！)<BR><BR>五、名词新解<BR><BR>1、听了《蓝色多瑙河》的音乐，小朋友有什么感觉？<BR>答：好像小狗在摇自己的尾巴。<BR>　　感觉很清凉的。<BR>　　有点感觉了，一只乌龟在爬。<BR><BR>2、《西班牙斗牛士》这段音乐讲的是什么故事？<BR>答：泰坦尼克号。<BR>　　小荷姐姐在梳辫子。　(小荷姐姐血溅三尺……)<BR>　　有人在打架。<BR><BR>3、有个老爷爷丢了一匹马，你认为马还会回来吗？<BR>答：那匹马肯定会回来的，因为它认识自己的脚印。<BR>　　我觉得马到外面去结婚了，不会回来了。　(好、好浪漫……)<BR>　　会回来的，因为它的押金还在老爷爷这里。　(好、好现实！)<BR><BR>4、如果你家门口撞死一只兔子，你爸爸妈妈会怎么办呢？<BR>答：我妈妈会把它送到医院的。<BR>　　我爸爸会高兴地流口水。　(爸爸：……)<BR><BR>5、人猿泰山到城里来可以干什么呢？<BR>答：捞月亮。　(强者！这就叫融会贯通、入乡随俗！&gt;"&lt; )<BR>　　修电线。<BR>　　做杂技演员。<BR>　　他能到动物园给动物们做翻译。<BR><BR>6、乌龟和兔子赛跑，乌龟想赢，它该怎么办？<BR>答：给兔子吃药，让它拉肚子<BR>　　乌龟说：“我们比赛谁跑得慢。”<BR>　　在自己脚上按上弹簧，再给兔子脚上抹上糨糊。 <BR>　　让乌龟的弟弟等在终点站，兔子以为乌龟已经到了。(总之，乌龟都不甚光明。- -！<BR>)<BR><BR><BR>7、为什么愚公不搬家，而要他的子子孙孙把山挖掉呢？<BR><BR>答：他们想在山中间开小店。　(私有经济的先驱……)<BR>　　山里有金币。<BR>　　挖石头可以卖钱。　(开山采矿的先驱……)<BR><BR>六、望文生义<BR><BR>1、小朋友谁知道“谈心”是什么意思？<BR><BR>答：谈心就是心像个弹簧一样在弹。<BR><BR>　　两个人坐在沙发上谈生意。<BR>　　谈心就是一个人和对面的那个人在谈关于心的问题。<BR><BR><BR>2、什么是门外汉？<BR>答：就是流汗了。<BR><BR>　　大力士在外面站着。<BR><BR><BR>3、门槛精是什么意思？<BR><BR>答：就是用金子做的门槛。<BR>　　就是有个妖怪坐在门槛上。<BR><BR><BR>4、七嘴八舌是什么意思？<BR><BR>答：不该说的时候说，该说的时候不说。<BR>　　把舌头拔出来。<BR>　　八个人很吵，七个人很安静。<BR><BR>5、鹦鹉学舌是什么意思呢？<BR><BR>答：就是它想抓八条蛇回家。<BR>　　鹦鹉学蛇的样子。<BR><BR><BR>6、什么是“书生”？<BR><BR>答：抓老鼠的人。　(书生血溅三尺……)<BR>　　叔叔生的孩子。　(叔叔血溅三尺……<BR><BR><BR>七、异想天开<BR><BR>1、外星人长什么样？<BR><BR>答：他的眼睛像眼睛哥哥，鼻子像河马，嘴巴像我妈妈，耳朵像鬼。<BR>　　外星人头上戴一个玻璃罩，里面能放鱼的。<BR><BR><BR>2、眼睛哥哥请一位叔叔给老奶奶让座，可是这个叔叔没让座，这是为什么呢？<BR><BR>答：他在装睡。<BR>　　他的裤子坏了。　(……)<BR><BR><BR>3、小朋友有什么办法知道自己晚上有没有打呼噜呢？<BR><BR>答：叫妈妈帮个忙，拿个镜子照着，打呼噜可以看见。<BR>　　我自己闭着眼睛听。<BR><BR><BR>4、你有什么好办法让警察叔叔既能指挥交通又没有危险？<BR><BR>答：给警察戴一个牌子，上面写上“别撞我！”。<BR>　　在警察叔叔的头上面装一把伞，把他吊在空中，车就撞不到了。<BR>　　警察叔叔可以站到树上去。<BR>　　警察叔叔可以穿盔甲，人家撞他也不要紧。<BR>]]></description>
</item><item>
<title><![CDATA[给MM修电脑的三个步骤[转载]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10167</link>
<author>njucs</author>
<pubDate>2005/11/26 12:45:16</pubDate>
<description><![CDATA[<P>给MM修电脑的三个步骤<BR></P>
<P>转自: 南京大学小百合站<BR><BR><BR>1、一定要打预防针！<BR><BR>　　在修之前，向MM反复声明，这电脑故障是有硬件和软件之分的，如果是硬件故障，例<BR>如显卡风扇不转了，显示器连线老化，显示器分辨率超出显示器指标，等等都会导致黑屏<BR>啊，这个我不回家用专门的工具是修不好的！<BR><BR>　　这样一旦真的没修好，就立刻耸肩膀作无奈装：真的是硬件问题，还是送去保修吧。<BR>而MM当作硬件问题去保修，JS大人即使发现是软件问题，也会毫不犹豫作为硬件问题处理<BR>，所以决计不会有败露的麻烦<BR><BR>　　2、重装是万能药方！<BR><BR>　　不管发生什么，只要MM同意，一律重装系统！这是最简单的方法，虽然很菜。但是如<BR>果要感动MM，这也是最好的方法，因为MM会在漫长的等待中觉得你真是很有耐心和爱心的<BR>好男人！哈哈哈哈，太阴险了，所以给恐龙修电脑，一般还是对症下药，速战速决，不要<BR>绿我，确实当恐龙看上你的时候，你就知道这不是RPWT，而是生命问题！<BR><BR>　　3、关心要无所不在！<BR><BR>　　如果选择重装，一定要反复问MM：真的可以吗？MM第一遍一般就说可以，这时候要问<BR>：没有重要的照片、文档吗？MM会犹豫，但是还是会说不要好了；这时候接着问：QQ聊天<BR>记录也会丢掉的！MM会说不要了；记着这时要作思考状，然后问：有没有重要的邮件啊，<BR>邮件也会丢掉的。一般啊，很多MM这个时候会反悔，她们就会觉得你是超级贴心人了。<BR><BR><BR>　　如果选择打开机箱，一定要作惊讶状！怎么这么多灰尘啊！！！（我只见过一个MM的<BR>机箱里没有灰尘的，她是实在太爱干净了）这时候MM一般都会不知道怎么回答，你立刻要<BR>作出为电脑难过的样子：这么好的电脑，灰尘太多怎么跑得快啊，散热也会受影响的，当<BR>然容易出问题了。哈哈哈哈，MM内疚的同时就会觉得你这个人特别懂得爱惜珍惜疼惜是新<BR>好男人。<BR><BR>　　技术篇：<BR><BR>　　1、MM电脑出的通常都是弱智问题<BR><BR>　　所以不要用特别专业的眼光去分析，一般都是系统设置没设置好，例如曾经一个MM，<BR>帮她新配的电脑，说音箱左边的不响，过去检查，果然不响，怎么调都只有电流声，心想<BR>坏了，买到坏的了，结果不死心一看，音量控制里她全搁到右声道了，昏死！<BR><BR>　　对于显示屏黑屏这种事情，要多看看显示器开关有没有开，显示器有没有插上电源，<BR>显示器线有没有连到主机等等问题！<BR><BR>　　稍微高级一点，看看BIOS设定，显示器分辨率设定，对比度设定等等<BR><BR>　　再高级一点，看看是不是显卡风扇停转了<BR><BR>　　在有别的电脑的情况下，和别的电脑对调一下显示器看看，容易分辨是不是显示器的<BR>问题，但是要注意，要是女生寝室的话，慎用！！！因为女生寝室一般好像关系都不好，<BR>就是好也不愿意为别人的电脑奉献自己的电脑，这一点和男生寝室不一样，要鄙视一下！<BR><BR><BR>　　要想帅，带上可以外接显示器的本本去，要轻薄的，2.3kg以上就不要驮过去丢脸了<BR><BR><BR>　　2、要想酷、拆机箱<BR><BR>　　不管是不是硬件问题，如果你想MM崇拜到要嫁给你的地步，记住一定要带上一根较大<BR>的十字起子，推荐电脑城装机的那种，很长很长的，超帅！我一般带上两根，一个十字头<BR>，一个一字头，一个红色有机玻璃柄，一个绿色玻璃柄，就像两把短剑，有了这两柄利器<BR>，感觉立马不一样！MM立刻觉得你就是专业的，如果MM看到后觉得害怕，别忘趁势解释一<BR>句：修的多了，随身带着方便，你的问题不一定那么大，或许用不上。MM这个时候只会希<BR>望自己的电脑坏的彻底一点，好见识你挥动长剑的潇洒身姿！哈哈哈哈，这句是丫丫而已<BR>。<BR><BR>　　3、熟练掌握BIOS设定的窍门是看说明书！<BR><BR>　　其实很多时候问题和解决问题的方法都在BIOS设定上，例如老肯必须掌握的光驱启动<BR>，就在BIOS设定里面，这个时候万一忘记了怎么办，求助于说明书吧！！！其实在说明书<BR>中，一般都有详尽的说明，甚至包括常见问题的解决方法，只是MM们比较娇嫩，不适宜阅<BR>读这么生硬的文字罢了你的责任就是阅读它们！！！<BR><BR>　　不要觉得临时看说明书很丢脸！如果说拆机箱可以展现你武的一面，那么你专注阅读<BR>的神情正是你展现自己文的一面最好机会！！！能文能武才是你获取MM芳心的致胜法宝，<BR>只知道挥着袖子与主板上的灰尘大战的土匪只会让MM觉得这些喜欢硬件的GG都是脏兮兮的<BR>疯子。<BR><BR>　　而你要求获得主板、显卡及其他相关说明书最好的方法，要么就是一开始索要，一进<BR>门就让她把她放这些东西的盒子搬出来放好；要么就是拆开机箱以后，惊讶一句：啊！这<BR>不是公版设计，我要看一下出厂时的说明书！！！甭管是什么设计，你这一句话出去，MM<BR>只会觉得你暴有水准，一眼就能看出是什么设计，其实她们也不知道什么叫公版设计母版<BR>设计的。<BR><BR>　　感情篇<BR><BR>　　1、MM的电脑永远都是最好的<BR><BR>　　MM一般最要面子（当然GG也要，例如老肯），但是找你修电脑总是电脑出了问题，所<BR>以你这个时候一定不能在伤口上散盐，切忌在修电脑的时候说：啊这种配置啊，该升级了<BR>。或者：这种杂牌的显卡最好不要用。或者：AOC的显示器最烂了。表以为这样可以显示你<BR>对硬件市场品牌的了解和个人的品位，这只会让MM恨死你！早期我就犯过类似口不遮拦的<BR>错误，结果有一段时间MM们电脑坏了也不敢来找我，唉，前车之鉴啊！<BR><BR>　　对于MM的电脑，如果牌子好，哪怕是集成主板，也要说这个牌子我最喜欢了，稳定性<BR>超好，这次多半是软件问题，D版毛病就是多！（甭管她机子装的系统是不是正版，用的软<BR>件总有盗版吧）如果牌子不好，立刻说，这个牌子性价比一直就是最好的，你真会过日子<BR>！不要忘记说“你真会过日子”的时候，一定要注视MM面带百分百诚恳的微笑！！！如果<BR>真的什么都不行，就是完全该被淘汰的机子，尽量就不要说话了！！！说什么只会让场面<BR>更难堪！！！<BR><BR>　　把电脑当作MM的脸，你就知道该怎么做了！<BR><BR>　　2、准确把握时间营造相遇空间<BR><BR>　　一般MM让你修电脑，如果答谢的话，一般都是请你吃饭，如果她请你吃饭的规格远远<BR>超过正常修电脑的花费，不妨检查一下电脑是否有人为破坏的因素<BR><BR>　　对于不同的MM，土匪当然是有的求之不得，有的避之不及因而准确控制维修过程的时<BR>间就很重要。这里教初学者一些计算时间的方法：<BR><BR>　　用GHOST装一个XP系统，一般是25分钟左右（如果你很熟练，20分钟内就够了）<BR><BR>　　用自动方式装一个XP系统，大约是1个小时（具体没算过，如果是烂威盛主板，装好驱<BR>动还不止）<BR><BR>　　装一个OFFICE，大约还是要半个小时（这个可以在自定义里中选择，想拖延时间就全<BR>选，大概可以多争取半小时）<BR><BR>　　时间还不到吃饭时间，或者时间到了吃饭时间但是你不想去，都可以通过装软件来慢<BR>慢消耗，实在不行，就卸载了多装几遍！<BR><BR>　　当你长年累月修电脑产生厌烦心理时，推荐使用市面上的高度集成版的XP的GHOST版，<BR>一次把乱七八糟的软件都给装上了，整个时间和装一个XP干净系统也差不多，装完就走人<BR>，又快又省事如果老肯可以到这个境界的话，应该是已经结婚了。<BR><BR>　　3、修理MM电脑的过程也是检查MM人品的过程<BR><BR>　　实际上利用修电脑这一机会来泡MM的土匪，一般平时都是花了较多时间陪着自己的电<BR>脑和网友，没有太多时间和固定场所（例如大学自修室、英语角或者公共社交场所）接触<BR>真实MM的人。很多这方面的高手也都是成功地在修好电脑的同时弥补了自己姻缘的缺憾，<BR>顺利找到另一半！但是并不是所有的相遇都是美满的结局，这除了土匪个人的RPWT，主要<BR>还在于他们在修理电脑的时候没有注意MM们的RPWT。给出一些个人建议：<BR><BR>　　如果MM只会站在一边看着你修，连杯水都不给你倒，除非她年纪太小太不懂事，不然<BR>这样的MM基本不懂关心照顾别人，也不懂尊重别人的劳动和付出。这样的MM若不是超级大<BR>美女，还是算了！<BR><BR>　　如果MM会一直问这问那，特别是如果主要问你为什么要这样修的原因，这种MM不够重<BR>视分工，喜欢主导一切，不能够尊重权威和相信理性，娶回家只会让你多一个唠唠叨叨的<BR>监工。如果你不喜欢被人呼来唤去，没有自疟倾向，这种MM还是算了！<BR><BR>　　如果MM一直问你要不要喝水，要不要歇一会儿，还问一些和修电脑无关的情况，例如<BR>问你这么好的技术都怎么学来的啊，如果殷勤到一反常态的地步，恭喜你！这个MM想泡你<BR>！！！如果这个MM一贯对人热情，那么这种MM属于擅长公关，有很强的管理和组织能力，<BR>这种MM也会成为未来家中的主管，但是好在是一种以人为本的管理，你不至于太痛苦这样<BR>的MM，只要平时不是那种过分往上爬巴结领导的类型，实际上还算不错的选择<BR><BR>　　如果MM话并不多，默默地给你倒杯水，然后再一旁看着，不时跑过来帮你递东西，这<BR>种是贤妻良母型，是那种甘愿在背后默默支持你的类型，你要是事业主导型的土匪，毫不<BR>犹豫泡这个MM吧！！！极品赞不绝口。（就是恐龙也不妨考虑一下）<BR><BR>　　如果MM给你东西吃，证明对你不见外；从来没见过的MM话，证明对你很有好感！小子<BR>，你赚了！<BR><BR>　　MM站着看你修电脑，有座位不坐，离得近的是关心电脑！离得远的还站着，如果不是<BR>眼睛超好的那种，这种MM有同甘共苦的意识，一般富有同情心，比较爱国（自己到时候对<BR>照一下）<BR><BR>　　MM坐着看你修电脑，正常；MM坐着但是不看你，眼光会游移到别的地方或者做自己的<BR>小动作，死了心吧！她已经有意中人了！<BR><BR>　　MM躺着看你修电脑（还真的有！）遇到的都是和我太熟悉的才这样！第一次就这样没<BR>遇到过，真有的话，就是RPWT！！！<BR><BR>　　MM在你修电脑的时候去洗澡了（遇到一次！）这个MM如果不是三天没洗澡，那就是把<BR>你当成家人看待了，我觉得关系很熟这样的话就不算什么；如果第一次就这样，建议逃走<BR>或者躺下！！！<BR><BR>　　MM修电脑的时候把父母介绍给你（到她家修电脑）或者给你看她存在电脑上家人的照<BR>片，她很希望成为你重要的朋友。<BR></P>]]></description>
</item><item>
<title><![CDATA[J2EE 面试题综合]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10156</link>
<author>njucs</author>
<pubDate>2005/11/25 21:46:06</pubDate>
<description><![CDATA[
<DIV class=postText>
<P><FONT size=3>J2EE 面试题综合<BR>/**<BR>&nbsp;* By metaphy 2005-11-12<BR>&nbsp;* Version: 0.01<BR>&nbsp;* 注:题目答案来源于metaphy过去的知识或网络,metaphy不能保证其正确或完整性,仅供参考<BR>*/<BR>[基础问答]<BR>1.下面哪些类可以被继承?<BR>java.lang.Thread&nbsp;(T)<BR>java.lang.Number&nbsp;(T)<BR>java.lang.Double&nbsp;(F)<BR>java.lang.Math&nbsp;&nbsp;(F)<BR>java.lang.Void&nbsp;&nbsp;(F)<BR>java.lang.Class&nbsp;&nbsp;(F)<BR>java.lang.ClassLoader&nbsp;(T)</FONT></P>
<P><FONT size=3>2.抽象类和接口的区别<BR>(1)接口可以被多重implements,抽象类只能被单一extends<BR>(2)接口只有定义,抽象类可以有定义和实现<BR>(3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本包可见)</FONT></P>
<P><FONT size=3>3.Hashtable的原理,并说出HashMap与Hashtable的区别<BR>HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.<BR>HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.</FONT></P>
<P><FONT size=3>4.forward和redirect的区别<BR>forward: an internal transfer in servlet<BR>redirect: 重定向,有2次request,第2次request将丢失第一次的attributs/parameters等</FONT></P>
<P><FONT size=3>5.什么是Web容器?<BR>实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.</FONT></P>
<P><FONT size=3>6.解释下面关于J2EE的名词<BR>(1)JNDI:Java Naming &amp; Directory Interface,JAVA命名目录服务.主要提供的功能是：提供一个目录系统，让其它各地的应用程序在其上面留下自己的索引，从而满足快速查找和定位分布式应用程序的功能.<BR>(2)JMS：Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.<BR>(3)JTA：Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.<BR>(4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.<BR>(5)RMI:Remote Method Interface,远程方法调用</FONT></P>
<P><FONT size=3>7.EJB是基于哪些技术实现的？并说&nbsp;出SessionBean和EntityBean的区别，StatefulBean和StatelessBean的区别.<BR>EJB包括Session Bean、Entity Bean、Message Driven Bean，基于JNDI、RMI、JAT等技术实现.<BR>SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作，例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机，SessionBean是一种非持久性对象，它实现某些在服务器上运行的业务逻辑;EntityBean是一种持久性对象，它代表一个存储在持久性存储器中的实体的对象视图，或是一个由现有企业应用程序实现的实体.<BR>Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean .这两种的 Session Bean都可以将系统逻辑放在 method之中执行，不同的是 Stateful Session Bean 可以记录呼叫者的状态，因此通常来说，一个使用者会有一个相对应的 Stateful Session Bean 的实体.Stateless Session Bean 虽然也是逻辑组件，但是他却不负责记录使用者状态，也就是说当使用者呼叫 Stateless Session Bean 的时候，EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之，很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时，会是同一个 Bean 的 Instance 在执行.从内存方面来看， Stateful Session Bean 与 Stateless Session Bean 比较， Stateful Session Bean 会消耗 J2EE Server 较多的内存，然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态.</FONT></P>
<P><FONT size=3>8.XML的解析方法<BR>Sax,DOM,JDOM</FONT></P>
<P><FONT size=3>9.什么是Web Service?<BR>Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。<BR>Web Service所使用的是Internet上统一、开放的标准，如HTTP、XML、SOAP（简单对象访问协议）、WSDL等，所以Web Service可以在任何支持这些标准的环境（Windows,Linux）中使用。<BR>注：SOAP协议（Simple Object Access Protocal,简单对象访问协议）,它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下，软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性，这有助于大量异构程序和平台之间的互操作性，从而使存在的应用程序能够被广泛的用户访问。</FONT></P>
<P><FONT size=3>优势：<BR>(1).跨平台；<BR>(2).SOAP协议是基于XML和HTTP这些业界的标准的，得到了所有的重要公司的支持。<BR>(3).由于使用了SOAP，数据是以ASCII文本的方式而非二进制传输，调试很方便；并且由于这样，它的数据容易通过防火墙，不需要防火墙为了程序而单独开一个“漏洞”。<BR>(4).此外，WebService实现的技术难度要比CORBA和DCOM小得多。<BR>(5).要实现B2B集成，EDI比较完善与比较复杂；而用WebService则可以低成本的实现，小公司也可以用上。<BR>(6).在C/S的程序中，WebService可以实现网页无整体刷新的与服务器打交道并取数。<BR>缺点：<BR>(1).WebService使用了XML对数据封装，会造成大量的数据要在网络中传输。<BR>(2).WebService规范没有规定任何与实现相关的细节，包括对象模型、编程语言，这一点，它不如CORBA。</FONT></P>
<P><FONT size=3>10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?<BR>答：多线程有两种实现方法，分别是继承Thread类与实现Runnable接口<BR>同步的实现方面有两种，分别是synchronized,wait与notify</FONT></P>
<P><FONT size=3>11.JSP中动态INCLUDE与静态INCLUDE的区别？ <BR>动态INCLUDE用jsp:include动作实现<BR>&lt;jsp:include page="included.jsp" flush="true"/&gt;<BR>它总是会检查所含文件中的变化，适合用于包含动态页面，并且可以带参数<BR>静态INCLUDE用include伪码实现,定不会检查所含文件的变化，适用于包含静态页面<BR>&lt;%@ include file="included.htm" %&gt;<BR>&nbsp;</FONT></P>
<P><BR><FONT size=3>[Java编程与程序运行结果]<BR>1.Java编程,打印昨天的当前时刻<BR>public class YesterdayCurrent{<BR>&nbsp; public void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; Calendar cal = Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp; cal.add(Calendar.DATE, -1);<BR>&nbsp;&nbsp;&nbsp; System.out.println(cal.getTime());<BR>&nbsp; }<BR>}</FONT></P>
<P><FONT size=3>2.文件读写,实现一个计数器<BR>&nbsp; public int getNum(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String stri="";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader in = new BufferedReader(new FileReader(f));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((stri=in.readLine())!=null){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = Integer.parseInt(stri.trim());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void setNum(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = getNum();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(f,false)));&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(String.valueOf(i));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //可能是编码的原因，如果直接写入int的话，将出现java编码和windows编码的混乱，因此此处写入的是String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>3. 指出下面程序的运行结果:<BR>class A{<BR>&nbsp;&nbsp;&nbsp; static{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("1");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public A(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("2");<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>class B extends A{<BR>&nbsp;&nbsp;&nbsp; static{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("a");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public B(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("b");<BR>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <BR>}<BR>public class Hello{<BR>&nbsp;&nbsp;&nbsp; public static void main(String[] ars){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A ab = new B(); //执行到此处,结果: 1a2b<BR>&nbsp;ab = new B();&nbsp;//执行到此处,结果: 1a2bab<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>注:类的static 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造<BR>4.写一个Singleton模式的例子<BR>public class Singleton{<BR>&nbsp;private static Singleton single = new Singleton();<BR>&nbsp;private Singleton(){}<BR>&nbsp;public Singleton getInstance(){<BR>&nbsp;&nbsp;return single;<BR>&nbsp;}<BR>}</FONT></P>
<P><FONT size=3>[数据库]<BR>1.删除表的重复记录<BR>如果记录完全相同才算重复记录,那么:&nbsp; (sql server2000下测试通过)<BR>select distinct * into #tmpp from tid<BR>delete from tid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>insert into tid select * from #tmpp<BR>drop table #tmpp<BR>如果有id主键(数字,自增1的那种),那么:(sql server2000下测试通过)<BR>delete from tableA where id not in<BR>(select id = min(id) from tableA group by name)</FONT></P>
<P><FONT size=3>2.delete from tablea ＆ truncate table tablea的区别<BR>truncate 语句执行速度快,占资源少,并且只记录页删除的日志；<BR>delete 对每条记录的删除均需要记录日志<BR></FONT></P><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=529244</P></DIV>]]></description>
</item><item>
<title><![CDATA[JAVA编程规则]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10155</link>
<author>njucs</author>
<pubDate>2005/11/25 21:45:41</pubDate>
<description><![CDATA[<SPAN style="FONT-WEIGHT: bold">JAVA编程规则:<BR>(1) 类名首字母应该大写。字段、方法以及对象（句柄）的首字母应小写。对于所有标识符，其中包含<BR>&nbsp;&nbsp;&nbsp; 的所有单词都应紧靠在一起，而且大写中间单词的首字母。例如：<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ThisIsAClassName<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;thisIsMethodOrFieldName<BR>&nbsp;&nbsp; 若在定义中出现了常数初始化字符，则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。<BR>&nbsp;&nbsp; Java包（Package）属于一种特殊情况：它们全都是小写字母，即便中间的单词亦是如此。对于域名扩展名称，如com，org，net或者edu等，全部都应小写（这也是Java 1.1和Java 1.2的区别之一）。<BR><BR>(2) 为了常规用途而创建一个类时，请采取“经典形式”，并包含对下述元素的定义：<BR><BR>&nbsp;&nbsp; &nbsp;equals()<BR>&nbsp;&nbsp; &nbsp;hashCode()<BR>&nbsp;&nbsp; &nbsp;toString()<BR>&nbsp;&nbsp; &nbsp;clone()（implement Cloneable）<BR>&nbsp;&nbsp; &nbsp;implement Serializable<BR><BR>(3) 对于自己创建的每一个类，都考虑置入一个main()，其中包含了用于测试那个类的代码。为使用一<BR>&nbsp;&nbsp;&nbsp; 个项目中的类，我们没必要删除测试代码。若进行了任何形式的改动，可方便地返回测试。这些代<BR>&nbsp;&nbsp;&nbsp; 码也可作为如何使用类的一个示例使用。<BR><BR>(4) 应将方法设计成简要的、功能性单元，用它描述和实现一个不连续的类接口部分。理想情况下，方<BR>&nbsp;&nbsp;&nbsp; 法应简明扼要。若长度很大，可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内<BR>&nbsp;&nbsp; 代码的重复使用（有些时候，方法必须非常大，但它们仍应只做同样的一件事情）。<BR><BR>(5) 设计一个类时，请设身处地为客户程序员考虑一下（类的使用方法应该是非常明确的）。然后，再<BR>&nbsp;&nbsp;&nbsp; 设身处地为管理代码的人考虑一下（预计有可能进行哪些形式的修改，想想用什么方法可把它们变<BR>&nbsp;&nbsp;&nbsp; 得更简单）。<BR>(6) 使类尽可能短小精悍，而且只解决一个特定的问题。下面是对类设计的一些建议：<BR>&nbsp;&nbsp;&nbsp; ■一个复杂的开关语句：考虑采用“多形”机制<BR>&nbsp;&nbsp;&nbsp; ■数量众多的方法涉及到类型差别极大的操作：考虑用几个类来分别实现<BR>&nbsp;&nbsp;&nbsp; ■许多成员变量在特征上有很大的差别：考虑使用几个类<BR><BR>(7) 让一切东西都尽可能地“私有”——private。可使库的某一部分“公共化”（一个方法、类或者一<BR>&nbsp;&nbsp;&nbsp; 个字段等等），就永远不能把它拿出。若强行拿出，就可能破坏其他人现有的代码，使他们不得不<BR>&nbsp;&nbsp;&nbsp; 重新编写和设计。若只公布自己必须公布的，就可放心大胆地改变其他任何东西。在多线程环境中，<BR>&nbsp;&nbsp;&nbsp; 隐私是特别重要的一个因素——只有private字段才能在非同步使用的情况下受到保护。<BR><BR>(8) 谨惕“巨大对象综合症”。对一些习惯于顺序编程思维、且初涉OOP领域的新手，往往喜欢先写一个<BR>&nbsp;&nbsp; 顺序执行的程序，再把它嵌入一个或两个巨大的对象里。根据编程原理，对象表达的应该是应用程序<BR>&nbsp;&nbsp; 的概念，而非应用程序本身。<BR><BR>(9) 若不得已进行一些不太雅观的编程，至少应该把那些代码置于一个类的内部。<BR><BR>(10) 任何时候只要发现类与类之间结合得非常紧密，就需要考虑是否采用内部类，从而改善编码及维护<BR>&nbsp;&nbsp;&nbsp; 工作（参见第14章14.1.2小节的“用内部类改进代码”）。<BR><BR>(11) 尽可能细致地加上注释，并用javadoc注释文档语法生成自己的程序文档。<BR><BR>(12) 避免使用“魔术数字”，这些数字很难与代码很好地配合。如以后需要修改它，无疑会成为一场噩<BR>&nbsp;&nbsp;&nbsp;&nbsp; 梦，因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”。所以，我们应<BR>&nbsp;&nbsp;&nbsp; 创建一个常数，并为其使用具有说服力的描述性名称，并在整个程序中都采用常数标识符。这样可<BR>&nbsp;&nbsp;&nbsp; 使程序更易理解以及更易维护。<BR><BR>(13) 涉及构建器和异常的时候，通常希望重新丢弃在构建器中捕获的任何异常——如果它造成了那个对<BR>&nbsp;&nbsp;&nbsp; 象的创建失败。这样一来，调用者就不会以为那个对象已正确地创建，从而盲目地继续。<BR><BR>(14) 当客户程序员用完对象以后，若你的类要求进行任何清除工作，可考虑将清除代码置于一个良好定<BR>&nbsp;&nbsp;&nbsp; 义的方法里，采用类似于cleanup()这样的名字，明确表明自己的用途。除此以外，可在类内放置<BR>&nbsp;&nbsp;&nbsp; 一个boolean（布尔）标记，指出对象是否已被清除。在类的finalize()方法里，请确定对象已被<BR>&nbsp;&nbsp;&nbsp; 清除，并已丢弃了从RuntimeException继承的一个类（如果还没有的话），从而指出一个编程错误。<BR>&nbsp;&nbsp;&nbsp; 在采取象这样的方案之前，请确定finalize()能够在自己的系统中工作（<BR>&nbsp;&nbsp;&nbsp; 可能需要调用System.runFinalizersOnExit(true)，从而确保这一行为）。<BR><BR>(15) 在一个特定的作用域内，若一个对象必须清除（非由垃圾收集机制处理），请采用下述方法：初始<BR>&nbsp;&nbsp;&nbsp; 化对象；若成功，则立即进入一个含有finally从句的try块，开始清除工作。<BR><BR>(16) 若在初始化过程中需要覆盖（取消）finalize()，请记住调用super.finalize()（若Object属于我<BR>&nbsp;&nbsp;&nbsp;&nbsp; 们的直接超类，则无此必要）。在对finalize()进行覆盖的过程中，对super.finalize()的调用应<BR>&nbsp;&nbsp;&nbsp;&nbsp; 属于最后一个行动，而不应是第一个行动，这样可确保在需要基础类组件的时候它们依然有效。<BR><BR>(17) 创建大小固定的对象集合时，请将它们传输至一个数组（若准备从一个方法里返回这个集合，更应<BR>&nbsp;&nbsp;&nbsp;&nbsp; 如此操作）。这样一来，我们就可享受到数组在编译期进行类型检查的好处。此外，为使用它们，<BR>&nbsp;&nbsp;&nbsp;&nbsp; 数组的接收者也许并不需要将对象“造型”到数组里。<BR><BR>(18) 尽量使用interfaces，不要使用abstract类。若已知某样东西准备成为一个基础类，那么第一个选<BR>&nbsp;&nbsp;&nbsp;&nbsp; 择应是将其变成一个interface（接口）。只有在不得不使用方法定义或者成员变量的时候，才需<BR>&nbsp;&nbsp;&nbsp; 要将其变成一个abstract（抽象）类。接口主要描述了客户希望做什么事情，而一个类则致力于<BR>&nbsp;&nbsp; （或允许）具体的实施细节。<BR><BR>(19) 在构建器内部，只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法，因为那<BR>&nbsp;&nbsp; &nbsp;些方法可能被其他人覆盖或取消，从而在构建过程中产生不可预知的结果（参见第7章的详细说<BR>&nbsp;&nbsp; &nbsp;明）。<BR><BR>(20) 对象不应只是简单地容纳一些数据；它们的行为也应得到良好的定义。<BR><BR>(21) 在现成类的基础上创建新类时，请首先选择“新建”或“创作”。只有自己的设计要求必须继承时<BR>&nbsp;&nbsp;&nbsp;&nbsp; ，才应考虑这方面的问题。若在本来允许新建的场合使用了继承，则整个设计会变得没有必要地复<BR>&nbsp;&nbsp; 杂。<BR><BR>(22) 用继承及方法覆盖来表示行为间的差异，而用字段表示状态间的区别。一个非常极端的例子是通过<BR>&nbsp;&nbsp;&nbsp; 对不同类的继承来表示颜色，这是绝对应该避免的：应直接使用一个“颜色”字段。<BR><BR>(23) 为避免编程时遇到麻烦，请保证在自己类路径指到的任何地方，每个名字都仅对应一个类。否则，<BR>&nbsp;&nbsp;&nbsp;&nbsp; 编译器可能先找到同名的另一个类，并报告出错消息。若怀疑自己碰到了类路径问题，请试试在类<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 路径的每一个起点，搜索一下同名的.class文件。<BR><BR>(24) 在Java 1.1 AWT中使用事件“适配器”时，特别容易碰到一个陷阱。若覆盖了某个适配器方法，同<BR>&nbsp;&nbsp;&nbsp; 时拼写方法没有特别讲究，最后的结果就是新添加一个方法，而不是覆盖现成方法。然而，由于这<BR>&nbsp;&nbsp;&nbsp; 样做是完全合法的，所以不会从编译器或运行期系统获得任何出错提示——只不过代码的工作就变<BR>&nbsp;&nbsp;&nbsp; 得不正常了。<BR><BR>(25) 用合理的设计方案消除“伪功能”。也就是说，假若只需要创建类的一个对象，就不要提前限制<BR>&nbsp;&nbsp; 自己使用应用程序，并加上一条“只生成其中一个”注释。请考虑将其封装成一个“独生子”的形式<BR>&nbsp; 。若在主程序里有大量散乱的代码，用于创建自己的对象，请考虑采纳一种创造性的方案，将些代码<BR>&nbsp;&nbsp; 封装起来。<BR><BR>(26) 警惕“分析瘫痪”。请记住，无论如何都要提前了解整个项目的状况，再去考察其中的细节。由于<BR>&nbsp;&nbsp;&nbsp; 把握了全局，可快速认识自己未知的一些因素，防止在考察细节的时候陷入“死逻辑”中。<BR><BR>(27) 警惕“过早优化”。首先让它运行起来，再考虑变得更快——但只有在自己必须这样做、而且经证<BR>&nbsp;&nbsp;&nbsp; 实在某部分代码中的确存在一个性能瓶颈的时候，才应进行优化。除非用专门的工具分析瓶颈，否<BR>&nbsp;&nbsp; 则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解，而且难于维护。<BR><BR>(28) 请记住，阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序，但注释<BR>&nbsp; 、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己，还是对后来的人，它们都是相<BR>&nbsp;&nbsp; 当重要的。如对此仍有怀疑，那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折，<BR>&nbsp;&nbsp; 这样或许能将你说服。<BR><BR>(29) 如认为自己已进行了良好的分析、设计或者实施，那么请稍微更换一下思维角度。试试邀请一些外<BR>&nbsp; 来人士——并不一定是专家，但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的 <BR>&nbsp; 工作，看看是否能找出你一度熟视无睹的问题。采取这种方式，往往能在最适合修改的阶段找出一些<BR>&nbsp; 关键性的问题，避免产品发行后再解决问题而造成的金钱及精力方面的损失。<BR><BR>(30) 良好的设计能带来最大的回报。简言之，对于一个特定的问题，通常会花较长的时间才能找到一种<BR>&nbsp;&nbsp;&nbsp;&nbsp; 最恰当的解决方案。但一旦找到了正确的方法，以后的工作就轻松多了，再也不用经历数小时、数天<BR>&nbsp;&nbsp;&nbsp;&nbsp; 或者数月的痛苦挣扎。我们的努力工作会带来最大的回报（甚至无可估量）。而且由于自己倾注了<BR>&nbsp;&nbsp;&nbsp;&nbsp; 大量心血，最终获得一个出色的设计方案，成功的快感也是令人心动的。坚持抵制草草完工的诱惑<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ——那样做往往得不偿失。<BR><BR>(31) 可在Web上找到大量的编程参考资源，甚至包括大量新闻组、讨论组、邮寄列表等。下面这个地方<BR>&nbsp;&nbsp;&nbsp; 提供了大量有益的链接：<BR><BR>http://www.ulb.ac.be/esp/ip-Links/Java/joodcs/mm-WebBiblio.html<BR><BR></SPAN><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=535970</P>]]></description>
</item><item>
<title><![CDATA[[转] P2P之UDP穿透NAT的原理与实现]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10154</link>
<author>njucs</author>
<pubDate>2005/11/25 21:42:25</pubDate>
<description><![CDATA[
<P>文章说明: </P>
<P>关于UDP穿透NAT的中文资料在网络上是很少的，仅有&lt;<WBR></WBR>&lt;P2P之UDP穿透NAT的原理与实现(shootingsta<WBR></WBR>rs)&gt;&gt;这篇文章有实际的参考价值。本人近两年来也一直从事P2<WBR></WBR>P方面的开发工作，比较有代表性的是个人开发的BitTorren<WBR></WBR>t下载软件 - FlashBT(变态快车). 对P2P下载或者P2P的开发感兴趣的朋友可以访问软件的官方主页<WBR></WBR>: <A onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.hwysoft.com/chs/" target=_blank rel=nofollow>http://www.hwysoft.com/chs/</A> 下载看看，说不定有收获。写这篇文章的主要目的是懒的再每次单独回<WBR></WBR>答一些网友的提问, 一次性写下来, 即节省了自己的时间，也方便了对于P2P的UDP穿透感兴趣的网友<WBR></WBR>阅读和理解。对此有兴趣和经验的朋友可以给我发邮件或者访问我的个<WBR></WBR>人Blog留言: <A onclick="return top.js.OpenExtLink(window,event,this)" href="http://hwycheng.blogchina.com/" target=_blank rel=nofollow>http://hwycheng.blogchina.com</A>. 您可以自由转载此篇文章，但是请保留此说明。 </P>
<P>再次感谢shootingstars网友的早期贡献. 表示谢意。 </P>
<HR>

<P>NAT(The IP Network Address Translator) 的概念和意义是什么? </P>
<P>NAT, 中文翻译为网络地址转换。具体的详细信息可以访问<A title=http://www.faqs.org/rfcs/rfc1631.html onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.faqs.org/rfcs/rfc1631.html" target=_blank>RFC 1631</A> - <A onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.faqs.org/rfcs/rfc1631.html" target=_blank rel=nofollow>http://www.faqs.org/rfcs<WBR></WBR>/rfc1631.html</A>, 这是对于NAT的定义和解释的最权威的描述。网络术语都是很抽象和<WBR></WBR>艰涩的，除非是专业人士，否则很难从字面中来准确理解NAT的含义<WBR></WBR>。 </P>
<P>要想完全明白NAT 的作用，我们必须理解IP地址的两大分类，一类是私有IP地址<WBR></WBR>，在这里我们称作内网IP地址。一类是非私有的IP地址<WBR></WBR>，在这里我们称作公网IP地址。关于IP地址的概念和作用的介绍参<WBR></WBR>见我的另一篇文章: <A onclick="return top.js.OpenExtLink(window,event,this)" href="http://hwycheng.blogchina.com/2402121.html" target=_blank rel=nofollow>
<SCRIPT type=text/javascript>
&lt;!--
D(["mb","http://hwycheng.blogchina.com&lt;WBR&gt;/2402121.html\n&lt;/a&gt; &lt;/p&gt;\n&lt;p&gt;内网IP地址: 是指使用A/B/C类中的私有地址, 分配的IP地址在全球不惧有唯一性，也因此无法被其它外网主机直接&lt;WBR&gt;访问。公网IP地址: 是指具有全球唯一的IP地址，能够直接被其它主机访问的。 &lt;/p&gt;\n&lt;p&gt;NAT 最初的目的是为使用内网IP地址的计算机提供通过少数几台具有公网&lt;WBR&gt;的IP地址的计算机访问外部网络的功能。NAT 负责将某些内网IP地址的计算机向外部网络发出的IP数据包的源I&lt;WBR&gt;P地址转换为NAT自己的公网的IP地址，目的IP地址不变, 并将IP数据包转发给路由器，最终到达外部的计算机&lt;WBR&gt;。同时负责将外部的计算机返回的IP数据包的目的IP地址转换为内&lt;WBR&gt;网的IP地址，源IP地址不变，并最终送达到内网中的计算机。 &lt;/p&gt;\n&lt;p&gt;&lt;br&gt;图一: NAT 实现了私有IP的计算机分享几个公网IP地址访问Internet&lt;WBR&gt;的功能。 &lt;/p&gt;\n&lt;p&gt;随着网络的普及，IPv4的局限性暴露出来。公网IP地址成为一种&lt;WBR&gt;稀缺的资源，此时NAT 的功能局限也暴露出来，同一个公网的IP地址，某个时间只能由一台&lt;WBR&gt;私有IP地址的计算机使用。于是NAPT(The IP Network Address/Port Translator)应运而生，NAPT实现了多台私有IP地址&lt;WBR&gt;的计算机可以同时通过一个公网IP地址来访问Internet的功&lt;WBR&gt;能。这在很大程度上暂时缓解了IPv4地址资源的紧张。 &lt;/p&gt;\n&lt;p&gt;NAPT 负责将某些内网IP地址的计算机向外部网络发出的TCP&lt;WBR&gt;/UDP数据包的源IP地址转换为NAPT自己的公网的IP地址&lt;WBR&gt;，源端口转为NAPT自己的一个端口。目的IP地址和端口不变, 并将IP数据包发给路由器，最终到达外部的计算机&lt;WBR&gt;。同时负责将外部的计算机返回的IP数据包的目的IP地址转换内网&lt;WBR&gt;的IP地址，目的端口转为内网计算机的端口，源IP地址和源端口不&lt;WBR&gt;变，并最终送达到内网中的计算机。 &lt;/p&gt;\n&lt;p&gt;图二: NAPT 实现了私有IP的计算机分享一个公网IP地址访问Internet&lt;WBR&gt;的功能。 &lt;/p&gt;\n&lt;p&gt;在我们的工作和生活中, NAPT的作用随处可见，绝大部分公司的网络架构&lt;WBR&gt;，都是通过1至N台支持NAPT的路由器来实现公司的所有计算机连&lt;WBR&gt;接外部的Internet网络的。包括本人在写这篇文章的时候&lt;WBR&gt;，也是在家中使用一台IBM笔记本通过一台宽带连接的台式机来访问&lt;WBR&gt;Internet的。我们本篇文章主要讨论的NAPT的问题。 &lt;/p&gt;\n&lt;p&gt;NAPT(The IP Network Address/Port Translator) 为何阻碍了P2P软件的应用? &lt;/p&gt;\n&lt;p&gt;通过NAPT 上网的特点决定了只能由NAPT内的计算机主动向NAPT外部的主&lt;WBR&gt;机发起连接，外部的主机想直接和NAPT内的计算机直接建立连接是&lt;WBR&gt;不被允许的。IM(即时通讯)而言，这意味着由于NAPT内的计算&lt;WBR&gt;机和NAPT外的计算机只能通过服务器中转数据来进行通讯&lt;WBR&gt;。对于P2P方式的下载程序而言，意味着NAPT内的计算机不能接&lt;WBR&gt;收到NAPT外部的连接，导致连接数用过少，下载速度很难上去&lt;WBR&gt;。因此P2P软件必须要解决的一个问题就是要能够在一定的程度上解&lt;WBR&gt;决NAPT内的计算机不能被外部连接的问题。 \n&lt;/p&gt;\n&lt;p&gt;NAT(The IP Network Address Translator) 进行UDP穿透的原理是什么? &lt;/p&gt;\n&lt;p&gt;TCP/IP传输时主要用到TCP和UDP协议。TCP协议是可靠&lt;WBR&gt;的，面向连接的传输协议。UDP是不可靠的，无连接的协议&lt;WBR&gt;。根据TCP和UDP协议的实现原理，对于NAPT来进行穿透&lt;WBR&gt;，主要是指的UDP协议。TCP协议也有可能，但是可行性非常小&lt;WBR&gt;，要求更高，我们此处不作讨论，如果感兴趣可以到Google上搜&lt;WBR&gt;索，有些文章对这个问题做了探讨性的描述。下面我们来看看利用UD&lt;WBR&gt;P协议来穿透NAPT的原理是什么: &lt;/p&gt;\n&lt;p&gt;&lt;br&gt;图三: NAPT 是如何将私有IP地址的UDP数据包与公网主机进行透明传输的。 &lt;/p&gt;\n&lt;p&gt;UDP协议包经NAPT透明传输的说明: &lt;/p&gt;\n&lt;p&gt;NAPT为每一个Session分配一个NAPT自己的端口号&lt;WBR&gt;，依据此端口号来判断将收到的公网IP主机返回的TCP&lt;WBR&gt;/IP数据包转发给那台内网IP地址的计算机。在这里Sessio&lt;WBR&gt;n是虚拟的，UDP通讯并不需要建立连接，但是对于NAPT而言&lt;WBR&gt;，的确要有一个Session的概念存在。NAPT对于UDP协议",1]
);

//--&gt;
</SCRIPT>
http://hwycheng.blogchina.com<WBR></WBR>/2402121.html </A></P>
<P>内网IP地址: 是指使用A/B/C类中的私有地址, 分配的IP地址在全球不惧有唯一性，也因此无法被其它外网主机直接<WBR></WBR>访问。公网IP地址: 是指具有全球唯一的IP地址，能够直接被其它主机访问的。 </P>
<P>NAT 最初的目的是为使用内网IP地址的计算机提供通过少数几台具有公网<WBR></WBR>的IP地址的计算机访问外部网络的功能。NAT 负责将某些内网IP地址的计算机向外部网络发出的IP数据包的源I<WBR></WBR>P地址转换为NAT自己的公网的IP地址，目的IP地址不变, 并将IP数据包转发给路由器，最终到达外部的计算机<WBR></WBR>。同时负责将外部的计算机返回的IP数据包的目的IP地址转换为内<WBR></WBR>网的IP地址，源IP地址不变，并最终送达到内网中的计算机。 </P>
<P><BR>图一: NAT 实现了私有IP的计算机分享几个公网IP地址访问Internet<WBR></WBR>的功能。 </P>
<P>随着网络的普及，IPv4的局限性暴露出来。公网IP地址成为一种<WBR></WBR>稀缺的资源，此时NAT 的功能局限也暴露出来，同一个公网的IP地址，某个时间只能由一台<WBR></WBR>私有IP地址的计算机使用。于是NAPT(The IP Network Address/Port Translator)应运而生，NAPT实现了多台私有IP地址<WBR></WBR>的计算机可以同时通过一个公网IP地址来访问Internet的功<WBR></WBR>能。这在很大程度上暂时缓解了IPv4地址资源的紧张。 </P>
<P>NAPT 负责将某些内网IP地址的计算机向外部网络发出的TCP<WBR></WBR>/UDP数据包的源IP地址转换为NAPT自己的公网的IP地址<WBR></WBR>，源端口转为NAPT自己的一个端口。目的IP地址和端口不变, 并将IP数据包发给路由器，最终到达外部的计算机<WBR></WBR>。同时负责将外部的计算机返回的IP数据包的目的IP地址转换内网<WBR></WBR>的IP地址，目的端口转为内网计算机的端口，源IP地址和源端口不<WBR></WBR>变，并最终送达到内网中的计算机。 </P>
<P>图二: NAPT 实现了私有IP的计算机分享一个公网IP地址访问Internet<WBR></WBR>的功能。 </P>
<P>在我们的工作和生活中, NAPT的作用随处可见，绝大部分公司的网络架构<WBR></WBR>，都是通过1至N台支持NAPT的路由器来实现公司的所有计算机连<WBR></WBR>接外部的Internet网络的。包括本人在写这篇文章的时候<WBR></WBR>，也是在家中使用一台IBM笔记本通过一台宽带连接的台式机来访问<WBR></WBR>Internet的。我们本篇文章主要讨论的NAPT的问题。 </P>
<P>NAPT(The IP Network Address/Port Translator) 为何阻碍了P2P软件的应用? </P>
<P>通过NAPT 上网的特点决定了只能由NAPT内的计算机主动向NAPT外部的主<WBR></WBR>机发起连接，外部的主机想直接和NAPT内的计算机直接建立连接是<WBR></WBR>不被允许的。IM(即时通讯)而言，这意味着由于NAPT内的计算<WBR></WBR>机和NAPT外的计算机只能通过服务器中转数据来进行通讯<WBR></WBR>。对于P2P方式的下载程序而言，意味着NAPT内的计算机不能接<WBR></WBR>收到NAPT外部的连接，导致连接数用过少，下载速度很难上去<WBR></WBR>。因此P2P软件必须要解决的一个问题就是要能够在一定的程度上解<WBR></WBR>决NAPT内的计算机不能被外部连接的问题。 </P>
<P>NAT(The IP Network Address Translator) 进行UDP穿透的原理是什么? </P>
<P>TCP/IP传输时主要用到TCP和UDP协议。TCP协议是可靠<WBR></WBR>的，面向连接的传输协议。UDP是不可靠的，无连接的协议<WBR></WBR>。根据TCP和UDP协议的实现原理，对于NAPT来进行穿透<WBR></WBR>，主要是指的UDP协议。TCP协议也有可能，但是可行性非常小<WBR></WBR>，要求更高，我们此处不作讨论，如果感兴趣可以到Google上搜<WBR></WBR>索，有些文章对这个问题做了探讨性的描述。下面我们来看看利用UD<WBR></WBR>P协议来穿透NAPT的原理是什么: </P>
<P><BR>图三: NAPT 是如何将私有IP地址的UDP数据包与公网主机进行透明传输的。 </P>
<P>UDP协议包经NAPT透明传输的说明: </P>
<P>NAPT为每一个Session分配一个NAPT自己的端口号<WBR></WBR>，依据此端口号来判断将收到的公网IP主机返回的TCP<WBR></WBR>/IP数据包转发给那台内网IP地址的计算机。在这里Sessio<WBR></WBR>n是虚拟的，UDP通讯并不需要建立连接，但是对于NAPT而言<WBR></WBR>，的确要有一个Session的概念存在。NAPT对于UDP协议
<SCRIPT type=text/javascript>
&lt;!--
D(["mb","&lt;WBR&gt;包的透明传输面临的一个重要的问题就是如何处理这个虚拟的Sess&lt;WBR&gt;ion。我们都知道TCP连接的Session以SYN包开始&lt;WBR&gt;，以FIN包结束，NAPT可以很容易的获取到TCP Session的生命周期，并进行处理。但是对于UDP而言&lt;WBR&gt;，就麻烦了，NAPT并不知道转发出去的UDP协议包是否到达了目&lt;WBR&gt;的主机，也没有办法知道。而且鉴于UDP协议的特点，可靠很差&lt;WBR&gt;，因此NAPT必须强制维持Session的存在&lt;WBR&gt;，以便等待将外部送回来的数据并转发给曾经发起请求的内网IP地址&lt;WBR&gt;的计算机。NAPT具体如何处理UDP Session的超时呢？不同的厂商提供的设备对于NAPT的实现&lt;WBR&gt;不近相同，也许几分钟，也许几个小时，些NAPT的实现还会根据设&lt;WBR&gt;备的忙碌状态进行智能计算超时时间的长短。 \n&lt;/p&gt;\n&lt;p&gt;&lt;br&gt;图四: NAPT 将内部发出的UDP协议包的源地址和源端口改变传输给公网IP主机&lt;WBR&gt;。 &lt;/p&gt;\n&lt;p&gt;图五: NAPT 将收到的公网IP主机返回的UDP协议包的目的地址和目的端口改变&lt;WBR&gt;传输给内网IP计算机现在我们大概明白了NAPT如何实现内网计算&lt;WBR&gt;机和外网主机间的透明通讯。现在来看一下我们最关心的问题&lt;WBR&gt;，就是NAPT是依据什么策略来判断是否要为一个请求发出的UDP&lt;WBR&gt;数据包建立Session的呢？主要有一下几个策略: &lt;/p&gt;\n&lt;p&gt;A. 源地址(内网IP地址)不同，忽略其它因素, 在NAPT上肯定对应不同的Session B. 源地址(内网IP地址)相同，源端口不同，忽略其它的因素&lt;WBR&gt;，则在NAPT上也肯定对应不同的Session C. 源地址(内网IP地址)相同，源端口相同，目的地址&lt;WBR&gt;(公网IP地址)相同，目的端口不同，则在NAPT上肯定对应同一&lt;WBR&gt;个Session D. 源地址(内网IP地址)相同，源端口相同，目的地址&lt;WBR&gt;(公网IP地址)不同，忽略目的端口，则在NAPT上是如何处理S&lt;WBR&gt;ession的呢？ \n&lt;/p&gt;\n&lt;p&gt;D的情况正式我们关心和要讨论的问题。依据目的地址&lt;WBR&gt;(公网IP地址)对于Session的建立的决定方式我们将NAP&lt;WBR&gt;T设备划分为两大类: &lt;/p&gt;\n&lt;p&gt;Symmetric NAPT: 对于到同一个IP地址，任意端口的连接分配使用同一个Sessio&lt;WBR&gt;n; 对于到不同的IP地址, 任意端口的连接使用不同的Session. 我们称此种NAPT为 Symmetric NAPT. 也就是只要本地绑定的UDP端口相同， 发出的目的IP地址不同，则会建立不同的Session. &lt;/p&gt;\n&lt;p&gt;&lt;br&gt;图六: Symmetric 的英文意思是对称。多个端口对应多个主机，平行的，对称的! &lt;/p&gt;\n&lt;p&gt;Cone NAPT: 对于到同一个IP地址，任意端口的连接分配使用同一个Sessio&lt;WBR&gt;n; 对于到不同的IP地址，任意端口的连接也使用同一个Session&lt;WBR&gt;. 我们称此种NAPT为 Cone NAPT. 也就是只要本地绑定的UDP端口相同， 发出的目的地址不管是否相同， 都使用同一个Session. &lt;/p&gt;\n&lt;p&gt;&lt;br&gt;图七: Cone 的英文意思是锥。一个端口对应多个主机，是不是像个锥子? &lt;/p&gt;\n&lt;p&gt;现在绝大多数的NAPT属于后者，即Cone NAT。本人在测试的过程中，只好使用了一台日本的Symmetr&lt;WBR&gt;ic NAT。还好不是自己的买的，我从不买日货, 希望看这篇文章的朋友也自觉的不要购买日本的东西。Win9x&lt;WBR&gt;/2K/XP/2003系统自带的NAPT也是属于 Cone NAT的。这是值的庆幸的，因为我们要做的UDP穿透只能在Con&lt;WBR&gt;e NAT间进行，只要有一台不是Cone NAT，对不起，UDP穿透没有希望了，服务器转发吧&lt;WBR&gt;。后面会做详细分析! \n&lt;/p&gt;\n&lt;p&gt;下面我们再来分析一下NAPT 工作时的一些数据结构，在这里我们将真正说明UDP可以穿透Con&lt;WBR&gt;e NAT的依据。这里描述的数据结构只是为了说明原理&lt;WBR&gt;，不具有实际参考价值，真正感兴趣可以阅读Linux的中关于NA&lt;WBR&gt;T实现部分的源码。真正的NAT实现也没有利用数据库的，呵呵&lt;WBR&gt;，为了速度！ &lt;/p&gt;\n&lt;p&gt;Symmetric NAPT 工作时的端口映射数据结构如下: &lt;/p&gt;\n&lt;p&gt;内网信息表: &lt;/p&gt;\n&lt;p&gt;[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ 外网IP地址 ] [ SessionTime 开始时间 ] &lt;/p&gt;\n&lt;p&gt;PRIMARY KEY( [NAPT 分配端口] ) -&amp;gt; 表示依据[NAPT 分配端口]建立主键，必须唯一且建立索引，加快查找. UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -&amp;gt; 表示这两个字段联合起来不能重复. UNIQUE( [ 内网IP地址 ], [ 内网端口 ], [ 外网IP地址 ] ) -&amp;gt; 表示这三个字段联合起来不能重复. ",1]
);

//--&gt;
</SCRIPT>
 <WBR></WBR>包的透明传输面临的一个重要的问题就是如何处理这个虚拟的Sess<WBR></WBR>ion。我们都知道TCP连接的Session以SYN包开始<WBR></WBR>，以FIN包结束，NAPT可以很容易的获取到TCP Session的生命周期，并进行处理。但是对于UDP而言<WBR></WBR>，就麻烦了，NAPT并不知道转发出去的UDP协议包是否到达了目<WBR></WBR>的主机，也没有办法知道。而且鉴于UDP协议的特点，可靠很差<WBR></WBR>，因此NAPT必须强制维持Session的存在<WBR></WBR>，以便等待将外部送回来的数据并转发给曾经发起请求的内网IP地址<WBR></WBR>的计算机。NAPT具体如何处理UDP Session的超时呢？不同的厂商提供的设备对于NAPT的实现<WBR></WBR>不近相同，也许几分钟，也许几个小时，些NAPT的实现还会根据设<WBR></WBR>备的忙碌状态进行智能计算超时时间的长短。 </P>
<P><BR>图四: NAPT 将内部发出的UDP协议包的源地址和源端口改变传输给公网IP主机<WBR></WBR>。 </P>
<P>图五: NAPT 将收到的公网IP主机返回的UDP协议包的目的地址和目的端口改变<WBR></WBR>传输给内网IP计算机现在我们大概明白了NAPT如何实现内网计算<WBR></WBR>机和外网主机间的透明通讯。现在来看一下我们最关心的问题<WBR></WBR>，就是NAPT是依据什么策略来判断是否要为一个请求发出的UDP<WBR></WBR>数据包建立Session的呢？主要有一下几个策略: </P>
<P>A. 源地址(内网IP地址)不同，忽略其它因素, 在NAPT上肯定对应不同的Session B. 源地址(内网IP地址)相同，源端口不同，忽略其它的因素<WBR></WBR>，则在NAPT上也肯定对应不同的Session C. 源地址(内网IP地址)相同，源端口相同，目的地址<WBR></WBR>(公网IP地址)相同，目的端口不同，则在NAPT上肯定对应同一<WBR></WBR>个Session D. 源地址(内网IP地址)相同，源端口相同，目的地址<WBR></WBR>(公网IP地址)不同，忽略目的端口，则在NAPT上是如何处理S<WBR></WBR>ession的呢？ </P>
<P>D的情况正式我们关心和要讨论的问题。依据目的地址<WBR></WBR>(公网IP地址)对于Session的建立的决定方式我们将NAP<WBR></WBR>T设备划分为两大类: </P>
<P>Symmetric NAPT: 对于到同一个IP地址，任意端口的连接分配使用同一个Sessio<WBR></WBR>n; 对于到不同的IP地址, 任意端口的连接使用不同的Session. 我们称此种NAPT为 Symmetric NAPT. 也就是只要本地绑定的UDP端口相同， 发出的目的IP地址不同，则会建立不同的Session. </P>
<P><BR>图六: Symmetric 的英文意思是对称。多个端口对应多个主机，平行的，对称的! </P>
<P>Cone NAPT: 对于到同一个IP地址，任意端口的连接分配使用同一个Sessio<WBR></WBR>n; 对于到不同的IP地址，任意端口的连接也使用同一个Session<WBR></WBR>. 我们称此种NAPT为 Cone NAPT. 也就是只要本地绑定的UDP端口相同， 发出的目的地址不管是否相同， 都使用同一个Session. </P>
<P><BR>图七: Cone 的英文意思是锥。一个端口对应多个主机，是不是像个锥子? </P>
<P>现在绝大多数的NAPT属于后者，即Cone NAT。本人在测试的过程中，只好使用了一台日本的Symmetr<WBR></WBR>ic NAT。还好不是自己的买的，我从不买日货, 希望看这篇文章的朋友也自觉的不要购买日本的东西。Win9x<WBR></WBR>/2K/XP/2003系统自带的NAPT也是属于 Cone NAT的。这是值的庆幸的，因为我们要做的UDP穿透只能在Con<WBR></WBR>e NAT间进行，只要有一台不是Cone NAT，对不起，UDP穿透没有希望了，服务器转发吧<WBR></WBR>。后面会做详细分析! </P>
<P>下面我们再来分析一下NAPT 工作时的一些数据结构，在这里我们将真正说明UDP可以穿透Con<WBR></WBR>e NAT的依据。这里描述的数据结构只是为了说明原理<WBR></WBR>，不具有实际参考价值，真正感兴趣可以阅读Linux的中关于NA<WBR></WBR>T实现部分的源码。真正的NAT实现也没有利用数据库的，呵呵<WBR></WBR>，为了速度！ </P>
<P>Symmetric NAPT 工作时的端口映射数据结构如下: </P>
<P>内网信息表: </P>
<P>[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ 外网IP地址 ] [ SessionTime 开始时间 ] </P>
<P>PRIMARY KEY( [NAPT 分配端口] ) -&gt; 表示依据[NAPT 分配端口]建立主键，必须唯一且建立索引，加快查找. UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -&gt; 表示这两个字段联合起来不能重复. UNIQUE( [ 内网IP地址 ], [ 内网端口 ], [ 外网IP地址 ] ) -&gt; 表示这三个字段联合起来不能重复.
<SCRIPT type=text/javascript>
&lt;!--
D(["mb","&lt;/p&gt;\n&lt;p&gt;映射表: &lt;/p&gt;\n&lt;p&gt;[NAPT 分配端口] [ 外网端口 ] &lt;/p&gt;\n&lt;p&gt;UNIQUE( [NAPT 分配端口], [ 外网端口 ] ) -&amp;gt; 表示这两个字段联合起来不能重复. &lt;/p&gt;\n&lt;p&gt;Cone NAPT 工作时的端口映射数据结构如下: &lt;/p&gt;\n&lt;p&gt;内网信息表: &lt;/p&gt;\n&lt;p&gt;[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ SessionTime 开始时间 ] &lt;/p&gt;\n&lt;p&gt;PRIMARY KEY( [NAPT 分配端口] ) -&amp;gt; 表示依据[NAPT 分配端口]建立主键，必须唯一且建立索引，加快查找. UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -&amp;gt; 表示这两个字段联合起来不能重复. &lt;/p&gt;\n&lt;p&gt;外网信息表: &lt;/p&gt;\n&lt;p&gt;[ wid 主键标识 ] [ 外网IP地址 ] [ 外网端口 ] &lt;/p&gt;\n&lt;p&gt;PRIMARY KEY( [ wid 主键标识 ] ) -&amp;gt; 表示依据[ wid 主键标识 ]建立主键，必须唯一且建立索引，加快查找. UNIQUE( [ 外网IP地址 ], [ 外网端口 ] ) -&amp;gt; 表示这两个字段联合起来不能重复. &lt;/p&gt;\n&lt;p&gt;映射表: 实现一对多，的 &lt;/p&gt;\n&lt;p&gt;[NAPT 分配端口] [ wid 主键标识 ] &lt;/p&gt;\n&lt;p&gt;UNIQUE( [NAPT 分配端口], [ wid 主键标识 ] ) -&amp;gt; 表示这两个字段联合起来不能重复. UNIQUE( [ wid 主键标识 ] ) -&amp;gt; 标识此字段不能重复. &lt;/p&gt;\n&lt;p&gt;看完了上面的数据结构是更明白了还是更晕了？ 呵呵! 多想一会儿就会明白了。通过NAT,内网计算机计算机向外连结是很&lt;WBR&gt;容易的，NAPT会自动处理，我们的应用程序根本不必关心它是如何&lt;WBR&gt;处理的。那么外部的计算机想访问内网中的计算机如何实现呢&lt;WBR&gt;？我们来看一下下面的流程： &lt;/p&gt;\n&lt;p&gt;c 是一台在NAPT后面的内网计算机，s是一台有外网IP地址的计算&lt;WBR&gt;机。c 主动向 s 发起连接请求，NAPT依据上面描述的规则在自己的数据结构中记录&lt;WBR&gt;下来，建立一个Session. 然后 c 和 s 之间就可以实现双向的透明的数据传输了。如下面所示: &lt;/p&gt;&lt;pre&gt;  c[&lt;a href=\"http://192.168.0.6:1827\" target=\"_blank\" onclick=\"return top.js.OpenExtLink(window,event,this)\"&gt;192.168.0.6:1827&lt;/a&gt;] &amp;lt;-&amp;gt; [priv ip: &lt;a href=\"http://192.168.0.1\" target=\"_blank\" onclick=\"return top.js.OpenExtLink(window,event,this)\"&gt;\n192.168.0.1&lt;/a&gt;]NAPT[pub ip: &lt;a href=\"http://61.51.99.86:9881\" target=\"_blank\" onclick=\"return top.js.OpenExtLink(window,event,this)\"&gt;61.51.99.86:9881&lt;/a&gt;] &amp;lt;-&amp;gt; s[&lt;a href=\"http://61.51.76.102:8098\" target=\"_blank\" onclick=\"return top.js.OpenExtLink(window,event,this)\"&gt;61.51.76.102:8098&lt;/a&gt;]\n&lt;/pre&gt;\n&lt;p&gt;由此可见，一台外网IP地址的计算机想和NAPT后面的内网计算机&lt;WBR&gt;通讯的条件就是要求NAPT后面的内网计算机主动向外网IP地址的&lt;WBR&gt;计算机发起一个UDP数据包。外网IP地址的计算机利用收到的UD&lt;WBR&gt;P数据包获取到NAPT的外网IP地址和映射的端口&lt;WBR&gt;，以后就可以和内网IP的计算机透明的进行通讯了。 &lt;/p&gt;\n&lt;p&gt;现在我们再来分析一下我们最关心的两个NAPT后面的内网计算机如&lt;WBR&gt;何实现直接通讯呢? 两者都无法主动发出连接请求，谁也不知道对方的NAPT的公网IP&lt;WBR&gt;地址和NAPT上面映射的端口号。所以我们要靠一个公网IP地址的&lt;WBR&gt;服务器帮助两者来建立连接。当两个NAPT后面的内网计算机分别连&lt;WBR&gt;接了公网IP地址的服务器后，服务器可以从收到的UDP数据包中获&lt;WBR&gt;取到这两个NAPT设备的公网IP地址和这两个连接建立的Sess&lt;WBR&gt;ion的映射端口。两个内网计算机可以从服务器上获取到对方的NA&lt;WBR&gt;PT设备公网IP地址和映射的端口了。 \n&lt;/p&gt;\n&lt;p&gt;我们假设两个内网计算机分别为A和B，对应的NAPT分别为AN和",1]
);

//--&gt;
</SCRIPT>
 </P>
<P>映射表: </P>
<P>[NAPT 分配端口] [ 外网端口 ] </P>
<P>UNIQUE( [NAPT 分配端口], [ 外网端口 ] ) -&gt; 表示这两个字段联合起来不能重复. </P>
<P>Cone NAPT 工作时的端口映射数据结构如下: </P>
<P>内网信息表: </P>
<P>[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ SessionTime 开始时间 ] </P>
<P>PRIMARY KEY( [NAPT 分配端口] ) -&gt; 表示依据[NAPT 分配端口]建立主键，必须唯一且建立索引，加快查找. UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -&gt; 表示这两个字段联合起来不能重复. </P>
<P>外网信息表: </P>
<P>[ wid 主键标识 ] [ 外网IP地址 ] [ 外网端口 ] </P>
<P>PRIMARY KEY( [ wid 主键标识 ] ) -&gt; 表示依据[ wid 主键标识 ]建立主键，必须唯一且建立索引，加快查找. UNIQUE( [ 外网IP地址 ], [ 外网端口 ] ) -&gt; 表示这两个字段联合起来不能重复. </P>
<P>映射表: 实现一对多，的 </P>
<P>[NAPT 分配端口] [ wid 主键标识 ] </P>
<P>UNIQUE( [NAPT 分配端口], [ wid 主键标识 ] ) -&gt; 表示这两个字段联合起来不能重复. UNIQUE( [ wid 主键标识 ] ) -&gt; 标识此字段不能重复. </P>
<P>看完了上面的数据结构是更明白了还是更晕了？ 呵呵! 多想一会儿就会明白了。通过NAT,内网计算机计算机向外连结是很<WBR></WBR>容易的，NAPT会自动处理，我们的应用程序根本不必关心它是如何<WBR></WBR>处理的。那么外部的计算机想访问内网中的计算机如何实现呢<WBR></WBR>？我们来看一下下面的流程： </P>
<P>c 是一台在NAPT后面的内网计算机，s是一台有外网IP地址的计算<WBR></WBR>机。c 主动向 s 发起连接请求，NAPT依据上面描述的规则在自己的数据结构中记录<WBR></WBR>下来，建立一个Session. 然后 c 和 s 之间就可以实现双向的透明的数据传输了。如下面所示: </P><PRE>  c[<A onclick="return top.js.OpenExtLink(window,event,this)" href="http://192.168.0.6:1827/" target=_blank>192.168.0.6:1827</A>] &lt;-&gt; [priv ip: <A onclick="return top.js.OpenExtLink(window,event,this)" href="http://192.168.0.1/" target=_blank>
192.168.0.1</A>]NAPT[pub ip: <A onclick="return top.js.OpenExtLink(window,event,this)" href="http://61.51.99.86:9881/" target=_blank>61.51.99.86:9881</A>] &lt;-&gt; s[<A onclick="return top.js.OpenExtLink(window,event,this)" href="http://61.51.76.102:8098/" target=_blank>61.51.76.102:8098</A>]
</PRE>
<P>由此可见，一台外网IP地址的计算机想和NAPT后面的内网计算机<WBR></WBR>通讯的条件就是要求NAPT后面的内网计算机主动向外网IP地址的<WBR></WBR>计算机发起一个UDP数据包。外网IP地址的计算机利用收到的UD<WBR></WBR>P数据包获取到NAPT的外网IP地址和映射的端口<WBR></WBR>，以后就可以和内网IP的计算机透明的进行通讯了。 </P>
<P>现在我们再来分析一下我们最关心的两个NAPT后面的内网计算机如<WBR></WBR>何实现直接通讯呢? 两者都无法主动发出连接请求，谁也不知道对方的NAPT的公网IP<WBR></WBR>地址和NAPT上面映射的端口号。所以我们要靠一个公网IP地址的<WBR></WBR>服务器帮助两者来建立连接。当两个NAPT后面的内网计算机分别连<WBR></WBR>接了公网IP地址的服务器后，服务器可以从收到的UDP数据包中获<WBR></WBR>取到这两个NAPT设备的公网IP地址和这两个连接建立的Sess<WBR></WBR>ion的映射端口。两个内网计算机可以从服务器上获取到对方的NA<WBR></WBR>PT设备公网IP地址和映射的端口了。 </P>
<P>我们假设两个内网计算机分别为A和B，对应的NAPT分别为AN和
<SCRIPT type=text/javascript>
&lt;!--
D(["mb","&lt;WBR&gt;BN， 如果A在获取到B对应的BN的IP地址和映射的端口后&lt;WBR&gt;，迫不急待的向这个IP 地址和映射的端口发送了个UDP数据包，会有什么情况发生呢&lt;WBR&gt;？依据上面的原理和数据结构我们会知道，AN会在自己的数据结构中&lt;WBR&gt;生成一条记录，标识一个新Session的存在。BN在收到数据包&lt;WBR&gt;后，从自己的数据结构中查询，没有找到相关记录，因此将包丢弃&lt;WBR&gt;。B是个慢性子，此时才慢吞吞的向着AN的IP地址和映射的端口发&lt;WBR&gt;送了一个UDP数据包，结果如何呢？当然是我们期望的结构了&lt;WBR&gt;，AN在收到数据包后，从自己的数据结构中查找到了记录&lt;WBR&gt;，所以将数据包进行处理发送给了A。A 再次向B发送数据包时，一切都时畅通无阻了。OK, 大工告成！且慢，这时对于Cone NAPT而言，对于Symmetric NAPT呢？呵呵，自己分析一下吧... \n&lt;/p&gt;\n&lt;p&gt;NAPT(The IP Network Address/Port Translator) 进行UDP穿透的具体情况分析! &lt;/p&gt;\n&lt;p&gt;首先明确的将NAPT设备按照上面的说明分为: Symmetric NAPT 和 Cone NAPT, Cone NAPT 是我们需要的。Win9x/2K/XP/2003 自带的NAPT也为Cone NAPT。 &lt;/p&gt;\n&lt;p&gt;第一种情况, 双方都是Symmetric NAPT: &lt;/p&gt;\n&lt;p&gt;此情况应给不存在什么问题，肯定是不支持UDP穿透。 &lt;/p&gt;\n&lt;p&gt;第二种情况, 双方都是Cone NAPT: &lt;/p&gt;\n&lt;p&gt;此情况是我们需要的，可以进行UDP穿透。 &lt;/p&gt;\n&lt;p&gt;第三种情况, 一个是Symmetric NAPT, 一个是Cone NAPT: &lt;/p&gt;\n&lt;p&gt;此情况比较复杂，但我们按照上面的描述和数据机构进行一下分析也很&lt;WBR&gt;容易就会明白了, 分析如下, &lt;/p&gt;\n&lt;p&gt;假设: A -&amp;gt; Symmetric NAT, B -&amp;gt; Cone NAT &lt;/p&gt;\n&lt;p&gt;1. A 想连接 B, A 从服务器那儿获取到 B 的NAT地址和映射端口, A 通知服务器，服务器告知 B A的NAT地址和映射端口, B 向 A 发起连接，A 肯定无法接收到。此时 A 向 B 发起连接， A 对应的NAT建立了一个新的Session，分配了一个新的映射端&lt;WBR&gt;口， B 的 NAT 接收到UDP包后，在自己的映射表中查询，无法找到映射项&lt;WBR&gt;，因此将包丢弃了。 &lt;/p&gt;\n&lt;p&gt;2. B 想连接 A, B 从服务器那儿获取到 A 的NAT地址和映射端口, B 通知服务器, 服务器告知 A B的NAT地址和映射端口,A 向 B 发起连接, A 对应的NAT建立了一个新的Session，分配了一个新的映射端&lt;WBR&gt;口B肯定无法接收到。此时 B 向 A 发起连接, 由于 B 无法获取 A 建立的新的Session的映射端口，仍是使用服务器上获取的映射&lt;WBR&gt;端口进行连接， 因此 A 的NAT在接收到UDP包后，在自己的映射表中查询&lt;WBR&gt;，无法找到映射项, 因此将包丢弃了。 \n&lt;/p&gt;\n&lt;p&gt;根据以上分析，只有当连接的两端的NAT都为Cone NAT的情况下，才能进行UDP的内网穿透互联。 &lt;/p&gt;\n&lt;p&gt;&lt;br&gt;NAPT(The IP Network Address/Port Translator) 进行UDP穿透如何进行现实的验证和分析! &lt;/p&gt;\n&lt;p&gt;需要的网络结构如下: &lt;/p&gt;\n&lt;p&gt;三个NAT后面的内网机器，两个外网服务器。其中两台Cone NAPT，一台 Symmetric NAPT。 &lt;/p&gt;\n&lt;p&gt;验证方法: &lt;/p&gt;\n&lt;p&gt;可以使用本程序提供的源码，编译，然后分别运行服务器程序和客户端&lt;WBR&gt;。修改过后的源码增加了客户端之间直接通过IP地址和端口发送消息&lt;WBR&gt;的命令，利用此命令，你可以手动的验证NAPT的穿透情况&lt;WBR&gt;。为了方便操作，推荐你使用一个远程登陆软件，可以直接在一台机器&lt;WBR&gt;上操作所有的相关的计算机，这样很方便，一个人就可以完成所有的工&lt;WBR&gt;作了。呵呵，本人就是这么完成的。欢迎有兴趣和经验的朋友来信批评&lt;WBR&gt;指正，共同进步。 &lt;/p&gt;\n&lt;div&gt;取自&amp;quot;&lt;a href=\"http://wiki.bitcomet.com/help-zh/P2P%E4%B9%8BUDP%E7%A9%BF%E9%80%8FNAT%E7%9A%84%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E7%8E%B0--%E5%A2%9E%E5%BC%BA%E7%AF%87%28%E9%99%84%E6%BA%90%E4%BB%A3%E7%A0%81%29\" target=\"_blank\" onclick=\"return top.js.OpenExtLink(window,event,this)\"&gt;",1]
);

//--&gt;
</SCRIPT>
 <WBR></WBR>BN， 如果A在获取到B对应的BN的IP地址和映射的端口后<WBR></WBR>，迫不急待的向这个IP 地址和映射的端口发送了个UDP数据包，会有什么情况发生呢<WBR></WBR>？依据上面的原理和数据结构我们会知道，AN会在自己的数据结构中<WBR></WBR>生成一条记录，标识一个新Session的存在。BN在收到数据包<WBR></WBR>后，从自己的数据结构中查询，没有找到相关记录，因此将包丢弃<WBR></WBR>。B是个慢性子，此时才慢吞吞的向着AN的IP地址和映射的端口发<WBR></WBR>送了一个UDP数据包，结果如何呢？当然是我们期望的结构了<WBR></WBR>，AN在收到数据包后，从自己的数据结构中查找到了记录<WBR></WBR>，所以将数据包进行处理发送给了A。A 再次向B发送数据包时，一切都时畅通无阻了。OK, 大工告成！且慢，这时对于Cone NAPT而言，对于Symmetric NAPT呢？呵呵，自己分析一下吧... </P>
<P>NAPT(The IP Network Address/Port Translator) 进行UDP穿透的具体情况分析! </P>
<P>首先明确的将NAPT设备按照上面的说明分为: Symmetric NAPT 和 Cone NAPT, Cone NAPT 是我们需要的。Win9x/2K/XP/2003 自带的NAPT也为Cone NAPT。 </P>
<P>第一种情况, 双方都是Symmetric NAPT: </P>
<P>此情况应给不存在什么问题，肯定是不支持UDP穿透。 </P>
<P>第二种情况, 双方都是Cone NAPT: </P>
<P>此情况是我们需要的，可以进行UDP穿透。 </P>
<P>第三种情况, 一个是Symmetric NAPT, 一个是Cone NAPT: </P>
<P>此情况比较复杂，但我们按照上面的描述和数据机构进行一下分析也很<WBR></WBR>容易就会明白了, 分析如下, </P>
<P>假设: A -&gt; Symmetric NAT, B -&gt; Cone NAT </P>
<P>1. A 想连接 B, A 从服务器那儿获取到 B 的NAT地址和映射端口, A 通知服务器，服务器告知 B A的NAT地址和映射端口, B 向 A 发起连接，A 肯定无法接收到。此时 A 向 B 发起连接， A 对应的NAT建立了一个新的Session，分配了一个新的映射端<WBR></WBR>口， B 的 NAT 接收到UDP包后，在自己的映射表中查询，无法找到映射项<WBR></WBR>，因此将包丢弃了。 </P>
<P>2. B 想连接 A, B 从服务器那儿获取到 A 的NAT地址和映射端口, B 通知服务器, 服务器告知 A B的NAT地址和映射端口,A 向 B 发起连接, A 对应的NAT建立了一个新的Session，分配了一个新的映射端<WBR></WBR>口B肯定无法接收到。此时 B 向 A 发起连接, 由于 B 无法获取 A 建立的新的Session的映射端口，仍是使用服务器上获取的映射<WBR></WBR>端口进行连接， 因此 A 的NAT在接收到UDP包后，在自己的映射表中查询<WBR></WBR>，无法找到映射项, 因此将包丢弃了。 </P>
<P>根据以上分析，只有当连接的两端的NAT都为Cone NAT的情况下，才能进行UDP的内网穿透互联。 </P>
<P><BR>NAPT(The IP Network Address/Port Translator) 进行UDP穿透如何进行现实的验证和分析! </P>
<P>需要的网络结构如下: </P>
<P>三个NAT后面的内网机器，两个外网服务器。其中两台Cone NAPT，一台 Symmetric NAPT。 </P>
<P>验证方法: </P>
<P>可以使用本程序提供的源码，编译，然后分别运行服务器程序和客户端<WBR></WBR>。修改过后的源码增加了客户端之间直接通过IP地址和端口发送消息<WBR></WBR>的命令，利用此命令，你可以手动的验证NAPT的穿透情况<WBR></WBR>。为了方便操作，推荐你使用一个远程登陆软件，可以直接在一台机器<WBR></WBR>上操作所有的相关的计算机，这样很方便，一个人就可以完成所有的工<WBR></WBR>作了。呵呵，本人就是这么完成的。欢迎有兴趣和经验的朋友来信批评<WBR></WBR>指正，共同进步。</P><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=525238</P>]]></description>
</item><item>
<title><![CDATA[[转]词法分析器]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10153</link>
<author>njucs</author>
<pubDate>2005/11/25 21:40:20</pubDate>
<description><![CDATA[
<P>/*****************************C_minus词法分析器 1.0版 *********************************<BR>*　　作者：温铭<BR>*　　Email: <A href="mailto:moonbingbing@gmail.com">moonbingbing@gmail.com</A><BR>*　　版权所有(C) 2005.11<BR>***************************************************************************************/<BR>#include&lt;stdio.h&gt;<BR>#include&lt;ctype.h&gt;<BR>#include&lt;stdlib.h&gt;<BR>#include&lt;string.h&gt;</P>
<P>//****************************************<BR>char * change(char *ps,char *pt);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //处理路径中的反斜杠问题。因为在字符串中要用\\表示\ <BR>int&nbsp; searchkey(char *word,struct key tab[],int n);//二分法查找关键字<BR>int&nbsp; searchsymbol(char c,struct symbol tab[],int n);<BR>void getword(int c,FILE * p);<BR>//****************************************<BR>//用到的结构数组：<BR>struct&nbsp; key{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关键字表<BR>&nbsp;&nbsp;&nbsp; char*&nbsp;&nbsp; word;<BR>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; value;<BR>}keytab[] = {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "else",&nbsp; 0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "if",&nbsp;&nbsp;&nbsp; 1,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "int",&nbsp;&nbsp; 2,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "return",3,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "void",&nbsp; 4,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "while", 5,<BR>};<BR>//****<BR>struct&nbsp;&nbsp; symbol{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //符号表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char&nbsp; c;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; value;<BR>}symboltab[] = {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '(', 0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ')', 1,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '*', 2,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '+', 3,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ',', 4,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '-', 5,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '/', 6,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ';', 7,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&lt;', 8,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '=', 9,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&gt;', 10,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '[', 11,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ']', 12,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '{', 13,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '}', 14,<BR>};<BR>//*****************************************</P>
<P>//用到的常量<BR>enum{MAX = 50,<BR>&nbsp;&nbsp;&nbsp;&nbsp; NKEYS = sizeof keytab / sizeof keytab[0],<BR>&nbsp;&nbsp;&nbsp;&nbsp; NSYMBOL = sizeof symboltab / sizeof symboltab[0]<BR>};<BR>//*****************************************</P>
<P>//用到的全局变量<BR>int flagnum = 0;&nbsp; //用来防止出现10t这种情况被当作数字处理。这种情况程序报错<BR>int countnum = 0;<BR>int countid&nbsp; = 0;<BR>int countfault = 0;<BR>int type[] = {0,1,2,3,4};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //词法分析中的类型&nbsp; 依次为 关键字，数字，id，符号<BR>char array[MAX];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //存放getword中的字符串</P>
<P><BR>//*****************************************</P>
<P></P>
<P>main()<BR>{<BR>&nbsp;int c;<BR>&nbsp;int flag;&nbsp;&nbsp;&nbsp;&nbsp; //判断搜索函数是否成功返回<BR>&nbsp;&nbsp;&nbsp; char s[MAX];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //数组s，t用来存放读取文件的路径<BR>&nbsp;char t[2 * MAX];<BR>&nbsp;char *ps = s;<BR>&nbsp;char *pt = t;<BR>&nbsp;&nbsp;&nbsp; FILE * p = NULL;</P>
<P>&nbsp;&nbsp;&nbsp; printf("input the path of the file\n");<BR>&nbsp;scanf("%s",s);<BR>&nbsp;&nbsp;&nbsp; p = fopen( change(ps,pt),"r" );&nbsp;&nbsp;&nbsp;&nbsp; //打开文件<BR>&nbsp;&nbsp;&nbsp; if( p == NULL ){&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; printf("open fail!\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(0);<BR>&nbsp;&nbsp;&nbsp; }&nbsp; <BR>&nbsp;printf("data \t (type,value)\n");<BR>&nbsp;&nbsp;&nbsp; while( ( c = fgetc(p) ) != EOF ){<BR>&nbsp;&nbsp;if ( isspace(c) )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是空白字符<BR>&nbsp;&nbsp;&nbsp;continue;<BR>&nbsp;&nbsp;else if ( isalpha(c) ){<BR>&nbsp;&nbsp;&nbsp; getword(c,p);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = searchkey(array,keytab,NKEYS);<BR>&nbsp;&nbsp;&nbsp; if ( flag &gt;= 0 )&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; printf("%s\t(%d,%d)\n",array,type[0],flag);<BR>&nbsp;&nbsp;&nbsp; else{&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;&nbsp;&nbsp;&nbsp; //如果以字母开头，但不是关键字<BR>&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\t(%d,%d)\n",array,type[2],countid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; countid ++;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;}else if ( isdigit(c) ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果是数字<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flagnum = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*解决getword中的一个bug。如果一个数字之前有超过1个的字符串，如in 2。则后面所有的数字都不能被正确分析*/</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; getword(c,p);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if ( flagnum == 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\t(%d,%d)\n",array,type[1],countnum);<BR>&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\t(%d,%d)\t illegal input \n",array,type[4],countfault);<BR>&nbsp;&nbsp;}else if ( ispunct(c) ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果是符号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = searchsymbol(c,symboltab,NSYMBOL);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if ( flag &gt;= 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%c\t(%d,%d)\n",c,type[3],flag);<BR>&nbsp;&nbsp;&nbsp;&nbsp; else{<BR>&nbsp;&nbsp;&nbsp;&nbsp; printf("%c\t(%d,%d)\n",c,type[4],countfault);&nbsp; //出错处理<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; countfault ++;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp;printf("%c\t(%d,%d)\n",c,type[4],countfault);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //出错处理<BR>&nbsp;&nbsp;&nbsp;countfault ++;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;return 0;<BR>}</P>
<P><BR>//*******************************************<BR>char * change(char *ps,char *pt)&nbsp;&nbsp;&nbsp;&nbsp; /*处理反斜杠的问题*/<BR>{<BR>&nbsp;char *p = pt;<BR>&nbsp;char c;</P>
<P>&nbsp;while( (c = *pt++ = *ps++) != '\0' )<BR>&nbsp;&nbsp;if( c == '\\' )<BR>&nbsp;&nbsp;&nbsp;*pt = '\\';<BR>&nbsp;return p;<BR>}</P>
<P>//******************************************<BR>int&nbsp; searchkey(char *word,struct key tab[],int n)<BR>{<BR>&nbsp;int cond;<BR>&nbsp;int low,high,mid;</P>
<P>&nbsp;low = 0;<BR>&nbsp;high = n -1;<BR>&nbsp;while ( low &lt;= high ){<BR>&nbsp;&nbsp;mid = (low +high) / 2;<BR>&nbsp;&nbsp;if ( ( cond = strcmp(word,tab[mid].word) ) &lt; 0 )<BR>&nbsp;&nbsp;&nbsp;high = mid - 1;<BR>&nbsp;&nbsp;else if ( cond &gt; 0 )<BR>&nbsp;&nbsp;&nbsp;low = mid + 1;<BR>&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;return mid;<BR>&nbsp;}<BR>&nbsp;return -1;<BR>}</P>
<P>//**********************************************<BR>int&nbsp; searchsymbol(char c,struct symbol tab[],int n)<BR>{<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; int low,high,mid;</P>
<P>&nbsp;&nbsp;&nbsp; low = 0;<BR>&nbsp;high = n -1;<BR>&nbsp;while ( low &lt;= high ){<BR>&nbsp;&nbsp;mid = (low +high) / 2;<BR>&nbsp;&nbsp;if ( c &lt; tab[mid].c)<BR>&nbsp;&nbsp;&nbsp;high = mid - 1;<BR>&nbsp;&nbsp;else if(c &gt; tab[mid].c)<BR>&nbsp;&nbsp;&nbsp;low = mid + 1;<BR>&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;return mid;<BR>&nbsp;}<BR>&nbsp;return -1;<BR>}<BR>//*******************************************<BR>void getword(int c,FILE * p)<BR>{<BR>&nbsp;int i = 0;<BR>&nbsp;array[i] = c;<BR>&nbsp;while( (c = fgetc(p)) != ' ' &amp;&amp; c != '\n'){<BR>&nbsp;&nbsp;if ( isalpha(c) | ispunct(c) )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果数字中有字母或字符，则报错<BR>&nbsp;&nbsp;&nbsp;flagnum = 1;&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;&nbsp;&nbsp;&nbsp;&nbsp;/*一个可能引起错误的地方。已经解决（在读入数字后，把flagnum置0，再进入getword）*/<BR>&nbsp;&nbsp;array[++i] = c;<BR>&nbsp;}<BR>&nbsp;array[++i] = '\0';<BR>}</P>
<P></P><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=526675</P>]]></description>
</item><item>
<title><![CDATA[文件加密技术]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10152</link>
<author>njucs</author>
<pubDate>2005/11/25 21:34:41</pubDate>
<description><![CDATA[<P>
<TABLE style="WIDTH: 525pt; mso-cellspacing: 0cm; mso-padding-alt: 0cm 0cm 0cm 0cm" height=918 cellSpacing=0 cellPadding=0 width=700 border=0>
<TBODY>
<TR style="HEIGHT: 109.5pt">
<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; WIDTH: 629.25pt; PADDING-TOP: 0cm; HEIGHT: 109.5pt" vAlign=top width=839>
<TABLE style="WIDTH: 100%; mso-cellspacing: 0cm; mso-padding-alt: 0cm 0cm 0cm 0cm" height=138 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR style="HEIGHT: 31.5pt">
<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm; HEIGHT: 31.5pt">
<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 18pt">文件加密技术</SPAN></P></TD></TR>
<TR style="HEIGHT: 44.25pt">
<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm; HEIGHT: 44.25pt">
<P class=MsoNormal>给文件加密的技术很多<SPAN lang=EN-US>,其中又分为不同等级,以适合不同场合的需要.这里给出最简单的文件加密技术,即采用文件逐字节与密码异或方式对文件进行加密,当解密时,只需再运行一遍加密程序即可.编一个实例程序,能对任意一个文件进行加密,密码要求用户输入,限8位以内(当然你可以再更改).程序要有很好的容错设计。</SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal><SPAN lang=EN-US>
<P></P></SPAN>
<P></P></TD></TR>
<TR style="HEIGHT: 459pt">
<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; WIDTH: 629.25pt; PADDING-TOP: 0cm; HEIGHT: 459pt" width=839>
<P><SPAN lang=EN-US>#include&lt;stdio.h&gt;<BR>#include&lt;stdlib.h&gt;<BR>#include&lt;conio.h&gt;<BR>#include&lt;string.h&gt;</SPAN></P>
<P><SPAN lang=EN-US>void dofile(char *in_fname,char *pwd,char *out_fname);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*对文件进行加密的具体函数*/</SPAN></P>
<P><SPAN lang=EN-US>void main(int argc,char *argv[])</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*定义main()函数的命令行参数*/</SPAN><SPAN lang=EN-US><BR>{<BR>char in_fname[30];</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*用户输入的要加密的文件名*/</SPAN><SPAN lang=EN-US><BR>char out_fname[30];<BR>char pwd[8];</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*用来保存密码*/</SPAN></P>
<P><SPAN lang=EN-US>if(argc!=4){</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*容错处理*/</SPAN><SPAN lang=EN-US><BR>printf("\nIn-fname:\n");<BR>gets(in_fname);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*得到要加密的文件名*/</SPAN></P>
<P><SPAN lang=EN-US>printf("Password:\n");<BR>gets(pwd);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*得到密码*/</SPAN></P>
<P><SPAN lang=EN-US>printf("Out-file:\n");<BR>gets(out_fname);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*得到加密后你要的文件名*/</SPAN></P>
<P><SPAN lang=EN-US>dofile(in_fname,pwd,out_fname);<BR>}<BR>else{</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*如果命令行参数正确,便直接运行程序*/</SPAN><SPAN lang=EN-US><BR>strcpy(in_fname,argv[1]);<BR>strcpy(pwd,argv[2]);<BR>strcpy(out_fname,argv[3]);<BR>dofile(in_fname,pwd,out_fname);<BR>}</SPAN></P>
<P><SPAN lang=EN-US>}</SPAN></P>
<P><SPAN lang=EN-US><BR></SPAN><SPAN lang=EN-US style="COLOR: #009900">/*加密子函数开始*/</SPAN><SPAN lang=EN-US><BR>void dofile(char *in_fname,char *pwd,char *out_file)<BR>{<BR>FILE *fp1,*fp2;<BR>register char ch;<BR>int j=0;<BR>int j0=0;</SPAN></P>
<P><SPAN lang=EN-US>fp1=fopen(in_fname,"rb");<BR>if(fp1==NULL){<BR>printf("cannot open in-file.\n");<BR>exit(1);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*如果不能打开要加密的文件,便退出程序*/</SPAN><SPAN lang=EN-US><BR>}<BR>fp2=fopen(out_file,"wb");<BR>if(fp2==NULL){<BR>printf("cannot open or create out-file.\n");<BR>exit(1);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*如果不能建立加密后的文件,便退出*/</SPAN><SPAN lang=EN-US><BR>}<BR>while(pwd[++j0]);<BR>ch=fgetc(fp1);</SPAN></P>
<P><SPAN lang=EN-US style="COLOR: #009900">/*加密算法开始*/</SPAN><SPAN lang=EN-US><BR>while(!feof(fp1)){<BR>fputc(ch^pwd[j&gt;=j0?j=0:j++],fp2);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*异或后写入fp2文件*/</SPAN><SPAN lang=EN-US><BR>ch=fgetc(fp1);<BR>}<BR>fclose(fp1);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*关闭源文件*/</SPAN><SPAN lang=EN-US><BR>fclose(fp2);</SPAN><SPAN lang=EN-US style="COLOR: #009900">/*关闭目标文件*/</SPAN><SPAN lang=EN-US><BR>}</SPAN></P></TD></TR></TBODY></TABLE><BR><BR></P>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=519218</P>]]></description>
</item><item>
<title><![CDATA[一个让人发狂的PI求解C程序]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10151</link>
<author>njucs</author>
<pubDate>2005/11/25 21:33:43</pubDate>
<description><![CDATA[
<P align=center><FONT color=#0000ff size=3>一个让人发狂的PI求解C程序</FONT></P>
<P><FONT color=#3366ff>作者： 张桂权</FONT></P>
<P>long a=10000, b, c=2800, d, e, f[2801], g;</P>
<P>main{ for(;b-c;) f[b++]=a/5;<BR>for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)<BR>for(b=c; d+=f[b]*a, f[b]=d%--g, d/=g--, --b; d*=b); scanf("%s");}</P>
<P>简短的4行代码，就可以精确计算机出800位的PI（圆周率）值。<BR>实在太震撼人心了。这样的程序也能运行，竟然还能能完成这样让人难以置信的任务，真是太神了。<BR>真让人百思不知其解了。不知道它是采用了哪一个级数公式，收敛速度如此之快？在《程序员》第十一期中还专门提供了这个程序源码。喜欢挑战的朋友请来试一试哦？</P>
<P>这是某一年The International Obfuscated C Code Contest（国际模糊C代码大赛）上的获奖作品（努力了，但是没有找到一个确切的时间）。这是属于C大师的盛会，因为这是一件极具挑战的活儿。</P>
<P>这是Linux/Unix/... 下的版本，需要更改才能在Windows平台上运行。</P>
<P><BR>The International Obfuscated C Code Contest 的目标是：</P>
<P>在以下几条规则的前提下，编写晦涩难懂的（模糊的、混乱的）C程序。<BR>1、通过一种讽刺的手段，来说明编程风格的重要性；<BR>2、用怪异的代码来调试C编译器；<BR>3、举例说明一些C语言的薄弱或精明之处；<BR>4、为脆弱的C代码提供一个安全的讨论会。</P>
<P>Goals of the Contest</P>
<P>Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. <BR>b. To darken. 2. To confuse: his emotions obfuscated his judgment. <BR>[LLat. obfuscare, to darken : ob(intensive) + Lat. fuscare,<BR>to darken &lt; fuscus, dark.] -obfuscation n. obfuscatory adj</P>
<P><BR>To write the most Obscure/Obfuscated C program under the rules below. <BR>To show the importance of programming style, in an ironic way. <BR>To stress C compilers with unusual code. <BR>To illustrate some of the subtleties of the C language. <BR>To provide a safe forum for poor C code. :-) </P>
<P>请访问下面的官方网站，如果希望了解更多的相关信息。</P>
<P><A href="http://www.ioccc.org/">http://www.ioccc.org/</A><BR><A href="http://www.au.ioccc.org/">http://www.au.ioccc.org/</A></P>
<P>Pi to one MILLION decimal places</P>
<P><A href="http://3.141592653589793238462643383279502884197169399375105820974944592.com/">http://3.141592653589793238462643383279502884197169399375105820974944592.com/</A></P>
<P>二、 以下是另一个版本的程序。一样晦涩难懂。（1988年）</P>
<P>Here's another good one: </P>
<P>/*<BR>&nbsp;* Program to compute an approximation of pi<BR>&nbsp;* by Brian Westley, 1988<BR>&nbsp;* (requires pcc macro concatenation; try gcc -traditional-cpp)<BR>&nbsp;*/</P>
<P>#define _ -F&lt;00||--F-OO--;<BR>int F=00,OO=00;<BR>main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _-_-_-_<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _-_-_-_-_-_-_-_-_<BR>&nbsp;&nbsp;&nbsp; _-_-_-_-_-_-_-_-_-_-_-_<BR>&nbsp; _-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>&nbsp;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>&nbsp;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>&nbsp;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>&nbsp;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>&nbsp; _-_-_-_-_-_-_-_-_-_-_-_-_-_<BR>&nbsp;&nbsp;&nbsp; _-_-_-_-_-_-_-_-_-_-_-_<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _-_-_-_-_-_-_-_<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _-_-_-_<BR>}</P>
<P><A href="http://www.comedia.com/hot/jargon-4.2.3/html/entry/Obfuscated-C-Contest.html">http://www.comedia.com/hot/jargon-4.2.3/html/entry/Obfuscated-C-Contest.html</A></P>
<P>这个程序更有意思了，可惜我还不明白其中的原理。希望大家讨论一下，谢谢 ！</P>]]></description>
</item><item>
<title><![CDATA[[转]直线生成算法之DDA]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10150</link>
<author>njucs</author>
<pubDate>2005/11/25 21:24:24</pubDate>
<description><![CDATA[
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: black"><FONT face="Times New Roman">[</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图形学</SPAN><SPAN lang=EN-US style="COLOR: black"><FONT face="Times New Roman">]</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">直线生成算法之</SPAN><SPAN lang=EN-US style="COLOR: black"><FONT face="Times New Roman">DDA 
<P></P></FONT></SPAN></B></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>DDA</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">称为数值微分画线算法，是直线生成算法中最简单的一种。原理相当简单，就是最直观的根据斜率的偏移程度，决定是以</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">x</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为步进方向还是以</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">y</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为步进方向。然后在相应的步进方向上，步进变量每次增加一个像素，而另一个相关坐标变量则为</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Yk_1=Yk+m</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（以</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">x</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为步进变量为例，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">m</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为斜率）</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个程序对于我的意义在于：可以在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">VC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中利用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">GDI</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的画点函数</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">---<SPAN style="mso-tab-count: 1">&nbsp; </SPAN>SetPixel</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现它，终于可以告别</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">C</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言绘图还用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">TC</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时代，呵呵</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">~~~</FONT></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>void DDALine(float x1,float y1,float x2,float y2,int color,HDC hdc) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>float m; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>float dx,dy; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>float x,y; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>x1=(int)(x1+0.5); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>y1=(int)(y1+0.5); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>x=x1; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>y=y1; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>dx=x2-x1; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>dy=y2-y1; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if(fabs(dx)&gt;=fabs(dy)) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>m=dy/dx; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>else 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>m=dx/dy; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>while(x&lt;=x2) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SetPixel(hdc,x,y,color); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if(fabs(dx)&gt;=dy) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>y=y+m; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>x++; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>else 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>x=x+m; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>y++; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US style="COLOR: black"><FONT face="Times New Roman">VC</FONT></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的实现</SPAN><SPAN lang=EN-US style="COLOR: black"><FONT face="Times New Roman">: 
<P></P></FONT></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>#include "GraphAlgorithm.h" 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>#include&lt;windows.h&gt; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>#include &lt;stdlib.h&gt; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>#include &lt;string.h&gt; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>#include &lt;stdio.h&gt; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>BOOL InitWindowsClass(HINSTANCE hInstance); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>BOOL InitWindows(HINSTANCE hInstance,int nCmdShow); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>HWND hWndMain; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>//program starting. 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>MSG<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>msg; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if(!InitWindowsClass(hInstance)) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return FALSE; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if(!InitWindows(hInstance,nCmdShow)) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return FALSE; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>//Core message looping 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>while(GetMessage(&amp;msg,NULL,0,0)) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TranslateMessage(&amp;msg); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>DispatchMessage(&amp;msg); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return msg.wParam; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>//main wndProc function: message looping 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>HDC hDC; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>HBRUSH hBrush; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>HPEN hPen; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>PAINTSTRUCT PtStr; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>switch(iMessage) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>case WM_PAINT: 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>//First draw,a black line 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>hDC=BeginPaint(hWnd,&amp;PtStr); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>hPen=(HPEN)GetStockObject(NULL_PEN);//get empty brush 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SelectObject(hDC,hPen); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SelectObject(hDC,hBrush); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));//create pen 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SelectObject(hDC,hPen); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman"><FONT size=3><SPAN lang=EN-US style="COLOR: blue"><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US style="COLOR: red">DDALine(0,0,200,200,1,hDC); 
<P></P></SPAN></FONT></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>DeleteObject(hPen); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>DeleteObject(hBrush); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>EndPaint(hWnd,&amp;PtStr); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return 0; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>case WM_DESTROY: 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>PostQuitMessage(0); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return 0; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>default: 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return DefWindowProc(hWnd,iMessage,wParam,lParam); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>//Init the Window to show out. 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>HWND hWnd; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>hWnd=CreateWindow("WinFill", 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><SPAN style="mso-tab-count: 4">&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; </SPAN>"</FONT></SPAN><SPAN style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图形绘制算法示例程序</SPAN><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman">", 
<P></P></FONT></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 5">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WS_OVERLAPPEDWINDOW, 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>CW_USEDEFAULT, 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>0, 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>CW_USEDEFAULT, 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>0, 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>NULL,<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>NULL, 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>hInstance, 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 4">&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; </SPAN>NULL<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if(!hWnd) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return FALSE; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>hWndMain=hWnd; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>ShowWindow(hWnd,nCmdShow); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>UpdateWindow(hWnd); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return TRUE; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>//Set wndClass Propertity 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>BOOL InitWindowsClass(HINSTANCE hInstance) 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>{ 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WNDCLASS wndClass; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue">
<P><FONT face="Times New Roman" size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.cbClsExtra=0; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.cbWndExtra=0; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.hCursor=LoadCursor(NULL,IDC_ARROW); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.hIcon=LoadIcon(NULL,"END"); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.hInstance=hInstance; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.lpfnWndProc=WndProc; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.lpszClassName="WinFill"; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.lpszMenuName=NULL; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>wndClass.style=CS_HREDRAW|CS_VREDRAW; 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return RegisterClass(&amp;wndClass); 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: blue"><FONT face="Times New Roman"><FONT size=3>} 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US style="COLOR: blue"><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过测试表明,当斜率较大时,如3以上,出现了些小锯齿.</FONT></SPAN></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US style="COLOR: blue"><SPAN style="mso-tab-count: 1"></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;继续前进</SPAN><SPAN lang=EN-US style="COLOR: black"><FONT face="Times New Roman">!!! 
<P></P></FONT></SPAN></FONT>
<P></P><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=531093</P>]]></description>
</item><item>
<title><![CDATA[[转]利用内核对象----互斥量实现应用程序只运行一个实例]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10149</link>
<author>njucs</author>
<pubDate>2005/11/25 21:23:17</pubDate>
<description><![CDATA[#include &lt;windows.h&gt;<BR>int main(int argc, char* argv[])<BR>{<BR>HANDLE h=CreateMutex(NULL,&nbsp;FALSE,"QI_HONGLIANG_210");<BR>&nbsp;if(GetLastError()==ERROR_ALREADY_EXISTS)<BR>&nbsp;{<BR>&nbsp;&nbsp;printf("There exist a app aleadly");<BR>&nbsp;&nbsp;getchar();<BR>&nbsp;&nbsp;return (0);<BR>&nbsp;}<BR>&nbsp;printf("Hello World!\n");<BR>&nbsp;getchar();<BR>&nbsp;return 0;<BR>}]]></description>
</item><item>
<title><![CDATA[[转]如何正确的计算文件收发进度]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10148</link>
<author>njucs</author>
<pubDate>2005/11/25 21:22:31</pubDate>
<description><![CDATA[
<DIV class=postText>
<P>学习Winsock编程，用TCP协议收发文件是必不可少的一个实践环节，而计算收发百分比的一行代码，很多人都写不对。</P>
<P>假设我们用DWORD（unsigned long）来表示文件长度，则长度的最大值是2<SUP>32</SUP>－1，也就是4GB。虽然Win32 API能够返回两个DWORD表示长度，但是为了简便，我们还是原意接收4GB的人为限制。以下我们的讨论基于这个前提。</P>
<P>通常我们会使用一个DWORD表示length，一个DWORD表示pos。为了避免使用浮点数，很多人会这样写</P>
<P>DWORD percent = pos * 100 / length;</P>
<P>之所以把100乘在前面，是因为这个除法是整数除法，不这样的话，percent将永远是0。这样以来，pos*100便有了一个限制，它不能溢出，也就是不能大于2<SUP>32</SUP>－1。这样，如果我们传送大于4GB/100＝40MB的文件，这个percent就会计算错误。</P>
<P>显然不能先做乘法，但还要不使用浮点运算，怎么写才对呢？</P>
<P>DWORD percent = 0;</P>
<P>if (pos &gt; 0) percent = 100 / (length / pos);</P>
<P>开始我以为这样写是很好的办法，结果试一试就知道25%-&gt;33%-&gt;50%-&gt;100%，分别是分母为4，3，2，1的结果，这也不是正确的写法。</P>
<P>看来，不加长字长是没什么好办法了。好在windows支持8字节大整数运算，所以这样写是对的：</P>
<P>DWORD percent = (DWORD)((ULONGLONG)pos * 100 / length);</P>
<P>两次转型，不过也确实没什么别的办法，如果没有8字节整数，与其自己写还真不如用浮点运算得了。</P><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=495909</P></DIV>]]></description>
</item><item>
<title><![CDATA[双机调试VC程序]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10147</link>
<author>njucs</author>
<pubDate>2005/11/25 21:21:22</pubDate>
<description><![CDATA[
<DIV class=postText>
<DIV>
<P class=a14>对VC进行程序调试时，除了常规的单机调试方式外, 也可以双机调试，即一台计算机作为主机，显示调试器窗口，而另一台计算机作为客户机，显示被调试程序的输出值。在VC里称这种方式为远程调试，但这种调 
<TABLE style="MARGIN: 10px 7px 3px 4px" cellSpacing=0 cellPadding=0 align=left border=0>
<TBODY>
<TR>
<TD>
<SCRIPT language=JavaScript1.1 src="http://ad.ccw.com.cn/adshow.asp?positionID=38&amp;js=1&amp;innerJs=1" type=text/javascript>

</SCRIPT>
</TD></TR></TBODY></TABLE>试方法与常规方法有少许不同，需要进行必要的设置。步骤如下: </P>
<P class=a14>1．配置主机 先将两个计算机通过网络链接起来，并从Build菜单中选择“Debugger Remote Connection”，以显示“Remote Connection”对话框。接着选择TCP\IP作为客户机的连接类型，然后单击“Remote Connection”对话框的Settings按钮，并在接着出现的“Target machine name or address”中输入客户机的IP地址或主机名，并在“Debug monitor password”中输入密码。 </P>
<P class=a14>2．配置客户机 拷贝文件MSVCMON.EXE、 MSVCRT.DLL、 TLN0T.DLL、 DM.DLL、MSVCP6O.DLL、MSDIS110.DLL到客户机的Windows文件夹中，如果被调试程序在Windows NT下运行，还需要拷贝PSAPI.DLL文件，这些文件将协助调试器的远程监视器程序的工作。接下来在客户机上运行Msvcmon.exe，当VC的“Debug Monitor”对话框出现时，单击Settings按钮，并在“Target machine name or address”中输入主机的IP地址或主机名，在“Debug monitor password”中键入与主机相同的密码，单击OK按钮退出对话框。 </P>
<P class=a14>3．开始调试 首先在主机上把要调试的程序所在的目录共享出来，以便客户机能够看到所调试的程序。然后在主机上打开被调试的程序，单击Project菜单中的Settings按钮，在Project Settings对话框的Debug选项卡中标有“Remote Executable Path And File Name”的文本框中指定程序路径。在这个文本框中输入程序路径，作为Msvcmon.exe从客户机上进行查看的程序路径，如:\\tartge\pvc\debug\text.exe，其中“target”为主机名，“pvc\debug\text.exe”为客户机得到的执行程序的路径。然后在客户机上运行Msvcmon.exe启动调试监视器程序，当VC DebugMonitor对话框出现时，单击Connect按钮，等待主机启动调试程序。 </P>
<P class=a14>接下来就可以在主机上开始调试程序了，以下步骤与在单台机器上调试相同。</P></DIV><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=502902</P></DIV>]]></description>
</item><item>
<title><![CDATA[[转]分治法优化大整数乘法 C++实现]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10146</link>
<author>njucs</author>
<pubDate>2005/11/25 21:17:29</pubDate>
<description><![CDATA[<P>上大学算法分析实验课的内容.关于利用分治法大整数乘法.还没有解决大整数的存储方式,应该是要利用一维数组来解决.所以目前只是5位数的运算没有问题.程序不是很健全,但是算法的核心部分应该是已经都在这里了.</P>
<P>VC++6.0下测试通过.</P>
<P>#include &lt;iostream.h&gt;<BR>#include &lt;math.h&gt;</P>
<P>long mult(long x,long y,int n);<BR>int num(long x);</P>
<P>void main() <FONT color=#003300>//主函数<BR></FONT>{<BR>&nbsp;long x,y;<BR>&nbsp;cout&lt;&lt;"input x and y:"&lt;&lt;endl;<BR>&nbsp;cin&gt;&gt;x&gt;&gt;y;<BR>&nbsp;cout&lt;&lt;mult(x,y,num(x))&lt;&lt;endl;<BR>}</P>
<P>long mult(long x,long y,int n)<BR>{<BR>&nbsp;long a,b,c,d,s;<BR>&nbsp;if (n=1)<BR>&nbsp;&nbsp;return x*y;<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp;&nbsp;a=long(x/pow(10,(n/2))); <FONT color=#003300>//取x的左半部分<BR></FONT>&nbsp;&nbsp;b=long(x%long(pow(10,(n/2)))); <FONT color=#003300>//取x的右半部分</FONT><BR>&nbsp;&nbsp;c=long(y/pow(10,(n/2))); <FONT color=#003300>//取y的左半部分</FONT><BR>&nbsp;&nbsp;d=long(y%long(pow(10,(n/2)))); <FONT color=#003300>//取y的右半部分</FONT><BR>&nbsp;&nbsp;s=mult(a,c,n)*pow(2,n)+(mult((a-b),(d-c),n)+mult(a,c,n)+mult(b,d,n))*pow(2,n/2)+mult(b,d,n); <FONT color=#003300>//书上的公式</FONT><BR>&nbsp;&nbsp;return (s);<BR>&nbsp;}<BR>}</P>
<P>int num(long x) //判断输入的数字的位数<BR>{<BR>&nbsp;int i=0;<BR>&nbsp;if(x-9&lt;=0)<BR>&nbsp;&nbsp;return 1;<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp;&nbsp;while (x!=0)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;i++;<BR>&nbsp;&nbsp;&nbsp;x=x/10;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return i;<BR>&nbsp;}<BR>}</P>
<P><BR><BR>&nbsp;</P>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=505113</P>]]></description>
</item><item>
<title><![CDATA[浮点数值的内存结构]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10145</link>
<author>njucs</author>
<pubDate>2005/11/25 21:16:32</pubDate>
<description><![CDATA[
<DIV class=postText>所有的C/C++编译器都是按照IEEE（国际电子电器工程师协会）制定的IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法，用<FONT color=#ff0000>符号</FONT>（正或负）、<FONT color=#ff0000>指数</FONT>和<FONT color=#ff0000>尾数</FONT>来表示，底数被确定为2，也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的规格: 
<TABLE cellPadding=4 border=2>
<TBODY>
<TR>
<TH></TH>
<TH>符号位</TH>
<TH>指数位</TH>
<TH>小数部分</TH>
<TH>
<P></P>
<P>指数偏移量</P></TH></TR>
<TR>
<TH>单精度浮点数</TH>
<TD align=middle>1 位[31]</TD>
<TD align=middle>8位 [30-23]</TD>
<TD align=middle>23位 [22-00]</TD>
<TD align=middle>127</TD></TR>
<TR>
<TH>双精度浮点数</TH>
<TD align=middle>1 位[63]</TD>
<TD align=middle>11 位[62-52]</TD>
<TD align=middle>52 位[51-00]</TD>
<TD align=middle>1023</TD></TR></TBODY></TABLE>
<P>我们以单精度浮点数来说明：<BR>指数是8位，可表达的范围是0到255<BR>而对应的实际的指数是－127到＋128<BR>这里特殊说明，－127和＋128这两个数据在IEEE当中是保留的用作多种用途的<BR>－127表示的数字是0<BR>128和其他位数组合表示多种意义，最典型的就是NAN状态<BR></P>
<P>从存储结构和算法上来讲，double和float是一样的，不一样的地方仅仅是float是32位的，double是64位的，所以double能存储更高的精度</P>
<P>任何数据在内存中都是以二进制（1或着0）顺序存储的，每一个1或着0被称为1位，而在x86CPU上一个字节是8位。比如一个16位（2字节）的short int型变量的值是1156，那么它的二进制表达就是：00000100 10000100。由于Intel CPU的架构是Little Endian（请参数机算机原理相关知识），所以它是按字节倒序存储的，那么就因该是这样：10000100 00000100，这就是定点数1156在内存中的结构.</P>
<P></P>
<P>我们先不考虑逆序存储的问题，先按照顺序的来讲，最后再把他们翻过来就行了。</P>
<P>现在让我们按照IEEE浮点数表示法，一步步的将float型浮点数12345.0f转换为十六进制代码。在处理这种不带小数的浮点数时，直接将整数部转化为二进制表示：1 11100010 01000000也可以这样表示：11110001001000000.0然后将小数点向左移，一直移到离最高位只有1位，就是最高位的1：1.11100010010000000一共移动了16位，在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1，所以原数就等于这样：1.11100010010000000 * ( 2 ^ 16 )好了，现在我们要的尾数和指数都出来了。显而易见，最高位永远是1，因为你不可能把买了16个鸡蛋说成是买了0016个鸡蛋吧？（呵呵，可别拿你买的臭鸡蛋甩我~），所以这个1我们还有必要保留他吗？（众：没有！）好的，我们删掉他。这样尾数的二进制就变成了：11100010010000000最后在尾数的后面补0，一直到补够23位：11100010010000000000000（MD，这些个0差点没把我数的背过气去~）</P>
<P></P>
<P>再回来看指数，一共8位，可以表示范围是0 - 255的无符号整数，也可以表示-128 - 127的有符号整数。但因为指数是可以为负的，所以为了统一把十进制的整数化为二进制时，都先加上127，在这里，我们的16加上127后就变成了143，二进制表示为：10001111<BR>12345.0f这个数是正的，所以符号位是0，那么我们按照前面讲的格式把它拼起来：<BR>0 10001111 11100010010000000000000<BR>01000111 11110001 00100000 00000000<BR>再转化为16进制为：47 F1 20 00，最后把它翻过来，就成了：00 20 F1 47。</P>
<P>有了上面的基础后，下面我再举一个带小数的例子来看一下为什么会出现精度问题。<BR>按照IEEE浮点数表示法，将float型浮点数123.456f转换为十六进制代码。对于这种带小数的就需要把整数部和小数部分开处理。整数部直接化二进制：100100011。小数部的处理比较麻烦一些，也不太好讲，可能反着讲效果好一点，比如有一个十进制纯小数0.57826，那么5是十分位，位阶是1/10；7是百分位，位阶是1/100；8是千分位，位阶是1/1000……，这些位阶分母的关系是10^1、10^2、10^3……，现假设每一位的序列是{S1、S2、S3、……、Sn}，在这里就是5、7、8、2、6，而这个纯小数就可以这样表示：n = S1 * ( 1 / ( 10 ^ 1 ) ) + S2 * ( 1 / ( 10 ^ 2 ) ) + S3 * ( 1 / ( 10 ^ 3 ) ) + …… + Sn * ( 1 / ( 10 ^ n ) )。把这个公式推广到b进制纯小数中就是这样：<BR>n = S1 * ( 1 / ( b ^ 1 ) ) + S2 * ( 1 / ( b ^ 2 ) ) + S3 * ( 1 / ( b ^ 3 ) ) + …… + Sn * ( 1 / ( b ^ n ) )</P>
<P>天哪，可恶的数学，我怎么快成了数学老师了！没办法，为了广大编程爱好者的切身利益，喝口水继续！现在一个二进制纯小数比如0.100101011就应该比较好理解了，这个数的位阶序列就因该是1/(2^1)、1/(2^2)、1/(2^3)、1/(2^4)，即0.5、0.25、0.125、0.0625……。乘以S序列中的1或着0算出每一项再相加就可以得出原数了。现在你的基础知识因该足够了，再回过头来看0.45这个十进制纯小数，化为该如何表示呢？现在你动手算一下，最好不要先看到答案，这样对你理解有好处。</P>
<P></P>
<P>我想你已经迫不及待的想要看答案了，因为你发现这跟本算不出来！来看一下步骤：1 / 2 ^1位（为了方便，下面仅用2的指数来表示位），0.456小于位阶值0.5故为0；2位，0.456大于位阶值0.25，该位为1，并将0.45减去0.25得0.206进下一位；3位，0.206大于位阶值0.125，该位为1，并将0.206减去0.125得0.081进下一位；4位，0.081大于0.0625，为1，并将0.081减去0.0625得0.0185进下一位；5位0.0185小于0.03125，为0……问题出来了，即使超过尾数的最大长度23位<FONT color=#ff0000>也除不尽</FONT>！这就是著名的<FONT color=#ff0000 size=4>浮点数精度<FONT color=#000000 size=2>问题了</FONT>（<FONT color=#000000>浮点十进制值通常没有完全相同的二进制表示形式。这是 CPU 所采用的浮点数据表示形式的副作用。为此，可能会经历一些精度丢失，并且一些浮点运算可能会产生意外的结果。</FONT>）</FONT>。不过我在这里不是要给大家讲《数值计算》，用各种方法来提高计算精度，因为那太庞杂了，恐怕我讲上一年也理不清个头绪啊。我在这里就仅把浮点数表示法讲清楚便达到目的了。</P>
<P>OK，我们继续。嗯，刚说哪了？哦对对，那个数还没转完呢，反正最后一直求也求不尽，加上前面的整数部算够24位就行了：1111011.01110100101111001。某BC问：“不是23位吗？”我：“倒，不是说过了要把第一个1去掉吗？当然要加一位喽！”现在开始向左移小数点，大家和我一起移，众：“1、2、3……”好了，一共移了6位，6加上127得131（怎么跟教小学生似的？呵呵~），二进制表示为：10000101，符号位为……再……不说了，越说越啰嗦，大家自己看吧：<BR>0&nbsp; 10000101&nbsp; 11101101110100101111001<BR>42&nbsp; F6&nbsp; E9&nbsp; 79<BR>79&nbsp; E9&nbsp; F6&nbsp; 42</P>
<P>下面再来讲如何将纯小数转化为十六进制。对于纯小数，比如0.0456，我们需要把他规格化，变为1.xxxx * （2 ^ n ）的型式，要求得纯小数X对应的n可用下面的公式：<BR>n = int( 1 + log (2)X );</P>
<P>0.0456我们可以表示为1.4592乘以以2为底的-5次方的幂，即1.4592 * ( 2 ^ -5 )。转化为这样形式后，再按照上面第二个例子里的流程处理：<BR>1. 01110101100011100010001<BR>去掉第一个1<BR>01110101100011100010001<BR>-5 + 127 = 122<BR>0&nbsp; 01111010&nbsp; 01110101100011100010001<BR>最后：<BR>11 C7 3A 3D</P>
<P>另外不得不提到的一点是0.0f对应的十六进制是00 00 00 00，记住就可以了。</P><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=532155</P></DIV>]]></description>
</item><item>
<title><![CDATA[[转]双链表实现大整数的加法与乘法[VC++]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=10144</link>
<author>njucs</author>
<pubDate>2005/11/25 21:15:35</pubDate>
<description><![CDATA[设计的思想主要是通过双链表来实现的.利用双链表的节点存储每位的数字,利用前驱进行对上一个位数的使用.用后继来连接后面的节点.通过对"+"号和"*"号的重载实现对大整数的加和乘.理论上可以实现N多位的运算,只要你的机器内存够大...程序的重点在于运算符的重载.
<P>本程序主要由三个文件构成:</P>
<P>BigInteger.h 包涵了对节点的结构定义,以及类BigInteger的定义.</P>
<P>BigInteger.cpp 包涵了BigInteger类里面成员函数的具体内容.</P>
<P>main.cpp 主函数...</P>
<P><FONT color=#333399>//BigInteger.h</FONT></P>
<P>struct Node&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#339966><FONT color=#99cc00>//定义了节点的结构</FONT><BR></FONT>{<BR>&nbsp;char Num;<BR>&nbsp;Node *Prev,*Next;<BR>};</P>
<P>class BigInteger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//定义BigInteger&nbsp;类<BR></FONT>{<BR>&nbsp;Node *Head,*End,*TempNode;<BR>&nbsp;void AddHead(char Num);<BR>&nbsp;void AddEnd(char Num);<BR>&nbsp;public:<BR>&nbsp;&nbsp;BigInteger();<BR>&nbsp;&nbsp;BigInteger(const BigInteger &amp;BigNum);<BR>&nbsp;&nbsp;void GetNumber();<BR>&nbsp;&nbsp;void disp();<BR>&nbsp;&nbsp;BigInteger operator + (const BigInteger &amp;BigNum);<BR>&nbsp;&nbsp;BigInteger operator * (const BigInteger &amp;BigNum);<BR>&nbsp;&nbsp;BigInteger operator = (const BigInteger &amp;BigNum);<BR>&nbsp;&nbsp;~BigInteger();<BR>};</P>
<P></P>
<P><FONT color=#333399>//BigInteger.cpp</FONT></P>
<P>#include &lt;iostream.h&gt;<BR>#include &lt;stdio.h&gt;<BR>#include "BigInteger.h"</P>
<P>BigInteger::BigInteger()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//构造函数,将每个节点置空.<BR></FONT>{<BR>&nbsp;Head=End=TempNode=NULL;<BR>}</P>
<P>BigInteger::BigInteger(const BigInteger &amp;BigNum)&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//拷贝构造<BR></FONT>{<BR>&nbsp;Node *p;<BR>&nbsp;Head=End=TempNode=NULL;<BR>&nbsp;p=BigNum.Head;<BR>&nbsp;while(p)<BR>&nbsp;{<BR>&nbsp;&nbsp;AddEnd(p-&gt;Num);<BR>&nbsp;&nbsp;p=p-&gt;Next;<BR>&nbsp;}<BR>}</P>
<P>BigInteger::~BigInteger()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#99cc00> //析构<BR></FONT>{<BR>&nbsp;Node *NextNode;<BR>&nbsp;if(Head==NULL)<BR>&nbsp;&nbsp;return;<BR>&nbsp;TempNode=Head;<BR>&nbsp;while(TempNode)<BR>&nbsp;{<BR>&nbsp;&nbsp;NextNode=TempNode-&gt;Next;<BR>&nbsp;&nbsp;delete TempNode;<BR>&nbsp;&nbsp;TempNode=NextNode;<BR>&nbsp;}<BR>&nbsp;Head=NULL;<BR>&nbsp;End=NULL;<BR>&nbsp;TempNode=NULL;<BR>}</P>
<P>void BigInteger::AddHead(char Num)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#99cc00> //在链表头插入节点的操作<BR></FONT>{<BR>&nbsp;TempNode=new Node;<BR>&nbsp;TempNode-&gt;Num=Num;<BR>&nbsp;TempNode-&gt;Prev=NULL;<BR>&nbsp;if(!Head)<BR>&nbsp;{<BR>&nbsp;&nbsp;Head=End=TempNode;<BR>&nbsp;&nbsp;TempNode-&gt;Next=NULL;<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp;&nbsp;TempNode-&gt;Next=Head;<BR>&nbsp;&nbsp;Head-&gt;Prev=TempNode;<BR>&nbsp;&nbsp;Head=TempNode;<BR>&nbsp;}<BR>}</P>
<P>void BigInteger::AddEnd(char Num)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//在链表尾插入节点的操作</FONT><BR>{<BR>&nbsp;TempNode=new Node;<BR>&nbsp;TempNode-&gt;Num=Num;<BR>&nbsp;TempNode-&gt;Next=NULL;<BR>&nbsp;if(!Head)<BR>&nbsp;{<BR>&nbsp;&nbsp;Head=End=TempNode;<BR>&nbsp;&nbsp;TempNode-&gt;Prev=NULL;<BR>&nbsp;}<BR>&nbsp;else<BR>&nbsp;{<BR>&nbsp;&nbsp;TempNode-&gt;Prev=End;<BR>&nbsp;&nbsp;End-&gt;Next=TempNode;<BR>&nbsp;&nbsp;End=TempNode;<BR>&nbsp;}<BR>}</P>
<P>void BigInteger::GetNumber()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//输入部分<BR></FONT>{<BR>&nbsp;char key;<BR>&nbsp;int count=0,num=0;<BR>&nbsp;while((key=getchar())!=10)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//判断输入的是否是回车,不是的话将内容从后到前放到链表中.<BR></FONT>&nbsp;{<BR>&nbsp;&nbsp;if(key&gt;='0' &amp;&amp; key&lt;='9')<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;num=key-'0';<BR>&nbsp;&nbsp;&nbsp;AddEnd(num);<BR>&nbsp;&nbsp;&nbsp;num=0;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}</P>
<P>BigInteger BigInteger::operator + (const BigInteger &amp;BigNum2)&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//重载"+"<BR></FONT>{<BR>&nbsp;BigInteger &amp;BigNum1=*this,result;<BR>&nbsp;Node *temp1,*temp2;<BR>&nbsp;int TempNum,rest=0;<BR>&nbsp;temp1=BigNum1.End;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//将临时链表首地址放置到输入链表的尾部<BR></FONT>&nbsp;temp2=BigNum2.End;<BR>&nbsp;while(temp1 &amp;&amp; temp2)<BR>&nbsp;{<BR>&nbsp;&nbsp;TempNum=int(temp1-&gt;Num)+int(temp2-&gt;Num)+rest;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#99cc00> //节点内元素相加并加上进位rest<BR></FONT>&nbsp;&nbsp;if(TempNum&gt;9)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//判断相加结果是否会产生进位.<BR></FONT>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;TempNum=TempNum-10;<BR>&nbsp;&nbsp;&nbsp;rest=1;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;rest=0;<BR>&nbsp;&nbsp;result.AddHead(char(TempNum));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//将结果放置到最终结果链表里</FONT><BR>&nbsp;&nbsp;temp1=temp1-&gt;Prev;<BR>&nbsp;&nbsp;temp2=temp2-&gt;Prev;<BR>&nbsp;}<BR>&nbsp;if(temp2)temp1=temp2;<BR>&nbsp;while(temp1)<BR>&nbsp;{<BR>&nbsp;&nbsp;int(TempNum)=int(temp1-&gt;Num)+rest;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//节点内元素加上进位rest</FONT><BR>&nbsp;&nbsp;if(TempNum&gt;9)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;TempNum=TempNum-10;<BR>&nbsp;&nbsp;&nbsp;rest=1;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;rest=0;<BR>&nbsp;&nbsp;result.AddHead(char(TempNum));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//将结果放置到最终结果链表里</FONT><BR>&nbsp;&nbsp;temp1=temp1-&gt;Prev;<BR>&nbsp;}<BR>&nbsp;if(rest)<BR>&nbsp;&nbsp;result.AddHead(char(rest));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//考虑最后的进位是否存在,如果存在则存入链表的首部.<BR></FONT>&nbsp;return result;<BR>}</P>
<P>BigInteger BigInteger::operator * (const BigInteger &amp;BigNum2)&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//对*进行重载<BR></FONT>{<BR>&nbsp;BigInteger &amp;BigNum1=*this,temp,result;<BR>&nbsp;Node *temp1,*temp2,*tempa,*tempb;<BR>&nbsp;int TempNum,rest,i=0,rest2;<BR>&nbsp;temp1=BigNum1.End;<BR>&nbsp;temp2=BigNum2.End;<BR>&nbsp;while(temp2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//由乘数的存在与否判断是否去乘被乘数的每个位</FONT><BR>&nbsp;{<BR>&nbsp;&nbsp;rest=0;<BR>&nbsp;&nbsp;while(temp1!=NULL)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;TempNum=int(temp1-&gt;Num)*int(temp2-&gt;Num)+rest;<BR>&nbsp;&nbsp;&nbsp;if(TempNum&gt;9)<BR>&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rest=TempNum/10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//进位由相乘结果与10做商求得<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;TempNum=TempNum%10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//由相乘结果与10求模取个位<BR></FONT>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;rest=0;<BR>&nbsp;&nbsp;&nbsp;temp.AddHead(char(TempNum));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#99cc00> //存入临时链表<BR></FONT>&nbsp;&nbsp;&nbsp;temp1=temp1-&gt;Prev;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;if(rest!=0)temp.AddHead(char(rest));<BR>&nbsp;&nbsp;for(int k=i;k&gt;=1;k--)temp.AddEnd(char(0));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#99cc00> //判断应该在链表后面补几个0<BR></FONT>&nbsp;&nbsp;i++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//每次乘完后计数,用来下一次的补0<BR></FONT>&nbsp;&nbsp;temp1=BigNum1.End;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//把被乘数重新置到尾,用来让乘数下一次去乘每个元素<BR></FONT>&nbsp;&nbsp;temp2=temp2-&gt;Prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//将乘数取出链表的前驱<BR></FONT>&nbsp;&nbsp;tempa=result.End;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//下面进行的是将每次乘数与被乘数的相乘结果累加放到最终链表里等待输出</FONT><BR>&nbsp;&nbsp;if(result.Head!=NULL)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//下面过程与"+"重载基本一样,只是多了对临时链表的置空,所以不在做详细的注释.</FONT><BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;result.End=temp.Head;<BR>&nbsp;&nbsp;&nbsp;result.Head=NULL;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;tempb=temp.End;<BR>&nbsp;&nbsp;rest2=0;<BR>&nbsp;&nbsp;while(tempa!=NULL &amp;&amp; tempb!=NULL)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;TempNum=int(tempa-&gt;Num)+int(tempb-&gt;Num)+rest2;<BR>&nbsp;&nbsp;&nbsp;if(TempNum&gt;9)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;TempNum=TempNum-10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rest2=1;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;rest2=0;<BR>&nbsp;&nbsp;&nbsp;result.AddHead(char(TempNum));<BR>&nbsp;&nbsp;&nbsp;tempa=tempa-&gt;Prev;<BR>&nbsp;&nbsp;&nbsp;tempb=tempb-&gt;Prev;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;if(tempb)tempa=tempb;<BR>&nbsp;&nbsp;while(tempa)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;int(TempNum)=int(tempa-&gt;Num)+rest2;<BR>&nbsp;&nbsp;&nbsp;if(TempNum&gt;9)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;TempNum=TempNum-10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rest2=1;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;rest2=0;<BR>&nbsp;&nbsp;&nbsp;result.AddHead(char(TempNum));<BR>&nbsp;&nbsp;&nbsp;tempa=tempa-&gt;Prev;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;if(rest2)<BR>&nbsp;&nbsp;&nbsp;result.AddHead(char(rest2));<BR>&nbsp;&nbsp;if(temp.Head!=NULL)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;temp.End=temp.Head;<BR>&nbsp;&nbsp;&nbsp;temp.Head=NULL;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;tempb=NULL;<BR>&nbsp;}<BR>&nbsp;return result;<BR>}</P>
<P>BigInteger BigInteger::operator = (const BigInteger &amp;BigNum)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//对=号进行重载<BR></FONT>{<BR>&nbsp;if(this==&amp;BigNum)<BR>&nbsp;&nbsp;return *this;<BR>&nbsp;Node *p;<BR>&nbsp;TempNode=Head=End=NULL;<BR>&nbsp;p=BigNum.Head;<BR>&nbsp;while(p)<BR>&nbsp;{<BR>&nbsp;&nbsp;AddEnd(p-&gt;Num);<BR>&nbsp;&nbsp;p=p-&gt;Next;<BR>&nbsp;}<BR>&nbsp;return *this;<BR>}</P>
<P>void BigInteger::disp()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#99cc00>//输出链表<BR></FONT>{<BR>&nbsp;if(Head)<BR>&nbsp;{<BR>&nbsp;&nbsp;cout&lt;&lt;int(Head-&gt;Num);<BR>&nbsp;&nbsp;TempNode=Head-&gt;Next;<BR>&nbsp;}<BR>&nbsp;else return;<BR>&nbsp;while(TempNode)<BR>&nbsp;{<BR>&nbsp;&nbsp;cout&lt;&lt;int(TempNode-&gt;Num);<BR>&nbsp;&nbsp;TempNode=TempNode-&gt;Next;<BR>&nbsp;}<BR>&nbsp;cout&lt;&lt;endl;<BR>}</P>
<P><FONT color=#333399>//main.cpp</FONT></P>
<P>#include &lt;iostream.h&gt;<BR>#include "BigInteger.h"</P>
<P>void main()<BR>{<BR>&nbsp;BigInteger BigNum1,BigNum2,BigNum3;<BR>&nbsp;int c;<BR>&nbsp;cout&lt;&lt;"选择你要进行的操作:"&lt;&lt;endl;<BR>&nbsp;cout&lt;&lt;"1.大整数加法运算"&lt;&lt;endl;<BR>&nbsp;cout&lt;&lt;"2.大整数乘法运算"&lt;&lt;endl;<BR>&nbsp;cout&lt;&lt;"选择你需要进行的运算:"&lt;&lt;endl;<BR>&nbsp;cin&gt;&gt;c;<BR>&nbsp;switch(c)<BR>&nbsp;{<BR>&nbsp;&nbsp;case 1:<BR>&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"A:"&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BigNum1.GetNumber();<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"B:"&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BigNum2.GetNumber();<BR>&nbsp;&nbsp;&nbsp;&nbsp;BigNum3=BigNum1+BigNum2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"相加的结果是:"&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BigNum3.disp();<BR>&nbsp;&nbsp;&nbsp;}break;<BR>&nbsp;&nbsp;case 2:<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"A:"&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BigNum1.GetNumber();<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"B:"&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BigNum2.GetNumber();<BR>&nbsp;&nbsp;&nbsp;&nbsp;BigNum3=BigNum1*BigNum2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"相乘的结果是:"&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BigNum3.disp();<BR>&nbsp;&nbsp;&nbsp;}break;<BR>&nbsp;&nbsp;default:break;<BR>&nbsp;}<BR>}</P>
<P></P>
<P></P>
<P></P>
<P></P><BR><BR>
<P id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=535558</P>]]></description>
</item><item>
<title><![CDATA[拜占廷将军问题[转]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=8854</link>
<author>njucs</author>
<pubDate>2005/9/28 16:52:42</pubDate>
<description><![CDATA[
<H3 class=title>拜占廷将军问题</H3>
<P>这个问题是在1982年由Lamport, Shostak, Pease提出，后少人问津。为了利于对“拜占廷将军”问题原意的理解和避免曲解，把英文解释奉上：<BR>　Byzantine General Problem ——The problem of reaching a consensus among distributed units if some of them give misleading answers. The original problem concerns generals plotting a coup. Some generals lie about whether they will support a particular plan and what other generals told them. What percentage of liars can a decision making algorithm tolerate and still correctly determine a consensus? </P>
<P>在1982年被提出的“拜占廷将军问题”在今天被许多学者看好，然而在商业上还没有体现其价值。特别是中国的产业界把它放在了一个被遗忘的角落。</P>
<P>　　拜占庭问题讲的是，几个将军围困一座城池，大家必须商量一种策略，是进攻还是撤退。如果有的进攻，有的撤退就有可能打败仗。但将军中有叛国的，他们可能希望爱国的将军打败仗。拜占廷将军问题就是阐述了在这样的环境下，如何让爱国的将军能在最终达成一致意见。判国的将军虽然可以传递了虚假消息，也不会影响爱国的将军得到正确的决策。</P>
<P>　　拜占廷将军问题就是要<B>让爱国的将军达成一致，而不是找叛国的将军</B>。我们的入侵容忍体系就是这样，只要在众多服务器上得到的正确的计算结果，，那么我们就可以相信这个数据，而不需要去寻找到底谁是间谍。如果要容忍一个捣乱的服务器，在数量上究竟会需要几个服务器？“拜占廷将军”问题可以为我们解答这个问题：在进行混乱真实消息的传播中，两个将军中一个判国，另一个肯定打败仗，三个将军中如果有一个判国，则判国的将军一定有办法让两个爱国的将军不能达成一致，若再增加一个将军，既4个将军中如果只有一个判国，在不知道谁是判国者的情况下，存在一种算法使将军们达成一致，实际上就是三个爱国的将军能够达成一致，而不管判国的将军如何捣乱。既4个将军的团体能够容忍1个叛国将军。同样我们知道，当有t个判国者在捣乱而又无法找出他们的时候，存在一种算法或称做弹性协议，通过这种协议，能够保证爱国的将军达成一致。如果我们把能够容忍t个叛国者的协议叫t弹性协议，学者证明了，不存在3t个将军下的t弹性协议而一定存在3t+1或以上将军下的t弹性协议。就是说要有3t+1个或以上将军才能保证爱国的将军能够达成一致。<B>既要想容忍t个判国者，必须保证总的将军的个数大于3t</B>。</P>
<P>　这样看来，“拜占廷将军”问题应用于信息安全就是入侵容忍体系的重要技术基础之一。以上讲述的仅仅是“拜占廷将军”问题中简化描述，加之以叙述的形式，就是一个描述性的推理，实际上“拜占廷将军”问题程序计算的方法是很复杂的<BR></P>]]></description>
</item><item>
<title><![CDATA[某人的挂QQ的程序源代码，虽然没用了，拿出来看看也好]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=njucs&amp;id=7978</link>
<author>njucs</author>
<pubDate>2005/8/23 22:53:29</pubDate>
<description><![CDATA[<IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0><A href="http://blogger.org.cn/blog/uploadfile/2005823225447782.RAR" target=_blank>guaQQ.rar</A>]]></description>
</item>
</channel>
</rss>