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

两个cin.get(); 和return i;(加粗部分)是什么作用?恳请回答,必采纳

两个cin.get(); 和return i;(加粗部分)是什么作用?恳请回答,必采纳

C++
xungeer29 2017-10-11 16:12:49
#include <iostream>const int Max = 5;int fill_array(double ar[], int limit);void show_array(const double ar[], int n);  // don't change datavoid revalue(double r, double ar[], int n);int main(){using namespace std;double properties[Max];int size = fill_array(properties, Max);show_array(properties, size);if (size > 0){cout << "Enter revaluation factor: ";double factor;while (!(cin >> factor))    // bad input{cin.clear();while (cin.get() != '\n')continue;cout << "Bad input;Please enter a number: ";}revalue(factor, properties, size);show_array(properties, size);}cout << "Done.\n";cin.get(); cin.get(); return 0;}int fill_array(double ar[], int limit){using namespace std;double temp;int i;for (i = 0; i < limit; i++){cout << "Enter value #" << (i + 1) << ": ";cin >> temp;if (!cin)    // bad input{cin.clear();while (cin.get() != '\n')continue;cout << "Bad input; input process terminated.\n";break;}else if (temp < 0)     // signal to terminate break;ar[i] = temp;}return i;}// the following function can use, but not alter, // the array whose address is arvoid show_array(const double ar[], int n){using namespace std;for (int i = 0; i < n; i++){cout << "Property #" << (i + 1) << ": $";cout << ar[i] << endl; } }// multiplies each element of ar[] by rvoid revalue(double r, double ar[], int n){for (int i = 0; i < n; i++)ar[i] *= r;}
查看完整描述

2 回答

已采纳
?
onemoo

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

看 fill_array 函数的逻辑。在 return i 前的那个 for 循环就是试图向数组的 [0, limit) 范围输入数据。i 作为每一次输入的数组位置下标,那么最终 i 就标志着一共输入了多少个数字,显然这个函数打算返回这个值。

为什么要返回这个值?  这个函数意图输入 limit 个数,但是如果中途出错退出则实际没有输入 limit 个数字,所以返回 i 是为了告诉调用者这个函数最终输入了多少个数。


至于那两个 cin.get();。 这个 get() 会从输入流中读一个字符,但这个代码又没有用到这个字符——这样的代码一般有两个目的:要么就是为了拿走(或者说消耗掉)输入流中的下一个字符;要么就是为了等用户按个键。 我猜这里的两个 get 正是这两个目的:

之前的代码读取输入之后会在输入流中留下换行符,如果每次都成功读取则中间的换行符是会被忽略掉的,而中途如果出错可能导致这个换行符被意外留下,所以第一个 get 就是为了消耗掉它。

而第二个 get 纯粹是为了等用户按键。不然这个程序直接就结束了——用户会看到程序一闪就执行完了,来不及看到它输出的东西(尤其在Windows下cmd窗口中运行时,执行完连cmd都退出了,你什么都看不到)。 所以通常用 cin.get(); 来等待用户随便按个键再退出。

查看完整回答
1 反对 回复 2017-10-11
?
onemoo

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

我想再提示下,别嫌我烦哈。

下次发代码时最好用格式化工具格式化一下,比如:

int fill_array(double ar[], int limit)
{
    using namespace std;
    double temp;
    int i;
    for (i = 0; i < limit; i++)
    {
        cout << "Enter value #" << (i + 1) << ": ";
        cin >> temp;
        if (!cin)    // bad input
        {
            cin.clear();
            while (cin.get() != '\n')
            continue;
            cout << "Bad input; input process terminated.\n";
            break;
        } else if (temp < 0)     // signal to terminate break;
            ar[i] = temp;
    }
    return i;
}

这样合理缩进看代码更容易,也方便用行号来指出代码位置。

查看完整回答
反对 回复 2017-10-11
  • 2 回答
  • 0 关注
  • 1777 浏览

添加回答

举报

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