1

This is the code:

#include <stdio.h>

int group, regular_group, regular_members, shutdown, special_group,
    special_members;
float average_special, average_regular;
main()
{
  do
  {
    printf("How many members are in the group?\n");
    scanf("%d", &group);

    if (group >= 15)
    {
      regular_group = regular_group + 1;
      regular_members = regular_members + group;
      printf("Do you want to add another group? yes = 1, no = 0 \n");
      scanf("%d", &shutdown);
    }

    else
    {
      special_group = special_group + 1;
      special_members = special_members + group;
      printf("Do you want to add another group? yes = 1, no = 0 \n");
      scanf("%d", &shutdown);
    }
  }

  while (shutdown == 1);

  average_regular = regular_members / regular_group;
  average_special = special_members / special_group;

  printf("\nTotal regular members:\n%d\n", regular_members);
  printf("\nTotal special members:\n%d\n", special_members);

  printf("\nAverage regular members in a group:\n%f\n", average_regular);
  printf("\nAverage special members in a group:\n%f\n", average_special);
  fflush(stdin);
  getchar();

}

If a group is larger than 15 its automatically a regular group but if its less than its a special group. I need the total amount of memebrs of each catergory. The total amount of members is working fine. But I also need the average size of a group of both catergories. But the average is always 0,000000. But I cant find the error.. Please help me

Thank you very much !

4

4 に答える 4

2

これは、整数間の除算を行っているためです。また、結果変数が float の場合、操作が期待どおりに実行されるには不十分です。

次のような型キャストを使用する必要があります。

average_regular = (float)regular_members/(float)regular_group;
average_special = (float)special_members/(float)special_group;

実際には、操作を float 除算としてコンパイルするには、各操作の 2 つのメンバーの 1 つだけにキャストを配置するだけで十分な場合があります。

average_regular = (float)regular_members/regular_group;
average_special = (float)special_members/special_group;
于 2013-09-16T17:10:35.217 に答える
2

それの訳は

  1. regular_members/regular_group除算後に整数を与える2つの整数を除算しています。分子が分母よりも小さくなると0、結果が得られます。
  2. regular_group変数、regular_membersspecial_groupspecial_membersaverage_specialおよび を初期化していませんaverage_regular

使用する代わりに

average_regular = regular_members/regular_group;
average_special = special_members/special_group;

これを試して

average_regular = (float)regular_members/regular_group;
average_special = (float)special_members/special_group;

また、削除しfflush(stdin)ます。未定義の動作を引き起こします。
変数を宣言する

int group, regular_group, regular_members, shutdown, special_group,
special_members;
float average_special, average_regular;

内部main関数

main()
{
     int group, regular_group, regular_members, shutdown, special_group, special_members;
     float average_special, average_regular;
     ....
     ....
}

変数を初期化することを忘れないでください: regular_group, regular_members, special_group, special_members, .average_specialaverage_regular0


これが作業コードです(いくつかの変更後)

#include <stdio.h>

int main()
{
    int group, regular_group = 0, regular_members = 0, shutdown, special_group = 0,
    special_members = 0;
    float average_special = 0, average_regular = 0;

  do
  {
        printf("How many members are in the group?\n");
        scanf("%d", &group);

        if (group >= 15)
        {
            regular_group = regular_group + 1;
            regular_members = regular_members + group;
            printf("Do you want to add another group? yes = 1, no = 0 \n");
            scanf("%d", &shutdown);
        }

        else
        {
            special_group = special_group + 1;
            special_members = special_members + group;
            printf("Do you want to add another group? yes = 1, no = 0 \n");
            scanf("%d", &shutdown);
       }
  } while (shutdown != 0);

if(regular_group != 0)              //to stop division by zero
    average_regular = (float)regular_members / regular_group;
if(special_group != 0)              //to stop division by zero  
    average_special = (float)special_members / special_group;

printf("\nTotal regular members:\n%d\n", regular_members);
printf("\nTotal special members:\n%d\n", special_members);

printf("\nAverage regular members in a group:\n%f\n", average_regular);
printf("\nAverage special members in a group:\n%f\n", average_special);

return 0;

}
于 2013-09-16T17:07:23.737 に答える
1

コードに問題はありません。唯一の問題は、Global virable が 0 に初期化されるため、特別なグループまたは通常のグループがない場合です。

regular_group or special_group value will be 0.

また、no を 0 で割ると、浮動小数点例外が発生します。要点がわかったと思います。

main() must return int .

残り問題ありません。

于 2013-09-16T18:01:49.147 に答える
1

除算regular_members/regular_groupの結果は整数になるため、分数はすべて 0 になります。

変数の 1 つを float にキャストすると、除算の結果が float になります。

average_regular = regular_members/(float)regular_group;

他のバージョンも同様ですaverage_special

-また、メインが正しく宣言されていません。少なくともint main( void )

-Andfflush(stdin);はバッファをクリアする正しい方法ではありません。未定義の動作が発生する可能性があります。

-ここでゼロ除算を呼び出す可能性がありますaverage_regular = regular_members / regular_group;

于 2013-09-16T17:05:32.193 に答える