【问题标题】:C loop until 0 is givenC循环直到给出0
【发布时间】:2021-04-15 12:23:53
【问题描述】:

我正在尝试创建一个循环,让用户一个接一个地输入数字并计算所有这些数字的总和,直到用户输入 0 作为输入。但是,我的代码只运行一次然后就停止了。

#include <stdio.h>

int main(void) {
    int i = 0;
    int num;
    int total = 0;

    printf("Give me a number \n");
    scanf("%d", num);
    
    if(num < 0 && num > 0){
        printf("Give me a number \n");
        scanf("%d", num);
        total = total + num;
        i = i + 1;
    }

    printf("The total is %d", total);
}

【问题讨论】:

  • 你能说出&lt; 0 &gt; 0的数字吗?
  • 另外,if 是一个分支,而不是一个循环。
  • 制作循环的典型方法是for(...)while(...)。您的代码没有循环。
  • 会不会是你第一次尝试num &lt;&gt; 0 à la Pascal?
  • @largest_prime_is_463035818 我认为最大的素数可以满足这一点;)

标签: c loops for-loop while-loop


【解决方案1】:
  1. 您的代码中没有循环

  2. 条件(num &lt; 0 &amp;&amp; num &gt; 0) 始终为假。一个数字不能是:小于零AND大于零

  3. scanf打错电话

你可能想要:

printf("Give me a number \n");
if (scanf("%d", &num) != 1) exit(1);
while(num != 0){
    total = total + num;
    i = i + 1;
    printf("Give me a number \n");
    if (scanf("%d", &num) != 1) exit(1);
}

如果用户输入非整数,上述解决方案将退出程序,例如一封信。

在非整数输入上结束循环的另一种解决方案是:

printf("Give me a number \n");
while(scanf("%d", &num) == 1 && num != 0){
    total = total + num;
    i = i + 1;
    printf("Give me a number \n");
}

最后一个解决方案甚至可以写得更紧凑——比如:

while(printf("Give me a number \n"), scanf("%d", &num) == 1 && num != 0){
    total = total + num;
    i = i + 1;
}

阅读起来有点困难,但避免了重复的行。

【讨论】:

  • 谢谢,我还在学习,不知道如何制作循环
【解决方案2】:

这是 IMO 的惯用方式。只有一个scanf 调用scanf,如果用户输入0,我们使用break 提前结束循环。

#include <stdio.h>

int main() {
  int i = 0;
  int num;
  int total = 0;

  while (1)          // loop forever
  {
    printf("Give me a number \n");
    scanf("%d", &num);

    if (num == 0)    // if the number is 0
      break;         // we terminate the loop

    total = total + num;
    i = i + 1;
  } 

  printf("You entered %d numbers, the total is %d", i, total);
}

免责声明:

  • 为简洁起见,scanf 没有错误检查,IMO 可以用于玩具程序。

否则4386427在他的answer中提供的备注是正确的。

【讨论】:

  • 同意 - 使用break 也是一个很好的解决方案。正如我在答案中添加的那样,可以在没有重复行和break 的情况下做到这一点,但这会使代码更难阅读。而且简单的代码通常更好...... ;-)
【解决方案3】:

确保在 scanf() 调用中获取变量 (&num) 的地址并添加 do{ } while() 语句。

int main(){
    int i = 0;
    int num;
    int total =0;
    do {
        printf("Give me a number \n");
        scanf("%d", &num);
        total = total + num;
        i = i + 1;
    } while(num != 0);
    printf("The total is %d", total);
}

【讨论】:

  • 哦,天哪,到目前为止,您似乎是唯一一个发现 scanf 问题的人。
  • 您的解决方案将i 增加一次太多
  • @4386427:原码有scanf("%d", num);。但是scanf 在这里需要一个地址,正如这个答案所指出的那样。
  • @4386427: i 从未被引用,因此可以从代码中删除。但是,i 在每个循环中都会增加一次,而不是太多。
  • @AD1170 如果用户输入“0”,您的代码会将i 设置为1。OP 的代码会将i 设置为0。
【解决方案4】:

问题在于您试图检查给定数字 (num) 是否一次大于 0 且小于 0 的 if 语句中,这就是无法访问 if 范围的原因你可以使用下面的 if 语句 if(num!=0) 这将检查 num 是否不为零!

并且由于您尝试重复此块直到插入 0,因此您必须改用 while/dowhile。

你还要注意scanf,因为你忘了指定num变量的指针(scanf("%d", &amp;num);

【讨论】:

    【解决方案5】:

    在您的情况下,使用while (num != 0) 会更合适。

    int main(){
        int i = 0;
        int num = 1;
        int total = -1;
        while (num != 0){
            printf("Give me a number \n");
            scanf("%d", &num);
            total = total + num;
            i = i + 1;
        }
        printf("The total is %d", total);
    }
    

    【讨论】:

    • 您的解决方案将i 增加一次太多
    猜你喜欢
    • 2012-10-10
    • 2020-07-31
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    相关资源
    最近更新 更多