【问题标题】:Sums not adding correctly总和未正确添加
【发布时间】:2016-02-22 17:43:57
【问题描述】:
#include <stdio.h>

#define MINIMUM 1
#define MAXIMUM 20

int main ()
{
//Declaring variables.
char name[50];
int number, even_sum, odd_sum, even_count, odd_count;

//Sets all variables to zero.
even_sum=0;
odd_sum=0;
even_count=0;
odd_count=0;

//Asks the user to enter their name and their choice of numbers.
printf("Please enter your first name.\n");
    scanf("%s", name);

printf("Please enter integer numbers ranging from 1 to 20; when you're finished entering numbers, enter 0.\n");
    scanf("%d", &number);

//Begins loop to decide if the numbers entered are even or odd and adding them to respective totals.
while (number>=MINIMUM && number<=MAXIMUM)
{
    printf("Please enter integer numbers ranging from 1 to 20; when you're finished entering numbers, enter 0.\n");
        scanf("%d", &number);

    if (number%2==0)
    {
    even_sum += number;
    even_count++;
    }

    else
    {
    odd_sum+=number;
    odd_count++;
    }
}

//Separating each line makes it easier to read. The following lines print out the final count and totals of all numbers entered.
printf("\n%s, the numbers you entered are broken down as follows:\n\n", name);
printf("You entered %d even numbers with a total value of %d.\n", even_count, even_sum);
printf("You also entered %d odd numbers with a total value of %d.\n", odd_count, odd_sum);


return 0;
}

我上次运行它时使用了整数 2、4、3,并以 0 退出。 输出显示我有 2 个偶数条目,总值为 4。 另外,我有 1 个奇怪的条目,总共 3 个。

奇数输出是正确的,但偶数是错误的,我不知道我做错了什么。

【问题讨论】:

  • 请正确格式化您的代码并根据语言选择标签
  • 我尝试格式化它,但它不会“接受”while 行。
  • 感谢您的帮助编辑!
  • 是的,因为您也在循环的外部执行printf(); scanf()(或者,您可以将其设为do {...} while ();-loop)。

标签: c addition


【解决方案1】:

很难说什么是错的,因为 sn-p 提供的并没有给出完整的画面。 你在减少吗

号码

变量?

请进行一些测试并提供结果,比如说 1、3、5、7、11、13。

--

编辑

正如@Deddy 所发现的,您需要从循环中添加退出语句, 所以让我们在用户提供 0 时跳过它

if (number>0){
      if (number%2==0)
      {
....
}

不要忘记关闭括号:-)

【讨论】:

  • 对不起,我添加了整个代码。我现在就试试这些数字。
  • 我得到了 1 个偶数,总共 0。我得到了 5 个奇数,总共 39 个(总数应该是 40)。
  • 我的答案有更新 - 添加 if 语句以避免处理最后一个“0”
  • 好的!我做了这个编辑,但它仍然输出不正确的计数和总值。它只输出我为偶数输入的最后一个值;奇数条目是正确的。
  • 因为有误会的可能——决定贴出完整的代码sn-p
【解决方案2】:

你在偶数中得到 3,因为你输入的不是 2 4 3,而是 2 4 3 0。

当您输入 0 时,程序正在等待 scanf 上的输入,然后继续检查输入 0 的 if。

因为 0%2==0 你给偶数计数器加了 1,然后你才检查了 while 条件,发现输入为 0 并停止了 while 循环。

新代码之后: 当您的程序要求您输入下一个数字时,您在 while 循环之外输入的第一个数字会丢失,您从未将它添加到任何计数器中,因此您的程序自然不会考虑它。

您输入了号码,然后您立即要求输入新号码。 我的一位教授曾经告诉我 - 如果一台计算机进行了计算,但没有存储它 - 它是否进行了任何计算?

解决它的方法之一是将while循环中的scanf移动到循环的末尾。

这样第一个数字会被计算到结果中,而导致退出的输入不会。

printf("Please enter integer numbers ranging from 1 to 20; when you're finished entering numbers, enter 0.\n");
    scanf("%d", &number);

//Begins loop to decide if the numbers entered are even or odd and adding them to respective totals.
while (number>=MINIMUM && number<=MAXIMUM)
{
    if (number%2==0)
    {
        printf("even\n");
    even_sum += number;
    even_count++;
    }

    else
    {
        printf("odd\n");
    odd_sum+=number;
    odd_count++;
    }
    printf("Please enter integer numbers ranging from 1 to 20; when you're finished entering numbers, enter 0.\n");
        scanf("%d", &number);
}

【讨论】:

  • 我在哪里得到偶数中的 3??
  • 在你的代码的第一个版本中,我现在正在查看编辑。
  • 哦,好吧,我很困惑。对不起,这是我第一次使用这个网站,所以我只是想习惯它。
  • 太棒了!非常感谢。你解释它的方式更有意义,我现在得到了所有东西的正确值。谢谢!!!
  • 对不起,但是当输入0时,并没有进入循环,所以对0输入什么都不做(既不加,也不计数)这里的问题是,它在不处理的情况下抛出了第一个数据,而你没有专注于它。
【解决方案3】:

所以决定用一个额外的变量来改造逻辑循环

#include <stdio.h>

#define MINIMUM 1
#define MAXIMUM 20

int main ()
{
    //Declaring variables.
    char name[50];
    int number, even_sum, odd_sum, even_count, odd_count;
    bool  canWeGo;

    //Sets all variables to zero.
    even_sum=0;
    odd_sum=0;
    even_count=0;
    odd_count=0;
    canWeGo=true;

    while (canWeGo)
    {
        printf("Please enter integer numbers ranging from 1 to 20; when you're finished entering numbers, enter 0.\n");
            scanf("%d", &number);

        canWeGo = number>=INIMUM && number<=MAXIMUM;

        if (canWeGo)
        {
            if (number%2==0)
            {
                even_sum += number;
                even_count++;
            }
            else
            {
                odd_sum+=number;
                odd_count++;
            }
        }   
    }

    /Separating each line makes it easier to read. The following lines print out the final count and totals of all numbers entered.
    printf("\n%s, the numbers you entered are broken down as follows:\n\n", name);
    printf("You entered %d even numbers with a total value of %d.\n", even_count, even_sum);
    printf("You also entered %d odd numbers with a total value of %d.\n", odd_count, odd_sum);

    return 0;
}

【讨论】:

    【解决方案4】:

    问题是你在进入循环后丢弃了第一个数据,因为你正在再次读取它(所以丢弃它)

    你最好移动 printf();扫描();循环中的序列到它的末尾,所以你实际上可以使用数据输入。

    您的代码中有两个问题:您正确地检查了输入数据是否在进入处理的两个限制之间,但是一旦进入循环,您就会丢弃这些数据以获取新数据。这使得数据不再被检查(所以它可以是您用来退出循环的令牌数据,这使得它被作为数据处理,它不能)。并且您将 0 处理为数据,而第一个数据完全被忽略。

    要纠正您的问题,解决方案可以是将循环内的printf(); scanf(); 序列移动到它的最后部分,在这种情况下,您将在第一个数据案例中处理数据,而不是再次进入循环当你最终输入0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多