为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C C++
xungeer29 2017-10-18 10:38:34
#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; }
查看完整描述

1 回答

?
onemoo

TA贡献883条经验 获得超454个赞

我觉得这几行代码有问题。

不过,我先说下关于 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,所以你没看到对结果有影响。

但是!之所以说“应该”是因为我觉得它逻辑上有问题! 

你可以对照我上面说的错误处理方式,看看这几行代码是不是无法实现这个目的?

查看完整回答
反对 回复 2017-10-20
  • 1 回答
  • 0 关注
  • 1341 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信