OJ的輸入輸出總結C++版

OJ的輸入輸出總結C++版

最近在找實習,做筆試的時候,有時候連輸入輸出都要折騰很久,就大大降低了效率,總不能死在了輸入輸出上吧!自己平時熟悉C++,總結下C++常見的輸入輸出,希望下次筆試輸入輸出不再是問題:-)

OJ(Online Judge)的工作原理是我們提交程序,後臺編譯程序,然後執行編譯好的程序,將結果保存在文件中,然後對比文件比較用戶的輸出和標準答案,然後得出通過率。

OJ模式的題目,程序需要stdin(標準輸入)讀取輸入,然後stdout(標準輸出)來打印結果,舉個例子,你可以使用c++的cin來讀取輸入,然後使用c++的cout來輸出結果。如果OJ一次處理多個case,代碼需要循環處理,一般通過while循環來處理多個case。

常見的輸入格式:

  • 不知道輸入數據的組數
  • 知道輸入數據的組數
  • 字符串的輸入

不知道輸入數據的組數

[編程題]a+b

計算a+b的和

每行包含兩個整數a和b

對於每行輸入對應輸出一行a和b的和

輸入

1 5

輸出

6

#include <iostream>
using namespace std;
int main() {
    int a,b;
    while(cin >> a >> b)//注意while處理多個case
        cout << a+b << endl;
    return 0;
}

知道輸入數據的組數

先輸入一個組數n,然後再循環讀取n組數據。

#include <iostream>
using namespace std;
int main() {
    int n; // 數據的組數
    cin >> n; // 讀取組數
    for(int i=0; i<n; ++i){
        int a, b;
        cin >> a >> b;
        cout << a+b <<endl;
    }
    return 0;
}

字符串的輸入處理

因爲OJ最終只比較文件,就不用保存所有輸入,可以讀一組數據計算一組數據。

當讀取字符串的時候需要注意,cin不能讀取空白字符,比如空格,如果遇到空格則會直接終止字符串。

#include <iostream>
#include <string>
using namespace std;
int main() {
	string s;
	cin >> s; // 讀到空白就結束當前的字符串
	cout << s;
	return 0;
}

運行的結果:

abc 123
abc請按任意鍵繼續. . .

如果要讀取整行字符串,可以使用getline()cin.getline()這兩個函數,兩個函數都是遇到定界符,則結束這行的字符串,定界符默認設置爲回車。兩個函數略有不同的是,getline()操作的對象是string,cin.getline()操作的對象的char數組。詳細的定義如下:

getline(),要使用這個函數需要包含頭文件<string>,

istream& getline(istream& is, string& str, char delim);
istream& getline(istream& is, string& str);
  • is:它是istream類的對象,告訴函數從何處讀取輸入流。
  • str:這是一個string字符串對象,從流中讀取輸入後,將輸入存儲在此對象中。
  • delim:這是定界字符,它告訴函數在達到該字符後停止讀取進一步的輸入。
  • 返回值:此函數返回值是與輸入參數is相同的輸入流。
#include <iostream>
#include <string>
using namespace std;
int main() {
	string s;
	getline(cin, s);
	cout << s;	
	system("pause");
	return 0;
}		

運行結果:

abc 123
abc 123請按任意鍵繼續. . .

cin.getline()函數讀取至新行結尾或直到達到最大限制的整行文本。函數定義如下:

// (buffer, stream_size, delimiter)
istream& getline(char*, int size, char='\n')

// The delimiter character is considered as '\n'
istream& getline(char*, int size)
  1. 提取字符直到定界符。

  2. 將字符存儲在緩衝區中。

  3. 提取的最大字符數爲size-1

#include <iostream> 
using namespace std; 
int main() 
{ 
    char str[20]; 
    cin.getline(str, 20); 
    cout << str; 
    return 0; 
}

運行結果:

no bug forever
no bug forever請按任意鍵繼續. . .

例子:

輸入爲9個數字,每個數字用逗號,分隔,將數字保存到一個一維數組中。

1,2,3,4,5,6,7,8,9

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void test() {
	string str;
	cin >> str; // 獲取整行數據
	vector<int> vec; // 將數字保存在數組中
	for (char& ch : str) {
		if (isdigit(ch)) vec.push_back(ch - '0'); // 如果是數字才保存,並且需要減去字符0
	}
	for (int& i : vec) {
		cout << i << ' ';
	}
}
int main() {
	test();
	system("pause");
	return 0;
}

運行結果:

1,2,3,4,5,6,7,8,9
1 2 3 4 5 6 7 8 9 請按任意鍵繼續. . .

參考文章

https://www.nowcoder.com/discuss/276

https://www.geeksforgeeks.org/getline-string-c/?ref=rp

https://www.geeksforgeeks.org/getline-function-character-array/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章