1. 程式人生 > >【C++】學習筆記二十七——讀取數字的迴圈

【C++】學習筆記二十七——讀取數字的迴圈

  假設要將一系列數字讀入到陣列中,並允許使用者在陣列填滿之前結束輸入。一種方法是利用cin:

int n;
cin >> n;

  如果使用者輸入一個單詞而不是數字,將發生:

  • n的值保持不變;
  • 不匹配的輸入將被保留在輸入佇列中;
  • cin物件中的一個錯誤標記被設定;
  • 對cin方法的呼叫將返回false。

      返回false意味著可以用非數字輸入來結束讀取數字的迴圈。非數字輸入設定錯誤標記意味著必須重置該標記,程式才能繼續讀取輸入。clear()重置輸入錯誤標記,同時也重置檔案尾(EOF)。輸入錯誤和檔案尾都會導致cin返回false。
      

程式6.13

#include<iostream>
const int Max = 5; int main() { using namespace std; double fish[Max]; cout << "Please enter the weights of your fish.\n"; cout << "You may ennter up to " << Max << " fish <q to terminate>.\n"; cout << "fish #1: "; int i = 0; while
(i<Max && cin >> fish[i]) { if (++i < Max) cout << "fish #" << i + 1 << ": "; } double total = 0.0; for (int j = 0; j < i; j++) total += fish[j]; if (i == 0) cout << "No fish\n"; else cout
<< total / i << " = average weight of " << i << " fish\n"; cout << "Done.\n"; system("pause"); return 0; }

這裡寫圖片描述

  
程式6.14

#include<iostream>
const int Max = 5;
int main()
{
    using namespace std;
    //get data
    int golf[Max];
    cout << "Please enter your golf scores.\n";
    cout << "You must enter " << Max << " rounds.\n";
    int i;
    for (i = 0; i < Max; i++)
    {
        cout << "round #" << i + 1 << ": ";
        while (!(cin >> golf[i])) {
            cin.clear();
            while (cin.get() != '\n')
                continue;
            cout << "Please enter a number: ";
        }
    }
    //calculate average
    double total = 0.0;
    for (i = 0; i < Max; i++)
        total += golf[i];
    //report results
    cout << total / Max << " = average score " << Max << " rounds\n";
    system("pause");
    return 0;
}

這裡寫圖片描述
  
  在程式6.14中,關鍵部分如下:
  

        while (!(cin >> golf[i])) {
            cin.clear();
            while (cin.get() != '\n')
                continue;
            cout << "Please enter a number: ";
        }

  如果使用者輸入88,則cin表示式將為true,因此將一個值放到陣列中;而表示式!(cin>>golf[i])為false,因此內部迴圈結束。然而,如果使用者輸入must i?,則cin表示式將為false,因此不會將任何值放到陣列中;而表示式!(cin>>golf[i])將為true,因此進入內部的while迴圈。該迴圈的第一條語句使用clear()來重置輸入,如果省略這條語句,程式將拒絕讀取輸入;接下來,程式在while迴圈中使用cin.get()來讀取行尾之前的所有輸入,從而刪除這一行中的錯誤輸入。另一種方法是讀取到下一個空白字元,這樣將每次刪除一個單詞,而不是一次刪除整行。最後程式告訴使用者,應輸入一個數字。