中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第七周 输入输出和模板 笔记 之 用流操纵算子控制输出格式

第七周 输入输出和模板
1.输入输出流相关的类
2.用流操纵算子控制输出格式
3.文件读写(一)
4.文件读写(二)
5.函数模板
6.类模板
7.类模板与派生、友元和静态成员变量

2.用流操纵算子控制输出格式

流操纵算子

控制输出的格式
使用流操纵算子需要 #include

控制整数进制的流操纵算子

流操纵算子dec,oct,hex,setbase分别设置为十进制、十进制、十六机制、任意进制的输出

int n = 10;
cout << n << endl;
cout << hex << n << “\n”
	<< dec << n << “\n”
	<< oct << n << endl;
输出结果:
10
a
10
12

控制浮点数精度的流操纵算子(precision,setprecision)

precision是ostream类的成员函数,其调用方式为:cout.precision(5);
setprecision 是流操作算子,其调用方式为:cout << setprecision(5); // 连续起作用,后面输出都是这个精度
它们的功能相同。浮点数输出最多6位有效数字。他们都可以在以下两种情况下使用:
(1)指定输出浮点数的有效位数(非定点方式输出时),是这个数的有效数字
(2)指定输出浮点数的小数点后的有效位数(定点方式输出时),是小数点后的有效数字,这时候不足就补零,超过就四舍五入。
其中,定点方式:小数点必须出现在个位数右边,小数点位置固定。
非定点方式:小数点并不一定在个位数右边,小数点位置不固定,可以是科学计数法1.23457e+006。
缺省的情况下默认是非定点方式。

例子1:缺省默认非定点方式,小数点位置不固定

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	double x = 1234567.89,y = 12.34567;
	int n = 1234567;
	int m = 12;
	cout << setprecision(6) << x << endl //缺省的情况下默认是非定点方式
	<< y << endl << n << endl << m;
}
输出:
1.23457e+006 //非定点方式,6位有效数字
12.3457
1234567
12

例子2:定点方式,指定精度,小数点位置固定

setiosflags(ios::fixed)或者fixed
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	double x = 1234567.89,y = 12.34567;
	int n = 1234567;
	int m = 12;
	cout << setiosflags(ios::fixed) << //以小数点位置固定的方式输出,也可以直接就用cout<<fixed<<…
	setprecision(6) << x << endl
	<< y << endl << n << endl << m;
}
输出:
1234567.890000
12.345670
1234567
12

例子3:定点方式,指定精度,小数点位置固定,随后取消小数点固定,还原成非定点方式

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	double x = 1234567.89;
	cout << setiosflags(ios::fixed) <<
	setprecision(6) << x << endl <<
	resetiosflags(ios::fixed) << x ; //取消以小数点位置固定的方式输出
}
输出:
1234567.890000
1.23457e+006

设置域宽的流操纵算子(setw,width)

设置域宽(setw,width),两者功能相同,width是成员函数,setw是流操作算子,调用方式不同:
cin >> setw(4); 或者 cin.width(5);
cout << setw(4); 或者 cout.width(5);
宽度设置有效性是一次性的,在每次读入和输出之前都要设置宽度。

例子:

int w = 4;
char string[10];
cin.width(5);//包含了结尾的'\0'
while(cin >> string){
	cout.width(w++);
	cout << string << endl;
	cin.width(5);//宽度设置有效性是一次性的,在每次读入和输出之前都要设置宽度。
}
输入:
1234567890
输出:
1234
 5678(前面有个空格,因为这时输出宽度是5,cin进来的宽度是4,就在前面补个空格)
    90(前面有4个空格,因为这时输出宽度是6,cin进来的宽度是2,就在前面补4个空格)

综合例子:

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
	int n = 141;
	//1) 分别以十六进制、十进制、八进制先后输出 n
	cout << "1) " << hex << n << " " << dec << n << " " << oct << n << endl;
	double x = 1234567.89,y = 12.34567;
	//2) 保留5位有效数字
	cout << "2) " << setprecision(5) << x << " " << y << " " << endl;
	//3) 保留小数点后面5位
	cout << "3) " << fixed << setprecision(5) << x << " " << y << endl ;
	//4) 科学计数法输出,且保留小数点后面5位
	cout << "4) " << scientific << setprecision(5) <<x << " " << y << endl ;
	//5) 非负数要显示正号,输出宽度为12字符,宽度不足则用'*'填补
	cout << "5) " << showpos << fixed << setw(12) << setfill('*') << 12.1 << endl;
	//6) 非负数不显示正号,输出宽度为12字符,宽度不足则右边用填充字符填充
	cout << "6) " << noshowpos << setw(12) << left << 12.1 << endl;
	//7) 输出宽度为12字符,宽度不足则左边用填充字符填充
	cout << "7) " << setw(12) << right << 12.1 << endl;
	//8) 宽度不足时,负号和数值分列左右,中间用填充字符填充
	cout << "8) " << setw(12) << internal << -12.1 << endl;
	cout << "9) " << 12.1 << endl;
	return 0;
} 
输出:
1) 8d 141 215
2) 1.2346e+006 12.346
3) 1234567.89000 12.34567
4) 1.23457e+006 1.23457e+001
5) ***+12.10000
6) 12.10000****
7) ****12.10000
8) -***12.10000
9) 12.10000

其他常用算子:
fixed:等价于 setiosflags(ios::fixed),设置为定点方式
scientific:设置一定要用科学计数法输出
showpos:非负数要显示正号
noshowpos :非负数不显示正号
setfill(‘字符’):搭配setw(n)使用,宽度不足则用’*'填补
left :左对齐,搭配setw(n)使用,宽度不足则右边用setfill(‘字符’)填充字符填充
right:右对齐,搭配setw(n)使用,宽度不足则左边用setfill(‘字符’)填充字符填充
internal :宽度不足时,负号和数值分列左右,搭配setw(n)中间用填充字符填充
以上都是设置一次后,后面都其作用,直到取消,只有setw(n)是一次性的每次输出都要设置。

用户自定义的流操纵算子

其实就是一种函数,返回值和参数都是ostream的引用,

ostream &tab(ostream &output){
	return output << '\t';
}
cout << “aa” << tab << “bb” << endl;
输出:aa  bb(中间是个制表符'\t'

为什么可以?
因为 iostream 里对 << 进行了重载(成员函数)ostream & operator<<( ostream & ( * p ) ( ostream & ) ) ;
该函数内部会调用p所指向的函数,且以 *this 作为参数。
hex 、dec 、oct 都是函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值