<![CDATA[hqlong.bokee.com]]> zh_cn Wed,23 Aug 2006 11:28:03 CST Thu,10 May 2007 00:08:53 CST http://www.bokee.com http://reg.bokee.com/account/web/img/logo.gif 博客网 http://www.bokee.com 您好,欢迎访问yunle110.bokee.com <![CDATA[机器人的新博客]]> .html http://hqlong.phpoo.cn]]> Thu,10 May 2007 00:08:53 CST 99 <![CDATA[一个使用穷举法实现的例子]]> .html 已知:

 a + b + c = 17, a - b =5,请用求出a,b,c的所有可能值?

分析:由题意可知:a的取值范围为0~17,b的取值范围为0~12,c的取值范围为0~17.

 

#include <stdio.h>

void main(){
  int a, b, c;
  int n = 0;
  for (  a = 0; a < 17; a ++ ){
    for(  b = 0; b < 12; b++ ) {
      for (  c = 0; c < 17; c++ ) {
        if ( (a + b + c) == 17 && (a - b) == 5 ) {
          n++;
          printf("%d %d %d\t",a,b,c);
          if ( !( n % 3 ) ) printf("\n");
        }
     
      }
    }
  }
  printf("\n共有 %d 组结果\n",n);
}


 

]]>
Sat,07 Apr 2007 18:03:22 CST 0
<![CDATA[北京胡同里孩子的求婚词——精典!!!]]> .html "喂,谁啊"
"我。"
"干嘛?"
"没事儿。"

"没事儿给我打电话干嘛呀?"
"没事就不能给你打啊?你知道今儿什么日子吗?"

"今儿?什么日子?不知道。"
"真不知道?"

"不知道。"
"今儿是咱俩认识十六年纪念日啊,这你都不记得啦?"

"胡扯你,谁认识你十六年啊?"
"你忘啦?那年前就是今天我转到你们学校。"

"不知道,谁记得你啊。你在哪儿呢现在?"
"在家。"

"你们家怎么这么乱啊?"
"来人了,你出来吗?我想你了。"

"不出去,太晚了,想请我吃饭干嘛不早说?"
"我不是怕您忙嘛。"

"哼,你还想的起来我?"
"对了,告诉你一事儿。。。"

"等我换个台,行了说吧。"
"你的得有心理准备啊。"

"说吧。"
"我真说啦?"

"爱说不说。"
"我要结婚了。。。"

"你说什么?"
"我要结婚了。。。"

"。。。。。。"
"喂~"
"哎,我听着呢,跟谁啊?谁家闺女这么倒霉啊?"
"怎么跟我结婚是倒霉啊?"

"嘿,到底是谁啊?说来听听。"
"嘿,你猜猜。"

"不猜,爱说不说。"
"嘿,是你。"

"什么?"
"你呗,我要跟你结婚了。"

"。。。。。"
"喂,你干嘛呢?喂!"

"谁跟你结婚啊?想什么哪你?"
"跟我结婚吧,我想娶你。"

"该干嘛干嘛去你,少拿我找乐儿。"
"我说同志,你觉得我象是在开玩笑吗?"

"你开玩笑开了多少年啦?"
"你不觉得我在今天这个特别的日子向你求婚很浪漫吗?"

"就你还懂浪漫?就你这也叫求婚?得得得,你该干什么干什么去吧你,我该睡觉了。"

"。。。。。"

"喂!"
"。。。。。"

"我撂啦!"
"嫁给我吧。"

"。。。。。"
"我想娶你。"

"我干嘛要嫁给你啊?嫁你有什么好?"
"咱们这么多年了,你还不了解我?难道你还看不出来我的好?"

"嘿嘿,说出来你别伤心,我还真没看出来你有什么好。"
"真伤人心啊你。"

"嘿。。。"
"你说,这么多年我求过你事情吗?"

"多了去了。。。"
"帮我考试作弊可不算啊!我就今天求你这一回,嫁给我吧。"
"可这也不代表我就得嫁给你啊,我嫁谁不比嫁你强?"
"问题是谁能象我这样对你好啊?你说,我打小儿什么事儿没为你做过?"

"也多了去了。。。"
"小事儿咱就不说了,你就说那会儿为了你,我都敢打三班那胖子,丫比我高一头我都没怕他,这都是为了你啊!"

"我天啊,小学那会儿的事儿亏你还好意思说。你也就那会儿敢动人家,自打上了中学你就开始往瘦里长,我就纳闷儿了,怎么人家都往高里大里长,你偏偏越长越出溜。"
"我那不是青春期营养没跟上嘛,再说了,我那会儿就能为你出生入死上刀山下火海,可见我对你一网情深这么多年啊,十几年啦我说,多感天多动地啊!"

"得了吧你,打那会儿就没安好心。想娶我?往后排个儿去吧你,在你前头的多了去了。"
"要排也得让他们排去啊,我跟你多少年啦?"

"哼..."
"宝儿.."

"干嘛?"
"宝儿.."

"干嘛呀到底?"
"嫁给我吧.."

"不嫁。"
"嫁给我吧,就嫁一次,成吧?"

"你还想让我嫁几次啊?"
"哈,你答应啦?好好好,不嫁那么多次,就这一次。"

"你..你...气死我了,谁答应你啦?"
"嘿,你总得听你爸你□□话吧?他们都喜欢我,其实你爸早就把我当女婿了对吧?"


"少胡说!我爸其实特腻味你!老说你不是老实孩子。"
"不是吧,每次我给你爸带酒去你爸那脸儿乐的跟桃儿似的,怎么会腻味我哪?"

"去!我爸有礼貌,那是微笑。当谁都是你啊?看谁都跟看猴儿似的,贫气!"
"行行,我贫,可你妈妈特喜欢我这贫劲儿,早就希望咱们俩好了,她偷着跟我说过。"


"我妈更年期,你听她的啊?我都不听,你还听?嘁..."
"你妈都六十了快,还更年期?"

"那怎么啦?也不想想我妈是谁?"
"不提你妈了,那什么,我妈可特喜欢你,打小儿。"

"你妈对所有你带回家的女孩儿都那样儿,还好意思说?"
"哎哎哎,咱可不兴造谣啊?我什么时候带过女孩回家啊除了你?"

"还说哪?当初光在你们系里你总共就有多少蜜?啊?大蜜二蜜三蜜四蜜..."
"我说你这儿都打哪儿听来的啊?纯粹是弥天大谎,简直是对我的侮辱!"

"我听老BING说的。"
"谁?"

"老BING。"
"老BING?我说大姐你听他的啊?他是人吗你听他的?那孙子打小儿就没学过怎么说实话,满嘴跑火车,瞎话张嘴就来,都不带琢磨的,你听他的?嘿,你怎么赵薇似的啊?"
"我撂啦!"
"哎,别撂别撂,我错了。别撂。"

"老BING比你强。"
"他除了肚子比我粗一圈儿,哪儿比我好吧你就说。"


"他对他女朋友好。"
"错了吧?丫一贯喜欢玩弄女性,这你不知道?再说了,他跟她对象那纯粹是为了生理需要才走到一起,哪儿有咱们这么崇高啊?哎不对,我说,难道我对你就不好吗?"

"谁是你女朋友啊?少臭美....."
"是是是,不是我女朋友,马上就是我太太了,呵呵....."


"我凭什么跟你结婚啊?你有什么好啊?"
"我天天给你做饭,天天陪你玩儿。"


"你做饭?给谁吃啊?你做的饭那叫饭嘛?连我们家贝贝都不吃!"
"咳,给狗吃那么好干嘛?我这几天正背菜谱儿呢。"


"对了我还没找你哪,上次贝贝吃了你做的丸子,都吐了!光打针就花了一百多!"
"嘿,回头我给它找个对象成吧?找一跟我这么帅的。"

"去你的,干脆你跟贝贝好得了,我替你做媒,挺合适的你们。"
"找乐儿哈你?咱说正经事儿哪!"

"嘿嘿....."
"臭丫头!"

"骂我?"
"不是不是,不是骂你,骂我妹哪,她抢我烟不让我抽。"

"对了,就你那张嘴,天天跟火葬场大烟囱似的,熏死人,就这还嫁你?"
"好好,咱们结婚以后我保证戒烟,不不不,从现在开始,我从现在开始戒烟,真的。"

"你爱戒不戒,跟我没关系。"
"我说宝儿啊,咱都不小了,啊,对吧?你看我穷困潦倒,你也孤苦伶仃,咱多合适啊,天作之合啊简直是。反正我这辈子就想娶你了,别人都玩儿去!"
".........."
"嫁给我吧宝儿。"

"不嫁!终身大事怎么能这么草率?你当这买菜啊?"
"我对你好。"

".........."
".....我知道你也想嫁给我对吧?"

"去吧你,嫁你?一个月挣的还不如我多哪!甭管什么时候你身上最大的票也就是五块,发了工资才能见着十块的,嫁你?开玩笑,嘿嘿,简直是回到了万恶的旧社会。"
"打住打住,我说宝儿同志啊,这不象你啊,在我眼里,你是那种视钱财如粪土的人啊,谁越有钱越瞧不起谁,怎么现在这么物质了嘛?这样很不好嘛?"

"去去去,少学那谁说话!也不知道没劲....."
"嘿,好,没劲没劲。其实我不是没钱,我是节俭,你想啊,咱们以后的日子还长着哪,得从长计议啊是吧?"

"谁跟你以后啊?少臭美了,讨厌....."
"呵呵...嫁给我吧。"

"........."
"你怎么老不说话啊?"

"没有..."
"那你说说我们吧。"

"我们什么啊?"
"咱俩呗。"

"....."
"说啊!"

"你刚才说的是在开玩笑吗?老实回答我!"
"....这么多年你还不了解我?你应该知道有些事情我绝不开玩笑。"

"呵呵,不知道。"
"呵,快说吧。"
"其实...."
"嗯.."

"其实..."
"其实什么?"

"其实我也知道你对我好,我不是傻子,我看的出来..."
"......."

"这么多年,身边这么多人,除了我妈我爸就你对我好...."
"....."

"就你不骗我...."
"嘿,你知道就好了..."

"其实,跟你也没什么不好的..."
"......"

"说真的,你比我哥对我都好,要不是你,当初我还真..."
"咳,行了,还提那事儿干嘛呀?"

"可是,我觉得我跟你不合适..."
"怎么哪?怎么不合适了?"

"我们太熟了,彼此根本没有秘密,我太了解你,你也了解我,这样不合适。"
"你看你看,难道我们必须彼此陌生才行是吗?"

"也不是,不过我就是觉得..."
"觉得什么?"

"觉得....觉得我配不上你."
"......"

"我不适合你。"
"谁说的?谁说咱们不合适?"

"我说的。"
"你嫌弃我是吗?"

"那倒不..."
"那不就齐活了吗?"

"其实,别人都说过,我配不上你,我也觉得你这样不值得,毕竟我以前..."
"打住打住!谁他妈这么王八蛋说这话?怎么配不上我啦?"

"你别管谁说的了,我也想过我们,真的,其实...其实跟你在一起我觉得挺好的,你什么事情都让着我,不给我气受,可我就觉得我太对不起你,你对我怎么样我知道,我比谁都知道,我就怕我以前的事..."

"停,停停!你听着啊,我妈老跟我说,要娶媳妇就得娶你这样儿的,虽然我妈不知道你的事儿,我也没跟她提起过,可就算让她知道了,她更得让我娶你,我妈疼你,跟我一样喜欢你,她早就把你当儿媳妇了,见不得你受委屈。就算你当初跟皇冠3.0好的时候不常来我们家,我妈还是老提起你,一提起你就问我你为什么不来了,我没办法回答她,我就说你工作忙。说真的,我倒是真希望你当时是工作忙,省的老让我揪心。
我妈老蹿蹬我让我跟你说,我老怕你不答应,弄得我怪没脸的,我就一直没说。今天我实在憋不下去了,这事儿老压我肚子里我别扭!我必须得对你说,我得娶你,我必须娶你!除了你我谁都不娶!谁他妈爱说什么说什么,我不在乎,我才不管你以前怎么样,这辈子我娶定你了我告诉你!就算你现在不同意,我也早晚有一天让你答应嫁给我,就算你说死皮赖脸我都不在乎。就算你爸你妈把我当要饭的不搭呲我,我也得娶你,这么多年了,你看见过我对别人说这种话吗?就算我穷,我也能让你吃好的,就算我穷的卖血>去,我也能养你。我跟你说宝儿,其实我不该告诉你,皇冠3.0那胳膊是我打的,丫是我办的,打小儿我就容不得别人欺负你,他有钱怎么着?有钱就能欺负人啊?是,我是没钱,可我对你好,我不欺负你,我也不让别人欺负你,谁欺负你我办谁。你要是觉得我不是过日子人,觉得带我出去寒禅,那我没辙,我就这副模样儿,我妈生的我,把我生成一猴儿我都没辙,没办法跟她急。我是丑点儿,我也不敢说我人有多好,我可以跟所有都不对付,我敢让别人都他妈玩儿去,惟独就你,我就在乎你,我等你等到我都这么大了,多少年了啊我?多少年啦?你说,你自己说,你又不是不知道,当初要不是那皇冠3.0,我早..."

"行了,你..你别说了..."
"哎,你别哭啊,你看我这废物蛋,又提这事了,我他妈真笨我,你,你别哭..."

"......"
"喂~"

"......"
"宝儿..."

"嗯..."
"你说话啊!"

"你找我来吧。"
"你先答应我。"

"你来了再说。"
"不行,我要你现在就答应我!"

"......"
"......"

"你再说一遍刚才的话。"
"什么话啊?"

"刚才的话。"
"哪句啊?"

"大笨蛋..."
"呵,我知道了..."

"再说一遍..."
"你让我怎么说?小声儿说还是大声儿说?"
"大声儿。"
"那不行吧,你们家邻居该有意见了,这大半夜的,呵呵..."

"什么?你在哪儿哪?"
"嘿,我在你们家楼下,快冻死了..."

"啊?你..你怎么在楼下呆着啦?有病啊你,外头都下雪了,等我开窗。"
"我喊啦!"

"别别别,别喊,我马上就开窗了,别喊!"
"不行,我得喊。"

"别喊,你在哪儿哪?我看不见你啊!"

"宝儿,嫁给我吧!!!"

"呀,你..你..你.."
"嘿嘿..."

"等我下去..."
"好..嘿嘿...."
............

"嫁给我吧宝儿.."
"....."

"嘿,哆嗦了吧,也不穿件衣服,嘿..着什么急啊?
嘿..."
"....."

"嫁给我吧宝儿.."
"....."

"我爱你...这么多年了...我爱你..."

....................

"你哭起来怎么没完啦?来,穿上穿上,看那鼻涕,嘿..."
....................

"哪,给你吧,我没空手儿来,该带的东西带了..."
....................
"打开啊你!看看,挺好看的,我妹帮我挑的..."
....................

"呦,嘿..."
...................

"呵呵,不行了,不行了,不娶你了,真沉,抱不动啊,呵呵..."
...................

"哎,别咬我啊,哎..."
"嘿,咬你活该!讨厌..."

...................

"宝儿.."
"嗯.."

"我爱你..."
"嗯..."

"我爱你..."

]]>
Wed,14 Mar 2007 09:08:42 CST 0
<![CDATA[C++之函数对象篇(C++学习笔记)]]> .html 算术函数对象

预定义的算术函数对象支持加减乘除求余和取反调用的操作符是与Type

关联的实例对一个class 类型如果它提供了该操作符的重载实例则调用该实例

加法plus<Types>

plus<string> stringAdd;

// 调用 string::operator+()

sres = stringAdd( sval1, sval2 );

dres = BinaryFunc( plus<double>(), dval1, dval2 );

减法minus<Type>

minus<int> intSub;

ires = intSub( ival1, ival2 );

dres = BinaryFunc( minus<double>(), dval1, dval2 );

乘法multiplies<Type>

multiplies<complex> complexMultiplies;

cres = complexMultiplies( cval1, cval2 );

dres = BinaryFunc( multiplies<double>(), dval1, dval2 );

除法divides<Type>

divides<int> intDivides;

ires = intDivides( ival1, ival2 );

dres = BinaryFunc( divides<double>(), dval1, dval2 );

求余modulus<Type>

modulus<int> IntModulus;

Ires = IntModulus( Ival1, Ival2 );

ires = BinaryFunc( modulus<int>(), ival2, ival1 );

取反negate<Type>

negate<int> intNegate;

ires = intNegate( ires );

Ires = UnaryFunc( negate<int>(), Ival1 );

 

关系函数对象

预定义的关系函数对象支持等于不等于大于大于等于小于和小于等于

等于equal_to<Type>

equal_to<string> stringEqual;

sres = stringEqual( sval1, sval2 );

ires = count_if( svec.begin(), svec.end(),

equal_to<string>(), sval1 );

不等于not_equal_to<Type>

not_equal_to<complex> complexNotEqual;

cres = complexNotEqual( cval1, cval2 );

ires = count_if( svec.begin(), svec.end(),

not_equal_to<string>(), sval1 );

大于greater<Type>

greater<int> intGreater;

ires = intGreater( ival1, ival2 );

ires = count_if( svec.begin(), svec.end(),

greater<string>(), sval1 );

大于等于greater_equal<Type>

greater_equal<double> doubleGreaterEqual;

dres = doubleGreaterEqual( dval1, dval2 );

ires = count_if( svec.begin(), svec.end(),

greater_equal<string>(), sval1 );

小于less<Type>

less<int> IntLess;

Ires = IntLess( Ival1, Ival2 );

ires = count_if( svec.begin(), svec.end(),

less<string>(), sval1 );

小于等于less_equal<Type>

less_equal<int> intLessEqual;

ires = intLessEqual( ival1, ival2 );

ires = count_if( svec.begin(), svec.end(),

less_equal<string>(), sval1 );

 

逻辑函数对象

预定义的逻辑函数对象支持逻辑与两个操作数都为true 时结果值为true——应用与

Type 相关联的&& 逻辑或两个操作数中有一个为true 返回true——应用与Type 相关联

|| 和逻辑非操作数为false 则返回true——应用与Type 相关联的!操作符

逻辑与logical_and<Type>

logical_and<int> intAnd;

ires = intAnd( ival1, ival2 );

dres = BinaryFunc( logical_and<double>(), dval1, dval2 );

逻辑或logical_or<Type>

logical_or<int> intSub;

ires = intSub( ival1, ival2 );

dres = BinaryFunc( logical_or<double>(), dval1, dval2 );

逻辑非 logical_not<Type>

logical_not<int> IntNot;

Ires = IntNot( Ival1, Ival2 );

dres = UnaryFunc( logical_not<double>(), dval1 );

 

函数对象的函数适配器

标准库还提供了一组函数适配器用来特殊化或者扩展一元和二元函数对象适配器是

一种特殊的类它被分成下面两类:

1 绑定器binder ( binder ) 通过把二元函数对象的一个实参绑定到一个特殊的值上

将其转换成一元函数对象例如为了计数一个容器中小于或等于10 的元素的个数我们可能会向count_if()传递一个less_equal 函数对象以及一个被绑定为10 的实参。

2 取反器negator ( negator ) 是一个将函数对象的值翻转的函数适配器例如为了

计数一个容器中所有大于10 的元素的个数我们可以向count_if()传递less_equal 函数对象的

negator 该函数对象有一个实参被绑定为10 当然在这种情况下直接传递greater 对象

binder 并把一个实参绑定为10 更为简洁明了。

C++标准库提供了两种预定义的binder 适配器bind1st bind2nd 正如你所预料的

bind1st 把值绑定到二元函数对象的第一个实参上bind2nd 把值绑定在第二个实参上例如

为了计数容器中所有小于或等于10 的元素的个数我们可以这样向count_if()传递

count_if( vec.begin(), vec.end(),

bind2nd( less_equal<int>(), 10 ));

标准库提供了两个预定义的negator 适配器not1 not2 同样正如你所料想的not1

翻转一元预定义函数对象的真值而not2 翻转二元谓词函数的真值为了取反less_equal

数对象的绑定我们可以这样写

count_if( vec.begin(), vec.end(),

not1( bind2nd( less_equal<int>(), 10 )));

实现函数对象

函数对象类定义的最简单形式包含一个被重载的函数调用操作符例如下面是一个二

元函数对象它判定一个值是否小于等于10

// 函数对象类的简单形式

class less_equal_ten {

public:

bool operator() ( int val )

{ return val <= 10; }

};

使用这个对象的方式与使用预定义函数对象的方式相同例如下面是修改后的count_if()

调用它使用了我们的函数对象

count_if( vec.begin(), vec.end(), less_equal_ten() );

毫无疑问这个类是相当局限的我们可以应用一个negator 来计数容器中大于10 的元

素的个数

count_if( vec.begin(), vec.end(),

not1(less_equal_ten()) );

我们也可以通过允许用户提供一个与每个元素比较的值来扩展我们的实现一种做法是

引入一个数据成员来存储被比较的值以及一个构造函数把这个成员初始化为用户指定的值

class less_equal_value {

public:

less_equal_value( int val ) : _val( val ) {}

bool operator() ( int val ) { return val <= _val; }

private:

int _val;

};

我们现在用这个对象指定一个任意的整数值例如下面的调用计数小于等于25 的元素

的个数

count_if( vec.begin(), vec.end(), less_equal_value( 25 ));

另外一种类的实现方式不使用构造函数它根据被比较的值对类参数化例如

template < int _val >

class less_equal_value {

public:

bool operator() ( int val ) { return val <= _val; }

};

下面给出了怎样调用这个类来计数小于等于25 的元素的个数

count_if( vec.begin(), vec.end(), less_equal_value<25>() );

]]>
Thu,08 Mar 2007 15:43:15 CST 0
<![CDATA[apache加载php模块]]> .html AddType application/x-httpd-php .php
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .php5
Action application/x-httpd-php "/php/php.exe"]]>
Thu,08 Mar 2007 12:39:00 CST 0
<![CDATA[柏拉图与苏格拉底的对话]]> .html 柏拉图与苏格拉底的对话
.
柏拉图有一天问老师苏格拉底什么是爱情
苏格拉底叫他到麦田走一次
要不回头地走
在途中要摘一棵最大最好的麦穗
但只可以摘一次
柏拉图觉得很容易
充满信心地出去
谁知过了半天他仍没有回去
最后,他垂头丧气出现在老师跟前诉说空手而回的原因:
很难得看见一株看似不错的,却不知是不是最好,不得已,因为只可以摘一次,只好放弃,再看看有没有更好的,到发现已经走到尽头时,才发觉手上一棵麦穗也没有
这时,苏格拉底告诉他:
那就是爱情
.
柏拉图有一天又问老师苏格拉底什么是婚姻
苏格拉底叫他到彬树林走一次
要不回头地走
在途中要取一棵最好、最适合用来当圣诞树用的树材
但只可以取一次
柏拉图有了上回的教训
充满信心地出去
半天之后,他一身疲惫地拖了一棵看起来直挺、翠绿,却有点稀疏的杉树
苏格拉底问他:这就是最好的树材吗?
柏拉图回答老师:
因为只可以取一棵,好不容易看见一棵看似不错的又发现时间、体力已经快不够用了,也不管是不是最好的,所以就拿回来了
这时,苏格拉底告诉他:
那就是婚姻
.
柏拉图又有一天又问老师苏格拉底什么是外遇
苏格拉底还是叫他到树林走一次
可以来回走
在途中要取一支最好看的花
柏拉图又充满信心地出去
两个小时之后,他精神抖擞地带回了一支颜色艳丽但稍稍焉掉的花,
苏格拉底问他:这就是最好的花吗?
柏拉图回答老师:
我找了两小时,发觉这是最盛开最美丽的花,但我采下带回来的路上,它就逐渐枯萎下来
这时,苏格拉底告诉他:
那就是外遇
.
又有一天又问老师苏格拉底什么是生活
苏格拉底还是叫他到树林走一次
可以来回走
在途中要取一支最好看的花
柏拉图有了以前的教训
又充满信心地出去
过了三天三夜,他也没有回来。
苏格拉底只好走进树林里去找他,最后发现柏拉图已在树林里安营扎寨。
苏格拉底问他:你找着最好看的花么?
柏拉图指着边上的一朵花说:这就是最好看的花吗。
苏格拉底问:为什么不把它带出去呢?
柏拉图回答老师:
我如果把它摘下来,它马上就枯萎。即使我不摘它,它也迟早会枯。所以我就在它还盛开的时候,住在它边上。等它凋谢的时候,再找下一朵。这已经是我找着的第二朵最好看的花。
这时,苏格拉底告诉他:
你已经懂得生活的真谛了

 

 

]]>
Fri,02 Mar 2007 22:24:31 CST 0
<![CDATA[一个命令行程序的实现(C++ 学习笔记)]]> .html #include <iostream>

#include <string>

#include <vector>

#include <ctype.h>

 

using namespace std;

const char *const program_name = "comline";

const char *const program_version = "version 0.01 (08/07/97)";

inline void usage( int exit_value = 0 )

{

        // 输出一个格式化的用法信息

        // 并用 exit_value 退出...

        cerr << "usage:\n"

        << program_name << " "

        << "[-d] [-h] [-v] \n\t"

        << "[-o output_file] [-l limit] \n\t"

        << "file_name\n\t[file_name [file_name [ ... ]]]\n\n"

        << "where [] indicates optional option: \n\n\t"

        << "-h: help.\n\t\t"

        << "generates this message and exits\n\n\t"

        << "-v: version.\n\t\t"

        << "prints version information and exits\n\n\t"

        << "-d: debug.\n\t\tturns debugging on\n\n\t"

        << "-l limit\n\t\t"

        << "limit must be a non-negative integer\n\n\t"

        << "-o ofile\n\t\t"

        << "file within which to write out results\n\t\t"

        << "by default, results written to standard output \n\n"

        << "file_name\n\t\t"

        << "the name of the actual file to process\n\t\t"

        << "at least one file_name is required --\n\t\t"

        << "any number may be specified\n\n"

        << "examples:\n\t\t"

        << "$command chapter7.doc\n\t\t"

        << "$command -d -l 1024 -o test_7_8 "

        << "chapter7.doc chapter8.doc\n\n";

        exit( exit_value );

}

 

int main( int argc, char* argv[] )

{

        bool debug_on = false;

        bool ofile_on = false;

        bool limit_on = false;

        int limit = -1;

        string ofile;

        vector< string > file_names;

        cout << "illustration of handling command line arguments:\n"

        << "argc: " << argc << endl;

        for ( int ix = 1; ix < argc; ++ix )

        {

                cout << "argv[ " << ix << " ]: "

                << argv[ ix ] << endl;

                char *pchar = argv[ ix ];

                switch ( pchar[ 0 ] )

                {

                        case '-':

                        {

                                cout << "case \'-\' found\n";

                                switch( pchar[ 1 ] )

                                {

                                case 'd':

                                        cout << "-d found: "

                                        << "debugging turned on\n";

                                        debug_on = true;

                                        break;

                                case 'v':

                                        cout << "-v found: "

                                        << "version info displayed\n";

                                        cout << program_name

                                        << " :: "

                                        << program_version

                                        << endl;

                                        return 0;

                                case 'h':

                                        cout << "-h found: "

                                        << "help information\n";

                                        // 这里没必要用 break , usage() 可以退出

                                        usage();

                                case 'o':

                                        cout << "-o found: output file\n";

                                        ofile_on = true;

                                        break;

                                case 'l':

                                        cout << "-l found: "

                                        << "resource limit\n";

                                        limit_on = true;

                                        break;

                                default:

                                        cerr << program_name

                                        << " : error : "

                                        << "unrecognized option: - "

                                        << pchar << "\n\n";

                                        // 这里没必要用 break , usage() 可以退出

                                        usage( -1 );

                                }

                                break;

                        }

                        default: // 或文件名

                        cout << "default nonhyphen argument: "

                        << pchar << endl;

                        if ( ofile_on ) {

                                ofile_on = false;

                                ofile = pchar;