0

Repl.it を使用し、C の関数を使用して可変長配列の要素を平均化しようとしています。私のプログラムは、以下を返す平均以外のすべての i/o 領域で正常に動作します。

その日の平均は -nan です。問題が何であるかについての洞察はありますか?

目標は、ユーザー入力を double として受け取ることです (たとえば、7 時間にわたって 1 時間あたり何パイントの血液が採取され、関数呼び出しを使用してその 7 時間の平均量を計算します。

新しいコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double average(int size, float ary[*]);


int main(void)
{
char dayOne[8], dayTwo[8];
int size;
float ave;

printf("Over how many hours do you want to view donation amounts?: "); 
scanf("%d", &size);
if (size < 7 || size > 7)
  size = 7;
printf("Enter day that you want to see average donation amount for: ");
scanf("%s", dayOne);
{
    float ary[size];

    for (int i = 0; i < size; i++)
    {
        printf("\nEnter amount taken in hour %d:", i + 1);
        scanf("%f", &ary[i]);

    }
    ave = average(size, ary);
    printf("\nThe average donated for %s is: %2.1f", dayOne, ave);
 }

 printf("\n\nEnter day that you want to see average donation amount for: ");
 scanf("%s", dayTwo);

if(strcmp(dayOne, dayTwo)== 0)
   printf("\nEnter a different day please: ");

   scanf("%s", dayTwo);

 {
  float ary[size];

  for (int i = 0; i < size; i++)
  {
    printf("\nEnter amount taken in hour %d:", i + 1);
    scanf("%f", &ary[i]);
 }
    ave = average(size, ary);
    printf("\nThe average donated for %s is: %2.1f", dayTwo, ave);

}   


return 0;
}

double average(int size, float ary[])
{

double sum = 0;

double ave;

for (int i = 0; i < size; i++)
    sum += ary[i];

ave = (double)sum / size;
return ave;
}
4

3 に答える 3

1

これは間違っています:

int ary[7];
…
scanf("%f", &ary[i]);

%fは をスキャンするためのfloatものary[i]ですが、intです。結果の動作は定義されていません。

これは間違っています:

double size;
…
ave = average(size, ary);

「…」の中には に値が割り当てられていないため、が呼び出されたsizeときに値が定義されていません。average

于 2018-11-28T01:54:18.230 に答える
0

かなりの数の構文的および論理的な変更が相棒になります。Eric Postpischil が回答で述べたように、size変数は使用前に初期化されません。また%f、整数を受け入れるために使用することも正しくありません。これらに加えて、他にもいくつかの不具合があり、対応する修正とともに以下にリストします. また、出力とともに完全な作業コードを添付しました。

  1. エラー: size変数が初期化されていません。

    修正: : 時間数が固定されているため、7を直接使用することも、 を介して使用することもできますsize。したがって、変数を宣言しながら初期化します。そして、ただの提案バディ、使用intfor size. ==> int size = 7;

  2. エラー:配列値の入力を受け付けています。配列aryのタイプはですが、 のフォーマット指定子をint使用しています。%ffloat

    修正:データ型%dの書式指定子である which を使用します。int==>scanf("%d", &ary[i]);

  3. エラー:平均値の出力に使用される書式指定子。while であるfor average if の変数を%f再度使用しました。floatavedouble

    修正:%lfの書式指定子である which を使用しますdouble。==>前はprintf("\nThe average for the 2nd day is: %.3lf", ave); 、小数点以下の桁数を 3 に制限するだけです。オプションです。.3lf

  4. エラー: 2 日目を受け入れて、1 日目と同じ場合はメッセージを表示しますが、この for はループscanfから外れています。ifしたがって、2 番目の入力日が最初の日付と同じであるかどうかに関係なく、別の曜日の名前を入力するようにユーザーに促します。

    修正:その日が前の日と同じかどうかを確認するループにscanf移動するだけです。if

  5. これは単なる改善であり、実行する必要があるため、これをエラーとは呼びません。平均が見つかるというメッセージで、最初とは異なるはずの 2 日目を受け入れます。しかし、あなたはこの日の平均を計算していません。したがって、その部分をコードに含めました。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double average(int, int [7]);


    int main(void)
    {
        char dayOne[8], dayTwo[8];
        int size = 7;
        double ave;


        printf("Enter day that you want to see average donation amount for: ");
        scanf("%s", dayOne);

        int ary[7];

        for (int i = 0; i < 7; i++)
        {
            printf("Enter amount taken in hour %d:", i + 1);
            scanf("%d", &ary[i]);

        }
        ave = average(size, ary);
        printf("\nThe average for the 1st day is: %.3lf", ave);


        printf("\n\nEnter day that you want to see average donation amount for:");
        scanf("%s", dayTwo);

        if(strcmp(dayOne, dayTwo)== 0) {
            printf("\nEnter a different day please: ");
            scanf("%s", dayTwo);
        }


        for (int i = 0; i < 7; i++)
        {
            printf("Enter amount taken in hour %d:", i + 1);
            scanf("%d", &ary[i]);
        }

        ave = average(size, ary);
        printf("\nThe average for the 2nd day is: %.3lf", ave);

        return 0;
    }

    double average(int size, int ary[7])
    {

        int sum = 0;
        double ave;
        for (int i = 0; i < size; i++) {
        sum = sum + ary[i];
    }
        ave = sum / size;
        return ave;
    }

出力:

Enter day that you want to see average donation amount for:  Day1
Enter amount taken in hour 1: 1
Enter amount taken in hour 2: 2
Enter amount taken in hour 3: 3
Enter amount taken in hour 4: 4
Enter amount taken in hour 5: 5
Enter amount taken in hour 6: 6
Enter amount taken in hour 7: 7

The average for the 1st day is: 4.000

Enter day that you want to see average donation amount for: Day2
Enter amount taken in hour 1: 8
Enter amount taken in hour 2: 8
Enter amount taken in hour 3: 8
Enter amount taken in hour 4: 8
Enter amount taken in hour 5: 8
Enter amount taken in hour 6: 8
Enter amount taken in hour 7: 8

The average for the 2nd day is: 8.000

お役に立てれば。

于 2018-11-28T06:05:43.687 に答える