首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c中求一个数列的平均值,而忽略序列中的负数。

在c中求一个数列的平均值,而忽略序列中的负数。
EN

Stack Overflow用户
提问于 2018-11-13 22:42:44
回答 4查看 5K关注 0票数 1

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

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

代码语言:javascript
复制
#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);
}
EN

回答 4

Stack Overflow用户

发布于 2018-11-13 23:16:05

在此:

代码语言:javascript
复制
while (num < 0 || sequence[num] < 0) {

在向数组写入任何值之前,您正在测试sequence[num],而且对num的测试应该是num <= 0,因为如果有零值,也没有正值。您只能在输入所有值后才能确定是否存在正值。

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

sum是一个int,但是您已经不必要地用double初始化了它。

你的平均计算:

代码语言:javascript
复制
avg = (float) sum / num ;

这是不正确的,因为num包含负值--您需要对贡献平均值的有效值进行单独计数(除非意图将所有负值视为零)。

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

代码语言:javascript
复制
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 ;
}
票数 2
EN

Stack Overflow用户

发布于 2018-11-13 22:53:28

如果您想要正数的平均值,您应该使用一个不同于num的变量来进行最终的avg计算。

我会这样做:

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2018-11-13 22:58:52

代码中存在多个问题:

  • sequence[num]可能指数组结束后的具有未定义行为的条目,或者从未定义的数组中读取,后者也具有未定义的行为。只需完全删除这个测试,因为它是无用的。
  • 您不需要存储已读取的数字,只需一次将它们读取到一个临时变量中,只需添加和计数正值。
  • 您应该测试scanf的返回值,以避免对无效输入进行未定义的行为。

以下是一个经过修正和简化的版本:

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53290617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档