C 中的 do while 循环:while 条件问题

do while loop in C: problem with while condition

提问人:Mil Pool 提问时间:4/2/2023 最后编辑:John BollingerMil Pool 更新时间:4/2/2023 访问量:103

问:

好吧,我觉得自己真的很愚蠢,也许我错过了一些东西,但我正在浏览我大学的一些材料,并且有一个关于输入 [0, 10](含)之间的数字并计算出数字的阶乘的问题代码。

材料中的代码:

#include <stdio.h>

int main(void) {
    int b, i;
    int f = 1;

    do {
        printf("Input a number within a set [0, 10]: ");
        scanf ("%d", &b);
    } while (b < 0 || b > 10);

    for (i = 2; i <= b; i++)
        f *= 1;

    printf("Factorial of the number %d (%d!) is: %d", f);

    return 0;
}

现在,我想指出,我真的是所有这些的初学者,但这看起来并不对劲,当我运行它(在 CodeBlocks 中)时,它显示了一个错误。

然后我想尝试自己写出代码,但我发现自己在 - 循环中挣扎,特别是循环部分的条件。dowhilewhile

我想一点一点地测试代码,这就是我写的:

#include <stdio.h>

int main () {
    int nmbr;
    int i;

    do {
        printf("Enter a number within the interval [0, 10]: \n");
        scanf("%d", &nmbr);
    } while (nmbr>= 0 && nmbr<= 10);

    printf("The number is: %d", nmbr);

    return 0;
}

现在,我的问题是,既然字面意思是大于或等于零和小于或等于 10 的每个数字——这意味着字面意思是 0 到 10 之间的每个数字,包括一个 0 和一个 10,为什么代码不起作用?nmbr >= 0 && nmbr <= 10nmbr

如果我放,它可以工作,但这不对,是吗?当它说它严格小于零或严格大于 10 的每个数字时,它怎么还能包含零或十?我是否遗漏了一些非常明显的东西?nmbr < 0 || nmbr > 10

总的来说,我试图让输入只在 0 到 10 之间(包括两者),我猜我正在为语法而苦苦挣扎。

C 循环 while-loop do-while

评论

0赞 John Bollinger 4/2/2023
@GSerg,重新格式化 OP 从另一个来源引用的代码似乎是不合适的。但是,如果你坚持这样做,那么你对我所做的编辑有什么异议吗?
0赞 GSerg 4/2/2023
@JohnBollinger 事实上,是你用你的编辑挫败了我的编辑尝试。 (当你要修复所有内容时,得到“已经编辑”的弹出窗口却发现这是一个不完整的编辑,使帖子处于半可读状态,这不是很烦人吗?但是,您所指的引用代码的重新格式化是什么?我添加了报价块的事实?我认为这适合引用。还是我添加了缩进?我相信没有缩进是由于 OP 不知道如何处理它们,而不是因为这是讲座材料想要的。
1赞 John Bollinger 4/2/2023
@GSerg,就其价值而言,我自己对编辑的第一次尝试被 OP 挫败了。是的,这很烦人,但它发生了。我所说的重新格式化是第一个程序的重新格式化,OP 说它来自 [课程] 材料。这就是为什么我自己没有重新格式化该程序的原因。我不太在乎这一点,但它似乎确实是你编辑的唯一我没有编辑的东西,而我做了其他几项更改,但你没有。我要问你的是后者。
0赞 chqrlie 4/2/2023
do { ... scanf("%d", &nmbr); } while (nmbr>= 0 && nmbr<= 10); -> for (;;) { ... if (scanf("%d", &nmbr) != 1) return 1; if (nmbr>= 0 && nmbr<= 10) break; }以及f *= 1; -> f *= i;
1赞 GSerg 4/2/2023
@JohnBollinger 看看 stackoverflow.com/posts/75912659/revisions,我相信唯一的其他区别是你删除了“嗯”、“字面意思”和“地狱”,我没有强烈的偏好,但本来不会想删除,但话又说回来,你错过了——但它现在正在分裂头发。如果您复制您的语言编辑,我很高兴。its

答:

1赞 Elliott Frisch 4/2/2023 #1

循环将在 介于两者之间并包含时执行。你希望它结束。此外,它不是.nmbr010nmbrnbmr

int nmbr;
int i;

do {
    printf("Enter a number within the interval [0, 10]: \n");
    scanf("%d", &nmbr); /* not nbmr */
} while (!(nmbr >= 0 && nmbr <= 10)); /* or, while (nmbr < 0 || nmbr > 10) */
printf("The number is: %d\n", nmbr);

评论

0赞 Mil Pool 4/2/2023
您能否详细说明第二个循环将如何执行我想要的操作,当它意味着它严格地每个小于零的数字或严格地每个大于零的数字时?这难道不意味着它不会完全包含我需要它的数字吗?
0赞 chqrlie 4/2/2023
的返回值也应该测试scanf()
0赞 Elliott Frisch 4/2/2023
循环应该在什么条件下继续执行?当数字超出所需间隔时。
0赞 John Bollinger 4/2/2023 #2

第一个代码示例中的循环一遍又一遍地提示并读取用户的输入,直到读取可接受的输入。 是执行循环的另一次迭代的条件。也就是说,小于零或大于 10 的值将被拒绝,这正是您所说的。whileb < 0 || b > 10b

现在,我的问题是,因为字面意思是 即大于或等于零的每个数字 AND 小于或等于 10 - 这意味着从字面上看是每个数字 介于 0 和 10 之间,包括 0 和 10,为什么代码不是 加工?nmbr >= 0 && nmbr <= 10nmbr

因为你弄错了测试的意义。当条件计算结果为 true 时,表示应执行循环的另一次迭代,从而拒绝当前输入。第一个代码中的条件适用于此。

我是否遗漏了一些非常明显的东西?

似乎是这样。见上文。


旁注:在第一个代码中,这个......

        f *= 1;

...肯定是错的。它看起来像 OCR 或转录错误。预期的代码无疑是

        f *= i;