在c中的数字序列中查找平均值,而忽略序列中的负数

时间:2018-11-13 22:42:45

标签: c average

我必须编写一个C程序,该程序读取整数序列(正数,负数或零),并仅计算正整数的平均值。 如果没有正数,则应显示以下语句,然后换行 没有正数!

这是我的代码,我只需要有关如何忽略输入序列中负数的帮助。

#include<stdio.h>

int main(){

    int num;  //number of elements
    int i;
    int sequence[100];  //numeber if sequence
    int sum = 0.0;            //sum if the sequence
    float avg;          // the average

    printf("Enter the number of number in the sequence:\n");
    scanf("%d", &num);

    while (num < 0 || sequence[num] < 0) {
        printf("No positine numbers!\n");
    }

    printf("Enter the sequence:\n");
    for (i=0; i < num; i++) {
        scanf("%d", &sequence[i]);
        sum += sequence[i];
    }

    avg = (float) sum / num;
    printf("Average is %.2f\n", avg);
    return(0);
}

4 个答案:

答案 0 :(得分:1)

如果您想获得正数的平均值,则应使用不同于num的变量进行最终的平均avg计算。

我会做这样的事情:

    int PositiveNumCount = 0;
    float avg;   
    for (i=0; i < num; i++) {
        scanf("%d", &sequence[i]);
        if(sequence[i] > 0){ sum += sequence[i]; PositiveNumCount++;}
    }
    avg = (float) sum / PositiveNumCount;

答案 1 :(得分:1)

您的代码中存在多个问题:

  • sequence[num]可以引用具有未定义行为的数组末尾的条目,否则可以从也具有未定义行为的未初始化的数组中读取。只需完全删除此测试即可,因为它没有用。
  • 您不需要存储读取的数字,只需一次将它们读入一个临时变量中,而只需添加和计算正值即可。
  • 您应该测试scanf的返回值,以避免在无效输入上发生未定义的行为。

以下是经过纠正和简化的版本:

#include <stdio.h>

int main() {
    int num;           // max number of values to read
    int count = 0;     // number of positive values
    double sum = 0.0;  // sum if the sequence
    double avg;        // the average

    printf("Enter the number of number in the sequence:\n");
    if (scanf("%d", &num) == 1 && num > 0) {
        printf("Enter the sequence:\n");
        while (num-- > 0) {
            int temp;
            if (scanf("%d", &temp) != 1)
                break;
            if (temp >= 0) {
                sum += temp;
                count++;
            }
        }
        avg = sum / count;
        printf("Average is %.2f\n", avg);
    }
    return 0;
}

答案 2 :(得分:1)

这里:

while (num < 0 || sequence[num] < 0) {

您正在测试sequence[num],然后再将任何值写入数组,num的测试应为num <= 0,因为如果值为零,也就没有正值。输入所有正值后,您才能确定没有正值。

数组sequence是不必要的-您可以简单地将正值累加到sum并丢弃它们,从而保持有效值的计数。还避免了任何缓冲区溢出问题。

sumint,但是您不必要使用double对其进行了初始化。

您的平均计算:

avg = (float) sum / num ;

不正确,因为num包含负值-您需要单独计数有效值以求平均值(除非打算将所有负值都视为零)。

另一个问题是您尚未验证输入是否与格式说明符匹配。

int main()
{
    printf("Enter the number of number in the sequence:\n");
    int num = 0 ;
    int check = scanf( "%d", &num ) ;

    int positive_count = 0 ;
    int sum = 0 ;
    if( check != 0 && num >= 0 )
    {
        printf( "Enter the sequence:\n" ) ;

        int i = 0 ;
        while( i < num ) 
        {
            int value = 0 ;
            check = scanf( "%d", &value ) ;
            if( check != 0 )
            {
                i++ ;
                if( value >= 0 )
                {
                    positive_count++ ;
                    sum += value ;
                }
            }
        }
    }

    if( positive_count != 0 )
    {
        float avg = (float) sum / positive_count ;

        printf( "Average is %.2f\n", avg ) ;
    }
    else
    {
        printf( "No positive numbers!\n" ) ;
    }

    return 0 ;
}

答案 3 :(得分:-1)

printf("Enter the sequence:\n");
for (i=0; i < num; i++) {
    scanf("%d", &sequence[i]);
    if(sequeunce[i] > 0){ //This if statement is what your looking for, but there are several other problems in your code.  GL!
        sum += sequence[i];
    }
}

OP要求上面的if语句:“这是我的代码,我只需要帮助即可忽略输入序列中的负数。”

他发布的代码有很多问题,包括在初始化变量之前使用变量以及无限循环路径。这是对他的问题的最短答案。