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 等的情况)。在您的代码中发现的问题:
- 循环外的用户输入
- 没有 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
看来你使用的整个方法是错误的。您不应输入变量 m
和 n
。至少我没有看到在您的代码中输入和检查 0 的位置。
你在做的是计算
sum = sum + (m * n);
n - m + 1
次循环。因为 m
和 n
相应地输入了 1
和 2
你得到了 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);
}
其中的一些其他改进:我将 m
和 n
的范围缩小到循环内,并且我更改了 plus
以引用要插入的实际字符串,而不是通过布尔值间接。
可以说,您可能希望将 scanf()
分成您的两个调用,这样终止 0
就不需要配对:
if (scanf("%d", &m) != 1 || m == 0)
break;
if (scanf("%d", &n) != 1 || n == 0)
break;
我目前正在编写读取 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 等的情况)。在您的代码中发现的问题:
- 循环外的用户输入
- 没有 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
看来你使用的整个方法是错误的。您不应输入变量 m
和 n
。至少我没有看到在您的代码中输入和检查 0 的位置。
你在做的是计算
sum = sum + (m * n);
n - m + 1
次循环。因为 m
和 n
相应地输入了 1
和 2
你得到了 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);
}
其中的一些其他改进:我将 m
和 n
的范围缩小到循环内,并且我更改了 plus
以引用要插入的实际字符串,而不是通过布尔值间接。
可以说,您可能希望将 scanf()
分成您的两个调用,这样终止 0
就不需要配对:
if (scanf("%d", &m) != 1 || m == 0)
break;
if (scanf("%d", &n) != 1 || n == 0)
break;