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,否則正常輸出。