📄 01章 编程简介.txt
字号:
第1章计算机与C++编程简介
教学目标
●了解计算机科学的基本概念
●熟悉不同类型的编程语言
●了解典型C++程序的开发环境
●用C++编写简单的计算机程序
●使用简单输入与输出语句
●熟悉基本数据类型
●使用算术运算符
●了解算术运算符的优先级
●编写简单的判断语句
1.1 简介
欢迎来到C++的世界!我们将努力带给你一个信息丰富、充满趣味和富于挑战的学习经历。C++是一种较难的语言,通常只传授给有经验的程序员,因此本书在C++教材中独具一格:
●适合很少或没有编程经验的技术方面的人员
●适合需要深入钻研C++的熟练的程序员
一本书怎样适应两类读者呢?本书始终强调通过实践证明的结构化编程〔structuredprogramming)和面向对象编程(object-oriented programming)技术编写清晰的程序。非程序员从一开始就要养成良好的编程习惯。我们尽量以清晰而直接的方式编写程序。本书附有大量插图,更重要的是.本书提供大量实用的C++程序,并显示这些程序在计算机上运行时产生的输出结果。所有C++特性都是在完整、可工作的C++程序环境中介绍的,我们称其为“有生命力的代码”。所有这些例子都可以从我们的web站点www.deitel.com中下载.也可以通过本书所配的交互式光盘《C与C++多媒体教室(第二版)》中取得。多媒体教室的特性见本书最后的说明。多媒体教室中还包含本书一半练习的解答,包括简单解答、小型程序和许多完整项目。
本书的前五章介绍计算机基础、计算机编程和C++计算机编程语言。参加我们课程的新学员告诉我,第1章到第5章的材料为今后学习C++的高级知识打下了坚实基础。熟练的程序员可以快速浏览前五章,然后阅读本书其余部分对C++的有深度、有挑战性的介绍。
许多熟练的程序员告诉我们,他们很欣赏我们对结构化编程的处理、他们通常用C或Pascal结构化编程语言进行编程,但由于没有系统地学习结构化编程,因此常常无法用这些语言编写出最佳代码。学习本书前几章介绍的结构化编程知识后,有助于改进使用C或Pascal语言编程的风格。因此,无论你是新手还是熟练的程序员,这里的信息都是充实、有趣并且具有一定深度的。
大多数人对计算机能做的工作略有所知,利用本书可以学会如何指示计算机做这些工作。软件(sofware,即编写的指令,命令计算机完成操作并做出判断)可以控制计算机(通常称为硬件,Hardware)。C++是当今最常用的软件开发语言之一。本书介绍的C++版本已经过美国国家标准协会(ANSI,American ational Standards Institute)和国际标准化组织(IS0,International Stanards0rganization)的标准化,这个ANSI/ISO C++草案标准已经批准为全球标推。
计算机的应用领域在不断增加。在这个成本稳步攀升的时代,计算成本却在急速下降,因为硬件和软件技术都在飞速发展。25年前装满整个房间、价值上百万美元的计算机如今已经缩小到比手指甲还小的芯片,而且只要几美元。具有讽刺意味的是,硅是地球上最丰富的资源之一,是普通砂子的主要组成部分。硅芯片技术使计算技术如此经济,如今全世界已经有大约2亿台通用计算机在使用中,其应用涉及商业、工业、政府和个人生活。这个数字在近年内必将翻番。
本书将使读者面临几个挑战。几年前,人们学习第一个编程语言时可能只要学习C或Pascal,但实际上还需要学习C和C++,为什么呢?因为C++包括C语言和其他更多的内容。
几年前人们只需学习结构化编程(sstructured programming),而今则既要学习结构化编程,又要学习面向对象编程(object-oriented programming),因为面向对象是今后10年最关键的编程方法。本课程要建立和使用许多对象(Object),但是这些对象的内部结构最好用结构化编程方法建立。另外,操作对象的方法最好也用结构化编程方法来表达。
另一个介绍两种方法的原因是,目前有大量C++系统是从C语言系统移植过来的,还有大量的所谓“C语言遗留代码”。C语言已经使用20余年,近年来用得越来越多。人们学习C++之后就会发现,C++比C语言强得多,因此通常会转到使用C++.他们会将遗留的系统移植到C++,这是个相对简单的过程。然后,他们开始用各种C++对C++语言的增强特性改进其编写的类C语言程序的风格。最后,他们开始利用C++面向对象编程的功能,真正了解这种语言的全部好处。
编程语言中的一个有趣现象是,大多数厂家都推出C/C++产品组合而不是提供分开的产品。这样,用户可以继续使用C语言编程,适当时候再逐渐过渡到C++。
C++已经成为实现语言的首选.但它能在第一门编程课程中介绍吗?我们认为可以。五年前,当人们用Pascal作为第一门编程课程时,我们遇到过类似挑战。我们编写了《C How To Program》。
如今全世界几百所大学都在使用《C How To Prrogram》第二版,使用这本教材的课程和使用Pascal作为第一门编程课程一样有效。其间没有明显的差别,只是学生学习的兴趣更高,因为他们知道工作中要使用的是c语言而不是Pascal语言。学习C语言的学生还能更快地学习C++和新的Internet 语言——Java。
本书前五章介绍C++中的结构化编程方法、C++的“C语言部分”和“C++对C语言的改进”。然后要介绍C++面向对象编程,但我们不想等到第6章再介绍面向对象编程,因此前五章每一章都有一节“有关对象的思考”,介绍面向对象编程的基本概念和术语。第6章“类与数据抽象“将开始用C++生成对象并编写面向对象的程序。
第1章分为三部分,第一部分介绍计算机基础和计算机编程。第二部分立即开始编写一些简单C++程序,第三部分介绍有关对象的思考。
下面要开始富有挑战和回报的旅程了。学习过程中,如果想与我们联系,可以给我们发电子邮件
deltel@deitel.com
或浏览我们的web站点:
http://www.deitel.com
我们将立即答复。希望大家喜欢学习《C++大学教程》,还可以使用本书的交互式光盘版本《C与C++多媒体教室(第二版)》,详见本书最后的说明。
1.2 什么是计算机
计算机(computer)是能以人的几百万甚至几十亿倍速度进行计算井作出逻辑判断的设备。例如.今天的许多个人计算机每秒钟可以进行几亿次加法运算。操作台式计算器的人要几十年才能算出的数值,强大的个人计算机只要一秒钟即可计算完毕(注意:你怎么知道这个人加对了没有?你怎么知道计算机做得是否正确?)。如今.最快的超级计算机(supercomputer)每秒钟可以进行几干亿次加法运算,是成百上千的人花一整年时间才能完成的计算工作。每秒钟万亿条指令的计算机已经能在研究实验室中工作。
计算机在一组指令控制下处理数据(data),这组指令称为计算机程序(computer programmer)。这些计算机程序指导计算机按顺序进行计算机程序(computer programmer)指定的一组操作。
构成计算机系统的各种设备(如键盘、屏幕、鼠标、磁盘、内存、光盘和处理器)称为硬件。计算机上运行的计算机程序称为软件。几年来,硬件成本已经大幅下降,使个人计算机更加平民化。但是,随着程序员开发了许多越来越强大、越来越复杂的应用程序,而软件开发技术却进步不大,因而使软件开发成本不断上升。本书介绍通过成熟的软件开发方法减少软件开发成本,即结构化编程、自上而下逐步完善、功能化以及面向对象编程。
1.3计算机组成
不管外观如何不同,每个计算机都可以看成由六个单元(logical unit)或部分组成,即:
1.输入单元(iput unit),这是计算机的“接收”部分,从各种输入设备接收信息(数据和计 算机程序),并将这些信息放到其他单元中,使信息得以处理。如今大多数信息都是通过键 盘和鼠标设备输入计算机。将来大多数信息也许可以通过语音输入或扫描图形而获得。
2.输出单元(output unit),这是计算机的“发送”部分。将计算机处理过的信息送到不同输出 设备中,向计算机外部提供所需的信息。如今计算机输出的大多数信息是通过屏幕显示、书 面打印或用于控制其他设备。
3.内存单元(memory unit),这是计算机中快速访问、低容量的“库存”部分。它保存通过输入单元输入的信息,以便在需要时立即提供这些信息进行处理。内存单元保存处理的信息, 直到输出单元将信息故到输出设备中。内存单元也称为内存或主内存(memory或primary memory)。
4.算术/逻辑单元(arithmetic and logic unit ALU)这是计算机的“生产”部分,负责进行加、减、乘、除等运算,包含判断机制例如可以让计算机比较内存单元中的两个项目,确定其是否相等。
5.中央处理单元(central processing unit CPU),这是计算机中的“管理”部分,是计算机的协调员,负责管理其他部分的操作。CPU告诉输入单元何时将信息读取到内存单元中,告诉ALU何时利用内存单元中的信息进行计算,告诉输出单元何时将内存单元中的信息发送到指定的输出设备中。
6.辅助存储单元(secondary storage unit),这是计算机长期的高容量“库存”部分,其他单元不是经常使用的程序或数据通常放在辅助存储单元(如磁盘)中,直到几小时、几天、几月 甚至几年后才需要。访问辅助存储单元中的信息要比访问主内存中的信息慢得多。辅助存储单元的单位成本比主内存的单位成本低得多。
1.4 操作系统的变革
早期计算机一次只能完成一个任务或作业(task或job),这种计算机操作通常称为单用户批处理(batch processing)。计算机一次运行一个程序,成组或成批地处理数据。在这些早期系统中,用户利用穿孔卡片将作业提交到计算机中心,通常要等待几小时或几天之后才能得到打印输出。
称为操作系统(operating system)的软件系统可以帮助用户更方便地使用计算机。早期操作系统能管理作业之间的顺利过渡,使得计算机操作员在作业之间切换的时间减到最少,从而增加计算机处理的工作量或吞吐量(throughput)。
随着计算机的功能越来越强大,单用户批处理机制显然不能有效地利用计算机资源,因此应该让许多任务或作业共享计算机资源,以达到更好地利用资源,这种方法称为多道程序设计(multiprogramming)。多道程序系统涉及多个作业在计算机上“同时”操作,计算机在竞争资源的作业之间共享资源。在早期多道程序操作系统中,用户还是要通过穿孔卡片将作业提交到计算机中心,几小时或几天之后才能得到打印输出。
20世纪60年代,计算机界和大学的几个研究小组提出了分时(timesharing)操作系统。分时是多道程序的特殊情况,用户通过终端(terminal)访问计算机,终端是带有键盘和屏幕的典型设备。在典型的分时操作系统中,可能有几十甚至几百个用户同时共用计算机。计算机实际上并不是同时运行所有用户,而是运行一个用户的一小段作业,然后转入运行下一个用户的一小段作业。计算机的速度非常快,每秒钟可以为每个用户服务多次,使得用户的程序看上去是在同时运行。分时的好处之一是用户能立即收到响应,而不必像原先的计算方式需要等待很长时间。
1.5 个人计算、分布式计算与客户/服务器计算
1977年,Apple计算机公司使个人计算(personal computer)得以普及。最初,拥有一台计算机只是爱好者的梦想,随着它的价格不断降低,人们可以购买供个人或办公使用的计算机。1981年,世界上最大的计算机广家IBM公司推出了IBM个人计算机(IBM Personal computer)。一夜之间,个人计算机遍布公司、企业和政府机关。
然而这些计算机只是“独立”的个体,各自做自己的工作,要通过磁盘复制来共享信息(通常称为暗联网)。尽管早期个人计算机不够强大,不能同时服务于多个用户,但这些机器可以链接在计算机网络中,可以接入组织内的局域网(Local area Network,LAN),还可以通过单位内部的电话线完成链接。这样就在组成化计算中出现了分布式计算(distributed computing)结构,其处理不是在某个中央计算机上进行,而是由分布于网络中的机器完成。个人计算机已经足够强大,能够处理个人用户的计算要求并处理电子信息传递等基本通信任务。
如今,最强大的个人计算机已经可以和十年前几百万美元的机器相媲美。最强大的台式计算机(称为工作站,workstation)对个人用户提供了大量的功能。在网络上.有些计算机向遍布整个网络的客户提供数据存取服务,这些计算机称为文件服务器(file server)。通过这种方式.在网络上共享信息很容易,因而产生了客户—服务器结构o C和C++已经成为编写操作系统、计算机网络和分布式客户/服务器应用程序软件的首选编程语言。如今最常见的操作系统如UNIX、Microsoft的基于windows系统和IBM的os/2都提供了本节介绍的功能。
1.6 机器语言、汇编语言和高级语言
程序员用各种编程语言编写指令,有些是计算机直接理解的,有些则需要中间翻译(tranlation)的步骤。如今使用的计算机语言有几百种,可以分为三大类:
1.机器语言
2.汇编语言
3.高级语言
任何计算机只能直接理解本身酌机器语言(machine language)。机器语言是特定计算机的自然语言,由计算机的硬件设计定义。机器语言通常由一系列数字组成(最终简化0和1),让计算机一次一个地执行最基本的操作。机器语言非常繁琐,下面的机器语言程序将工龄工资和基础工资相加,并把结果保存在工资总额中:
+1300042774
+1400593419
+1200274027
随着计算机越来越普及,机器语言编程对大多数程序员显然太慢、太繁琐。程序员不用计算机直接理解的一系列数字,而是用类似英文缩写的助记将来表示计算机的基本操作,这些助记符构成了汇编语言(assembly language)。称为汇编器(assembler)的翻译程序以计算机的速度将汇编语言程序转换为机器语言。下列汇编程序也是工龄工资和基础工资相加,并将结果保存在总工资中,但要比相应的机器语言清晰得多:
LOAD BASEPAY
ADD OVERPAY
STORE GROSSPAY
尽管这种代码对于人们一目了然,但计算机却无法理解,必须先翻译为相应的机器语言。
随着汇编语言的出现,计算机的使用迅速增加,然而即使是最简单的任务.也需要许多条指令才能完成。为了加速编程过程,人们开发了高级语言(high-level language),用一条语句完成大量任务。称为编译器(compiler)的翻译程序将高级语言程序变为相应的机器语言。高级语言使程序员能够编写更像英语的指令,可以包含常用的数学符号。将工龄工资和基础工资相加.并把结果保存在总工资中,可以用下列高级语言程序:
grossPay = basePay + overTimePay
显然,从程序员角度看,高级语言比机器语言和汇编语言都要强得多。 C和C++是最强大最广泛使用的高级语言。
将高级语言程序编译为相应的机器语言的过程可能需要大量时间。解释器(interpreter)程序可以直接执行高级语言程序,而不必先将这些程序编译成相应的机器语言。尽管编译程序的执行速度比解释程序更快,但解释器在程序开发环境中更常用,因为增加新特性和纠正错误时经常需要重
新编译程序。一旦程序开发完成,编译版本的运行最有效。
1.7 C语言与C++的历史
C++是从C语言演变而来的,而C语言又是从两个编程语言BCPL和B演变而来的、BCPL是Martin Richards于1967年开发的,用于编写操作系统软件和编译器。Ken Thompson在他的B语言(1970年在贝尔实验室)。DCPL和B都是“无类型”语言,每个数据项在内存中占一个“字”(word)长、如果要将数据项作为整数或实数处理,编程的工作量会很大。
C语言是从D语言演变而成的,由贝尔实验室的Dennis Ritchie开发,最初于1972年在DEC PDP—11计算机上实现。C语言使用了BCPL和B的许多重要概念,同时增加了数据类型和其他特性。C语言最初作为UNIX操作系统的开发语言而闻名于世。如今,大多数操作系统都是用C/C++写成的。二十多年来,C语言已经遍布在大多数计算机上。C语言是硬件无关的,只要仔细设计。就可以编写能移植列大多数计算机上的C语言程序。
到20世纪70年代未期,C语言演变成现在所谓的“传统C”、“经典CPP或“Kernighan/RitchieC"。1978年Prentice Hall公司出版了Kernighan和Ritchie合作的著作《The CProgrmmming Language》,引起了人们对C语言的广泛关注(见参考文献Ke78)。
C语言在各种不同类型计算机(有时称为硬件平台)上的普及导致了许多变形。它们虽然相似,但通常互不兼容。对需要为不同平台编写可移植程序的开发人员.这是个严重问题,显然需要有个标准的C语言版本。1983年,美国国家计算机与信息处理标准委员会(x3)成立了x3JII技术分会,目的是提供无歧义性且与机器无关的语言定义。1989年推出了这种语言标准。AN5I与国际标准化组织(IS0)合作.在全球范围内将C语言标淮化,1990年推出了联合标准文档.称为ANSI/IS09899:1990。这个文档可以从ANSI获得副本。1988年推出的Kernighan 和Ritchie著作的第二版体现了该版本(称为ANSI C),这也是目前全世界使用的版本(见参考文献Ke88)o
可移植性提示1.1
由于c语言是标准化、硬件无关、广为使用的语言,因此用C语言编写的应用程序通常只要稍作修改或不经修改即可在多种不同的计算机系统中运行。
C++是C语言的扩展,是20世纪80年代初由贝尔实验室的Bjarne stroustrup开发的。C++的许多特性是从c语言中派生的,但更重要的是,它提供了面向对象编程(object-oriented programming)的功能。
软件业正在酝酿一场革命,最终日标是更快、更正确、更经济地建立软件,新的、更强大的软件需求迫在眉睫。对象(object)实际上是模拟实际项目的可复用软件组件(component)。软件开发人员发现,利用模块化、面t向对象的设计和实现方法与过去结构化编程方法相比较,可以使软件开发小组的生产率更高。面向对象编程的优势在于更容易理解、纠正和修改。
许多面向对象的语言也纷纷涌现,包括最著名的由Xerox的Palo Alto研究中心(PARC)开发的small talk。Smalltalk是纯粹的面向对象的语言,其所有的编程元素都是“对象”。C++则是一种“混合型语言“,可以用C语言方式、面向对象方式或兼用两种方式进行编程。1.9节将介绍基于C/C++的新语言——Java。
1.8 C++标准库
C++程序由类(class)和函数(function)组成。可以用多个小的软件模块构成C++程序,但大多数C++程序员会利用C++标准库中已有的类和函数来编程。这样,C++“世界”中实际要学习两方面的知识,第一是学习C++语言本身,第二是学习如何利用C++标准库中现有的类和函数(本书将介绍许多类和函数)。 Plauger(见参考文献P192)的著作是程序员必读的.可以帮助程序员深入了解C++中包括的ANSI C语言库函数,了解如何实现这些库函数,还可以了解如何用库函数编写可移植代码。标准库函数通常由编译器厂家提供。许多独立软件供应商(indepandent softerware vender)也提供各种专用类库。
软件工程视点1.1
使用构件块方法(building block approach)生成程序,而不要事事从0开始。尽量利用现有程序块,这称为软件复用(software reuse),是面向对象编程的核心。
软件工程视点1.2
C++编程中通常使用下列构件块:C++标准库中的类和函数.自己生成的类和函数和各种常见非C++标准库中的类和函数。
自己生成类和函数的优点在于知道其如何工作,可以检查C++代码:缺点是要花大量时间及精力来设计、开发和维护这些类或函数,使其正确、有效地运行。
性能提示1.1
利用标准库函数和类而不用自己的对应版本可以提高软件性能,因为这些软件经过认真编写,能保证有效操作。
可移植性提示1.2
利用标准库函数和类而不用自己的对应版本可以提高软件性能,因为几乎所有C++版本都包括这些软件。
1.9 Java、Internet与万维网
这是C++程序员应当高兴的时刻,整个计算机行业都为新的ANSI/ISO草案标准最终得到批准而感到兴奋。
]995年5月,Sun公司宣布推出新的Java编程语言。sun公司是基于UNIX的高性能工作站的领导厂家,一直强调计算机网络的重要性。Java是基于C/C++的语言,加入了许多面向对象编程的特性。sun公司提供了基本Java软件、文档、教程和演示,可以在Web站点www.javasoft.com免费取得。Java具有大量的类库,包括支持多媒体、网络、图形、数据库访问、分布式计算等软件组件。
Java最吸引入的属性之一是它的可移植性,可以在一台计算机上编写Java程序.然后在任何支持Java的计算机上运行(目前大多数常见计算机系统都支持Java)。这对软件开发人员特别具有吸引力,他们可以不再为不同类型的计算机系统开发或维护不同的软件版本。为不同类型的计算机系统开发和维护不同的软件版本是非常费时、费力的,使得独立软件供应商只能生产常见系统平台中使用的软件,如Microsoft Windows。如今,基于Java的软件应用程序可以在所有常用的Microsoft widowe版本中和各种UNIX、Macintosh及OS/2等大多数流行的系统平台中运行。
我们体会到Java在学校和企业客户中的重要性,因此编写了几本Java教材和基于交互式光盘的学习软件包。这个语言变化得很快,因此我们在第一版《JavHow to Program》推出后仅11个月又推出了其第二版。C++要成熟很多(是1980年创建的),因此《C++大学教程》在第一版推出三年半之后才推出第二版,以配合ANSI/ISO C++草案标准的推广。
1.10 其他高级语言
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -