[英]Function that would get minimum, maximum and average in c
您好,我写了一个 function 连续接受来自用户的 integer 输入,直到用户输入 -999(标记值)。 function 还识别输入的最高和最低值,即输入的平均值。 我已经为它写了一个代码,但我似乎无法得到正确的平均值,需要帮助来修改它。
这是我的代码:
#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;
}
对于初学者,该程序具有未定义的行为,因为 function getMinMaxAve
被声明为
int `getMinMaxAve` ( int *min, int *max, float *ave)
什么都不返回。
最好从 function 返回输入值的数量。
不清楚为什么变量nResult
被初始化为 1 而不是 0。
int nResult = 1;
将变量nMin
和nMax
设置为值 o
int nMin = 0;
int nMax = 0;
对于最小值和最大值,可能会产生不正确的结果。
此外,如果用户不输入实际数字,通常变量nCount
可以等于 0。 在这种情况下,此语句
*ave = nResult / nCount;
还调用未定义的行为。 此外,在这个表达式nResult / nCount
中,使用了 integer 算法。
这个 if 语句在 main
if (nMin == -999)
没有意义。
function 可以如下面的演示程序所示。
#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;
}
程序 output 可能看起来像
1 2 3 4 5 6 7 8 9 10 -999
Min: 1
Max: 10
Average: 5.50
首先,您在nResult
中保留总和的变量被初始化为 1。那必须绝对为零。
第二个*ave = nResult / nCount;
integer 除法是否因为nResult
和nCount
都是整数。
一种解决方法是将nResult
声明为float
。 然后,同样的表达式实际上做了你期望它做的事情。 并且最好将该变量重命名为totalSum
,或者同样提供信息的东西。
(但你最好在任何地方都使用double
而不是float
)
您的代码还有更多问题,但我仅限于回答您关于平均值的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.