好文档 - 专业文书写作范文服务资料分享网站

信息学奥赛培训教程C++版

天下 分享 时间: 加入收藏 我要投稿 点赞

22 is gretaer than 12

22 is greater than or equal to 12

Enter two integers,and I will tell you the relationships they satisfy:7 7 7 is equal to 7

7 is less than or equal to 7 7 is greater than or equal to 7

图2.14 使用相等和关系运算符

注意图2.14中空格的用法。在C++语言中,空白字符(如制表符、换行符和空格)通常都被编译器忽略。因此,语句中可以根据程序员的爱好加上换行符和空格,但不能用换行符和空格分隔标识符。

图2.15显示了本章介绍的运算符优先级,运算符优先顺序从上向下递减。注意赋值运算符之后的所有运算符结合律均为从左向右。加法是左结合的,因此表达式x+y+z求值为(x+y)+z。赋值运算符是从右向左结合的,因此表达式x=y=0求值为x=(y=0),首先将0赋给y,然后将结果0赋给x。

运算符 结合律 类型 ( ) 从左向右 括号 * / % 从左向右 乘 + - 从左向右 加

<< >> 从左向右 流插入/读取 < <= > >= 从左向右 关系 == != 从左向右 等于 = 从右向左 赋值

图 2.15 运算符优先级和结合律

2.9 新型头文件与名字空间

本节是为使用支持ANSI/ISO草案标准的编译器用户提供的。草案标准指定了许多旧式C++头文件的新名,包括iostream.h,大多数新式头文件不再用扩展名.h。图2.16改写图2.2,演示新型头文件和两种使用标准库头文件的方法。 第3行:

#include

演示新型头文件 名语法。 第5行:

using namespace std;

指定用std名字空间(namespace),这是C++中的新特性。名字空间可以帮助程序员开发新的软件组件而不会与现有软件组件产生命名冲突。开发类库的一个问题是类和函数名可能已经使用。名

-31-

字空间能为每个新软件组件保持惟一的名称。 1 // Fig. 2.16:fig01_16.cpp

2 // Using new-style header files 3 #include 4

5 using namespace std; 6

7 int main() 8 {

9 cout<<\

10 std::cout<<\ 11

12 return 0; 13 }

输出结果: Welcom to C++! Welcom to C++!

图 2.16 使用新型头文件

C++草案标准中的每个头文件用名字空间std保证今后C++标准库操作的每个特性是惟一的,不会与其它程序员开发的软件组件混淆起来,程序员不能用名字空间定义新的类库。上述语句只是表示我们使用C++标准库中的软件组件,要定义自己的类库,则可以将我们的所有类和函数放在名字空间deitel中,使我们的类库与所有其它公司的类库和C++标准类库区别开来。 程序中出现\namespace std\语句之后,就可以像第9行那样用cout对象将数值输出到标准输出流中。如果使用两个或几个类库,其中有的特性名称相同,则可能引起名称冲突。这时就要用名字空间来完全限定所用的名称,例如第10行的std::cout: std::cout<<\cout的完全限定名为std::cout,如果全部采用这种形式,虽然比较繁琐,但程序中第5行的\namespace std\语句就没有必要了。using语句可以在C++标准库中使用每个名称的简写版本(或其它指定名字空间的名称)。我们将在本教程稍后详细介绍名字空间。目前并不是所有C++环境都已经支持新的头文件的命名格式。为此,我们在本教程大部分地方使用旧式头文件 ,只在介绍C++标准新特性时才使用新的头文件命名格式,使用新格式时将特别注明。

-32-

第3章 C++输入/输出流

3.1 简介

C++标准库提供了—组扩展的输入/输出(I/O)功能。本章将详细介绍C++中最常用的一些I/O 操作,并对其余的输入/输出功能做一简要的概述。本章的有些内容已经在前面提到,这里对输入/输出功能做一个更全面的介绍。

本章讨论的许多输入/输出功能都是面向对象的,读者会发现C++的I/O操作能够实现许多功能。C++式的I/O中还大量利用了C++的其他许多特点,如引用、函数重载和运算符重载等等。 C++使用的是类型安全(typesafe)的I/O操作,各种I/O操作都是以对数据类型敏感的方式来执行的。假定某个函数被专门定义好用来处理某一特定的数据类型,那么当需要的时候,该函数会被自动调用以处理所对应的数据类型。如果实际的数据类型和函数之间不匹配,就会产生编译错误。

因此,错误数据是不可能通过系统检测的(C语言则不然。这是C语言的漏洞,会导致某些相当微妙而又奇怪的错误)。

用户既可以指定自定义类型的I/O,也可以指定标准类型的I/O。这种可扩展性是C++最有价值的特点之一。

3.2 流

C++的I/O是以字节流的形式实现的,流实际上就是一个字节序列。在输入操作中,字节从输入设备(如键盘、磁盘、网络连接等)流向内存;在输出操作中,字节从内存流向输出设备(如显示器、打印机、磁盘、网络连接等)。

应用程序把字节的含义与字节关联起来。字节可以是ASCII字符、内部格式的原始数据、图形图像、数字音频、数字视频或其他任何应用程序所需要的信息。

输人/输出系统的任务实际上就是以一种稳定、可靠的方式在设备与内存之间传输数据。传输过程中通常包括一些机械运动,如磁盘和磁带的旋转、在键盘上击键等等,这个过程所花费的时间要比处理器处理数据的时间长得多,因此要使性能发挥到最大程度就需要周密地安排I/O操作。一些介绍操作系统的书籍(见参考文献)深入地讨论了这类问题。

C++提供了低级和高级I/O功能。低级I/O功能(即无格式I/O)通常只在设备和内存之间传输一些字节。这种传输过程以单个字节为单位.它确实能够提供高速度并且可以大容量的传输,但是使用起来不太方便。

人们通常更愿意使用高级I/O功能(即格式化I/O)。高级I/O把若干个字节组合成有意义的单位,如整数、浮点数、字符、字符串以及用户自定义类型的数据。这种面向类型的I/O功能适合于大多数情况下的输入输出,但在处理大容量的I/O时不是很好。

-33-

3.2.1 iostream类库的头文件

C++的iostream类库提供了数百种I/O功能,iostream类库的接口部分包含在几个头文件中。 头文件iostream.h包含了操作所有输入/输出流所需的基本信息,因此大多数C++程序都应该包含这个头文件。头文件iostream.h中含有cin、cout、cerr、clog 4个对象,对应于标准输入流、标准输出流、非缓冲和经缓冲的标准错误流。该头文件提供了无格式I/O功能和格式化I/O功能。 在执行格式化I/O时,如果流中带有含参数的流操纵算子,头文件iomanip.h所包含的信息是有用的。

头文件fstream.h所包含的信息对由用户控制的文件处理操作比较重要。第13章将在文件处理程序中使用这个头文件。

每一种C++版本通常还包括其他一些与I/O相关的库,这些库提供了特定系统的某些功能,如控制专门用途的音频和视频设备。

3.2.2 输入/输出流类和对象

iostream类库包含了许多用于处理大量I/O操作的类。其中,类istream支持流输入操作.类ostream支持流输出操作,类iostream同时支持流输入和输出操作。

类istream和类ostream是通过单一继承从基类ios派生而来的。类iostream是通过多重继承从类istream和ostream派生而来的。

运算符重载为完成输入/输出提供了一种方便的途径。重载的左移位运算符(<<)表示流的输出,称为流插入运算符;重载的右移位运算符(>>)表示流的输入,称为流读取运算符。这两个运算符可以和标准流对象cin、cout、cerr、clog以及用户自定义的流对象—起使用。

cin是类istream的对象,它与标准输入设备(通常指键盘)连在一起。下面的语句用流读取运算符把整数变量grade(假设grade为int类型)的值从cin输入到内存中。 cin >> grade;

注意,流读取运算符完全能够识别所处理数据的类型。假设已经正确地声明了grade的类型,那么没有必要为指明数据类型而给流读取运算符添加类型信息。

cout是类ostream的对象,它与标准输出设备(通常指显示设备)连在一起。下面的语句用流插入运算符cout把整型变量grade的值从内存输出到标准输出设备上。 cout << grade;

注意,流插入运算符完全能够识别变量grade的数据类型,假定已经正确地声明了该变量,那么没有必要再为指明数据类型而给流插入运算符添加类型信息。

cerr是类osteam的对象,它与标准错误输出设备连在一起。到对象cerr的输出是非缓冲输出,也就是说插入到cerr中的输出会被立即显示出来,非缓冲输出可迅速把出错信息告诉用户。 clog是类ostream的对象,它与标准错误输出设备连在一起。到对象clog的输出是缓冲翰出。即每次插入clog可能使其输出保持在缓冲区,要等缓冲区刷新时才输出。

C++中的文件处理用类ifstream执行文件的输入操作,用类ofstream执行文件的输出操作,用类fstream执行文件的输入/输出操作。类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了类iostream。虽然多数系统所支持的完整的输入/输出流类层次结构中还有很多类,但这里列出的类能够实现多数程序员所需要的绝大部分功能。如果想更多地了解有关文件处理的内容,可参看C++系统中的类库指南。

-34-

3.3 输出流

C++的类ostream提供了格式化输出和无格式输出的功能。输出功能包括:用流插入运算符输出标准类型的数据;用成员函数put输出字符;成员函数write的无格式化输出(3.5节);输出十进制、八进制、十六进制格式的整数(3.6.1节);输出各种精度的浮点数(3.6.2节)、输出强制带有小数点的浮点数(3.7.2节)以及用科学计数法和定点计数法表示的浮点数(3.7.6节);输出在指定域宽内对齐的数据(3.7.3节);输出在域宽内用指定字符填充空位的数据(3.7.4节);输出科学计数法和十六进制计数法中的大写字母(3.7.7节)。

3.3.1 流插入运算符

流插入运算符(即重载的运算符<<)可实现流的输出。重载运算符<<是为了输出内部类型的数据项、字符中和指针值。3.9节要详细介绍如何用重载运算符<<输出用户自定义类型的数据项。

图3.3中的范例程序用一条流插入语句显示了输出的字符串。图3.4中的范例程序用多条流插入语句显示输出的字符串,该程序的运行结果与图3.3中程序的运行结果相同。

1 // Fig. 3.3: figll 03.cpp

2 // Outputting a string using stream insertion. 3 #include 4

5 using namespace std; 6 int main()

7 cout << \8

9 return O; 10 }

输出结果:

Welcome to C++!

图 3.3 用一条流插入语句输出字符串

1 // Fig. 3.4: figllO4.cpp

2 // Outputting a string using two stream insertions. 3 #include 4 using namespace std; 5 int main() 6{

7 cout << \8 cout << \9

10 return 0;

-35-

信息学奥赛培训教程C++版

22isgretaerthan1222isgreaterthanorequalto12Entertwointegers,andIwilltellyoutherelationshipstheysatisfy:777isequalto77isl
推荐度:
点击下载文档文档为doc格式
7147t1zw3j3ef8l93ts6
领取福利

微信扫码领取福利

微信扫码分享