1

2 つの関数を呼び出す次のプログラムがあります。1 つは配列の合計を収集するためのもので、もう 1 つは平均を収集するためのものです。

#include <stdio.h>

float array_sum (float myNumbers[],int size)
{
    float sum = 0;
    int i; /* Variable used in loop counter */

    for (i = 0; i < size; ++i)
    {
        sum +=myNumbers[i];
    }

}

float array_average (float myNumbers[],int size)
{
    float sum = 0;
    float average = 0;
    int i; /* Variable used in loop counter */

    for (i = 0; i < size; ++i)
    {
        sum +=myNumbers[i];
    }

    average = sum/size;
    printf("avg = %5.2f", average);
}

int main (void)
{
    int size;
    int sum;

    printf ("Enter The Amount Of Numbers In Your Array: ");
    scanf("%i", &size);

    float myNumbers[size];
    int i;

    for (i = 0; i < size; ++i)
    {
        printf ("Enter the number:");
        scanf (" %f",&myNumbers[i]);
    }

    array_sum(myNumbers,size);
    array_average(myNumbers,size);

    return 0; 
}

私がやりたいことは、プログラムの最後に と 結果array_sumの両方を表示することです。さらに、配列の合計を再度計算するのではなく、関数array_averageを通過させる方が効率的だと思いますか? どんな考えでも大歓迎です!array_sumarray_average

4

4 に答える 4

2

まず、コードを繰り返さずに sum 関数を average 関数から呼び出すことができます。次に、両方の関数を戻り値の型で宣言しますが、何も返しません。return ステートメントを追加してから、戻り値を の変数に設定する必要がありますmain()

于 2013-03-12T01:42:43.780 に答える
2

関数を呼び出す代わりにprintf、値を返す必要があります。

return sum;

また

return average;

floatとにかく、両方の関数が戻り値を期待しています。コンパイラはこれについて警告しているはずです。とにかく、次のように呼び出すことができるはずです (関連する変数が で宣言されていると仮定しますmain):

sum = array_sum(myNumbers,size);
average = array_average(myNumbers,size);
printf("sum = %5.2f", sum);
printf("avg = %5.2f", average);

明らかに、関数は追加の値を追加せずにarray_average多くの同じ作業を行っているため、コードを複製する代わりに呼び出して合計を計算する必要があります。array_sumarray_sum

于 2013-03-12T01:43:36.730 に答える
1

関数が関連する値を返すのがおそらく最善です。どちらのワーカー関数にも return ステートメントがありません。コンパイラはこれについて警告するはずです。それらの警告に注意してください。

第二に、現在のように値自体を出力しない場合、関数はより再利用可能になりますarray_average。これをすべてまとめると、問題の値を返すようにワーカー関数を変更します。次に、次のようなコードを使用できます。

float sum = array_sum(myNumbers, size);
printf("sum = %5.2f; avg = %5.2f", sum, sum/size);

また、プログラムがオーバーフローや精度の低下に悩まされる可能性があることにも注意してください。ただし、あなたの問題に基づいて、これらの問題はより高度なレベルの研究で取り上げられるべきだと思います。ただし、必ず戻ってきてください。

于 2013-03-12T01:48:55.123 に答える
0

私はあなたがこれらの機能を持っているはずだと感じています。それによって次のようなことができます:

#include <stdio.h>
#include <stdlib.h>

/* Pass pointer to a target variable where to save sum. 
 * Though it can be nice to return it, it all depends on usage.
 * Conventionally one often return status code, and edit params.
 */
int array_sum(float myNumbers[], int size, float *sum)
{
    int i;

    /* This would indicate you have asked for the sum of an empty set. */
    if (size < 1) {
        return 1;
    }
    *sum = 0;

    for (i = 0; i < size; ++i) {
        *sum += myNumbers[i];
    }
    return 0;
}

int array_average(float sum, unsigned int size, float *avg)
{
    /* Duh. */
    if (size == 0) {
        return 1;
    }
    *avg = sum / size;
    return 0;
}


/* A lot of redundant checks here, but only to show the concept.
 * Normally one would often call the function from context where
 * one does not have control on e.g. "size" before you actually 
 * are going to sum it.
 *
 * Here you would probably check if size is < 1 after scanf and
 * ask for new number or abort.
 */
int main(void /* int argc, char *argv[] */)
{
    int i;
    int size;
    float sum;
    float avg;
    float *myNumbers;

    printf ("Enter The Amount Of Numbers In Your Array: ");
    if (!scanf("%i", &size)) {
        fprintf(stderr,
            "Unable to read size.\n"
        );
        return 1;
    }

    if ((myNumbers = malloc(sizeof(float)* size)) ==NULL) {
        fprintf(stderr,
            "Memory error.\n"
        );
        return 2;
    }

    for (i = 0; i < size; ++i) {
        fprintf(stderr, "Enter the number: ");
        if (!scanf("%f", &myNumbers[i])) {
            fprintf(stderr,
                "Unable to read float.\n"
                "Try again."
            );
            scanf("%*s"); /* Empty out buffer. */
            --i;          /* Reset count. */
        }
    }

    if (array_sum(myNumbers, size, &sum) != 0) {
        fprintf(stderr,
                "Sum failed.\n"
        );
        return 2;
    }

    if (array_average(sum, size, &avg) != 0) {
        fprintf(stderr,
                "AVG failed.\n"
        );
        return 3;
    }

    fprintf(stdout,
        "Total numbers: %d\n"
        "Sum          : %.2f\n"
        "AVG          : %.2f\n"
        ,
        size,
        sum,
        avg
    );

    free(myNumbers);

    return 0;
}
于 2013-03-12T02:11:41.220 に答える