1

私はITのジュニア学生です。プログラムの出力に問題があります。このプログラムの考え方は、関数を使用して 10 個の要素の配列を読み取り、要素の平均を取得してから、最大値と最小値を取得するというものです。最大値と最小値は正しいのですが、平均値は奇妙なものを示しています。コードを確認して、何をすべきか教えてください。または何らかの方法で私を助けてください。

出力は次のとおりです (10 ではなく 11 の数字を要求していることに注意してください。ループ パラメーターを変更して 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 */
    /* ... */;

平均を計算するコードには、2 つのバグがありました。まず、数学のために括弧を使用する必要があります。

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++)

これはおそらく、意図したよりも 1 つ少ない数字をチェックしています。

上記の種類のエラーは、一般に「フェンスポスト エラー」と呼ばれます。この名前は、次の質問に関連しています。長さ 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 に答える