﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-I believe-随笔分类-转载</title><link>http://www.cppblog.com/luyulaile/category/11048.html</link><description>I  can</description><language>zh-cn</language><lastBuildDate>Fri, 18 Nov 2011 06:13:24 GMT</lastBuildDate><pubDate>Fri, 18 Nov 2011 06:13:24 GMT</pubDate><ttl>60</ttl><item><title>长春赢鼎教育公司 原是传销机构</title><link>http://www.cppblog.com/luyulaile/archive/2011/05/01/145469.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sun, 01 May 2011 10:31:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2011/05/01/145469.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/145469.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2011/05/01/145469.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/145469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/145469.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium 'Times New Roman'; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 25px; FONT-FAMILY: Verdana, Arial, Tahoma; COLOR: rgb(51,51,51); FONT-SIZE: 14px" class=Apple-style-span>长春赢鼎教育公司长春赢鼎教育公司 原是传销机构<br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><a href="http://www.szxkd.com/a/infos/2010/0728/42578.html"><u><font color=#0066cc size=3 face="Times New Roman">http://www.szxkd.com/a/infos/2010/0728/42578.html</font></u></a><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">近日，记者获悉，一起以教育为借口的传销团体，在长春逐渐扩大。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　北京赢鼎教育机构长春分公司，实际上是长春赢鼎教育公司，该公司挂着北京的名号，在长春各大高校，以大量的&#8220;高薪求职&#8221;为诱导，诱导学生一人缴纳会员费：1480元，会员费缴纳无税收发票，只有收据。现在该团队吸纳的会员数逐渐扩大，预计达三千人。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　眼睁睁看着这个传销团队在长春各大高校滋生蔓延，记者进入该团队进行了暗访调查得知一些情况：<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　一、该公司在没有提供实质性业务或服务情况下，以发展人员数量为主要经济来源；<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　二、以宣传&#8220;高薪职场&#8221;或承诺&#8220;推荐学生进入500强企业工作&#8221;为诱饵，采取非法集会，巧立名目或以产品变相收取不等价、不客观的费用进行非法集资；<span class=Apple-converted-space>&nbsp;</span><a style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; COLOR: rgb(37,110,177); TEXT-DECORATION: none; PADDING-TOP: 0px" class=smarterwiki-linkify href="http://www.cppblog.com/luyulaile/admin/">http:///</a><span class=Apple-converted-space>&nbsp;</span></span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　三、以提供求职面试服务，500强公司HR与大学生面对面，会员有机会获得去香港旅游，手机，电脑为幌子，从事集资诈骗等违法犯罪的商业欺诈，用欺骗手段甚至不断洗脑诱导进行交易的敛财行为；<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　1、该公司号称给学生孩子们推荐500强工作。其实不是，是诱导前提，而所谓的工作，是给他们机构做免费的实习生。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　2、该公司任课老师全部不是正规大学毕业的，而是一些没有正规学历背景的个人。其中号称全球职业规划师的，其实只是化妆师（教礼仪形象），或者有的号称全球职业企业高级管理人，其实是不知名单位某人力经理。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　3、以高薪教育为诱导点，影响在校学生们正常上课，甚至翘课，不参加晚自习等，拼了命也要去上他们的课。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">4、所有报名费全无税收发票。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　5、该团队所有工作人，全部以团队竞争为模式：互相比较每一期课程、哪一组&#8220;忽悠&#8221;的学生最多，并从中提成，谁忽悠的学生最多，谁的提成最高。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　6、如果交了会员费，就绝对不可能再退费。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　7、我们还有幸从该机构一名员工口中得知：该机构组织者对员工的承诺是：争取2012年，我们在纳斯达克上市。还承诺：年底将进军北京，优秀的员工，将进军各大省市当代理处总负责人。而实际是，该机构可怜无辜的员工，从早上7点去上班，晚上10点才下班。一个月只有1天的休息日。五一加班公司根本不给加班费。一个月工资只有1000元。而员工的提成，公司也有各种借口扣下。开始讲的是挺激励人，现场的孩子们都被感染了。很明显，都是些大一大二的孩子，刚进大学。对职场根本不了解，他们讲的这些老套的东西，对大一大二的孩子就起到一个诱导的效果。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　 公司每一次所谓的免费宣战之后，学生们就要被诱导参加他们的会员课程。每一个会员交费一千多。号称可以给孩子们推荐500强工作实习机会，或者给孩子们推荐工作等等。实际上是有推荐工作了：给他们赢鼎当免费的劳动力。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　当他们宣讲结束后问他们的老师：为什么总给大一大二孩子讲课，也给大三大四的孩子讲讲职场嘛。老师的回答让记者感到很吃惊：大三大四的不好洗脑。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　随后，记者电话至该公司了解其相关情况，当记者问起该公司的经营范围是什么时，公司内部人员却答不上来，并且否认有传销性质的活动。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　记者联系到该公司法人代表，法人一口否认公司的传销性质，并说有各大学的聘书为证，而记者所见的该公司的营业执照并不规范，没有注明公司经营范围。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　此后，记者再想了解一些相关情况，并要查询相关收费许可证及收费标准时，公司对方不接电话，公司法人也拒接回避。<span class=Apple-converted-space>&nbsp;</span><br style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">　　长春赢鼎教育公司长春赢鼎教育公司 原是传销机构!</span></span>
<img src ="http://www.cppblog.com/luyulaile/aggbug/145469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2011-05-01 18:31 <a href="http://www.cppblog.com/luyulaile/archive/2011/05/01/145469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Socket的UDP和TCP编程介绍 </title><link>http://www.cppblog.com/luyulaile/archive/2010/09/12/126443.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Sun, 12 Sep 2010 02:41:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2010/09/12/126443.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/126443.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2010/09/12/126443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/126443.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/126443.html</trackback:ping><description><![CDATA[<div id=appShareShareIcon class=share-btn-img onclick="share.share('8484629','','8484629')"></div>
基于Socket的UDP和TCP编程介绍
<div id=app-share-container>
<div id=appShareOpt>转帖自：<font color=#008000 size=2>apps.hi.baidu.com/share/detail/8484629</font></div>
<div id=app-share-content>一、概述
<p><span class=STYLE3>　　TCP（传输控制协议）和UDP（用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。</span></p>
<p><span class=STYLE3>　　TCP：传输控制协议，一种面向连接的协议，给用户进程提供可靠的全双工的字节流，TCP套接口是字节流套接口(stream socket)的一种。</span></p>
<p><span class=STYLE3>　　UDP：用户数据报协议。UDP是一种无连接协议。UDP套接口是数据报套接口(datagram socket)的一种。</span></p>
<p><span class=STYLE3>　　二、TCP和UDP介绍</span></p>
<p><span class=STYLE3>　　1）基本TCP客户—服务器程序设计基本框架<br></span></p>
<p align=center><img border=0 src="http://hiphotos.baidu.com/miracletan2008/pic/item/bc3eb135f01574b0a71e124f.jpg"></p>
<p>&#160;</p>
<p><span class=STYLE3>　　说明：（三路握手）</span></p>
<p><span class=STYLE3>　　1.客户端发送一个SYN段（同步序号）指明客户打算连接的服务器端口，以及初始化序号(ISN) 。</span></p>
<p><span class=STYLE3>　　2.服务器发回包含服务器的初始序号的SYN报文段作为应答。同时，将确认序号(ACK)设置为客户的ISN加1以对客户的SYN 报文段进行确认。一个SYN将占用一个序号。</span></p>
<p><span class=STYLE3>　　3.客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。</span></p>
<p align=center><img border=0 src="http://hiphotos.baidu.com/miracletan2008/pic/item/33fa828b63f15ee8fc1f104f.jpg"></p>
<p><span class=STYLE3>　　2) 基本TCP客户—服务器程序设计基本框架流程图<br></span></p>
<p align=center><img border=0 src="http://hiphotos.baidu.com/miracletan2008/pic/item/a61ea8d33af0b70f960a164f.jpg"></p>
<p>&#160;</p>
<p><span class=STYLE3>　　3) UDP和TCP的对比：</span></p>
<p><span class=STYLE3>　　从上面的流程图比较我们可以很明显的看出UDP没有三次握手过程。<br></span></p>
<p><span class=STYLE3>　　简单点说。UDP处理的细节比TCP少。UDP不能保证消息被传送到（它也报告消息没有传送到）目的地。UDP也不保证数据包的传送顺序。UDP把数据发出去后只能希望它能够抵达目的地。</span></p>
<p><span class=STYLE3>　　TCP优缺点：</span></p>
<p><span class=STYLE3>　　优点：</span></p>
<p><span class=STYLE3>　　1．TCP提供以认可的方式显式地创建和终止连接。</span></p>
<p><span class=STYLE3>　　2．TCP保证可靠的、顺序的（数据包以发送的顺序接收）以及不会重复的数据传输。</span></p>
<p><span class=STYLE3>　　3．TCP处理流控制。</span></p>
<p><span class=STYLE3>　　4．允许数据优先</span></p>
<p><span class=STYLE3>　　5．如果数据没有传送到，则TCP套接口返回一个出错状态条件。</span></p>
<p><span class=STYLE3>　　6．TCP通过保持连续并将数据块分成更小的分片来处理大数据块。—无需程序员知道</span></p>
<p><span class=STYLE3>　　缺点： TCP在转移数据时必须创建（并保持）一个连接。这个连接给通信进程增加了开销，让它比UDP速度要慢。</span></p>
<p><span class=STYLE3>　　UDP优缺点：</span></p>
<p><span class=STYLE3>　　1．UDP不要求保持一个连接</span></p>
<p><span class=STYLE3>　　2．UDP没有因接收方认可收到数据包（或者当数据包没有正确抵达而自动重传）而带来的开销。</span></p>
<p><span class=STYLE3>　　3．设计UDP的目的是用于短应用和控制消息</span></p>
<p><span class=STYLE3>　　4．在一个数据包连接一个数据包的基础上，UDP要求的网络带宽比TDP更小。</span></p>
<p><span class=STYLE3>　　三、Socket编程</span></p>
<p><span class=STYLE3>　　Socket接口是TCP/IP网络的API，Socket接口定义了许多函数或例程，程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程，必须理解Socket接口。</span></p>
<p><span class=STYLE3>　　Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输 出的话，就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O，Socket也是一种文件描述符。Socket也具有一个类似于打 开文件的函数调用Socket()，该函数返回一个整型的Socket描述符，随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的 Socket类型有两种：流式Socket（SOCK_STREAM）和数据报式Socket（SOCK_DGRAM）。流式是一种面向连接的 Socket，针对于面向连接的TCP服务应用；数据报式Socket是一种无连接的Socket，对应于无连接的UDP服务应用。</span></p>
<p><span class=STYLE3>　　1、socket调用库函数主要有：</span></p>
<p><span class=STYLE3>　　创建套接字</span></p>
<p><span class=STYLE3>　　Socket(af,type,protocol)</span></p>
<p><span class=STYLE3>　　建立地址和套接字的联系</span></p>
<p><span class=STYLE3>　　bind(sockid, local addr, addrlen)</span></p>
<p><span class=STYLE3>　　服务器端侦听客户端的请求</span></p>
<p><span class=STYLE3>　　listen( Sockid ,quenlen)</span></p>
<p><span class=STYLE3>　　建立服务器/客户端的连接 (面向连接TCP）</span></p>
<p><span class=STYLE3>　　客户端请求连接</span></p>
<p><span class=STYLE3>　　Connect(sockid, destaddr, addrlen)</span></p>
<p><span class=STYLE3>　　服务器端等待从编号为Sockid的Socket上接收客户连接请求</span></p>
<p><span class=STYLE3>　　newsockid=accept(Sockid，Clientaddr, paddrlen)</span></p>
<p><span class=STYLE3>　　发送/接收数据</span></p>
<p><span class=STYLE3>　　面向连接：send(sockid, buff, bufflen)</span></p>
<p><span class=STYLE3>　　recv( )</span></p>
<p><span class=STYLE3>　　面向无连接：sendto(sockid,buff,&#8230;,addrlen)</span></p>
<p><span class=STYLE3>　　recvfrom( )</span></p>
<p><span class=STYLE3>　　释放套接字</span></p>
<p><span class=STYLE3>　　close(sockid)</span></p>
<p><span class=STYLE3>　　2、TCP/IP应用编程接口（API）</span></p>
<p><span class=STYLE3>　　服务器的工作流程：首先调用socket函数创建一个Socket，然后调用bind函数将其与本 机地址以及一个本地端口号绑定，然后调用listen在相应的socket上*，当accpet接收到一个连接服务请求时，将生成一个新的socket。 服务器显示该客户机的IP地址，并通过新的socket向客户端发送字符串" hi,I am server!"。最后关闭该socket。<br></span></p>
<p class=grey>main()<br>{ <br>int sock_fd,client_fd; /*sock_fd：*socket；client_fd：数据传输socket */ <br>struct sockaddr_in ser_addr; /* 本机地址信息 */ <br>struct sockaddr_in cli_addr; /* 客户端地址信息 */ <br>char msg[MAX_MSG_SIZE];/* 缓冲区*/<br>ser_sockfd=<strong>socket</strong>(AF_INET,SOCK_STREAM,0);/*创建连接的SOCKET */<br>if(ser_sockfd&lt;0)<br>{/*创建失败 */<br>fprintf(stderr,"socker Error:%s\n",strerror(errno));<br>exit(1);<br>} <br>/* 初始化服务器地址*/<br>addrlen=sizeof(struct sockaddr_in);<br>bzero(&amp;ser_addr,addrlen);<br>ser_addr.sin_family=AF_INET;<br>ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);<br>ser_addr.sin_port=htons(SERVER_PORT);<br>if(<strong>bind</strong>(ser_sockfd,(struct sockaddr*)&amp;ser_addr,sizeof(struct sockaddr_in))&lt;0)<br>{ /*绑定失败 */<br>fprintf(stderr,"Bind Error:%s\n",strerror(errno));<br>exit(1);<br>} <br>/*侦听客户端请求*/<br>if(<strong>listen</strong>(ser_sockfd,BACKLOG)&lt;0)<br>{<br>fprintf(stderr,"Listen Error:%s\n",strerror(errno));<br>close(ser_sockfd);<br>exit(1);<br>}<br>while(1)<br>{/* 等待接收客户连接请求*/<br>cli_sockfd=<strong>accept</strong>(ser_sockfd,(struct sockaddr*) &amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cli_addr,&amp;addrlen);<br>if(cli_sockfd&lt;=0)<br>{<br>fprintf(stderr,"Accept Error:%s\n",strerror(errno));<br>}<br>else<br>{/*开始服务*/<br><strong>recv</strong>(cli_addr,msg,MAX_MSG_SIZE,0); /* 接受数据*/<br>printf("received a connection from %sn", inet_ntoa(cli_addr.sin_addr));<br>printf("%s\n",msg);/*在屏幕上打印出来 */ <br>strcpy(msg,"hi,I am server!");<br><strong>send</strong>(cli_addr,msg,sizeof(msg),0); /*发送的数据*/<br>close(cli_addr); <br>}<br>}<br><strong>close</strong>(ser_sockfd);<br>}</p>
<p class=grey>　　客户端的工作流程：首先调用socket函数创建一个Socket，然后调用bind函数将其与本机地址以及一个本地端口号绑定，请求连接服务器，通过新的socket向客户端发送字符串" hi,I am client!"。最后关闭该socket。</p>
<p class=grey>main()<br>{<br>int cli_sockfd;/*客户端SOCKET */<br>int addrlen;<br>char seraddr[14];<br>struct sockaddr_in ser_addr,/* 服务器的地址*/<br>cli_addr;/* 客户端的地址*/<br>char msg[MAX_MSG_SIZE];/* 缓冲区*/<br>GetServerAddr(seraddr);<br>cli_sockfd=<strong>socket</strong>(AF_INET,SOCK_STREAM,0);/*创建连接的SOCKET */<br>if(ser_sockfd&lt;0)<br>{/*创建失败 */<br>fprintf(stderr,"socker Error:%s\n",strerror(errno));<br>exit(1);<br>}<br>/* 初始化客户端地址*/<br>addrlen=sizeof(struct sockaddr_in);<br>bzero(&amp;ser_addr,addrlen);<br>cli_addr.sin_family=AF_INET;<br>cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);<br>cli_addr.sin_port=0;<br>if(<strong>bind</strong>(cli_sockfd,(struct sockaddr*)&amp;cli_addr,addrlen)&lt;0)<br>{ <br>/*棒定失败 */<br>fprintf(stderr,"Bind Error:%s\n",strerror(errno));<br>exit(1);<br>}<br>/* 初始化服务器地址*/<br>addrlen=sizeof(struct sockaddr_in);<br>bzero(&amp;ser_addr,addrlen);<br>ser_addr.sin_family=AF_INET;<br>ser_addr.sin_addr.s_addr=inet_addr(seraddr);<br>ser_addr.sin_port=htons(SERVER_PORT);<br>if(<strong>connect</strong>(cli_sockfd,(struct sockaddr*)&amp;ser_addr,&amp;addrlen)!=0)/*请求连接*/<br>{<br>/*连接失败 */<br>fprintf(stderr,"Connect Error:%s\n",strerror(errno));<br><strong>close</strong>(cli_sockfd);<br>exit(1);<br>}<br>strcpy(msg,"hi,I am client!");<br>send(sockfd,msg,sizeof(msg),0);/*发送数据*/<br>recv(sockfd,msg,MAX_MSG_SIZE,0); /* 接受数据*/<br>printf("%s\n",msg);/*在屏幕上打印出来 */<br><strong>close</strong>(cli_sockfd);<br>}</p>
<p class=grey><strong>　　3、UDP/IP应用编程接口（API）</strong></p>
<p class=grey>　　服务器的工作流程：首先调用socket函数创建一个Socket，然后调用bind函数将其与本机地址以及一个本地端口号绑定，接收到一个客户端时，服务器显示该客户端的IP地址，并将字串返回给客户端。</p>
<p class=grey>int main(int argc,char **argv)<br>{<br>int ser_sockfd;<br>int len;<br>//int addrlen;<br>socklen_t addrlen;<br>char seraddr[100];<br>struct sockaddr_in ser_addr;<br>/*建立socket*/<br>ser_sockfd=socket(AF_INET,SOCK_DGRAM,0);<br>if(ser_sockfd&lt;0)<br>{<br>printf("I cannot socket success\n");<br>return 1;<br>}<br>/*填写sockaddr_in 结构*/<br>addrlen=sizeof(struct sockaddr_in);<br>bzero(&amp;ser_addr,addrlen);<br>ser_addr.sin_family=AF_INET;<br>ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);<br>ser_addr.sin_port=htons(SERVER_PORT);<br>/*绑定客户端<br>if(bind(ser_sockfd,(struct sockaddr *)&amp;ser_addr,addrlen)&lt;0)<br>{<br>printf("connect");<br>return 1;<br>}<br>while(1)<br>{<br>bzero(seraddr,sizeof(seraddr));<br>len=recvfrom(ser_sockfd,seraddr,sizeof(seraddr),0,(struct sockaddr*)&amp;ser_addr,&amp;addrlen);<br>/*显示client端的网络地址*/<br>printf("receive from %s\n",inet_ntoa(ser_addr.sin_addr));<br>/*显示客户端发来的字串*/ <br>printf("recevce:%s",seraddr);<br>/*将字串返回给client端*/<br>sendto(ser_sockfd,seraddr,len,0,(struct sockaddr*)&amp;ser_addr,addrlen);<br>}<br>}</p>
<p class=grey>　　客户端的工作流程：首先调用socket函数创建一个Socket，填写服务器地址及端口号，从标准输入设备中取得字符串，将字符串传送给服务器端，并接收服务器端返回的字符串。最后关闭该socket。</p>
<p class=grey>int GetServerAddr(char * addrname)<br>{<br>printf("please input server addr:");<br>scanf("%s",addrname);<br>return 1;<br>}<br>int main(int argc,char **argv)<br>{<br>int cli_sockfd;<br>int len;<br>socklen_t addrlen;<br>char seraddr[14];<br>struct sockaddr_in cli_addr;<br>char buffer[256];<br>GetServerAddr(seraddr);<br>/* 建立socket*/<br>cli_sockfd=socket(AF_INET,SOCK_DGRAM,0);<br>if(cli_sockfd&lt;0)<br>{<br>printf("I cannot socket success\n");<br>return 1;<br>}<br>/* 填写sockaddr_in*/<br>addrlen=sizeof(struct sockaddr_in);<br>bzero(&amp;cli_addr,addrlen);<br>cli_addr.sin_family=AF_INET;<br>cli_addr.sin_addr.s_addr=inet_addr(seraddr);<br>//cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);<br>cli_addr.sin_port=htons(SERVER_PORT);</p>
<p class=grey>bzero(buffer,sizeof(buffer));<br>/* 从标准输入设备取得字符串*/<br>len=read(STDIN_FILENO,buffer,sizeof(buffer));<br>/* 将字符串传送给server端*/<br>sendto(cli_sockfd,buffer,len,0,(struct sockaddr*)&amp;cli_addr,addrlen);<br>/* 接收server端返回的字符串*/<br>len=recvfrom(cli_sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&amp;cli_addr,&amp;addrlen);<br>//printf("receive from %s\n",inet_ntoa(cli_addr.sin_addr));<br>printf("receive: %s",buffer);<br>close(cli_sockfd);<br>}</p>
</div>
</div>
<img src ="http://www.cppblog.com/luyulaile/aggbug/126443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2010-09-12 10:41 <a href="http://www.cppblog.com/luyulaile/archive/2010/09/12/126443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Vector遍历</title><link>http://www.cppblog.com/luyulaile/archive/2010/01/26/106444.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Tue, 26 Jan 2010 01:08:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2010/01/26/106444.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/106444.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2010/01/26/106444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/106444.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/106444.html</trackback:ping><description><![CDATA[<font color="#000080">import java.util.Iterator;<br />import java.util.Vector;<br /><br />public class VectorIterator implements Iterator{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; private Vector v;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; private int currentIndex=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; public VectorIterator(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; public VectorIterator(Vector v){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.v=v;<br />&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; public boolean hasNext() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(this.currentIndex&lt;this.v.size()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("current index is :&nbsp;&nbsp; "+this.currentIndex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("out of the bound ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; public Object next() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.v.get(this.currentIndex++);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; public void remove() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.v.remove(this.currentIndex);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector v=new Vector();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.add(new String("aaa"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.add(new String("bbb"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.add(new String("ccc"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator iter=new VectorIterator(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(iter.hasNext()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str=(String)iter.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}</font><img src ="http://www.cppblog.com/luyulaile/aggbug/106444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2010-01-26 09:08 <a href="http://www.cppblog.com/luyulaile/archive/2010/01/26/106444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java Vector排序及用法</title><link>http://www.cppblog.com/luyulaile/archive/2010/01/26/106439.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Mon, 25 Jan 2010 17:48:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2010/01/26/106439.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/106439.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2010/01/26/106439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/106439.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/106439.html</trackback:ping><description><![CDATA[<p>temp=CustomerMaker.quickPassQueue.get(0);//获得首元素<br />&nbsp;&nbsp;CustomerMaker.quickPassQueue.remove(0);//删除首元素<br /><br />&nbsp;quickPassQueue.add();在末尾添加元素<br />----演示程序-----<br /><br />import java.util.*;<br />import java.io.*;<br /><br />public class test<br />{<br />Vector v = new Vector();<br /><br />public void testMethod(){<br />&nbsp; v.add("a");<br />&nbsp; v.add("b");<br />&nbsp; v.add("c");<br /><br />&nbsp; System.out.println("\n原来的vecotr");<br />&nbsp; for(int i=0;i&lt;v.size();i++){<br />&nbsp;&nbsp; System.out.println("\n"+" index is: "+ i + " element is: " +v.get(i));<br />&nbsp; }<br /><br />&nbsp; v.remove(0);<br /><br />&nbsp; System.out.println("\n去掉一个vector中第一个元素");<br />&nbsp; for(int i=0;i&lt;v.size();i++){<br />&nbsp;&nbsp; System.out.println("\n"+" index is: "+ i + " element is: " +v.get(i));<br />&nbsp; }<br />}<br /><br />public static void main(String[] args) <br />{<br />&nbsp; test t = new test();<br />&nbsp; t.testMethod();<br />&nbsp; System.out.println("Hello World!");<br />}<br />}<br />-----------------排序程序------------------------------<br />import java.util.*;</p>
<p>class MyCompare implements Comparator //实现Comparator，定义自己的比较方法<br />{<br />public int compare(Object o1, Object o2) {<br />Elem e1=(Elem)o1;<br />Elem e2=(Elem)o2;<br /><br />if(e1.get() &gt; e2.get())//这样比较是降序,如果把-1改成1就是升序.<br />{<br />&nbsp;&nbsp; return -1;<br />}<br />else if(e1.get()&lt;e2.get())<br />{<br />&nbsp;&nbsp; return 1;<br />}<br />else<br />{<br />&nbsp;&nbsp; return 0;<br />}<br />}<br />}</p>
<p>class Elem {<br />private int iVal;</p>
<p>public Elem(int i) {<br />&nbsp;&nbsp; this.iVal = i;<br />}</p>
<p>public int get() {<br />&nbsp;&nbsp; return this.iVal;<br />}<br />}</p>
<p>public class Vector1 {<br />public static void main(String[] args) {<br />&nbsp;&nbsp; List v = new Vector();<br />&nbsp;&nbsp; v.add(new Elem(1));<br />&nbsp;&nbsp; v.add(new Elem(22));<br />&nbsp;&nbsp; v.add(new Elem(3));<br />&nbsp;&nbsp; v.add(new Elem(14));<br />&nbsp;&nbsp; Comparator ct = new MyCompare();<br />&nbsp;&nbsp; Collections.sort(v, ct);<br />&nbsp;&nbsp; for (int i = 0; i &lt; v.size(); i++)<br />&nbsp;&nbsp;&nbsp; System.out.println(((Elem) v.get(i)).get());</p>
<p>}</p>
<p>}<br /></p><img src ="http://www.cppblog.com/luyulaile/aggbug/106439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2010-01-26 01:48 <a href="http://www.cppblog.com/luyulaile/archive/2010/01/26/106439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]使用 Java 编程语言实现线程 </title><link>http://www.cppblog.com/luyulaile/archive/2010/01/26/106437.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Mon, 25 Jan 2010 17:17:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2010/01/26/106437.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/106437.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2010/01/26/106437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/106437.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/106437.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 12pt" class="MsoNormal"><strong><span style="font-family: 宋体; color: #c00000; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">使用</span></strong><strong><span style="font-family: Arial; color: #c00000; font-size: 9pt" lang="EN-US"> Java </span></strong><strong><span style="font-family: 宋体; color: #c00000; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">编程语言实现线程</span></strong><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> <br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Java</span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">编程语言使多线程如此简单有效，以致于某些程序员说它实际上是自然的。尽管在</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Java </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">中使用线程比在其他语言中要容易得多，仍然有一些概念需要掌握。要记住的一件重要的事情是</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> main() </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">函数也是一个线程，并可用来做有用的工作。程序员只有在需要多个线程时才需要创建新的线程。</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> <br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><strong><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Thread </span></strong><strong><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">类</span></strong><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Thread </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">类是一个具体的类，即不是抽象类，该类封装了线程的行为。要创建一个线程，程序员必须创建一个从</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Thread </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">类导出的新类。程序员必须覆盖</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Thread </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> run() </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">函数来完成有用的工作。用户并不直接调用此函数；而是必须调用</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Thread </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> start() </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">函数，该函数再调用</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> run()</span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">。下面的代码说明了它的用法：</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　创建两个新线程</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><o:p></o:p></span></p>
<div align="center">
<table style="border-bottom: #ffcc66 1pt outset; border-left: #ffcc66 1pt outset; width: 90%; background: #c9c9b8; border-top: #ffcc66 1pt outset; border-right: #ffcc66 1pt outset; mso-cellspacing: 1.5pt; mso-border-alt: outset #FFCC66 .75pt" class="MsoNormalTable" border="1" cellpadding="0" width="90%">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
            <td style="border-bottom: #ffcc66 1pt inset; border-left: #ffcc66 1pt inset; padding-bottom: 0.75pt; background-color: transparent; padding-left: 0.75pt; padding-right: 0.75pt; border-top: #ffcc66 1pt inset; border-right: #ffcc66 1pt inset; padding-top: 0.75pt; mso-border-alt: inset #FFCC66 .75pt">
            <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Arial; font-size: 9pt" lang="EN-US">import java.util.*;<br /><br />class TimePrinter extends Thread {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">int pauseTime;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">String name;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">public TimePrinter(int x, String n) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">pauseTime = x;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">name = n;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">public void run() {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">while(true) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">try {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">System.out.println(name + ":" + new Date(System.currentTimeMillis()));<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Thread.sleep(pauseTime);<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">} catch(Exception e) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">System.out.println(e);<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">static public void main(String args[]) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">tp1.start();<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">tp2.start();<br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br />}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin: 0cm 0cm 12pt" class="MsoNormal"><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　在本例中，我们可以看到一个简单的程序，它按两个不同的时间间隔（</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">1 </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">秒和</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> 3 </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">秒）在屏幕上显示当前时间。这是通过创建两个新线程来完成的，包括</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> main() </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">共三个线程。但是，因为有时要作为线程运行的类可能已经是某个类层次的一部分，所以就不能再按这种机制创建线程。虽然在同一个类中可以实现任意数量的接口，但</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Java </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">编程语言只允许一个类有一个父类。同时，某些程序员避免从</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Thread </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">类导出，因为它强加了类层次。对于这种情况，就要</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> runnable </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">接口。</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><strong><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Runnable </span></strong><strong><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">接口</span></strong><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　此接口只有一个函数，</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">run()</span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，此函数必须由实现了此接口的类实现。但是，就运行这个类而论，其语义与前一个示例稍有不同。我们可以用</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> runnable </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">接口改写前一个示例。（不同的部分用黑体表示。）</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> <br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　创建两个新线程而不强加类层次</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><o:p></o:p></span></p>
<div align="center">
<table style="border-bottom: #ffcc66 1pt outset; border-left: #ffcc66 1pt outset; width: 90%; background: #c9c9b8; border-top: #ffcc66 1pt outset; border-right: #ffcc66 1pt outset; mso-cellspacing: 1.5pt; mso-border-alt: outset #FFCC66 .75pt" class="MsoNormalTable" border="1" cellpadding="0" width="90%">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
            <td style="border-bottom: #ffcc66 1pt inset; border-left: #ffcc66 1pt inset; padding-bottom: 0.75pt; background-color: transparent; padding-left: 0.75pt; padding-right: 0.75pt; border-top: #ffcc66 1pt inset; border-right: #ffcc66 1pt inset; padding-top: 0.75pt; mso-border-alt: inset #FFCC66 .75pt">
            <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Arial; font-size: 9pt" lang="EN-US">import java.util.*;<br /><br />class TimePrinter implements Runnable {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">int pauseTime;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">String name;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">public TimePrinter(int x, String n) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">pauseTime = x;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">name = n;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">public void run() {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">while(true) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">try {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">System.out.println(name + ":" + new Date(System.currentTimeMillis()));<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Thread.sleep(pauseTime);<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">} catch(Exception e) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">System.out.println(e);<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">static public void main(String args[]) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Thread t1 = new Thread(new TimePrinter(1000, "Fast Guy"));<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">t1.start();<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Thread t2 = new Thread(new TimePrinter(3000, "Slow Guy"));<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">t2.start();<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">}<br />}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin: 0cm 0cm 12pt" class="MsoNormal"><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　请注意，当使用</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> runnable </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">接口时，您不能直接创建所需类的对象并运行它；必须从</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Thread </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">类的一个实例内部运行它。许多程序员更喜欢</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> runnable </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">接口，因为从</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Thread </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">类继承会强加类层次。</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><strong><span style="font-family: Arial; font-size: 9pt" lang="EN-US">synchronized </span></strong><strong><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">关键字</span></strong><strong><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /></span></strong><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　到目前为止，我们看到的示例都只是以非常简单的方式来利用线程。只有最小的数据流，而且不会出现两个线程访问同一个对象的情况。但是，在大多数有用的程序中，线程之间通常有信息流。试考虑一个金融应用程序，它有一个</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Account </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">对象，如下例中所示：</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　一个银行中的多项活动</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><o:p></o:p></span></p>
<div align="center">
<table style="border-bottom: #ffcc66 1pt outset; border-left: #ffcc66 1pt outset; width: 90%; background: #c9c9b8; border-top: #ffcc66 1pt outset; border-right: #ffcc66 1pt outset; mso-cellspacing: 1.5pt; mso-border-alt: outset #FFCC66 .75pt" class="MsoNormalTable" border="1" cellpadding="0" width="90%">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
            <td style="border-bottom: #ffcc66 1pt inset; border-left: #ffcc66 1pt inset; padding-bottom: 0.75pt; background-color: transparent; padding-left: 0.75pt; padding-right: 0.75pt; border-top: #ffcc66 1pt inset; border-right: #ffcc66 1pt inset; padding-top: 0.75pt; mso-border-alt: inset #FFCC66 .75pt">
            <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Arial; font-size: 9pt" lang="EN-US">public class Account {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">String holderName;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">float amount;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">public Account(String name, float amt) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">holderName = name;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">amount = amt;<br />}<br /><br />public void deposit(float amt) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">amount += amt;<br />}<br /><br />public void withdraw(float amt) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">amount -= amt;<br />}<br /><br />public float checkBalance() {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">return amount;<br />}<br />}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin: 0cm 0cm 12pt" class="MsoNormal"><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　在此代码样例中潜伏着一个错误。如果此类用于单线程应用程序，不会有任何问题。但是，在多线程应用程序的情况中，不同的线程就有可能同时访问同一个</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Account </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">对象，比如说一个联合帐户的所有者在不同的</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> ATM </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">上同时进行访问。在这种情况下，存入和支出就可能以这样的方式发生：一个事务被另一个事务覆盖。这种情况将是灾难性的。但是，</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">Java </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">编程语言提供了一种简单的机制来防止发生这种覆盖。每个对象在运行时都有一个关联的锁。这个锁可通过为方法添加关键字</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> synchronized </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">来获得。这样，修订过的</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> Account </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">对象（如下所示）将不会遭受像数据损坏这样的错误：</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　对一个银行中的多项活动进行同步处理</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><o:p></o:p></span></p>
<div align="center">
<table style="border-bottom: #ffcc66 1pt outset; border-left: #ffcc66 1pt outset; width: 90%; background: #c9c9b8; border-top: #ffcc66 1pt outset; border-right: #ffcc66 1pt outset; mso-cellspacing: 1.5pt; mso-border-alt: outset #FFCC66 .75pt" class="MsoNormalTable" border="1" cellpadding="0" width="90%">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
            <td style="border-bottom: #ffcc66 1pt inset; border-left: #ffcc66 1pt inset; padding-bottom: 0.75pt; background-color: transparent; padding-left: 0.75pt; padding-right: 0.75pt; border-top: #ffcc66 1pt inset; border-right: #ffcc66 1pt inset; padding-top: 0.75pt; mso-border-alt: inset #FFCC66 .75pt">
            <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Arial; font-size: 9pt" lang="EN-US">public class Account {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">String holderName;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">float amount;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">public Account(String name, float amt) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">holderName = name;<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">amount = amt;<br />}<br /><br />public synchronized void deposit(float amt) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">amount += amt;<br />}<br /><br />public synchronized void withdraw(float amt) {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">amount -= amt;<br />}<br /><br />public float checkBalance() {<br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">return amount;<br />}<br />}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Arial; font-size: 9pt" lang="EN-US"><br /></span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">　　</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US">deposit() </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">和</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> withdraw() </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">函数都需要这个锁来进行操作，所以当一个函数运行时，另一个函数就被阻塞。请注意，</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> checkBalance() </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">未作更改，它严格是一个读函数。因为</span><span style="font-family: Arial; font-size: 9pt" lang="EN-US"> checkBalance() </span><span style="font-family: 宋体; font-size: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">未作同步处理，所以任何其他方法都不会阻塞它，它也不会阻塞任何其他方法，不管那些方法是否进行了同步处理</span></p><img src ="http://www.cppblog.com/luyulaile/aggbug/106437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2010-01-26 01:17 <a href="http://www.cppblog.com/luyulaile/archive/2010/01/26/106437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>joj 1092 To the Max 转帖Dp经典</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/09/89674.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Thu, 09 Jul 2009 10:37:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/09/89674.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/89674.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/09/89674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/89674.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/89674.html</trackback:ping><description><![CDATA[<div class=tit>[原创]POJ1050 To the Max 解题报告</div>
<div class=date>2006-04-17 11:55</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <div class="sysBr500 text" align=left>题目大意:<br><br>读入一个n*n的数组,比如&nbsp;<br><br>0&nbsp;-2&nbsp;-7&nbsp;0&nbsp;<br><br>9&nbsp;2&nbsp;-6&nbsp;2&nbsp;<br><br>-4&nbsp;1&nbsp;-4&nbsp;1&nbsp;<br><br>-1&nbsp;8&nbsp;0&nbsp;-2&nbsp;&nbsp;<br><br>从里面任意截取一个矩阵,使得矩阵所包含的数字的和最大.<br><br>截取出来的矩阵,和为15<br><br>9&nbsp;2&nbsp;<br><br>-4&nbsp;1&nbsp;<br><br>-1&nbsp;8&nbsp;<br><br>---------------------------------------------------------<br><br>POJ&nbsp;1050&nbsp;我的解题报告：<br><br>这个题目很经典的说，O（N^3）的DP。<br><br>首先偶们考察这样的题目，简化版：<br><br>已知一列数，求任意连续若干个数和的最大值。<br><br>SAMPLE：&nbsp;3&nbsp;2&nbsp;-6&nbsp;2&nbsp;-1&nbsp;7<br><br>原数3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;<br><br>处理3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8<br><br>因为是连续若干个自然数的和，那么，前面的某个数字取与不取的条件在于：以前面这个数字为结尾的连续数的和最大值是否大于0，如果大于0，那么这个数字必然要会出现在包括数字的序列中，否则无法做到最大。<br><br>所以，显然。处理的原则是maxn[i]=max{0,maxn[i-1]}+a[i];<br><br>由于无须记录位置。所以，可以直接用一个变量sum代替maxn数组。O(n)的扫描即可。<br><br>单列数字的问题解决了，下面我们考察多列数字的<br><br>sample:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;-2&nbsp;&nbsp;&nbsp;&nbsp;-7&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;-6&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;-4&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;-2&nbsp;<br><br><br><br>我们可以将多列数字转换成单列数字来做！&nbsp;可以这样设想，结果是一个长方形，我们把他压扁，使得宽为1。<br><br>引入辅助数组st,st[i][j]代表第i列从第1行开始的数字累加到第j行的值。那么，我们每次压扁的时候，就可以用st[i][j]-st[i][k-1]来表示第i列从第k个数字累加到第j个数字的值。达到压缩的效果。然后用上面单列数字的方法来做。算法时间复杂度O&nbsp;(N^3) <br><br>Source<br><br><br><br>Problem&nbsp;Id:1050&nbsp;&nbsp;User&nbsp;Id:galaxy&nbsp;<br><br>Memory:112K&nbsp;&nbsp;Time:0MS<br><br>Language:G++&nbsp;&nbsp;Result:Accepted<br><br><br><br>/*<br><br>&nbsp;&nbsp;Name:POJ&nbsp;1050&nbsp;<br><br>&nbsp;&nbsp;Copyright:&nbsp;flymouse@galaxy&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;Author:chenlei<br><br>&nbsp;&nbsp;Date:&nbsp;15-02-06&nbsp;07:36<br><br>&nbsp;&nbsp;Description:&nbsp;DP&nbsp;O(N^3)<br><br>*/<br><br>#include&nbsp;&lt;stdio.h&gt;<br><br>#include&nbsp;&lt;string.h&gt;<br><br>#define&nbsp;mt&nbsp;101<br><br>int&nbsp;main()<br><br>{<br><br>int&nbsp;a[mt][mt];<br><br>int&nbsp;st[mt][mt];<br><br>int&nbsp;p,k,n,i,j,sum,maxn;<br><br>//freopen("in.txt","r",stdin);<br><br>scanf("%d",&amp;n);<br><br>for&nbsp;(i=1;i&lt;=n;i++)<br><br>for&nbsp;(j=1;j&lt;=n;j++)<br><br>scanf("%d",&amp;a[i][j]);<br><br>memset(st,0,sizeof(st));<br><br>for&nbsp;(i=1;i&lt;=n;i++)<br><br>&nbsp;&nbsp;&nbsp;for&nbsp;(j=1;j&lt;=n;j++)<br><br>&nbsp;&nbsp;st[i][j]=st[i][j-1]+a[j][i];<br><br>&nbsp;&nbsp;maxn=0;<br><br>&nbsp;&nbsp;&nbsp;for&nbsp;(i=1;i&lt;=n;i++)<br><br>&nbsp;&nbsp;&nbsp;{<br><br>for&nbsp;(j=i;j&lt;=n;j++)<br><br>{<br><br>p=st[1][j]-st[1][i-1];<br><br>sum=p;<br><br>for&nbsp;(k=2;k&lt;=n;k++)<br><br>{<br><br>if&nbsp;(sum&gt;0)<br><br>sum+=st[k][j]-st[k][i-1];<br><br>else&nbsp;sum=st[k][j]-st[k][i-1];<br><br>if&nbsp;(sum&gt;p)&nbsp;p=sum;<br><br>}<br><br>if&nbsp;(p&gt;maxn)&nbsp;maxn=p;<br><br>}<br><br>&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;printf("%d\n",maxn);<br><br>&nbsp;&nbsp;&nbsp;return&nbsp;0;<br></div>
            原文地址：<a href="http://hi.baidu.com/flymouse/blog/item/fd1378f05c7ff7c37931aac3.html">http://hi.baidu.com/flymouse/blog/item/fd1378f05c7ff7c37931aac3.html</a></div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/luyulaile/aggbug/89674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-09 18:37 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/09/89674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串哈希</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/01/88990.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Wed, 01 Jul 2009 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/01/88990.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88990.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/01/88990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88990.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88990.html</trackback:ping><description><![CDATA[<p>这是第一种哈希函数，运行时间短，但内存占用多。哈希函数是怎么得到的？我也想知道。。。<br>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>#include&lt;math.h&gt;<br>struct abc<br>{<br>&nbsp;&nbsp;&nbsp; int boo;<br>&nbsp;&nbsp;&nbsp; char key[12];<br>}hash[1100005];<br>int const prime=999983;<br>double const gold=0.618033;<br>void insert(char a[],int k,int w)<br>{<br>&nbsp;&nbsp;&nbsp; if(hash[w].boo==0)<br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash[w].boo=k;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(hash[w].key,a,sizeof(hash[w].key));<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert(a,k,w%prime+1);&nbsp;&nbsp;&nbsp;&nbsp; <br>}<br>int find(int k,int w)<br>{<br>&nbsp;&nbsp;&nbsp; if(hash[w].boo==k)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n",hash[w].key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(hash[w].boo==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return find(k,w%prime+1);<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>}<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; freopen("in.txt","r",stdin);<br>&nbsp;&nbsp;&nbsp; char a[12],b[12];<br>&nbsp;&nbsp;&nbsp; scanf("%c",&amp;a[0]);<br>&nbsp;&nbsp;&nbsp; while(scanf("%s%s",a+1,b))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getchar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len=strlen(b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;len;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=k*26+b[i]-'a';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int w=int (prime*(k*gold-floor(k*gold)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert(a,k,w);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%c",&amp;a[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(a[0]=='\n')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; while(scanf("%s",&amp;a)==1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len=strlen(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;len;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=k*26+a[i]-'a';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int w=int (prime*(k*gold-floor(k*gold)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(find(k,w)==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("eh\n");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br>这是用书中提到的ELFhash()函数，也没体现出时间上的优势，但空间上确实是省了不少，可能是计算ELFhash()时浪费了时间吧，处理字符串哈希冲突的办法目前只发现了线形探测法，虽然不理想，但愿将来能发现别的办法。<br>ELFhash函数在UNIX系统V 版本4中的&#8220;可执行链接格式&#8221;( Executable and Linking Format，即ELF )中会用到，ELF文件格式用于存储可执行文件与目标文件。ELFhash函数是对字符串的散列。它对于长字符串和短字符串都很有效，字符串中每个字符都 有同样的作用，它巧妙地对字符的ASCII编码值进行计算，ELFhash函数对于能够比较均匀地把字符串分布在散列表中。<br>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>#include&lt;math.h&gt;<br>#define MOD 300005<br>struct abc<br>{<br>&nbsp;&nbsp;&nbsp; bool boo;<br>&nbsp;&nbsp;&nbsp; char akey[12];<br>&nbsp;&nbsp;&nbsp; char bkey[12];<br>}hash[300005];</p>
<p>int ELFhash(char *key)<br>{ <br>&nbsp;&nbsp;&nbsp; unsigned long h=0;<br>&nbsp;&nbsp;&nbsp; while(*key)<br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h=(h&lt;&lt;4)+*key++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long g=h&amp;0Xf0000000L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(g) h^=g&gt;&gt;24;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h&amp;=~g;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return h%MOD;<br>}<br>void insert(char a[],char b[],int w)<br>{<br>&nbsp;&nbsp;&nbsp; if(!hash[w].boo)<br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash[w].boo=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(hash[w].akey,a,sizeof(hash[w].akey));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(hash[w].bkey,b,sizeof(hash[w].bkey));<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert(a,b,w+1);&nbsp;&nbsp;&nbsp;&nbsp; <br>}<br>int find(char b[],int w)<br>{<br>&nbsp;&nbsp;&nbsp; if(hash[w].boo &amp;&amp; strcmp(hash[w].bkey,b)==0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n",hash[w].akey);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!hash[w].boo)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return find(b,w+1);<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>}<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; char a[12],b[12];<br>&nbsp;&nbsp;&nbsp; scanf("%c",&amp;a[0]);<br>&nbsp;&nbsp;&nbsp; while(scanf("%s%s",a+1,b))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getchar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int w=ELFhash(b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert(a,b,w);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%c",&amp;a[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(a[0]=='\n')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; while(scanf("%s",&amp;b)==1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int w=ELFhash(b);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(find(b,w)==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("eh\n");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/cugbliang/archive/2008/05/30/2497539.aspx">http://blog.csdn.net/cugbliang/archive/2008/05/30/2497539.aspx</a></p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-01 14:29 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/01/88990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>哈希表 poj 3320 Jessica's Reading Problem</title><link>http://www.cppblog.com/luyulaile/archive/2009/07/01/88982.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Wed, 01 Jul 2009 05:00:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/07/01/88982.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88982.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/07/01/88982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88982.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88982.html</trackback:ping><description><![CDATA[<p>poj 3320 Jessica's Reading Problem <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3320">http://acm.pku.edu.cn/JudgeOnline/problem?id=3320</a><br>这道题目可以用哈希表法也可以用二分查找法，现在用哈希，二分查找将在后面的博客中推出。<br>这道题目用到的是数的哈希，对于不需要删除的字典，哈希表是一种理想的实现方式。<br>1.哈希表的插入和查找算法<br>(1)计算函数值h(k)<br>(2)从槽h(k)开始，使用冲突解决策略定位包含关键码k的纪录<br>(3)如果需要插入，再槽内插入即可<br>两种操作的复杂度在忽略冲突时是O(1)<br>2.哈希函数的选取<br>本题使用最简单的直接取余法，除数为PRIME，最好是质数，可减小冲突。<br>3.冲突解决方法<br>开散列法（这也是大多数情况下使用的）<br>开散列法也叫拉链法，通俗地说就是&#8220;既然元素a和b都该放在里面，只好挤一挤了&#8221;。即在每个槽里存放所有该放在里面的元素。那么怎么把很多的元素放在槽里呢？只在槽里放一个链表表头就行了，该链表中包含所有该放在槽里的元素。但在实际中并不是这样做的，而是自己维护一个大数组，给链表元素分配数组下标，这样既方便又节省时间和空间。那么链表中的元素的排列顺序怎样呢？如果按照查找成功时的效率，显然可以按照访问的频率；而如果按照查找失败的效率，则可以按照关键值排序，即使查找失败也不需要遍历整个链表。这就是数据结构中的相互矛盾的两个问题，应根据实际情况协调。<br>#include&lt;stdio.h&gt;<br>#define PRIME 99991<br>struct hashnode<br>{<br>&nbsp;&nbsp;&nbsp; int key;<br>&nbsp;&nbsp;&nbsp; int num;<br>&nbsp;&nbsp;&nbsp; int next;<br>}a[1000005];<br>int b[1000005];<br>int hashl;<br>int hash(int num)<br>{<br>&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp; i=num%PRIME;<br>&nbsp;&nbsp;&nbsp; while(a[i].next!=-1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(num&gt;a[a[i].next].key)&nbsp;&nbsp;&nbsp;&nbsp; //例如hash表中已有8，后面又插入99999时，那么99999&gt;8,需要给99999重新分配&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个下标，即hashl，即前面提到的开散列法解决冲突<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(num==a[a[i].next].key)&nbsp;&nbsp;&nbsp; //例如hash表中已有8，后面又插入8时，这是只要num++<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a[i].next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=a[i].next;&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; //这句用于查找，如果哈希表中已有8和99999，那么你要找8时a[8].next指向的是较大的99999，那么你就必须沿着next走下去，因为这个所谓的链表是按减小的顺序排序的。最终走到return a[i].next推出while 循环<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; a[hashl].key=num;<br>&nbsp;&nbsp;&nbsp; a[hashl].next=-1;<br>&nbsp;&nbsp;&nbsp; a[hashl].num=0;<br>&nbsp;&nbsp;&nbsp; a[hashl].next=a[i].next;<br>&nbsp;&nbsp;&nbsp; a[i].next=hashl;<br>&nbsp;&nbsp;&nbsp; hashl++;&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; //以上6行用于第一次插入元素（即while循环未执行）或while循环break退出的插入<br>&nbsp;&nbsp;&nbsp; return hashl-1;<br>}</p>
<p>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int n,i,tmp,left,ans;<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;PRIME;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[i].next=-1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hashl=PRIME;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ans=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;b[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=hash(b[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[tmp].num++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;b[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=hash(b[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[tmp].num++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(a[tmp].num&lt;=1)&nbsp;&nbsp;&nbsp;&nbsp; //插入的数字以前没有出现过，肯定包含在ans里<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ans=i-left+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //对应于if的else,即a[tmp].num&gt;=2，即插入的数字以前出现过。如果是在left位置出现过，则left右移；如果是在&#8220;left右边，i左边&#8221;出现过，则说明目前的i-left+1和ans都可以包括全部的知识点，当然取小的了！&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=hash(b[left]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(a[tmp].num&lt;=1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[tmp].num--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ans&gt;i-left+1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ans=i-left+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",ans);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/cugbliang/archive/2008/06/01/2497376.aspx">http://blog.csdn.net/cugbliang/archive/2008/06/01/2497376.aspx</a></p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-07-01 13:00 <a href="http://www.cppblog.com/luyulaile/archive/2009/07/01/88982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>石子合并问题</title><link>http://www.cppblog.com/luyulaile/archive/2009/06/30/88923.html</link><dc:creator>luis</dc:creator><author>luis</author><pubDate>Tue, 30 Jun 2009 12:12:00 GMT</pubDate><guid>http://www.cppblog.com/luyulaile/archive/2009/06/30/88923.html</guid><wfw:comment>http://www.cppblog.com/luyulaile/comments/88923.html</wfw:comment><comments>http://www.cppblog.com/luyulaile/archive/2009/06/30/88923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luyulaile/comments/commentRss/88923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luyulaile/services/trackbacks/88923.html</trackback:ping><description><![CDATA[<p>转帖<br>在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆，并将新的一堆石子数记为该次合并的得分。试设计一个算法，计算出将n堆石子合并成一堆的最小得分和最大得分。&nbsp; <br>&nbsp;<br>&nbsp; <br>假设有n堆石子需要合并,可以设计一个2*n-1个元素的数组来存储每堆石子的个数。 <br>分析最优解的结构：假设有石头AiAi+1&#8230;&#8230;Aj需要合并,简记为A[i,j].如果设最后一次合并发生在Ak与Ak+1之间(i&lt;=k&lt;j),则最后一个合并的得分为Ai&#8230;&#8230;Aj堆石头的个数的总和记为totalValue(i,j).(不管你最后一次合并发生在哪个位置,totalValue(i,j)的值都是一样的)因此总的得分等于A[i,k]的得分加上A[k+1,j]的得分再加上totalValue(i,j). <br>可以假设计算A[0,n-1]的一个最优次序所包含的计算子链A[0,k]和A[K+1,n-1]的次序也是最优的. <br>&nbsp;证明: <br>&nbsp;假设存在一个比计算A[0,k]的次序得分更少的次序,则用此次序来替换原来计算A[0,k]的次序,那么此时计算A[0,n-1]次序的得分就会比最优次序所得到的分数更少,这与假设相矛盾;同理可证明:计算A[0,n-1]的一个最优次序所包含的另一个计算子链A[k+1,n-1]的次序也是最优的! </p>
<p>综上所述,此题满足最优子结构性质,因此可以用动态规划算法来求解. <br>建立递归关系 <br>设m[i][j]表示A[i,j]的计算结果. <br>当i=j时,表示只有一堆石头,不能合并,因此得分为零,所以m[i,j]=0; <br>当i&lt;j时,可利用最优子结构性质来计算m[i][j], <br>m[i,j]=m[i,k]+m[k+1,j]+totalValue(i,j)(i&lt;=k&lt;j) </p>
<p>可用矩阵连乘的最优计算次序问题来求解这题.可选用自顶向下的备忘录算法或是自底向上的动态规划算法. </p>
<p>以下代码使用动态规划算法:</p>
<p>void MatrixChain(int *p,int n,int **m,int flag) //矩阵连乘算法 <br>{ <br>for(int i=0;i&lt;n;i++) <br>m[i][i]=0; <br>for(int r=2;r&lt;n;r++) <br>for(int i=0;i&lt;n-r+1;i++) <br>{ <br>int j=i+r-1; <br>int temp=totalValue(i,j,p); <br>m[i][j]=m[i+1][j]+temp; <br>for(int k=i+1;k&lt;j;k++) <br>{ <br>int t=m[i][k]+m[k+1][j]+temp; <br>if(!flag) //求最小得分 <br>{ <br>&nbsp;if(t&lt;m[i][j]) <br>&nbsp;m[i][j]=t; <br>} <br>else //求最大得分 <br>if(t&gt;m[i][j]) <br>m[i][j]=t; <br>} <br>} <br>} <br>MatrixChain(inputNum,2*n-1,m,0); //计算最小得分 <br>int resultMin=m[0][n-1]; <br>for(i=1;i&lt;=n-1;i++) <br>if(resultMin&gt;m[i][n-1+i]) <br>resultMin=m[i][n-1+i]; </p>
<p>MatrixChain(inputNum,2*n-1,m,1); //计算最大得分 <br>int resultMax=m[0][n-1]; <br>for(i=1;i&lt;=n-1;i++) <br>if(resultMax&lt;m[i][n-1+i]) <br>resultMax=m[i][n-1+i];&nbsp; <br>&nbsp;<br>&nbsp;<br>&nbsp; </p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/lyflower/archive/2008/03/05/2150239.aspx">http://blog.csdn.net/lyflower/archive/2008/03/05/2150239.aspx</a></p>
<p><font color=#002c99>一．试题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个园形操场的四周摆放N堆石子（N&#8804;100），现要将石子有次序地合并成一堆。规定<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每次只能选相邻的两堆合并成新的一堆，并将新的一堆的石子数，记为该次合并的得分。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编一程序，由文件读入堆数N及每堆的石子数（&#8804;２０），<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ①选择一种合并石子的方案，使得做N－1次合并，得分的总和最小；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ②选择一种合并石子的方案，使得做N－1次合并，得分的总和最大。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，所示的４堆石子，每堆石子数（从最上面的一堆数起，顺时针数）依<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 次为４５９４。则３次合并得分总和最小的方案：８＋１３＋２２＝４３<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 得分最大的方案为：１４＋１８＋２２＝５４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入数据：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件名由键盘输入，该文件内容为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一行为石子堆数N；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二行为每堆的石子数，每两个数之间用一个空格符分隔。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出数据：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出文件名为output.txt<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从第1至第N行为得分最小的合并方案。第N＋1行是空行。从第N＋2行到第2N＋1行是得<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分最大合并方案。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每种合并方案用N行表示，其中第i行（1&#8804;i&#8804;N）表示第i 次合并前各堆的石子数（依<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顺时针次序输出，哪一堆先输出均可）。 要求将待合并的两堆石子数以相应的负数表示，以便标识。</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入输出范例：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入文件内容：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ４ ５９ ４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出文件内容：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －４ ５ ９ －４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －８－５ ９<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －１３ －９<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ２２<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ４ －５ －９ ４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ４ －１４ －４ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －４－１８<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ２２ </font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二．算法分析<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 竞赛中多数选手都不约而同地采用了尽可能逼近目标的贪心法来逐次合并：从最上面<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的一堆开始，沿顺时针方向排成一个序列。 第一次选得分最小（最大）的相邻两堆合并，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 形成新的一堆；接下来，在N－1堆中选得分最小（最大）的相邻两堆合并&#8230;&#8230;，依次类推，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 直至所有石子经N－1次合并后形成一堆。</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如有６堆石子，每堆石子数（从最上面一堆数起，顺时针数）依次为３ ４６ ５ ４ ２ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要求选择一种合并石子的方案，使得做５次合并，得分的总和最小。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按照贪心法，合并的过程如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每次合并得分<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一次合并 ３ ４ ６ ５ ４ ２ -&gt;５<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二次合并 ５ ４ ６ ５ ４&nbsp;&nbsp;&nbsp; -&gt;９<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三次合并 ９ ６ ５ ４&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;９<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第四次合并 ９ ６ ９&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;１５<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第五次合并 １５ ９&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;２４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总得分＝５＋９＋９＋１５＋２４＝６２</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是当我们仔细琢磨后，可得出另一个合并石子的方案：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每次合并得分<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一次合并 ３ ４ ６ ５ ４ ２&nbsp; -&gt;７<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二次合并 ７ ６ ５ ４ ２&nbsp;&nbsp;&nbsp;&nbsp; -&gt;１３<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三次合并 １３ ５ ４ ２&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;６<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第四次合并 １３ ５ ６&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;１１<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第五次合并 １３ １１&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;２４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总得分＝７＋６＋１１＋１３＋２４＝６１<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显然，后者比贪心法得出的合并方案更优。 题目中的示例故意造成一个贪心法解题的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假像，诱使读者进入&#8220;陷阱&#8221;。为了帮助读者从这个&#8220;陷阱&#8221;里走出来， 我们先来明确一个问题：</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; １．最佳合并过程符合最佳原理<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用贪心法至所以可能出错， <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是因为每一次选择得分最小（最大）的相邻两堆合并，不一定保证余下的合并过程能导致最优解。聪明的读者马上会想到一种理想的假设：如果N－1次合并的全局最优解包含了每一次合并的子问题的最优解，那么经这样的N－1次合并后的得分总和必然是最优的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如上例中第五次合并石子数分别为１３和１１的相邻两堆。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两堆石头分别由最初的第１，２，３堆（石头数分别为３，４，６）和第４，５，６堆（石头数分别为５，４，２）经４次合并后形成的。于是问题又归结为如何使得这两个子序列的N－2 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 次合并的得分总和最优。为了实现这一目标，我们将第１个序列又一分为二：第１、２堆构成子序列１，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第３堆为子序列２。第一次合并子序列１中的两堆，得分７； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二次再将之与子序列２的一堆合并，得分１３。显然对于第１个子序列来说，这样的合并方案是最优的。同样，我们将第２个子序列也一分为二；第４堆为子序列１，第５，６堆构成子序列２。第三次合并子序列２中的２堆，得分６；第四次再将之与子序列１中的一堆合并，得分１３。显然对于第二个子序列来说，这样的合并方案也是最优的。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由此得出一个结论──６堆石子经<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过这样的５次合并后，得分的总和最小。我们把每一次合并划分为阶段，当前阶段中计算出的得分和作为状态， <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如何在前一次合并的基础上定义一个能使目前得分总和最大的合并方案作为一次决策。很显然，某阶段的状态给定后，则以后各阶段的决策不受这阶段以前各段状态的影响。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种无后效性的性质符最佳原理，因此可以用动态规划的算法求解。</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ２．动态规划的方向和初值的设定<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用动态规划求解的关键是确定所有石子堆子序列的最佳合并方案。 这些石子堆子序列包括：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ｛第１堆、第２堆｝、｛第２堆、第３堆｝、&#8230;&#8230;、｛第N堆、第１堆｝；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ｛第１堆、第２堆、第３堆｝、｛第２堆、第３堆、第４堆｝、&#8230;&#8230;、｛第N堆、第１堆、第２堆｝；&#8230;&#8230;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ｛第１堆、&#8230;&#8230;、第N堆｝｛第１堆、&#8230;&#8230;、第N堆、第１堆｝&#8230;&#8230;｛第N堆、第１堆、&#8230;&#8230;、第N－１堆｝</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了便于运算，我们用〔i，j〕表示一个从第i堆数起，顺时针数j堆时的子序列｛第i堆、第i＋１堆、&#8230;&#8230;、第（i＋j－1）mod n堆｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它的最佳合并方案包括两个信息：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ①在该子序列的各堆石子合并成一堆的过程中，各次合并得分的总和；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ②形成最佳得分和的子序列１和子序列２。由于两个子序列是相邻的， 因此只需记住子序列１的堆数；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔i，j〕──将子序列〔i，j〕中的j堆石子合并成一堆的最佳得分和；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔i，j〕──将〔i，j〕一分为二，其中子序列１的堆数；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （１&#8804;i&#8804;N，１&#8804;j&#8804;N）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显然，对每一堆石子来说，它的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔i，１〕＝０ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔i，１〕＝０ （１&#8804;i&#8804;N）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于子序列〔i，j〕来说，若求最小得分总和，f〔i，j〕的初始值为&#8734;； 若求最大得分总和，f〔i，j〕的初始值为０。（１&#8804;i&#8804;N，２&#8804;j&#8804;N）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 动态规划的方向是顺推(即从上而下)。先考虑含二堆石子的N个子序列（各子序列分别从第１堆、第２堆、&#8230;&#8230;、第N堆数起，顺时针数２堆）的合并方案<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，２〕，f〔２，２〕，&#8230;&#8230;，f〔N，２〕<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔１，２〕，c〔２，２〕，&#8230;&#8230;，c〔N，２〕<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后考虑含三堆石子的Ｎ个子序列（各子序列分别从第１堆、第２堆、&#8230;&#8230;、第Ｎ堆数起，顺时针数３堆）的合并方案<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，３〕，f〔２，３〕，&#8230;&#8230;，f〔N，３〕<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔１，３〕，c〔２，３〕，&#8230;&#8230;，c〔N，３〕<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 依次类推，直至考虑了含N堆石子的N个子序列（各子序列分别从第１堆、第２堆、 &#8230;&#8230;、第N堆数起，顺时针数N堆）的合并方案<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，N〕，f〔２，N〕，&#8230;&#8230;，f〔N，N〕<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔１，N〕，c〔２，N〕，&#8230;&#8230;，c〔N，N〕<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，在子序列〔１，N〕，〔２，N〕，&#8230;&#8230;，〔N，N〕中，选择得分总和（f值）最小（或最大）的一个子序列〔i，N〕（１&#8804;i&#8804;N），由此出发倒推合并过程。</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ３．动态规划方程和倒推合并过程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对子序列〔i，j〕最后一次合并，其得分为第i堆数起，顺时针数j堆的石子总数t。被合并的两堆石子是由子序列〔i，k〕和〔（i＋k－１）mod <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n＋１，j－k〕（１&#8804;k&#8804;j－１）经有限次合并形成的。为了求出最佳合并方案中的k值，我们定义一个动态规划方程：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当求最大得分总和时<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔i，j〕＝max｛f〔i，k〕＋f〔x，j-k〕＋t｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; １&#8804;k&#8804;j－１<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔i，j〕＝k│ f〔i，j〕＝f〔i，k〕＋f〔x，j-k〕＋t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （２&#8804;ｊ&#8804;ｎ，１&#8804;ｉ&#8804;ｎ）</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当求最小得分总和时<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔i，j〕＝min｛f〔i，k〕＋f〔x，j－k〕＋t｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; １&#8804;k&#8804;j－１<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔i，j〕＝k│ f〔i，j〕＝f〔i，k〕＋f〔x，j-k〕＋t <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （２&#8804;ｊ&#8804;ｎ，１&#8804;ｉ&#8804;ｎ）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中x＝（i＋k－１）modn＋１，即第i堆数起，顺时针数k＋１堆的堆序号。</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如对上面例子中的６(３ ４ ６ ５ ４ ２ )堆石子，按动态规划方程顺推最小得分和。 依次得出含二堆石子的６个子序列的合并方案<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，２〕＝７ f〔２，２〕＝１０ f〔３ ，２〕＝１１ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔１，２〕＝１ c〔２，２〕＝１ c〔３，２〕＝１<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔４，２〕＝９ f〔５，２〕＝６ f〔６，２〕＝５<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔４，２〕＝１ c〔５， ２〕＝１ c〔６，２〕＝１</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含三堆石子的６(３ ４ ６ ５ ４ ２ )个子序列的合并方案<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，３〕＝２０ f〔２，３〕＝２５ f〔３，３〕＝２４ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔１，３〕＝２ c〔２，３〕＝２ c〔３，３〕＝１<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔４，３〕＝１７ f〔５，３〕＝１４ f〔６，３〕＝１４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔４，３〕＝１ c〔５，３〕＝１ c〔６，３〕＝２</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含四堆石子的６(３ ４ ６ ５ ４ ２ )个子序列的合并方案<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，４〕＝３６ f〔２，４〕＝３８ f〔３，４〕＝３４<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔１，４〕＝２ c〔２，４〕＝２ c〔３，４〕＝１<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔４，４〕＝２８ f〔５，４〕＝２６ f〔６，４〕＝２９<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔４，４〕＝１ c〔５，４〕＝２ c〔６，４〕＝３</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含五堆石子的６(３ ４ ６ ５ ４ ２ )个子序列的合并方案<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，５〕＝５１ f〔２，５〕＝４８ f〔３，５〕＝４５ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔１，５〕＝３ c〔２，５〕＝２ c〔３，５〕＝２ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔４，５〕＝４１ f〔５，５〕＝４３ f〔６，５〕＝４５<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔４，５〕＝２ c〔５，５〕＝３ c〔６，５〕＝３</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含六堆石子的６(３ ４ ６ ５ ４ ２ )个子序列的合并方案<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，６〕＝６１ f〔２，６〕＝６２ f〔３，６〕＝６１ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔１，６〕＝３ c〔２，６〕＝２ c〔３，６〕＝２ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔４，６〕＝６１ f〔５，６〕＝６１ f〔６，６〕＝６２<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c〔４，６〕＝３ c〔５，６〕＝４ c〔６，６〕＝３</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f〔１，６〕是f〔１，６〕，ｆ〔２，６〕，&#8230;&#8230;f〔６，６〕中的最小值，表明最小得分和是由序列〔１，６〕经５次合并得出的。我们从这个序列出发， <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按下述方法倒推合并过程：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由c〔１，６〕＝３可知，第５次合并的两堆石子分别由子序列〔１，３〕和子序列〔４，3〕经４次合并后得出。其中c〔１，３〕＝２可知由子序列〔１，３〕合并成的一堆石子是由子序列〔１，２〕和第三堆合并而来的。而c〔１，２〕＝１，以表明了子序列〔１，２〕的合并方案是第１堆合并第２堆。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由此倒推回去，得出第１，第２次合并的方案，每次合并得分 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一次合并 ３ ４ ６&#8230;&#8230; 　　　-&gt;７<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二次合并 ７ ６&#8230;&#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;１３<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; １３&#8230;&#8230; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子序列〔１，３〕经２次合并后合并成１堆， ２次合并的得分和＝７＋１３＝２０。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ｃ〔４，３〕＝１，可知由子序列〔４，３〕合并成的一堆石子是由第４堆和子序列〔５，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ２〕合并而来的。而c〔５，２〕＝１，又表明了子序列〔５，２〕的合并方案是第５堆合并第６堆。由此倒推回去，得出第３、第４次合并的方案 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每次合并得分：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三次合并 &#8230;&#8230;５４ ２&nbsp;&nbsp;&nbsp;&nbsp; -&gt;６ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第四次合并 &#8230;&#8230;５ ６&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;１１ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;１１ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子序列〔４，３〕经２次合并后合并成１堆，２次合并的得分和＝６＋１１＝１７。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第五次合并是将最后两堆合并成１堆，该次合并的得分为２４。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显然，上述５次合并的得分总和为最小<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ２０＋１７＋２４＝６１</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上述倒推过程，可由一个print（〔子序列〕）的递归算法描述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; procedure print （〔i，ｊ〕）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ｊ〈〉１ then ｛继续倒推合并过程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔i，c〔i，j〕〕；｛倒推子序列１的合并过程｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔i＋c〔i，j〕－１〕mod n＋１，j－c〔i，j〕）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ｛倒推子序列２的合并过程｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for K：＝１ to N do｛输出当前被合并的两堆石子｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if （第K堆石子未从圈内去除）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if（K＝i）or（K＝X）then置第K堆石子待合并标志<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else第K堆石子未被合并；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end；｛then｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第i堆石子数&#8592;第i堆石子数＋第X堆石子数；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将第X堆石子从圈内去除；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end；｛then｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end；｛print｝<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，调用print（〔１，６〕）后的结果如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔１，６〕）⑤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ┌──────┴──────┐<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔１，３〕）②&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔４，３〕）④<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ┌─────┴─────┐&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ┌─────┴─────┐<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(〔１，２〕)① print(〔3，1〕)&nbsp;&nbsp;&nbsp;&nbsp; print(〔4，1〕) print(〔５，２〕)③<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ┌──────┴──────┐&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ┌──────┴──────┐&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔1,1〕）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔2,1〕）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔5,1〕）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print（〔6,1〕） <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （图6.2-5）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中回溯至<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ① 显示 ３ ４６ ５ ４ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ② 显示 ７ ６５ ４ ２ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ③ 显示 １３ ５４ ２<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ④ 显示 １３５ ６<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ⑤ 显示 １３ １１<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注:调用print过程后，应显示６堆石子的总数作为第５次合并的得分。</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Program Stones;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node = Record{当前序列的合并方案}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c : Longint;{得分和}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d : Byte{子序列1的堆数}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SumType = Array [1..100,1..100] of Longint;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {sumtype[i,j]-子序列[i,j]的石子总数}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Var<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List : Array [1..100,1..100] of Node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {list[i,j]-子序列[i,j]的合并方案}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date, Dt : Array [1..100] of Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {Date[i]-第i堆石子数,Dt-暂存Date}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sum : ^SumType;{sum^[i,j]-指向子序列[i,j]的石子总数的指针}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F : Text;{文件变量}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fn : String;{文件名串}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N, i, j : Integer;{N-石子堆数,i,j-循环变量}</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Procedure Print(i, j : Byte);{递归打印子序列[i,j]的合并过程}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Var<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k, x : Shortint;{k-循环变量;x-子序列2中首堆石子的序号}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If j &lt;&gt; 1 Then Begin{继续倒推合并过程}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print(i, List[i,j].d);{倒推子序列1的合并过程}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x := (i + List[i, j].d - 1) Mod N + 1;{求子序列2中首堆石子的序号}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print(x, j - List[i, j].d);{倒推子序列2的合并过程}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For k := 1 to N Do{输出当前合并第i堆,第x堆石子的方案}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Date[k] &gt; 0 Then Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (i= k)or(x=k)Then Write(F, - Date[k], ' ')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else Write(F, Date[k], ' ')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End; { Then }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writeln(F);{输出换行符}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date[i] := Date[i] + Date[x];{原第i堆和第x堆合并成第ｉ堆}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date[x] := - Date[x]{将原第x堆从圈内去除}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End { Then }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End; { Print }</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Procedure Main(s : Shortint);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Var<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i, j, k : Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t, x : Longint;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i := 1 to N Do Begin{仅含一堆石子的序列不存在合并}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List[i, 1].c := 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List[i, 1].d := 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End; {For}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For j := 2 to N Do{顺推含2堆,含3堆&#8230;&#8230;含N堆石子的各子序列的合并方案}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i := 1 to N Do Begin{当前考虑从第i堆数起,顺时针数j堆的子序列}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If s = 1 Then List[i, j].c := Maxlongint{合并[i,j]子序列的得分和初始化}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else List[i, j].c := 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t := Sum^[i, j];{最后一次合并的得分为[i,j]子序列的石子总数}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For k := 1 to j - 1 Do Begin{子序列1的石子堆数依次考虑1堆&#8230;&#8230;j-1堆}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x := (i + k - 1) Mod N + 1;{求子序列2首堆序号}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (s=1) And (List[i,k].c + List[x,j-k].c+t &lt; List[i, j].c)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Or (s=2) And (List[i,k].c + List[x,j-k].c+t &gt; List[i, j].c)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 若该合并方案为目前最佳,则记下}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Then Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List[i, j].c := List[i, k].c + List[x, j - k].c + t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List[i, j].d := k<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End { Then }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End { For }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End; { For }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {在子序列[1,N],[2,N],&#8230;&#8230;,[N, N]中选择得分总和最小(或最大)的一个子序列}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k := 1; x := List[1, N].c;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i := 2 to N Do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (s = 1) And (List[i, N].c &lt; x) Or (s = 2) And<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (List[i, N].c &gt; x) Then Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k := i; x := List[i, N].c<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End; { Then }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print(k, N);{由此出发,倒推合并过程}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writeln(F, Sum^[1, N]);{输出最后一次将石子合并成一堆的石子总数}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writeln(F);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writeln(list[k, N].c)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End; { Main }</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write('File name = ');{输入文件名串}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Readln(Fn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assign(F, Fn);{该文件名串与文件变量连接}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset(F);{文件读准备}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Readln(F, N);{读入石子堆数}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i := 1 to N Do Read(F, Date[i]);{读入每堆石子数}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; New(Sum);{求每一个子序列的石子数sum}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i := 1 to N Do Sum^[i, 1] := Date[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For j := 2 to N Do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i := 1 to N Do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sum^[i, j] := Date[i] + Sum^[i Mod N + 1, j - 1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dt := Date;{暂存合并前的各堆石子,结构相同的变量可相互赋值}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Close(F);{关闭输入文件}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assign(F, 'OUTPUT.TXT');{文件变量与输出文件名串连接}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rewrite(F);{文件写准备}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Main(1);{求得分和最小的合并方案}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date := Dt;{恢复合并前的各堆石子}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Main(2);{求得分和最大的合并方案}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Close(F){关闭输出文件}</font></p>
<p><font color=#002c99></font>&nbsp;</p>
<p><font color=#002c99>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/lyflower/archive/2008/03/05/2150251.aspx">http://blog.csdn.net/lyflower/archive/2008/03/05/2150251.aspx</a></font></p>
<img src ="http://www.cppblog.com/luyulaile/aggbug/88923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luyulaile/" target="_blank">luis</a> 2009-06-30 20:12 <a href="http://www.cppblog.com/luyulaile/archive/2009/06/30/88923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>