ITEEDU

自测练习

11. 1填空

a)重载的流运算符函数经常定义为类的——函数。

b)能够设置的格式对齐位包括——、——和——。

c)C++中的输入/输出是以字节——的形式实现的。

d)参数化的流操纵算子——和——用于设置和清除格式化状态标志。

e)大多数C++程序都要包含——头文件。该文件中包含了所有输入/输出流操作所需的基本信息。

f)成员函数——和——用于设置和清除格式化状态标志。

g)头文件——中包含了执行内存格式化所需的信息。

h)当使用带参数的操纵算子时,程序中必须包含头文件——。

i)头文件——中包含了处理用户控制的文件操作所需的信息。

j)流操纵算子——向输出流中插入一个换行符并刷新输出缓冲区。

k)头文件——中包含了用C、C++语言式I/O混合编程所需的信息。

l)类ostream的成员函数——用于执行无格式输出。

m)类——支持输入操作。

n)标准错误流的输出发送给流对象——或——。

o)类——支持输出操作。

P)流插入运算符是——。

q)与系统中标准设备对应的4个对象是——、——、——和——。

r)流读取运算符是——。

s)流操纵算子——、——和——分别指定整数按八进制、十六进制、十进制格式显示。

t)浮点数的默认精度值是——。

u)设置——标志位可使显示的正数前面带有一个加号。

11.2判断下列说法是否正确。如果不正确,请说明原因。

a)带一个long类型参数的流成员函数flags(按参数值设置flags状态变量,并返回以前设置的标志值。

b)重载流插入运算符<<和流读取运算符>>是为了处理所有的标准数据类型,包括字符串、内存地址(只能用流插入运算符)和所有用户自定义的数据类型。

c)无参数的成员函数flags()可以设置状态变量flags中的所有状态位。

d)流读取运算符的参数是对istream对象的引用和对自定义类型对象的引用,返回对istream对象的引用。

e)流操纵算子ws可跳过输人流中的前导空白字符。

f)流插入运算符<<的两个参数是对istream对象的引用和对自定义类型对象的引用,返回对istream对象的引用。

g)用流读取运算符>>进行输入操作总会跳过输入流中的前导空白字将。

h)输入、输出的特性是由C++本身所提供的。

i)流成员函数rdstate()返回当前流的状态。

j)cout流通常是与显示器相连的。

k)如果成员函数bad()、fail()和eof()都返回false,则流成员函数good()返回true。

l)cin流通常是与显示器相连的。

m)如果在流操作期间发生了不可恢复的致命错误,成员函数bad()返回true。

n)到cerr的输出是非缓冲输出,到clog的输出是缓冲输出。

o)当设置ios::showpoint标志位时,浮点数被强制以默认精度格式(6位小数位)输出(假定未改变精度值使浮点数按指定精度输出)。

P)类ostream的成员函数put用于输出指定数目的字符。

q)流操纵算子dec、oct、hex只对下一个输出整数有效。

r)在输出操作中,内存地址是以long类型表示的。

11.3用一条C++语句实现下述要求。

a)输出字符串”Enter your name:”。

b)设置一个标志,使科学记数法中的指数以及十六进制数中的宇母按大写的格式输出。

c)(S出char*类型变量smng的地址。

d)设置一个标志.以科学记数法显示浮点数。

e)输出int*类型变量integerPtr的地址。

f)设置一个标志,使得在输出整数时,八进制数和十六进制数显示出其基数。

g)输出float*类型变量fioatPtr所指向的值。

h)当所设置的域宽长度大于输出数据所需宽度时,用成员函数设置填充字符'*'。再写一条用流操纵算子实现该功能的语句。

i)用类ostream的函数put在一条语句中输出字符'O',、'K'。

j)从输入流中获取下一个字符,但并不提取它。

k)采用两种不同的方法,用类istream的成员函数get向char类型变量c输入一个字符。

l)输出并删除输入流中的下6个字符。

m)用类istream的成员函数read给char类型数组line输入50个字符。

n)读入10个字符到字符数组name中,当遇到分隔符,'.'时结束读操作,但并不删除输入流中的分隔符。另外再写一条语句完成上述功能,但需要删除输入流中的分隔符。

o)用类istream的成员函数gcount统计字符型数组line中的字符个数(line中的字符是通过调用类istream的成员函数read来输入的),然后根据统计的字符个数,用类ostream的成员函数write输出line中的字符。

p)分别编写两条语句,用成员函数和流操纵算子刷新输出缓冲区。

q)输出下列值:124、18.376、'Z'、1000000和"String"。

r)用成员函数输出当前浮点数的精度。

s)给int类型变量months输入一个整数值,给float类型变量percentageRate输入一个浮点数。

t)用流操纵算子输出1.92、1.925和1.9258,精度是三位小数位。

u)用流操纵算子分别按八进制、十六进制、十进制格式输出整数100。

v)按八进制、十六进制、十进制格式输出整数100,要求用同一个流操纵算子来改变整数的基数。

w)按右对齐方式、以10位域宽输出1234。

x)把字符读入字符数组line中,当遇到指定的分隔符'z'时或读取的字符个数达到限定值20(包括空字符)时,停止读取操作,该语句不从输入流中读取分隔符。

y)按域宽x、精度y(x、y为整型变量)输出double类型值87.4573。

11.4指出并纠正下列语句中的错误。

a) cout << "Value Of x <= y is:" << x <= y;

b)下面的语句要输出字符'c'的整数值:

cout << 'c';

c) cout << ""A string in quotes"";

11.5写出下面语句的输出结果。

a) cout<< "12345" << endl;
cout.width(5);
cout.fill('*');
cout << 123 << endl << 123;
b) cout << setw( 10 ) << setfill( '$' ) << 10000;
c) cout << setw( 8 ) << setprecision( 3 ) << 1024.987694;
d) cout << setiosflags( ios::showbase ) << oct << 99
<< endl << hex << 99;
c) cout << 100000 << endl
<< setiosflags(ios::showpos) << 100000;
f) cout << setw( 10 ) << setprecision( 2 ) <<
<< setiosflags(ios::scientific) << 444.93738;

自测练习答案

11.1

a)友元。b)ios::left、ios::right和ios::internal。c)流。d)setiosflags、e)iostream.h。

f)setf、unsetf g)strstream.h。h)iomanip.h。i)fstleam.h。j)endl。k)stdiostream.h。l)write。

m)ist蹲m)istream。 n)cerr、clog。o)ostream。P)<<。q)cin、cout、cerr和clog。 r)>>。s)ocl、hex、

dec。t)6位精度。u)ios::showpos。

11.2

a)正确。

b)不正确。重载的流插入运算符和流读取运算符不能用于所有的用户自定义类型。程序员必须为每一个用户自定义类型提供重载该运算符的运算符函数。

c)不正确。无参数的成员函数flags()只返回状态变量flags的当前值。

d)正确。

e)正确。

f)不正确。如果要重载流插入运算符,流插入运算符的两个参数必须是对ostream对象的引用和对自定义类型的对象的引用,返回对ostream对象引用。

g)正确。除非ios::skipws未置位。

h)不正确。C++的输入、输出特性是C++标准库的一部分,C++语言本身并不包括输入、输出和文件处理能力。

i)正确。

j)正确。

k)正确。

l)不正确。cin流通常是与计算机的键盘相连。

m)正确。

n)正确。

o)正确。

P)不正确。类ostream的成员函数put用于输出单个的字符。

q)不正确。流操纵算子dec、oct、hex用于设置输出整数的基数,直到下一次设置时或者在程序终止时才会改变。

r)不正确。在输出操作中,内存地址的默认显示方式是十六进制格式。如果要按long类型显示,则必须先转换成对应于long类型的值。

11.3

a) cout << "Enter your name:";
b) cout.setf(ios::uppercase);
c) cout << (void*)string
d) cout.setf(ios::scientific,ios::floatfield);
e) cout << integerPtr;
f) cout << setiosflags(ios::showbase);
g) cout << *floatPtr;
h) cout.fill('*');
cout<< setfill('*' );
i) cout.put('O').put('K');
j) cin.peek();
k) c = cin.get();
cin.get(c);
l) cin.ignore(6);
m) cin.read(line,50);
n) cin.get(name,1O,'.');
cin.getline(name,lO,'.');
O) cout.write(line, cin.gcount());
p) cout.flush();
cout << flush;
q) cout << 124 << 18.376 << 'z' << 1000000 <<"string";
r) cout << cout.precision();
s) cin >> months >> percentageRate;
t) cout << setprecision( 3 ) << 1.92 << '\t'
<< 1.925 << '\t' << 1.9258;
u) cout << oct << 100 << hex << 100 << dec << 100;
v) cout << 100 << setbase( 8 ) << 100 << setbase( 16 ) << 100;
w) cout << setw( 10 ) << 1234;
x) cin.get(line,20,'z');
y) cout << setw( x ) << setprecision( y ) << 87.4573;

11.4

a)不正确:运算符<<的优先级比<=高,语句求值不正确,因此编译器会报告错误。

纠正:在表达式x<=y两边加上括号。

b)不正确:不能像在c语言中那样在C++中直接输出字符的ASCII码值。

纠正:如果需要输出某一字符的ASCII值,必须先计算出它的ASCII值再输出,例如:

cout << int('C');

c)不正确:除非使用转义序列来加以区别,否则无法在字符串中输出双引号" "。

纠正:可用下面两种方法之一输出双引号" ":

cout << ' " ' << "A string in quotes" << ' " ';
cout << "\"A string in quotes\"";

11.5

a)12345

** 123

123

b)$$$$$10000

c)1024.988

d)0143

0x63

e)100000

+100000

f) 4.45e+02

练 习

11.6 用一条C++语句实现下述要求:

a)以左对齐方式输出整数40000,域宽为15。

b)把一个字符串读到字符型数组变量state中。

c)打印有符号数200和无符号数200。

d)将十进制整数100以0x开头的十六进制格式输出。

e)把字符读到数组s中,直到遇到字符'p'或读取的字符个数达到限定值10时终止读取操作。同时从输入流中读取分隔符并删除。

f)用前导O格式打印1.234,域宽为9。

g)从标准输入流中读取字符串"charecters",将其存储在字符数组s中。读取过程中去掉双引号,读取字符个数的最大限定值为50(包括空字符)。

11.7 编写一个程序,测试十进制、八进制、十六进制格式整数值的输入,分别按三种不同的基数输出。测试数据为10、O10、Ox10。

11.8 编写一个程序,用强制类型转换运算符把指针值转换成各种整数数据类型后,打印出指针值。哪种数据类型打印出奇怪的值哪种数据类型产生了错误

11.9 编写一个程序.分别用不同的域宽打印出整数12345和浮点数1.2345。当域宽小于数值的实际需要的域宽时会发生什么情况

11.10编写一个程序,将100.453627取整到最近似的个位、十分位、百分位,千分位和万分位,打印出结果。

11. 11编写一个程序,从键盘输入一个字符串,判断字符串的长度,然后以字符串长度的两倍作为域宽打印出该字符串。

11. 12编写一个程序,将华氏温度0度~212度转换为浮点型撮氏温度,浮点数精度为3。转换公式如下:

celsius=5.0/9.O * (fahrenheit - 32);

输出用两个右对齐列,摄氏温度前面加上正负号。

11.13在不同的编程语言中,字符串有的是用单引号' '括起,有的是用双引号" "括起。编写一个程序,读取三个不同的字符串suzy、”suzy”和'suzy'。看看单引号和双引号是被忽略了,还是被当作字符串的一部分一起读取了。

11.14图8. 3的程序为类PhoneNumber的输入和输出对象而重载了流读取运算符和流插入运算符。重新编写流读取运算符,使它能够检测下面的输入错误。注意,函数operator>>的代码全部需要重写。

a)输入一个完整的电话号码到一个字符数组中,检测输入的字符总数,例如电话号码(800)555-1212的字符总数为14个。如果输入错误,用流成员函数clear设置ios::failbit位。

b)电话号码中的区号和局号不能以0或1打头。检测区号和局号的第一位,判断是否为 0或1,若是,则用流成员函数clear设置ios::failbit位。

c)区号的中间一位是0或1,检测中间位,判断是否为0或1,如果输入错误,则用流成员函数clear设置ios::failbit位。如果输入正确,即ios::failbit位为0,则把电话号码的三个部分分别复制到对象PhoneNumber的成员areacode、exchange和line中。在主程序里,如果置位ios::failbit,则程序打印出一条出错消息.并且不打印电话号码而结束运行。

11.15 编写完成下列要求的程序:

a)建立用户自定义类Point,该类包含private整数数据成员xCoordinate和yCoordinate,并在类中声明了重载的流插入和流读取运算符函数为其友元。

b)定义流插入和流读取运算符函数。流读取运算符函数判断输入的数据是否合法,如果是非法数据,则置位ios::failbit以指示输入不正确。发生错误后,流插入运算符函数不显示Point的对象(点)的坐标信息。

c)编写函数main,用重载的流插入运算符和流读取运算符测试自定义类Point的输入和输出。

11. 16编写完成下列要求的程序:

a)建立用户自定义复数类Complex,类中包括private整数数据成员real和imaginary,并声明了重载的流插入和流读取运算符函数为其友元。

b)定义流插入和流读取运算符函数。流读取运算符函数判断输入的数据是否合法,如果是非法数据,则置位ios::failbit以指示输入不正确。必须按以下格式输入:

3 + 8i

c)数据可为整数或负数,还可以只给其中一个数赋值。未给出的数值,由相应的数据成员设置为0。当发生输入错误时,流插入运算符不显示该复数值。输出格式与上述的输入格式相同,对于为负的虚部要打印出负号。

d)编写函数main,用重载的流插入运算符和流读取运算符测试自定义类Complex的输入和输出。

11.17用for结构为ASCII字符集中ASCII码值从33—126的字符打印出一张ASCII码表。要求输出十进制值、八进制值、十六进制值和ASCII码值,并在程序中使用流操纵算子dec、oct和hex。

11. 18编写一个程序,用成员函数getline和带三个参数的成员函数get输入带有空字符的字符串。get函数不读取分隔符,分隔符仍保留在输入流中,并让getline从输入流中读取并删除分隔符。把未读取的字符留在输入流中会发生什么情况

11. 19编写一个程序,建立用户自定义流操纵算子skipwhite以跳过输入流中的前导空白字符。

该流操纵算子使用ctype.h函数库中的isspaee函数测试输入的字符是否是空白字符。要求用istream的成员函数get来读取每一个字符,当遇到一个非空白字符时,流操纵算子skipwhite把该字符放回到输人流中,返回对istream对象的引用。

建立一个main函数,测试自定义流操纵算子(在main函数中清除ios::skipws标志位,以保证流读取运算符无法自动跳过空白字符)。然后输入一个以空白字符开头的字符,对流操纵算子进行测试,读取完毕之后,输出所读取的字符以证实空白字符确实未被输入。