【问题标题】:What loop should I use and how?我应该使用什么循环以及如何使用?
【发布时间】:2016-08-19 15:19:10
【问题描述】:

程序是,用户将输入开始值、结束值和间隔。输出应该是,start_value 将被添加到间隔中,直到达到结束值。如果输出大于最终值,我想显示一些消息。示例:

Enter start value:5
 Enter end value: 30
 Enter interval value: 5
 Output: 5 10 15 20 25 30 // correct output
 2nd try
 Enter start value:5
 Enter end value: 30
 Enter interval value: 6
 Output: 5 11 17 23 29 35 // wrong output

我的代码:

while(start_value <= end_value)
{
    start_value = start_value + interval_value;             
    printf("%d ",start_value);                          
}

【问题讨论】:

  • “当 start_value 大于 end_value 时会产生无限循环”——废话。
  • 当 start_value 大于 end_value 时 - 不会。你可能在某处有一些整数溢出。
  • 显示的代码与您描述的不同。请使用Minimal Complete Verifiable Example 更新您的问题。
  • 如果您的问题是 35 显示在第二个输出中,即使 35 > 30,那是因为您在检查数字之前不会按间隔递增值。由 while 条件检查时的值是 29,然后在示例中添加 6,使其变为 35。我将在 while 循环中设置条件while((start_value+interval_value) &lt;= end_value)

标签: c loops for-loop while-loop swap


【解决方案1】:

您需要一个决定性的 if 条件。并且,在执行增量之前移动您的 printf() 语句。

如果 start_value > end_value,则交换它们; 否则,继续相同的循环。

为方便起见,引入一个临时变量来交换值。

if(start_value > end_value){
temp = start_value;
start_value = end_value;
end_value = temp;
}

while(start_value <= end_value)
{
   printf("%d ",start_value);
   start_value = start_value + interval_value;

}

【讨论】:

  • @mvidelgauz - 没听懂你说的!请详细说明。
  • 但显然它并没有解决 OP 间接描述的 real 问题..
  • 你问“我有帮助吗”,我说“是的,你是”(除了支持你的答案:-))
  • @EugeneSh。 - 我不知道 OP 的问题是如何解决的,一旦他决定交换或不交换,然后进入循环,如我所示。
  • @mvidelgauz - 谢谢,:)。虽然看起来我很有帮助,但是我也很困惑,因为我无法理解你的话。
【解决方案2】:

你需要先打印,然后递增。

while(start_value <= end_value)
{
    printf("%d ",start_value);                          
    start_value = start_value + interval_value;             
}

【讨论】:

    【解决方案3】:

    通常,如果您知道起点和终点(输入变量算作已知),则 For 循环是行业标准。

    如果您担心起始值大于结束值的情况,则应在进入循环之前包含验证代码。我建议使用一个函数来接收输入变量并进行检查,然后允许程序继续运行或提示用户输入有效。

    编辑:你的代码也没有无限循环,因为数字会增加,直到达到最大整数(大约 20 亿),环绕到最小整数(大约负 20 亿)并继续直到达到最终值。但是,您没有使用 printf("\n"); 清除缓冲区,这可能是您的问题所在。此外,如果条件不符合 while 循环条件中的描述,则您可能只是在起始值较大时没有输入它。

    【讨论】:

    • "... For 循环是行业标准。过度简化。
    • @Olaf 是的,但在类似于原始帖子的内容中,它通常是标准的。
    • 并非如此。许多编码风格指南禁止在条件下赋值。你会如何把它写成for 循环?末尾没有更新表达式,而是块的开头。
    • @Olaf 老实说,如果我是 OP,我会重组循环。虽然可以在块的开头创建一个 for 循环。
    • 是的,你可以用锤子把螺丝钉在墙上。如果您唯一的工具是锤子,那么每个问题看起来都像钉子。先写最容易理解的代码,除非这会搞砸程序。
    【解决方案4】:

    逻辑上当条件变为假时,循环终止。最好将所有代码放入变量中查看发生了什么,但是
    您可以在循环中使用正确的ifbreak 语句来随时切断循环的执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 2011-06-10
      • 2014-03-29
      • 1970-01-01
      • 2011-11-12
      • 2022-11-02
      • 2017-06-14
      • 2011-06-07
      相关资源
      最近更新 更多