1

这是代码:

#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,它自动成为一个常规组,但如果它小于它一个特殊组。我需要每个类别的成员总数。成员总数工作正常。但我还需要一组两个类别的平均大小。但平均值始终为 0,000000。但我找不到错误..请帮助我

非常感谢你 !

4

4 回答 4

2

这是因为

  1. 您正在划分两个整数regular_members/regular_group,除法后给出一个整数。如果分子将小于分母,那么您将得到0结果。
  2. 您没有初始化变量regular_groupregular_membersspecial_groupspecial_members和。average_specialaverage_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_special, average_regularto 0


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

#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 回答
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;
于 2013-09-16T17:10:35.217 回答
1

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

将其中一个变量转换为浮点数,除法将产生浮点数。

average_regular = regular_members/(float)regular_group;

和其他版本类似average_special

- 另外你的主要声明不正确,至少应该是int main( void )

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

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

于 2013-09-16T17:05:32.193 回答
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 回答