C++语言程序设计(第3版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-15 21:45:31

点击下载

作者:吕凤翥

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

C++语言程序设计(第3版)

C++语言程序设计(第3版)试读:

前言

本书作者长期从事C语言和C++语言程序设计课程的教学工作。本书是作者在总结多年来讲授C语言和C++语言的经验基础上,根据讲稿整理编写的。书中突出C++语言的重点,对其重点内容都进行了反复讲解;根据教学中学生所提出的难点,本书进行了详细讲解,并列举了实例;书中各章节中请读者回答的一些问题,多是教学中遇到的疑点。因此,突出重点、详解难点和提出疑点是本书的第一个特点。

本书的第二个特点是语言简明、概念准确、例题丰富。以通俗易懂的语言讲述C++语言的基础知识、基本规则和编程方法,以丰富的例题讲解操作方法和验证语法规则,读者可以模仿例题的程序去编写形式相似的程序和去解决内容相仿的问题。本书中例题较多,但重复性较小。每个例题都针对一种规则或一种操作,读者可以从每一个例题中学到一种方法。

本书的第三个特点是每章后边都备有较多的练习题,适合作为教材和自学参考书。每章后面的练习题内容全面,形式多样,有问答题、选择题、判断题、分析程序输出结果题和编程题等。通过这些题目,读者可以及时地检查和考核对本章内容学习和掌握的情况,老师可以从中选出一些题目留为作业题。

本书不仅较为全面地讲述C语言的主要内容,也较为系统地讲述C++语言的基本内容。通过对本书的学习,读者可以掌握C语言和C++语言的基础知识和基本规则及编程方法。本书第1章讲述面向对象的概念,揭示C语言和C++语言的关系,指明C++语言是一种使用较广的面向对象的编程语言,给出C++程序的实现方法。另外,还讲述了C++语言的词法规则。第2~7章讲述的大多是C语言的内容,同时也是C++语言的基本内容,C++程序也是建立在这些基本内容的基础上的。这些内容包括变量和常量、运算符和表达式、各种语句、函数和存储类、指针和引用、结构和联合等,在讲述过程中指出C语言与C++语言的不同。第8~12章较系统地讲述C++语言中面向对象的主要特征:封装性(类和对象)、继承性(基类和派生类)、多态性(重载和虚函数)、I/O流库及操作。这些都是C++的核心内容,从中体现C++语言面向对象的特点,这也是C++语言的重点内容。

本书中的C语言部分,对于学过C语言的读者是一个很好的复习机会,从中可以搞清楚C语言和C++语言的区别;对于没有学过C语言的读者可以通过学习这部分内容,掌握C语言这个编程工具。C++语言是以C语言为基础的,掌握了C语言对学习C++语言是会有帮助的。

本书第2版出版后,作者又经过了一段时间的教学实践和听取了部分读者反映的意见,在这次修订保持对原书章节不做较大改变的前提下,对部分内容进行了如下修改。

1.考虑到讲授学时较少,更好地突出重点内容,删除第12章模板内容。读者需要时可参看其他C++参考书。

2.删去了原书中第9、10章中的应用实例章节。在实际教学中,由于学时有限,应用实例只作为自学内容。

3.进一步改正了原书中出现的个别错误,在概念描述方面更加精练和准确。

本书适合作为高等院校学生的教材,也可作为教师和学生的参考书,以及广大电脑爱好者自学C++语言的指导书。

本书承蒙广大读者的关心和支持,许多读者为本书提出了宝贵的意见和建议,作者在此表示最衷心的感谢,并诚恳希望读者们继续关注本书,欢迎提供宝贵意见。

作者第1章 C++语言概述

C++是一种面向对象的程序设计语言,它是在C语言基础上发展起来的。虽然它不是最早的面向对象的程序设计语言,但是它是目前使用较广泛的面向对象的程序设计语言。

本章主要讲述C++语言编程特点,包括C++语言与C语言的关系,C++语言的词法规则及C++语言程序的实现。在讲述C++语言之前,介绍一个与C++语言有关的重要概念——面向对象,包括什么是面向对象,面向对象语言的特点等。通过对面向对象概念的学习和理解,可以进一步了解C++语言的特点及其应用。1.1 面向对象语言简介

本节主要讲述在计算机出现后,编程语言的发展历史。从这段历史中不难看出,面向对象语言的出现是人们对客观事物认识的不断发展的需要。因此,面向对象语言的出现是必然的。本节首先介绍面向对象这一概念。1.1.1 面向对象的概念

什么是面向对象?简单地说,它和面向过程一样都是软件开发的一种方法。但是它与面向过程不同,面向对象是一种运用对象、类、继承、封装、包含、消息传递、多态性等概念来构造系统的软件开发方法。这里提出了一些新的概念,这些新的概念描述了面向对象的特点。

下面从解释这些概念中给出面向对象的特点,进而对面向对象这种方法有所了解和认识。(1)对象是软件系统的基本构成单位

分析问题的出发点是对象。对象是对待解决问题(问题域)中的客观事物的抽象表示,它是面向对象程序的基本要素。(2)对象的属性和服务结合为一个独立的实体

对象的属性是表示客观事物的静态特性,一般用数据来表达;对象的服务是描述客观事物的动态特性,即事物的行为,一般用函数或称方法来表达。对象的属性与服务结合为一个独立的实体,称为封装体,对外屏蔽其内部的部分特性。(3)类是对某些对象的抽象描述

类是具有相同属性和服务的若干对象的集合。类为该类的所有对象提供一种统一的抽象描述。一个类中包含属性和服务两部分。实际上,类是一种类型,这种类型是自定义的,而对象是某个类的一个实例。(4)派生类继承基类中的属性和服务

在不同的层次上运用抽象的原则,可以获得基类和它的派生类。派生类继承基类中的属性和服务,通过类间的继承关系可以简化系统的构造过程和文档,实现共享。例如,根据世界上存在的各种各样的汽车,可以将它们的共性抽象为一个汽车类,再将各种各样的轿车的共性抽象为一个轿车类。显然,轿车类应该是汽车基类的派生类,因为轿车具有汽车的共性,另外还具有它自身的特性。我们说,轿车类继承了汽车类中的属性和服务。(5)复杂对象可由若干简单对象构成

复杂的事物常可以化解为若干简单的事物。同样,一个复杂的对象可以化解为简单对象的集合。例如,描述一架飞机,这是一个较为复杂的对象,但可以将它看成由机翼、机身、发动机和尾翼等部件组成。一架飞机看作一个复杂类的对象,这个复杂类由若干简单类的对象组成。这称为类的包含关系。(6)对象与对象之间使用消息进行通信

消息是向对象发出的服务请求,消息的发送者是一个要求提供服务的对象,而消息的接收者是一个能够提供服务的对象,通过消息传送实现对象之间的通信。(7)多态性是面向对象程序设计的重要支柱

多态性是指向不同对象发送同一消息,根据对象的类的不同而完成不同的行为。多态性通过继承的机制构造对象类的结果,由函数和运算符的重载及虚函数实现类的多态性。

以上是对面向对象这一概念的理解。下面通过一个例子形象地说明封装的概念。例如,街头上的早点小吃店,在一间小屋里或小亭子里,四周封闭,通过一个小窗口对外卖货。屋或亭内有油饼、豆浆等食品,另外,还具有制作上述部分食品的服务,如炸油饼、制作豆浆等,以及收钱找钱等服务。可以将小吃店看作一个封装体,这个被封装的“实体”对外服务只通过一个“窗口”,当买早点的人向它发出“买什么早点”、“买多少”的消息后,并将钱付给它,它就将所要的食品递出。把具有这类特点的服务统称为早点服务类,而某家小吃店看成为早点服务类的一个对象。

综上所述,面向对象这种方法具有三大特性:封装性、继承性和多态性。特别是前两大特性是不可缺少的。1.1.2 编程语言的发展

1.编程和编程语言

早期,人们认为编程工作包含认识事物和描述事物两项内容,认为编程就是对要解决的问题产生一个正确的认识,再用一种语言将它正确地描述出来。这样就把软件开发与编程看成是一回事了。从软件工程的角度上看,软件开发和编程是不同的。软件开发包含两项主要活动:一是人们对于要解决的问题的认识,二是对这种认识的描述。“认识”是指对要解决的问题进行周密的分析和全面的理解,并找出解决的方法;“描述”是指选用一种语言来描述对要解决问题的认识。可见,编程是在认识基础上进行的描述,编程时所选用的语言称为编程语言。因此,我们认为编程只是软件开发中的一项内容,而不是全部内容。

开发人员对于要解决的问题的认识又称为对问题域的认识。问题域是指要解决的问题的集合,或者指要解决的问题所涉及的业务范围。人们对于问题域的认识往往是用自然语言来描述的,而计算机所能识别的却是某种编程语言。于是在自然语言和编程语言之间存在一个过渡,或称为“鸿沟”。这个“鸿沟”形成的原因很简单,就是因为机器不能识别人们描述客观事物所用的自然语言,而机器能够识别(直接或间接)的编程语言又不符合人们习惯的思维方式。于是就形成了二者之间的鸿沟。鸿沟的存在耗费软件开发人员的许多精力,同时也是许多错误的发源地。

2.编程语言的发展史

编程语言的发展是从低级到高级的,具体过程如下。(1)机器语言。这是一种最原始的编程语言,这种语言是计算机可以直接识别的语言。这种语言使用0和1两种代码,编写出的程序难以理解和记忆,因为它远离人们习惯的思维方式。(2)汇编语言。这种语言使用助记符号来替代代码 0 和 1,是一种低级语言。它比机器语言稍有提高,符合人们的某些形象思维方式。它是低层次的抽象。计算机不能直接识别汇编语言,需要编译后才可识别。这种语言虽然效率较高,但是由于难以记忆,使用较少。(3)高级语言。这是一种采用命令或语句的语言,屏蔽了机器细节问题。它提高了语言的抽象层次,比汇编语言更加接近于人们的思维方式。这种语言人们容易理解和记忆,但它还与自然语言有较大差别。20世纪70年代,结构化程序设计语言的出现给编程带来了方便,使得自然语言与编程语言的鸿沟进一步缩短。(4)面向对象语言。面向对象语言是比面向过程语言更高级的一种高级语言。面向对象语言的出现改变了编程者的思维方式,使设计程序的出发点由着眼于问题域中的过程转向着眼于问题域中的对象及其相互关系。这种转变更加符合人们对客观事物的认识,因此,面向对象语言更接近于自然语言。面向对象语言是人们对于客观事物更高层次的抽象。

从编程语言发展的历史来看,编程语言由低级向高级发展,使得自然语言与编程语言之间的鸿沟越来越窄,这就意味着软件开发人员耗费的精力越来越少,软件产品的质量越来越高。

面向对象语言的出现是人们期待填平“鸿沟”的必然结果,面向对象的程序设计方法是软件开发的新的里程碑。1.1.3 面向对象语言的特点

使用面向对象的方法进行软件开发,需要用面向对象的语言进行编程。

面向对象的语言应该具有面向对象方法的特点。具体地讲,面向对象语言直接描述问题域中的对象及其相互关系。它从客观世界中所存在的事物出发,比较符合人们的思维方式。面向对象语言应具有如下特征。

① 客观世界是由一些具体事物组成的,每个事物都具有自身的静态特性和动态特性,这些被抽象出来的特性将分别由一组属性和一组服务来描述。这种事物便是面向对象语言中的对象。

② 客观世界的事物之间有共性,也有个性。按其共性可分为若干类。类是具有共性的若干事物的集合,它是面向对象语言中相对独立的程序单位,是对某些事物的统一抽象。类是面向对象语言中的一种类型,具有类类型的事物称为对象。

③ 在客观世界中,为了简化对事物的认识和描述,往往采用继承机制。当某个特殊类的对象拥有某个一般类的全部属性与服务时,称为特殊类继承了一般类。面向对象语言中的类具有继承的关系。

④ 在客观世界中,对复杂事物的处理往往是将它化为若干简单的事物。这就是说,在一个描述复杂事物的类中,可以包含若干描述简单事物的类的对象,称为嵌套关系。即一个类的成员可以是其他类的对象,即为子对象。

⑤ 客观世界的事物是一个独立的实体,在面向对象的方法中采用封装机制,屏蔽其内部的细节,只表现出它的外部特性或行为。事物与事物之间存在着一定的联系,通过消息来表示事物之间的联系。一个对象可以通过向另一个对象发送消息来获得其服务。面向对象的语言应具有实现上述机制的功能。

总之,面向对象语言是用来实现面向对象程序设计的一种高级语言。它包含面向对象方法中所要实现的功能。1.2 C语言与C++语言的关系

20世纪80年代初,美国AT&T贝尔实验室设计并实现了C++语言。C++语言对C语言有很大的改进,是C语言的扩展。它保持了C语言的简洁性和高效性,又克服了C语言中的一些不足,特别是引进了面向对象语言的要素,使得C++语言成为一种面向对象的程序设计语言。1.2.1 C++语言对C语言的改进

C++语言保留了C语言短小精简的风格,并对C语言的不足进行了改进。C++语言对C语言的改进表现如下。

① C++语言中增加了一些运算符,使其功能有所提高。例如,∷,new,delete,.*,->*等。

② C语言是一种弱类型语言,类型转换不够严格;而C++语言规定类型多采用强制转换,取消了对函数的默认类型,还规定函数必须用原型说明,改进了类型系统,提高了安全性。

③ 引进了引用的概念。使用引用作为函数参数,克服了使用指针带来的不便。

④ 允许函数重载,允许设置默认参数,还引进了内联函数的概念。这些措施减少了冗余性,提高了编程的灵活性和运行程序的效率。

⑤ 对变量的说明更加灵活,不受C语言中某些规定的限制。例如,在C语言程序的函数体或分程序内,必须说明语句在前,执行语句在后;在C++程序中,可以根据需要随时定义变量。1.2.2 C++语言对面向对象方法的支持

C++语言是一种面向对象的程序设计语言,它对面向对象的程序设计方法的支持如下。(1)支持数据封装

在C++语言中,类是支持数据封装的工具,对象是数据封装的实现。在封装中,还提供一种对数据访问的控制机制,使得一些数据被隐藏在封装体内,因此具有隐藏性。封装体与外界进行信息交换是通过操作接口进行的。这种访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。

私有成员(private)是在封装体内被隐藏的部分,只有在类体内说明的函数才可访问私有成员,而在类体外的函数是不能访问的;公有成员(public)是封装体与外部的一个接口,类体外面的函数可以访问公有成员;保护成员(protected)是只有该类的成员函数和该类的派生类可以访问的一种成员。(2)支持继承性

C++语言允许单继承和多继承。继承是面向对象语言的重要特性。一个类可以根据需要生成它的派生类,派生类还可以再生成派生类。派生类继承基类的成员,另外,它还可以定义自己的成员。继承是实现抽象和共享的一种机制。(3)支持多态性

C++语言支持多态性表现在:

① C++语言允许函数重载和运算符重载;

② C++语言通过定义虚函数来支持动态联编(动态联编是多态性的一个重要特征)。

C++语言所具有的上述特性是本书讲述的重点,详细内容参见相关章节。1.3 C++语言的词法和词法规则1.3.1 C++语言的字符集

C++语言的字符集与C语言的字符集相同。

C++语言的字符集由下列字符组成。

① 大小写英文字母

a~z和A~Z

② 数字字符

0~9

③ 其他字符

空格!#%^&*_(下划线)-+=~< >/\|.,:;?'"()[]{}1.3.2 单词及词法规则

单词是一种词法记号,它是由若干字符组成的具有一定意义的最小词法单元。

下面分别介绍C++语言的6种单词。

1.标识符

标识符是程序员用来命名程序中一些实体的一种单词。使用标识符可以定义函数名、类名、对象名、变量名、常量名、类型名和语句标号名等。C++语言规定,标识符是由大小写字母、数字字符和下划线组成的,并以字母或下划线开头的字符集合。

定义标识符应注意如下3点。

① 标识符中的大小写字母是有区别的。例如,ABC,Abc,abc,ABc等都是不同的标识符。

② 标识符的长度,即组成一个标识符的字符个数,是不受限制的。但是,有的编译系统所能识别的标识符长度是有限的,例如,有的系统只识别前32个字符。

③ 在实际应用中,尽量使用有意义的单词作标识符;但是,不得用系统中已预定义的关键字和设备字作为标识符。

2.关键字

关键字是系统中已预定义的单词,它们在程序中表达特定的含义。下面列举C++语言中常用的关键字:

以上关键字的含义将在本书中陆续讲述。

3.运算符

运算符是一些用来进行某种操作的单词,它实际上是系统预定义的函数名。这些函数作用于被操作的对象上,将获得一个结果值。运算符是由1个或多个字符组成的单词。

C++语言的运算符除包含C语言中的运算符外,还增加了一些新的运算符。

C++语言的运算符可以重载。

4.分隔符

分隔符被称为程序中的标点符号,它是用来分隔单词与程序正文的。它用来表示某个程序实体的结束和另一个程序实体的开始。

C++常用的分隔符包括以下4种。

① 空格符:用作单词之间的分隔符。

② 逗号:用作变量之间或对象之间的分隔符,或者用作函数的多个参数之间的分隔符。

③ 分号:用于for循环语句中,作为关键字for后面的括号内的三个表达式之间的分隔符。

④ 冒号:用作语句标号与语句间的分隔符,以及switch语句中case〈整数型表达式〉与语句序列之间的分隔符。

5.常量

C++语言中,常量分为数字常量、字符常量和字符串常量。程序中的常量经常用符号常量来表示。使用关键字const来定义各种不同类型的常量。

6.注释符

注释在程序中起到对程序的注解和说明的作用,其目的是为了便于对程序的阅读和分析。

C++语言中,注释方法有以下两种。

① 使用“/*”和“*/”括起来进行注释,在“/*”和“*/”之间的所有字符都为注释符。这种注释方法适用于多行注释信息的情况,例如,

② 使用“//”,从“//”后面的字符开始,直到它所在行的行尾,所有字符都被当作注释信息。这种方法适用于注释一行信息的情况。例如,

这两种注释方法可以放在程序的任意位置,程序的开头、结尾及中间任何位置都可以。前一种注释可以放在某一语句行的前边或后边,甚至中间;而后一种注释可以放在某一语句行的后边,但不能放在语句行的前边和中间。1.4 C++程序结构上的特点1.4.1 C++程序的两个实例【例1.1】 编程求从键盘输入的两个浮点数的和。

程序如下:

执行程序,屏幕上出现如下提示信息:

输入两个用空格分隔的浮点数后,按回车键。程序输出结果如下:

x+y=34.2【例1.2】 对例1.1的问题采用另外一种编程方法。

程序内容如下:

执行该程序,屏幕上显示的信息与例1.1相同。当输入两个浮点数后,输出这两个浮点数之和。1.4.2 C++程序结构特点

结合对前面列举的两个例子的分析,说明C++程序在结构上的特点。(1)C++程序是由类和函数构成的

一个C++程序由若干文件组成,每个文件由若干类和函数组成。

类通常是被定义在函数外的一种类型,该类体中还可以定义函数。C++程序中有两种函数:一种是定义在类体外的,称为一般函数;另一种是定义在类体内的,称为成员函数或方法。由类定义的对象可以在一般函数外,也可以在一般函数内。具体地讲,C++程序是由若干类和若干一般函数组成的。

在一个C++程序中,有且仅有一个名字为main()的主函数,它被放在一个主文件中。一个C++程序只能有一个主文件。主文件中有一个主函数,执行C++程序时,总是从主函数开始。该函数可以有参数,也可以无参数。

在例1.1和例1.2的C++程序中,只有函数而没有类,类在以后才会讲到。例1.1程序是由一个主函数组成的,例1.2程序是由一个主函数和一个被主函数调用的函数组成的。

由于C++语言是在C语言基础上开发的面向对象的语言,因此,C++语言兼顾了C语言中的内容,在程序结构上与C语言相同,只是增加了类的定义和对象。(2)语句是组成程序的基本单元

程序是由若干类和函数组成的。类体中包含若干语句,函数也是由若干语句组成的,语句是由单词组成的,单词之间用空格符分隔。C++程序中的语句是用分号来结束的。一条语句结束时,要用分号;一条语句没有结束时,一般不用分号。语句是组成C++程序的基本单元。

在例1.1中,只有一个main()函数。该函数体由5条语句组成,每条语句占一行,并用分号结束。

每条语句实际上是一种操作,例如,在例1.1中,下列语句

cin>>x>>y;

是一条输入语句。它们对应的操作是将通过键盘输入的两个数,按顺序分别给变量x和y赋值。

又例如,在例1.1中,语句

double z=x+y;

是一条说明语句。该语句的功能是定义一个double型变量z,并且对它进行了初始化,即将变量x与变量y的和值赋给z。

C++语言具有足够的语句形式来实现所需的各种操作。1.4.3 C++程序的书写格式

从前面的两个例子中可以看出,C++程序的书写格式与C语言程序的书写格式相同。其具体规则如下。

① 一行一般写一条语句。短语句可以一行写多个,长语句可以一条写多行。分行原则是,不能将一个单词分开,也不要将用双撇号引用的一个字符串分开。通常在两个单词间进行分行。续行符为“\”,加在上行的行尾,一般不需要加续行符。

② 为提高程序的可读性,采用缩格书写的方法。同一类语句要对齐,不同类的语句要缩进若干字符,这样会增加可读性,较清楚地表示出程序的结构。例如,一个函数的函数体的语句,应比函数体定界的左大括号缩进2~4个字符,并且对齐。

③ 大括号在程序中使用较多,书写格式也有所不同。本书采用如下方法:

每个大括号占一行,并与使用大括号的语句对齐;大括号内的语句采用缩格书写方式,一般缩进2个字符。

在个别情况下,大括号与其所括的内容占一行,例如,用于初始化的初始值表中所使用的大括号就是如此。

④ C++语言的程序可读性较差,因此书写时要求遵循一般书写规则,否则该程序读起来比较困难。另外,加注释信息也是提高程序可读性的好办法。1.5 C++程序的实现

C++源程序的实现与其他高级语言的源程序实现的方法是一样的。一般地,要经过如下3个步骤:

● 编辑

● 编译(含连接)

● 运行1.5.1 C++程序的编辑、编译和运行

1.编辑

编辑功能就是将编写好的C++语言源程序录入到计算机中,生成磁盘文件并加以保存。

录入的方法有两种。一种是选用计算机中所提供的某种文件编辑器,将源程序代码录入到磁盘文件中,该文件名应加扩展名.cpp。另一种是选用C++编译器本身所提供的编辑器,这种方法比较方便,是一种常用方法。例如,使用Visual C++5.0版本的编译器时,该编译器本身带有一个全屏幕编辑器,具有编辑器的全部功能,使用起来很方便。

2.编译

C++语言是一种以编译方式来实现的高级语言。C++源程序必须经过编译后才能运行。编译工作是由系统提供的编译器来完成的。

编译器的功能是将程序的源代码转换成目标代码,然后,再将目标代码进行连接,生成可执行文件。

整个的编译过程可分为如下3个子过程。(1)预处理过程

源程序编译时,首先经过预处理过程,先执行程序中的预处理命令,执行后再继续后面的编译。(2)编译过程

在编译过程中,主要进行词法分析和语法分析。在分析过程中,发现有不符合要求的词法和语法时,及时报告用户,将错误信息显示在屏幕上。在这个过程中还要生成一个符号表,用来映射程序中的各种符号及其属性。(3)连接过程

将编译过程中生成的目标代码进行连接处理,最后生成可供机器运行的可执行文件。在连接过程中,往往还要加入一些系统提供的库文件代码。

经过编译后的目标代码文件的扩展名为.obj,又称OBJ文件;经过连接后生成的可执行文件的扩展名为.exe,又称为可执行文件。

3.运行

运行可执行文件的方法很多,一般是在编译系统下执行其运行功能,通过选择编译系统的菜单项便可实现。这是常用的方法。

可执行文件也可以在MS-DOS系统下执行。在DOS提示符后,直接输入可执行文件名,再按回车键便可执行。

可执行文件被运行后,在屏幕上显示其运行结果。

一个源程序在编译、连接和运行中可能出现下述3种错误。(1)编译错

这种错误多是词法错误和语法错误。这类错误又分为两种:一种是致命错,另一种是警告错。致命错将终止程序的继续编译,不生成目标代码文件,必须修正后再编译。警告错可以继续编译,生成可执行文件。在一般情况下,编译中的警告错也应该修改,直到没有任何错误为止。(2)连接错

连接错是指在程序被编译后进行连接时发生的错误,连接错多是致命错,必须修改后才能继续编译,直到无错后才能生成可执行文件。

上述两种错误都是在编译过程中发现的,并可将其错误信息显示在屏幕上。用户可根据所显示的错误信息对源程序进行修改。(3)算法错

一个程序被编译后生成可执行文件,运行后又得到了输出结果,但是,输出结果与原题意不符,显然,程序出现了错误。这类错误通常是由于算法错误产生的。修正这种错误的方法往往是通过验证若干组数据的结果来寻找错误原因。1.5.2 Visual C++6.0编译系统的用法简介

Visual C++6.0版本编译系统是当前国内比较流行的一种C++编译系统。该系统是在Windows 95以上版本和Windows NT 2.0以上版本支持下运行的。该系统字长32位,本身约占100 MB磁盘空间。该系统功能较强,使用方便。本书仅介绍其最基本的用法,关于该系统的更多功能可参阅Visual C++6.0的操作说明书。

下面介绍如何使用该编译系统来实现一个C++程序,也就是使用该编译系统对一个单文件或多文件的C++程序进行编辑、编译和运行,从而获得该程序的输出结果。

1.编辑C++源程序

启动Windows下的Visual C++6.0版本编译系统后,屏幕上显示如图1.1所示的Microsoft Developer Studio窗口。图1.1 Microsoft Developer Studio窗口

该窗口的菜单栏中共有9个菜单项。在编辑C++源程序时,选择File菜单项,出现如图1.1所示的下拉式菜单,再选择下拉式菜单中的New选项(以后简述如下:选择“File”→“New”菜单项),则出现New对话框,如图1.2所示。图1.2 New对话框

在New对话框中有4个标签,默认显示Projects标签的若干选项。在编辑C++源文件时,应该选择Files标签,显示如图1.2所示的选项,共13个。双击C++Source File选项,则出现如图1.3所示的窗口,在该窗口的右边工作区中便可编辑C++源文件。

将例1.1的C++源程序输入计算机中,如图1.3工作区所示。

将该源程序存入磁盘文件使用如下方法:

选择“File”→“Save as”菜单项后,出现Save as对话框。在该对话框中,先在“保存在”框中选定要保存C++源文件的文件夹,然后再在“文件名:”框内输入该文件的名字,例如,输入“add”,这里不必输入扩展名,默认的扩展名为.cpp。单击该对话框的OK按钮,则完成程序的保存任务。

2.编译连接和运行源程序(1)单文件程序

单文件程序编辑好后,先将它存入磁盘并起个名字,如add.cpp。如果它是当前文件,便可选择“Build”→“Compile add.cpp”菜单项,对该文件直接进行编译。如果待编译的文件不是当前文件,则需要将它从工作区内清除,再装入当前文件后,选择Compile add.cpp菜单项进行编译。图1.3 工作区

在编译过程中,如果出现错误,则在主窗口下方的Build窗口中显示错误信息。错误信息指出错误发生的位置(比如行数)及错误的性质,用户将根据这些信息,逐项进行修改。当双击错误信息行时,在该错误信息对应的行前出现一个提示的箭头,表明该行语句可能有错误。修改后再重新编译,直到没有任何错误为止。这时,屏幕上将显示如下信息:

add.obj—0 error(s),0 warning(s)

编译无错后,再进行连接。其方法如下:

选择“Build”→“Build add.exe”菜单项。这时,对被编译后的目标文件进行连接。在连接的过程中,发现错误后,则发出连接错误信息。同样,根据所显示的错误信息对C++源文件进行修改,直到编译连接无错为止。这时,在Build窗口中显示如下信息:

add.exe—0 error(s),0 warning(s)

表明编译连接成功,源文件add.cpp已生成了add.exe可执行文件了。

运行可执行文件的方法如下:

选择“Build”→“Execute add.exe”菜单项。这时,add.exe文件被执行,并将执行后的结果显示在另一个显示输出结果的窗口中。这时屏幕上显示如下信息:

下划线部分信息是输入的,运行结果如下:

按任意键后,屏幕恢复显示源程序窗口。

以上是单文件程序编译、连接和运行的3个操作步骤。

另外,对一个源程序也可以直接选择“Build”→“Build”菜单项,先进行编译后连接,在无错的情况下生成可执行文件;再选择“Build”→“Execute”菜单项,运行该执行文件,并获得输出结果。(2)多文件程序

多文件程序是指C++源程序至少是由两个文件组成的,可以是两个以上文件的程序。下面举一个具体例子。【例1.3】 求两个int型数的和。

该程序由两个文件组成,一个文件名为file1.cpp,另一个文件名为file2.cpp。这两个文件的内容如下。

file1.cpp的内容如下:

file2.cpp的内容如下:

已知组成该程序的两个文件的名字和路径分别是c:\lfz\file1.cpp和c:\lfz\file2.cpp。

结合例1.3来讲解多文件程序的编译,其方法如下。

① 创建项目文件。选择“File”→“New”菜单项,屏幕上出现New对话框,如图1.1所示。在该对话框内选择Projects标签,做下述3件事。

● 选择项目类型Win32 Console Application,这时,项目的目标平台选框中出现:Win32。

● 输入项目名称。在Project Name框中输入所指定的项目名字,如file12。

● 输入路径名。在Location框中输入要建立的项目文件中所包含的源文件所在的路径名。此例中,路径名为c:\lfz。

② 向项目文件中添加文件。选择“Projects”→“Add File into Project”→“Files”菜单项,出现Insert Files into Project对话框,如图1.4所示。图1.4 Insert Files into Project对话框

在该对话框中,在“搜寻”框内查找要添加到当前项目文件中的文件所在的目录,则在列表框内显示要添加文件的文件名,通过选定文件的方法,选定将要添加的所有文件。该例中,路径名为c:\lfz,两个文件名为file1.cpp和file2.cpp。选好文件后,单击该对话框的OK按钮。

③ 编译、连接和运行项目文件。前面已生成了可执行的项目文件,该例中名为file12.prj。通过选择“Build”→“Execute file12.exe”菜单项,系统将对选定的项目文件中的各个文件进行逐个编译,然后连接,在无错情况下,生成一个可执行文件,并执行该文件,将输出结果显示出来。该例中,显示如下输出结果:1.6 上机练习指导

上机目的

1.熟悉Visual C++6.0编译系统的常用功能。

2.学会使用Visual C++6.0编译系统实现简单的C++程序。

上机练习题

1.熟悉Visual C++6.0编译系统的常用功能。(1)启动该编译系统,熟悉Visual C++6.0主窗口的组成部分及简单操作。

① 标题栏 ② 菜单栏 ③ 工具栏

④ 项目工作区窗口 ⑤ 源代码编辑窗口 ⑥ 输出窗口 ⑦ 状态栏(2)主窗口的常用操作。

① 显示各菜单项的下拉式菜单,熟悉所包含的菜单项。

② 右键单击工具栏,观察弹出的快捷菜单中各选项的内容,即选择某些选项,观察出现的工具栏。

③ 使用菜单和工具栏,练习显示/隐藏项目工作区窗口和输出窗口的操作。

2.使用该编译系统,实现单文件程序的操作。

以例1.1程序为例,学会使用该编译系统对单文件程序的操作方法。具体操作步骤如下。(1)编辑源代码程序。选择“File”→“New”菜单项,在打开的New对话框中选择C++Source File选项,出现主窗口。在主窗口的源代码编辑窗口中,将例1.1的源代码程序逐条输入,编辑后存入磁盘。(2)源程序存盘和打开。存盘方法如下:选择“File”→“Save”或“Save As”菜单项,弹出“另存为”对话框。在该对话框中,先选好存放该文件的文件类,再输入文件名,按回车键或单击“保存”按钮即可。

打开一个已被存盘的源程序的方法如下:选择“File”→“Open”菜单项,弹出“打开”对话框。在该对话框中,先选择要打开的文件被存放的文件夹,再在类型为.cpp的文件列表中查找要打开的文件,找到后,或者双击该文件,或者单击该文件后再单击“打开”按钮。(3)编译C++单文件程序。打开将要编译的文件作为当前文件。选择“Build”→“Compile xxx.cpp”菜单项,该文件将被编译。之后,在输出窗口中将显示编译的过程和错误信息。

对编译中发现的错误应该进行修改,修改后再继续编译,直到没有错误为止。编译过程中出错是无法生成可执行文件的。(4)连接C++单文件程序。单文件源程序被编译好后,可选择“Build”→“Build xxx.exe”菜单项,此时被编译好的目标程序将被连接。在连接过程中,系统检查是否有错误,如果发现错误,则停止连接,并将错误信息显示在输出窗口中。用户应该按错误信息中的提示及时修改,修改后再进行连接,直到没有任何错误为止。此时,系统将生成该程序的可执行文件。

用户也可以对编辑好的文件直接选择Build xxx.exe菜单项,系统发现该文件尚未编译时,对该文件先进行编译,然后再进行连接,直至生成可执行文件。(5)运行C++单文件程序。编译、连接好的可执行文件,可选择“Build”→“Execute xxx.exe”菜单项,开始运行。运行后将结果显示在MS-DOS窗口中,查看后按任意键即可关闭该窗口。

练习题

按照上述方法,将例1.2及习题1中1.4题的3个小题都按要求上机操作一遍。

3.使用该编译系统实现多文件程序的操作。

以例1.3为例,学会使用该编译系统对多文件程序的操作方法。(1)编辑该程序的多个文件。按照前面讲述的单文件程序的编辑方法,对多文件程序中的每个文件进行编辑,并按指定的名字存盘。例如,将例1.3中的两个文件编辑完毕后,分别以file1.cpp和file2.cpp的名字存放在C:\aaa文件夹中。

如果一个程序包含有更多的文件,则按此方法,将每一个文件编辑好后存入磁盘中。(2)创建一个空的项目文件。多文件程序需要用项目文件进行编译、连接和运行,创建空的项目文件的方法如下:选择“File”→“New”菜单项,出现New对话框。在该对话框中选择Project标签。在列表清单中选择Win32 Console Application选项,接着在该对话框右侧的Project name文本框内输入创建项目文件的名字。例如,输入bbb,按回车键,此时,在下面的Location文本框内将显示出一个路径,为C:\bbb。在新建项目文件时,应选择Create new workspace单选按钮。单击OK按钮,退出New对话框,屏幕上出现Win32 Console Application-Step 1 of 1对话框,该对话框提示用户选择所要创建的控制台应用程序的类型。当选择An empty project单选按钮后,单击Finish按钮,将退出该对话框。接着会出现New Project Information对话框,在该对话框中显示所创建的控制台应用程序新框架的项目特性。单击OK按钮,退出该对话框,返回系统主窗口。空项目文件bbb创建结束。(3)将文件添加到项目文件中。将事先编辑好的file1.cpp和file2.cpp两个文件添加到项目文件bbb中的方法如下:选择“Project”→“Add To Projects”→“Files”菜单项,出现Insert Files into Project对话框。在该对话框中,向已打开的项目文件中添加文件。

先打开存放文件的文件夹C:\aaa,这里两个文件file1.cpp和file2.cpp都显示在列表框中。选中这两个文件,即单击第一个文件名,再按住Shift键单击第二个文件名,它们都出现在“文件名”文本框中,单击OK按钮,即完成添加文件任务。(4)编译、连接项目文件。选择“Build”→“Build bbb.exe”菜单项,开始编译并连接项目文件bbb。如果有错误则应修改,直到没有错误为止,生成可执行文件bbb.exe。(5)运行项目文件。选择“Build”→“Execute bbb.exe”菜单项,运行该项目文件。运行结果显示在MS-DOS窗口中,按任意键返回编译系统的主窗口。

4.发现并记忆编译和连接中的错误信息,为今后调试程序积累经验。

上机调试习题1中1.5题的3个小程序,将会发现一些编译和连接错误,根据输出窗口中显示的错误信息,修改源程序,直到没有错误信息为止。记下每次出现的错误信息,为以后积累修改经验。例如,调试1.5题中的第(2)小题的程序时,出现错误信息如下:

C:\aaa\ex4.cpp(4):error C2065:'x':undeclared identifier

该信息说明该文件(C:\aaa\ex4.cpp)中第4行出现了'x'没有被说明的错误。修改该错误,在源程序中增添说明x的说明语句“int x;”后,再编译、连接,结果无错,生成可执行文件。

运行该文件,在MS-DOS窗口中输入5,按回车键后,显示如下输出结果:

分析该结果,发现它是不正确的,说明源程序中仍然有错误。检查源程序发现,输出上述错误结果是由下列语句造成的:

cout<<"y=<

将该语句修改为:

cout<<"y="<

再编译、连接并运行,输入5后,输出如下正确的结果:

y=25

该例子告诉我们:

① 在编译、连接中,发现有错误必须改正,直到无错误,生成可执行文件为止;

② 运行可执行文件后输出的结果中还可能有错误,需要检查并修改源程序,直到输出结果正确为止。

源程序中有些错误,尤其是算法错误,编译、连接是检查不出来的。因此,执行完一个程序后还需对结果进行分析,检测输出结果是否正确。如果输出结果有错,还需修改源程序,再重新编译、连接和运行,直到结果正确为止。习题1

1.1 简答题(1)什么是面向对象?如何理解面向对象中的一些基本概念:对象、类、继承、封装、包含、消息传递、多态性等。(2)什么是编程语言?从编程语言的发展史中给我们什么启发?(3)面向对象语言有哪些特点?(4)C语言和C++语言有什么关系?(5)C++语言对C语言在哪些方面进行了改进?(6)C++语言对面向对象方法有哪些支持?(7)简述C++语言中6种单词的有关规定。(8)C++程序在结构上有何特点?在书写格式上有何要求?(9)简述C++源程序实现的3个步骤。(10)结合你所选用的C++源程序的编译系统,讲述对单文件和多文件的C++源程序的具体实现方法。

1.2 选择填空(1)下列高级语言中,()是面向对象的程序语言。

A)BASIC B)C C)C++D)Pascal(2)关于C++语言与C语言的关系描述中,()是错误的。

A)C语言与C++语言是兼容的

B)C++语言对C语言进行了一些改进

C)C语言是C++语言的一个子集

D)C++语言和C语言都是面向对象的(3)关于对类概念的描述中,()是错误的。

A)类就是C语言中的结构类型

B)类是创建对象的样板

C)类是具有共同行为的若干对象的统一描述体

D)类是抽象数据类型的实现(4)关于对象的描述中,()是错误的。

A)对象就是C语言中的结构变量

B)对象是状态和操作的封装体

C)对象之间的信息传递是通过消息进行的

D)对象是某个类的一种实例(5)下列字符中,()是不能构成标识符的。

A)下划线 B)连接符 C)数字字符 D)大小写字母

1.3 判断下列描述的正确性,对者画√,错者画×。(1)面向对象方法具有三大特性:封装性、继承性和多态性。(2)机器语言和汇编语言都是计算机能够直接识别的语言。(3)C++语言允许函数重载,还允许设置默认的参数值,而C语言不允许。(4)C++语言只支持封装性和继承性,不支持多态性。(5)C++语言对C语言进行了一些改进,增加了运算符和关键字,并且对类型管理更严格。(6)用C++语言编写程序时,应该特别注意格式,否则会影响可读性。(7)C++语言是一种以解释方式实现的高级语言。(8)C++源程序只在编译时出现错误信息,而在连接中不会出现错误信息。(9)C++源程序的编译过程包含3个子过程:预处理过程、编译过程和连接过程,它们的顺序是可以改变的。(10)在编译C++源程序过程中,出现了警告错也可以生成可执行文件。

1.4 分析下列程序的输出结果。

假定,输入的两个数分别为8和7。

1.5 编译下列程序,改正所出现的错误信息,并分析输出结果。

1.6 通过对上题中3个程序所出现问题的修改,回答下列问题:(1)从对上题中第(1)题出现错误的修改,总结出编程时应注意哪些问题?(2)C++程序中所出现的变量是否都必须先说明后使用?说明变量时,是否都应放在函数体的开头?(3)使用cout与运算符“<<”输出字符串时应注意些什么?(4)程序中说明了的变量,但没有赋值,能否使用?(5)一个程序通过编译并运行后得到了输出结果,这一结果是否一定正确?第2章 变量和常量

变量和常量是C++程序中最基本的数据元素。程序中的数据通常是以变量和常量形式出现的。变量和常量是各种语言的程序中都存在的基本量,但是在不同语言中,它们的表达形式是不同的。学会对变量和常量的表达方法是C++语言编程的基础。本章将讲述下列基本内容:

● 基本数据类型

● 变量的名字、类型和值

● 数组的定义和数组元素的表示及赋值

● 常量的表示方法2.1 数据类型

C++语言的数据类型比较丰富,分为基本数据类型和自定义数据类型两种。自定义数据类型又称构造数据类型或复合数据类型。2.1.1 基本数据类型

基本数据类型有如下5种。

① 整型:说明符为int。整型又包含长整型和短整型,有符号型和无符号型之分。

② 字符型:说明符为char。字符型分为有符号型和无符号型两种。

③ 浮点型:又称实型。浮点型分为单精度浮点型(说明符为float)、双精度浮点型(说明符为double)和长双精度浮点型(说明符为long double)3种。

④ 布尔型:又称逻辑型,说明符为bool。该类型数据的值有两种:true和false。前者为真,后者为假。它占用内存1个字节。在VC++6.0编译系统中,true值用1表示,false值用0表示。

⑤ 空值型:说明符为void。该类型常用于说明函数的类型或指针的类型。

上面给出了5种基本数据类型的说明符,下面再介绍4种修饰符,它们是:

● signed 表示有符号型,通常被省略;

● unsigned 表示无符号型;

● long 表示长型;

● short 表示短型。

前两种修饰符可以放在整型和字符型说明符前边,后两种修饰符可以放在整型说明符前边。

表2-1给出C++语言中各种基本数据类型的说明符,在内存中占用的字节数和该类型数据的取值范围。不同数据类型在不同字长的机器中所占的字节数有所不同。表2-1中的字宽是指32位机的字节数。表2-1 C++的基本数据类型续表注:① 表中出现在[int]中的int可以省略。② 表中各种类型的字宽是以字节数为单位的,1个字节等于8个二进制位。

有符号数在计算机内是以二进制补码或反码形式存储的。在多数机器中,有符号数以补码形式存储,其最高位为符号位,正数符号位为0,负数符号位为1。无符号数只有正数。2.1.2 自定义数据类型

自定义数据类型是在基本数据类型的基础上,用户根据实际需要,按照指定的规则定义的数据类型。因为自定义数据类型是由基本数据类型构造而成的,所以又称构造数据类型。因为它是由若干基本数据类型组合而成的,所以又称复合数据类型。

自定义数据类型包括数组、结构、联合和类类型。枚举也可以属于这种类型,本书在常量中讲述。指针也可以属于这种类型。各种自定义数据类型中,除数组在本章后边讲述外,其余的都在本书后边章节中讲述。2.2 变量

变量是在程序执行中其值可以改变的量。变量有3个基本要素:名字、类型和值。2.2.1 变量的名字

变量名字是一种标识符,即按标识符的规则来给变量命名。在组成变量名字的字母中,大小写是有区别的。例如,mycar,MyCar和MYCAR是不同的3个名字。

在变量命名时应遵守如下规则:

① C++语言中的关键字(保留字)不得用作变量名;

② 命名变量应尽量做到“见名知意”,这样有助于记忆,并能增加可读性;

③ 变量名长度虽然没有限制,但是不宜过长,一般不超过31个字符;

④ 变量名中不能有空格符和除下划线之外的其他特殊字符;

⑤ 变量名不要与C++库中的函数名、类名和对象名相同。

在现代软件开发中,有下面两种比较流行的命名变量的方法。

一种是全用小写字母命名变量名。如果需要两个单词时,常用下划线连接起来,例如,is_byte,my_book等。也可以将第二个单词的第一个字母写成大写,如isByte,myBook等。

另一种方法称匈牙利标记法,这种方法要在变量名前面加上若干表示类型的字符,例如,iIsByte表示int型变量,ipMyBook表示指向int型变量的指针等。2.2.2 变量的类型

每个变量在使用前必须定义,定义变量时除了必须给出名字外,还必须指出变量的类型。

变量类型应包含数据类型和存储类。前面讲过了数据类型。下面简单介绍一下存储类,关于存储类的更多讲述,请见本书第5章。

在定义变量时,该变量的数据类型不可省略。变量存储类有的可以省略,有的可以不必给出。定义在函数体内或分程序内的自动类变量,其存储类说明符auto可以省略;定义在函数体外部的外部存储类变量可以不必给出存储类说明符extern。可见,在程序中,不写存储类说明符的变量有两种:一种是在函数体内的自动存储类变量,另一种是在函数体外的外部存储类变量。静态存储类变量的存储类说明符是static,不可省略。定义在函数体和分程序内的静态类变量称为内部静态变量,定义在函数体外的静态类变量称为外部静态变量。还有一种存储类是寄存器类,它较少使用,其说明符为register,该类变量被定义在函数体内或分程序内。

例如,

int a;

变量a的数据类型为int型,如果定义在函数体内,则为自动类的;如果定义在函数体外,则为外部类的。

又如,

static double d1,d2;

变量d1,d2的数据类型为double型,存储类为静态类。如果定义在函数体内,为内部静态类;如果定义在函数体外,为外部静态类。

定义或说明变量的格式如下:

〈类型说明符〉〈变量名表〉;

其中,类型说明符包含数据类型和存储类。2.2.3 变量的值

变量本身包含两个值:一个是变量所表示的数据值,该值需要在定义变量后赋予;另一个值是变量的地址值,该值是在定义或说明变量,系统给该变量分配内存空间时确定的,它是一个内存的地址值。前者称为变量值,后者称为变量地址值。

一个变量的变量值获取方法一般有两种:一种是赋初值,即在定义或说明变量的说明语句中,使该变量获取所指定的值或默认值;另一种是赋值,在定义或说明变量后,使用赋值表达式语句给变量赋值,或称更改变量值,或者从键盘等输入设备上获取值。例如,

float fa=5.67;

是一条说明语句,在说明变量fa是一个float型变量的同时,还给它赋了初值为5.67。于是,变量fa将具有数据值5.67。又如,

这里,第一条语句定义变量ib是int型变量,没有给它赋初值,这时ib可能有默认值,也可能有无意义的值,这将取决于它的存储类。第二条语句是给变量ib赋值,使ib获取值15,或者说将ib的值更新为15。

在程序中,一个变量获取数据值后,便一直保留,直到下一次被重新更改为止。

变量fa和ib除了有前面给定的数据值外,它们各自都有一个地址值,该地址值是该变量存放在内存中的地址值。

在变量定义或说明中,除了确定变量名和类型外,有时还需对变量初始化,即在定义变量的说明语句中,给变量赋初值。

请读者在掌握变量概念时,搞清如下几个区别。

① 赋值与赋初值的区别。在说明语句中,即在定义变量的同时,使变量获取值,称为赋初值。变量被定义后,使用赋值表达式语句来使变量重新获取值,称为赋值。有些变量(外部和静态存储类的变量)赋初值是在编译时进行的,而赋值都是在运行时进行的。赋值和赋初值是使变量获取值的两种不同的方法。

② 变量值和变量地址值的区别。变量值是变量存放在内存单元中的内容,它是该变量的数据值,直接引用该变量名就是使用该变量的数据值。变量地址值是存放该变量的内存的地址值。一个变量的地址值被表示为在该变量名前加上运算符“&”。例如,

int a=5;

int型变量a的地址值表示为&a(关于地址值的详细讨论参见第6章)。

③ 有意义值和无意义值的区别。在使用一个变量之前,要求该变量要有一个有意义的值。有的变量(自动存储类变量)在定义或说明后,没有给它赋初值或赋值前,它所具有的值是无意义的,即它被分配的内存空间中保留的随机值,该值是无效值,不能用来进行运算。有意义的值是指定义后的变量或者赋予了初值,或者有默认值,或者

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载