C++ Primer Plus p-189-6.14-cingolf.cpp

来源:互联网 发布:单片机编程要学什么 编辑:程序博客网 时间:2024/06/09 23:06

创建一个数组,记录五个数字,求平均值。并且程序可以判断输入是否为整型。

#include <iostream>using namespace std;const int Max = 5;int main(){    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:";        }    }    double total = 0.0;    for (i = 0; i<Max;i++)        total += golf[i];    cout << total/Max<<"= average score"<<Max<<" rounds\n";    return 0;}

输出结果
please enter your golf scores.
You must enter 5 rounds.
round #1: 23
round #2: 1
round #3: 44
round #4: 123
round #5: ewe
please enter a number:23
42.8= average score5 rounds

关键代码:

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

如果用户输入23,则cin表达式为true,因此将一个值放到数组中;而表达式!(cin>>golf[i])为flase,因此结束内部循环。
如果用户输入 ewe,则cin表达式将为false,因此不会将任何值放到数组中;而表达式!(cin>>golf[i])将为true,因此进入内部的while循环。该循环的第一条语句是用clear()方法重置输入,如果省略这条语句,程序将拒绝继续读取输入。接下来,程序在while循环中使用cin.get()来读取行尾之前的所有输入,从而删除这一行中的错误输入(对于cin.get(),能删除这一行的错误输入不是很理解)。另一种方法是读取到下一个空白字符,这样将每次删除一个单词,而不是一次删除整行。最后程序告诉用户,应该输入一个数字。


cin.clear()

cin.clear()默认参数为0,即无错误,正常操作。当我们输入英文字母’ewe’时,它的状态标识改为false,即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入。如果我们没有了cin.clear(),则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为false,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环。