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

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

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

的程序用成员函数setf设置showpoint标志,从而控制了浮点数的尾数零和小数点的输出。 i // Fig. 3.21: fig11_21.cpp

2 // Controlling the printing of trailing zeros and decimal 3 // points for floating-point values. 4 #include 5 #include 6 #include 7

8 int main() 9 {

10 cout << \11 << \12 << \13 << \

14 << \15 cout.setf( ios::showpoint );

16 cout << \17 << \

18 << \19 return 0; 2O }

输出结果:

Before setting the ios::showpolnt flag 9.9900 prints as: 9.99 9.9000 prints as: 9.9 9.9000 prints as: 9

After setting the ios::showpoint flag 9.9900 prints as: 9.99000 9.9000 prints as: 9.90000 9.0000 prints as: 9.00000

图 3.21 控制浮点数的尾数零和小数点的输出

3.7.3 对齐(ios::left、ios::right、ios::internal)

left标志可以使输出域左对齐并把填充字符放在输出数据的右边,right标志可以使输出域右对齐并把填充字符放在输出数据的左边。填充的字符由成员函数fill或参数化的流操纵算子setfill指定。图3.22用流操纵算子setw、setiosflags、reseticsfiags以及成员函数serf和unsetf控制整数值在域宽内左对齐和右对齐。 1 // Fig. 3.22: fig11_22.cpp

2 // Left-justification and right-justification.

-51-

3 #include 4 #include 6 int main() 7{

8 int x = 12345; 9

10 cout << \

11 << setw(10) << x << \12 << \13

14 cout.setf( ios::left, ios::adjustfield );

15 cout << x << \16 cout.unsetf( ios::left ); 17 cout << setw( 10 ) << x

18 << \TORS\19 << \20 << setw( 10 ) << setiosflags( ios::left ) << x 21 << \22 << setw( 10 ) << resetiosflags( ios::left ) 23 << x << endl; 24 return 0; 25 }

输出结果:

Default is right justified: 12345

USING MEMBER FUNCTIONS Use setf to set ios::left: 12345

Use unsetf to restore default: 12345

USING PARAMETERIZED STREAM MANIPULATORS Use setiosflags to set ios::left: 12345

Use resetiosflags to restore default: 12345

图 3.22 左对齐和右对齐

internal标志指示将一个数的符号位(设置了ios::showbase标志时为基数,见3.7.5节)在域宽内左对齐,数值右对齐,中间的空白由填充字符填充。left、right和internal标志包含在静态数据成员ios::adjustfield中。在设置left、right和internal对齐标志时,setf的第二个参数必须是ios::adjustfield,这样才能使serf只设置其中一个标志(这三个标志是互斥的)。图3.23中的程序用流操纵算子setiosflags和setw指定中间的空白。注意,ios::showpos标志强制打印了加号。

-52-

1 // Fig. 3.23: figll_23.cpp

2 // Printing an integer with internal spacing and 3 // forcing the plus sign. 4 #include 5 #include 6

7 int main() 8 {

9 cout << setiosflags( ios::internal | ios::showpos ) 10 << setw( 10 ) << 123 << endl; 11 return O; 12 }

输出结果: + 123

图 3.23 打印中间带空白的整数并强制输出加号

3.7.4 设置填充字符(fill、setfill)

成员函数fill设置用于使输出域对齐的填充字符,如果不特别指定,空格即为填充字符。fill函数返回以前设置的填充字符。图3.24中的程序演示了使用成员函数fill和流操纵算子,setfill来控制填充字符的设置和清除。 1 // Fig. 3.24: fig11_24.cpp

2 // Using the fill member function and the setfill 3 // manipulator to change the padding character for 4 // fields larger than the values being printed. 5 #include 6 finclude 7

8 int main() 9 {

10 int x = 10000; 11

12 cout << x << \13 << \14 << \15 cout.setf( ios::showbase );

16 cout << setw( 10 ) << x << '\\n'; 17 cout.setf( ios::left, ios::adjustfield ); 18 cout << setw( 10 } << x << '\\n';

19 cout.serf( ios::internal, ios::adjustfield ); 20 cout << setw( 10 ) << hex << x;

-53-

21

22 cout << \23 cout.setf( ios::right, ios::adjustfield ); 24 cout.fill( '*' );

25 cout << setw( 10 ) << dec << x << '\\n'; 26 cout.setf( ios::left, ios::adjustfield );

27 cout << setw( 10 ) << setfill( '%' ) << x << '\\n'; 28 cout.setf( ios::internal, ios::adjustfield );

29 cout << setw( 10 ) << setfill( '^' ) << hex << x << endl; 30 return 0; 31 }

输出结果:

10000 printed as int right and left justified and as hex with internal justification. Using the default pad character (space): l0000 10000

0x2710

Using various padding characters: *****10000 10000%%%%%

图 3.24 用fill和setfill为实际宽度小于域宽的数据改变填充字符

3.7.5 整数流的基数:(ios::dec、ios::oct、ios::hex、ios::showbase)

静态成员ios::basefield(在setf中的用法与ios::adjustfield类似)包括ios::oct、ios::hex和ios::dec标志位,这些标志位分别指定把整数作为八进制、十六进制和十进制值处理。如果没有设置这些位,则流插入运算默认整数为十进制数,流读取运算按整数提供的方式处理数据(即以零打头的整数按八进制数处理,以0x或0X打头的按十六进制数处理,其他所有整数都按十进制数处理)。一旦为流指定了特定的基数,流中的所有整数都按该基数处理,直到指定了新的基数或程序结束为止。

设置showbase标志可强制输出整数值的基数。十进制数以通常方式输出,输出的八进制数以0打头,输出的十六进制数以0x或0X打头(由uppercase标志决定是0x还是0X,见3.7.7节)。图3.25中的程序用showbase标志强制整数按十进制、八进制和十六进制格式打印。 1 // Fig. 3.25: figll_25.cpp

2 // Using the ios::showbase flag 3 #include 4 #include 5

-54-

6 int main() 7 {

8 int x = 100; 9

10 cout << setiosflags( ios::showbase )

11 << \12 << x << '\\n'

13 << oct << x << '\\n' 14 << hex << x << endl; 15 return 0; 16 }

输入结果:

Printing integers preceded by their base: I00 0144 0x64

图 3.25 使用ios::showbase标志

3.7.6 浮点数和科学记数法(ios::scientific、ios::fixed)

ios::scientific和ios::fixed标志包含在静态数据成员ios::floatfield中(在setf中的用法与ios:: adjustfield和ios::basefield类似)。这些标志用于控制浮点数的输出格式。设置scientific标志使浮点数按科学记数法输出,设置fixed标志使浮点数按照定点格式输出,即显示出小数点,小数点后边

有指定的位数(由成员函数precision指定)。若没有这些设置,则浮点数的值决定输出格式。 调用cout.setf(O,ios::floatfield)恢复输出浮点数的系统默认格式。图3.26中的程序示范了以定点格式和科学记数法显示的浮点数。 1 // Fig. 3.26: flg11_26.cpp

2 // Displaying floating-point values in system default, 3 // scientific, and fixed formats. 4 #include 5

6 int main() 7 {

8 double x = .001239567, y = 1.946e9; 9

10 cout << \11 << x << '\\t' << y << '\\n';

12 cout.setf( ios::scientific, ios::floatfield ); 13 cout << \14 << x << '\\t' << y << '\\n';

-55-

7147t1zw3j3ef8l93ts6
领取福利

微信扫码领取福利

微信扫码分享