从数据统计例子看C++之while循环终止技巧

从数据统计例子看C++之while循环终止技巧

从标准输入(通常是键盘)读取一系列整数,然后计算这些数的平均值、最小值和最大值,并将这些值输出到标准输出(通常是屏幕)。用C++多种方式实现。

法一、C风格的输入输出实现:

#include<cstdio> 

int main(){
	int x, n = 0, min, max, s = 0;
	printf("请输入整数,以非数字字符结束输入:\n");
	while(scanf("%d", &x) == 1){ //每次循环都会从标准输入读取一个整数。 
		s += x;
		min = x < min ? x : min;
		max = x > max ? x : max;
		++n;
	}
	printf("%d %d %.3f\n", min, max, (double)s/n); //(double)s/n 是将值转换为双精度浮点数。
	
	return 0;
}

运行效果:

这个C风格的实现源码中用到了三目运算符( ?  : )。

提示:你可以通过以下方式终止while(scanf("%d", &x) == 1) 循环:

如果我们想要终止这个循环,

输入一个无效的数据,对本句而言输入一个不是整数的值,这样scanf会返回0,循环会终止。

输入一个整数后按下Ctrl+D(Unix/Linux系统)或Ctrl+Z(Windows系统)组合键,这样scanf会返回EOF,循环也会终止。

程序解释

1.声明了四个整数变量:x,n,min 和 max。变量 x 是当前读取的数,n 记录了已经读取的数的数量,min 和 max 分别记录了当前读取的数中的最小值和最大值。

2.while(scanf("%d", &x) == 1) 是一个循环,scanf 函数用于读取输入的整数。当 scanf("%d", &x) 调用成功时(即成功读取了一个整数),循环体执行。否则,循环结束。scanf 函数返回成功读取并赋值的参数数目 (1 表示成功读取了一个整数)。

在循环中,每次读取一个整数后,会进行以下操作:

将这个整数加到 s 中,以计算所有数的和。

如果这个整数比当前已知的最小值 min 小,则更新 min。

如果这个整数比当前已知的最大值 max 大,则更新 max。

将 n 增加1,记录已经读取的数的数量。

3.循环结束后,用printf函数输出三个值:最小值 min、最大值 max 和平均值 (double)s/n。其中,(double)s/n 是将整数平均值转换为双精度浮点数,以便在输出时保持精度。

法二、下面给出C++风格的源码:

#include <iostream>
using namespace std;
# define INF 100000000
int main()
{
    int n=0, x, s = 0;
    int min_x = INF;
    int max_x = -INF;

    cout << "请输入整数,以非数字字符结束输入:" << endl;

     while (cin >> x) {
        // 只要读取到整数就执行下列循环体
        n++;
        s += x;
        min_x = x < min_x ? x : min_x;        
        max_x = x > max_x ? x : max_x;        
    }

    cout <<  min_x << " " << max_x << " " << (double) s / n << endl;

    return 0;
}

提示:程序中使用了一个宏定义 INF,表示正无穷大,用于初始化变量 min 和 max。源码中用到了三目运算符。

C++输入流(istream)对象的输入运算符" >> "的返回值是其左操作数,即输入到的变量或对象。例如,当您使用cin输入变量n时,代码行"cin >> n"将返回cin对象并将输入的值存储在n中。如果输入无效,则返回一个错误标志并设置流的状态,导致后续操作失败。因此,您可以使用cin的返回值来检查输入操作是否成功,例如:
int n;
if (cin >> n) {
    // 输入成功,继续进行
} else {
    // 输入失败,进行错误处理
}

例子中的
while (cin >> x) {
}
输入非法值——此例中非数字字符,或遇到EOF(文件结束符)结束while循环。
EOF(文件结束符)它表示输入流的结尾。在Unix和Linux系统上,可以通过键入Ctrl + D来显式发送EOF到标准输入流。在Windows系统上,可以通过键入Ctrl + Z(加换行符)来实现相同的效果。当cin对象遇到EOF时,它将设置流状态为结束状态。

上面这个C++风格的源码,若不用三目运算符可改写为:

#include <iostream>
using namespace std;
# define INF 100000000
int main()
{
    int n=0, x;
    int sum = 0;
    int min = INF;
    int max = -INF;

    cout << "请输入整数,以非数字字符结束输入:" << endl;

     while (cin >> x) {
        // 只要读取到整数就执行下列循环体
        n++;
        sum += x;
        if (x < min) {
            min = x;  // 找到最小值,将其赋值给变量 min
        }
        if (x > max) {
            max = x;  // 找到最大值,将其赋值给变量 max
        }   	
    }

    cout <<  min << " " << max << " " << (double) sum / n << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/cnds123/article/details/132627180