为什么不能正确计算成员的平均数?

时间:2013-09-16 16:56:11

标签: c average

这是代码:

#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();

}

如果一个组大于15,它会自动成为一个常规组,但如果它小于一个特殊组。我需要每个catergory的memebrs的总量。 会员总数工作正常。但我也需要一组两个catergories的平均大小。但平均值总是0,000000。但我找不到错误..请帮帮我

非常感谢!

4 个答案:

答案 0 :(得分:2)

这是因为

  1. 您正在划分两个整数regular_members/regular_group,它在除法后给出一个整数。如果分子将小于分母,那么结果将得到0
  2. 您尚未初始化变量regular_groupregular_membersspecial_groupspecial_membersaverage_specialaverage_regular
  3. 而不是使用

    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_groupregular_membersspecial_groupspecial_membersaverage_special,{ {1}}至average_regular


    这是您的工作代码(经过一些修改后)

    0

答案 1 :(得分:2)

这是因为你在整数之间进行划分。 此外,如果结果变量是浮点数,则这不足以使操作按预期执行。

你需要使用这样的类型转换:

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

实际上,仅将演员表放在每个操作的两个成员之一上以将操作编译为浮动分区就足够了:

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

答案 2 :(得分:1)

除法regular_members/regular_group产生整数结果,因此任何分数都变为0。

将其中一个变量转换为float,并且除法将导致浮动。

average_regular = regular_members/(float)regular_group;

与其他版本average_special类似。

- 如果您的主要声明不正确,则至少应为int main( void )

-And fflush(stdin);不是清除缓冲区的正确方法。这可能会导致未定义的行为。

- 你可以在这里调用除零average_regular = regular_members / regular_group;

答案 3 :(得分:1)

您的代码没有问题。 唯一的问题是全局可服务被初始化为0所以当你没有任何特殊或常规组时,

regular_group or special_group value will be 0.

并且任何no除以0都会给出浮点异常。我希望你明白这一点。

main() must return int .

休息没有问题。