在c中获得最小值、最大值和平均值的函数
Posted
技术标签:
【中文标题】在c中获得最小值、最大值和平均值的函数【英文标题】:Function that would get minimum, maximum and average in c 【发布时间】:2021-04-14 08:13:56 【问题描述】:你好,我写了一个函数,它不断地接受来自用户的整数输入,直到用户输入 -999(sentinel 值)。该函数还识别输入的最高和最低值,即输入的平均值。我已经为它写了一个代码,但我似乎无法得到正确的平均值,需要帮助修改它。
这是我的代码:
#include <stdio.h>
int getMinMaxAve ( int *min, int *max, float *ave)
int nVal;
int nMin = 0;
int nMax = 0;
int nResult = 1;
int nCount = 0;
while (nVal != -999)
printf ("Value:");
scanf ("%d", &nVal);
if (nVal !=-999)
if (nVal > nMax)
nMax = nVal;
if (nVal < nMin)
nMin = nVal;
nResult += nVal;
nCount += 1;
*min = nMin;
*max = nMax;
*ave = nResult / nCount;
int main ()
int nMin;
int nMax;
int nResult;
float fAve;
nResult = getMinMaxAve (&nMin, &nMax, &fAve);
if (nMin == -999)
printf ("Min: NA\n");
printf ("Max: NA\n");
printf ("Average: NA\n");
else
printf ("Min: %d\n", nMin);
printf ("Max: %d\n", nMax);
printf ("Average: %f\n", fAve);
return 0;
【问题讨论】:
当输入流包含“foo”时会发生什么?您必须检查scanf
返回的值。总是。
@Marty Mcfly 为什么这个变量是 int nResult = 1;由 1 初始化?!
什么是nResult
- 你的函数没有返回任何东西。你也不要使用这个返回值。
整数除法不能产生float
值。请转换一个操作数*ave = (float)nResult / nCount;
nVal
在第一次读取时未初始化(在循环条件下),导致未定义的行为。这应该是讨论的结束。甚至不能保证在第二次使用时(在 if 条件下)有一个干净的写入值。
【参考方案1】:
对于初学者,程序具有未定义的行为,因为函数getMinMaxAve
被声明为
int `getMinMaxAve` ( int *min, int *max, float *ave)
什么都不返回。
最好从函数中返回输入值的数量。
不清楚为什么变量nResult
被初始化为1而不是0。
int nResult = 1;
将变量 nMin
和 nMax
设置为值 o
int nMin = 0;
int nMax = 0;
可能会产生不正确的最小值和最大值结果。
如果用户不输入实际数字,通常变量nCount
可以等于0。在这种情况下这个语句
*ave = nResult / nCount;
还调用未定义的行为。而且在nResult / nCount
这个表达式中使用了整数运算。
main 中的 if 语句
if (nMin == -999)
没有意义。
该函数可以如下面的演示程序所示。
#include <stdio.h>
size_t getMinMaxAve ( int *min, int *max, double *ave )
const int Sentinel = -999;
size_t count = 0;
double total = 0;
for ( int value; scanf( "%d", &value ) == 1 && value != Sentinel; ++count )
if ( count == 0 || value < *min ) *min = value;
if ( count == 0 || *max < value ) *max = value;
total += value;
if ( count != 0 )
*ave = total / count;
return count;
int main(void)
int nMin;
int nMax;
double fAve;
if ( getMinMaxAve( &nMin, &nMax, &fAve ) )
printf ( "Min: %d\n", nMin );
printf ( "Max: %d\n", nMax );
printf ( "Average: %.2f\n", fAve );
else
printf ("Min: NA\n");
printf ("Max: NA\n");
printf ("Average: NA\n");
return 0;
程序输出可能看起来像
1 2 3 4 5 6 7 8 9 10 -999
Min: 1
Max: 10
Average: 5.50
【讨论】:
您过度标记了“getMinMaxAve”的第二次出现,我错过了关于未初始化nVal
的讨论。【参考方案2】:
首先,您在nResult
中保存总和的变量初始化为 1。它必须绝对为零。
第二个*ave = nResult / nCount;
进行整数除法,因为nResult
和nCount
都是整数。
解决方法是将nResult
声明为float
。然后,同样的表达式实际上做了你期望它做的事情。并且最好将该变量重命名为 totalSum
,或者同样提供信息的名称。
(但你最好在任何地方使用double
而不是float
)
您的代码存在更多问题,但我仅限于回答您关于平均值的问题。
【讨论】:
以上是关于在c中获得最小值、最大值和平均值的函数的主要内容,如果未能解决你的问题,请参考以下文章
PHP使用随机函数,产生三个2位整数,输出到页面,并求出三个数中的最大值、最小值、平均值
C语言利用函数调用求一组数的最大值,最小值,平均数。。。。。。急。。。。