在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;

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

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

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

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

【讨论】:

以上是关于在c中获得最小值、最大值和平均值的函数的主要内容,如果未能解决你的问题,请参考以下文章

取最大值(最小值)简介代码

PHP使用随机函数,产生三个2位整数,输出到页面,并求出三个数中的最大值、最小值、平均值

C语言利用函数调用求一组数的最大值,最小值,平均数。。。。。。急。。。。

Oracle数据库中求最大值和平均值的聚合函数是

VB中如何求最大值和最小值,我写了下面的代码可是只能求最大值和平均值。最小值一直显示0

C 或 C++ 中是不是存在用于常见数学运算(例如最小值、最大值和平均值)的可导入库? [关闭]