Thunder Bird
Communication & Improvement
posts - 18,  comments - 47,  trackbacks - 0
回首PC20年,它的历史就是一部英雄的历史,一个个闪亮的名字,就像一颗颗璀璨的星星,为人羡慕、令人敬仰;他们对PC业的兴起,对计算机技术的繁荣,对人类的贡献是我们不应忘记的。当本文重现历史的一幕幕时,我们会看到什么?无疑,其中有光辉与荣耀,有财富与成就,当然,也有遗憾与悲怆……

  电脑始祖

  冯·诺依曼(John Von Neuman)凭他的天才和敏锐,在电脑初创期,高屋建瓴地提出了现代计算机的理论基础,从而规范和决定了电脑的发展方向。时至今日,我们所有的电脑又都叫“冯·诺依曼机器”,就是对这位数学天才最好的评价。

  
  冯·诺依曼


  对于冯·诺依曼来说,人类第一台电脑造了一半时才参与开发,多少有些遗憾。但是,他刚好在那大机器程序存储问题无法解决的关键时刻出现,这使得冯·诺依曼的天才得到淋漓尽致的发挥。他明确指出:一定要彻底实现程序由外存储向内存储的转化,原有的设计必须作修改,经费不够再追加。在冯·诺依曼的影响下,整个研制工作取得了突破性的进展。冯·诺依曼提出了新的改进方案:一是用二进制代替十进制,进一步提高电子元件的运算速度;二是存储程序(Stored Program),即把程序放在计算机内部的存储器中,换言之,把能进行数据处理的程序放在数据处理系统内部,程序和该程序处理的数据用同样的方式储存,即把程序本身当作数据来对待。冯·诺依曼的改进方案被称为“爱达法克”(EDVAC),即离散变量自动电子计算机(Electronic Diserete Variable Computer)的简称。

  1945年6月,他写了一篇题为《关于离散变量自动电子计算机的草案》的论文,第一次提出了在数字计算机内部的存储器中存放程序的概念(Stored Program Concept),这是所有现代电子计算机的范式,被称为“冯·诺依曼结构”。按这一结构建造的电脑称为存储程序计算机(Stored Program Computer),又称为通用计算机。时至今日,所有的电脑都逃脱不了冯·诺依曼的掌心,我们所有的电脑,都有一个共同的名字,叫“冯·诺依曼机器”,它超越了品牌、国界、速度和岁月。

  摩尔定律

  当人们不断追逐新款PC时,殊不知这后面有一只无形的大手在推动,那就是摩尔定律,而这著名定律的发明人就是高登·摩尔(Gordon Moore)。

  
  高登·摩尔

  1965年的一天,摩尔顺手拿了把尺子和一张纸,画了一张草图,纵坐标代表不断发展的集成电路,横坐标是时间。他在月份上逐个描点,得到一幅增长的曲线图。这条曲线显示出每24个月,集成电路由于内部晶体管数量的几何级数的增长,而使性能几乎翻倍提高,同时集成电路的价格也恰好减少一倍。后来高登·摩尔把时间调整为18个月。摩尔是在集成电路技术的早期作出结论的,那时候,超大规模集成电路技术还远未出现,所以他在1965年的预言并未引起世人的注意。

  高登·摩尔的另一壮举是在1968年与罗伯特·诺伊斯带头“造反”,率领一群工程师离开仙童公司,成立了一家叫集成电子的公司,简称“Intel”,这就是今日名震世界的英特尔公司。

  预言大师

  凯的形象既不像傲慢自大、反潮流的黑客,也不同于一夜暴富的计算机富翁,更不像象牙塔里的计算机科学家。他时常穿着跑鞋和灯芯绒裤子,一小撮胡子,短短的、略微零乱的头发,使他看上去极为普通。即使他是你的老板,可能也不会给你留下多深的印象。但这也不是说他很谦逊,他喜欢引用自己的话,且经常以这样的词作为发言的开端:“凯的第一法则指出……”。

  
  阿伦·凯

  阿伦·凯(Alan Kay)不是一位公众人物,但在计算机界,尤其是技术圈内,他是能让大家都心服口服屈指可数的大师之一。成为硅谷的又一位亿万富翁或让他当麻省理工的院长,都无法激起他的兴奋,但他会有足够的耐性与一群8岁左右的孩子一起玩电脑。他最大的乐趣就是发明他喜欢的东西。

  阿伦·凯是Smalltalk面向对象编程环境语言的发明人之一,也是面向对象编程思想的创始人之一,同时,他还是笔记本电脑最早的构想者和现代Windows GUI的建筑师。

  近年来有一句话挺流行:“预测未来的最好办法,就是把它创造出来。”不少人误以为此言出自尼葛洛庞帝之口,实际上,这句话是阿伦·凯的名言。有很多人说布兰德是第一个使用PC一词的人,但布兰德说自己也是顺手牵羊,最早提出“PC”概念的就是阿伦·凯。20世纪90年代程序员设计的基本模式就是“面向对象”,发明这一术语的也是阿伦·凯。在20世纪70年代的一份备忘录上,阿伦·凯还正确预言到,“20世纪90年代将有成百万的个人计算机,而且都将连接到全球公用的信息设施上”,这不正是今天的互联网吗?

  集成电路之父

  硅谷是传奇人士扎堆之地。但是一个人要想在硅谷同时获得财富、威望和成就,实在比登天还难。举目远眺大概只有罗伯特·诺伊斯(Robort Noyce)才是惟一一位三位于一体式的人物。

  
  罗伯特·诺伊斯

  作为集成电路的发明者,诺伊斯在科学史上已名垂青史,这个具有划时代意义的发明促成了历史的大转折。而且他还与别人共同创办了两家硅谷最伟大的公司,第一家是半导体工业的摇篮——仙童(Fairchild)公司,这已成为历史;第二家则仍跻身美国最大的公司之列,这就是英特尔公司。他带着特有的神圣和威严,让同行和对手都得永远敬仰。以尖刻著称的硅谷杂志《Upside》敢对硅谷任何一位大腕儿进行任何刺激,但对诺伊斯却只能毕恭毕敬,在诺伊斯去世前几天的采访录,甚至成为杂志社经常炫耀的一种荣光。

  在仙童,诺伊斯最大的成就是发明了集成电路。当基尔比在德州仪器用锗晶片研制集成电路时,诺伊斯和摩尔已把眼光直接盯住了硅晶片,因为硅的商业前景要远远超出锗。1959年2月,诺伊斯为“微型电路”申请了专利,但没有为他用平面处理技术制造的集成电路申请专利,直到同年7月才补全了这一手续。而此前德州仪器公司已宣布生产集成电路的产品,该公司的基尔比拥有第一个专利,但他的设计不实际,而诺伊斯则是第二个提出该专利的人。于是整个60年代,仙童和德仪相互控告,最后法庭将集成电路的发明专利授予了基尔比,而将关键的内部连接技术专利授予诺伊斯。诺伊斯的专利使仙童公司在沉闷的70年代得以存活下来,这一时期的仙童成为硅谷最具神话色彩的历史。

  当然诺伊斯成就的最高峰还是英特尔公司,他与高登·摩尔和安迪·葛鲁夫一同创业,而且构建了业界极为罕见、完美和谐的三人“执政”局面。三人的合作只能说是天作之合,缺任何一位可能都会让英特尔历史大幅改写。诺伊斯自然是最耀眼的人物,传奇式的发明家、仙童公司的总经理和半导体业的“政治家”,他是英特尔公司的“脸面”。而甘于默默无闻的高登·摩尔则是公司的“心脏”,没有摩尔,英特尔不可能有足够的力量和士气;而没有强硬的葛鲁夫,英特尔甚至不会成为一家著名的大公司。

  微处理器之父

  1971年1月,第一个可以运转的微处理器诞生了,定名为“4004型”。其中,第一个“4”是指以4位为单位的设计思想,后一个“4”是指由英特尔制造的第4种专用芯片,而它的发明人就是特德·霍夫。霍夫认为自己占了天时和地利之便:“如果我们没有在1971年发明4004微处理器,那么别人也会在一两年里发明它。”

  
  特德·霍夫

  在普遍认为大型机才是大有可为的时代,霍夫另辟蹊径,投入到微处理器的研制中。霍夫说服了刚从仙童公司跳槽的斯坦·麦卓尔与他合作,共同设计了一种比4004型更强大的微处理器,称为“8008型”,这是第一个真正意义的微处理器。

  1973年8月,“8080型”微处理器问世,它首次使用了MOS(金属氧化物半导体)工艺,成为有史以来最成功的微处理器之一,这也是第一个通用微处理器,是20世纪最后25年里一项具有划时代意义的发明。

  著名的《经济学家》杂志将霍夫称作是“第二次大战以来最有影响的7位科学家之一”。1978年,他被提升为英特尔研究员(至今一共只有两个人获得过类似的称号),这意味着他在研究方面具有很大的自主权。

  在评价微处理器和PC时,霍夫说:“我对微处理器在个人计算机中的应用感到非常惊讶,我也没有想到人们会仅仅为了业余的爱好而买微机。随着影像游戏机的发展,个人计算机成为人们又一种娱乐工具,任何一位发明家如果能够创造出什么来提供给人们娱乐,他就能获得成功。”
PC之父

  创造出世界上第一台微电脑的殊荣,现在一般都归到爱德华·罗伯茨(Edward Roberts)身上。

  
  爱德华·罗伯茨

  罗伯茨是位电脑爱好者,1974年,罗伯茨决定利用8080微处理器装配一种供黑客试验的计算机,《大众电子》杂志为寻找独家新闻,主动上门观看了罗伯茨的设计方案,之后决定让他制成一台原型机,由杂志社在封面予以报道。

  1975年1月,《大众电子》封面刊出一台很小的计算机照片,大字标题写着:“世界上第一组堪与商业机相媲美的以成套形式提供的小型计算机——牛郎星8800”。根据杂志的介绍,“牛郎星”勉勉强强算是一台电脑,在金属制成的小盒内,罗伯茨装进两块集成电路,一块即8080微处理芯片,另一块是存储器芯片。既没有可输入数据的键盘,也没有显示计算结果的“面孔”。插上电源后,使用者需要用手按下面板上的8个开关,把二进制数“0”或“1”输进机器。计算完成后,面板上的几排小灯泡忽明忽灭,就像军舰上用灯光发信号那样表示输出的结果。

  就是这样一个简单的装置,却引发了大地震。罗伯茨的“牛郎星”电脑问世后,美国出现了一个电脑业余爱好者购买散件、在家庭车库内组装微电脑的热潮。 尽管“牛郎星”十分原始,但它把计算机发展到大型机时代料想不到的辉煌阶段。

  商用软件之父

  个人电脑的真正飓风是由AppleⅡ刮起的,而AppleⅡ成功的重要推进器就是VisiCalc电子表格软件。因为售价3000美元的AppleⅡ对家庭并没有多少吸引力,但配备了电子表格的AppleⅡ,就足以让人们把VisiCalc作为惟一的理由而购买它。从某种意义上说,AppleⅡ就是一台VisiCalc机器。

  
  布莱克林

  VisiCalc的发明人就是丹·布莱克林(Dan Bricklin)。1973年毕业后,布莱克林进入DEC,与他人合作编制了DEC的第一个字处理软件WPS-8。26岁时,布莱克林进入哈佛商学院寻求新的职业生涯,他在哈佛的分时计算机系统上用BASIC编写软件,进行财务计算。当时他常遇到的问题是,对不同的题目必须重新编写程序,于是他便开始思考能否用一种通用的计算模式来解决该问题。布莱克林用一个周末的时间粗粗地做出了一个演示版本。虽然这个演示版本是用BASIC写成的,速度很慢,而且行列只能添满一屏,但它已经具备电子表格的许多基本功能,此时已是1978年初。由于AppleⅡ等个人电脑产品的问世,布莱克林和麻省理工的老朋友富兰克斯顿一起合作,成立了软件艺术公司(SA),决定为AppleⅡ开发VisiCalc,发行商是丹·弗莱斯特拉的公司叫Personal软件公司(PS),可以说这是最早的微机应用软件公司。

  电子表格VisiCalc的出现将PC从业余爱好者手中的玩具变成了炙手可热的商业工具,独立地改变了PC业的发展方向。布莱克林创造的不仅仅是一个产品、一家公司,而是整个软件产业。VisiCalc引发了真正的PC革命,它极大地激励了软件开发者,并从此宣告了PC商用化的到来。

  IBM PC之父

  如果说个人电脑之火是由苹果引燃的,那么IBM的介入,才真正将这场大火燃遍全球,热度持续近20年而不减。而缔造IBM PC的,就是颇富个人魅力的唐·埃斯特利奇。

  
  埃斯特利奇

  1980年中,IBM召集高层咨询会议,要对如火如荼的个人电脑浪潮作出应对。这时实验室主任洛伊站起来,提议打破常规,秘密组织一个精干小组,在一年内搞出PC来。 洛伊仅挑选了12名最优秀的工程师来演绎一段类似苹果公司经历过的传奇故事,担当这个名为“西洋棋”项目的负责人就是埃斯特利奇。以往,埃斯特利奇在工作上被认为“极不合作”,不听别人使唤,只凭自己的意思行事。而这种不合群的态度,正适合IBM PC计划,洛伊将它交给埃斯特利奇,事实证明这个选择十分英明。

  1981年8月12日,IBM PC如人们预想的那样跨进了PC业,没有人惊奇和兴奋,因为要等一段时间,人们才真正明白PC时代的开始。在第一台PC发布前几个月,埃斯特利奇还着手下一代产品——PC XT的开发。XT的推出,再次把IBM推到PC科技的最前端,XT疯狂畅销,使IBM一举占有企业PC市场的75%。同时埃斯特利奇还启动另一计划,以PC攻打家庭市场,但推出时间太晚,错过了圣诞销售旺季,后来这个产品无疾而终。1982年,埃斯特利奇开始着手下一个大计划,即生产真正强劲的AT机。AT机象征着IBM是惟一能使用80286处理器的厂商。1984年 8月,AT机推出好几个月后,竞争对手才推出AT级产品。1984年, IBM PC的收入已达到40亿美元,这意味着光是PC一个部门就可以在美国工业公司中排名第74位,并可名列美国第三大计算机公司,仅次于IBM自己和DEC。埃斯特利奇还安排了一个争议性的计划,让经销商销售个人电脑,这是IBM产品第一次由非IBM业务代表的人销售, 从而开拓了电脑分销的先河。

  1985年8月2日埃斯特利奇终于带着太太,去渡公司承诺已久的假期。两人乘坐的191航班试图在暴风雨中降落到达拉斯机场时,飞机失控,埃斯特利奇和太太玛丽不幸丧生。虽然他的生命结束于不幸的飞行事故,但打开昨日的篇章,历史永远会承认一个真正有贡献的人。

  PC软件先锋

  加里·基尔达尔被称为PC软件的开拓者,因为正是他打开了微处理器和微电脑之间的通道,在PC革命英特尔公司锋利的弹片中,有着基尔达尔历史性的贡献。

  
  加里·基尔达尔

  加里·基尔达尔敏锐地发现,4004微处理器可以用来编制程序,基尔达尔突然想到:“能不能在这里编制电脑的程序呢?”,这想法诞生了微程序(Microprogram)设计。基尔达尔在DEC公司的PDP-10小型机上为英特尔4004微处理器创建新的“微语言”后,英特尔马上聘请基尔达尔做技术顾问。在基尔达尔的主持下,创建了在个人电脑史上革命性的微处理程序设计语言PL/M(Programing language for Microprocessor)。这一新的语言随着Intel 8008、8080微处理器的进展,对个人电脑的革命起着巨大的推动作用。如果没有基尔达尔这一贡献,英特尔的微处理器肯定还会在计算器里“沉沦”许久,PL/M语言与Intel、Zilog、Motorola微处理器的结合,在70年代末,终于使微机的性能能同60年代的大型机和小型机相媲美。

  另外,基尔达尔还是第一个光盘(CD-ROM)驱动程序的编写者,也是图形用户界面的先驱,当时还没有GUI(Graphic User Interface)的说法,基尔达尔把它叫做“图形环境管理员(Graphic Enviroment Manager)”。

  电脑奇才

  恩格尔巴特(Doug Engelbart)是电脑界的一位奇才,被称为“人机交互”领域里的大师。从20世纪60年代初期开始,他在人机交互方面做出了许多开创性的贡献,共发表论文30余篇,拥有20余项发明专利。世界上第一个电子邮件系统(E-Mail)、文字处理系统、在线呼叫集成系统和超文本链接都出自他之手。另外,他还发明了电脑显示器上的多重视窗、共享屏幕的电视会议、新的电脑交互输入设备等等。在恩格尔巴特的众多发明中,人们最熟悉的就是电脑上用的鼠标。1963年,美国国家专利局批准恩格尔巴特几年前提交的一份申请,确认一种叫“搜寻点击”的输入装置是一项独创的技术。在英语中,mouse有老鼠的意思,因此“搜寻点击”装置又被称为鼠标。1968年,恩格尔巴特应邀参加在旧金山举行的一次电脑会议,在会上,他拿出了许多令人吃惊的绝活:视窗(Windows)、超媒体(Supermedia)、群件(Groupware),还有鼠标,这也是鼠标第一次作为“搜寻工具”公开亮相。

  
  道格·恩格尔巴特
MS-DOS之父

  谁都知道MS-DOS是美国微软公司的产品,而且正是MS-DOS使微软公司实现了从一个不知名的软件开发公司到全球软件巨头的第一次飞跃。MS-DOS曾是微软公司的拳头产品,长期统治着个人电脑操作系统市场。虽然现在的微软“视窗”已经成为新一代PC操作系统霸主,但MS-DOS对业界的功劳仍不可磨灭。不过MS-DOS的真正主人蒂姆·帕特森的名字可能并不为每个人所知道。

  
  蒂姆·帕特森

  帕特森在西雅图电脑制造公司任副总裁时,自己动手花了半年时间成功地推出了自己的操作系统,命名为SCP-DOS,本意为“快而粗糙的磁盘操作系统”,这个SCP-DOS便是现在DOS的前身。SCP-DOS推出之后,应用效果不错,但也曾被数据研究公司指责剽窃了他们当时颇受欢迎的CP/M操作系统。这两个操作系统确实有相似之处,不过 SCP-DOS在储存数据、组织文件等方面与CP/M有极大的不同。那么后来SCP-DOS如何成为MS-DOS呢?这还得从IBM的“西洋棋方案”说起。

  1980年,IBM公司决心开发自己的个人电脑,便制定了“西洋棋方案”。他们需要找一家软件公司合作开发一套个人电脑操作系统。当时的微软为了不错过这个千载难逢的发展机会,向IBM称自己有软件操作系统,实际上,虽然当时微软公司在软件行业已有一席之地,但依靠的却是其程序语言,并无现成的操作系统。为了与IBM公司合作,微软不得不去找帕特森。

  微软从帕特森那里,仅以2.5万美元的转让价格便获得了SCP-DOS的使用权。SCP-DOS虽比较粗糙,但已经具有了雏形,只要在其基础上进行加工,搞出合乎要求的产品并不太难。事实上,SCP-DOS对微软的重大意于义在于,它使IBM公司放弃了CP/M,转而与微软合作,从而成就了微软的未来。

  1981年4月,帕特森离开了西雅图电脑制造公司,投到微软公司门下,这时才知道自己的操作系统被微软拿来作为IBM公司合作的产品之一。他当时非常恼火和后悔,不过也无可奈何,自己的成果虽然潜力无限,但在西雅图电脑制造公司却无法得到推广,相反由微软公司去发展完善,总比埋没了要好。

  便携计算机之父

  在硅谷历史上,亚当·奥斯本(Adam Osborne)绝对算得上是一个人物,他在20世纪70年代初期得到了一份为英特尔新发明的微处理器编写说明书的工作,随后成为技术领域的自由撰稿人,先后在计算机杂志《界面时代》(Interface Age)和《Infoworld》上开辟专栏。

  
  亚当·奥斯本

  但奥斯本有更大的计划,他想要成为这个行业的一分子、硅谷的大亨,向对他的逻辑天才发生过怀疑的人证明他们的错误。他毫不谦虚,甚至有些自大地说:“我跟每一个人说,他们应该制造什么,可是没有人听我的话,所以我自己去制造了。”

  令人惊奇的是,奥斯本证明了他的设想是合理的。奥斯本有两个很妙的主意:首先,利用眼下电路体积变得越来越小的优势,制造出一种既小又轻而且结实的便携式个人计算机;其次,把当时需单独购买并且价格昂贵的最流行软件,算在个人计算机的价格内卖给顾客。此前,硬件和软件公司从来不会同时提供这两项服务。

  1980年3月,在西海岸计算机展览会上,奥斯本见到了为一家硬件公司设计电路板的Lee Felsenstein。奥斯本向他提出了自己的设想,并对Felsenstein提出设计要求:这台计算机一是要廉价结实,既小又轻;二是要捆绑字处理和电子表格软件。

  1981年4月奥斯本Ⅰ型计算机全新亮相,含软件在内的整机价格仅1795美元。这一下子就轰动四方,到1981年9月,公司月销售额就攀升至100万美元,第二年公司收入就达7000万美元。

  但奥斯本公司在成立的第二年的年中,便开始出现严重的错误。管理上的混乱导致产品质量下降、交货延误和财政空虚,而市场策略的错误更使它功亏一篑。当时在市场上占统治地位的是IBM,而奥斯本公司的“管理者”却不能与之兼容,这本不算太糟,但奥斯本不能忍受这样的情况。于是,奥斯本在新产品投放市场一星期后,宣布他已开始准备与IBM兼容,这等于无形之中宣布自己的产品已经过时,使销售量顿时一落千丈。一个美丽的计算机神话仅仅维持了不到两年时间。这个以自己的创新理念,促使计算机业发展方向发生革命的人物,这个一度是PC业内最具影响力、最富争议的人物,就这样从业界淡出,将一切甩在了自己的身后。

  磁盘之父

  各种类型的软、硬磁盘,是个人电脑最重要的存储设备,磁盘的历史并不太长,从世界上第一台硬盘发明至今,也不过40余年时间。

  
  艾伦·舒加特

  20世纪50年代,IBM公司董事长小托马斯·沃森迅速把事业扩展到美国西海岸,下令在加利福尼亚圣何塞市附近新建实验室和工厂。约翰逊带领着30多名青年工程师,在不到三年时间,就为IBM创造了引人注目的技术成果——磁盘存储器。在约翰逊领导IBM圣何塞实验室研制硬盘的过程中,一位名叫艾伦·舒加特(Al.Shugart)的青年工程师发挥了关键作用。

  舒加特1951年大学毕业后加盟IBM,在研究部门工作了十多年。 1969年,他离开IBM建立舒加特合伙人公司,并研制出世界上第一片以塑料材质为基础的5英寸软磁盘,即PC机上使用的标准软盘。

  1974年,舒加特首次创办的公司倒闭,五年之后,舒加特重返电脑行业,在著名的硅谷腹地, 与过去的几位同事共同创建了希捷(Seagate)技术公司,专门为个人电脑研制高性能的小型硬盘。

  1980年,希捷技术公司宣布研制出第一台5.25英寸温式硬盘,容量达5~10MB,后来成为IBM PC/XT个人电脑最具特点的标准配置。 舒加特领导的这家公司,目前已是资产数十亿美元、员工10余万人的世界上最大的PC硬盘生产厂商之一。

  自由软件之神

  20世纪末,软件业发生的最大变革就是自由软件的全面复兴。在自由软件的浪潮下,软件业的商业模式脱胎换骨,从以卖程序代码为中心,转化为以服务为中心,而理查德·斯托尔曼则被称为软件业的自由之神。有人说,斯托尔曼应该算是世界上写软件最多的程序设计师。但是,斯托尔曼真正的力量是他的思想。在斯托尔曼的理论下,用户彼此拷贝软件不但不是“盗版”,而是体现了人类天性的互助美德。对斯托尔曼来说,自由是根本,用户可自由共享软件成果,随便拷贝和修改代码。他说:“想想看,如果有人同你说‘只要你保证不拷贝给其他人用的话,我就把这些宝贝拷贝给你’。其实,这样的人才是魔鬼”。

  
  理查德·斯托尔曼

  理查德·斯托尔曼一副披头士的打扮,看起来像现代都市里的野人,但如果他将一件“麻布僧袍”穿在身上,又戴上一顶圆形宽边帽子,有如绘画作品中环绕圣像头上的光环。一眨眼的功夫,他又变成圣人,散发着先知般的威严和力量。野人与圣人,恰恰就是这位自由软件的精神领袖理查德·斯托尔曼的双重属性,他既是当今商业软件领域野蛮的颠覆者,又是无数程序员和用户心目中神圣的自由之神。

  微软帝国

  据不久前的一期《福布斯》杂志的年度统计,微软创始人比尔·盖茨(Bill Gates)以587亿美元的个人资产仍排名世界首富。他在短短20多年的时间里创造的财富比传统的汽车大王、石油大王、钢铁大王或金融寡头在200年时间里创造的家庭财富还多。

  
  比尔·盖茨

  像苹果砸出牛顿的智慧一样,个人电脑突入盖茨的脑海也有一个外在的启蒙者,这就是1975年1月份的《大众电子学》杂志,它封面上Altair 8080型计算机的图片一下子点燃了比尔·盖茨的电脑梦。盖茨打电话给罗伯茨表示要给Altair研制Basic语言,之后,盖茨和艾伦在哈佛阿肯计算机中心没日没夜地干了8周,为8008配上Basic语言,开辟了PC软件业的新路。

  1975年5月,比尔·盖茨产生了退学的想法,他希望能和好友艾伦一起创办一个软件公司,由于父母的极力反对,比尔·盖茨没能马上退学,但他还是离开了西雅图到了亚帕克基。1975年7月,他与艾伦合作创建公司。微软公司前身成立时,比尔·盖茨正好20岁。

  如今微软已成为了业内的“帝国”,除了主宰PC操作系统和办公软件外(这是微软的命脉),还涉足个人财务软件、教育及游戏软件、网络操作系统、商用电子邮件、数据库及工具软件、内部网服务器软件、手持设备软件、网络浏览器、网络电视、上网服务及近20个不同的Web网站。
PC直销

  迈克·戴尔(Michael Dell)曾就读于奥斯汀的德克萨斯大学,19岁退学。

  
  迈克尔·戴尔

  1984年,迈克·戴尔以1000美元和一个在个人计算机业中前所未有的理念建立了戴尔公司,即避开给产品增值较少的中间商,直接向最终用户销售量身订制的个人计算机。这样可以根据订单生产以取消库存,并把后勤服务与供应商结合起来,创造出一种规范化、低成本的企业文化。通过这种创新的直线订购方式和在业界率先倡导的服务和技术支持方案,戴尔公司已成为全球顶尖的个人计算机供应商之一,并且是领先的计算机直线订购公司和全球发展最快的主要计算机系统公司。

  戴尔公司在PC的领导地位带来了全球革命,还被公认为是最大的计算机系统网上供应商,迈克·戴尔因此成为当时最年轻的首席执行官之一,他的个人资产曾达到214.9亿美元。

  苹果创始人

  不久前,美国《洛杉矶时报》评选出了“20世纪经济领域50名最有影响力人物”,史蒂夫·乔布斯(Steve Jobs)与另一名苹果电脑公司创办人沃兹·尼克并列第5名,他们的贡献主要表现为“创办苹果电脑,带动了全球个人电脑普及应用浪潮,并迫使IBM PC于1981年面市”。历经了20多年的磨炼,人们在史蒂夫·乔布斯身上发现了一系列走向成功的闪光之处:首先是信息消费技术产品的主导者,其次,是随机应变的企业家。

  
  史蒂夫·乔布斯

  1976年,21岁的乔布斯和26岁的沃兹·尼艾克在乔布斯自家的车库里成立了苹果电脑公司。他们的第一个产品是一种没有键盘、机箱、声音和图像的计算机电路板,他们称之为Apple I。1977年4月他们成功开发了AppleⅡ,这是有史以来第一台具有彩色图形显示功能、键盘、电源和造型的个人电脑产品,也是第一台在市场上进行销售的个人电脑。1985年,苹果公司已经拥有了20亿美元的资产,成长为当时硅谷灿烂的明珠。

  乔布斯的另一个功绩是在1997年9月重返该公司任首席执行官后,对奄奄一息的苹果公司进行大刀阔斧的公司改组和一连串新产品降价促销的措施。乔布斯抓住Internet浪潮带来的机遇,相继推出了Power Macintosh G3、iMac和iBook等一系列划时代产品,不仅让苹果电脑公司起死回生,从赤字累累奇迹般地变为连番获利,而且使苹果在1998第四个财政季度创造了1.09亿美元的利润。苹果重新回到了全球信息技术潮流领袖的地位,并带动全球个人电脑与信息技术产品时尚化、易用化的新潮流。

  以太网之父

  鲍伯·梅特卡夫(Bob Metcalfo)被称为以太网之父,并且提出了网络的实用性与其使用者数目的平方成正比的“梅特卡夫法则”,即如果网络中有n个用户时,网络中就有n(n-1)个潜在商品,当第n+1个顾客加入此网时,该用户就向其他所有用户提供了2n个潜在商品。

  
  鲍伯.梅特卡夫

  鲍伯·梅特卡夫毕业于麻省理工学院,后来到哈佛念博士。他在哈佛大学宣读了阐述以太网的论文,哈佛大学说理论性不强,要他进行理论升华,然后再答辩。梅特卡夫无奈,只好到心理学家泰勒这里来“升华”,想不到却搞出惊人之举。在他主持下,施乐硅谷研究中心1973年5月,第一次在局域范围内实现了微机间的联网。梅特卡夫欣喜不已,当他要给这个新联网系统取名字时,一想到哈佛大学说他的理论深度不够,就气不打一处来,想到19世纪末物理学家们提出的玄虚不已的以太(Ether)理论,就郑重其事把它命名为“以太网”(Ethernet),并于1977年申请了专利。1979年4月,鲍伯·梅特卡夫正式成立了3Com公司,目标就是推进以太网成为业界标准。现在当以太网带宽开始向10G迈进时,谁还能说以太网不是业界的一个标准呢? IT偏执狂

  葛鲁夫绝对是20世纪史上最重要的角色之一:他开创了微处理器产业、引爆了个人电脑革命并一手将英特尔打造成超级竞争机器。他的竞争策略是:推出新产品、主动降价打击竞争对手、再推出新产品……,这个逼迫自己不断进步,不让对手有任何喘息空间的策略,让英特尔主宰个个电脑产业的时间超过十年。现在他虽然已经退居二线,但葛鲁夫仍然是位值得研究的大师。

  
  安迪·葛鲁夫

  1998年1月5日,是葛鲁夫一生中最辉煌的时刻,他战胜了英国王妃戴安娜、克隆绵羊多莉之父伊安·威尔马特和美联储主席艾伦·格林斯潘,成为《时代周刊》新一届的年度世界风云人物,加上1997年英特尔辉煌的业绩,葛鲁夫的名声和威望被推上了巅峰。

  而之后的葛鲁夫选择了急流勇退,1998年5月他将CEO一职交给公司总裁贝瑞特,只留下更具象征性的董事会主席一职。这一方面与他的年龄和身体状况有关,另一方面是处于战略转折点的CPU市场,迫使他提前让贤。此后,由于公司业绩不佳,加上低端市场操作不力,公司股票比高峰时下跌30%以上。葛鲁夫走得恰是时候,这位好斗、爱发脾气、有驾驭力的铁腕人物必须将权力之杖让与一个更和气、更具亲和力的人,才能使英特尔力挽狂澜。

  蓝色救星

  20世纪80年代末,将头埋在沙里的IBM公司经理们,面对新崛起的个人电脑还死抱着大型电脑的概念不放。20世纪90年代初期,由于欧美经济萧条,IBM公司内部机构臃肿,连续几年公司股票不断下跌,一时间,不少持悲观态度的人士认为,IBM已经难以逃脱覆舟的命运,当时的IBM几乎成了一辆没人要的破车。

  
  路易斯·郭士纳

  1993年郭士纳正式接管IBM,开始发起向PC业的进军,重振IBM雄威。1994年底,IBM获得了自20世纪90年代以来的第一次赢利30亿美元。正如郭士纳所说,信息革命即将发生,IBM再也不能靠亮皮鞋和微笑来过关了。

  1995年6月5日,处理完内部事务的郭士纳终于将锋芒扫向了外界。他瞄上了Lotus公司,不顾Lotus总裁吉姆·曼兹的反对,决定强行吞并。6月11日,这桩生意最终以35亿美元成交,成为当时软件史上最大的购并案。之后,郭士纳将Lotus的Notes软件作为武器,向软件市场发动总攻,并一举拿下了企业网络市场。1995年,IBM营收突破了700亿美元大关。

  郭士纳为IBM带来了滚滚利润,也为他自己挣得了不菲的收入。1996年他已获得了82.5万股期权,账面价值6900万美元。1997年3月,董事会同意再给他增加30万股期权,希望他再干一个任期到2002年,为此公司将另加200万股票认购权。如果IBM股票能保持10%的增势,那这批股票将值3.3亿美元。
posted @ 2007-04-23 13:54 Thunder 阅读(356) | 评论 (1)编辑 收藏

姓名:Robert De Niro

  译名:罗伯特·德尼罗

  出生日期:1943年8月17日

  国籍:美国

  职业:演员/导演

  身高:178cm

  获奖纪录:

  1981年奥斯卡最佳男主角奖,《愤怒的公牛》Raging Bull (1980)

  1975年奥斯卡最佳男配角奖,《教父2》The Godfather: Part II (1974)

  2003年美国电影学院终身成就奖

  2000年圣塞巴斯蒂安电影节终身成就奖

  1993年威尼斯电影节终身成就奖

  简介:

  罗伯特·德尼罗1943年8月17日出生于美国纽约,父母均是著名的艺术家。因此早在10岁的时候,他已经有机会参演舞台剧《绿野仙踪》,不过是演那只害羞的狮子。在通过Stella Adler Conservatory和American Workshop的学习后,罗伯特·德尼罗在美国导演Brian De Palma的影片中得到了一个角色,从此开始了他的水银灯之旅。1973年,他因在影片《战鼓轻敲》中饰演了一个头脑不灵光的棒球手开始得到了美国观众的关注。同年,著名大导演马丁·斯科塞斯的《残酷大街》一片,德尼罗在其中扮演一个纽约意大利街区中混食的小流氓,为了出人头地而不择手段地打劫杀人,片中的他脸色苍白,不修边幅,干坏事时一副自得其乐的表情。由于演得细腻传神,好莱坞对这位新星是一片赞扬之声,他也由此片获得两项演员大奖。1974年,德尼罗出演科波拉的名作《教父》第二集,扮演年轻时代的教父,再次出色发挥了他的天才演技,结果此片使他获得了第四十七届奥斯卡金像奖的最佳男配角奖,甚至有媒体当时感叹“《教父II》最幸运的就是以德尼罗代替了马龙·白兰度”。

  1976年,德尼罗主演了美国影史上最具有影响力的影片之一《出租汽车司机》。德尼罗饰演的一位刚退伍的美国大兵为了拯救一个雏妓(朱迪·福斯特)大开杀戒。影片大受欢迎,德尼罗在其中的朋克发式也引得当时的美国年轻人纷纷仿效,同时正是因为此片日后引出了著名的“刺杀里根”事件。但更为重要的则是德尼罗出演的这一司机形象被后人看作是70年代“迷惘的一代”的代表形象,是一个时代的象征,德尼罗也凭借此片最终问鼎了第四十九届奥斯卡金像奖的最佳男主角。

  德尼罗后来主演的《纽约,纽约》、《愤怒的公牛》、《好家伙》等,几乎部部都是令人难忘的经典,德尼罗更是赋予众多角色以不同的性格,极具人性。跨入八九十年代,他更是佳作频现,《午夜狂奔》、《恐怖角》、《盗火线》和《摇尾狗》等一大批影片都堪称杰作。从影以来,德尼罗已经出演过七十余部影片,他与众多大导演有过合作,除了斯科塞斯外,还有科波拉、昆汀·塔伦堤诺等,德尼罗以演技征服好莱坞,他忘我的工作精神也赢得了同行们的尊敬与赞赏。

  步入新世纪,德尼罗又给人们带来惊喜,他一反过去的表演风格,开始一本正经地演起喜剧。在影片《摇尾狗》中小试牛刀后,在喜剧片《老大靠边闪》里,德尼罗饰演的过气老大可爱之极,当他哭丧着脸大哭不已时,却令观众忍俊不住,捧腹大笑,这时,你怎么也找不到“教父”的影子。圣·塞巴斯蒂安电影节颁给他终身成就奖时,对他的评价是:“二十五年来,他的名字和脸孔一直是美国惊险片的象征。他的表情和声调会随著剧情的需要而改变,并完全融入到影片之中。他的可塑性极高,不管是情节片、喜剧片还是黑帮片,他都得心应手。”

  作为演员,德尼罗在国际影坛的地位已经无可撼动。在导演领域,自从处男作《布朗克斯的故事》惨败后,德尼罗用13年磨一剑再度出发,于2006年推出第二部导演作品《忠于职守》,业内口碑和票房表现均可圈可点,并入围了第57届柏林电影节主竞赛单元

作品:

忠于职守/特务风云/牧羊人 The Good Shepherd (2006)

  出租 Rent (2005)

  捉迷藏 Hide and Seek (2005)

  圣路易斯雷的大桥 The Bridge of San Luis Rey (2004)

  拜见岳父大人2/拜见福克斯/非常女婿2 Meet the Fockers (2004)

  舞台丽人/美丽舞台/台上女主角 Stage Beauty (2004)

  鲨鱼故事/沙胆大话王/鲨鱼黑帮 Shark Tale (2004)

  华氏911 Fahrenheit 9/11 (2004)

  天赐/天赐灵婴/婴魂不散/复制儿魂 Godsend (2004)

  老大靠边闪2 Analyze That (2002)

  夜海追凶/疑云重重/海滨城市 City by the Sea (2002)

  一个男孩 About a Boy (2002)

  做秀时刻 Showtime (2002)

  大买卖 The Score (2001)

  15分钟 15 Minutes (2001)

  怒海潜将 Men of Honor (2000)

  非常女婿 Meet the Parents (2000)

  飞鼠洛基冒险记 The Adventures of Rocky & Bullwinkle (2000)

  画家波拉克 Pollock (2000)

  完美无暇 Flawless (1999)

  老大靠边闪 Analyze This (1999)

  浪人/冷血悍将 Ronin (1998)

  远大前程 Great Expectations (1998)

  纪念碑大街 Snitch (1998)

  作大英雄 Wag the Dog (1997)

  危险关系 Jackie Brown (1997)

  警察帝国/地头龙/警察乐园 Cop Land (1997)

  沉睡者 Sleepers (1996)

  非常背叛/异常快乐爱妻事件 Faithful (1996)

  狂迷 Fan, The (1996)

  马文的房间/亲亲环姊妹/一切从心开始 Marvin's Room (1996)

  盗火线/烈火悍将/热力/穷追不舍/狂热 Heat (1995)

  赌城风云 Casino (1995)

  黑豹 Panther (1995)

  101夜 Cent et une nuits de Simon Cinéma, Les (1995)

  科学怪人之再生情狂 Frankenstein (1994)

  布朗克斯的故事 Bronx Tale, A (1993)

  纽约夜月情 Night We Never Met, The (1993)

  疯狗马子 Mad Dog and Glory (1993)

  不如重新开始 This Boy's Life (1993)

  幕后情人 Mistress (1992)

  雷霆之心 Thunderheart (1992)

  四海本色 Night and the City (1992)

  烈火雄心/浴火赤子情/回火 Backdraft (1991)

  黑暗之心 Hearts of Darkness: A Filmmaker's Apocalypse (1991)

  恐怖角 Cape Fear (1991)

  嫌疑犯/真实一瞬间/午夜风暴 Guilty by Suspicion (1991)

  无语问苍天 Awakenings (1990)

  史丹利与爱莉丝 Stanley & Iris (1990)

  好家伙/盗亦有盗 Goodfellas (1990)

  我们不是天使 We're No Angels (1989)

  水手刀 Jacknife (1989)

  午夜狂奔 Midnight Run (1988)

  越南家书 Dear America: Letters Home from Vietnam (1987)

  天使心 Angel Heart (1987)

  义胆雄心 Untouchables, The (1987)

  教会/传道 Mission, The (1986)

  巴西 Brazil (1985)

  美国往事/四海兄弟/义薄云天 Once Upon a Time in America (1984)

  坠入情网/信是有缘/堕入爱河 Falling in Love (1984)

  喜剧之王 King of Comedy, The (1983)

  打不开的锁/真正的忏悔 True Confessions (1981)

  愤怒的公牛/蛮牛/狂牛 Raging Bull (1980)

  猎鹿人/越战猎鹿人 Deer Hunter, The (1978)

  纽约,纽约 New York, New York (1977)

  出租车汽车司机/计程车司机/的士司机 Taxi Driver (1976)

  最后大亨 Last Tycoon, The (1976)

  一九零零 1900 (1976)

  教父续集 Godfather: Part II, The (1974)

  战鼓轻悄 Bang the Drum Slowly (1973)

  穷街陋巷 Mean Streets (1973)

  血腥妈妈 Bloody Mama (1970)

  帅气逃兵 Greetings (1968)
他的〈〈出租车汽车司机〉〉〈〈 教父续集〉〉〈〈 穷街陋巷〉〉〈〈愤怒的公牛〉〉〈〈猎鹿人〉〉〈〈盗火线〉〉****都是电影史的佳作,不过我更喜欢他的〈〈美国往事〉〉那个包含人生的电影里他的表演就像子弹穿透了你的心,让你铭记住他那个有颗痣的脸

posted @ 2007-04-11 17:24 Thunder 阅读(93) | 评论 (0)编辑 收藏
error LNK2001: unresolved external symbol _main解决办法
 

解决外部符号错误:_main,_WinMain@16,__beginthreadex -!t'my`yK  
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有柚煤孟钅坎问? 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: m1+4#'  
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main (gd){j  
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 OuR5T>>  
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 *_g+&Us1  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex }t,6 oT  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex <u%N(=9  
]wpN"w"  
1. Windows子系统设置错误, 提示: )WA5FzPLw  
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main *+oJ(e  
4f{'{1]\  
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: *^'y#/Dg  
z !DF-%3|  
[Project] --> [Settings] --> 选择"Link"属性页,  Qo!  
在Project Options中将/subsystem:console改成/subsystem:windows   T`H.k"Y{  
Xn?{t*{  
2. Console子系统设置错误, 提示: vwK 7b0M  
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 4Y~E`L0,  
8%P ><"  
控制台项目要使用Console子系统, 而不是Windows, 设置: *Cl5Y':|h  
sipSn4_  
[Project] --> [Settings] --> 选择"Link"属性页, WveN']q\  
在Project Options中将/subsystem:windows改成/subsystem:console BR4C@Z  
1 vBkC&  
3. 程序入口设置错误, 提示: dy2$&$=  
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 sP.>uExt  
G- (k~1q  
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: r#~P5[aV  
Os hl6 i  
[Project] --> [Settings] --> 选择"Link"属性页, "1zk_#B*  
在Category中选择Output, p HGRL  
再在Entry-point symbol中填入wWinMainCRTStartup, 即可 >IC}SZ  
F)c[@\.dm  
4. 线程运行时库设置错误, 提示: X;t_- f  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex AmiBqZTp  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex sz 23_{c?  
oz! {Fd-  
这是因为MFC要使用多线程时库, 需要更改设置: L a-Y,1x](  
uAk>h^pbM  
[Project] --> [Settings] --> 选择"C/C++"属性页, '%ET|1#SO  
在Category中选择Code Generation, ;Y-M)k(  
再在Use run-time library中选择Debug Multithreaded或者multithreaded 0v~5<Y'Z  
咸鱼游侠(75374355) 12:11:11 <mW.@e5_  
其中, W_qa?Jv  
Single-Threaded                单线程静态链接库(release版本) Kh4w Q   
Multithreaded                  多线程静态链接库(release版本) |F]g[En 4  
multithreaded DLL              多线程动态链接库(release版本) s-'qYgA6p  
Debug Single-Threaded          单线程静态链接库(debug版本) _ 7w_./y  
Debug Multithreaded            多线程静态链接库(debug版本) <[ ePw  
Debug Multithreaded DLL        多线程动态链接库(debug版本) H8V/O9|(  
9^x@/  
单线程: 不需要多线程调用时, 多用在DOS环境下 /PJ|d5  
多线程: 可以并发运行 clUdag,C  
静态库: 直接将库与程序Link, 可以脱离MFC库运行 X]pEmHl  
动态库: 需要相应的DLL动态库, 程序才能运行 \n{&_:b+q  
release版本: 正式发布时使用 9J;ZZ/3  
debug版本: 调试阶段使用   k9PoFC#k  

posted @ 2007-01-17 14:49 Thunder 阅读(11722) | 评论 (11)编辑 收藏

C/C++中的日期和时间

C/C++中的日期和时间
摘要:
本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。

关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)

1.概念
在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法.

通过学习许多C/C++库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些“时间”和“日期”的概念,主要有以下几个:

Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。

Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。

epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。

clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。

我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能。

2. 计时

C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:

clock_t clock( void );

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:

#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:

void elapsed_time()
{
printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);
}

当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

#include “stdio.h”
#include “stdlib.h”
#include “time.h”

int main( void )
{
long i = 10000000L;
clock_t start, finish;
double duration;
/* 测量一个事件持续的时间*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- )
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
system("pause");
}

在笔者的机器上,运行结果如下:

Time to do 10000000 empty loops is 0.03000 seconds

上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。

3.与日期和时间相关的数据结构

在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:

#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
};
#define _TM_DEFINED
#endif

ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。

而日历时间(Calendar Time)是通过time_t数据类型来表示的,用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数。在time.h中,我们也可以看到time_t是一个长整型数:

#ifndef _TIME_T_DEFINED
typedef long time_t; /* 时间值 */
#define _TIME_T_DEFINED /* 避免重复定义 time_t */
#endif

大家可能会产生疑问:既然time_t实际上是长整型,到未来的某一天,从一个时间点(一般是1970年1月1日0时0分0秒)到那时的秒数(即日历时间)超出了长整形所能表示的数的范围怎么办?对time_t数据类型的值来说,它所表示的时间不能晚于2038年1月18日19时14分07秒。为了能够表示更久远的时间,一些编译器厂商引入了64位甚至更长的整形数来保存日历时间。比如微软在Visual C++中采用了__time64_t数据类型来保存日历时间,并通过_time64()函数来获得日历时间(而不是通过使用32位字的time()函数),这样就可以通过该数据类型保存3001年1月1日0时0分0秒(不包括该时间点)之前的时间。

在time.h头文件中,我们还可以看到一些函数,它们都是以time_t为参数类型或返回值类型的函数:

double difftime(time_t time1, time_t time0);
time_t mktime(struct tm * timeptr);
time_t time(time_t * timer);
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

此外,time.h还提供了两种不同的函数将日历时间(一个用time_t表示的整数)转换为我们平时看到的把年月日时分秒分开显示的时间格式tm:

struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);

通过查阅MSDN,我们可以知道Microsoft C/C++ 7.0中时间点的值(time_t对象的值)是从1899年12月31日0时0分0秒到该时间点所经过的秒数,而其它各种版本的Microsoft C/C++和所有不同版本的Visual C++都是计算的从1970年1月1日0时0分0秒到该时间点所经过的秒数。

4.与日期和时间相关的函数及应用
在本节,我将向大家展示怎样利用time.h中声明的函数对时间进行操作。这些操作包括取当前时间、计算时间间隔、以不同的形式显示时间等内容。

4.1 获得日历时间

我们可以通过time()函数来获得日历时间(Calendar Time),其原型为:

time_t time(time_t * timer);

如果你已经声明了参数timer,你可以从参数timer返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970年1月1日0时0分0秒)到现在此时的秒数。如果参数为空(NUL),函数将只通过返回值返回现在的日历时间,比如下面这个例子用来显示当前的日历时间:

#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
printf("The Calendar Time now is %d\n",lt);
return 0;
}

运行的结果与当时的时间有关,我当时运行的结果是:

The Calendar Time now is 1122707619

其中1122707619就是我运行程序时的日历时间。即从1970年1月1日0时0分0秒到此时的秒数。

4.2 获得日期和时间

这里说的日期和时间就是我们平时所说的年、月、日、时、分、秒等信息。从第2节我们已经知道这些信息都保存在一个名为tm的结构体中,那么如何将一个日历时间保存为一个tm结构的对象呢?

其中可以使用的函数是gmtime()和localtime(),这两个函数的原型为:

struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);

其中gmtime()函数是将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间,而localtime()函数是将日历时间转化为本地时间。比如现在用gmtime()函数获得的世界标准时间是2005年7月30日7点18分20秒,那么我用localtime()函数在中国地区获得的本地时间会比世界标准时间晚8个小时,即2005年7月30日15点18分20秒。下面是个例子:

#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *local;
time_t t;
t=time(NUL);
local=localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
local=gmtime(&t);
printf("UTC hour is: %d\n",local->tm_hour);
return 0;
}

运行结果是:

Local hour is: 15
UTC hour is: 7

4.3 固定的时间格式

我们可以通过asctime()函数和ctime()函数将时间以固定的格式显示出来,两者的返回值都是char*型的字符串。返回的时间格式为:

星期几 月份 日期 时:分:秒 年\n\0
例如:Wed Jan 02 02:03:55 1980\n\0

其中\n是一个换行符,\0是一个空字符,表示字符串结束。下面是两个函数的原型:

char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

其中asctime()函数是通过tm结构来生成具有固定格式的保存时间信息的字符串,而ctime()是通过日历时间来生成时间字符串。这样的话,asctime()函数只是把tm结构对象中的各个域填到时间字符串的相应位置就行了,而ctime()函数需要先参照本地的时间设置,把日历时间转化为本地时间,然后再生成格式化后的字符串。在下面,如果t是一个非空的time_t变量的话,那么:

printf(ctime(&t));

等价于:

struct tm *ptr;
ptr=localtime(&t);
printf(asctime(ptr));

那么,下面这个程序的两条printf语句输出的结果就是不同的了(除非你将本地时区设为世界标准时间所在的时区):

#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
ptr=gmtime(<);
printf(asctime(ptr));
printf(ctime(<));
return 0;
}

运行结果:

Sat Jul 30 08:43:03 2005
Sat Jul 30 16:43:03 2005

4.4 自定义时间格式

我们可以使用strftime()函数将时间格式化为我们想要的格式。它的原型如下:

size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);

我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。

函数strftime()的操作有些类似于sprintf():识别以百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。

%a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十进制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

如果想显示现在是几点了,并以12小时制显示,就象下面这段程序:

#include “time.h”
#include “stdio.h”
int main(void)
{
struct tm *ptr;
time_t lt;
char str[80];
lt=time(NUL);
ptr=localtime(<);
strftime(str,100,"It is now %I %p",ptr);
printf(str);
return 0;
}

其运行结果为:
It is now 4PM

而下面的程序则显示当前的完整日期:

#include <stdio.h>
#include <time.h>

void main( void )
{
struct tm *newtime;
char tmpbuf[128];
time_t lt1;
time( <1 );
newtime=localtime(<1);
strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);
printf(tmpbuf);
}

运行结果:

Today is Saturday, day 30 of July in the year 2005.

4.5 计算持续时间的长度

有时候在实际应用中要计算一个事件持续的时间长度,比如计算打字速度。在第1节计时部分中,我已经用clock函数举了一个例子。Clock()函数可以精确到毫秒级。同时,我们也可以使用difftime()函数,但它只能精确到秒。该函数的定义如下:

double difftime(time_t time1, time_t time0);

虽然该函数返回的以秒计算的时间间隔是double类型的,但这并不说明该时间具有同double一样的精确度,这是由它的参数觉得的(time_t是以秒为单位计算的)。比如下面一段程序:

#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
time_t start,end;
start = time(NUL);
system("pause");
end = time(NUL);
printf("The pause used %f seconds.\n",difftime(end,start));//<-
system("pause");
return 0;
}

运行结果为:
请按任意键继续. . .
The pause used 2.000000 seconds.
请按任意键继续. . .

可以想像,暂停的时间并不那么巧是整整2秒钟。其实,你将上面程序的带有“//<-”注释的一行用下面的一行代码替换:

printf("The pause used %f seconds.\n",end-start);

其运行结果是一样的。

4.6 分解时间转化为日历时间

这里说的分解时间就是以年、月、日、时、分、秒等分量保存的时间结构,在C/C++中是tm结构。我们可以使用mktime()函数将用tm结构表示的时间转化为日历时间。其函数原型如下:

time_t mktime(struct tm * timeptr);

其返回值就是转化后的日历时间。这样我们就可以先制定一个分解时间,然后对这个时间进行操作了,下面的例子可以计算出1997年7月1日是星期几:

#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
struct tm t;
time_t t_of_day;
t.tm_year=1997-1900;
t.tm_mon=6;
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
t.tm_isdst=0;
t_of_day=mktime(&t);
printf(ctime(&t_of_day));
return 0;
}

运行结果:

Tue Jul 01 00:00:01 1997

现在注意了,有了mktime()函数,是不是我们可以操作现在之前的任何时间呢?你可以通过这种办法算出1945年8月15号是星期几吗?答案是否定的。因为这个时间在1970年1月1日之前,所以在大多数编译器中,这样的程序虽然可以编译通过,但运行时会异常终止。

5.总结

本文介绍了标准C/C++中的有关日期和时间的概念,并通过各种实例讲述了这些函数和数据结构的使用方法。笔者认为,和时间相关的一些概念是相当重要的,理解这些概念是理解各种时间格式的转换的基础,更是应用这些函数和数据结构的基础。

posted @ 2007-01-15 20:11 Thunder 阅读(631) | 评论 (0)编辑 收藏
 

你会用sizeof吗?(vc篇)

 
本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用sizeof来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中sizeof的主要用法。

1、 sizeof应用在结构上的情况

请看下面的结构:

struct MyStruct

{

double dda1;

char dda;

int type

};

对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求:

sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13

但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)为16。你知道为什么在VC中会得出这样一个结果吗?

其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。

类型
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)

Char
偏移量必须为sizeof(char)即1的倍数

int
偏移量必须为sizeof(int)即4的倍数

float
偏移量必须为sizeof(float)即4的倍数

double
偏移量必须为sizeof(double)即8的倍数

Short
偏移量必须为sizeof(short)即2的倍数



各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

下面用前面的例子来说明VC到底怎么样来存放结构的。

struct MyStruct

{

double dda1;

char dda;

int type

};

为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。

下面再举个例子,交换一下上面的MyStruct的成员变量的位置,使它变成下面的情况:

struct MyStruct

{

char dda;

double dda1;

int type

};

这个结构占用的空间为多大呢?在VC6.0环境下,可以得到sizeof(MyStruc)为24。结合上面提到的分配空间的一些原则,分析下VC怎么样为上面的结构分配空间的。(简单说明)

struct MyStruct

{

char dda;//偏移量为0,满足对齐方式,dda占用1个字节;

double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8

//的倍数,需要补足7个字节才能使偏移量变为8(满足对齐

//方式),因此VC自动填充7个字节,dda1存放在偏移量为8

//的地址上,它占用8个字节。

int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍

//数,满足int的对齐方式,所以不需要VC自动填充,type存

//放在偏移量为16的地址上,它占用4个字节。

};//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构

//的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof

//(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为

//sizeof(double)=8的倍数。



所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。



VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。

VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;

否则必须为n的倍数。下面举例说明其用法。

#pragma pack(push) //保存对齐状态

#pragma pack(4)//设定为4字节对齐

struct test

{

char m1;

double m4;

int m3;

};

#pragma pack(pop)//恢复对齐状态

以上结构的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1占用1个字节。接着开始为m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(16),那么我们可以得到结构的大小为24。(请读者自己分析)

2、 sizeof用法总结

在VC中,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。

A. 参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。

B. 参数为数组或指针。下面举例说明.

int a[50]; //sizeof(a)=4*50=200; 求数组所占的空间大小

int *a=new int[50];// sizeof(a)=4; a为一个指针,sizeof(a)是求指针

//的大小,在32位系统中,当然是占4个字节。

C. 参数为结构或类。Sizeof应用在类和结构的处理情况是相同的。但有两点需要注意,第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。

第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一

个实例在内存中都有唯一的地址。

下面举例说明,

Class Test{int a;static double c};//sizeof(Test)=4.

Test *s;//sizeof(s)=4,s为一个指针。

Class test1{ };//sizeof(test1)=1;

D. 参数为其他。下面举例说明。

int func(char s[5]);

{

cout<
//数的参数在传递的时候系统处理为一个指针,所

//以sizeof(s)实际上为求指针的大小。

return 1;

}

sizeof(func(“1234”))=4//因为func的返回类型为int,所以相当于

//求sizeof(int).



以上为sizeof的基本用法,在实际的使用中要注意分析VC的分配变量的分配策略,这样的话可以避免一些错误。

作者Blog: http://blog.csdn.net/topcool99/
posted @ 2006-11-30 21:15 Thunder 阅读(444) | 评论 (1)编辑 收藏
本文只是本人对C++中关于静态类型的一个总结,如错误之处,请大家帮我改正。我分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。

一、在面向过程设计中的static关键字

1、静态全局变量

定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。

特点:
  A、该变量在全局数据区分配内存。
  B、初始化:如果不显式初始化,那么将被隐式初始化为0。
  C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。

  例(摘于C++程序设计教程---钱能主编P103):         //file1.cpp
        #include<iostream.h>
        void fn();
        extern int n;
        void main()
        {
          n=20;
          cout << n << endl;
          fn();
        }

        //file2.cpp
        #include<iostream.h>

        static int n; //定义静态全局变量,初始化为0;
        void fn()
        {
          n++;
          cout << n << endl;
        }

  文件分别编译能通过,但连接时file1.cpp 中的变量n找不到定义,产生连接错误。

  D、文件作用域下声明的const的常量默认为static存储类型。

2、静态局部变量

定义:在局部变量前加上static关键字时,就定义了静态局部变量。

特点:
  A、该变量在全局数据区分配内存。
  B、初始化:如果不显式初始化,那么将被隐式初始化为0。
  C、它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或 语句块结束时,其作用域随之结束。

3、静态函数(注意与类的静态成员函数区别)

定义:在函数的返回类型前加上static关键字,函数即被定义成静态函数。

特点:
  A、静态函数只能在本源文件中使用(这是与普通函数区别)
  例(摘于C++程序设计教程---钱能主编P103):         //file1.cpp
        void fn();
        void staticFn()

        void main()
        {

          fn();
          staticFn();
        }

        //file2.cpp
        #include<iostream.h>

        static void staticFn();
        void fn();

        void fn()
        {
          staticFn();
          cout << "this is fn() \n";
        }

        void staticFn()
        {
          cout << "this is staticFn() \n";
        }
连接时,将产生找不到函数staticFn()定义的错误。

  B、主意事项

  在文件作用域下声明的inline函数默认为static类型。

二、面象对象中的static关键字(主要指类中的static关键字)

1、静态数据成员

特点:
  A、内存分配:在程序的全局数据区分配。
  B、初始化和定义:
   a、静态数据成员定义时要分配空间,所以不能在类声明中定义。
   b、为了避免在多个使用该类的源文件中,对其重复定义,所在,不能在类的头文件中
    定义。
   c、静态数据成员因为程序一开始运行就必需存在,所以其初始化的最佳位置在类的内部实现。
  C、特点
   a、对相于 public,protected,private 关键字的影响它和普通数据成员一样,
   b、因为其空间在全局数据区分配,属于所有本类的对象共享,所以,它不属于特定的类对象,在没产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。

  D、访问形式
   a、 类对象名.静态数据成员名
   b、 类类型名:: 静态数据成员名

  E、静态数据成员,主要用在类的所有实例都拥有的属性上。比如,对于一个存款类,帐号相对   于每个实例都是不同的,但每个实例的利息是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内存,所以节省存贮空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了,因为它们实际上是共用一个东西。

2、静态成员函数

特点:
  A、静态成员函数与类相联系,不与类的对象相联系。
  B、静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例。

作用:
  主要用于对静态数据成员的操作。
调用形式:
  A、类对象名.静态成员函数名()
  B、类类型名:: 静态成员函数名()
posted @ 2006-11-25 19:37 Thunder 阅读(1027) | 评论 (0)编辑 收藏
第一种方法:
int i=9;
char num[20];
itoa(i,num,10);
10 is radix

第二种方法:
include <ostringstream>
string num;
int i=9;
ostringstream ostr;
ostr<<i;
num = ostr.str();
posted @ 2006-10-14 06:48 Thunder 阅读(2171) | 评论 (3)编辑 收藏

参考文献
参考文献是对期刊论文引文进行统计和分析的重要信息源之一,在本规范中采用GB 7714推荐的顺序编码制格式著录。
参考文献著录项目:
① 主要责任者(专著作者、论文集主编、学位申报人、专利申请人、报告撰写人、期刊文章作者、析出文章作者)。多个责任者之间以“,”分隔,注意在本项数据中不得出现缩写点“.”(英文作者请将作者名写全)。主要责任者只列姓名,其后不加“著”、“编”、“主编”、“合编”等责任说明。②. 文献题名及版本(初版省略)。③ 文献类型及载体类型标识。④ 出版项(出版地、出版者、出版年)。⑤ 文献出处或电子文献的可获得地址。⑥ 文献起止页码。⑦ 文献标准编号(标准号、专利号……)。
参考文献类型及其标识
根据 GB 3469规定,以单字母方式标识以下各种参考文献类型:
 
参考文献类型 专著 论文集 报纸文章 期刊文章 学位论文 报告 标准 专利   
文献类型标识 M C N J D R S P 
对于专著、论文集中的析出文献,其文献类型标识建议采用单字母“A”;对于其他未说明的文献类型,建议采用单字母“Z”。
对于数据库(database)、计算机程序(computer program)及电子公告(electronic bulletin board)等电子文献类型的参考文献,建议以下列双字母作为标识:
 
电子参考文献类型 数据库 计算机程序 电子公告   
电子文献类型标识 DB CP EB 
电子文献的载体类型及其标识
对于非纸张型载体的电子文献,当被引用为参考文献时需在参考文献类型标识中同时标明其载体类型。本规范建议采用双字母表示电子文献载体类型:磁带(magnetic tape)——MT,磁盘(disk)——DK,光盘(CD-ROM)——CD,联机网络(online)——OL,并以下列格式表示包括了文献载体类型的参考文献类型标识:
[文献类型标识/载体类型标识]
如: [DB/OL]—— 联机网上数据库(database online)
 [DB/MT]—— 磁带数据库(database on magnetic tape)
 [M/CD]—— 光盘图书(monograph on CD-ROM)
 [CP/DK]—— 磁盘软件(computer program on disk)
 [J/OL]—— 网上期刊(serial online)
 [EB/OL]—— 网上电子公告(electronic bulletin board online)
以纸张为载体的传统文献在引作参考文献时不必注明其载体类型。
文后参考文献表编排格式
参考文献按在正文中出现的先后次序列表于文后;表上以“[参考文献]”(居中)作为标识;参考文献的序号左顶格,并用数字加方括号表示,如[1]、[2]、…,以与正文中的指示序号格式一致。参照ISO 690及ISO 690-2,每一参考文献条目的最后均以“.”结束。各类参考文献条目的编排格式及示例如下:
a. 专著、论文集、学位论文、报告
[序号] 主要责任者.文献题名[文献类型标识].出版地:出版者, 出版年.起止页码(任选).
[1] 刘国钧,陈绍业,王凤翥.图书馆目录[M].北京:高等教育出版社,1957.15-18.
[2] 辛希孟.信息技术与信息服务国际研讨会论文集:A集[C].北京:中国社会科学出版社,1994.
[3] 张筑生.微分半动力系统的不变集[D].北京:北京大学数学系数学研究所,1983.
[4] 冯西桥.核反应堆压力管道与压力容器的LBB分析[R].北京:清华大学核能技术设计研究院,1997.
b. 期刊文章
[序号] 主要责任者. 文献题名 [J]. 刊名,年,卷(期): 起止页码.
[5] 何龄修.读顾城《南明史》[J].中国史研究,1998,(3):167-173.
[6] 金显贺,王昌长,王忠东,等.一种用于在线检测局部放电的数字滤波技术[J].清华大学学报(自然科学版),1993,33(4):62-67.
c. 论文集中的析出文献
[序号] 析出文献主要责任者. 析出文献题名 [A]. 原文献主要责任者(任选). 原文献题名 [C]. 出版地:出版者,出版年. 析出文献起止页码.
[7] 钟文发.非线性规划在可燃毒物配置中的应用[A].赵玮.运筹学的理论与应用——中国运筹学会第五届大会论文集[C].西安:西安电子科技大学出版社,1996. 468-471.
d.报纸文章
[序号] 主要责任者. 文献题名 [N]. 报纸名,出版日期 (版次).
[8] 谢希德.创造学习的新思路[N].人民日报,1998-12-25(10).
e.国际、国家标准
[序号] 标准编号,标准名称 [S].
[9] GB/T 16159-1996,汉语拼音正词法基本规则[S].
f.专利
[序号] 专利所有者. 专利题名 [P]. 专利国别:专利号,出版日期.
[10] 姜锡洲.一种温热外敷药制备方案[P].中国专利:881056073,1989-07-26.
g.电子文献
[序号] 主要责任者.电子文献题名 [电子文献及载体类型标识].电子文献的出处或可获得地址,发表或更新日期/引用日期(任选).
[11] 王明亮.关于中国学术期刊标准化数据库系统工程的进展[EB/OL].
http://www . cajcd.edu.cn/pub/wml.txt/980810-2.html, 1998-08-16/1998-10-04.
[12] 万锦坤. 中国大学学报论文文摘(1983-1993). 英文版 [DB/CD]. 北京:中国大百科全书出版社,1996.
h.各种未定义类型的文献
[序号] 主要责任者.文献题名[Z]. 出版地:出版者,出版年.
参考文献与注释的区别
参考文献是作者写作论著时所参考的文献书目,一般集中列表于文末;注释是对论著正文中某一特定内容的进一步解释或补充说明,一般排印在该页地脚。参考文献序号用方括号标注,而注释用数字加圆圈标注(如①、②…)。

posted @ 2006-09-11 16:55 Thunder 阅读(699) | 评论 (0)编辑 收藏

从int 到string的几种方法

1.   int sprintf( char *buffer, const char *format [, argument] ... );
      <stdio.h>
例如:
      int ss;
      char temp[64];
      string str;
      ss = 1000;
      sprintf(temp, "%d", ss);
      string s(temp);
       //调用string的方法
      cout<<s.c_str()<<endl;//1000
      cout<<s.size()<<endl;  //长度为4

2.char *_itoa( int value, char *string, int radix );
        <stdlib.h>
  例如:
      char buffer[20];
      int  i = 3445;   
     _itoa( i, buffer, 10 );
      string s(buffer);


3. stringstream( )
     <sstream.h>
 例如:
       int hello=4;
       stringstream ss;
       ss<<hello;
       string   s=ss.str();
     //调用string的方法
       cout<<s.c_str()<<endl;

posted @ 2006-05-31 09:19 Thunder 阅读(150) | 评论 (0)编辑 收藏

首先,CRF,HMM(隐马模型),MEMM(最大熵隐马模型)都常用来做序列标注的建模,像词性标注,True casing。但隐马模型一个最大的缺点就是由于其输出独立性假设,导致其不能考虑上下文的特征,限制了特征的选择,而最大熵隐马模型则解决了这一问题,可以任意的选择特征,但由于其在每一节点都要进行归一化,所以只能找到局部的最优值,同时也带来了标记偏见的问题(label bias),即凡是训练语料中未出现的情况全都忽略掉,而条件随机场则很好的解决了这一问题,他并不在每一个节点进行归一化,而是所有特征进行全局归一化,因此可以求得全局的最优值。
目前,条件随机场的训练和解码的开源工具还只支持链式的序列,复杂的尚不支持,而且训练时间很长,但效果还可以。

大致总结一下,详细地用到再看吧:)

posted @ 2006-05-23 11:04 Thunder 阅读(2144) | 评论 (7)编辑 收藏
仅列出标题  下一页

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(6)

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜