C 编程:整数序列的总和直到零并打印两个相乘整数的总和

C Programming: Sum of a sequence of integers until zero and prints the sum of two multiplied integers

我目前正在编写读取 m1、n1、m2、n2 形式的整数序列的代码,直到我输入零,然后打印出 m * n 的总和。这是我目前所拥有的:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
    int m, n, i, sum = 0;
    bool plus = true;
    scanf("%d", &m);
    scanf("%d", &n);
    for(i = m; i <= n; i++)
    {
            sum = sum + (m * n);
            if(!plus)
            {
                putchar('+');
            }
            printf("%d*%d", m, n);
            plus = false;
    }
    printf("=%d\n", sum);
    return 0;
}

如果我输入 1, 1, 0,它会打印出 1 * 1 = 1,但是如果我输入 1, 2, 3, 4, 0,它会打印出 1*2+1 *2=4。我只是对如何计算 1*2 和 3*4 感到困惑。

你永远不会读到第三个和第四个参数,因为 scanf 调用在循环之外。如果您将它们和加号初始化放在循环中,并更正循环初始化和终止条件,您的代码应该可以工作(如果我没有遗漏任何其他内容)。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{

  int sum, m, n;

  if (!scanf("%d", &m))
    return 0;

  while (m)
  {
    if (!scanf("%d", &n))
      return 0;

    sum += m * n;

    if (!scanf("%d", &m))
      return 0;
  }

  printf("%d", sum);
}

试试这个。我写得很快,但它应该可以工作。代码还应检查参数数量是否正确(用户输入 X 0 或 X X X 0 等的情况)。在您的代码中发现的问题:

  1. 循环外的用户输入
  2. 没有 scanf() returns 检查

I'm currently working on code that reads in a sequence of integers in the form of m1, n1, m2, n2, until I input a zero

看来你使用的整个方法是错误的。您不应输入变量 mn。至少我没有看到在您的代码中输入和检查 0 的位置。

你在做的是计算

sum = sum + (m * n);

n - m + 1 次循环。因为 mn 相应地输入了 12 你得到了 4 (1 * 2 + 1 * 2).

我可以建议以下方法。

#include <stdio.h>

int main(void) 
{
    printf( "Enter a sequence of integers (0 - exit): " );

    long long int sum = 0;
    int value, prev_value;
    unsigned int i;

    i = 0;
    while ( scanf( "%d", &value ) == 1 && value != 0 )
    {
        if ( i % 2 )
        {
            if ( i != 1 ) printf( " + " );
            printf( " %d * %d ", prev_value, value );
            sum += ( long long int )prev_value * value;
        }
        else
        {
            prev_value = value;
        }

        ++i;
    }

    if ( i % 2  )
    {
        if ( i != 1 ) printf( " + " );
        printf( "%d", prev_value );
        sum += prev_value;
    }

    printf( " = %lld\n", sum );

    return 0;
}

程序输出可能看起来像

Enter a sequence of integers (0 - exit):  1 2 3 4 0
1 * 2  +  3 * 4  = 14

你不想要这样的 for 循环,因为你想要无限循环。我的建议是在达到终止条件时(或当 scanf() 无法读取两个输入时)使用循环中的 while (true)break

#include <stdio.h>
#include <stdbool.h>

int main()
{
    int sum = 0;
    char const *plus = "";
    while (true)
    {
        int m, n;
        if (scanf("%d%d", &m, &n) != 2)
            break;
        if (m == 0 || n == 0)
            break;

        sum += m * n;
        printf("%s%d*%d", plus, m, n);
        plus = "+";
    }
    printf("=%d\n", sum);
}

其中的一些其他改进:我将 mn 的范围缩小到循环内,并且我更改了 plus 以引用要插入的实际字符串,而不是通过布尔值间接。

可以说,您可能希望将 scanf() 分成您的两个调用,这样终止 0 就不需要配对:

    if (scanf("%d", &m) != 1 || m == 0)
        break;
    if (scanf("%d", &n) != 1 || n == 0)
        break;