1.输入问题
有的题在输入时就需要特别注意,比如
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
这种情况下就需要接收空格,接受空格可以采用getchar(),getchar()是把用户输入回车键之前输入的所有字符存到缓冲区然后从缓冲区一个字符一个字符的读取,这样就非常适合那种统计不同字符个数的问题(特别是和map一起使用的时候),它的不足之处在于,那就是不能处理两个字符在一起的组合字符,比如:
输入样例:
[╮][╭][o][~\][/~] [<][>]
[╯][╰][^][-][=][>][<][@][⊙]
[Д][▽][_][ε][^] ...
4
1 1 2 2 2
6 8 1 5 5
3 3 4 3 3
2 10 3 9 3
输出样例:
╮(╯▽╰)╭
<(@Д=)/~
o(^ε^)o
Are you kidding me? @\/@
形如~\,~/组合到一起的表情使用getchar()是不能组合到一起的,也只能是分为~,/来处理,因此舍弃使用这个方法。
那么采用string存储的话,如果
string str;
cin>>str;
是无法接收空格的,这时候就需要使用getline(),(需要包含头文件#include “string”)
String str;
getline(cin,str);
cin.getline()与getline()的作用类似,但是cin.getline()可以不存储在string型数据内,比如:
char ch[210];
cin.getline(ch,200);
所以,到现在为止有三种接收空格的函数:
(1)getchar()
这个函数的优势在于对输入的单个字符进行处理,(或者说它着重于一个一个读取的过程)比如统计一列字符串中不同字符的个数。如果需要存储这些字符,可以存储到一个char型数组或者string内。
(2)getline()
此函数着重于接收含有空格的字符串并将字符串存储到一个string中。
(3)cin.getline()
此函数着重于接收含有空格的字符串并将字符串存储到一个char型数组中。
特别的,如果在使用getline()和cin.getline()之前已经使用过cin输入数据,记得要清空流。清空的方法如下:
(1)getline()
Int a;
string str;
cin>>a;
getchar();
getline(cin,str);
(2)cin.getline()
int a;
char ch[210];
cin >> a;
cin.ignore(numeric_limits <streamsize> ::max(), '\n');
cin.getline(ch,200);
2.输出问题
输出要比输入的情况简单一些,要特别注意题目中“在一行中输出”,“行末不得有多余空格”之类的字眼,空格换行的缺少或多余往往导致格式错误。那么,剩下的就是宽度,对齐,补位,小数点设定的问题:
(1)输出对齐
输出对齐有两个方面,一是输出宽度,一是左对齐还是右对齐。
在C++里面,默认是右对齐,可以通过cout.setf(std::ios::left)调整为左对齐,而且这种调整是全局的,一次设置,后面都有效。
(2)宽度设置
对于输出宽度的设置(使用cout.width(int i)设置)是一次性的,只影响紧随其后的一次输出。
例如:
cout.width(5);
cout<<a<<b;
只有a的输出宽度是5,b就不是,因为cout.width(5)只影响紧随其后的一次输出。
(3)补位
补位一般是和宽度设置一起使用的,同样,他们都只对一次输出起作用。比如:
int a;
cin>>a;
cout.width(5);
cout.fill(‘0’);
cout<<a;
当a输入是3时,输出即为 00003
(4)小数点设置
需要包含头文件 “iomanip”
#include “iomanip”
cout<<fixed<<setprecision(2)<<a;
这样a就是保留两位小数了,其实...有的题在这里还是有坑,比如:
有的题特殊是特殊在它允许有负值的出现,进而导致了在小数的保留取舍方面的问题。
在保留两位小数时,坑主要是在比如当P的值为-0.0023的时候,取两位小数,则得到的值为-0.00,按照题意此时应该输出0.00才行,考虑到若P在-0.005~0之间,则会四舍五入到-0.00,
所以当0.005
<0,输出0.00,否则正常输出。