繁体   English   中英

Function 将在 c 中获得最小值、最大值和平均值

[英]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;

将变量nMinnMax设置为值 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 除法是否因为nResultnCount都是整数。

一种解决方法是将nResult声明为float 然后,同样的表达式实际上做了你期望它做的事情。 并且最好将该变量重命名为totalSum ,或者同样提供信息的东西。

(但你最好在任何地方都使用double而不是float

您的代码还有更多问题,但我仅限于回答您关于平均值的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM