在 APCS 的每一題都需要用到輸入輸出
把基本的 Standard input / output 學好非常重要!
C input / output
#include <cstdio>
int x;
scanf("%d", &x); // 變數前面要加上 & 才會讀進去!
printf("%d\n", x);
C++ input / output
#include <iostream>
using namespace std;
int x;
cin >> x;
cout << x << '\n';
string s;
cin >> s;
以上提到的方法只能一次讀進一個變數,遇到空格時就會停下來
如果想要一次讀進一整行的話就需要用到其他的函式
C
char s[256];
cin.getline (s, 10); // 10 是想要輸入的長度
C++
string s;
getline(cin, s);
而在一個程式當中如果要同時用到 cin 和 getline,必須要在 cin 過後先在 getline 一次把緩衝區清空 (詳細細節可以到這個網站看),才可以讀到下一行的字串
string n;
cin >> n;
string s;
getline(cin, s);
getline(cin, s); // 這邊才可以真正讀到
再來是遇到小數點的情況,可以利用程式內建的方法控制要輸出小數點後幾位
C
float x;
printf("%.2f\n", x); // 輸出小數點後兩位
C++
#include <iomanip>
cout << fixed << setprecision(2) << x << '\n'; // 輸出小數點後兩位
提醒:
- 記得在每個程式最後輸出後輸出一個換行,避免會有多餘輸出的字!
- 換行也可以輸出 std::endl 替代,endl 會清理緩衝,筆者建議都用 ‘\n’ 就好,輸出的效率會比較快
- 在使用 cin, cout 的時候可以加入輸入輸出優化,比較不會因為輸入輸出 TLE (注意加了這兩行就不能再使用 scanf, printf 及其他 c-style input/output)
int main(){
ios_base::sync_with_stdio(0); // 優化
cin.tie(0); // 優化
int x;
cin >> x;
cout << x << '\n';
}
最後,各位應該常常需要輸出一個陣列,陣列元素之間要輸出空格,最後一個要輸出換行吧
這邊有一個很簡潔的寫法供參考
for(int i = 0;i < n;i++){
cout << a[i] << " \n"[i == n-1];
}
在 i == n-1,也是最後一個的時候,[]裡面會是 1因為條件達成,所以會輸出前一個字串 index 1 的字元,也就是 “\n”,而其他的時候因為 [] 裡面都是 0 ,都會輸出空格!
基本上 APCS 所需要的輸入輸出以上提到的技巧就很夠用了
考試提醒:
- 注意題目規定的輸入輸出格式,尤其是換行的部分,有可能因為沒有換行而被系統判斷錯誤喔!
- 在 code 出 bug 的時候,可以適時在 code 中間 cout / printf 看看 code 是在哪裡出錯
- 字元大小寫有差別,要注意題目要求的大小寫