1

我是 IT 专业的大三学生。我面临程序输出的问题。该程序的想法是我应该使用函数来读取 10 个元素的数组,然后获取元素的平均值,然后获取最大值和最小值。我有正确的最大值和最小值,但平均值显示奇怪的东西。请检查代码并告诉我应该做什么或以某种方式帮助我。

输出是(请注意,它请求的是 11 个数字而不是 10,如果我更改循环参数以让它只占用 10 个,那么它会显示奇怪的东西

enter the group of integers numbers
1
2
3
4
5
6
7
8
9
0
9
 1 2 3 4 5 6 7 8 9 0the avg is 3.500000
9
1Press any key to continue . . .

// func-sortarray.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#define size  10

void readarray(int []);
void average(int []);
void printArray(int []);
void max(int []);
void min(int []);

int _tmain(int argc, _TCHAR* argv[])
{
    int sarray[size];
    readarray(sarray);
    printArray(sarray);
    average(sarray);
    max(sarray);
    min(sarray);
    return 0;
}

void readarray(int a[])
{
    printf("enter the group of integers numbers\n");
    for (int i=0; i<=size-1 ;i++)
        scanf("%d\n",&a[i]);
}

void average(int a[])
{
    int i;
    double avg;
    double total = 0;
    for (i=0; i <= size-1; i++)
    {
        total = total + a[i];
    }

    avg = total /size-1;
    printf("the avg is %f\n",avg);
}

void printArray(int a[])
{
    int j;
    for (j = 0; j <= size - 1; j++) 
        printf( "%2d", a[ j ]);
}

void max(int a[])
{
    int ma =a[0];

    for (int j=0;j<size-1;j++)
    {
        if (ma<a[j])
            ma=a[j];
    }
    printf("%d",ma);
}

void min(int a[])
{
    int mi =a[0];

    for (int j=0;j<size-1;j++)
    {
        if (mi>a[j])
            mi=a[j];
    }
    printf("\n%d",mi);
}

提前谢谢

4

3 回答 3

3

在加法规则之前从零开始计数乘法时会遇到一些问题。好吧,让我们开始吧。最常见的是,当您从零开始计数时,您会这样做:

for(i=0; i < count; i++)
    /* ... */;

如果你从 1 开始数,你可以这样做:

for(i=1; i <= count; i++)
    /* ... */

如果你混合这些,你会得到相同的结果,但它会让你自己和其他阅读代码的人感到困惑:

for(i=0; i <= count-1; i++) /* same, but better don't do this */
    /* ... */;

在计算平均值的代码中,您有两个错误。首先,由于数学原因,您应该使用括号:

avg = total / (size-1); /* there is still one bug */

其次,你 size元素。所以你必须除以size,而不是size-1

avg = total / size; /* right ! */
于 2009-01-11T20:42:58.207 回答
2

这条线可能是问题所在:

avg = total /size-1;

您可能希望改为:

avg = total / size;

此外,你的max()min()函数有一个这样的循环:

for (int j=0;j<size-1;j++)

这可能检查的数字比您想要的少一个。

上述类型的错误通常称为“栅栏错误”。该名称与以下问题有关:如果您要建造 100 m 长的栅栏,并且希望每 1 m 有一个栅栏,您需要多少栅栏?答案不是 100,而是 101。这种类型的错误的另一个名称是“off by one error”。

于 2009-01-11T20:38:03.003 回答
1

由于 scanf() 字符串中的 '\n' ,它正在跳过第一个输入数字。要修复它,请从 scanf 字符串中删除 '\n',如下所示:

scanf("%d", &a[i]);
于 2009-01-11T20:50:12.793 回答