最新日志

发表于:2008-5-3 14:33:06
标签:无标签

0

创业故事

创业故事

[日期:2008-4-30] 来源:internet  作者:未知 [字体: ]

 

本人创业10年,9死1生,占过便宜吃过亏,辛苦过也懒惰过,看到这个论坛里面充斥着大量的没有创业经验的人在指导别人创业,另有大量由于缺乏思路赔光家底的故事,本人非常痛心,本着救人加吹牛的心态特将本人独家秘籍和盘托出,以免大家少走弯路.
  
  教程秘籍一: 为什么要创业?
  这是在你创业前必须先问自己的第一个问题,切记切记!!
  答案一: 身边的人创业发了,我又不比他笨,如果我创业,肯定不会错.
  答案二: 我都年龄不老小了,人总不能打工一辈子吧?现在手头这个项目正好创业!
  答案三:现在手头有点积蓄,年龄也不大,不怕亏,亏了可以再去打工,年龄大了就瞻前顾后了
  答案四:开饭馆的都发了(或者其他任意行业,总之是创业者准备去看得事情),我也要开
  答案五:职位混到头了,老板也不可能给总经理当,工资也会再涨多少了,此时不创业更待何时?
  答案六:现在房子那么贵,打工看来是这辈子都买不起房了,拼了!
  
  以上是绝大多数缺乏创业知识的人的心中选择的答案,如果你的答案出现在上述答案中,那么请你千万记住,把创业的想法就当作吹牛的谈资就可以了。
  
  正确的答案是: 我已经发现了一个确定可以赚到钱的项目!
  千万要记住此秘籍: 
  创业教程初级班秘籍之一: 因为发现了确定的可以赚到钱的可行的项目,所以我决定创业!
  
  任何非此答案的创业理由都是错误的!年龄大了,别人发了,房子贵了,现在有闲钱都不是你可以去创业的理由,只能成为你败家的借口!

教程秘籍二:我是个有经营头脑的人吗? 
  很不幸,这个世界绝大多数人是不适合独立创业的,但是只有极少数人可以清醒地认识到这个问题(一般是把自己的老婆孩子都亏光之后) 
  注意:经营头脑不等于管理头脑,也不等于执行头脑。但,如果你要独立创业的话,没有经营头脑等于自杀,等于拿自己钱玩过家家。所以鉴定一下自己这个脑袋,是至关重要的头等大事,如果你有幸可以碰到我这样的好人的话,我可以免费帮你鉴定,呵呵! 
  太多的故事是这样告诉大家的:王老三勤勤恳恳,拿吃亏当福,最终终于成了大地主! 
  李老四早上3点起床干活,晚上2点上床睡觉,终于成了一代富豪!故事本来是逗人玩的,无非是善有善报,恶有恶报那一套,但是不幸的是,我发现很多人正是拿这样的故事来看待自己的创业的:我能吃苦!我不怕吃亏! 我意志坚强,可以顶住所有的压力!这些都不是你可以成功的充分条件 
  拿我遇到的真实故事告诉大家什么叫经营头脑吧。 
  公司同事每天中午都会打电话定快餐,在众多的送快餐的人中有这样一位:提一个大木盒子,上面盖着保温的棉毛巾,每次这个人把某位同事定好的饭交给定饭的人后,都会问有没有人没有定饭?因为他随时带了4~5份没有人定的饭,而我发现,每次都有人没有定饭,而直接向此人购买了盒饭。我怀疑此人在帮某餐厅送饭的同时,又顺便炒了单,要知道送快餐提成才5毛,但是炒单我估计他一份盒饭至少赚了2元。 
   
  这就叫经营头脑!---在工作中轻易的发现商机的能力! 
   
  好了,那么如何鉴别你是否有经营头脑呢?很简单,回顾一下过去,你是否曾经有过在工作中发现某件事情可以创造利润,而没有人去干?如果你过去从来没有过这样的体验,那么,很不幸,你是个没有经营头脑的人,你—---至少不适合独立创业!如果你现在开始开动脑筋,发现好像好多商机,那么恭喜你,你很适合当副总,就是在我的指导下工作,呵呵! 
   
  创业教程初级班秘籍二:没有经营头脑的人,不适合独立创业! 

三: 如何判断一个项目是好项目? 
   
  如果你通过了俺的上述2关考察,那么让我们进入到下一个环节,让我们一起看看你自以为好的项目到底如何. 
  由于身在深圳的缘故,这十几年目睹了无数的创业故事,而其中的大多数项目基本上从开始的那一天就注定是要死的,如果你可以提前预知自己必死无疑,那你想想你可以节省多少钱啊?可以让你在未来少多少的追悔莫及的感觉啊? 所以请我这样的高手给你咨询一下,实在是太必要了. 
  先用身边阵亡的朋友举几个例子吧: 
  例一: 某朋友在某大型公司做部门经理,手头积蓄了30万,感觉在深圳买房遥遥无期,而且觉得年龄不饶人,同时发现深圳黑手机制造是个集散地,决定回老家成立公司,销售黑手机。 
  例二:某朋友手头积蓄了50万,感觉不能再继续打工了,决定加盟7-11连锁店 
  例三:某朋友是原某大型手机厂某省公司5年的老总,该大型公司倒闭后,由于该朋友人品极佳,手下数十名员工宁愿数月没有工资,要让该朋友带领大家创业,该朋友最终选择了做某啤酒的该省代理另外加某英语学习机的代理 
  例四:某朋友原来从事电脑it行业的销售,决定去国外开创一番事业,最终选择去印尼开展短信业务,具体是与深圳某短信设备制造商及运营商合作,希望在印尼copy此业务 
   
   
  大家感觉上述项目如何?这些项目都有人在做,而且都有人在大把赚钱,但---你可以在里面赚到钱吗? 做还是不做,这是个问题! 
  以俺如此资深的专家来对上述几个项目逐一点评: 
  项目一:贸易型的生意一般都是向上游买,然后向下游卖,中间赚取差价,看起来非常简单,一般人都喜欢计算计算差价然后就直接冲进去了,少部分人侥幸成功了,大部分人将自己的购房首期款给丢水里了。为什么发生这样的事情呢? 教你一招最简单的判断此类生意是否可作得秘籍—那就是上游下游2头,你至少要占着一头,什么意思?就是要么你对上游绝对熟悉,没人可以骗了你,你对所有细节都非常清楚,或者你有极其可靠的专业人士在充当你的幕僚(例如老婆,小舅子,表哥表弟,高中同学等等,总之就是绝对不会欺骗你,而且会无私告诉你一切的一个人) 
  ,下游同理,如果对上游不清楚,那么如果你对销售此产品具有绝对的把握,或者有绝对的幕僚协助你。如果2头都占了,那么恭喜你,你可以直接进入未来我写的中级班教程,初级班不需要学习了。如果你2头都不占,那么也要恭喜你,你将用你可怜的积蓄作为学费,自学成材学会我初级班教程的10~30%的内容。 
  此项目一就是犯了2头都不熟悉的大错,凭感觉做事,必死无疑阿!

例二点评:凡是项目就牵涉到要投多少钱的问题,以及回报如何的问题,我们可以试想一下,7-11一家店投资数十万,如果该店营业额不佳,你打算如何? 7-11是否每家店都赚钱?我如何保证我这家店可以赚到钱?7-11总店会给你退款吗?你可以很快将该店转让吗?投资1个点可以有超过年10%的收益吗? 10%的收益你可以接受吗?如果有稳定的超过10%的收益,那些有着数千万没地方投资的大老板为何不一口气开几百家7-11来赚这个稳定的利润? 
  千万切记俺的此秘籍:创业初期,绝对不可以干资本性项目!!! 
  原因如下:1.资本性项目一般投资巨大,利润回报并不可观 
   2.资本性项目的退出机制没有保障,如果你后悔的时候,你会发现,这个项目套住的 
   远远不是你那点钱,还有你未来无限的时间及精力,如果这个项目很快亏钱还好, 
   你可以下定决心马上结束,如果这个项目半死不活,是个鸡肋,哈哈,你完蛋了! 
  有人不同意我的观点了,说身边就很多朋友加盟某连锁,现在发了,或者说我自己就加盟某品牌,现在日子过得轻松又舒服。 但—--请问,如果加盟如此好赚,为何总店不自己去搞直营? 
  所以凡是加盟连锁等等都属于此类项目,成功几率绝对小于40%,有人说40%的成功几率已经很高了,生意那有一定成功的?真的吗?请你闭上眼睛仔细想想,你真的做好了亏钱的思想准备了吗?我敢打赌,几乎所有开始创业的人,都没有做好亏钱的思想准备,他们只是在不得不接受亏钱的现实面前才低下自己高贵的头。 
  不过现在好了,因为你遇到了我这个诲人不倦的百年难遇的专家,我就是那个传说中专门给你赠送秘籍的大侠,遇到了我,好好上我的课,记住----我们的创业目标是----100%的成功,不是40%的成功!! 
  凡是开工厂,加盟连锁,开发某个东西,设计某个新产品,都属于此类项目,这些东西并非不可以做,并非不赚钱,但是它不合适拿着自己所有积蓄去搏的初创业的人。

例三点评:请问:什么是机会? 这个世界绝大多数(超过99%)的人,不懂什么是机会,总是哀叹机会不肯眷顾自己,觉得自己比萨达姆背,比拉登苦。让我这个世外高人告诉你什么是机会------机会就是你已经拥有的东西中有价值的部分。 可以理解吗? 是不是太高深了?也许应该放在中级班的教程。 如果一个东西你自始自终没有拥有过,那显然不会是你的机会。而机会就在你的身边,而且你就正在拥有者它,但是----很不幸,因为你太蠢了,所以你不认为他是机会,你认为那是垃圾,你眼中的机会是你没有得到的东西,是别人正在靠着发财的事情,例如:你觉得张三机会好,有个表哥在证监会,可以透露股票信息,李四机会好,碰到禽流感,卖醋结果发了。对张三来说自己的表哥就是自己的机会,对李四来说自己卖的醋就是机会。所以对你来说,你一定要把自己拥有的资源关系等等人认认真真梳理3遍以上,你的机会就隐藏在你拥有的东西之中,绝对不是在你没有拥有的东西中。 
  本人某朋友生意遇到挫折,不过手头依然有比较充裕的资金,哀叹不知该干什么,寻找项目混混恶恶的过了1年多,在得到俺的指点之后,将所有过去认识的人的名片联系方式全部找出,经过1周的筛选,找出3个潜在机会,最终经过比较之后选定了其中1个,仅用不到1个月的时间,重新开始也业务,目前生意蒸蒸日上,哈哈。 
  找不到自己的机会的人是可悲的,但是不认为自己的机会是机会的人是愚蠢的。例三中的失败者,就是把自己的机会(对该省手机市场的极度掌控)弃之不用,而转去销售啤酒学习机等根本外行的市场。最终将价值数百万的无形资产(对该省手机市场的掌控及完整的营销队伍)丢入垃圾桶,其失败从最开始就是注定的。该朋友在创业初期,俺多次给其指出其错误,但该朋友极度自信,不接受俺的逆耳忠言,经过2年的艰辛,终于结束清盘,现在沦落为替某公司打工,又重新去另外的地方当省公司老总去了。可悲可叹! 
  关于如何有效地发掘及利用自己的机会,《穷爸爸富爸爸》书里每年关于作者小时候出租图书的故事是最具代表性的故事。建议初次想创业的人务必上网查找学习此故事。 
  关于如何认识机会,鉴别机会,事实上不仅仅使用于初创业的人,也同样适用于在公司打工希望得到升迁的人,甚至已经创业成功的人,但是该命题设计内容太多,呆俺有机会在高级班的课程中为大家详细阐述。 
  这个思路也可以换一种想法,就是---要做自己熟悉的东西,你的商业机会就在你的身边,而绝对不是某个八杆子打不倒的人,突然告诉你的信息,或者网上道听途说的什么东西,如果创业初期你做的不是你熟悉的东西,你的失败几率大于90%。 放弃自己的机会,等于放弃自己的未来阿。 
  例三中的朋友去干了自己不熟悉的东西,而且轻易放弃自己的优势,败之必然。 
  在一次提醒大家:创业初期,我们的成功目标是100%!!千万不要尝试挑战自己的智商,千万不要过高估计自己的能力。 

例四点评:该朋友是俺朋友中最具魄力的创业者,英文一窍不通,凭着在qq上认识了几个印尼华人,就只身跑去印尼,在雅加达机场不知去哪里,耗了半天终于碰到某热心华人,给其介绍了一个廉价宾馆,才算落身。时间已经过去了块1年了,该朋友已经干掉了差不多20万的积蓄,认识了若干印尼华人大款,但是项目做成0个,前几天和该朋友吃饭,摘录部分谈话如下: 
   俺:你当时去到底准备搞什么项目阿? 
   答:准备搞短信,你看深圳群发短信多猖狂,印尼几乎没有,这肯定有着巨大的市场潜力 
   俺:那你具体准备干什么?卖短信设备?还是在印尼替别人发垃圾短信赚钱? 
   答:什么都干啊 
   俺:那你卖了多少设备了?你的日常工作都是干什么? 
   答:去认识有钱的大老板,让他们投资搞这个项目 
   俺:进展如何? 
   答:我现在认识了印尼的华人第二富,计划投资2000万搞这个项目,答应给我5%的股份! 
   俺:投资2000万具体搞什么?这些钱都是用来干什么?赚钱的方式是什么?怎么发展群发短信的客户?华人第二富看得上这个生意吗? 
   答: 。。。。车到山前必有路。。 
   俺:你合作的深圳厂商啥关系和你?你以前对短信业务及技术了解多少阿? 
   答:没关系,去之前在网上查的公司,原来对短信业务及技术完全不了解。 
   俺:为什么你不直接把发短信的这些设备在当地的电脑通信市场去销售? 
   答:我们投资的公司搞起来之后就会去销售了 
   俺:你合作的厂商技术实力如何?东西是他么自己开发的吗?信誉如何?会不会骗你? 
   答: /•#¥¥%……¥……。。 
   
  我已经不想再将谈话的内容罗列了,这个世界胆子大的人真是多阿,可惜他们明白胆子大不能成为成功的助力剂,反而是加速失败的推动力。 
  对于有此类想法的人,我有个很简单的建议:把房子卖了,金银首饰全部换成现金,直接去澳门葡金赌场,全部押在一个台上,一次搞定,成功几率同样是10%,中了赚10倍走人,亏了你也就心死了。这样至少可以节约你的精力,如何? 

四: 如何进行沙盘演习 
  在俺过去指导过的无数的失败分子中,几乎无人可以回答我的问题超过5个。 先学习一段孙子兵法:夫未战而庙算胜者,得算多也;未战而庙算不胜者,得算少也。多算胜少算,而况于无算乎!吾以此观之,胜负见矣。 看到没有?几千年前没有上过大学的人都知道多算胜少算,但是现在的人为啥越活越笨了呢?而且读书越多的人越笨。 
  我一般问那些loser的问题如下(无先后顺序): 
  1. 你怎么知道你要干的这个东西赚钱啊? 
  2. 竞争对手都是谁啊? 
  3. 你和竞争对手相比的优势有啥? 
  4. 顾客为啥要向你买东西啊? 
  5. 请你把你的生意全过程给我讲解一遍 
  6. 你的生意如果按照你的预测完全可以达到目标,可以赚多少钱? 
  7. 你的经营潜在的风险都是那些?请一一给我详细解释 
  8. 你打算如何控制你的风险?请详细讲解给我听 
  9. 你的成本构成都有那些?请给我详细讲解一遍 
  10. ------ 
   
  如果要进行庙算,你需要算得东西太多了,这里先教你最重要的,其他的留在中级班和高级班了,呵呵,最重要的庙算就是市场销售环节的庙算。 
  即使你运气糟透了,竟然花5000元/部,采购了100台手机,但是,不要紧,最重要的是你是否可以卖掉。明白吗? 任何时候最终要的都是销售,销售nb的人完全可以弥补他犯下的其他所有的错误。你即使把老娘和丈母娘的房子都抵押了,只要你可以把你进的东西销出去,我写的这么多的乱七八糟你都可以不看。 
  销售部分庙算包括以下部分: 
  1.销售过程分析:把你的东西从你的手上出去后,一直到最终消费者的所有流程搞清楚。每个环节的利润比例必须搞清楚。到你手的利润是多少,必须搞清楚。事实上曾经有无数的被俺指导过的人,当俺问他你的销售过程流程的细节给我讲一遍的时候,大多数人都含糊其辞,而这个时候他们才意识到自己太唐突了。这个大问题包括以下小问题:列出所有可能购买你的产品的不同客户群/谁买你的东西,谁用你的东西?(注意:买东西的人不一定就是用东西的人啊)/ 
  2.市场分析:你的产品的生命周期(不懂得人去google)及所处位置/你卖的同类产品主要的竞争点是什么/未来的趋势是什么? 
  3.竞争分析:你比竞争对手强的地方是什么?注意,有人说,我在这个开个小花店,没啥优势,事实上你的优势就是地域优势,如果你的地域也没有优势了,那你真的完蛋了。如果分析来分析去都找不到自己存在的价值,你何必去扎进去呢?/ 
  4.市场策略:你如何把你和你的竞争对手区分开?/你计划如何去销售你的产品?/你的产品如何到达最终消费者? 
   
  如果你可以准确清楚地回答清楚以上问题的大多数,恭喜你,你已经开始在打有准备的战争了! 
  在过去我听过的无数创业计划中,很多人唾沫乱飞的讲着很多和销售完全无关的事情,或者是某个idea,或者是某个灵机一动,发言者陶醉在自己的一时的机智之中。或者已经在规划未来股份制的问题,在美国上市还是在香港上市。但是请听我一席话:创业第一重要需要考虑的事情就是销售!销售!销售! 
  在销售没有搞清楚以前,请把你认为重要的,燃眉之急的任何其他事情都先放在一遍。没有比把你的东西如何卖出去更重要的事情了! 
  没有看我的培训就已经清楚的领悟到这点的同学,恭喜你,加10分!看到这里认为销售不重要的朋友,其实你仍然可以创业,你具备投身于互联网业务,然后被n亿美金收购的潜力! 以后我去听你讲课,呵呵。 

五: 财务预算与控制 
  你已经鉴定了你的脑袋瓜质量优异,同时你也有个很好的确实不错的项目,市场也very good.下一步干啥? 
  做预算! 
  这点任何一个傻瓜都知道,而且也会去做,但是世界多奇怪,每个聪明人总是在破产之后才说:我当初怎么那么傻?我简直就是个sb阿! 
  我某个哥们就前几年就干了这么一个蠢事,计划生产某零件,该零件的销售绝对没有问题(因为他本来就在销售同类产品,客户全部铁的要死),计划投资20万搞定。结果呢? 一年后累计投资现金200万,全部丢在水里。问哥们为啥当初计划20万,怎么后来成200万了?朋友无言以对。事实上他也对自己的所作所为感到不可思议。 
  记住:任何时候你很宽松的预算之后,然后再乘以2~10之间的任何一个数字就是你未来实际可能花掉的钱。 
  很多人刚刚创业的前3个月可以坚持记帐,随后很多人就成了一笔糊涂帐,很多人认为反正肉烂在锅里,东西没少钱没少就行了,这真是大错特错,记账的目的不仅仅是搞清楚钱有没有少,更重要的是进行财务控制及分析。 
  在你开始你的生意的时候,所有可花可不花的钱一毛不花,所有必须花的钱砍半花,开始之前做好详细的预算,开始之后做好详细的记录,每个月将实际收支与预算做对比,然后修改未来3个月的预算。相信我,如果照着我说的去做,你亏掉老娘的房子之后,至少还可以剩下丈母娘的房子。不照着我说的做的后果就是全部亏掉,呵呵。 
  仔细思考好自己止亏点是亏多少钱?一定要认真想好,找个本子记在上面,每个月翻出来看看,记住,这决定了是否还可以再来一次,明白吗?亏钱不可怕,可怕的是亏的自己都不敢相信。最可怕的是永远没有了翻身的机会!! 

六: 只追一只兔子,一定把它追到手! 
  有个做开发出身的朋友告诉我他的创业计划: 计划开发一个美容仪器,该仪器投资小,只要数千元,外壳计划在电子市场找个公用的外壳,先做3~5个,卖卖看,卖不动了,不过亏几千块,卖的好了就发了.他的长期计划就是每3个月开发一个产品,迟早都有成功的那一天. 
  另外有个朋友在短短的2年之内做了如下项目: 制作网站,卖笔记本电脑,开塑钢门窗厂,开光纤连接器工厂,做某品牌手机地包,还有其他不记得了. 
  浅尝辄止,未作深入的研究及筹划是创业投资的大忌!其失败是必然的,成功是偶然的. 
  以上2为朋友是在不同的时间连续快速转换干了不同的项目,而另外一些super man竟然在创业初期同时在干n个惊天动地的项目!他们的理由都很简单:鸡蛋不能放在一个篮子里,东边不亮西边亮! 
  对于巴菲特也许是对的,但是,对于你这个囊中羞涩,急于成功的新手,相信我----把鸡蛋全部放在一个篮子里,然后认认真真地看好这个篮子才是最英明的做法! 
  现在你是否已经胸有成竹的准备了2个以上的项目?那么照着老师的话去做,把你的项目依次拿到pk台上去pk,只剩最后一个项目,好了,这个项目将最终改变你的命运!他将带领你走入财务自由的天地!把其他的项目统统忘掉! 
  相信我,你的能力和精力根本无法应付2个以上的项目,分散精力将直接导致你的失败! 


点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(137)
发表于:2008-4-28 10:06:42
标签:无标签

0

“好学若饥、谦卑若愚”

“好学若饥、谦卑若愚”

时间: 2005年12月09日 15:48    作者:于少蔚/译    来源:财富中文版

——苹果电脑的CEO斯蒂夫·乔布斯在斯坦福大学毕业典礼上的演讲 



  史蒂夫•乔布斯(Steve Jobs)今年 6 月在斯坦福大学的演讲中谈到了他生活中的三次体验,这三次体验不仅在斯坦福大学的毕业生、也在硅谷乃至其他地方的技术同行中引起了巨大反响。这个周末又重新读了一下,觉得特别有启发。尤其The Whole Earth Catalog提到的话,作为杂志,这是一种精神,一种气质。

“好学若饥、谦卑若愚”

  很荣幸和大家一道参加这所世界上最好的一座大学的毕业典礼。我大学没毕业,说实话,这是我第一次离大学毕业典礼这么近。今天我想给大家讲三个我自己的故事,不讲别的,也不讲大道理,就讲三个故事。

  第一个故事讲的是点与点之间的关系。我在里德学院(Reed College)只读了六个月就退学了,此后便在学校里旁听,又过了大约一年半,我彻底离开。那么,我为什么退学呢?

  这得从我出生前讲起。我的生母是一名年轻的未婚在校研究生,她决定将我送给别人收养。她非常希望收养我的是有大学学历的人,所以把一切都安排好了,我一出生就交给一对律师夫妇收养。没想到我落地的霎那间,那对夫妇却决定收养一名女孩。就这样,我的养父母─当时他们还在登记册上排队等著呢─半夜三更接到一个电话: “我们这儿有一个没人要的男婴,你们要么?”“当然要”他们回答。但是,我的生母后来发现我的养母不是大学毕业生,我的养父甚至连中学都没有毕业,所以她拒绝在最后的收养文件上签字。不过,没过几个月她就心软了,因为我的养父母许诺日后一定送我上大学。

  17 年后,我真的进了大学。当时我很天真,选了一所学费几乎和斯坦福大学一样昂贵的学校,当工人的养父母倾其所有的积蓄为我支付了大学学费。读了六个月后,我却看不出上学有什么意义。我既不知道自己这一生想干什么,也不知道大学是否能够帮我弄明白自己想干什么。这时,我就要花光父母一辈子节省下来的钱了。所以,我决定退学,并且坚信日后会证明我这样做是对的。当年做出这个决定时心里直打鼓,但现在回想起来,这还真是我有生以来做出的最好的决定之一。从退学那一刻起,我就可以不再选那些我毫无兴趣的必修课,开始旁听一些看上去有意思的课。 那些日子一点儿都不浪漫。我没有宿舍,只能睡在朋友房间的地板上。我去退还可乐瓶,用那五分钱的押金来买吃的。每个星期天晚上我都要走七英里,到城那头的黑尔-科里施纳礼拜堂去,吃每周才能享用一次的美餐。我喜欢这样。我凭著好奇心和直觉所干的这些事情,有许多后来都证明是无价之宝。我给大家举个例子:

  当时,里德学院的书法课大概是全国最好的。校园里所有的公告栏和每个抽屉标签上的字都写得非常漂亮。当时我已经退学,不用正常上课,所以我决定选一门书法课,学学怎么写好字。我学习写带短截线和不带短截线的印刷字体,根据不同字母组合调整其间距,以及怎样把版式调整得好上加好。这门课太棒了,既有历史价值,又有艺术造诣,这一点科学就做不到,而我觉得它妙不可言。

  当时我并不指望书法在以后的生活中能有什么实用价值。但是,十年之后,我们在设计第一台 Macintosh 计算机时,它一下子浮现在我眼前。于是,我们把这些东西全都设计进了计算机中。这是第一台有这么漂亮的文字版式的计算机。要不是我当初在大学里偶然选了这么一门课,Macintosh 计算机绝不会有那么多种印刷字体或间距安排合理的字号。要不是 Windows 照搬了 Macintosh,个人电脑可能不会有这些字体和字号。要不是退了学,我决不会碰巧选了这门书法课,个人电脑也可能不会有现在这些漂亮的版式了。当然,我在大学里不可能从这一点上看到它与将来的关系。十年之后再回头看,两者之间的关系就非常、非常清楚了。 你们同样不可能从现在这个点上看到将来;只有回头看时,才会发现它们之间的关系。所以,要相信这些点迟早会连接到一起。你们必须信赖某些东西─直觉、归宿、生命,还有业力,等等。这样做从来没有让我的希望落空过,而且还彻底改变了我的生活。

  我的第二个故事是关于好恶与得失。幸运的是,我在很小的时候就发现自己喜欢做什么。我在 20 岁时和沃兹(Woz,苹果公司创始人之一 Wozon 的昵称─译注)在我父母的车库里办起了苹果公司。我们干得很卖力,十年后,苹果公司就从车库里我们两个人发展成为一个拥有 20 亿元资产、4,000 名员工的大企业。那时,我们刚刚推出了我们最好的产品─ Macintosh 电脑─那是在第 9 年,我刚满 30 岁。可后来,我被解雇了。你怎么会被自己办的公司解雇呢?是这样,随著苹果公司越做越大,我们聘了一位我认为非常有才华的人与我一道管理公司。在开始的一年多里,一切都很顺利。可是,随后我俩对公司前景的看法开始出现分歧,最后我俩反目了。这时,董事会站在了他那一边,所以在 30 岁那年,我离开了公司,而且这件事闹得满城风雨。我成年后的整个生活重心都没有了,这使我心力交瘁。

  一连几个月,我真的不知道应该怎么办。我感到自己给老一代的创业者丢了脸─因为我扔掉了交到自己手里的接力棒。我去见了戴维•帕卡德(David Packard,惠普公司创始人之一─译注)和鲍勃•诺伊斯(Bob Noyce,英特尔公司创建者之一─译注),想为把事情搞得这么糟糕说声道歉。这次失败弄得沸沸扬扬的,我甚至想过逃离硅谷。但是,渐渐地,我开始有了一个想法─我仍然热爱我过去做的一切。在苹果公司发生的这些风波丝毫没有改变这一点。我虽然被拒之门外,但我仍然深爱我的事业。于是,我决定从头开始。

  虽然当时我并没有意识到,但事实证明,被苹果公司炒鱿鱼是我一生中碰到的最好的事情。尽管前景未卜,但从头开始的轻松感取代了保持成功的沉重感。这使我进入了一生中最富有创造力的时期之一。 在此后的五年里,我开了一家名叫 NeXT 的公司和一家叫皮克斯的公司,我还爱上一位了不起的女人,后来娶了她。皮克斯公司推出了世界上第一部用电脑制作的动画片《玩具总动员》(Toy Story),它现在是全球最成功的动画制作室。世道轮回,苹果公司买下 NeXT 后,我又回到了苹果公司,我们在 NeXT 公司开发的技术成了苹果公司这次重新崛起的核心。我和劳伦娜(Laurene)也建立了美满的家庭。

  我确信,如果不是被苹果公司解雇,这一切决不可能发生。这是一剂苦药,可我认为苦药利于病。有时生活会当头给你一棒,但不要灰心。我坚信让我一往无前的唯一力量就是我热爱我所做的一切。所以,一定得知道自己喜欢什么,选择爱人时如此,选择工作时同样如此。工作将是生活中的一大部分,让自己真正满意的唯一办法,是做自己认为是有意义的工作;做有意义的工作的唯一办法,是热爱自己的工作。你们如果还没有发现自己喜欢什么,那就不断地去寻找,不要急于做出决定。就像一切要凭著感觉去做的事情一样,一旦找到了自己喜欢的事,感觉就会告诉你。就像任何一种美妙的东西,历久弥新。所以说,要不断地寻找,直到找到自己喜欢的东西。不要半途而废。 我的第三个故事与死亡有关。17 岁那年,我读到过这样一段话,大意是:“如果把每一天都当作生命的最后一天,总有一天你会如愿以偿。”我记住了这句话,从那时起,33 年过去了,我每天早晨都对著镜子自问: “假如今天是生命的最后一天,我还会去做今天要做的事吗?”如果一连许多天我的回答都是“不”,我知道自己应该有所改变了。

  让我能够做出人生重大抉择的最主要办法是,记住生命随时都有可能结束。因为几乎所有的东西─所有对自身之外的希求、所有的尊严、所有对困窘和失败的恐惧─在死亡来临时都将不复存在,只剩下真正重要的东西。记住自己随时都会死去,这是我所知道的防止患得患失的最好方法。你已经一无所有了,还有什么理由不跟著自己的感觉走呢。

  大约一年前,我被诊断患了癌症。那天早上七点半,我做了一次扫描检查,结果清楚地表明我的胰腺上长了一个瘤子,可那时我连胰腺是什么还不知道呢!医生告诉我说,几乎可以确诊这是一种无法治愈的恶性肿瘤,我最多还能活 3 到 6 个月。医生建议我回去把一切都安排好,其实这是在暗示“准备后事”。也就是说,把今后十年要跟孩子们说的事情在这几个月内嘱咐完;也就是说,把一切都安排妥当,尽可能不给家人留麻烦;也就是说,去跟大家诀别。

  那一整天里,我的脑子一直没离开这个诊断。到了晚上,我做了一次组织切片检查,他们把一个内窥镜通过喉咙穿过我的胃进入肠子,用针头在胰腺的瘤子上取了一些细胞组织。当时我用了麻醉剂,陪在一旁的妻子后来告诉我,医生在显微镜里看了细胞之后叫了起来,原来这是一种少见的可以通过外科手术治愈的恶性肿瘤。我做了手术,现在好了。

  这是我和死神离得最近的一次,我希望也是今后几十年里最近的一次。有了这次经历之后,现在我可以更加实在地和你们谈论死亡,而不是纯粹纸上谈兵,那就是: 谁都不愿意死。就是那些想进天堂的人也不愿意死后再进。然而,死亡是我们共同的归宿,没人能摆脱。我们注定会死,因为死亡很可能是生命最好的一项发明。它推进生命的变迁,旧的不去,新的不来。现在,你们就是新的,但在不久的将来,你们也会逐渐成为旧的,也会被淘汰。对不起,话说得太过分了,不过这是千真万确的。

  你们的时间都有限,所以不要按照别人的意愿去活,这是浪费时间。不要囿于成见,那是在按照别人设想的结果而活。不要让别人观点的聒噪声淹没自己的心声。最主要的是,要有跟著自己感觉和直觉走的勇气。无论如何,感觉和直觉早就知道你到底想成为什么样的人,其他都是次要的。

  我年轻时有一本非常好的刊物,叫《全球概览》(The Whole Earth Catalog),这是我那代人的宝书之一,创办人名叫斯图尔特•布兰德(Stewart Brand),就住在离这儿不远的门洛帕克市。他用诗一般的语言把刊物办得生动活泼。那是 20 世纪 60 年代末,还没有个人电脑和桌面印刷系统,全靠打字机、剪刀和宝丽莱照相机(Polaroid)。它就像一种纸质的 Google,却比 Google 早问世了 35 年。这份刊物太完美了,查阅手段齐备、构思不凡。

  斯图尔特和他的同事们出了好几期《全球概览》,到最后办不下去时,他们出了最后一期。那是 20 世纪 70 年代中期,我也就是你们现在的年纪。最后一期的封底上是一张清晨乡间小路的照片,就是那种爱冒险的人等在那儿搭便车的那种小路。照片下面写道: 好学若饥、谦卑若愚。那是他们停刊前的告别辞。

  求知若渴,大智若愚。这也是我一直想做到的。眼下正值诸位大学毕业、开始新生活之际,我同样愿大家: 好学若饥、谦卑若愚。

  谢谢大家。[编辑:李令彬]

点击此处查看原文 >>

系统分类: 生活点滴   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(111)
发表于:2008-3-26 21:59:34
标签:模拟电路;数字电路  

0

硬件工程师面试试题及答案

    

模拟电路

1、基尔霍夫定理的内容是什么?
基尔霍夫定律包括电流定律和电压定律
电流定律:在集总电路中,任何时刻,对任一节点,所有流出节点的支路电流的代数和恒等于零。
电压定律:在集总电路中,任何时刻,沿任一回路,所有支路电压的代数和恒等于零。
2、描述反馈电路的概念,列举他们的应用。
反馈,就是在电子系统中,把输出回路中的电量输入到输入回路中去。
反馈的类型有:电压串联负反馈、电流串联负反馈、电压并联负反馈、电流并联负反馈。
负反馈的优点:降低放大器的增益灵敏度,改变输入电阻和输出电阻,改善放大器的线性和非线性失真,有效地扩展放大器的通频带,自动调节作用。
电压负反馈的特点:电路的输出电压趋向于维持恒定。
电流负反馈的特点:电路的输出电流趋向于维持恒定。
3、有源滤波器和无源滤波器的区别
无源滤波器:这种电路主要有无源元件R、L和C组成
有源滤波器:集成运放和R、C组成,具有不用电感、体积小、重量轻等优点。
集成运放的开环电压增益和输入阻抗均很高,输出电阻小,构成有源滤波电路后还具有一定的电压放大和缓冲作用。但集成运放带宽有限,所以目前的有源滤波电路的工作频率难以做得很高。
 
数字电路
1、同步电路和异步电路的区别是什么?
同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。
异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,这有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。
2、什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求?
将两个门电路的输出端并联以实现与逻辑的功能成为线与。
在硬件上,要用OC门来实现,同时在输出端口加一个上拉电阻。
由于不用OC门可能使灌电流过大,而烧坏逻辑门。
3、解释setup和hold time violation,画图说明,并说明解决办法。(威盛VIA2003.11.06上海笔试试题)
Setup/hold time是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(如上升沿有效)T时间到达芯片,这个T就是建立时间-Setup time.如不满足setup time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数据才能被打入触发器。
保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。如果hold time不够,数据同样不能被打入触发器。
建立时间(Setup Time)和保持时间(Hold time)。建立时间是指在时钟边沿前,数据信号需要保持不变的时间。保持时间是指时钟跳变边沿后数据信号需要保持不变的时间。如果数据信号在时钟沿触发前后持续的时间均超过建立和保持时间,那么超过量就分别被称为建立时间裕量和保持时间裕量。
4、什么是竞争与冒险现象?怎样判断?如何消除?(汉王笔试)
在组合逻辑中,由于门的输入信号通路中经过了不同的延时,导致到达该门的时间不一致叫竞争。
产生毛刺叫冒险。如果布尔式中有相反的信号则可能产生竞争和冒险现象。
解决方法:一是添加布尔式的消去项,二是在芯片外部加电容。
5、名词:SRAM、SSRAM、SDRAM
SRAM:静态RAM
DRAM:动态RAM
SSRAM:Synchronous Static Random Access Memory同步静态随机访问存储器。它的一种类型的SRAM。SSRAM的所有访问都在时钟的上升/下降沿启动。地址、数据输入和其它控制信号均于时钟信号相关。这一点与异步SRAM不同,异步SRAM的访问独立于时钟,数据输入和输出都由地址的变化控制。
SDRAM:Synchronous DRAM同步动态随机存储器
6、FPGA和ASIC的概念,他们的区别。(未知) 
答案:FPGA是可编程ASIC。 
ASIC:专用集成电路,它是面向专门用途的电路,专门为一个用户设计和制造的。根据一个用户的特定要求,能以低研制成本,短、交货周期供货的全定制,半定制集成电路。与 门阵列等其它ASIC(Application Specific IC)相比,它们又具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检验等优点。
7、什么叫做OTP片、掩膜片,两者的区别何在?
OTP means one time program,一次性编程
MTP means multi time program,多次性编程
OTP(One Time Program)是MCU的一种存储器类型
MCU按其存储器类型可分为MASK(掩模)ROM、OTP(一次性可编程)ROM、FLASHROM等类型。
MASKROMMCU价格便宜,但程序在出厂时已经固化,适合程序固定不变的应用场合;
FALSHROM的MCU程序可以反复擦写,灵活性很强,但价格较高,适合对价格不敏感的应用场合或做开发用途;
OTP ROM的MCU价格介于前两者之间,同时又拥有一次性可编程能力,适合既要求一定灵活性,又要求低成本的应用场合,尤其是功能不断翻新、需要迅速量产的电子产品。
8、单片机上电后没有运转,首先要检查什么?
首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,例如常用的5V。
接下来就是检查复位引脚电压是否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。
然后再检查晶振是否起振了,一般用示波器来看晶振引脚的波形,注意应该使用示波器探头的“X10”档。另一个办法是测量复位状态下的IO口电平,按住复位键不放,然后测量IO口(没接外部上拉的P0口除外)的电压,看是否是高电平,如果不是高电平,则多半是因为晶振没有起振。
另外还要注意的地方是,如果使用片内ROM的话(大部分情况下如此,现在已经很少有用外部扩ROM的了),一定要将EA引脚拉高,否则会出现程序乱跑的情况。有时用仿真器可以,而烧入片子不行,往往是因为EA引脚没拉高的缘故(当然,晶振没起振也是原因只一)。经过上面几点的检查,一般即可排除故障了。如果系统不稳定的话,有时是因为电源滤波不好导致的。在单片机的电源引脚跟地引脚之间接上一个0.1uF的电容会有所改善。如果电源没有滤波电容的话,则需要再接一个更大滤波电容,例如220uF的。遇到系统不稳定时,就可以并上电容试试(越靠近芯片越好)。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(459)
发表于:2008-3-21 15:37:24
标签:C51;编程规范  

0

谈谈C51的编程规范

现在单片机的程序设计,C51已经得到广泛的推广和应用,算是单片机的主流设计程序,甚至可以说作为单片机开发人员必须要掌握的一门语言了。

    作为一门工具,最终的目的就是实现功能。在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得到网友的帮助,否则让人看上半天也不明所以然,这样就达不到预期的效果了。因此,为了便于源程序的交流,减少合作开发中的障碍,希望大家能够探讨一下C51的编程规范。把各人认为好的建议提出来,然后做一个总结,作为一种大家一致认同的规范,我认为将会是一件很有意义的事。我先提出一些自已的想法,以此抛砖引玉。

一、注释

   1,采用中文;
   2,开始的注释:   

   文件(模块)注释内容:
   公司名称、版权、作者名称、修改时间、模块功能、背景介绍等,复杂的算法需要加上流程说明;

比如:
/*********************************************************************/
/*公司名称:                                                          */

/*模 块 名:        LCD 模块              LCD 型号:HD44780          */

/*创 建 人:zhaojunjie                    日期:2001-06-08           */
/*修 改 人:                              日期:2001-06-08           */ 
/*功能描述:                                                         */
/*其他说明:                                                         */
/*版    本:
/**********************************************************************/

   函数开头的注释内容:
   函数名称、功能、说明  输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;

/*********************************************************************  
*
* 函 数 名: v_LcdInit
* 功能描述: LCD初始化
* 函数说明: 初始化命令:0x3c, 0x08, 0x01, 0x06, 0x10, 0x0c
* 调用函数: v_Delaymsec(),v_LcdCmd()
* 全局变量:
* 输    入: 无
* 返    回: 无
* 设 计 者:zhao                         日期:2001-12-09
* 修 改 者:zhao                         日期:2001-12-09
* 版    本:
***********************************************************************/

    3、程序中的注释内容:

    修改时间和作者、方便理解的注释等。注释内容应简炼、清楚、明了,一目了然的语句不加注释。

二、命名:
    
    命名必须具有一定的实际意义。

1、常量的命名:全部用大写。

2、变量的命名:
    变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。 
    其中变量数据类型:
     unsigned char  前缀 uc   signed char 前缀 sc 
     unsigned int   前缀 ui   signed int  前缀 si
     unsigned long  前缀 ul   signed long 前缀 sl
     bit            前缀 b    指针        前缀 p
     
     例:ucReceivData  接收数据
3、结构体命名:
            
4、函数的命名:
    函数名首字大写,若包含有两个单词的每个单词首字母大写。
    函数原型说明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名, 内部函数,只要注释其定义文件名;

三、编辑风格

  1、缩进:缩进以 Tab 为单位,一个 Tab 为四个空格大小。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块的“{”“}”配对对齐,并与其前一行对齐;

  2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,如: 
if ( ... ) 等,运算符的空格规定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“&”(取址或引用)、“*”(指使用指针时)等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。

  3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。

  4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行
  
  5、修改:版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。

  6、形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不再另行说明。

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类: 无分类    |    来源: 无分类

评论(1) | 阅读(197)
发表于:2008-3-21 14:26:22
标签:迭代;递归算法  

0

什么是迭代跟递归算法?二者有什么区别?

 
迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

  利用迭代算法解决问题,需要做好以下三个方面的工作

  一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

  二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

  三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

  例 1 : 一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,问到第 12 个月时,该饲养场共有兔子多少只?

  分析: 这是一个典型的递推问题。我们不妨假设第 1 个月时兔子的只数为 u 1 ,第 2 个月时兔子的只数为 u 2 ,第 3 个月时兔子的只数为 u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有

Word-WRAP: break-Word" bgColor="#f3f3f3">以下是引用片段:
u 1 = 1 , u 2 = u 1 + u 1 × 1 = 2 , u 3 = u 2 + u 2 × 1 = 4 ,……

  根据这个规律,可以归纳出下面的递推公式:

以下是引用片段:
  u n = u n - 1 × 2 (n ≥ 2)

  对应 u n 和 u n - 1 ,定义两个迭代变量 y 和 x ,可将上面的递推公式转换成如下迭代关系:

以下是引用片段:
  y=x*2
  x=y

  让计算机对这个迭代关系重复执行 11 次,就可以算出第 12 个月时的兔子数。参考程序如下:

以下是引用片段:
  cls
  x=1
  for i="2" to 12
  y=x*2
  x=y
  next i
  print y
  end

  例 2 : 阿米巴用简单分裂的方式繁殖,它每分裂一次要用 3 分钟。将若干个阿米巴放在一个盛满营养参液的容器内, 45 分钟后容器内充满了阿米巴。已知容器最多可以装阿米巴 2 20 个。试问,开始的时候往容器内放了多少个阿米巴?请编程序算出。

  分析: 根据题意,阿米巴每 3 分钟分裂一次,那么从开始的时候将阿米巴放入容器里面,到 45 分钟后充满容器,需要分裂 45/3=15 次。而“容器最多可以装阿米巴 2 20 个”,即阿米巴分裂 15 次以后得到的个数是 2 20 。题目要求我们计算分裂之前的阿米巴数,不妨使用倒推的方法,从第 15 次分裂之后的 2 20 个,倒推出第 15 次分裂之前(即第 14 次分裂之后)的个数,再进一步倒推出第 13 次分裂之后、第 12 次分裂之后、……第 1 次分裂之前的个数。

  设第 1 次分裂之前的个数为 x 0 、第 1 次分裂之后的个数为 x 1 、第 2 次分裂之后的个数为 x 2 、……第 15 次分裂之后的个数为 x 15 ,则有

以下是引用片段:
  x 14 =x 15 /2 、 x 13 =x 14 /2 、…… x n-1 =x n /2 (n ≥ 1)

  因为第 15 次分裂之后的个数 x 15 是已知的,如果定义迭代变量为 x ,则可以将上面的倒推公式转换成如下的迭代公式:

  x=x/2 ( x 的初值为第 15 次分裂之后的个数 2 20 )

  让这个迭代公式重复执行 15 次,就可以倒推出第 1 次分裂之前的阿米巴个数。因为所需的迭代次数是个确定的值,我们可以使用一个固定次数的循环来实现对迭代过程的控制。参考程序如下:

以下是引用片段:
  cls
  x=2^20
  for i="1" to 15
  x=x/2
  next i
  print x
  end

例 3 : 验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加 1 。如此经过有限次运算后,总可以得到自然数 1 。人们把谷角静夫的这一发现叫做“谷角猜想”。

  要求:编写一个程序,由键盘输入一个自然数 n ,把 n 经过有限次运算后,最终变成自然数 1 的全过程打印出来。

  分析: 定义迭代变量为 n ,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当 n 为偶数时, n="n/2" ;当 n 为奇数时, n="n"*3+1 。用 QBASIC 语言把它描述出来就是:

Word-WRAP: break-Word" bgColor="#f3f3f3">以下是引用片段:
  if n 为偶数 then
  n=n/2
  else
  n=n*3+1
  end if

  这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量 n 最终变成自然数 1 ,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。仔细分析题目要求,不难看出,对任意给定的一个自然数 n ,只要经过有限次运算后,能够得到自然数 1 ,就已经完成了验证工作。因此,用来结束迭代过程的条件可以定义为: n="1" 。参考程序如下:

以下是引用片段:
  cls
  input "Please input n=";n
  do until n="1"
  if n mod 2=0 then
  rem 如果 n 为偶数,则调用迭代公式 n="n/2"
  n=n/2
  print "—";n;
  else
  n=n*3+1
  print "—";n;
  end if
  loop
  end

  迭代法

  迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:

  (1) 选一个方程的近似根,赋给变量x0;

  (2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;

  (3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。

  若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为:

  【算法】迭代法求方程的根

以下是引用片段:
  { x0=初始近似根;
  do {
  x1=x0;
  x0=g(x1); /*按特定的方程计算新的近似根*/
  } while ( fabs(x0-x1)>Epsilon);
  printf(“方程的近似根是%f\n”,x0);
  }

  迭代算法也常用于求方程组的根,令

  X=(x0,x1,…,xn-1)

  设方程组为:

  xi=gi(X) (I=0,1,…,n-1)

  则求方程组根的迭代算法可描述如下:

  【算法】迭代法求方程组的根

以下是引用片段:
  { for (i=0;i
  x=初始近似根;
  do {
  for (i=0;i
  y=x;
  for (i=0;i
  x=gi(X);
  for (delta=0.0,i=0;i
  if (fabs(y-x)>delta) delta="fabs"(y-x);
  } while (delta>Epsilon);
  for (i=0;i
  printf(“变量x[%d]的近似根是 %f”,I,x);
  printf(“\n”);
  }

  具体使用迭代法求根时应注意以下两种可能发生的情况:

  (1) 如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;

  (2) 方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。

  递归

  递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。

  能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。
【问题】 编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。

  斐波那契数列为:0、1、1、2、3、……,即:

Word-WRAP: break-Word" bgColor="#f3f3f3">以下是引用片段:
  fib(0)=0;
  fib(1)=1;
  fib(n)=fib(n-1)+fib(n-2) (当n>1时)。

  写成递归函数有:

以下是引用片段:
  int fib(int n)
  { if (n==0) return 0;
  if (n==1) return 1;
  if (n>1) return fib(n-1)+fib(n-2);
  }

  递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n- 2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。

  在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。

  在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。

  由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。

  【问题】 组合问题

  问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为: (1)5、4、3 (2)5、4、2 (3)5、4、1

  (4)5、3、2 (5)5、3、1 (6)5、2、1

  (7)4、3、2 (8)4、3、1 (9)4、2、1

  (10)3、2、1

  分析所列的10个组合,可以采用这样的递归思想来考虑求组合函数的算法。设函数为void comb(int m,int k)为找出从自然数1、2、……、m中任取k个数的所有组合。当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1数的组合。这就将求m 个数中取k个数的组合问题转化成求m-1个数中取k-1个数的组合问题。设函数引入工作数组a[ ]存放求出的组合的数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[ ]中的一个组合输出。第一个数可以是m、m-1、……、k,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未去顶组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。细节见以下程序中的函数comb。

  【程序】

以下是引用片段:
  # include
  # define MAXN 100
  int a[MAXN];
  void comb(int m,int k)
  { int i,j;
  for (i=m;i>=k;i--)
  { a[k]=i;
  if (k>1)
  comb(i-1,k-1);
  else
  { for (j=a[0];j>0;j--)
  printf(“%4d”,a[j]);
  printf(“\n”);
  }
  }
  }
  void main()
  { a[0]=3;
  comb(5,3);
  }

  【问题】 背包问题

  问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。

  设n 件物品的重量分别为w0、w1、…、wn-1,物品的价值分别为v0、v1、…、vn-1。采用递归寻找物品的选择方案。设前面已有了多种选择的方案,并保留了其中总价值最大的方案于数组option[ ],该方案的总价值存于变量maxv。当前正在考察新方案,其物品选择情况保存于数组cop[ ]。假定当前方案已考虑了前i-1件物品,现在要考虑第i件物品;当前方案已包含的物品的重量之和为tw;至此,若其余物品都选择是可能的话,本方案能达到的总价值的期望值为tv。算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxv时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。因为当方案的总价值不比maxv大时,该方案不会被再考察,这同时保证函数后找到的方案一定会比前面的方案更好。

  对于第i件物品的选择考虑有两种可能:

  (1) 考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续递归去考虑其余物品的选择。

  (2) 考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。

  按以上思想写出递归算法如下:

以下是引用片段:
  try(物品i,当前选择已达到的重量和,本方案可能达到的总价值tv)
  { /*考虑物品i包含在当前方案中的可能性*/
  if(包含物品i是可以接受的)
  { 将物品i包含在当前方案中;
  if (i
  try(i+1,tw+物品i的重量,tv);
  else
  /*又一个完整方案,因为它比前面的方案好,以它作为最佳方案*/
  以当前方案作为临时最佳方案保存;
  恢复物品i不包含状态;
  }
  /*考虑物品i不包含在当前方案中的可能性*/
  if (不包含物品i仅是可男考虑的)
  if (i
  try(i+1,tw,tv-物品i的价值);
  else
  /*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/
  以当前方案作为临时最佳方案保存;
  }

 为了理解上述算法,特举以下实例。设有4件物品,它们的重量和价值见表:

  物品 0 1 2 3

  重量 5 3 2 1

  价值 4 4 3 1

  并设限制重量为7。则按以上算法,下图表示找解过程。由图知,一旦找到一个解,算法就进一步找更好的佳。如能判定某个查找分支不会找到更好的解,算法不会在该分支继续查找,而是立即终止该分支,并去考察下一个分支。

  按上述算法编写函数和程序如下:

  【程序】

Word-WRAP: break-Word" bgColor="#f3f3f3">以下是引用片段:
  # include
  # define N 100
  double limitW,totV,maxV;
  int option[N],cop[N];
  struct { double weight;
  double value;
  }a[N];
  int n;
  void find(int i,double tw,double tv)
  { int k;
  /*考虑物品i包含在当前方案中的可能性*/
  if (tw+a.weight<=limitW)
  { cop="1";
  if (i
  else
  { for (k=0;k
  option[k]=cop[k];
  maxv=tv;
  }
  cop=0;
  }
  /*考虑物品i不包含在当前方案中的可能性*/
  if (tv-a.value>maxV)
  if (i
  else
  { for (k=0;k
  option[k]=cop[k];
  maxv=tv-a.value;
  }
  }
  void main()
  { int k;
  double w,v;
  printf(“输入物品种数\n”);
  scanf((“%d”,&n);
  printf(“输入各物品的重量和价值\n”);
  for (totv=0.0,k=0;k
  { scanf(“%1f%1f”,&w,&v);
  a[k].weight=w;
  a[k].value=v;
  totV+=V;
  }
  printf(“输入限制重量\n”);
  scanf(“%1f”,&limitV);
  maxv=0.0;
  for (k=0;k find(0,0.0,totV);
  for (k=0;k
  if (option[k]) printf(“%4d”,k+1);
  printf(“\n总价值为%.2f\n”,maxv);
  }

  作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。

  【程序】

以下是引用片段:
  # include
  # define N 100
  double limitW;
  int cop[N];
  struct ele { double weight;
  double value;
  } a[N];
  int k,n;
  struct { int ;
  double tw;
  double tv;
  }twv[N];
  void next(int i,double tw,double tv)
  { twv.=1;
  twv.tw=tw;
  twv.tv=tv;
  }
  double find(struct ele *a,int n)
  { int i,k,f;
  double maxv,tw,tv,totv;
  maxv=0;
  for (totv=0.0,k=0;k
  totv+=a[k].value;
  next(0,0.0,totv);
  i=0;
  While (i>=0)
  { f="twv".;
  tw=twv.tw;
  tv=twv.tv;
  switch(f)
  { case 1: twv.++;
  if (tw+a.weight<=limitW)
  if (i
  { next(i+1,tw+a.weight,tv);
  i++;
  }
  else
  { maxv="tv";
  for (k=0;k
  cop[k]=twv[k].!=0;
  }
  break;
  case 0: i--;
  break;
  default: twv.=0;
  if (tv-a.value>maxv)
  if (i
  { next(i+1,tw,tv-a.value);
  i++;
  }
  else
  { maxv="tv-a".value;
  for (k=0;k
  cop[k]=twv[k].!=0;
  }
  break;
  }
  }
  return maxv;
  }
  void main()
  { double maxv;
  printf(“输入物品种数\n”);
  scanf((“%d”,&n);
  printf(“输入限制重量\n”);
  scanf(“%1f”,&limitW);
  printf(“输入各物品的重量和价值\n”);
  for (k=0;k
  scanf(“%1f%1f”,&a[k].weight,&a[k].value);
  maxv=find(a,n);
  printf(“\n选中的物品为\n”);
  for (k=0;k
  if (option[k]) printf(“%4d”,k+1);
  printf(“\n总价值为%.2f\n”,maxv);
  }

递归的基本概念和特点

  程序调用自身的编程技巧称为递归( recursion)。

  一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。

  一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

  注意:

  (1) 递归就是在过程或函数里调用自身;

       (2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(192)
发表于:2008-3-21 14:24:13
标签:算法  

0

常用算法设计方法



                 原作者:宁波高等专科学校电子系 周文革

要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的