【问题标题】:Incrementing in an IF Statement在 IF 语句中递增
【发布时间】:2014-02-23 18:05:27
【问题描述】:

在下面的代码中,如果我放置一个 if 语句告诉它递增 if,为什么它不起作用 “根

do {
    ++root;
    if ((number / root) == root) {
        System.out.printf("\nThe square root of %.0f is %.0f.\n", number, root);
        root = 101;
    } else if (root == 101) {
        System.out.printf(
                "The number %.0f does not have a square root.\n", number);
    }
} while (root < 101);       

像这样:

do {
    if ((number / root) == root) {
        System.out.printf("\nThe square root of %.0f is %.0f.\n", number, root);
        root = 101;
    } else if (root < 101) {
        ++root;
    } else {
        System.out.printf(
                "The number %.0f does not have a square root.\n", number);
    }
} while (root < 101);

【问题讨论】:

  • 您期望什么行为,您实际观察到什么?
  • 首先,请不要说System.out 没有printf 方法。将其更改为println
  • @rciovati:是的,一个System.out.printf 方法。你在说什么?
  • System.out.printf for java 是有效的,我一直用它上课。我将它们都设置为双精度,我使用双精度,因为整数会自动舍入。
  • 哦,我不应该相信我的记忆,下次请仔细检查 javadoc,对不起。

标签: java if-statement increment do-while


【解决方案1】:

这个布尔表达式让我担心:

(number / root) == root

这就是原因。

  • 如果numberroot 都不是double,那么你有整数除法。根据您的目标,这可能是不可取的。

  • 如果numberroot double,那么您可能会出现一些浮点数不准确的情况 - 有时,浮点商不会精确 /em> 等于一个整数。

    这就引出了另一种情况:

    • 如果root 是双精度,那么您可能在执行++root 时遇到问题。尝试递增浮点值时有点令人担忧。

排除了所有这些问题后,我们就只能靠猜测这些变量的真实类型了。但是,为了论证,我们假设numberdouble,而rootint。根据您要执行的操作,您可能希望将相等更改为不等式以检查它是否小于或等于,或者您可能希望完全重新进行比较。

【讨论】:

  • 它们都是双倍的。当我使用 int 时,它会自动舍入并使其认为 50 的平方根是 7。
  • 这对于等价检查会有问题。我鼓励您检查一下root 真的 是否也需要成为double
  • 不需要。问题不是数学不正确,而是如果我通过没有平方根的扫描仪输入一个值,它将立即结束程序而不是触发 else 语句。顶部代码可以正常工作,代码的底部是我正在尝试的旧版本,它不能正常工作。我只是不明白为什么 root 不会在 else if 语句中增加。范围界定?
【解决方案2】:

您的代码使您尝试实现的一个非常简单的功能变得复杂。您使用 do-while 循环和嵌套的 if 结构使我(当然还有您)比需要的更头痛。如果没有看到完整的代码,很难理解出了什么问题。

我注意到的第一件事(在您的第二个代码块中)是您有可能出现无限循环。考虑 root 是大于或等于 101 的数字的情况。您的代码将简单地默认为最后的 else 语句并无限打印:

 The number ___ does not have a square root.

现在,如果我正确理解您的代码,您正在尝试计算一个数字的平方根,最大根数为 100。这是代码的更好实现:

 public void printSquareRoot(int number, int max_root) {
     int root = 1; // note it's important to start at 1 
     while ( root <= max_root ) {
         if ( (number / root) == root) {
             System.out.printf("\nThe square root of %.0f is %.0f.\n",number, root);
             return; // we can quit out of the function
         }
         root++; // here we are incrementing to the next root
     }

     // Notice that if we reach this line of code then 
     // no root was found for the number
     System.out.printf("The number %.0f does not have a square root.\n", number);
 }

在您的代码中,我会使用您希望计算平方根的 numberma​​x_root 您希望尝试的最大根数来调用此函数。例如,如果您要计算 25 的平方根,直到 100 的最大根数:

printSquareRoot(25, 100);

【讨论】:

  • 是的,我有双根=1;我拥有的代码的顶部工作正常。我的问题是,如果通过扫描仪给程序一个没有平方根的数字帽子,为什么程序会以我向大家展示的第二段编码结束? Root = 1 所以它应该递增到 100 然后停止并显示消息,如果第一个 if 语句不正确,则表明它们不是平方根。
【解决方案3】:

所以通常这是预期的行为 - 您的中间 if 语句达到循环的退出条件。基本上,最后一个 if 永远不会执行,因为根永远不会大于或等于 101。

试试这个代码:

do {
    if ((number / root) == root) {
        System.out.printf("\nThe square root of %.0f is %.0f.\n",number, root);
        break;
    }
} while (++root < 101);

if( root == 101) {
    System.out.printf("The number %.0f does not have a square root.\n", number);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2015-01-14
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多