当前位置: 首页 > 知识库问答 >
问题:

为什么跳过我的while循环?

邹野
2023-03-14

我想我的程序跳过了while循环,但我真的不确定到底发生了什么。该函数应该通过找到GCD,然后将分子和分母除以该数字来减少分数。

    class Rational {

private int numerator, denominator;

//Constructor
public Rational (int num, int den) {
    numerator = num;
    denominator = den;
}

//Method for multiplying fractions
public Rational times (Rational that) {
    Rational x = new Rational (this.numerator*that.numerator, this.denominator*that.denominator);
    x = x.reduce();
    return x;
}

//Method for displaying fractions as strings
public String toString() {
    return new String(numerator+"/"+denominator); 
}

//Method for adding fractions
public Rational plus(Rational that) {
    Rational x = new Rational ((this.numerator*that.denominator)+(that.numerator*this.denominator), 
            this.denominator*that.denominator);
    //x = x.reduce();
    return x;
}

//Method for subtracting fractions
public Rational minus(Rational that) {
    Rational x = new Rational ((this.numerator*that.denominator)-(that.numerator*this.denominator),
            this.denominator*that.denominator);
    //x = x.reduce();
    return x;
}

//Method for dividing fractions
public Rational divideBy(Rational that) {
    Rational x = new Rational (this.numerator*that.denominator, this.denominator*that.numerator);
    //x = x.reduce();
    return x; 
}

public Rational reduce() {
    int a = Math.abs(this.numerator);
    int b = Math.abs(this.denominator);
    int c = Math.min(a, b);
    System.out.println(c);
    System.out.println(a%c);
    System.out.println(b%c);
    if (a==0) {
        return new Rational (0,1);
    }
    else {
        while (((a%c)!= 0) && ((b%c)!= 0)) {
            c = c-1;
            System.out.println(c);
        }
        System.out.println(c);
        return new Rational (this.numerator/c,this.denominator/c);
    }
}
}   

public class RationalTester {

public static void main(String[] args) {
    Rational x = new Rational (6,4); //The fraction 6/4
    Rational y = new Rational (5,2); //The fraction 5/2
    Rational z = x.times(y); //Their product
    Rational w = x.plus(y); //Their sum
    Rational v = x.minus(y); //Their difference
    Rational u = x.divideBy(y); //Their quotient
    JOptionPane.showMessageDialog(null, x.toString()+" * "+y.toString()+" = "+z.toString());
    JOptionPane.showMessageDialog(null, x.toString()+" + "+y.toString()+" = "+w.toString());
    JOptionPane.showMessageDialog(null, x.toString()+" - "+y.toString()+" = "+v.toString());
    JOptionPane.showMessageDialog(null, x.toString()+" / "+y.toString()+" = "+u.toString());

}

}

我得到分子和分母的绝对值,以确保如果分数是负数,我会在最后保持它。如果分子为0,则要求我返回(0,1)。问题是关于while循环。。。似乎它被完全跳过了。有什么建议吗?

共有1个答案

叶淇
2023-03-14

因为它的条件总是假的。

在第一行中,您将c设置为等于a或b。因此有两种可能性:

  • 如果c==a,则a%c将为零。所以时条件为假。
  • 如果c==b,则b%c将为零。所以时条件为假。
 类似资料:
  • 我目前有一个问题,一个'而'循环不执行。如果输入文本文件有下一行,我将循环条件设置为true。然而,当我执行我的程序时,循环没有运行。我通过添加一个“System.out.println(text)”来确认这一点,正如我所怀疑的,没有产生任何文本。 什么问题导致循环无法执行?

  • 问题内容: 我有一个整数列表,我正在运行-loop来发现两个元素的总和是否等于另一个变量。所以,如果是等于和我有一个整数列表: ,那么函数应该打印所有数字的不同组合,。 我感觉自己快到了,但是当我使用该功能时,列表中发生了一些奇怪的事情。下面的代码用于显示所有需要计算的数字组合,但是列表中的所有其他元素都被跳过。 这是输出: 请注意如何,,,和被跳过。我正在使用第二个-loop不会使用原始值,然后

  • 问题内容: 我的代码产生了意外的结果。看来我的for循环跳过了第一次迭代,我不明白为什么。 返回…(假设输入的数字是姓名) 为什么第一个get.nextLine()被跳过? 问题答案: 当前,您对Scanner#nextInt的调用不占用换行符,因此将其传递给您的第一次调用,因此 不会 阻塞。 您将需要添加 通话后,您的第一个通话将阻止。

  • 在尝试理解汇编时(打开编译器优化),我看到这样的行为: 像这样一个非常基本的循环 经常被编译成(伪代码)

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码

  • 我想写一个计算长除法问题总进位的代码。这是我为carries编写的函数。我相信问题在于,第一个while循环并没有一直运行。如果是,为什么?这是在Python 3.5中实现的。