【问题标题】:how to get sum of each input printed?如何打印每个输入的总和?
【发布时间】:2020-11-21 17:17:15
【问题描述】:

我是 C 新手,需要一些有关此基本程序的帮助。我希望程序在输入后直接打印出总和。我试图将printf("..%d", sum); 放在 for 括号内,但程序在第一次输入后关闭。如果我在 For 之前和 for 括号内有一个 scanf("%d", &value);,它可以工作,但我没有得到我想要的格式。 我希望将值垂直打印,左侧应该是输入,右侧应该是输出,如您在图像中看到的那样。

这是我的代码

#include <stdio.h>
int main()
{
    int  sum = 0, c, value;
    scanf("%d", &value);

    for (c = 1; c <= value; c++)
    {
        sum = sum + c;
        printf("..%d", sum);
        scanf("%d", &value);
    }

    return 0;
}

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!当你说你没有得到你想要的格式时,你能解释一下你得到的是什么格式吗?
  • for 循环中的第二个scanf 是做什么用的?此外,您的printf 中需要一个换行符。即printf("..%d\n", sum);.
  • 我现在得到的格式是这样的 1 12 33 6... 所以我首先得到输出,除此之外我必须写新的值。但我想要的是在右侧而不是左侧获得输出。
  • 关于第二次scanf,就是这个问题。当我删除其中一个时,程序不起作用。对我来说很奇怪,因为我不知道为什么,我认为这会导致格式化出现问题。
  • edit 用请求的信息更新的问题。

标签: c printf scanf


【解决方案1】:

您似乎对实际求和的值有点困惑(或者我是...)根据您的问题描述(以及您如何初始化 for 循环),您似乎要输入结束值,然后从1 求和到那个值?

如果是这种情况,则无需在 for 循环中进行额外输入,您的循环变量会提供您应该添加到总和中的所有值。

此外,除非您验证返回以确定输入是成功还是失败,否则您无法正确使用任何用户输入功能。

总而言之,你可以这样做:

#include <stdio.h>

int main()
{
    int  sum = 0, c, value;
    
    fputs ("sum from 1 to: ", stdout);                      /* prompt for input */
    
    if (scanf ("%d", &value) != 1 || value < 1) {           /* VALIDATE EVERY INPUT !!! */
        fputs ("  error: invalid integer input or negative value.\n", stderr);
        return 1;
    }
    putchar ('\n');                             /* add newline before output */
    
    /* you are looping over the values of c -- no input is necessary */
    for (c = 1; c <= value; c++)
    {
        sum = sum + c;                          /* sum */
        printf ("%2d\t\t\t%d\n", c, sum);       /* output value added and sum */
    }

    return 0;
}

使用/输出示例

$ ./bin/suminput
sum from 1 to: 5

 1                      1
 2                      3
 3                      6
 4                      10
 5                      15

或者对于 1-10:

$ ./bin/suminput
sum from 1 to: 10

 1                      1
 2                      3
 3                      6
 4                      10
 5                      15
 6                      21
 7                      28
 8                      36
 9                      45
10                      55

或者如果提供了无效的输入:

$ ./bin/suminput
sum from 1 to: twenty
  error: invalid integer input or negative value.

或负值:

$ ./bin/suminput
sum from 1 to: -10
  error: invalid integer input or negative value.

没有伤害。


输入总和

我读取您的示例输入和输出的另一种方式(以 0 结束循环为特征)是您的任务只是读取输入并将它们求和,直到用户输入 0(或无效整数)显示每次输入后求和。这要容易得多——但验证每个输入的要求保持不变,例如

#include <stdio.h>

int main()
{
    int  sum = 0, value;
    
    while (scanf ("%d", &value) == 1 && value != 0) {    /* input value */
        sum += value;                                    /* sum */
        printf ("%20d\n", sum);                          /* output sum */
    }
}

使用/输出示例

$ ./bin/suminput2
1
                   1
2
                   3
3
                   6
4
                  10
5
                  15
0

或输入0 之前的任何随机值:

$ ./bin/suminput2
1
                   1
-2
                  -1
3
                   2
-4
                  -2
5
                   3
-6
                  -3
0

(注意:有一些方法可以将输入和输出放在同一行,但编译器和操作系统之间的不同。Windows 可以使用非标准 getch(),而在 Linux 上你需要做同样的事情通过使用tcsetattr() 将输入更改为非规范模式。另一种方法是保存输入,直到用户输入0,然后循环遍历所有输入的值并显示这些值(尽管这将消除@987654337 @ 在输入的末尾显示在您的示例输入中))

如果您还有其他问题(以及我是否正确解释您的问题),请仔细查看并告诉我。如果您确实需要输入每个值进行求和,请告诉我,我很乐意为您提供进一步帮助。

【讨论】:

  • 感谢您的回答似乎我无法解释我的问题,也许是因为我无法使用编码术语。但我在这里再试一次。我上面提交的代码是我的代码,它实际上可以按我想要的方式工作,除了输出格式,我不知道如何使用我拥有的一个 scanfs,因为我不认为我应该有两个 scanfs。我希望输入和输出都在同一行,其中输入在左侧,输出在写入处,并且它垂直于用户写入的每个数字。我可以在你的第一个例子中看到它。
  • 虽然它是一个非常基本的 c 程序,所以我不需要像你写的那样编写它,因为你的代码现在对我来说相当复杂,因为我刚刚开始使用 C。
  • 这就是我感到困惑的地方。如果您读取值 1st 然后循环,则循环内不需要scanf()。如果您只是在进入循环之前初始化sum = 0;,那么只需使用scanf() 的返回来控制您的循环,就像我在第二个示例中所做的那样。这一切都取决于你需要完成什么。如果循环中没有输入从1 到数字的总和——您只是在产生一个阶乘。用您的输入控制 while 循环,您只需将用户输入的任何值相加,然后在用户输入 0 时退出循环(就像sum + 0 == sum 一样有意义
  • 第二个例子匹配你的问题输入1, 2, 3, 4, 5, 0和输出1, 3, 6, 10, 15——完全正确。
  • while (scanf ("%d", &amp;value) &amp;&amp; value != 0) { 在文件末尾的无限循环中。建议while (scanf ("%d", &amp;value) == 1 &amp;&amp; value != 0) {
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2015-05-28
  • 2021-01-22
  • 2015-04-12
  • 2018-08-06
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多