Try   HackMD

Ch8 處理不同輸入規則

搭配green judge解題系統
Special thanks to 台中女中sagit老師 <(_ _)>

上一章:雜項:其他資料型態、函式庫、格式化輸出
下一章:陣列
回目錄:國立科學園區實驗中學C++程式語言自學講義

這篇沒有新語法

回顧我們目前寫過的程式
都只能做一次性的運算

例如算加法的程式
每次輸入完2個數字,看到電腦算出的相加結果後,程式就結束了
如果想要再算另一組加法,就要重新執行程式

如果有很多組數字想要相加,那就要重新執行好幾次程式

為了要解決這個問題
我們可以使用「迴圈」來讓程式重複執行

以下提供幾種常見的方法

N行版

一開始就先告訴你總共有幾組輸入

【例題】

輸入一個n,代表有n組「A和B」
接下來會輸入n次的「A、B」,請每次都將AB相加後輸出

題目說會先給一個n來表示要做幾次運算
所以先讀入一個n

int n; cin >> n;

接下來要創造一個會被重複n次的迴圈
迴圈裡面讀入A和B,並將相加後的結果輸出

要讓迴圈固定跑n次
有兩種做法

一種用while

while(n--) { }

另一種則是用for

int i; for(i=0;i<n;i++){ }

只要把讀入A和B的程式放在迴圈裡就可以了
這邊提供其中一種範例

int n; int A, B; cin >> n; while(n--) { cin >> A >> B; cout << A+B << endl; }

【學生練習題】

0尾版

一開始並不知道總共有幾組輸入
而是用輸入某個特定的值來表示「結束了」

【例題】

輸入資料有多組,每一組有兩個正整數 A、B
當A和B皆為0時,代表輸入結束,不需要對這組做處理

一樣可以用while迴圈來解決
這邊提供兩種範例

1.在迴圈的最後面讀入下一次的A和B

int n; int A, B; cin >> A >> B; while(A!=0 || B!=0){ cout << A+B << endl; cin >> A >> B; }

2.利用break (break的效果為直接離開迴圈)

int n; int A, B; while(1){ //1代表的是「一定符合」,所以寫while(1)。其實把1換成任何數字都可以,只有0是代表「一定不符合」 cin >> A >> B; if(A==0&&B==0) break; //如果A和B皆為0,直接離開迴圈 cout << A+B << endl; }

【學生練習題】

EOF版

一開始並不知道總共有幾組輸入
而是用EOF鍵表示「結束了」

EOF鍵就是鍵盤上的control+Z

這樣的程式有點奇葩
直接上範例

int n; int A, B; while(cin>>A>>B) { cout<<A+B<<endl; }

如果你有輸入A和B,那麼cin>>A>>B這段程式就會被當成「是」
如果你是按下鍵盤的control+Z,這段程式就會被當成「否」
所以直接將這段程式當成條件判斷的用途
放在while迴圈的檢查處即可

【學生練習題】

Case版

一開始會先有一個數字n代表接下來有幾組輸入
對於每一組輸出
都要輸出那是第幾筆資料

【例題】

輸入一個數字n,代表接下來有幾組輸入
接下來有n行,每一行都是A和B
對於每一行的A和B,輸出
Case #i:#(A+B)
其中#i代表的是那是第幾行
#(A+B)則是A和B相加後的結果
例如輸入
3
1 2
3 4
5 6
則輸出
Case 1:3
Case 2:7
Case 3:11

這題因為需要輸出現在是第幾組
因此需要計數器來記錄現在到第幾組了
所以用for迴圈較為合適

以下為本題範例

int n; int A, B; int i; cin >> n; for(i=1;i<=n;i++){ cin >> A >> B; cout << "Case " << i << ": "; cout << A+B << endl; }

【學生練習題】

~恭喜你完成基礎題庫~

上一章:雜項:其他資料型態、函式庫、格式化輸出
下一章:陣列
回目錄:國立科學園區實驗中學C++程式語言自學講義