【C++】學習筆記二十七——讀取數字的迴圈
阿新 • • 發佈:2019-01-31
假設要將一系列數字讀入到陣列中,並允許使用者在陣列填滿之前結束輸入。一種方法是利用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()來讀取行尾之前的所有輸入,從而刪除這一行中的錯誤輸入。另一種方法是讀取到下一個空白字元,這樣將每次刪除一個單詞,而不是一次刪除整行。最後程式告訴使用者,應輸入一個數字。