从数据统计例子看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;
}