调用函数实现输入成绩求平均,有几行代码看不懂,求指教

#include<iostream>
using namespace std;
const int max = 10;
int grade_in(double grade[],int limit);
void show(const double grade[],int n);
double grade_av(const double grade[],int n);
int main()
{
 double scores[max];
 int size=grade_in(scores,max);
 show(scores,size);
 if (size > 0)
 {
  cout << "Average Grade = "
   << grade_av(scores, size) << endl;
 }
 return 0;
}
int grade_in(double grade[],int limit)
{
 double temp;
 int i = 0;
 cout << "Enter your grade(enter a negetive to end)" << endl;
 for (i = 0; i < limit; i++)
 {
  cout << "Enter your grade #" << i + 1 << " : " << endl;
  cin >> temp;
  if (!cin)                   //
  {                          //
   cin.clear();              //这几句的作用是什么?删掉对程序运行结果没有影响
   while (cin.get() != '\n')//
    continue;               //
   cout << "Bad input;enter a number: ";
   break;
  }
  if (temp < 0)
   break;
  grade[i] = temp;
 }
 return i;
}
void show(const double grade[], int n)
{
 for (int i = 0; i < n; i++)
 {
  cout << "Score #" << i + 1 << " : " << grade[i] << endl;
 }
}
double grade_av(const double grade[], int n)
{
 double sum=0;
 int i = 0;
 for (i = 0; i < n; i++)
 {
  sum += grade[i];
 }
 double av;
 av = sum / n;
 return av;
}


xungeer29
浏览 1315回答 1
1回答

onemoo

我觉得这几行代码有问题。不过,我先说下关于 cin 的东西吧:你输入的内容都在输入流中。cin >> 会读取输入流中的内容并存入后面的变量中,当然是按照变量的类型来格式化输入流中的内容。那么如果类型不匹配呢?  比如你这里 cin >> temp 需要存入浮点类型的 tmp,可你输入的不是数字,这会怎么样?这会发生错误,cin 会在内部记录错误状态。一旦出错就无法再使用 cin 来读取输入了。错误状态可以通过调用 cin.clear() 来清除。  而且 cin 的状态默认可以作条件判断用。if (!cin) 这里就是判断 cin 是否出错。cin 错误时相当于 false,所以当 cin 出错时会执行 if 中语句。还有一点要说,当读取输入时出错,那些不正确的输入会原封不动地留在输入流中。还用 cin >> tmp 举例。如果你输入 123回车,那没问题,123 被 cin 从输入流中读取走了(并存入123.0到tmp)。 可如果你输入 ab回车,这就出错了! 但是 'a' 'b' '\n' 却会原封不动流在输入流中。那么一般处理输入出错可以这样:先清除掉 cin 的错误状态,保证可继续使用 cin 读取:调用 cin.clear() 即可。再处理掉输入流中留下的不正确的输入:这个代码里用循环调用 cin.get() 的方式来读取走它们。 解释一下,cin.get() 可以读取走输入流中的任意字符,并且返回读到的值。所以循环用 get() 来读...直到'\n' 就可以清掉输入流中上次回车之前的内容。那么这几行代码应该就是处理输入出错的情形的。如果你输入没出错,就不会执行这个 if,所以你没看到对结果有影响。但是!之所以说“应该”是因为我觉得它逻辑上有问题! 你可以对照我上面说的错误处理方式,看看这几行代码是不是无法实现这个目的?
打开App,查看更多内容
随时随地看视频慕课网APP