C++程序设计课本翻译_第1页
C++程序设计课本翻译_第2页
C++程序设计课本翻译_第3页
C++程序设计课本翻译_第4页
C++程序设计课本翻译_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言

本书特点

网络链接贯穿整木书都能找到特定网络图标,促使学生访问位于/dale的课本指南网站

来得到有关选择标题的附加信息,这些网站链接能立.即给学生取出在课本中出现的实际应用资料,网络链

接定期升级,以确保学生在因特网上收到最新的信息。

目标每一章开始都为学生列出一系列学习目标,这些目标在章节末尾的练习中得到增强和测试。

编程例子大部分章节都包含了编程例子,编程例子提出问题并讨论它的解决方法。然后我们用C++编码解

答。我们同样要显示出例子测试的数据和输出结果并进一步对程序测试结果进行讨论。

测试和调试这部分涉及有关程序测试的章节内容,它们以•系列测试和调试的心得来结束。

快速测试这些问题测试学生回忆与章节目标相联系的要点,在阅读每一个问题时,学生立即应该知道答案,

然后他或她可以看•下在这部分的末尾的答案来证实。被讨论的概念的页码出现在每个问题的末尾,以便

学生万一有不正确的回答时,能够复习这部分内容。

检查准备练习为了帮助学生准备测试,这些问题•般有客观答案,并且这些问题被设计成只需儿分钟就可

以回答的。选择问题的答案给出在书的后面,剩下的问题在教师用书中作回答。

编程热身练习这些问题提供给学生编写C++代码段的感受,学生能够在每章练习语法结构,而不要负担编

写完整程序。

编程问题这些练习题需要学生设计解决方法并写出完整程序。

第一章编程和解题概述

目标

•理解什么是计算机程序

•能够列出编写计算机程序的基本步骤

・理解什么是算法

•学习什么是高级编程语言

・能够描述什么是编译器及它的作用

・理解编辑和执行过程

•学习什么是计算机的主要组成部件和部件如何•起工作

・能够区分硬件和软件

・能够选择•种适当的解决问题的方法来对一个问题研制出•种算法解

1.1编程概述

什么是编程?

编程:计划或安排•项工作或•件事件的步骤。

计算机:能够存储,取出和处理数据的一种可编程装置。

计算机编程:为计算机连续执行计划•系列步骤的过程。

计算机程序:一系列由计算机执行的指令。

我们如何写一个程序?

为计算机连续执行写一系列指令,我们必须通过两步过程:解题和执行。

解题阶段

1.分析和详细叙述弄懂(定义)问题和解决方法必须做什么。

2.•般解决方法(算法)研究•系列解决问题的步骤。

3.验证确切地按照步骤看看是否解决方法真能做到解决问题。

执行阶段

1.具体解决方法(程序)把算法转换成编程语言。

2.测试使计算机按照指令执行,然后手工地检查结果。如果你发现错误,分析程序和算法,决定错误

源,然后纠正。

3.一旦程序写好,进入第三阶段:维护。

维护阶段

1.使用使用程序。

2.维护为了满足改变程序的需要或纠正出现在使用程序中的错误而修改程序。

编程者开始通过分析问题并研究一个通常的解决方法的编程过程,称为算法。

算法:在有限的时间内,为解决问题的一步一步的步骤。

在研究一个通常的解决方法后,编程者测试算法,人工检查走过每一步,如果算法不能工作,编程者重

复解决问题的过程,再一次分析问题并提出来。

编程语言用于构造一个计算机程序的一套规则,符号和特殊词。

程序语言是一些附着一套严格语法的英语简化形式(具有数学符号)。

英语远复杂于今天的计算机所遵循的语言。由丁编程语言限制了词汇和语法,编程语言简单的多。

虽然编程语言在形式上是简单的,但它不容易使用。使用不多于45个词汇尝试给某人最近的方向,你会

开始看到问题。编程强迫你写非常简单、确切的指令。

转换一个算法成一个编程语言被称为编码算法。转换的产品一程序一在计算机上运行程序来测试它。如

果程序不能产生期望的结果,编程者必须调试它一即,检测错误是什么然后修改程序,或者甚至是算法,

修改它。

编码和测试一个算法的结合称为实现。

1.2什么是编程语言?

能够直接在计算机上运行的仅有的编程语言是建立在计算机内的原始指令一机器语言或机器代码。

机器语言:由二进制代码指令所组成的语言,机器语言被直接用于计算机.

例如:

指令名机器语言形式

Add100101

Subtract010011

计算机科学家了研制高级编程语言,由于高级语言更接进英语和其它自然语言.

编译器:转换高级语言为机器代码的程序.

被称为编译器的程序转换以高级语言(例如,C++,Pascal,FORTRAN,COBOL,orAda)写的程序成机器

语言.如果你以高级语言写一个程序,你能够在任何有适当编译器的计算机上运行它.这是可能的,因为大

多数高级语言是标准化的,这意味着种正式的语言描述是存在的.

高级语言程序被称为源程序,对编译器来说,一个源程序正是输入数据.编译器转换源程序成被称为目

标程序的机器语言程序.些编译器也输出•个列表-一•个具有错误信息和其它插入信息的拷贝.

弄懂编译和执行是两个不同的过程是重要的.在编译期间,编译器运行编译程序,在执行期间,目标程序被

装载到计算机的内存单元,取代编译器程序.然后计算机运行目标程序,程序命令它做的任何要做的事情

(见图1-4).

在编程语言中的指令影响一个计算机能够完成的操作.

编程语言需要我们使用某些控制结构表示算法作为程序.在大部分编程语言中有四种基本结构语句的方

法(指令):

(1)顺序结构

(2)条件结构

(3)重复结构

(4)子程序结构

(见图1-5)

顺序结构是一系列一条接一条被执行的语句.

选择结构(条件控制结构),取决某些条件执行不同的语句.

重复控制结构,当某些条件满足时循环,重复语句.

子程序允许我们构造个被中断进入更小单元的程序.

这四种结构语句方法的每一种控制计算机执行语句的次序,这就是为什么它们被称为控制结构.

图1-5基本编程语言结构

一个子程序是由多个步骤组成的一个过程,子程序允许分别地写我们程序各部分,然后装配它们成最终形

式.它们能极大地简化写大程序的工作.

1.3什么是计算机?

如果你知道某些有关计算机的各部分,你能更好地理解编程语言中每种指令的影响.

大部分计算机有六种基本的部件:

(1)内存单元

(2)算术/逻辑单元

(3)控制单元

(4)输入设备

(5)输出设备

(6)辅助存储设备

图1-6是计算机基本部件的形式图

存储单元:在计算机中的内部数据存储器。

存储单元是一■个按照顺序存储的单位,每个单位能保存一些数据,每个存储单位有一个不同的地址,我

们利用这个地址为了存储数据到存储单位或从存储单位取出数据.存储单元即保持数据也保持指令。

控制处理单元(CPU):计算机执行被存储在存储器中的指令的部件.由算术/逻辑单元(ALU)和控制单元

组成。

算术/逻辑单元(ALU):完成算术和逻辑操作的中央处理单元的部件。

控制单元:控制其它部件的活动的中央处理单元的部件。

输入/输出(I/O)设备:接受要处理(输入)的数据和给出处理(输出)结果的计算机部件。

键盘是•个普通的输入设备,另•个是鼠标,个指示设备.屏幕显示是•个普通的输出设备,像打印

机和液晶显示屏幕(LCD)也是输出设备.某些设备,例如连接到计算机网络的设备,既可以用做输入也可以

用做输出。

硬件:计算机的物理部件。

软件:计算机程序;有关计算机的所有程序的设置。

接口:一个共享地边界,在这个边界允许独立系统汇集和作用或互相通信。

操作系统:管理所有计算机资源的•套程序。

编辑器:被用来建立和修改源程序或数据的交互程序。

软件工程:对软件研究的传统工程应用的方法学和技能。

第二章C++语法和语义及程序研究过程

目标

懂得一个C++程序是如何由一个或多个子程序(函数)组成.

•为了弄懂•般管理C++程序的规则,能阅读语法模板.

•能够建立和识别合法的C++标识符.

•能够声明字符和字符串类型的名字常数和变量.

•能够区别C++中保留字与用户自定义标识符.

•能够对变量赋值.

•能够建立由常量、变量和连接运算符组成的简单串表达式.

•能够建立一条写到输出流的语句.

•能够确定输出语句打印什么内容.

•能够使用注释来说明你的程序.

•能够建立简单的C++程序.

2.1C++程序的元素

在这章,我们开始看看组成C++程序设计语言的规则和符号.我们也回顾一下建立一个程序并能在计算

机上运行的所需步骤.

C++程序结构

在第1章,我们说子程序允许我们分别地写程序各部分,然后将各部分汇集成最终的形式。在C++中,所

有子程序都被称为函数,一个C++程序由一个或多个函数汇集而成。

每个C++程序必须有一个名为main的函数。程序总是从main函数开始执行。当main希望Square函数

完成一项工作,那么main调用Square函数,当Square函数执行完它的语句后,Square自然返回控制到

main,这样main能够继续执行。

让我们看一个有3个函数(wain,Square和Cube)的简单C++程序。暂不要关心程序详细内容,只是大致

观察程序的形式和结构。

#include<iostream>

usingnamespacestd;

intSquare(int);

intCube(int);

intmain()

(

cout«”Thesquareof27is"«Square(27)«endl;

cout«”andthecubeof27is"«Gube(27)«endl;

return0;

}

intSquare(intn)

(

returnn*n;

intGube(intn)

returnn*n*n;

}

三个函数中的每一个函数的左花括号和右花括号分别标志着语句执行的开始和结束。出现在花括号中间

的语句被称为函数体。

程序执行总是从main函数的第一条语句开始,在我们的程序中,第一条语句是

cout«”Thesquareof27is"«Square(27)«endl;

这是一条引起信息在计算机屏幕上打印出来的输出语句。

因此,执行这个程序完整的输出结果是:

Thesquareof27is729

andthecubeof27is19683

Square和Cube都是带回返回值函数的例子,•个带回返回值的函数返回•个值给它的主调函数。在

Square函数的第一行"intSquare(intn)”开始的单词int表示函数返回一个整型值。

你看到main函数的第一行是:

intmain()

单词int指示了main是一个应该返回一个整数的带回返回值的函数,main确实要返回值,在屏幕打印

出27的平方和立方后,main执行语句

return0;

返回值0到它的主调者,但是谁是main函数的主调者?回答是:计算机的操作系统。

当main结束执行时,操作系统希望main返回•个值(退出状态),习惯上,返回。值意味着所有运行

正常。任何其它的返回值(典型的有1,2,­•­)意味着出现了某些错误。

2.1C++程序的元素

语法和语义

编程语言是•组用于构造•个程序的规则、符号和特殊字。规则既有语法也有语义的规则。

语法:在编程语言中,控制如何书写有效指令的正式规则。

在编程语言中,语法是是一组正式的,确切定义了字母、数字和符号结合在一起被使用的规则。

语义:编程语言中,决定指令的含义的的规则。

语法模板

一个语法模板是定义C++结构的通用例子。图形方便显示了哪些是可选择的,哪些能够被重复。在C++

语言中,有黑影的字是字面上的字或字符,无黑影的字能够由其它模板重复。花括号被用来指示项目列表,

从项目列表中选择一项。

让我们来看一个例子,这个模板定义了C++中的标识符。

阴影部分指示了定义部分是可选的。三个点(...)意味着前导符号或阴影块能够被重复。然而,C++中

的•个标识符必须用字母或下划线开始,接着后面的•个或多个字母、下划线或数字是可选的。

这些是用于字母和数字的模板:

字母数字

A〜Za〜z0〜9

现在让我们来看看C++中主函数main的语法模板:

main函数用int开始,接着单词main,然后是左右括号。函数的第一行是起首部分,在起首部分后,

左花括号标记着函数语句(函数体)的开始。阴影和三个点(注:本网页只有两个点)指示了函数体由零个或

多个语句组成。最后右花括号指示了函数的结束。

最短的C++程序是:

intmain()

return0;

}

为程序的元素命名:标识符

C++中,标识符被用来为某事命名一一例如为像子程序这样的程序命名,并将程序存储在计算机的存储器

中。标识符由字母(A-Z,a-z),数字(0-9),和下划线(一)组成,但是必须用字母或下划线开始。

标识符与函数和数据对象联系在一起,使用标识符就涉及到函数或数据。

(在某些C++系统中,用下划线开始的标识符有特殊的意义,所以最好用字母开始一个标识符。)

这里是一些有效标识符的例子:

sum_of_squaresJ9box_22AGetDataBin3D4count

下面是一些无效标识符的例子以及为什么它们是无效的原因:

表中最后的标识符int是一个保留字的例子。

C++中,保留字有特殊的用途,你不能像编程者定义标识符那样使用它。附录A列出C++中所有的保留字。

保留字:C++中有特殊意义的单词,它不能像编程者定义标识符那样被使用。

使用有意义、可读性好的标识符

C++是一种敏感的语言。大写字母与小写字母是不同的。标识符:

PRINTTOPPORTIONprinttopportionRiNtToPpOrTiOnPrintTopPortion

是四种有区别的名字,无论如何不能交换。正如你看到的,这些形式中的最后一个标识符是最容易读的。

在本书中,我们使用大写字母、小写字母和下划线组合在•起的标识符。

数据和数据类型

数据被存储在计算机的存储器中,每个存储器的位置有唯•的地址,我们用这个地址存储和取出数据。

在机器语言代码中,存储器的每个位置的实际地址是一个二进制数。C++中,我们使用标识符来命名存储

器的位置;然后编译器为我们将标识符转换成二进制。这是高级编程语言的有点之':它避免我们与存储

器位置的数字地址:(在这个地址中,我们存储数据和指令)接触。

数据类型:—组特殊的数据值及在这组数据值上的操作。

在C++中,每片数据必须具有指定的数据类型,数据类型决定了数据在计算机中如何被表示以及计算机

能够在数据上处理的种类。

一些类型的数据被如此频繁的使用,所有C++为我们定义了它们。这些标准类型的例子是int(用于整数)、

float(用于具有小数的实数)和char(用于字符数据)。

此外,C++允许编程者定义自己的数据类型(用户定义的类型)。

在本章中,我们集中在两种数据类型一一一种是用来描述只有•个字符组成的数据,另种是用来描述

字符串的数据。

char数据类型:标准类型char描述由•个字母数字字符(一个字母、•个数字或•个特殊符号)组成的

数据:

'A,匕,'8''2''+'''$''?''*'''

注意每个字符用单引号括起来,也就是说,C++编译器需要引号来区分字符'8'和整数值8,因为两种

数据在计算机内存储是不同的。注意空格,'',也是有效的字符。

string数据类型:鉴于类型char的值被限定为一个字符,因此string是一系列字符。像用双引号括起

来的一个单词、名字或句子。例如,下面是C++中的字符串:

“ProblemSolving""C++""Programmingand""

一个串必须完整的打印在一行上,例如,下面串

“Thisstringisinvalidbecauseit

istypedonmorethanoneline."

是无效的,因为它分裂成了两行。

引号不属于串的部分,而只是简单用于把串与C++程序的其它部分区分开来。

一个不包含字符的串被称为空串。我们使用两个双引号来写空串,双引号中间不包含任何字符(甚至不包

含空格):

空串不等于空格串;空串是不包含字符的特殊串。

2.1C++程序的元素

为元素命名:声明

标识符既可以被用于命名常量也可以命名变量。换句话说,标识符可以是内容不允许改变的存储器位置

的名字或是内容可以改变的存储器位置的名字。

我们如何告诉计算机标识符表示的是什么?我们使用声明来命名一个标识符以及它表示的是什么。例如,

声明

intempNum;

通告empNum是•个内容是类型int的变量名。当我们声明•个变量时,编译器为我们挑出存储器中的一

个位置与标识符联系起来,并自动地与它保持联系。

声明:将标识符与个数据对象、•个函数或种数据类型联系起来的•条语句,以便程序员用名字来

涉及那些项目。

在C++中,每个标识符只可以表示刑事情,你使用在程序中的每个标识符必须与所有其它的标识符不同。

常量和变量统称为数据对象。程序中,数据对象和实际指令都存储在各个存储器位置中。

在C++中,每个标识符在它被使用之前,你必须声明它。这样允许编译器验证标识符的使用与它声明的是

否是一致的。

C++中每种数据对象、函数或数据类型有不同的声明语句。

变量:当程序执行时,不同的变量在不同的时间也许被存储在同一存储器位置中,这种存储器位置被称

为变量,并且它的内容是变量值。与存储器位置相联的符号名字是变量名或变量标识符(见图27)。

图2-1变量

声明变量意味着具体指出它的名字和它的数据类型。这告诉编译器将名字与存储器位置联系在一起,存

储器的内容具有具体的类型(例如,字符型char或字符串型string),卜.列语句声明myChar是一个类型

char的变量:

charmyChar:

一个声明语句总是以分号结尾。

在一条语句中声明几个变量是可以的:

charletter,middlelnitial,ch;

这里,三个变量都声明是char变量。尽管这样,我们还是偏爱用分开的语句声明每一个变量:

charletter;

charmiddlelnitial;

charch;

当修改程序、增加新变量到行中或删除你不再想要的项时、这种形式更容易。

用分开的语句声明每个变量也允许你附加注释到每个声明语句的右边,如下面这样:

floatpayRate;//雇员支付比例

floathours;〃工作小时

floatwages;//应得薪水

floattotal;//总的公司薪资总额

intempNum;//雇员ID号

这些声明告诉编译器为四个float变量payRate、hours、wages、total和,个int变量empNum预

留存储器空间。注释(写在〃后面的每行单词)为读程序者解释每个变量表示什么。

现在我们已看到C++中如何声明变量,让我们再看看如何声明常量。

所有单个字符(用单引号括起来)和串(用双引号括起来)是常量。

‘A'''Howdyboys""Pleaseenteranemployeenumber:“

常量是它的值决不能改变的一些数,当我们在程序中使用一个实际的常量值时,我们使用的是字面常量。

字面常量:写在程序中的任何常量。

名字常量(符号常量):涉及到一个标识符的存储器位置,这个存储器包含了不能改变的数据。

这里,我们看一些常量声明的一些例子。注意声明以保留字const开始,并且等号出现在标识符和字面

常量之间。

conststringSTARS=〃********〃;

constcharBLANK='';

conststringB00K_TITLE=^ProgramminginC++”;

conststringMESSAGE="Errorcondition”;

正如我们上面所做的,许多C++编程者都大写名字常量的整个标识符并且用下划线分开英语单词。这种

方法让读者迅速区别出现在程序中的变量名和常量名。

本书中我们使用标识符的习惯如下:

•对于变量,我们以小写字母开始,每个后续单词以大写字母开始

lengthlnYardsmiddlelnitialhours

•编程者写的函数和编程者写的数据类型,每个后续单词以大写字母开始,但是开始用大写字母开始。

GalcPay(payRate,hours,wages)Cube(27)MyDataType

•对于名字常量,每个字母用大写并且用下划线分开英语单词。

BOOK_TITLEOVERTIME\1AX_LENGTH

2.1C++程序的元素

执行语句

赋值:变量的值能够通过赋值语句被设置或改变。例如:

lastName="Lincoln”;

赋申值"Lincoln”到变量lastName中。

这是赋值语句的语法模板:

赋值语句:存储一个表达式的值到一个变量中,任何预先设置在变量中的值被破坏并且被表达式的值所

代替。

仅能有一个变量能放在一个赋值语句的左边,一个赋值语句与一个数学等式(x+y=z+4)是不同的。

给出声明:

stringfirstName;

stringmiddleName;

stringlastName;

stringtitle;

charmiddlelnitial;

charletter;

下列赋值是有效的:

firstName-"Abraham”;

middleName=firstName;

middleName=;

lastName="Lincoln”;

title="President”;

middlelnitial;,,;

letter=middlelnitial;

无效赋值语句原因middlelnitial.=〃A;middlelnitial具有字符类型:而"A."是串。letter=

firstName;letter具有字符类型;具有串类型。firstName=Thomas;Thomas是一个没有声明的标识

符。"Edison"=lastName;只有变量才能出现在赋值号“="的左边。lastName=;赋值号右边的表达

式丢失。

可是,这些赋值是无效的:

表达式:由标识符、字面常量和运算符排列的能求出一个给定类型值的式子。

串表达式:虽然我们不能在串上实现算术运算,但串数据类型提供了•个特殊的使用“+”运算符的被

称为连接的串操作,

两个串连接的结果是•个包含两个串中字符的新串。例如,给出语句:

stringbookTitle;

stringphrase1;

stringphrase2;

phrase1="Programmingand”;

phrase2="ProblemSolving”;

我们能够写出:

bookTitle=phrase1+phrase2;

这个语句从存储器中取出phrasel的值,并且连接phrase2形成•个新的、暂时的包含字符“Programming

andProblemSolving〃的串。然后这个暂时的串赋给(存储到)bookTitle。

如果我们取代用下式:

bookTitle=phrase2+phrase1;

那么bookTitle的内容为:

,zProblemSo1vingProgrammingand〃

名字串常量、字面串和字符数据及串变量的连接,仅有的限制是,用“+”连接符连接的操作数之一至

少必须有一个是串变量和名字常量(所以你不能使用像这样的表达式:〃Hi〃+“there"Or'A'+'B')。

例如,如果我们已经声明了下面的常量:

conststringW0RD1=Programming^;

conststringW0RD3="Solving”;

conststringMORD5=〃C++〃;

那么我们能够写出下列赋值语句:

bookTitle='P'+MORdl+〃andProblem"+MORD3+,zwith"+WORD5;

结果,bookTitle包含串:

z,ProgrammingandProblemSolvingwithC++〃

假如bookTitle已经包含"ProgrammingandProblemSolving”,并且我们希望得到标题,我们能够

使用形如下式的一条语句:

bookTitle二bookTitle+〃withC++”;

记住连接只能用串类型变量。甚至是对操作数用算术加运算符,我们也不能将像int和float这样的数

字数据类型值与串连接。

输出:在C++中,我们使用一个特殊变量名cout与插入运算符(<<)一道来写出变量和表达式的值:

cout«”Hello";

这个语句在标准输出设备(通常是显示器)上显示字符Helloo

变量cout被预先在C++系统中定义来指示输出流。你能够认为一个输出流就像一系列无休止的字符送往

输出设备。在有COUI场合,输出流就送往标准输出设备。

插入运算符«(常发音为"putto")要两个操作数。它的左边操作数是一个流表达式(最简单的场合,只

有一个如cout这样的流变量),它的右边操作数是一个表达式,这个表达式可以是一个字面串这样的简单

表达式:

cout«”Thetitleis〃;

cout«bookTitie+2ndEdition”;

插入运算符将右边的操作数转换成一系列字符并把它们插入到输出流中。注意《的指向,数据是将写在

右边的表达式送往“〈心左边的输出流。

在一条输出语句中,你能够使用<<运算符多次,每添加下一个数据项到输出流,“<<”就出现一次。例

如,我们能够将前面写的两条输出语句写为:

cout«”Thetitleis〃«bookTitie+”.2ndEdition”;

如果bookTitle包含“AmericanHistory*,那么两种方法产生相同的结果:

ThetitleisAmericanHistory.2ndEdition

下列是输出语句产生的输出显示,这些例子假设字符变量ch包含'2',串变量firstName包含〃Marie",

并且串变量lastName包含“Curie".

如果你想打印出包含双引号的•个串,你必须打入反斜杠和双引号,它们中间没有空格。例如,打印字

符:

Al"Butch"Jones

输出语句像如下这样:

cout<<〃A1\"Butch\"Jones”;

通常,一个接一个的输出语句引起输出连续显示在同一行上。序列语句:

cout«"Hi";

cout«”there”;

写出下列串在同•行屏幕上:

Hithere

要打印两个单词分别在两行上,我们可以这样写:

cout«"Hi"«endl;

cout«”there"«endl;

这些语句输出是:

Hi

there

标识符endl(意思是〃endline")是•个特殊的被称为控制符的C++特性。endl让你结束•个输出行并

且继续到下一行。

在程序中增加注释

所有你需要执行的程序是由声明和执行语句正确的结合在一起的。编译器忽略注释,但注释极大地帮助

了那些必须读程序的人们。注释可以出现在除标识符、保留字或字面常量中间以外的任何程序中的地方。

C++注释以两种形式出现。第一种是用一对/**/括起来的任何序列字符,编译器忽略一对/**/内的任何字

符。这里是一个例子:

stringidNumber;/*Identificationnumberoftheaircraft*/

第二种更普遍,用两个斜杠(//)开始并延续到那行程序的结尾:

stringidNumber;//Identificationnumberoftheaircraft

编译器忽略两斜杠后面的任何字符。

充分的注释程序是好的编程风格。一个注释因该出现在程序的开始来解释程序做什么。

另一个好的注释地方是在常量和声明中,那里的注释解释每个标识符被用来做什么。此外,在一个长的程

序中,注释应该引导每个主要步骤并解释那些不常出现或难读懂的程序步骤。

2.2程序结构

我们已经看过了C++程序的基本元素:标识符、声明、变量、常量、表达式、语句和注释。现在让我们来

看看这些元素如何集成为•个程序。正如早些时候看到的那样,C++程序由函数组成,其中之•必须是名为

main的函数。一个程序也可以有位于任何函数外的声明。程序模板见如下:

•个函数的定义由函数头和左右花括号限定的函数体组成:

这里是•个只有main函数的程序例子:

//PrintName程序

//这个程序用两种不同的形式打印一个人名

^include<iostream>

#include<string>

usingnamespacestd;

conststringFIRST="Herman”;//人名的名

conststringLAST="Smith”;//人名的姓

constcharMIDDLE='G';〃中间名的首写字母

intmain()

(

stringfirstLast;//名字以"名一姓”格式

stringlastFirst;//名字以“姓一名”格式

firstLast=FIRST+〃〃+LAST;

cout«”Nameinfirst-lastformatis"«firstLast«endl;

lastFirst=LAST+〃,〃+FIRST+”,〃;

cout«”Nameinlast-first-initialformatis

cout«lastFirst«MIDDLE'«endl;

return0;

)

程序开始用注释解释程序做什么,注释后面紧跟着出现卜.列行:

^include<iostream>

^include<string>

usingnamespacestd;

include行指示C++系统将名为iostream和string的文件内容插入到我们的程序中。为了将输出值送

到像cout这样的流中,第一个文件包含了C++所需要的信息。第二个文件包含了有关程序员定义的数据类

型string的信息。

接下来是常量FIRST、LAST和MIDDLE的声明,注释解释了它们如何使用。剩下的程序是main函数的

定义,第一行是函数头:保留字ini、函数名、然后是开合圆括号(圆括号告诉编译器main是函数名,

不是变量或名字常量。)o函数体包含两个变量firstLast和lastFirst的声明,接着是一系列执行语句。

main函数以返回。作为函数值来结束函数。

块(复合语句)

函数体是一个块(或复合语句)的例子。这是块的语法模板:

一个块只是用一对花括号{}括起来的零条或多条语句序列。

这里是一个在本章讨论的限于C++语句的语句模板:

一条语句可以是空语句,空语句只是一个分号(;)。在执行时绝对不做任何事,只是开始着手下一条语

句,它不常使用。

我们常使用块,特别是用它作为其它语句的部分。删去一对花括号{)会引起戏剧性的改变含义及程序

的执行。这就是为什么我们总是在一个块内锯齿排列语句一一在一个长的、复杂的程序中,锯齿排列语句

使得块容易认出。块的语法模板显示在右花括号后没有分号。

按照语句的语法模板,一个声明正式地被认为是一条语句。因此一个声明可以出现在任何执行语句能够

出现的地方。如果我们希望的话,在一个块中我们可以将声明和执行语句混合在一起:

charch;

ch='A';

cout«ch;

stringstr;

str="Hello”;

cout«str;

虽然这样,编程者更普通的还是把声明语句组织在一起放在执行语句之前:

charch;

stringstr:

ch='A';

cout«ch;

str="Hello";

cout«str;

C++预处理器

预处理器概念是C++的基础,预处理器是一个程序,这个程序在编译阶段作为滤波器。你的源程序在先

通过预处理器再到编译器(见图2—2)。

用“#”符号开始的一行不被认为是一个C++语言语句(而且不用分号结尾),它被称为预处理指令。预

处理器展开include指令,具体地插入#include后面名字的文件到你的源程序中。出现在,个include指

令中名字的文件被称为头文件,头文件包含了程序所需的常量、变量、数据类型和函数的声明。

在指令:

#include<iostream>

#include<string>

中,需要尖括号<>。尖括号告诉预处理器在标准的包含指令中搜索文件,标准的包含指令位于计算机系统

中,计算机系统中包含了所有与C++标准库相关的头文件。文件iostream包含了灵活的输入、输出的声

明,并且文件string包含了有关串数据类型的声明。

介绍Namespaces

在我们的“HappyBirthday"程序中,即使我们增加预处理器指令格nclude〈iostream〉,程序也不会编译,

编译器仍不能识别标识符coutfilendlo问题在于头文件iostream声明它所有的标识符都在名为std的

namespace中:

namespacestd

(

:变量、数据类型等的声明

}

在namespace块内声明的标识符只能被那个块内的语句访问,为了能访问“隐藏”在namespace内的标

识符,编程者有几种方法可选择,这里我们描述两种选择。

第•个选择是为标识符使用•个有附带条件的名字,•个有附带条件的名字由namespace的名字,然后是::

运算符(范围决定运算符),再就是所希望的标识符组成:

std::cout

用这种方法,我们的程序看起来如下:

#include<iostream>

intmain()

(

std::cout«HappyBirthday”<<std::endl;

return0;

)

注意cout和endl必须被附带条件。

第二种选择是使用一条称为using指令的语句:

usingnamespacestd;

当我们安排这条语句在main函数之前的程序顶部附近时,我们就可以使std名字空间中的所有标识符

在我们的程序中可访问,而不需对标识符附加条件:

#include<iostream>

usingnamespacestd;

intmain()

(

cout<<"HappyBirthday”<<endl;

return0;

}

2.3关于输出

我们能控制输出的水平和垂直的空处(空白的地方),使得输出更合要求(更可理解)。让我们首先看看输

出的垂直空行。

产生空行

在输出语句中我们使用endl控制符来控制垂直空行。你已经看见了一系列输出语句持续写出字符在当

前行,直到endl才中断当前行(光标移到下一行)。这里是一些例子:

你认为下列语句会打印出什么?

cout«”Hithere,"«endl;

cout«endl;

cout«”LoisLane."«endl;

输出的结果是三行:

Hithere,

LoisLane.

记住,在C++程序中如何写一个输出语句有很大的灵活性,我们能够将前面三条语句结合成两条语句:

cout«”Hithere,"«endl«endl;

cout«”LoisLane."«endl;

事实上,我们能将三条语句写成一条语句,一种可能是:

cout«”Hithere,“«endl«endl«”LoisLane."«endl;

另一个可能是:

cout«”Hithere,〃«endl«endl;

«“LoisLane.«endl;

后面的例子显示了你能将•条C++语句扩展到程序的多行上,编译器处理条语句的结束,不是以物理

行作为结束,而是以分号作为语句的结束。

在一行内插入空格

为了控制输出的水平空白处,一种技巧是送一个空格字符到输出流中(记住,在C++中由键盘上按空格

键产生的空格字符是完全有效的字符)

例如,为了产生下列这个输出:

你可以使用这些语句:

cout<<〃*********"<<endl<<endl;

cout<<"**********”<<endl<<endl;

cout<<〃*********〃<<endl;

所有的空格和星号都用双引号括起来,这样真实打印出来的与程序中写的是一样的。多加的endl控制

符在星号行之间产生空行。

如果你想打印出空格,你必须用引号括起它们,语句:

cout«'*'«'*';

产生输出为;

**

尽管我们已经把所有空格都包含在输出语句中了,但是星号还是接着打印,这是因为空格没有被引号括

起来。

第三章数字数据类型、表达式和输出

目标

•能够声明ini和float类型的名字常量和变量

•能够建立和求简单算术表达式的值

•能够建立和求包含复合算术操作的表达式的值

・理解隐含类型的强制转换和显式类型的转换

・能够调用一个带回返回值的函数

•能够识别和理解函数自变量的用途

•能够在表达式中使用C++库函数

・能够调用空函数(不带回返回值的函数)

•能够使用C++控制符来格式化输出

•学习和能够使用与string类型有关的附加操作

•能够在程序中以清楚、可读性好的风格格式化语句

3.1C++数据类型的概述

C++标准数据类型是由简单类型,构造类型和地址类型组成(见图3T),这章集中在整型和实型,其

它类型在书的后续部分详细介绍,首先我们看看整型(这种类型主要描述整数),然后再考虑实型(用来

描述包含十进制小数的实数)

3.2数字数据类型

整型

数据类型char,short,ini和long被认为是整型,因为它们都涉及到整数值一整个数没有小数部

分,例如:

221649804600-378-912

除非是当你明确将保留字unsigned加到数字类型名前:

unsignedint

unsigned整型值只能被确定为正数或零。

数据类型char,short,int和long是要描述占用不同字节的大小的整数,对于特定的机器,我们可

以用下列这种方式画出它们占用的字节大小。

int值的范围是从一32768到+32767。如果你的程序试图计算大于你计算机取值范围的最大值,那么会

产生整数溢出。

C++中有关整型值有一点要小心:一个以零开始的字面常量是用八进制数取代十进制数,如果你写数为:

015

C++编译器取这个值为十进制13。

浮点类型(实数类型)

浮点类型被用来表示实数。浮点数有一个整数部分和小数部分,整数和小数中间有一个小数点,这里是

一些例子:

18.0127.540.574.193145.8523.8

正如C++中整型类型(char,short,int和long)有不同的字节大小一样,浮点类型也有不同的字节大

小。浮点类型的字节大小由小到大依次为float,double和longdouble。较大的字节类型数可能给我们

更宽的取值范围并且更精确,但损失更多的存储空间来保存数据。

浮点值也能有一个指数形式,称为科学标记法。3.504*1012在C++中我们用3.504E12代替,E意味着

是以10为基数的指数,这里是一些用科学标记法表示的浮点数的例子:

1.74536E-123.652442E47E20

个人计算机提供了6位或7位数字精度的浮点值,最大值约3.4E+38。

计算机不是总能确切地表示浮点数,在第一章,你了解到计算机以:进制形式存储所有数据,许多浮点

值只能用二进制数近似表示,如果你的系统打印数字4.8为4.7999998不用惊奇。在大多数场合,最右边

的分数值有稍微的不精确是可以预料的,这不是编程者的错误。

3.3数字类型的声明

名字常量的声明

在名字常量声明中,声明中的字面常量是数字,而不需像字符那样用单引号或双引号括起来,例如:

constfloatPI=3.14159;

constfloatE=2.71828;

constintMAXSCORE=100;

constintMINSCORE=-100;

constcharLETTER='W';

conststringNAME="Elizabeth”;

虽然字符和串耍放在引号内,但字面整数和浮点数不要,因为它们没有机会与标识符混淆工

变量声明

下列是有效的声明:

intstudentCount;//学生数

intsumOfScores;//他们成绩的总和

floataverage;//平均成绩

chargrade;//学生的成绩等级

stringstuName;//学生名

给出声明

intnum;intalpha;

floatrate;

charch;

下列是合适的赋值语句:

变量表达式

alpha=2856;

rate=0.36;

ch='B';

num=alpha;

这些赋值语句中的每条语句,表达式的数据类型都与被赋值的变量的数据类型相匹配。

3.4简单算术表达式

算术运算符

表达式由常量、变量和运算符组成,卜.列都是有效的表达式:

alpha+2rate-6.04-alpharatealpha*num

在表达式中允许使用的运算符取决于表达式中常量和变量的数据类型,算术运算符有:

+单目正号

-单日负号

+加号

-减号

*乘号

/浮点除(结果为浮点)

整数除(结果没有小数部分)

%模(整数除后取余数)

单目运算符只有一个操作数的运算符,例如:+259.65-54-rate。

双目运算符有两个操作数的运算符,例如:23+67。

注意模运算%只能用于整型数据。当你用•个整数除以另•个整数时,你得到•个整数商和•个整数余

数,整数除只给出整数商,模运算%只给出余数(如果操作数是负数,不同的编译器得到的余数符号也许不

同)

6/2——>3

6%2——>0

7/2——>3

7%2——>1

与整数除相对比,浮点除产生一个浮点结果,表达式

7.0/2.0

产生值为:3.5。

这里是一些使用算术运算符的表达式及表达式的值:

表达式表达式的值

3+69

3.4-6.1-2.7

2*36

8/24

8.0/2.04.0

8/81

8/90

8/71

8%80

8%98

8%71

0%70

5%2.3错误(两个操作数必须是整数)

除和模运算要仔细,表达式7.0/0.0,7/0,和7%0都产生出错,计算机不能进行除零运算。

由于表达式中允许有变量,下列是有效的赋值:

alpha=num+6;num=alpha*2;alpha=alpha+1;

alpha=num/2;num=6%alpha;num=num+alpha;

我们所看到的赋值语句包含了成串的表达式,同•变量可以出现在赋值运算符的两边,在这种情况下

num=num+alpha;

num中的值和alpha中的值加在,起,然后两个值的和被存回到num中,取代num原来的值。

这里是一个使用算术表达式的简单程序:

//冰点沸点程序

//这个程序计算水的冰点和沸点之间的中间值

#include<iostream>

usingnamespacestd;

constfloatFREEZE_PT=32.0;//水的冰点

constfloatBOIL_PT=212.0;//水的沸点

intmain()

(

floatavgTemp;//保存FREEZE_PT和B0IL_PT平均的结果

cout«”Waterfreezesat〃<<FREEZEPT<<endl;

cout«”andboilsat"<<BOIL_PT«"degrees.«endl;

avgTemp=FREEZE_PT+BOILPT;

avgTemp=avgTemp/2.0;

cout<<"Halfwaybetweenis

cout«avgTemp«〃degrees."«endl;

return0;

)

程序以注释开始解释程序做什么,接卜.来是声明部分,在声明部分我们定义了常量FREEZE_PT和

BOIL.PTo

main函数体包含了一个变量avgTemp的声明和一系列执行语句。这些语句打印出一个信息、将

FREEZE_PT与B0IL_PT相加用2除它们的和,最后打印出结果。

自增和自减运算符

除算术运算符外,C++还提供了自增和自减运算符:

++自增

-自减

这些是单目运算符,取一个变量名作为操作数。对于整型和浮点操作数效果都是加1(或减1)到操作数

上,如果num当前包含的值是8,那么语句

num++;

引起num包含9o写赋值语句

num=num+1;

你能得到同样的效果。

++和--运算符既可以作为前缀运算符

++num;

也可以作为后缀运算符

num++;

这两种语句的行为是完全一样的。

C++允许在—"b大的表达式中间使用++和--:

alpha=num++*3;

在这种场合,++的前缀形式和后缀形式给出的结果是不一样的。

3.5复合算术运算符

现在我们来看看由几种运算符和包含混合数据类型的更复杂的表达式。

优先权规则

算术表达式能够由许多常量、变量、运算符和括号组成,那么操作执行的次序是怎样的呢?例如,在赋

值语句中

avgTemp=FREEZE_PT+B0IL_PT/2.0;

是FREEZE...PT+BOILfT首先被计算呢还是B0IL_PT/2.0首先被计算?

基本的算术运算符的运算顺序与数学的运算符顺序是一样的,按照优先权规则:

最高优先级:单目+单目-

中等优先级:*/%

最低优先级:+-

在上面的表达式例子中隐含着用括号一样:

FREEZE_PT+(BOIL_PT/2.0)

即,我们首先用2除B0ILPT然后加FREEZE_PT得到结果。

你能够使用括号改变求值的次序,在语句

avgTemp=(FREEZE_PT+BOIL_PT)/2.0;

中FREEZE_PT和•首先被加,然后它们的和再除以2。我们首先求括号内的子表达式的值,然后接

下来再按运算符的优先权规则求值。

当一个算术表达式有几个具有同样优先权的双目运算符时.,它们的结合次序是从左到右。表达式

inti-int2+int3

意味着(inll-int2)+int3,不是inti-(int2+int3)0另一个例子,我们使用表达式

(floatl+float2)/floatl*3.0

首先求括号内的表达式的值,然后将得到的和除以门。放1再乘以3.0。卜.面是更多的一些例子。

表达式值

10/2*315

10%3-4/2-1

5.0*2.0/4.0*2.05.0

5.0*2.0/(4.0*2.0)1.25

5.0+2.0/(4.0*2.0)5.25

在C++中,所有的单目运算符都有从右到左的结合性,例如,-+x意味着-(+x)而不是意味着(-+)

Xo

类型的强制和类型的转换

整型值和浮点值被不同的存储在计算机存储器内,如果在一条赋值语句或算术表达式中我们将整数和浮

点值混合在•起会发生什么情况?让我们首先看看赋值语句。

赋值语句如果你做如下声明

intsomelnt;

floatsomeFloat;

值语句

someFloat=12;

似乎会存储整型值12到someFloat中,但是不是这样。计算机拒绝存储任何其它除浮点值外的值到

someFloat中。编译器会插入额外的机器语言指令,首先将12转换为12.0然后再将12.0存储到someFloat

中。

这个隐含的(自动的)从一种数据类型的值转换为另一种数据类型的值的转换被称为类型强制。

语句

somelnt=4.8;

同样引起类型的强制。当浮点值被赋给int变量时,小数部分被截去,因此somelnt被赋值为4。

如果我们避免混合数据类型,对一些读程序的人来说,程序就不会出现上而两种赋值语句的混淆的情况。

someFloat=12.0;

somelnt=4;

类型转换是从•种数据类型值转换为另种类型值的显式转换。

为了使我们的程序尽可能的清楚,我们可以使用显式类型转换。一个C++类型转换操作由数据类型名然

后是用括号括起来的表达式:

someFloat=float(3somelnt+2);

somelnt=int(5.2/someFloat-anotherFloat);

两种语句

somelnt=someFloat+8.2;

somelnt=int(someFloat+8.2);

产生同样的结果。

注意,在将浮点值存储到一个int变量之前,有一种进行四舍五入而不是截去小数的好方法,下面给出

了如何做:

somelnt=int(someFloat+0.5);

当someFloat包含4.7时,什么值存储到somelnt中,再试一次,假如someFloat包含4.2,什么值存

储到somelnl中。(这是假设someFloat是一个正数,用加0.5来四舍五入的技术)

在表达式中也可能有混合的数据类型:

somelntsomeFloat

4.8+somelnt-3

这样的表达式被称为混合类型表达式。

无论什么时候,一个整型值和一个浮点值用运算符连接在一起,就隐含着类型强制的出现。

让我们检测计算机如何求表达式4.8+somelnt-3的值,这里somelnt包含值为2。首先,+运算

符的操作数有混合类型,所以somelnt被强制为2.0(这种转换只是暂时的,它不影响存储在somelnt内

的值)。进行加运算后,产生值6.8。接下来减(一)运算符连接一个浮点值(6.8)和一个整型值(3),值3

被强制为3.0,进行减运算,结果是浮点值3.8。

像赋值语句一样,在表达式内你可以使用显式类型转换来减少错误。写表达式如下:

float(somelnt)someFloat

4.8+float(somelnt-3)

这样使你的意图是什么更清楚。

显式类型转换不仅对程序的清晰是有价值的,而且在某些场合用于纠正编程也是必须的。给出声明

intsum;

intcount;

floataverage;

假设sum和count当前包含的值分别为60和80,如果sum表示一组整数值的和并且count表示整数值

的数目,让我们求出平均值average:

average=sum/count;//错误

这条语句存储值0.0到average中。除运算符/的两个操作数都是整型int,所以执行整数除,60除

以80产生结果为整数值0,接着在存储。到average之前,计算机隐含着强制类型转换将0转换为0.0。

正确求取平均值average,以及使其更清楚的方法是:

average=float(sum)/float(count);

这条语句给我们用浮点除替代整数除,结果是值0.75被存储到average中。

3.6函数调用和库函数

带回返回值的函数

带回返回值的函数:-个函数只返回•个值给它的主

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论