﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>f(Program,Poet)=Programet &#187; 程序</title>
	<atom:link href="http://blog.programet.org/category/computer/programs/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.programet.org</link>
	<description>f(诗,程序)=诗序=思绪 &#124; 记载我们自己的生活</description>
	<lastBuildDate>Tue, 07 Feb 2012 16:00:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Haskell随手笔记：infinite list</title>
		<link>http://blog.programet.org/2011/12/haskell%e9%9a%8f%e6%89%8b%e7%ac%94%e8%ae%b0%ef%bc%9ainfinite-list.html</link>
		<comments>http://blog.programet.org/2011/12/haskell%e9%9a%8f%e6%89%8b%e7%ac%94%e8%ae%b0%ef%bc%9ainfinite-list.html#comments</comments>
		<pubDate>Tue, 06 Dec 2011 17:01:21 +0000</pubDate>
		<dc:creator>严酷的魔王</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4818</guid>
		<description><![CDATA[为了与寺雷颠保持一致，这是一个不知道什么时候就会太监的系列。——题记 其实这一切的开端都是Mgccl大牛作祟。在他的各种代码影响下，我就萌生了接触一点函数式编程的念头。其实还有一个原因便是我现在经常使用R语言做统计作业，但是R语言实际上是S语言的继承。本来S语言是一个函数式编程的语言，但是R这么一继承就变得有些不伦不类的……所以我也怀着“了解了函数式编程就能更好地学会R了吧！！”的情绪。最后，Haskell这个名字依然在三年前的《让我们比比长短》一文中出现了，这里函数式编程给我留下了各种深刻的印象。 Haskell有两本可以在线看的教材：《Real World Haskell》和《Learn You a Haskell》两本。它们应该算是基础教材了吧，也就是让你能够初步接触Haskell。然后还有一个介绍内置函数的pdf。 我用的是WindowsXP（你们不要斜眼看过来！），于是首先去Haskell的官网下载了GHC(应该算是一个运行环境？命令行式的)。然后它会自动修改你的环境变量，于是新建一个后缀名为.hs的文件便会自动调用GHC载入代码。 ——————胡言乱语的分割线—————— Haskell里面没有循环，但是我们可以用递归来实现它。比如下面这段计算斐波那契数列的C代码： f&#91;0&#93;=1; f&#91;1&#93;=1; for &#40;i=2;i&#60;n;i++&#41; f&#91;i&#93;=f&#91;i-1&#93;+f&#91;i-2&#93;; 可以在haskell里面用递归的形式这样写： fib n = lst 1 1 n where lst a b c = if c&#60;2 then a else lst &#40;a+b&#41; a &#40;c-1&#41; 但是鉴于Mgccl大牛对elegance的追求，以及haskell一个很神奇的特质，我们可以用&#8221;infinite list&#8221;来一句话实现这个操作： fib n = fibs !! n where fibs = 0 : 1 : zipWith [...]
相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
<li><a href='http://blog.programet.org/2009/12/%e6%99%92%ef%bc%9ac%e8%af%ad%e8%a8%80%e6%9c%9f%e4%b8%ad%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a.html' rel='bookmark' title='晒：C语言期中实验报告'>晒：C语言期中实验报告</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>为了与寺雷颠保持一致，这是一个不知道什么时候就会太监的系列。——题记</p>
<p><span id="more-4818"></span></p>
<p>其实这一切的开端都是Mgccl大牛作祟。在他的各种代码影响下，我就萌生了接触一点函数式编程的念头。其实还有一个原因便是我现在经常使用R语言做统计作业，但是R语言实际上是S语言的继承。本来S语言是一个函数式编程的语言，但是R这么一继承就变得有些不伦不类的……所以我也怀着“了解了函数式编程就能更好地学会R了吧！！”的情绪。最后，Haskell这个名字依然在三年前的<a href="http://blog.programet.org/2008/10/blog-post_21-3.html">《让我们比比长短》</a>一文中出现了，这里函数式编程给我留下了各种深刻的印象。</p>
<p>Haskell有两本可以在线看的教材：<a href="http://book.realworldhaskell.org/read/">《Real World Haskell》</a>和<a href="http://learnyouahaskell.com/chapters">《Learn You a Haskell》</a>两本。它们应该算是基础教材了吧，也就是让你能够初步接触Haskell。然后还有一个介绍内置函数的<a href="http://dou.bz/43hPBj">pdf</a>。</p>
<p>我用的是WindowsXP（你们不要斜眼看过来！），于是首先去Haskell的官网下载了GHC(应该算是一个运行环境？命令行式的)。然后它会自动修改你的环境变量，于是新建一个后缀名为.hs的文件便会自动调用GHC载入代码。</p>
<p>——————胡言乱语的分割线——————</p>
<p>Haskell里面没有循环，但是我们可以用递归来实现它。比如下面这段计算斐波那契数列的C代码：</p>

<div class="wp_codebox"><table><tr id="p48186"><td class="code" id="p4818code6"><pre class="c" style="font-family:monospace;">f<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
f<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>n<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	f<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>f<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span>f<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>可以在haskell里面用递归的形式这样写：</p>

<div class="wp_codebox"><table><tr id="p48187"><td class="code" id="p4818code7"><pre class="haskell" style="font-family:monospace;">fib n <span style="color: #339933; font-weight: bold;">=</span> lst <span style="color: red;">1</span> <span style="color: red;">1</span> n 
	<span style="color: #06c; font-weight: bold;">where</span> lst a b c <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">if</span> c<span style="color: #339933; font-weight: bold;">&lt;</span><span style="color: red;">2</span> <span style="color: #06c; font-weight: bold;">then</span> a 
				 <span style="color: #06c; font-weight: bold;">else</span> lst <span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">+</span>b<span style="color: green;">&#41;</span> a <span style="color: green;">&#40;</span>c<span style="color: #339933; font-weight: bold;">-</span><span style="color: red;">1</span><span style="color: green;">&#41;</span></pre></td></tr></table></div>

<p>但是鉴于Mgccl大牛对elegance的追求，以及haskell一个很神奇的特质，我们可以用&#8221;infinite list&#8221;来一句话实现这个操作：</p>

<div class="wp_codebox"><table><tr id="p48188"><td class="code" id="p4818code8"><pre class="haskell" style="font-family:monospace;">fib n <span style="color: #339933; font-weight: bold;">=</span> fibs <span style="color: #339933; font-weight: bold;">!!</span> n
        <span style="color: #06c; font-weight: bold;">where</span> fibs <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">0</span> : <span style="color: red;">1</span> : <span style="font-weight: bold;">zipWith</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: green;">&#41;</span> fibs <span style="color: green;">&#40;</span><span style="font-weight: bold;">tail</span> fibs<span style="color: green;">&#41;</span></pre></td></tr></table></div>

<p>haskell有一个lazy的特点，也就是所有的东西都会在需要的时候才去计算。haskell内置了一个函数repeat n，就是生成一个长度无限的list[n,n,n,n,&#8230; 。这种涉及无穷的东西并不会瞬间吃光你的内存，而是在你需要算到第n个数时，它才会帮你算到那个数。因为这个特点，在haskell中实现循环还有另一种方法：事先找到这个循环的规律，然后类似通项公式一般地生成一个无穷表，然后这个list的第n项就是循环到n的结果。</p>
<p>另一个例子，解决的问题是<a href="http://projecteuler.net/problem=97">ProjectEuler第97题</a>。我的代码是：</p>

<div class="wp_codebox"><table><tr id="p48189"><td class="code" id="p4818code9"><pre class="haskell" style="font-family:monospace;">powMod2 n <span style="color: #339933; font-weight: bold;">=</span> l <span style="color: red;">1</span> n <span style="color: red;">2</span> <span style="color: #06c; font-weight: bold;">where</span>
            l i n ans <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">if</span> <span style="color: green;">&#40;</span>i<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span><span style="color: #339933; font-weight: bold;">&lt;=</span>n<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span> l <span style="color: green;">&#40;</span>i<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span><span style="color: green;">&#41;</span> n <span style="color: green;">&#40;</span><span style="font-weight: bold;">mod</span> <span style="color: green;">&#40;</span>ans<span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">2</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">10</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
			            <span style="color: #06c; font-weight: bold;">else</span> <span style="color: #06c; font-weight: bold;">if</span> <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>i<span style="color: #339933; font-weight: bold;">&lt;</span>n<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&amp;&amp;</span> <span style="color: green;">&#40;</span>i<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span><span style="color: #339933; font-weight: bold;">&gt;</span>n<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span> <span style="font-weight: bold;">mod</span> <span style="color: green;">&#40;</span>ans<span style="color: #339933; font-weight: bold;">*</span><span style="color: green;">&#40;</span>l <span style="color: red;">1</span> <span style="color: green;">&#40;</span>n<span style="color: #339933; font-weight: bold;">-</span>i<span style="color: green;">&#41;</span> <span style="color: red;">2</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">10</span><span style="color: green;">&#41;</span>
						<span style="color: #06c; font-weight: bold;">else</span> ans
ans<span style="color: #339933; font-weight: bold;">_</span>97 <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">mod</span> <span style="color: green;">&#40;</span><span style="color: red;">28433</span><span style="color: #339933; font-weight: bold;">*</span><span style="color: green;">&#40;</span>powMod2 <span style="color: red;">7830457</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: red;">1</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">10</span><span style="color: green;">&#41;</span></pre></td></tr></table></div>

<p>仍然保留在简单粗暴的递归式循环上。而Mgccl大牛的代码则如下：</p>

<div class="wp_codebox"><table><tr id="p481810"><td class="code" id="p4818code10"><pre class="haskell" style="font-family:monospace;">bin <span style="color: red;">0</span> xs <span style="color: #339933; font-weight: bold;">=</span> xs
bin n xs <span style="color: #339933; font-weight: bold;">=</span> bin q <span style="color: green;">&#40;</span>r:xs<span style="color: green;">&#41;</span>
        <span style="color: #06c; font-weight: bold;">where</span> <span style="color: green;">&#40;</span>q<span style="color: #339933; font-weight: bold;">,</span>r<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">divMod</span> n <span style="color: red;">2</span>
result <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#40;</span>t<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">28433</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: red;">1</span><span style="color: green;">&#41;</span> `<span style="font-weight: bold;">mod</span>` m
  <span style="color: #06c; font-weight: bold;">where</span> t <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">foldr</span> <span style="color: green;">&#40;</span>mmod<span style="color: green;">&#41;</span> <span style="color: red;">1</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="font-weight: bold;">filter</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">/=</span><span style="color: red;">0</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">zipWith</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">*</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">reverse</span> <span style="color: #339933; font-weight: bold;">$</span> bin <span style="color: red;">7830457</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span><span style="color: green;">&#41;</span> twoPow<span style="color: green;">&#41;</span>
        twoPow <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">2</span>:<span style="font-weight: bold;">zipWith</span> mmod twoPow twoPow
        m <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">10</span><span style="color: #339933; font-weight: bold;">^</span><span style="color: red;">10</span>
        mmod a b <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">mod</span> <span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">*</span>b<span style="color: green;">&#41;</span> m</pre></td></tr></table></div>

<p>不得不说神牛的版本在很大程度上增强了代码的可读性。<br />
这个就是利用haskell的infinite list属性来简化代码的很好的例子，但是不得不说在还没习惯这种思维的时候这对我来说是一种很强烈的脑力锻炼。</p>
<p>目前来说，感觉haskell在对付ProjectEuler的内容上比C什么的简洁太多了，而且高精度这个我很讨厌的东西也算是不用再考虑了。最近忙生物统计去了，haskell练习也被我放下了一段时间，不过鉴于下学期我只有三门课一周10节的节奏，兴许会有比较多的进步什么的。</p>
<p><small>本文由 严酷的魔王 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2009/08/%e5%af%bb%e6%89%be%e6%bb%a1%e5%88%86%e5%8d%95%e8%af%8d.html' rel='bookmark' title='寻找满分单词'>寻找满分单词</a></li>
<li><a href='http://blog.programet.org/2009/12/%e6%99%92%ef%bc%9ac%e8%af%ad%e8%a8%80%e6%9c%9f%e4%b8%ad%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a.html' rel='bookmark' title='晒：C语言期中实验报告'>晒：C语言期中实验报告</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/12/haskell%e9%9a%8f%e6%89%8b%e7%ac%94%e8%ae%b0%ef%bc%9ainfinite-list.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<series:name><![CDATA[Haskell笔记]]></series:name>
	</item>
		<item>
		<title>纪念；里奇</title>
		<link>http://blog.programet.org/2011/12/%e7%ba%aa%e5%bf%b5%ef%bc%9b%e9%87%8c%e5%a5%87.html</link>
		<comments>http://blog.programet.org/2011/12/%e7%ba%aa%e5%bf%b5%ef%bc%9b%e9%87%8c%e5%a5%87.html#comments</comments>
		<pubDate>Thu, 01 Dec 2011 13:08:30 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[情感]]></category>
		<category><![CDATA[文学]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4801</guid>
		<description><![CDATA[有时，我写着一行行分号结尾的句子，中途还忍不住停下。 想想，已经过去将近两个月了吧。 C语言发明人，UNIX的父亲之一，不知道这两个身份是否过于沉重。想想，也是可以离去的时候了吧。 天堂这一个多月过得还好吧？Dennis，你知道还有多少世界各地的人们在怀念你吗？ “计算机程序的灵魂造型师”。Dennis，这样称呼你可以吗？ 至于那些天天念叨着某不死的成功学家们，忽略他们吧。伟大的事物，大多难以被多数人关注，尽管与他们形影不离。 只是，在网上看到的那句话总显得有些酸涩：“可惜他不是商人，没有得到更多人的膜拜。” 也许，这个时代为了某个小小的追求，已经抛弃了太多太多宝贵的东西…… 也请，不要在意。那些小小的分号，是你在这个世界上无法抹去的剪影。 没什么可遗憾的了。Dennis Ritchie的印记，已经铺遍世界。 你也能看到吧……能听到吧…… 本文由 最后的叶子 创作，转载或引用前请联系我们。相关文章： 让我们比比长短 NOIP实用算法 7.分治 晒：C语言期中实验报告
相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2009/08/noip%e4%bd%bf%e7%94%a8%e7%ae%97%e6%b3%95-7-%e5%88%86%e6%b2%bb.html' rel='bookmark' title='NOIP实用算法 7.分治'>NOIP实用算法 7.分治</a></li>
<li><a href='http://blog.programet.org/2009/12/%e6%99%92%ef%bc%9ac%e8%af%ad%e8%a8%80%e6%9c%9f%e4%b8%ad%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a.html' rel='bookmark' title='晒：C语言期中实验报告'>晒：C语言期中实验报告</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>有时，我写着一行行分号结尾的句子，中途还忍不住停下。</p>
<p>想想，已经过去将近两个月了吧。</p>
<p><span id="more-4801"></span></p>
<p>C语言发明人，UNIX的父亲之一，不知道这两个身份是否过于沉重。想想，也是可以离去的时候了吧。</p>
<p>天堂这一个多月过得还好吧？Dennis，你知道还有多少世界各地的人们在怀念你吗？</p>
<p>“计算机程序的灵魂造型师”。Dennis，这样称呼你可以吗？</p>
<p>至于那些天天念叨着某不死的成功学家们，忽略他们吧。伟大的事物，大多难以被多数人关注，尽管与他们形影不离。</p>
<p>只是，在网上看到的那句话总显得有些酸涩：“可惜他不是商人，没有得到更多人的膜拜。”</p>
<p>也许，这个时代为了某个小小的追求，已经抛弃了太多太多宝贵的东西……</p>
<p>也请，不要在意。那些小小的分号，是你在这个世界上无法抹去的剪影。</p>
<p>没什么可遗憾的了。Dennis Ritchie的印记，已经铺遍世界。</p>
<p>你也能看到吧……能听到吧……</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2008/10/blog-post_21-3.html' rel='bookmark' title='让我们比比长短'>让我们比比长短</a></li>
<li><a href='http://blog.programet.org/2009/08/noip%e4%bd%bf%e7%94%a8%e7%ae%97%e6%b3%95-7-%e5%88%86%e6%b2%bb.html' rel='bookmark' title='NOIP实用算法 7.分治'>NOIP实用算法 7.分治</a></li>
<li><a href='http://blog.programet.org/2009/12/%e6%99%92%ef%bc%9ac%e8%af%ad%e8%a8%80%e6%9c%9f%e4%b8%ad%e5%ae%9e%e9%aa%8c%e6%8a%a5%e5%91%8a.html' rel='bookmark' title='晒：C语言期中实验报告'>晒：C语言期中实验报告</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/12/%e7%ba%aa%e5%bf%b5%ef%bc%9b%e9%87%8c%e5%a5%87.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“你们的hello world 都弱暴了 ”</title>
		<link>http://blog.programet.org/2011/08/%e2%80%9c%e4%bd%a0%e4%bb%ac%e7%9a%84hello-world-%e9%83%bd%e5%bc%b1%e6%9a%b4%e4%ba%86-%e2%80%9d.html</link>
		<comments>http://blog.programet.org/2011/08/%e2%80%9c%e4%bd%a0%e4%bb%ac%e7%9a%84hello-world-%e9%83%bd%e5%bc%b1%e6%9a%b4%e4%ba%86-%e2%80%9d.html#comments</comments>
		<pubDate>Wed, 31 Aug 2011 12:34:44 +0000</pubDate>
		<dc:creator>严酷的魔王</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[恶搞]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[非严肃]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[设计]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4546</guid>
		<description><![CDATA[——标题来自于果壳网烧饭阿姨的帖子。 阿姨的帖子只有下面这幅图(请点击查看大图)： 图片有点大(4.2M)，小水管用户请耐心等待。 这幅图展示的内容看起来非常神奇，一个人用windows的画板便能够code出一个hello world出来。当然电脑上面的任何看似神奇的东西一定是有其原理的。所以我觉得自己也能够制造出同样的效果。 为了还原这段代码对应的bmp图像，我在经过各种尝试之后觉得下面这种方法应该是最简单的了。 首先我们需要一个16位编辑器来进行主要操作，像什么UltraEdit，WinHex就很好了，我在网上找到的是一个只有80K大小的Hex-Ed。 然后我们新建一个txt文件，在里面输入你的代码，就比如图片中的 #include int main() { std::cout&#60;&#60;&#8221;Hello World&#8221;&#60; return 0; } 输入之后，保存。接着我们用Hex-Ed打开刚才编辑的这段代码，你就应该看到如下画面： 保留着这个窗口，不要关闭。接着我们新建一个bmp文件，保留内容的空白，使用windows自带画图将大小调整为8*4的规格并保存图片——如果觉得自己鼠标不够稳，不妨在8倍放大的模式下进行尺寸调整。再次使用Hex-Ed打开这个bmp文件，你看到的内容应该如下所示： 那一串串的“FF”实际上就是bmp图像中白色色块的代码。接下来我们要做的就是用第一幅图中代码的内容覆盖掉所有的&#8221;FF&#8221;。在输入代码的时候，文字可以直接在右边的窗口输入，但是不可见字符（比如换行符制表符之类的）就可以在左边输入16进制的数字代码。对照着编辑完之后，我觉得你应该会看见下面的效果： 将这个编辑成果保存之后，打开那个bmp图，放大了仔细看——是不是出现了五颜六色的色块了？与动态图中一样，用记事本打开，应该也出现了同样的代码~ 最后，大家可以从这幅色彩斑斓的图片中提取出颜色信息，努力背诵，说不定可以在初级程序员面前直接用画图作画，像动态图中的那样大显身手哦~至于灵活运用于向GEEK妹子表白之类的用途我才不会说呢…… 本文由 严酷的魔王 创作，转载或引用前请联系我们。相关文章： 学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍 说什么就是什么：Your World Of Text Half a World Away
相关文章：<ol>
<li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li>
<li><a href='http://blog.programet.org/2009/08/%e8%af%b4%e4%bb%80%e4%b9%88%e5%b0%b1%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9ayour-world-of-text.html' rel='bookmark' title='说什么就是什么：Your World Of Text'>说什么就是什么：Your World Of Text</a></li>
<li><a href='http://blog.programet.org/2009/07/half-a-world-away.html' rel='bookmark' title='Half a World Away'>Half a World Away</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>——标题来自于果壳网烧饭阿姨的<a href="http://www.guokr.com/post/61527/">帖子</a>。</p>
<p><span id="more-4546"></span></p>
<p>阿姨的帖子只有下面这幅图(请点击查看大图)：</p>
<p><a href="http://i.imgur.com/QlGpd.gif"><img class="alignnone" src="http://i.imgur.com/QlGpd.gif" alt="" width="416" height="184" /></a></p>
<p>图片有点大(4.2M)，小水管用户请耐心等待。</p>
<p>这幅图展示的内容看起来非常神奇，一个人用windows的画板便能够code出一个hello world出来。当然电脑上面的任何看似神奇的东西一定是有其原理的。所以我觉得自己也能够制造出同样的效果。</p>
<p>为了还原这段代码对应的bmp图像，我在经过各种尝试之后觉得下面这种方法应该是最简单的了。</p>
<p>首先我们需要一个16位编辑器来进行主要操作，像什么UltraEdit，WinHex就很好了，我在网上找到的是一个只有80K大小的Hex-Ed。</p>
<p>然后我们新建一个txt文件，在里面输入你的代码，就比如图片中的</p>
<p>#include</p>
<p>int main()</p>
<p>{</p>
<p>std::cout&lt;&lt;&#8221;Hello World&#8221;&lt;</p>
<p>return 0;</p>
<p>}</p>
<p>输入之后，保存。接着我们用Hex-Ed打开刚才编辑的这段代码，你就应该看到如下画面：</p>
<p><a href="http://blog.programet.org/wp-content/uploads/txt.jpg"><img class="aligncenter size-full wp-image-4549" title="txt" src="http://blog.programet.org/wp-content/uploads/txt.jpg" alt="" width="410" height="321" /></a></p>
<p>保留着这个窗口，不要关闭。接着我们新建一个bmp文件，保留内容的空白，使用windows自带画图将大小调整为8*4的规格并保存图片——如果觉得自己鼠标不够稳，不妨在8倍放大的模式下进行尺寸调整。再次使用Hex-Ed打开这个bmp文件，你看到的内容应该如下所示：</p>
<p><a href="http://blog.programet.org/wp-content/uploads/really-empty.jpg"><img class="aligncenter size-full wp-image-4550" title="really empty" src="http://blog.programet.org/wp-content/uploads/really-empty.jpg" alt="" width="422" height="330" /></a></p>
<p>那一串串的“FF”实际上就是bmp图像中白色色块的代码。接下来我们要做的就是用第一幅图中代码的内容覆盖掉所有的&#8221;FF&#8221;。在输入代码的时候，文字可以直接在右边的窗口输入，但是不可见字符（比如换行符制表符之类的）就可以在左边输入16进制的数字代码。对照着编辑完之后，我觉得你应该会看见下面的效果：</p>
<p><a href="http://blog.programet.org/wp-content/uploads/finish.jpg"><img class="aligncenter size-full wp-image-4551" title="finish" src="http://blog.programet.org/wp-content/uploads/finish.jpg" alt="" width="433" height="340" /></a></p>
<p>将这个编辑成果保存之后，打开那个bmp图，放大了仔细看——是不是出现了五颜六色的色块了？与动态图中一样，用记事本打开，应该也出现了同样的代码~</p>
<p><img class="aligncenter size-full wp-image-4552" title="bigfinal" src="http://blog.programet.org/wp-content/uploads/bigfinal.bmp" alt="" /></p>
<p>最后，大家可以从这幅色彩斑斓的图片中提取出颜色信息，努力背诵，说不定可以在初级程序员面前直接用画图作画，像动态图中的那样大显身手哦~至于灵活运用于向GEEK妹子表白之类的用途我才不会说呢……</p>
<p><small>本文由 严酷的魔王 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li>
<li><a href='http://blog.programet.org/2009/08/%e8%af%b4%e4%bb%80%e4%b9%88%e5%b0%b1%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9ayour-world-of-text.html' rel='bookmark' title='说什么就是什么：Your World Of Text'>说什么就是什么：Your World Of Text</a></li>
<li><a href='http://blog.programet.org/2009/07/half-a-world-away.html' rel='bookmark' title='Half a World Away'>Half a World Away</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/08/%e2%80%9c%e4%bd%a0%e4%bb%ac%e7%9a%84hello-world-%e9%83%bd%e5%bc%b1%e6%9a%b4%e4%ba%86-%e2%80%9d.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>让WordPress保留段首空格的插件</title>
		<link>http://blog.programet.org/2011/04/keep-blanks.html</link>
		<comments>http://blog.programet.org/2011/04/keep-blanks.html#comments</comments>
		<pubDate>Fri, 29 Apr 2011 08:47:52 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=4197</guid>
		<description><![CDATA[叶子前段时间为制作网站苦心研究Wordpress，博客更新少了一点，先道歉。不过还是有可以拿来和大家分享的成果滴~~ 其一便是终于搞定了Wordpress自动去除段首空格的问题！ 去各种狗了一下“让Wordpress保留段首空格的方法”，发现能搜到的最好的解决方案是，在主题css中使用text-indent来让每个段落段首自动缩进两字符（其实这也是Programet目前使用的方法）。这个方法有个弱点：如果某些段落段首不空格或不止空两格，就会有一定的麻烦，换句话说，灵活性不够。 叶子这里给出另一个方案，能实实在在地让Wordpress保留在可视化编辑其中输入的每个空格。 首先感谢TinyMCE Entities Patch的作者stringfold，下面的代码是从这个插件中提取出来的。由于原插件过于老迈，其他部分我不确定能用，只用了这个部分。 add_filter&#40;'tiny_mce_before_init', 'preserve_nbsp_chars'&#41;; function preserve_nbsp_chars&#40;$initArray&#41; &#123; $initArray&#91;'entities'&#93; = '160,nbsp,'.$initArray&#91;'entities'&#93;; return $initArray; &#125; 如果你不懂用这段代码的话，我把它做成了一个插件，点击这里下载，解压后上传到/wp-content/plugins目录中，然后激活插件“keep-blanks”就可以了。 有什么问题，请在下面反馈，谢谢！ 本文由 最后的叶子 创作，转载或引用前请联系我们。相关文章： 沉迷 问问matlab:WHY? NOIP实用算法 1.模拟方法
相关文章：<ol>
<li><a href='http://blog.programet.org/2011/03/%e6%b2%89%e8%bf%b7.html' rel='bookmark' title='沉迷'>沉迷</a></li>
<li><a href='http://blog.programet.org/2009/05/matlabwhy.html' rel='bookmark' title='问问matlab:WHY?'>问问matlab:WHY?</a></li>
<li><a href='http://blog.programet.org/2009/07/noip%e5%ae%9e%e7%94%a8%e7%ae%97%e6%b3%95-1-%e6%a8%a1%e6%8b%9f%e6%96%b9%e6%b3%95.html' rel='bookmark' title='NOIP实用算法 1.模拟方法'>NOIP实用算法 1.模拟方法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>叶子前段时间为制作网站苦心研究Wordpress，博客更新少了一点，先道歉。不过还是有可以拿来和大家分享的成果滴~~</p>
<p><span id="more-4197"></span></p>
<p>其一便是终于搞定了Wordpress自动去除段首空格的问题！</p>
<p>去各种狗了一下“让Wordpress保留段首空格的方法”，发现能搜到的最好的解决方案是，在主题css中使用text-indent来让每个段落段首自动缩进两字符（其实这也是Programet目前使用的方法）。这个方法有个弱点：如果某些段落段首不空格或不止空两格，就会有一定的麻烦，换句话说，灵活性不够。</p>
<p>叶子这里给出另一个方案，能实实在在地让Wordpress保留在可视化编辑其中输入的每个空格。</p>
<hr />
<p>首先感谢<a href="http://wordpress.org/extend/plugins/tinymce-entities-patch/">TinyMCE Entities Patch</a>的作者<a href="http://profiles.wordpress.org/users/stringfold/">stringfold</a>，下面的代码是从这个插件中提取出来的。由于原插件过于老迈，其他部分我不确定能用，只用了这个部分。</p>

<div class="wp_codebox"><table><tr id="p419712"><td class="code" id="p4197code12"><pre class="php" style="font-family:monospace;">add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tiny_mce_before_init'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'preserve_nbsp_chars'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> preserve_nbsp_chars<span style="color: #009900;">&#40;</span><span style="color: #000088;">$initArray</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$initArray</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'entities'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'160,nbsp,'</span><span style="color: #339933;">.</span><span style="color: #000088;">$initArray</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'entities'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$initArray</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>如果你不懂用这段代码的话，我把它做成了一个插件，<a href="http://blog.programet.org/wp-content/uploads/keep-blanks.zip">点击这里下载</a>，解压后上传到/wp-content/plugins目录中，然后激活插件“keep-blanks”就可以了。</p>
<hr />
<p>有什么问题，请在下面反馈，谢谢！</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2011/03/%e6%b2%89%e8%bf%b7.html' rel='bookmark' title='沉迷'>沉迷</a></li>
<li><a href='http://blog.programet.org/2009/05/matlabwhy.html' rel='bookmark' title='问问matlab:WHY?'>问问matlab:WHY?</a></li>
<li><a href='http://blog.programet.org/2009/07/noip%e5%ae%9e%e7%94%a8%e7%ae%97%e6%b3%95-1-%e6%a8%a1%e6%8b%9f%e6%96%b9%e6%b3%95.html' rel='bookmark' title='NOIP实用算法 1.模拟方法'>NOIP实用算法 1.模拟方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/04/keep-blanks.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>学习使用GTK+ 6.GTK+常用物件及API（按钮）</title>
		<link>http://blog.programet.org/2011/03/gtk-6.html</link>
		<comments>http://blog.programet.org/2011/03/gtk-6.html#comments</comments>
		<pubDate>Fri, 18 Mar 2011 14:40:02 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3973</guid>
		<description><![CDATA[这一部分内容介绍有关GTK+常用按钮、选择框物件的一些函数，以及相关的使用技巧。如果对内容有疑问，请在下方留言，谢谢！ GTK+的各种按钮和选择框 GTK+提供了各种各样的按钮，功能丰富，能满足各种不同的需求。按钮可大致分为下面几种： 普通按钮（GtkButton）、链接按钮（GtkLinkButton）：最常用也最简单，唯一的操作是按一下。 复选框（GtkCheckButton）、双态按钮（GtkToggleButton）：这两种按钮本质是一致的，按钮有两个状态（按下和弹起）。 单选框（GtkRadioButton）、下拉菜单（GtkComboBox）：可以从多个项目中选择一个。 文件选择按钮（GtkFileChooserButton）、颜色选择按钮（GtkColorButton）、字体选择按钮（GtkFontButton）：这些按钮按下后会弹出对话框，供用户选择。 菜单和与菜单相关的物件：用于构建菜单、工具栏等。 此外还有一些别的按钮，可以提供丰富的细节功能。想用的话请自行查参考。 Glade对它们提供了很好的支持。尤其是提供了菜单编辑器，菜单完全不用写代码构建，这提供了很大的方便。对于可以在Glade中完成的部分，这里不再多做介绍。 信号 按钮和选择框在运行时较少被动态更改，使用这些物件最主要的还是获取信号执行操作。在第三部分的末尾已经介绍了链接信号的基本方法：在Glade中想要连接的信号，输入回调函数名，在程序中编写回调函数。 对于普通按钮，“clicked”肯定是最常用的一个信号。而对于复选框和双态按钮，应当使用“toggled”信号，不建议使用其他信号代替。因为在这个信号被触发时，按钮的状态已经被改变了，可以立即使用gtk_toggle_button_get_active()函数获得按钮的最新状态。 技巧：建立物件数组 有时，按钮在一起时比较便于管理，因而时常会把物件放入数组中管理。这需要在获取物件地址时把物件地址存入数组中。聪明的做法是，在Glade中命名物件时起有规律的名字。 下面继续编写计算器程序来展示这种手段。 计算器的0~9这10个按钮操作是类似的，因而可以放在数组中管理。首先为按钮起类似的名字：BNum0,BNum1,BNum2,&#8230;,BNum9。获取物件的函数原型如下： GObject* gtk_builder_get_object&#40;GtkBuilder *builder, const gchar *name&#41;; 因而可以用这段代码把物件放入一个数组中： GtkButton *BNum&#91;10&#93;; gint i; gchar s&#91;6&#93;; strcpy&#40;s,&#34;BNum_&#34;&#41;; for&#40;i=0;i&#60;10;i++&#41; &#123; s&#91;4&#93;=i+'0'; BNum&#91;i&#93;=GTK_BUTTON&#40;gtk_builder_get_object&#40;builder,s&#41;&#41;; &#125; 小提示：如果物件超过了10个，可以使用sprintf()或者glib中的g_strdup_printf()来得到等同于物件名的字符串。在Glade中复制物件，物件的名字会自动按照末尾数字递增命名，并且物件的属性和信号也会一同被复制。 在连接信号时，可以把数组里所有类似的信号连接到同一个函数里。注意：回调函数的第一个参数总是GtkObject* widget，即信号对应物件的地址，可以用这个参数来判断是具体是哪个物件发出了信号。 下面给出最新的获取物件函数。 void cal_get_widgets&#40;GtkBuilder* gb&#41; &#123; gint i; gchar s&#91;6&#93;; &#160; w_&#40;gb,WINDOW,WMain&#41;; w_&#40;gb,SPIN_BUTTON,SAns&#41;; w_&#40;gb,BUTTON,BPoint&#41;; w_&#40;gb,BUTTON,BPlus&#41;; w_&#40;gb,BUTTON,BMinus&#41;; w_&#40;gb,BUTTON,BMulti&#41;; [...]
相关文章：<ol>
<li><a href='http://blog.programet.org/2010/10/gtk-4.html' rel='bookmark' title='学习使用GTK+ 4.GTK+常用物件及API（窗口）'>学习使用GTK+ 4.GTK+常用物件及API（窗口）</a></li>
<li><a href='http://blog.programet.org/2010/10/gtk-5.html' rel='bookmark' title='学习使用GTK+ 5.GTK+常用物件及API（文本）'>学习使用GTK+ 5.GTK+常用物件及API（文本）</a></li>
<li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>这一部分内容介绍有关GTK+常用按钮、选择框物件的一些函数，以及相关的使用技巧。如果对内容有疑问，请在下方留言，谢谢！<span id="more-3973"></span></p>
<h3>GTK+的各种按钮和选择框</h3>
<p>GTK+提供了各种各样的按钮，功能丰富，能满足各种不同的需求。按钮可大致分为下面几种：</p>
<ul>
<li>普通按钮（GtkButton）、链接按钮（GtkLinkButton）：最常用也最简单，唯一的操作是按一下。</li>
<li>复选框（GtkCheckButton）、双态按钮（GtkToggleButton）：这两种按钮本质是一致的，按钮有两个状态（按下和弹起）。</li>
<li>单选框（GtkRadioButton）、下拉菜单（GtkComboBox）：可以从多个项目中选择一个。</li>
<li>文件选择按钮（GtkFileChooserButton）、颜色选择按钮（GtkColorButton）、字体选择按钮（GtkFontButton）：这些按钮按下后会弹出对话框，供用户选择。</li>
<li>菜单和与菜单相关的物件：用于构建菜单、工具栏等。</li>
</ul>
<p>此外还有一些别的按钮，可以提供丰富的细节功能。想用的话请自行查参考。</p>
<p>Glade对它们提供了很好的支持。尤其是提供了菜单编辑器，菜单完全不用写代码构建，这提供了很大的方便。对于可以在Glade中完成的部分，这里不再多做介绍。</p>
<h3>信号</h3>
<p>按钮和选择框在运行时较少被动态更改，使用这些物件最主要的还是获取信号执行操作。在第三部分的末尾已经介绍了链接信号的基本方法：在Glade中想要连接的信号，输入回调函数名，在程序中编写回调函数。</p>
<p>对于普通按钮，“clicked”肯定是最常用的一个信号。而对于复选框和双态按钮，应当使用“toggled”信号，不建议使用其他信号代替。因为在这个信号被触发时，按钮的状态已经被改变了，可以立即使用gtk_toggle_button_get_active()函数获得按钮的最新状态。</p>
<h3>技巧：建立物件数组</h3>
<p>有时，按钮在一起时比较便于管理，因而时常会把物件放入数组中管理。这需要在获取物件地址时把物件地址存入数组中。聪明的做法是，在Glade中命名物件时起有规律的名字。</p>
<p>下面继续编写计算器程序来展示这种手段。</p>
<p>计算器的0~9这10个按钮操作是类似的，因而可以放在数组中管理。首先为按钮起类似的名字：BNum0,BNum1,BNum2,&#8230;,BNum9。获取物件的函数原型如下：</p>

<div class="wp_codebox"><table><tr id="p397316"><td class="code" id="p3973code16"><pre class="c" style="font-family:monospace;">GObject<span style="color: #339933;">*</span> gtk_builder_get_object<span style="color: #009900;">&#40;</span>GtkBuilder <span style="color: #339933;">*</span>builder<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>因而可以用这段代码把物件放入一个数组中：</p>

<div class="wp_codebox"><table><tr id="p397317"><td class="code" id="p3973code17"><pre class="c" style="font-family:monospace;">GtkButton <span style="color: #339933;">*</span>BNum<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
gint i<span style="color: #339933;">;</span>
gchar s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
strcpy<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;BNum_&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>i<span style="color: #339933;">+</span><span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
	BNum<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>GTK_BUTTON<span style="color: #009900;">&#40;</span>gtk_builder_get_object<span style="color: #009900;">&#40;</span>builder<span style="color: #339933;">,</span>s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>小提示：如果物件超过了10个，可以使用sprintf()或者glib中的g_strdup_printf()来得到等同于物件名的字符串。在Glade中复制物件，物件的名字会自动按照末尾数字递增命名，并且物件的属性和信号也会一同被复制。</p>
<p>在连接信号时，可以把数组里所有类似的信号连接到同一个函数里。注意：回调函数的第一个参数总是GtkObject* widget，即信号对应物件的地址，可以用这个参数来判断是具体是哪个物件发出了信号。</p>
<p>下面给出最新的获取物件函数。</p>

<div class="wp_codebox"><table><tr id="p397318"><td class="code" id="p3973code18"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> cal_get_widgets<span style="color: #009900;">&#40;</span>GtkBuilder<span style="color: #339933;">*</span> gb<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	gint i<span style="color: #339933;">;</span>
	gchar s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>WINDOW<span style="color: #339933;">,</span>WMain<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>SPIN_BUTTON<span style="color: #339933;">,</span>SAns<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BPoint<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BPlus<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BMinus<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BMulti<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>BUTTON<span style="color: #339933;">,</span>BDiv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	strcpy<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;BNum_&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>i<span style="color: #339933;">+</span><span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
		BNum<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>GTK_BUTTON<span style="color: #009900;">&#40;</span>gtk_builder_get_object<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这个程序将在后面的部分中完成。</p>
<h3>快捷键和默认按钮</h3>
<p>在Glade中，还可以为每个按钮分配快捷键（加速键）。选定物件后，点击Glade右下角的“公共”选项卡中的“加速键”右侧的“&#8230;”按钮，可以在弹出窗口中指定该物件某个信号的快捷键。当窗口处于激活态时按下快捷键，对应的信号会被触发。</p>
<p>GTK+中，每个窗口有一个默认物件，某些情况下会被激活——比如在文本框中输入完毕按下Enter（当然这要将文本框的“激活默认”属性置为TRUE），确认按钮（当然它要被设为默认）会被按下。指定一个按钮为默认物件，需要将“公共”选项卡的“可成为默认”和“默认”都置为TRUE。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2010/10/gtk-4.html' rel='bookmark' title='学习使用GTK+ 4.GTK+常用物件及API（窗口）'>学习使用GTK+ 4.GTK+常用物件及API（窗口）</a></li>
<li><a href='http://blog.programet.org/2010/10/gtk-5.html' rel='bookmark' title='学习使用GTK+ 5.GTK+常用物件及API（文本）'>学习使用GTK+ 5.GTK+常用物件及API（文本）</a></li>
<li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/03/gtk-6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[学习使用GTK+]]></series:name>
	</item>
		<item>
		<title>谜之系列(0):线性规划</title>
		<link>http://blog.programet.org/2011/02/%e8%b0%9c%e4%b9%8b%e7%b3%bb%e5%88%970%e7%ba%bf%e6%80%a7%e8%a7%84%e5%88%92.html</link>
		<comments>http://blog.programet.org/2011/02/%e8%b0%9c%e4%b9%8b%e7%b3%bb%e5%88%970%e7%ba%bf%e6%80%a7%e8%a7%84%e5%88%92.html#comments</comments>
		<pubDate>Mon, 14 Feb 2011 16:16:38 +0000</pubDate>
		<dc:creator>DarkRaven</dc:creator>
				<category><![CDATA[数学]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[严肃]]></category>
		<category><![CDATA[公式]]></category>
		<category><![CDATA[智慧]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[证明]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3736</guid>
		<description><![CDATA[Don&#8217;t Panic! 虽然听起来很可怕，但是线性规划其实是很容易理解的东西。 简单介绍 嘛，大家在高中里面也应该做过这样的题目： 最大化： 满足： 这是二维情况下的线性规划，大家当时的解法恐怕都是在平面上画出相应的图形，然后平移目标函数对应的直线来找到目标函数的最优值。 从这个想法很容易推广到变量个数更多的线性规划问题。比如在拥有三个变量的线性规划中，约束条件由二维时的直线推广到平面，可行域由二维时的半平面推广到半空间。 同样地n个变量的一般线性规划也可以如此推广（n维超空间，n-1维超平面什么的&#8230;.） 如果说三维还在人的想象力所及的范围内，那么n维的线性规划要怎么解呢？ 直觉告诉我们，线性规划的最优解总是在顶点处取到（事实也是这样，证明略），于是我们可以联立变量数个方程，解出顶点坐标，带入目标函数。这样的算法，对于n个变量，m个约束条件的线性规划问题，其复杂度为 而这个复杂度也就是线性规划中常用的单纯形算法的最坏复杂度。 我将不在此介绍单纯形算法。 以上是对线性规划的简单介绍，下面要讲线性规划问题在网络流问题中一个比较有用的性质，对偶性 对偶性 所谓对偶性是指，对于每一个要求目标函数最大化线性规划问题，都有相应的，目标函数是最小化的线性规划问题，这两个问题有相同的最优解，其最普遍的体现就是一些最大/最小定理，比如最大流最小割定理可能是最广为人知的了。 现在先让我不失一般性地定义一下一个线性规划问题： 最大化： 满足： 注：这个定义是“一般的”，任何一个线性规划都可以转化为这种形式（松弛型），具体留给读者思考好了。 然后定义其对偶式： 最小化： 满足： 所谓对偶，就是将约束条件与变量互换（回忆射影几何中的对偶），于是一个最大化问题变成了一个最小化问题，现在要证明的是这两个问题的最优解相同。 （以下证明来自算法导论第二版，引理29.8） 引理：线性规划中的弱对偶性 令为原问题的一个可行解，为对偶问题的一个可行解，则： 证明： （见对偶式的约束条件） （见原问题的约束条件） 于是现在问题变成这样：只要找到一对可行解，使 那么线性规划的对偶性就得到了证明。 关于这个解的存在性问题的证明，将会涉及到单纯形算法的细节，所以在这里只是简单、不严密的讲一下： 我们在原问题的约束条件（(*)式）左边加一项，并将不等号变为等号（﻿） 可以看出，这样并不会改变原问题的最优解。之后通过对变量的互相替换，我们最终可以将目标函数化为如下形式： N表示所有出现在目标函数中的变量的下标所组成的集合。 那么取就是对偶问题的最优解。或者令，那么就是取。 当原问题的目标函数化为如(1)的形式后，最优解是明显的，即令，取得。 现在只要说明，可以使对偶式的目标函数也取值即可。 取上文中扩展后的定义，我将不加解释地说明这一点： 因为这个等式对于任意的，取值都成立，则必定为0（令所有） 所以此时，命题得证。 （对于不理解(i)式的人，再看看修改后的约束条件） 关于线性规划这个基础知识的介绍就到这里，下一篇大概会定义“网络”是什么“流”是什么 本文由 DarkRaven 创作，转载或引用前请联系我们。相关文章： 素数有无穷多个的另类证明（三）：被遗忘的证明 素数有无穷多个的另类证明（二）：素数的某个求和式 素数有无穷多个的另类证明（一）：两两互素的无穷序列
相关文章：<ol>
<li><a href='http://blog.programet.org/2009/12/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%b8%89%ef%bc%89%ef%bc%9a%e8%a2%ab%e9%81%97%e5%bf%98%e7%9a%84%e8%af%81%e6%98%8e.html' rel='bookmark' title='素数有无穷多个的另类证明（三）：被遗忘的证明'>素数有无穷多个的另类证明（三）：被遗忘的证明</a></li>
<li><a href='http://blog.programet.org/2009/11/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%ba%8c%ef%bc%89%ef%bc%9a%e7%b4%a0%e6%95%b0%e7%9a%84%e6%9f%90%e4%b8%aa%e6%b1%82.html' rel='bookmark' title='素数有无穷多个的另类证明（二）：素数的某个求和式'>素数有无穷多个的另类证明（二）：素数的某个求和式</a></li>
<li><a href='http://blog.programet.org/2009/11/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%b8%80%ef%bc%89%ef%bc%9a%e4%b8%a4%e4%b8%a4%e4%ba%92%e7%b4%a0%e7%9a%84%e6%97%a0.html' rel='bookmark' title='素数有无穷多个的另类证明（一）：两两互素的无穷序列'>素数有无穷多个的另类证明（一）：两两互素的无穷序列</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: center;"><strong>Don&#8217;t Panic!</strong></h1>
<p>虽然听起来很可怕，但是线性规划其实是很容易理解的东西。<span id="more-3736"></span></p>
<h2>简单介绍</h2>
<p>嘛，大家在高中里面也应该做过这样的题目：</p>
<p style="text-align: left;">最大化：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=6x%2B5y&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='6x+5y' title='6x+5y' class='latex' /></p>
<p>满足：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20x%2By%20%5Cleq%2010%20%5C%5C2x-3y%20%5Cleq%205%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt=' x+y \leq 10 \\2x-3y \leq 5 ' title=' x+y \leq 10 \\2x-3y \leq 5 ' class='latex' /></p>
<p>这是二维情况下的线性规划，大家当时的解法恐怕都是在平面上画出相应的图形，然后平移目标函数对应的直线来找到目标函数的最优值。</p>
<p>从这个想法很容易推广到变量个数更多的线性规划问题。比如在拥有三个变量的线性规划中，约束条件由二维时的直线推广到平面，可行域由二维时的半平面推广到半空间。</p>
<p>同样地n个变量的一般线性规划也可以如此推广（n维超空间，n-1维超平面什么的&#8230;.）</p>
<p>如果说三维还在人的想象力所及的范围内，那么n维的线性规划要怎么解呢？</p>
<p>直觉告诉我们，线性规划的最优解总是在顶点处取到（事实也是这样，证明略），于是我们可以联立变量数个方程，解出顶点坐标，带入目标函数。这样的算法，对于n个变量，m个约束条件的线性规划问题，其复杂度为<img src='http://s.wordpress.com/latex.php?latex=%5Cdbinom%7Bn%2Bm%7D%7Bn%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\dbinom{n+m}{n}' title='\dbinom{n+m}{n}' class='latex' /></p>
<p>而这个复杂度也就是线性规划中常用的单纯形算法的最坏复杂度。</p>
<p>我将不在此介绍单纯形算法。</p>
<p>以上是对线性规划的简单介绍，下面要讲线性规划问题在网络流问题中一个比较有用的性质，对偶性</p>
<h2>对偶性</h2>
<p>所谓对偶性是指，对于每一个要求目标函数最大化线性规划问题，都有相应的，目标函数是最小化的线性规划问题，这两个问题有相同的最优解，其最普遍的体现就是一些最大/最小定理，比如最大流最小割定理可能是最广为人知的了。</p>
<p>现在先让我不失一般性地定义一下一个线性规划问题：</p>
<p>最大化：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20c_%7Bj%7Dx_j%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} c_{j}x_j ' title='\displaystyle\sum_{j=1}^{n} c_{j}x_j ' class='latex' /></p>
<p>满足：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20a_%7Bij%7Dx_j%20%5Cleq%20b_i%20%5Cquad%20i%3D1%2C2%2C3%2C%5Ccdots%2Cm%5Cqquad%7B%7D%28%2A%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} a_{ij}x_j \leq b_i \quad i=1,2,3,\cdots,m\qquad{}(*)' title='\displaystyle\sum_{j=1}^{n} a_{ij}x_j \leq b_i \quad i=1,2,3,\cdots,m\qquad{}(*)' class='latex' /></p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=x_j%20%5Cgeq%200%20%5Cquad%20j%3D1%2C2%2C3%2C%5Ccdots%2Cn&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_j \geq 0 \quad j=1,2,3,\cdots,n' title='x_j \geq 0 \quad j=1,2,3,\cdots,n' class='latex' /></p>
<p>注：这个定义是“一般的”，任何一个线性规划都可以转化为这种形式（松弛型），具体留给读者思考好了。</p>
<p>然后定义其对偶式：</p>
<p>最小化：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20b_%7Bi%7Dy_i%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{i=1}^{m} b_{i}y_i ' title='\displaystyle\sum_{i=1}^{m} b_{i}y_i ' class='latex' /></p>
<p>满足：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20a_%7Bij%7Dy_i%20%5Cgeq%20c_j%20%5Cquad%20j%3D1%2C2%2C3%2C%5Ccdots%2Cn&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{i=1}^{m} a_{ij}y_i \geq c_j \quad j=1,2,3,\cdots,n' title='\displaystyle\sum_{i=1}^{m} a_{ij}y_i \geq c_j \quad j=1,2,3,\cdots,n' class='latex' /></p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=y_i%20%5Cgeq%200%20%5Cquad%20j%3D1%2C2%2C3%2C%5Ccdots%2Cm&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y_i \geq 0 \quad j=1,2,3,\cdots,m' title='y_i \geq 0 \quad j=1,2,3,\cdots,m' class='latex' /></p>
<p>所谓对偶，就是将约束条件与变量互换（回忆射影几何中的对偶），于是一个最大化问题变成了一个最小化问题，现在要证明的是这两个问题的最优解相同。</p>
<p>（以下证明来自算法导论第二版，引理29.8）</p>
<p><strong>引理：线性规划中的弱对偶性</strong></p>
<p>令<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7Bx%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{x}' title='\overline{x}' class='latex' />为原问题的一个可行解，<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7By%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{y}' title='\overline{y}' class='latex' />为对偶问题的一个可行解，则：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20c_%7Bj%7D%5Coverline%7Bx%7D_j%5Cleq%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20b_%7Bi%7D%5Coverline%7By%7D_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j\leq\sum_{i=1}^{m} b_{i}\overline{y}_i' title='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j\leq\sum_{i=1}^{m} b_{i}\overline{y}_i' class='latex' /></p>
<p><strong>证明：</strong></p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20c_%7Bj%7D%5Coverline%7Bx%7D_j%5Cleq%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%5Cleft%20%28%5Csum_%7Bi%3D1%7D%5E%7Bm%7Da_%7Bij%7D%5Coverline%7By%7D_%7Bi%7D%5Cright%20%29%5Coverline%7Bx%7D_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j\leq\sum_{j=1}^{n}\left (\sum_{i=1}^{m}a_{ij}\overline{y}_{i}\right )\overline{x}_j' title='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j\leq\sum_{j=1}^{n}\left (\sum_{i=1}^{m}a_{ij}\overline{y}_{i}\right )\overline{x}_j' class='latex' />（见对偶式的约束条件）</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%3D%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%5Cleft%20%28%5Csum_%7Bi%3D1%7D%5E%7Bm%7Da_%7Bij%7D%5Coverline%7Bx%7D_%7Bj%7D%5Cright%20%29%5Coverline%7By%7D_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle= \sum_{j=1}^{n}\left (\sum_{i=1}^{m}a_{ij}\overline{x}_{j}\right )\overline{y}_i' title='\displaystyle= \sum_{j=1}^{n}\left (\sum_{i=1}^{m}a_{ij}\overline{x}_{j}\right )\overline{y}_i' class='latex' /></p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Cleq%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20b_%7Bi%7D%5Coverline%7By%7D_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\leq\sum_{i=1}^{m} b_{i}\overline{y}_i' title='\displaystyle\leq\sum_{i=1}^{m} b_{i}\overline{y}_i' class='latex' />（见原问题的约束条件）</p>
<p style="text-align: right;"><img src='http://s.wordpress.com/latex.php?latex=%5Chfill%20%5Censuremath%7B%5CBox%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\hfill \ensuremath{\Box}' title='\hfill \ensuremath{\Box}' class='latex' /></p>
<p>于是现在问题变成这样：只要找到一对可行解<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7Bx%7D%2C%5Coverline%7By%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{x},\overline{y}' title='\overline{x},\overline{y}' class='latex' />，使</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20c_%7Bj%7D%5Coverline%7Bx%7D_j%3D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20b_%7Bi%7D%5Coverline%7By%7D_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j=\sum_{i=1}^{m} b_{i}\overline{y}_i' title='\displaystyle\sum_{j=1}^{n} c_{j}\overline{x}_j=\sum_{i=1}^{m} b_{i}\overline{y}_i' class='latex' /></p>
<p>那么线性规划的对偶性就得到了证明。</p>
<p>关于这个解的存在性问题的证明，将会涉及到单纯形算法的细节，所以在这里只是简单、不严密的讲一下：</p>
<p>我们在原问题的约束条件（(*)式）左边加一项，并将不等号变为等号（<img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%20a_%7Bij%7Dx_j%20%2B%20x_%7Bn%2Bi%7D%3D%20b_i%20%5Cquad%20i%3D1%2C2%2C3%2C%5Ccdots%2Cm&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{j=1}^{n} a_{ij}x_j + x_{n+i}= b_i \quad i=1,2,3,\cdots,m' title='\displaystyle\sum_{j=1}^{n} a_{ij}x_j + x_{n+i}= b_i \quad i=1,2,3,\cdots,m' class='latex' />﻿）</p>
<p>可以看出，这样并不会改变原问题的最优解。之后通过对变量的互相替换，我们最终可以将目标函数化为如下形式：</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%7B%7Dz%3Dv%27-%5Csum_%7Bj%5Cin%7B%7DN%7Dc%27_%7Bj%7Dx_%7Bj%7D%5Cqquad%7B%7D%281%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle{}z=v&#039;-\sum_{j\in{}N}c&#039;_{j}x_{j}\qquad{}(1)' title='\displaystyle{}z=v&#039;-\sum_{j\in{}N}c&#039;_{j}x_{j}\qquad{}(1)' class='latex' /></p>
<p style="text-align: center;">N表示所有出现在目标函数中的变量的下标所组成的集合。<img src='http://s.wordpress.com/latex.php?latex=c%27_%7Bj%7D%3E0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c&#039;_{j}&gt;0' title='c&#039;_{j}&gt;0' class='latex' /></p>
<p style="text-align: left;">那么取<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7By%7D%3D%5Cbegin%7Bcases%7Dc%27_%7Bn%2Bi%7D%26%5Ctext%7Bif%20%7D%20n%2Bi%5Cin%20N%20%5C%5C%200%20%26%5Ctext%7Botherwise%7D%5Cend%7Bcases%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{y}=\begin{cases}c&#039;_{n+i}&amp;\text{if } n+i\in N \\ 0 &amp;\text{otherwise}\end{cases}' title='\overline{y}=\begin{cases}c&#039;_{n+i}&amp;\text{if } n+i\in N \\ 0 &amp;\text{otherwise}\end{cases}' class='latex' />就是对偶问题的最优解。或者令<img src='http://s.wordpress.com/latex.php?latex=c%27_%7Bj%7D%3D0%2Cj%5Cnotin%7B%7DN&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c&#039;_{j}=0,j\notin{}N' title='c&#039;_{j}=0,j\notin{}N' class='latex' />，那么就是取<img src='http://s.wordpress.com/latex.php?latex=y%3Dc%27_%7Bn%2Bi%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y=c&#039;_{n+i}' title='y=c&#039;_{n+i}' class='latex' />。</p>
<p style="text-align: left;">当原问题的目标函数化为如(1)的形式后，最优解是明显的，即令<img src='http://s.wordpress.com/latex.php?latex=x_%7Bj%7D%3D0%2Cj%5Cin%7B%7DN&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_{j}=0,j\in{}N' title='x_{j}=0,j\in{}N' class='latex' />，取得<img src='http://s.wordpress.com/latex.php?latex=z_%7Bmax%7D%3Dv%27&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='z_{max}=v&#039;' title='z_{max}=v&#039;' class='latex' />。</p>
<p style="text-align: left;">现在只要说明，<img src='http://s.wordpress.com/latex.php?latex=%5Coverline%7By%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\overline{y}' title='\overline{y}' class='latex' />可以使对偶式的目标函数也取<img src='http://s.wordpress.com/latex.php?latex=v%27&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='v&#039;' title='v&#039;' class='latex' />值即可。</p>
<p style="text-align: left;">取上文中扩展后的<img src='http://s.wordpress.com/latex.php?latex=c%27&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c&#039;' title='c&#039;' class='latex' />定义，我将不加解释地说明这一点：<img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cdisplaystyle%20%20%5Cbegin%7Barray%7D%7Brl%7D%20%20%5Cdisplaystyle%20%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc_%7Bj%7Dx_j%20%26%20%5Cdisplaystyle%3D%20v%27%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%2Bm%7Dc%27_%7Bj%7Dx_j%20%5C%5C%20%20%26%20%5Cdisplaystyle%3Dv%27%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc%27_%7Bj%7Dx_j%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Dc%27_%7Bn%2Bi%7Dx_i%20%5C%5C%20%20%26%20%5Cdisplaystyle%3Dv%27%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc%27_%7Bj%7Dx_j%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Coverline%7By%7D_%7Bi%7Dx_i%20%5C%5C%20%20%26%20%5Cdisplaystyle%3Dv%27%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dc%27_%7Bj%7Dx_j%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Coverline%7By%7D_%7Bi%7D%5Cleft%20%28b_%7Bi%7D%20-%20%5Csum_%7Bj%3D1%7D%5E%7Bn%7Da_%7Bij%7Dx_j%20%5Cright%20%29%20%5Cqquad%20%28i%29%20%5C%5C%20%20%26%20%5Cdisplaystyle%3D%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%5Cleft%20%28%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Da_%7Bij%7D%5Coverline%7By%7D_%7Bi%7D%20-%20c%27_%7Bj%7D%20%5Cright%20%29x_j%20%2B%20%5Cleft%20%28v%27%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Db_%7Bi%7D%5Coverline%7By%7D_%7Bi%7D%20%5Cright%20%29%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \displaystyle  \begin{array}{rl}  \displaystyle  \sum_{j=1}^{n}c_{j}x_j &amp; \displaystyle= v&#039; - \sum_{j=1}^{n+m}c&#039;_{j}x_j \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}c&#039;_{n+i}x_i \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}\overline{y}_{i}x_i \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}\overline{y}_{i}\left (b_{i} - \sum_{j=1}^{n}a_{ij}x_j \right ) \qquad (i) \\  &amp; \displaystyle=\sum_{j=1}^{n}\left ( \sum_{i=1}^{m}a_{ij}\overline{y}_{i} - c&#039;_{j} \right )x_j + \left (v&#039; - \sum_{i=1}^{m}b_{i}\overline{y}_{i} \right )  \end{array}  ' title='  \displaystyle  \begin{array}{rl}  \displaystyle  \sum_{j=1}^{n}c_{j}x_j &amp; \displaystyle= v&#039; - \sum_{j=1}^{n+m}c&#039;_{j}x_j \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}c&#039;_{n+i}x_i \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}\overline{y}_{i}x_i \\  &amp; \displaystyle=v&#039; - \sum_{j=1}^{n}c&#039;_{j}x_j - \sum_{i=1}^{m}\overline{y}_{i}\left (b_{i} - \sum_{j=1}^{n}a_{ij}x_j \right ) \qquad (i) \\  &amp; \displaystyle=\sum_{j=1}^{n}\left ( \sum_{i=1}^{m}a_{ij}\overline{y}_{i} - c&#039;_{j} \right )x_j + \left (v&#039; - \sum_{i=1}^{m}b_{i}\overline{y}_{i} \right )  \end{array}  ' class='latex' /></p>
<p style="text-align: left;">因为这个等式对于任意的<img src='http://s.wordpress.com/latex.php?latex=x_%7Bi%7D%2Ci%3D1%2C2%2C3%2C%5Ccdots%2Cn&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_{i},i=1,2,3,\cdots,n' title='x_{i},i=1,2,3,\cdots,n' class='latex' />，取值都成立，则<img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%7B%7Dv%27%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Db_%7Bi%7D%5Coverline%7By%7D_%7Bi%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle{}v&#039; - \sum_{i=1}^{m}b_{i}\overline{y}_{i}' title='\displaystyle{}v&#039; - \sum_{i=1}^{m}b_{i}\overline{y}_{i}' class='latex' />必定为0（令所有<img src='http://s.wordpress.com/latex.php?latex=x_%7Bi%7D%3D0&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_{i}=0' title='x_{i}=0' class='latex' />）</p>
<p style="text-align: left;">所以此时<img src='http://s.wordpress.com/latex.php?latex=%5Cdisplaystyle%5Csum_%7Bi%3D1%7D%5E%7Bm%7Db_%7Bi%7D%5Coverline%7By%7D_%7Bi%7D%20%3D%20v%27%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\displaystyle\sum_{i=1}^{m}b_{i}\overline{y}_{i} = v&#039; ' title='\displaystyle\sum_{i=1}^{m}b_{i}\overline{y}_{i} = v&#039; ' class='latex' />，命题得证。</p>
<p style="text-align: left;">（对于不理解(i)式的人，再看看修改后的约束条件）</p>
<p style="text-align: left;">
<p style="text-align: left;">关于线性规划这个基础知识的介绍就到这里，下一篇大概会定义“网络”是什么“流”是什么</p>
<p style="text-align: left;">
<p style="text-align: center;">
<p style="text-align: center;">
<p><small>本文由 DarkRaven 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2009/12/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%b8%89%ef%bc%89%ef%bc%9a%e8%a2%ab%e9%81%97%e5%bf%98%e7%9a%84%e8%af%81%e6%98%8e.html' rel='bookmark' title='素数有无穷多个的另类证明（三）：被遗忘的证明'>素数有无穷多个的另类证明（三）：被遗忘的证明</a></li>
<li><a href='http://blog.programet.org/2009/11/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%ba%8c%ef%bc%89%ef%bc%9a%e7%b4%a0%e6%95%b0%e7%9a%84%e6%9f%90%e4%b8%aa%e6%b1%82.html' rel='bookmark' title='素数有无穷多个的另类证明（二）：素数的某个求和式'>素数有无穷多个的另类证明（二）：素数的某个求和式</a></li>
<li><a href='http://blog.programet.org/2009/11/%e7%b4%a0%e6%95%b0%e6%9c%89%e6%97%a0%e7%a9%b7%e5%a4%9a%e4%b8%aa%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%af%81%e6%98%8e%ef%bc%88%e4%b8%80%ef%bc%89%ef%bc%9a%e4%b8%a4%e4%b8%a4%e4%ba%92%e7%b4%a0%e7%9a%84%e6%97%a0.html' rel='bookmark' title='素数有无穷多个的另类证明（一）：两两互素的无穷序列'>素数有无穷多个的另类证明（一）：两两互素的无穷序列</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2011/02/%e8%b0%9c%e4%b9%8b%e7%b3%bb%e5%88%970%e7%ba%bf%e6%80%a7%e8%a7%84%e5%88%92.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>NOIP实用算法·教程 下载版 2.0</title>
		<link>http://blog.programet.org/2010/11/noip-download-2.html</link>
		<comments>http://blog.programet.org/2010/11/noip-download-2.html#comments</comments>
		<pubDate>Mon, 08 Nov 2010 10:26:31 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3383</guid>
		<description><![CDATA[一年多前我们制作了《NOIP实用算法·教程 下载版》。这得到了很多童鞋的支持，在此表示感谢。 鉴于原版中有若干错误，这里放出新的下载版（2.0），修正了目前已发现的错误。 点击这里下载。文件是zip格式，大小约40KB。文件中有部分（不涉及教程内容的）页面需要在线观看。 如果有链接错误，请马上向我们报告（写评论），谢谢~ 本文由 最后的叶子 创作，转载或引用前请联系我们。相关文章： NOIP实用算法·教程 下载版 五年NOIP提高组复赛算法及难度分析 NOIP实用算法 目录
相关文章：<ol>
<li><a href='http://blog.programet.org/2009/09/noip-download.html' rel='bookmark' title='NOIP实用算法·教程 下载版'>NOIP实用算法·教程 下载版</a></li>
<li><a href='http://blog.programet.org/2009/09/%e4%ba%94%e5%b9%b4noip%e6%8f%90%e9%ab%98%e7%bb%84%e5%a4%8d%e8%b5%9b%e7%ae%97%e6%b3%95%e5%8f%8a%e9%9a%be%e5%ba%a6%e5%88%86%e6%9e%90.html' rel='bookmark' title='五年NOIP提高组复赛算法及难度分析'>五年NOIP提高组复赛算法及难度分析</a></li>
<li><a href='http://blog.programet.org/2009/07/noip%e5%ae%9e%e7%94%a8%e7%ae%97%e6%b3%95-%e7%9b%ae%e5%bd%95.html' rel='bookmark' title='NOIP实用算法 目录'>NOIP实用算法 目录</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>一年多前我们制作了《NOIP实用算法·教程 下载版》。这得到了很多童鞋的支持，在此表示感谢。</p>
<p><span id="more-3383"></span></p>
<p>鉴于原版中有若干错误，这里放出新的下载版（2.0），修正了目前已发现的错误。</p>
<p><a href="http://blog.programet.org/wp-content/uploads/noip_2.zip">点击这里下载</a>。文件是zip格式，大小约40KB。文件中有部分（不涉及教程内容的）页面需要在线观看。</p>
<p><span style="color: #3366ff;">如果有链接错误，请马上向我们报告（写评论），谢谢~</span></p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2009/09/noip-download.html' rel='bookmark' title='NOIP实用算法·教程 下载版'>NOIP实用算法·教程 下载版</a></li>
<li><a href='http://blog.programet.org/2009/09/%e4%ba%94%e5%b9%b4noip%e6%8f%90%e9%ab%98%e7%bb%84%e5%a4%8d%e8%b5%9b%e7%ae%97%e6%b3%95%e5%8f%8a%e9%9a%be%e5%ba%a6%e5%88%86%e6%9e%90.html' rel='bookmark' title='五年NOIP提高组复赛算法及难度分析'>五年NOIP提高组复赛算法及难度分析</a></li>
<li><a href='http://blog.programet.org/2009/07/noip%e5%ae%9e%e7%94%a8%e7%ae%97%e6%b3%95-%e7%9b%ae%e5%bd%95.html' rel='bookmark' title='NOIP实用算法 目录'>NOIP实用算法 目录</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/11/noip-download-2.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<series:name><![CDATA[NOIP实用算法 教程]]></series:name>
	</item>
		<item>
		<title>手机上的越墙天梯——Snaptu</title>
		<link>http://blog.programet.org/2010/10/%e6%89%8b%e6%9c%ba%e4%b8%8a%e7%9a%84%e8%b6%8a%e5%a2%99%e5%a4%a9%e6%a2%af%e2%80%94%e2%80%94snaptu.html</link>
		<comments>http://blog.programet.org/2010/10/%e6%89%8b%e6%9c%ba%e4%b8%8a%e7%9a%84%e8%b6%8a%e5%a2%99%e5%a4%a9%e6%a2%af%e2%80%94%e2%80%94snaptu.html#comments</comments>
		<pubDate>Sat, 23 Oct 2010 13:22:59 +0000</pubDate>
		<dc:creator>严酷的魔王</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[推荐]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[自由]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3356</guid>
		<description><![CDATA[最近我的笔记本悲剧地出了硬件问题，寄回原厂维修，估计还有蛮久的样子……于是有需要的时候只能依靠舍友的救济来完成需要依靠电脑进行的各种活动。如何用手机上推就变成了一个需要解决的问题。 我尝试过手机访问在线代理网站，发现一个站点速度不错，但是因为不是直接访问，所以每次登陆都要输入一次账号密码，很是麻烦。突然回想起以前曾经在手机上面下过一个传说可以用twitter的软件，叫做Snaptu，官方网站是http://snaptu.com/。 这是一个免费的java软件，只要能运行java的机器基本上都能够运行它。Snaptu的特色在于它集成了很多社会化网站的功能于一身，例如facebook，twitter，以及天气预报，RSS订阅等实用功能——甚至支持将你的Google Reader内容导入其中。只需要用你的手机访问http://m.snaptu.com/，便可下载到这个java软件。软件的twitter界面大概是这样的（图片截自官网，与实际情况相似）： 不过这里要补充说明一下：如果想要访问这个网以及正常使用这个软件，你需要将手机的网络接入点设置成cmnet。而不同的手机有不同的设置方法，所以我这里也就不再继续详解了，大家自行去搜索吧。 这个软件本来是一个面向英国用户的应用集成特色软件，之所以能协助我们翻墙的原理就是它为了方便集中这些应用，弄了一个自己的形式上的&#8221;appstore&#8221;——其实是免费的store~所以自身带有一个中转服务器，至今没有被墙掉，于是便起到了一个代理的作用，歪打正着地吸引了大量特殊用户。大家赶紧趁其仍健在的时候玩玩吧！ 本文由 严酷的魔王 创作，转载或引用前请联系我们。相关文章： 关于《生命游戏》和细胞自动机 夜空下的萤火虫——《众里寻他》番外 深蓝的第一次比赛
相关文章：<ol>
<li><a href='http://blog.programet.org/2008/08/blog-post_28.html' rel='bookmark' title='关于《生命游戏》和细胞自动机'>关于《生命游戏》和细胞自动机</a></li>
<li><a href='http://blog.programet.org/2011/11/%e5%a4%9c%e7%a9%ba%e4%b8%8b%e7%9a%84%e8%90%a4%e7%81%ab%e8%99%ab%e2%80%94%e2%80%94%e3%80%8a%e4%bc%97%e9%87%8c%e5%af%bb%e4%bb%96%e3%80%8b%e7%95%aa%e5%a4%96.html' rel='bookmark' title='夜空下的萤火虫——《众里寻他》番外'>夜空下的萤火虫——《众里寻他》番外</a></li>
<li><a href='http://blog.programet.org/2009/03/blog-post_23-2.html' rel='bookmark' title='深蓝的第一次比赛'>深蓝的第一次比赛</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>最近我的笔记本悲剧地出了硬件问题，寄回原厂维修，估计还有蛮久的样子……于是有需要的时候只能依靠舍友的救济来完成需要依靠电脑进行的各种活动。如何用手机上推就变成了一个需要解决的问题。</p>
<p><span id="more-3356"></span></p>
<p>我尝试过手机访问在线代理网站，发现一个站点速度不错，但是因为不是直接访问，所以每次登陆都要输入一次账号密码，很是麻烦。突然回想起以前曾经在手机上面下过一个传说可以用twitter的软件，叫做Snaptu，官方网站是http://snaptu.com/。</p>
<p>这是一个免费的java软件，只要能运行java的机器基本上都能够运行它。Snaptu的特色在于它集成了很多社会化网站的功能于一身，例如facebook，twitter，以及天气预报，RSS订阅等实用功能——甚至支持将你的Google Reader内容导入其中。只需要用你的手机访问http://m.snaptu.com/，便可下载到这个java软件。软件的twitter界面大概是这样的（图片截自官网，与实际情况相似）：</p>
<p><img class="aligncenter size-full wp-image-3357" title="Snaptu" src="http://blog.programet.org/wp-content/uploads/未命名.jpg" alt="" width="441" height="354" /></p>
<p>不过这里要补充说明一下：如果想要访问这个网以及正常使用这个软件，你需要将手机的网络接入点设置成cmnet。而不同的手机有不同的设置方法，所以我这里也就不再继续详解了，大家自行去搜索吧。</p>
<p>这个软件本来是一个面向英国用户的应用集成特色软件，之所以能协助我们翻墙的原理就是它为了方便集中这些应用，弄了一个自己的形式上的&#8221;appstore&#8221;——其实是免费的store~所以自身带有一个中转服务器，至今没有被墙掉，于是便起到了一个代理的作用，歪打正着地吸引了大量特殊用户。大家赶紧趁其仍健在的时候玩玩吧！</p>
<p><small>本文由 严酷的魔王 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2008/08/blog-post_28.html' rel='bookmark' title='关于《生命游戏》和细胞自动机'>关于《生命游戏》和细胞自动机</a></li>
<li><a href='http://blog.programet.org/2011/11/%e5%a4%9c%e7%a9%ba%e4%b8%8b%e7%9a%84%e8%90%a4%e7%81%ab%e8%99%ab%e2%80%94%e2%80%94%e3%80%8a%e4%bc%97%e9%87%8c%e5%af%bb%e4%bb%96%e3%80%8b%e7%95%aa%e5%a4%96.html' rel='bookmark' title='夜空下的萤火虫——《众里寻他》番外'>夜空下的萤火虫——《众里寻他》番外</a></li>
<li><a href='http://blog.programet.org/2009/03/blog-post_23-2.html' rel='bookmark' title='深蓝的第一次比赛'>深蓝的第一次比赛</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/10/%e6%89%8b%e6%9c%ba%e4%b8%8a%e7%9a%84%e8%b6%8a%e5%a2%99%e5%a4%a9%e6%a2%af%e2%80%94%e2%80%94snaptu.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>学习使用GTK+ 5.GTK+常用物件及API（文本）</title>
		<link>http://blog.programet.org/2010/10/gtk-5.html</link>
		<comments>http://blog.programet.org/2010/10/gtk-5.html#comments</comments>
		<pubDate>Tue, 19 Oct 2010 12:28:07 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3337</guid>
		<description><![CDATA[这一部分内容介绍有关GTK+常用文本类物件的一些函数。如果对内容有疑问，请在下方留言，谢谢！ GTK+的文本 显示文字和控制文本框自然是界面重头戏，基本每个窗口都离不开这样的物件。GTK+中和文本有关的物件主要有：文本标签（GtkLabel，以下简称“文本”），输入框（GtkEntry），可编辑多行文本（GtkTextView，以下简称“多行文本”），调节按钮（GtkSpinButton）。各物件有自己的优点。 文本：简单地显示一些文字，使用非常方便，一般用于显示界面上最普通的文字。 输入框：用于让用户输入一行文字，使用方便。 多行文本：用于让用户输入多行文字，或显示一段非常长的文字，可配合滚动区（GtkScrolledWindow）使用来达到很好的显示效果，也可为部分文字设置样式。它的缺陷在于使用繁琐。 调节按钮：用于输入数字，在控制数字输入方面的功能非常强大，其右侧有上下调节数字大小的按钮。 具体使用哪个物件需要根据实际情况决定。 访问文本、输入框 对文本类物件的操作基本相似。对这些物件的动态访问基本归结为以下两种——读取所包含的文字信息（读）、设置所包含的文字内容（写）。其他的设置基本不需要动态改变，初始时在Glade中设置好即可（如果真的需要修改，自己去看参考吧）。 下面这些函数用于对文本、输入框的读写，函数名字都很好记。 //写入文本内容 void gtk_label_set_text&#40;GtkLabel *label, const gchar *str&#41;; //读取文本内容 const gchar* gtk_label_get_text&#40;GtkLabel *label&#41;; //写入输入框内容 void gtk_entry_set_text&#40;GtkEntry *entry, const gchar *text&#41;; //读取输入框内容 const gchar* gtk_entry_get_text&#40;GtkEntry *entry&#41;; 使用调节按钮 调节按钮是用于操作数字的，因而可以直接向其中写入或者读出实数或整数。 //设置调节按钮的数值 void gtk_spin_button_set_value &#40;GtkSpinButton *spin_button, gdouble value&#41;; //读出调节按钮的数值 gdouble gtk_spin_button_get_value &#40;GtkSpinButton *spin_button&#41;; gint gtk_spin_button_get_value_as_int&#40;GtkSpinButton *spin_button&#41;; 做个实例吧。本系列第三部分做了一个计算器雏形，下面来稍稍完善一下。 计算器的上方有一个名为SAns的调节按钮，下面增加一个功能：当调节按钮的值的绝对值过大（大于等于常数CAL_ABS_MAX）时，弹出错误提示窗口。 每个调节按钮对应一个GtkAdjustment，首先应为调节按钮添加一个GtkAdjustment。在Glade中，点“常规”的“调整部件”右侧的“&#8230;”，弹出窗口中点“New”。 [...]
相关文章：<ol>
<li><a href='http://blog.programet.org/2010/10/gtk-4.html' rel='bookmark' title='学习使用GTK+ 4.GTK+常用物件及API（窗口）'>学习使用GTK+ 4.GTK+常用物件及API（窗口）</a></li>
<li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li>
<li><a href='http://blog.programet.org/2011/03/gtk-6.html' rel='bookmark' title='学习使用GTK+ 6.GTK+常用物件及API（按钮）'>学习使用GTK+ 6.GTK+常用物件及API（按钮）</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>这一部分内容介绍有关GTK+常用文本类物件的一些函数。如果对内容有疑问，请在下方留言，谢谢！<span id="more-3337"></span></p>
<h3>GTK+的文本</h3>
<p>显示文字和控制文本框自然是界面重头戏，基本每个窗口都离不开这样的物件。GTK+中和文本有关的物件主要有：文本标签（GtkLabel，以下简称“文本”），输入框（GtkEntry），可编辑多行文本（GtkTextView，以下简称“多行文本”），调节按钮（GtkSpinButton）。各物件有自己的优点。</p>
<ul>
<li>文本：简单地显示一些文字，使用非常方便，一般用于显示界面上最普通的文字。</li>
<li>输入框：用于让用户输入一行文字，使用方便。</li>
<li>多行文本：用于让用户输入多行文字，或显示一段非常长的文字，可配合滚动区（GtkScrolledWindow）使用来达到很好的显示效果，也可为部分文字设置样式。它的缺陷在于使用繁琐。</li>
<li>调节按钮：用于输入数字，在控制数字输入方面的功能非常强大，其右侧有上下调节数字大小的按钮。</li>
</ul>
<p>具体使用哪个物件需要根据实际情况决定。</p>
<h3>访问文本、输入框</h3>
<p>对文本类物件的操作基本相似。对这些物件的动态访问基本归结为以下两种——读取所包含的文字信息（读）、设置所包含的文字内容（写）。其他的设置基本不需要动态改变，初始时在Glade中设置好即可（如果真的需要修改，自己去看参考吧）。</p>
<p>下面这些函数用于对文本、输入框的读写，函数名字都很好记。</p>

<div class="wp_codebox"><table><tr id="p333724"><td class="code" id="p3337code24"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//写入文本内容</span>
<span style="color: #993333;">void</span>          gtk_label_set_text<span style="color: #009900;">&#40;</span>GtkLabel <span style="color: #339933;">*</span>label<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//读取文本内容</span>
<span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span>  gtk_label_get_text<span style="color: #009900;">&#40;</span>GtkLabel <span style="color: #339933;">*</span>label<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//写入输入框内容</span>
<span style="color: #993333;">void</span>          gtk_entry_set_text<span style="color: #009900;">&#40;</span>GtkEntry <span style="color: #339933;">*</span>entry<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//读取输入框内容</span>
<span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span>  gtk_entry_get_text<span style="color: #009900;">&#40;</span>GtkEntry <span style="color: #339933;">*</span>entry<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>使用调节按钮</h3>
<p>调节按钮是用于操作数字的，因而可以直接向其中写入或者读出实数或整数。</p>

<div class="wp_codebox"><table><tr id="p333725"><td class="code" id="p3337code25"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//设置调节按钮的数值</span>
<span style="color: #993333;">void</span>          gtk_spin_button_set_value       <span style="color: #009900;">&#40;</span>GtkSpinButton <span style="color: #339933;">*</span>spin_button<span style="color: #339933;">,</span> gdouble value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//读出调节按钮的数值</span>
gdouble       gtk_spin_button_get_value       <span style="color: #009900;">&#40;</span>GtkSpinButton <span style="color: #339933;">*</span>spin_button<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
gint          gtk_spin_button_get_value_as_int<span style="color: #009900;">&#40;</span>GtkSpinButton <span style="color: #339933;">*</span>spin_button<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>做个实例吧。本系列第三部分做了一个计算器雏形，下面来稍稍完善一下。</p>
<p>计算器的上方有一个名为SAns的调节按钮，下面增加一个功能：当调节按钮的值的绝对值过大（大于等于常数CAL_ABS_MAX）时，弹出错误提示窗口。</p>
<p>每个调节按钮对应一个GtkAdjustment，首先应为调节按钮添加一个GtkAdjustment。在Glade中，点“常规”的“调整部件”右侧的“&#8230;”，弹出窗口中点“New”。</p>
<p><img class="aligncenter size-full wp-image-3340" title="gtk-5-1" src="http://blog.programet.org/wp-content/uploads/gtk-5-1.jpg" alt="" width="411" height="162" /></p>
<p>此时上方的物件选择栏末尾中会出现一个对象adjustment1，可以更改它的属性，即调节按钮的最值、步长等。</p>
<p><img class="aligncenter size-full wp-image-3341" title="gtk-5-2" src="http://blog.programet.org/wp-content/uploads/gtk-5-2.jpg" alt="" width="388" height="325" /></p>
<p>然后为SAns的信号value-changed添加操作句柄“on_SAns_value_changed”，然后在程序中添加相应回调函数。</p>
<p>回到程序中，在初始化时，用gtk_spin_button_set_range()修改调节按钮取值范围为[-CAL_ABS_MAX,CAL_ABS_MAX]，再编写回调函数on_SAns_value_changed()，顺便用上上一部分写的函数gtk_show_error()。完整代码如下。</p>

<div class="wp_codebox"><table><tr id="p333726"><td class="code" id="p3337code26"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;gtk/gtk.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define CAL_ABS_MAX 1e9</span>
&nbsp;
<span style="color: #339933;">#define w_(builder,type,name) name=GTK_##type(gtk_builder_get_object(builder,#name))</span>
&nbsp;
GtkWindow <span style="color: #339933;">*</span>WMain<span style="color: #339933;">;</span>
GtkSpinButton <span style="color: #339933;">*</span>SAns<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//显示一个错误提示窗口</span>
<span style="color: #993333;">void</span> gtk_show_error<span style="color: #009900;">&#40;</span>gpointer window<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> message<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> title<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkWidget <span style="color: #339933;">*</span>dialog<span style="color: #339933;">;</span>
    dialog <span style="color: #339933;">=</span> gtk_message_dialog_new_with_markup<span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span>
             GTK_DIALOG_DESTROY_WITH_PARENT<span style="color: #339933;">,</span>
             GTK_MESSAGE_ERROR<span style="color: #339933;">,</span>
             GTK_BUTTONS_OK<span style="color: #339933;">,</span>
             message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_window_set_title<span style="color: #009900;">&#40;</span>GTK_WINDOW<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> title<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_dialog_run<span style="color: #009900;">&#40;</span>GTK_DIALOG<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_widget_destroy<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
G_MODULE_EXPORT <span style="color: #993333;">void</span> on_SAns_value_changed<span style="color: #009900;">&#40;</span>GtkObject<span style="color: #339933;">*</span> widget<span style="color: #339933;">,</span> gpointer user_data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//gdouble在Windows下等价于double</span>
    gdouble d<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//读取调节按钮的值</span>
    d<span style="color: #339933;">=</span>gtk_spin_button_get_value<span style="color: #009900;">&#40;</span>SAns<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//判断是否需要显示错误提示窗口</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>d<span style="color: #339933;">&gt;=</span>CAL_ABS_MAX<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        gtk_show_error<span style="color: #009900;">&#40;</span>WMain<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;Too Large&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;Error!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//设置调节按钮值为零</span>
        gtk_spin_button_set_value<span style="color: #009900;">&#40;</span>SAns<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>d<span style="color: #339933;">&gt;=</span>CAL_ABS_MAX<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        gtk_show_error<span style="color: #009900;">&#40;</span>WMain<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;Too Small&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;Error!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//设置调节按钮值为零</span>
        gtk_spin_button_set_value<span style="color: #009900;">&#40;</span>SAns<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
G_MODULE_EXPORT <span style="color: #993333;">void</span> on_WMain_destroy<span style="color: #009900;">&#40;</span>GtkObject<span style="color: #339933;">*</span> widget<span style="color: #339933;">,</span> gpointer user_data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    gtk_main_quit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
GtkBuilder<span style="color: #339933;">*</span> gtk_load_glade<span style="color: #009900;">&#40;</span>gchar<span style="color: #339933;">*</span> filename<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkBuilder <span style="color: #339933;">*</span>gb<span style="color: #339933;">;</span>
&nbsp;
    gb<span style="color: #339933;">=</span>gtk_builder_new<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>gtk_builder_add_from_file<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>filename<span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
    gtk_builder_connect_signals<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> gb<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> cal_get_widgets<span style="color: #009900;">&#40;</span>GtkBuilder<span style="color: #339933;">*</span> gb<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>WINDOW<span style="color: #339933;">,</span>WMain<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>SPIN_BUTTON<span style="color: #339933;">,</span>SAns<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> cal_widget_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//初始化，设置调节按钮取值范围，数值超出此范围时自动调整为边界值。</span>
    gtk_spin_button_set_range<span style="color: #009900;">&#40;</span>SAns<span style="color: #339933;">,-</span>CAL_ABS_MAX<span style="color: #339933;">,</span>CAL_ABS_MAX<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
    gtk_widget_show_all<span style="color: #009900;">&#40;</span>GTK_WIDGET<span style="color: #009900;">&#40;</span>WMain<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkBuilder <span style="color: #339933;">*</span>gb<span style="color: #339933;">;</span>
&nbsp;
    gtk_init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>argc<span style="color: #339933;">,&amp;</span>argv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    gb<span style="color: #339933;">=</span>gtk_load_glade<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;gtk-cal.glade&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">==</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    cal_get_widgets<span style="color: #009900;">&#40;</span>gb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    cal_widget_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    gtk_main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>在以后的内容中，这个计算器将被逐渐完善。</p>
<h3>访问多行文本</h3>
<p>多行文本的使用比较复杂，涉及几个其他对象的使用。一个多行文本的内容储存在一个缓冲区GtkTextBuffer中，这个缓冲区需要用迭代器GtkTextIter访问、用GtkTextMark标记，文字样式用GtkTextTag设置。</p>
<p>看起来真的有些复杂。不过最基本的应用还是读、写。下面给出三个函数，可以直接读写多行文本。这几个函数基本够用了。</p>

<div class="wp_codebox"><table><tr id="p333727"><td class="code" id="p3337code27"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//读取多行文本中的文字内容</span>
gchar<span style="color: #339933;">*</span> gtk_text_view_get<span style="color: #009900;">&#40;</span>GtkTextView <span style="color: #339933;">*</span>text_view<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkTextBuffer <span style="color: #339933;">*</span>tb<span style="color: #339933;">;</span>
    GtkTextIter st<span style="color: #339933;">,</span>stp<span style="color: #339933;">;</span>
&nbsp;
    tb<span style="color: #339933;">=</span>gtk_text_view_get_buffer<span style="color: #009900;">&#40;</span>text_view<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//获取对应的GtkTextBuffer</span>
    gtk_text_buffer_get_start_iter<span style="color: #009900;">&#40;</span>tb<span style="color: #339933;">,&amp;</span>st<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//获得起始点</span>
    gtk_text_buffer_get_end_iter<span style="color: #009900;">&#40;</span>tb<span style="color: #339933;">,&amp;</span>stp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//获得结束点</span>
    <span style="color: #b1b100;">return</span> gtk_text_buffer_get_text<span style="color: #009900;">&#40;</span>tb<span style="color: #339933;">,&amp;</span>st<span style="color: #339933;">,&amp;</span>stp<span style="color: #339933;">,</span>FALSE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//获得两点间所有字符</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//在多行文本末尾追加文字，文字样式包含在text_tag中，如果不需要指定样式，text_tag设为NULL</span>
<span style="color: #993333;">void</span> gtk_text_view_append_with_tag<span style="color: #009900;">&#40;</span>GtkTextView<span style="color: #339933;">*</span> text_view<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> text<span style="color: #339933;">,</span> GtkTextTag<span style="color: #339933;">*</span> text_tag<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkTextBuffer <span style="color: #339933;">*</span>tb<span style="color: #339933;">;</span>
    GtkTextIter stp<span style="color: #339933;">;</span>
&nbsp;
    tb<span style="color: #339933;">=</span>gtk_text_view_get_buffer<span style="color: #009900;">&#40;</span>text_view<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_text_buffer_get_end_iter<span style="color: #009900;">&#40;</span>tb<span style="color: #339933;">,&amp;</span>stp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_text_buffer_insert_with_tags<span style="color: #009900;">&#40;</span>tb<span style="color: #339933;">,&amp;</span>stp<span style="color: #339933;">,</span>text<span style="color: #339933;">,</span>strlen<span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>text_tag<span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//在结束点处追加字符</span>
    gtk_text_buffer_get_end_iter<span style="color: #009900;">&#40;</span>tb<span style="color: #339933;">,&amp;</span>stp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_text_view_scroll_to_iter<span style="color: #009900;">&#40;</span>text_view<span style="color: #339933;">,&amp;</span>stp<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>FALSE<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//将光标置于结束点</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//清空多行文本</span>
<span style="color: #993333;">void</span> gtk_text_view_clear<span style="color: #009900;">&#40;</span>GtkTextView <span style="color: #339933;">*</span>text_view<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    gtk_text_buffer_set_text<span style="color: #009900;">&#40;</span>gtk_text_view_get_buffer<span style="color: #009900;">&#40;</span>text_view<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//设置文本内容为空</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>此外，样式可以这样新建：</p>

<div class="wp_codebox"><table><tr id="p333728"><td class="code" id="p3337code28"><pre class="c" style="font-family:monospace;">gtk_text_buffer_create_tag<span style="color: #009900;">&#40;</span>gtk_text_view_get_buffer<span style="color: #009900;">&#40;</span>text_view<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> tag_name<span style="color: #339933;">,</span> property1<span style="color: #339933;">,</span> value1<span style="color: #339933;">,</span> property2<span style="color: #339933;">,</span> value2<span style="color: #339933;">,</span> ... <span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>text_view是多行文本名字；tag_name是一个字符串，值不能和别的样式相同；property1,2,3,&#8230;各属性名字（字符串形式），可用的属性参见<a href="http://library.gnome.org/devel/gtk/unstable/GtkTextTag.html">http://library.gnome.org/devel/gtk/unstable/GtkTextTag.html</a>中的Property栏；value1,2,3,&#8230;各属性对应的值（字符串形式）。</p>
<p>如果以上的方法不够用，只好查参考了。</p>
<p>小提醒：多行文本一般都需要放在滚动区（GtkScrolledWindow）里面。</p>
<h3>处理UTF-8字符串</h3>
<p>要注意的问题是，GTK+内部使用UTF-8编码。在处理非ASCII编码的字符串时，切不可使用C语言string.h里的函数。在UTF-8中，字符含义比较复杂。还好，GLib中提供了很多用于处理多种编码字符串的函数，下面介绍一些用于处理UTF-8字符串的函数。</p>
<p>在<a href="http://library.gnome.org/devel/glib/stable/glib-Unicode-Manipulation.html">http://library.gnome.org/devel/glib/stable/glib-Unicode-Manipulation.html</a>中介绍了很多有关UTF-8字符串的实用函数。这些函数命名与string.h里的常用函数相近，只是多了前缀g_utf8_，表示是专门用来处理UTF-8字符串的。介绍几个吧。</p>
<ul>
<li>g_utf8_strlen()：统计UTF-8字符串中的字符数。在UTF-8编码中，不同语言的字符所占用的字节数不同（例如一个中文字符占3个字节），因而UTF-8所包含的字符数小于等于它的字节数，并且没有一个固定的关系。这个函数还是很常用且重要的。</li>
<li>g_utf8_find_prev_char()：已知某个字符的首地址，查找它前一个字符的首地址。因为不同语言的字符所占用的字节数不同，两个紧邻字符地址之差可能大于1。</li>
<li>g_utf8_find_next_char()：已知某个字符的首地址，查找它后一个字符的首地址。</li>
<li>g_utf8_strncpy()：拷贝出字符串的前n个字符（而不是前n个字节）。</li>
<li>g_utf8_strchr()：找到一个给定的字符最左端出现的位置。UTF-8字符串中字符是gunichar型，相当于一个32位无符号整数，对于非ASCII字符，其值大于127。</li>
<li>g_utf8_collate()：比较两个字符串的大小（以字典序靠前的为小）。这个函数的强大之处在于，它可以根据所处的语言环境来判断两个字符串的字典顺序，可以比较任何语言的UTF-8字符串！</li>
</ul>
<p>在<a href="http://library.gnome.org/devel/glib/stable/glib-String-Utility-Functions.html">http://library.gnome.org/devel/glib/stable/glib-String-Utility-Functions.html</a>列出了一些跨字符集的实用函数，适用于任何字符集。其中有一部分常常能用上，比如g_snprintf()和g_strdup_printf()，它们的功能与C语言sprintf类似，都是把一串格式输出写进字符串里（常用于数字和字符混合输出到字符串里），但g_snprintf()和g_strdup_printf()更安全。g_snprintf()需要指定目的字符串长度，避免输出越界；g_strdup_printf()则在函数内部自行申请足够的空间存放目的字符串（注意它返回的字符串废弃之后需要用g_free()释放空间）。</p>
<p>在<a href="http://library.gnome.org/devel/glib/stable/glib-Character-Set-Conversion.html">http://library.gnome.org/devel/glib/stable/glib-Character-Set-Conversion.html</a>有一些字符集转换的函数，有些需要字符集转换的场合会用得上（比如文件名可能不是UTF-8编码，有时需要转换）。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2010/10/gtk-4.html' rel='bookmark' title='学习使用GTK+ 4.GTK+常用物件及API（窗口）'>学习使用GTK+ 4.GTK+常用物件及API（窗口）</a></li>
<li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li>
<li><a href='http://blog.programet.org/2011/03/gtk-6.html' rel='bookmark' title='学习使用GTK+ 6.GTK+常用物件及API（按钮）'>学习使用GTK+ 6.GTK+常用物件及API（按钮）</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/10/gtk-5.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[学习使用GTK+]]></series:name>
	</item>
		<item>
		<title>学习使用GTK+ 4.GTK+常用物件及API（窗口）</title>
		<link>http://blog.programet.org/2010/10/gtk-4.html</link>
		<comments>http://blog.programet.org/2010/10/gtk-4.html#comments</comments>
		<pubDate>Wed, 06 Oct 2010 19:02:33 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3294</guid>
		<description><![CDATA[这一部分内容介绍有关GTK+常用窗口类物件的一些函数。如果对内容有疑问，请在下方留言，谢谢！ GTK+的窗口 窗口是GTK+最基本的物件之一，物件要被放在窗口里显示。GTK+里，常用的窗口包括顶级窗口（GtkWindow）、对话框（GtkDialog）和消息对话框（GtkMessageDialog）等。 GTK+有关窗口的操作很多，绝大多数情况下可以满足自定义窗口的需求；但有时候还是不可避免要直接访问底层库GDK。要注意的是，GdkWindow与GtkWindow有很大差异，GdkWindow指一个显示区域，每一个可显示的GTK+物件都对应一个GdkWindow，阅读文档时两者不可混淆。 窗口类物件在Glade中得到了良好的支持，复杂的窗口建议直接用Glade创建。 简易消息对话框 消息对话框是最简易的窗口，如果还在Glade中创建的话，很麻烦且会使Glade文件变得更大。下面这些函数，可以快速创建一个窗口而不需要Glade。 void gtk_show_info&#40;gpointer window, const gchar* message, const gchar* title&#41; &#123; GtkWidget *dialog; dialog = gtk_message_dialog_new_with_markup&#40;window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, message&#41;; gtk_window_set_title&#40;GTK_WINDOW&#40;dialog&#41;, title&#41;; gtk_dialog_run&#40;GTK_DIALOG&#40;dialog&#41;&#41;; gtk_widget_destroy&#40;GTK_WIDGET&#40;dialog&#41;&#41;; &#125; &#160; void gtk_show_error&#40;gpointer window, const gchar* message, const gchar* title&#41; &#123; GtkWidget *dialog; dialog = gtk_message_dialog_new_with_markup&#40;window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, message&#41;; gtk_window_set_title&#40;GTK_WINDOW&#40;dialog&#41;, title&#41;; gtk_dialog_run&#40;GTK_DIALOG&#40;dialog&#41;&#41;; gtk_widget_destroy&#40;dialog&#41;; [...]
相关文章：<ol>
<li><a href='http://blog.programet.org/2010/10/gtk-5.html' rel='bookmark' title='学习使用GTK+ 5.GTK+常用物件及API（文本）'>学习使用GTK+ 5.GTK+常用物件及API（文本）</a></li>
<li><a href='http://blog.programet.org/2010/08/gtk-1.html' rel='bookmark' title='学习使用GTK+ 1.构建GTK+编译环境'>学习使用GTK+ 1.构建GTK+编译环境</a></li>
<li><a href='http://blog.programet.org/2011/03/gtk-6.html' rel='bookmark' title='学习使用GTK+ 6.GTK+常用物件及API（按钮）'>学习使用GTK+ 6.GTK+常用物件及API（按钮）</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>这一部分内容介绍有关GTK+常用窗口类物件的一些函数。如果对内容有疑问，请在下方留言，谢谢！</p>
<p><span id="more-3294"></span></p>
<h3>GTK+的窗口</h3>
<p>窗口是GTK+最基本的物件之一，物件要被放在窗口里显示。GTK+里，常用的窗口包括顶级窗口（GtkWindow）、对话框（GtkDialog）和消息对话框（GtkMessageDialog）等。</p>
<p>GTK+有关窗口的操作很多，绝大多数情况下可以满足自定义窗口的需求；但有时候还是不可避免要直接访问底层库GDK。要注意的是，GdkWindow与GtkWindow有很大差异，GdkWindow指一个显示区域，每一个可显示的GTK+物件都对应一个GdkWindow，阅读文档时两者不可混淆。</p>
<p>窗口类物件在Glade中得到了良好的支持，复杂的窗口建议直接用Glade创建。</p>
<h3>简易消息对话框</h3>
<p>消息对话框是最简易的窗口，如果还在Glade中创建的话，很麻烦且会使Glade文件变得更大。下面这些函数，可以快速创建一个窗口而不需要Glade。</p>

<div class="wp_codebox"><table><tr id="p329432"><td class="code" id="p3294code32"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> gtk_show_info<span style="color: #009900;">&#40;</span>gpointer window<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> message<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> title<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkWidget <span style="color: #339933;">*</span>dialog<span style="color: #339933;">;</span>
    dialog <span style="color: #339933;">=</span> gtk_message_dialog_new_with_markup<span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span>
             GTK_DIALOG_DESTROY_WITH_PARENT<span style="color: #339933;">,</span>
             GTK_MESSAGE_INFO<span style="color: #339933;">,</span>
             GTK_BUTTONS_OK<span style="color: #339933;">,</span>
             message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_window_set_title<span style="color: #009900;">&#40;</span>GTK_WINDOW<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> title<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_dialog_run<span style="color: #009900;">&#40;</span>GTK_DIALOG<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_widget_destroy<span style="color: #009900;">&#40;</span>GTK_WIDGET<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> gtk_show_error<span style="color: #009900;">&#40;</span>gpointer window<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> message<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> title<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkWidget <span style="color: #339933;">*</span>dialog<span style="color: #339933;">;</span>
    dialog <span style="color: #339933;">=</span> gtk_message_dialog_new_with_markup<span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span>
             GTK_DIALOG_DESTROY_WITH_PARENT<span style="color: #339933;">,</span>
             GTK_MESSAGE_ERROR<span style="color: #339933;">,</span>
             GTK_BUTTONS_OK<span style="color: #339933;">,</span>
             message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_window_set_title<span style="color: #009900;">&#40;</span>GTK_WINDOW<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> title<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_dialog_run<span style="color: #009900;">&#40;</span>GTK_DIALOG<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_widget_destroy<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
gint gtk_show_question<span style="color: #009900;">&#40;</span>gpointer window<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> message<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> title<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    gint i<span style="color: #339933;">;</span>
    GtkWidget <span style="color: #339933;">*</span>dialog<span style="color: #339933;">;</span>
&nbsp;
    dialog <span style="color: #339933;">=</span> gtk_message_dialog_new_with_markup<span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span>
             GTK_DIALOG_DESTROY_WITH_PARENT<span style="color: #339933;">,</span>
             GTK_MESSAGE_QUESTION<span style="color: #339933;">,</span>
             GTK_BUTTONS_YES_NO<span style="color: #339933;">,</span>
             message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_window_set_title<span style="color: #009900;">&#40;</span>GTK_WINDOW<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> title<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    i<span style="color: #339933;">=</span>gtk_dialog_run<span style="color: #009900;">&#40;</span>GTK_DIALOG<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_widget_destroy<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">==</span>GTK_RESPONSE_YES<span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> gtk_show_warning<span style="color: #009900;">&#40;</span>gpointer window<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> message<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar<span style="color: #339933;">*</span> title<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkWidget <span style="color: #339933;">*</span>dialog<span style="color: #339933;">;</span>
    dialog <span style="color: #339933;">=</span> gtk_message_dialog_new_with_markup<span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span>
             GTK_DIALOG_DESTROY_WITH_PARENT<span style="color: #339933;">,</span>
             GTK_MESSAGE_WARNING<span style="color: #339933;">,</span>
             GTK_BUTTONS_OK<span style="color: #339933;">,</span>
             message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_window_set_title<span style="color: #009900;">&#40;</span>GTK_WINDOW<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> title<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_dialog_run<span style="color: #009900;">&#40;</span>GTK_DIALOG<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_widget_destroy<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>以上四个函数分别是一个信息窗口、错误提示窗口、询问窗口、警告窗口，三个参数分别是母窗口、窗口内文字内容、窗口标题。在程序中直接调用函数即可。</p>
<h3>文件选择对话框</h3>
<p>文件选择对话框同样可以不用Glade创建，而直接调用API方便地创建。下面的函数可以创建文件打开对话框和文件保存对话框。</p>

<div class="wp_codebox"><table><tr id="p329433"><td class="code" id="p3294code33"><pre class="c" style="font-family:monospace;">GtkWidget<span style="color: #339933;">*</span> gtk_show_file_add_filter<span style="color: #009900;">&#40;</span>GtkWidget<span style="color: #339933;">*</span> dialog<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>description<span style="color: #339933;">,</span> gchar <span style="color: #339933;">*</span>pattern<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	GtkWidget <span style="color: #339933;">*</span>filter<span style="color: #339933;">;</span>
	filter<span style="color: #339933;">=</span>GTK_WIDGET<span style="color: #009900;">&#40;</span>gtk_file_filter_new<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	gtk_file_filter_set_name<span style="color: #009900;">&#40;</span>GTK_FILE_FILTER<span style="color: #009900;">&#40;</span>filter<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>description<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	gtk_file_filter_add_pattern<span style="color: #009900;">&#40;</span>GTK_FILE_FILTER<span style="color: #009900;">&#40;</span>filter<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>pattern<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	gtk_file_chooser_add_filter<span style="color: #009900;">&#40;</span>GTK_FILE_CHOOSER<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>GTK_FILE_FILTER<span style="color: #009900;">&#40;</span>filter<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> filter<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
gchar<span style="color: #339933;">*</span> gtk_show_file_open<span style="color: #009900;">&#40;</span>GtkWidget<span style="color: #339933;">*</span> parent_window<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>title<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>filters<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkWidget <span style="color: #339933;">*</span>dialog<span style="color: #339933;">,*</span>FF<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    gchar <span style="color: #339933;">*</span>filename<span style="color: #339933;">,</span>des<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">256</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>pattern<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">64</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">long</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>FFc<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    dialog <span style="color: #339933;">=</span> gtk_file_chooser_dialog_new <span style="color: #009900;">&#40;</span>title<span style="color: #339933;">,</span>
                                          GTK_WINDOW<span style="color: #009900;">&#40;</span>parent_window<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                                          GTK_FILE_CHOOSER_ACTION_OPEN<span style="color: #339933;">,</span>
                                          <span style="color: #808080; font-style: italic;">/*GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,*/</span>
                                          GTK_STOCK_OPEN<span style="color: #339933;">,</span> GTK_RESPONSE_ACCEPT<span style="color: #339933;">,</span>
                                          NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//filters</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>strlen<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>strlen<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> filters<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #ff0000;">'|'</span><span style="color: #009900;">&#41;</span>
			des<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>filters<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">256</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		des<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		i<span style="color: #339933;">++;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&gt;=</span>strlen<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>strlen<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> filters<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #ff0000;">'|'</span><span style="color: #009900;">&#41;</span>
			pattern<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>filters<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">64</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		pattern<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		FF<span style="color: #009900;">&#91;</span>FFc<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>gtk_show_file_add_filter<span style="color: #009900;">&#40;</span>dialog<span style="color: #339933;">,</span>des<span style="color: #339933;">,</span>pattern<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>FFc<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>gtk_dialog_run <span style="color: #009900;">&#40;</span>GTK_DIALOG <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> GTK_RESPONSE_ACCEPT<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        filename <span style="color: #339933;">=</span> gtk_file_chooser_get_filename <span style="color: #009900;">&#40;</span>GTK_FILE_CHOOSER <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        gtk_object_destroy<span style="color: #009900;">&#40;</span>GTK_OBJECT<span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> filename<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
gchar<span style="color: #339933;">*</span> gtk_show_file_save<span style="color: #009900;">&#40;</span>GtkWidget<span style="color: #339933;">*</span> parent_window<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>title<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>default_folder<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>default_name<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> gchar <span style="color: #339933;">*</span>filters<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    GtkWidget <span style="color: #339933;">*</span>dialog<span style="color: #339933;">,*</span>FF<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    gchar <span style="color: #339933;">*</span>filename<span style="color: #339933;">,</span>des<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">256</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>pattern<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">64</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">long</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>FFc<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    dialog <span style="color: #339933;">=</span> gtk_file_chooser_dialog_new <span style="color: #009900;">&#40;</span>title<span style="color: #339933;">,</span>
                                          GTK_WINDOW<span style="color: #009900;">&#40;</span>parent_window<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                                          GTK_FILE_CHOOSER_ACTION_SAVE<span style="color: #339933;">,</span>
                                          <span style="color: #808080; font-style: italic;">/*GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,*/</span>
                                          GTK_STOCK_SAVE<span style="color: #339933;">,</span> GTK_RESPONSE_ACCEPT<span style="color: #339933;">,</span>
                                          NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_file_chooser_set_do_overwrite_confirmation <span style="color: #009900;">&#40;</span>GTK_FILE_CHOOSER <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> TRUE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>default_folder<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>gtk_file_chooser_set_current_folder <span style="color: #009900;">&#40;</span>GTK_FILE_CHOOSER <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> default_folder<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    gtk_file_chooser_set_current_name <span style="color: #009900;">&#40;</span>GTK_FILE_CHOOSER <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> default_name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//filters</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>strlen<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>strlen<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> filters<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #ff0000;">'|'</span><span style="color: #009900;">&#41;</span>
			des<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>filters<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">256</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		des<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		i<span style="color: #339933;">++;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&gt;=</span>strlen<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>strlen<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> filters<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #ff0000;">'|'</span><span style="color: #009900;">&#41;</span>
			pattern<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>filters<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">64</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		pattern<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		FF<span style="color: #009900;">&#91;</span>FFc<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>gtk_show_file_add_filter<span style="color: #009900;">&#40;</span>dialog<span style="color: #339933;">,</span>des<span style="color: #339933;">,</span>pattern<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>FFc<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>gtk_dialog_run <span style="color: #009900;">&#40;</span>GTK_DIALOG <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> GTK_RESPONSE_ACCEPT<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        filename <span style="color: #339933;">=</span> gtk_file_chooser_get_filename <span style="color: #009900;">&#40;</span>GTK_FILE_CHOOSER <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        gtk_widget_destroy <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> filename<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//destroy</span>
    gtk_widget_destroy <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>FFc<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    	gtk_object_destroy<span style="color: #009900;">&#40;</span>GTK_OBJECT<span style="color: #009900;">&#40;</span>FF<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>gtk_show_file_open()建立一个文件打开窗口供用户选择文件，参数依次是母窗口、标题、过滤器。</p>
<p>gtk_show_file_save()建立一个文件保存窗口供用户选择文件，参数依次是母窗口、标题、默认文件夹、默认文件名、过滤器。</p>
<p>其中“过滤器”是一串字符，字符内用“|”分离，其形式像这样：文件类型名称1|对应通配符1|文件类型名称2|对应通配符2|……</p>
<h3>使用GDK函数</h3>
<p>GTK+提供好了丰富的功能，但也有缺陷——某些常用功能无法直接使用，需要访问GDK库。下面这个函数，用来确定窗口是不是处于全屏状态。</p>

<div class="wp_codebox"><table><tr id="p329434"><td class="code" id="p3294code34"><pre class="c" style="font-family:monospace;">gboolean gtk_window_is_fullscreen<span style="color: #009900;">&#40;</span>GtkWindow<span style="color: #339933;">*</span> window<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>gdk_window_get_state<span style="color: #009900;">&#40;</span>gtk_widget_get_window<span style="color: #009900;">&#40;</span>GTK_WIDGET<span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> GDK_WINDOW_STATE_FULLSCREEN<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> GDK_WINDOW_STATE_FULLSCREEN<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>其他用法，请参阅GTK+参考。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p><p>相关文章：<ol>
<li><a href='http://blog.programet.org/2010/10/gtk-5.html' rel='bookmark' title='学习使用GTK+ 5.GTK+常用物件及API（文本）'>学习使用GTK+ 5.GTK+常用物件及API（文本）</a></li>
<li><a href='http://blog.programet.org/2010/08/gtk-1.html' rel='bookmark' title='学习使用GTK+ 1.构建GTK+编译环境'>学习使用GTK+ 1.构建GTK+编译环境</a></li>
<li><a href='http://blog.programet.org/2011/03/gtk-6.html' rel='bookmark' title='学习使用GTK+ 6.GTK+常用物件及API（按钮）'>学习使用GTK+ 6.GTK+常用物件及API（按钮）</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/10/gtk-4.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<series:name><![CDATA[学习使用GTK+]]></series:name>
	</item>
	</channel>
</rss>

