- 算法竞赛宝典(第一部):语言及算法入门
- 张新华
- 1005字
- 2021-03-19 19:27:44
数据输入输出
C++的输入输出功能是由函数来实现的,例如putchar(输出字符),getchar(输入字符),cin(输入流),cout(输出流)等。
putchar函数(字符输出函数)的作用是向终端输出一个字符。例如:
putchar(c); //输出字符变量C的值
请看下例:
1 //putchar函数的使用 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 char a='A',b='B',c='C'; 8 putchar(a); 9 putchar(b); 10 putchar(c); 11 system("pause"); 12 return 0; 13 }
运行结果为ABC。
我们可以用putchar()函数输出控制字符,如putchar('\n')输出一个换行符。
还可以输出其他转义字符,如:
putchar (' \101 '); //输出字符'A' putchar (' \\ '); //输出斜杠 putchar (' \015 '); //输出回车,不换行,使输出的当前位置移到本行开头
getchar函数(字符输入函数)的作用是从终端输入一个字符,其一般形式为getchar()。例如:
1 //使用getchar函数输入单个字符 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 char c; 8 c=getchar(); 9 putchar(c); 10 system("pause"); 11 return 0; 12 }
在运行时,如果从键盘输入字符'a'并按回车键,就会在屏幕上看到输出的字符'a'。
请注意:getchar()只能接收一个字符,接收的字符可以赋给字符变量或整型变量也可以不赋给任何变量。如:
putchar(getchar());
puts()
向屏幕输出字符串并换行。
gets()
从键盘获得字符串,回车不算字符串。
某些情况下,程序需要以八进制或十六进制数的形式输出结果。C++提供了简单的实现方法:只要在输出流中输出操作符dec(十进制)、oct(八进制)或hex(十六进制)即可,下面的程序分别以十进制、八进制、十六进制输出n的值。
1 //进制转换 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int n=314; 8 cout<<"十进制: "<<dec<<n<<endl; 9 cout<<"八进制: "<<oct<<n<<endl; 10 cout<<"十六进制:"<<hex<<n<<endl; 11 system("pause"); 12 return 0; 13 }
表1.6是常用的I/O流类库操作符,注意,设置一些特殊的格式时,我们还需使用I/O流类库提供的操纵符。使用操纵符时,首先必须在源程序的开头包含iomanip。
表1.6
一旦使用了这些进制操作符,它们的作用域将一直持续到程序结束,或者遇到另一个进制操作符为止。
C++提供的setw操作符可以指定每个数值占用的宽度。为了使用setw,程序必须包括头文件iomanip,setw操作符只对紧跟着它的数值有效。如果要为多个数值设定宽度,必须多次使用setw操作符。
分析以下程序的执行结果。
1 //setw操作符的使用 2 #include <iostream> 3 #include <iomanip> 4 using namespace std; 5 6 int main() 7 { 8 double a=234.34; 9 cout<<setw(10)<<1234567890<<endl; 10 cout<<setw(4)<<a<<endl; 11 cout<<setw(6)<<a<<endl; 12 cout<<setw(8)<<a<<endl; 13 cout<<setw(10)<<a<<endl; 14 system("pause"); 15 return 0; 16 }
使用right或left可以控制字符串向左靠齐还是向右靠齐。例如:
cout<<left;
C++提供的setprecision操作符可以控制浮点数的输出精度,其中的参数代表输出的浮点数的个数。为了使用该操作符,程序必须包括头文件iomanip。
分析以下程序的执行结果。
1 //setprecision用法 2 #include <iostream> 3 #include <iomanip> 4 using namespace std; 5 6 int main() 7 { 8 double a=234.1234567890; 9 cout<<a<<endl; 10 cout<<setprecision(4)<<a<<endl; 11 cout<<setprecision(5)<<a<<endl; 12 cout<<setprecision(6)<<a<<endl; 13 cout<<setprecision(7)<<a<<endl; 14 cout<<setprecision(8)<<a<<endl; 15 cout<<setprecision(9)<<a<<endl; 16 cout<<setprecision(15)<<a<<endl; 17 system("pause"); 18 return 0; 19 }
一旦使用了这些setprecision操作符,它的作用域将一直持续到程序结束,或者遇到另一个setprecision操作符为止。
单纯使用setprecision()函数,并不能精确控制小数点后保留多少位,而是将整数与小数加起来的位数,如果仅仅控制小数点后的位数,需加fixed函数。见下例:
1 //fixed函数的使用 2 #include <iostream> 3 #include <iomanip> 4 using namespace std; 5 6 int main() 7 { 8 float a=111.223333; 9 cout<<setprecision(6)<<fixed<<a<<endl; 10 system("pause"); 11 return 0; 12 }
C++提供的setfill操作符可以填充字符。为了使用该操作符,程序必须包括头文件iomanip。
分析以下程序的执行结果。
1 //setfill用法 2 #include <iostream> 3 #include <iomanip> 4 using namespace std; 5 6 int main() 7 { 8 double a=234.123; 9 cout<<a<<endl; 10 cout<<setw(10)<<setfill('*')<<setprecision(4)<<a<<endl; 11 cout<<setw(10)<<setprecision(10)<<a<<endl; 12 system("pause"); 13 return 0; 14 }
也可以直接使用cout的相关函数如precision、width、fill和put等函数。
分析以下程序的运行结果。
1 //输出控制 2 #include <iostream> 3 #include <iomanip> 4 using namespace std; 5 6 int main() 7 { 8 double a=234.123456; 9 cout<<a<<endl; 10 cout.precision(7); 11 cout<<a<<endl; 12 cout.width(8); 13 cout<<a<<endl; 14 cout.fill('*'); 15 cout.width(10); 16 cout.precision(5); 17 cout<<a<<endl; 18 system("pause"); 19 return 0; 20 }
put函数用于输出字符,put可以级联,如put('a').put('b')。
请看下面的程序:
1 //put级联 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 cout.put('C').put('+').put('+').put('\n'); 8 system("pause"); 9 return 0; 10 }
C++提供了输入流cin,可以利用输入流cin读取键盘输入的字符和数字等。我们可以使用I/O操作符控制输入的格式。
请看下面的程序:
1 //输入格式控制 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int a,b,c; 8 cout<<"a:";cin>>dec>>a; 9 cout<<"b:";cin>>oct>>b; 10 cout<<"c:";cin>>hex>>c; 11 cout<<"a="<<a<<endl; 12 cout<<"b="<<b<<endl; 13 cout<<"c="<<c<<endl; 14 system("pause"); 15 return 0; 16 }
cin提供了get成员函数从指定的数据流中输入一个字符,并返回这个字符作为函数调用的值。
请看下面的程序:
1 //get成员函数的使用 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 char c; 8 c=cin.get(); 9 cout<<"c:"<<c<<endl; 10 cout<<"ASCII:"<<(int)c<<endl; 11 system("pause"); 12 return 0; 13 }
cin提供了getline函数,其格式为:getline(字符串首地址,最大长度);用于将用户输入的字符串存放在“字符串首地址”指定的内存中,其最大长度不能超过“最大长度”指定的值。该函数的一个用处是可以读入一行带空格的字符串,当然gets()函数也能达到同样效果。
下面的程序是输入一个字符序列(最大长度不超过80)并输出:
1 //getline的使用 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 char a[80]; 8 cin.getline(a,80); 9 cout<<a<<endl; 10 system("pause"); 11 return 0; 12 }
我看附录中C语言的输入输出语句,即scanf和printf也完全可以完成以上的格式控制,而且还特别好用,速度也非常快。
建议在大批量读写数据时,使用C语言的输入输出语句。
【上机实践】 格式练习
编写一个程序,按以下格式输出数据,其中姓名部分宽度为8,左靠齐,第2列数据宽度为10,左靠齐,第3列数据格式宽度为10,右靠齐:
张三 345.5—— ***34345.4
李四 342.2—— *****123.5
刘强 556.6—— *343434.55