こんにちは、このウェブサイトの素晴らしい人々です。プログラミングの将来を追求したいので、Javaを学び始めました。最近、私はすべての論理を無視しているように見えるバグに遭遇しました。考えられるすべての理由を突き止めようとしてどれだけ長くそこに座っていたとしても、1 つを見つけることができませんでした。
import javax.swing.JOptionPane;
public class Answer extends Main {
private static long numerator;
private static long preNumerator;
private static long denominator;
private static long preDenominator;
private static long remainder;
private static String result;
// private static long answer;
// public Line(){
// super();
// }
//
// public Line(long numerator, long denominator, long remainder){
// super(numerator, denominator, remainder);
// }
public Answer() {
this(0, 0);
}
public Answer(long n, long d) {
numNegativeCheck(n, d);
}
public static void numNegativeCheck(long n, long d) {
if (n < 0 || d < 0) {
numerator = n * 2;
numerator = n - numerator;
denominator = d * 2;
denominator = d - denominator;
remainderCalculate(numerator, denominator);
} else {
if (n > 0 || d > 0) {
remainderCalculate(n, d);
} else {
if (n > 0 || d < 0) {
preNumerator = n * 2;
numerator = n - preNumerator;
preDenominator = d * 2;
denominator = d - preDenominator;
remainderCalculateNeg(numerator, denominator);
} else {
if (n < 0 || d > 0) {
remainderCalculateNeg(n, d);
} else {
JOptionPane.showMessageDialog(null, "Error!");
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////
public static void remainderCalculateNeg(long n, long d) {
remainder = n / d;
remainderCheckNeg(n, d, remainder);
}
public static void remainderCheckNeg(long n, long d, long r) {
if (r == 0) {
calculationsRZeroNeg(n, d, r);
} else {
calculationsRNeg(n, d, r);
}
}
public static void calculationsRNeg(long n, long d, long r) {
numerator = n / remainder;
denominator = d / remainder;
displayNeg(numerator, denominator, r);
}
public static void calculationsRZeroNeg(long n, long d, long r) {
numerator = n / d;
denominator = 1;
displayNeg(numerator, denominator, r);
}
public static void displayNeg(long n, long d, long r){
if (r == 0){
result = "The answer is: " + numerator;
}else{
result = "The answer is: " + numerator + "/" + denominator;
}
}
////////////////////////////////////////////////////////////////////////////////////////
public static void remainderCalculate(long n, long d) {
if (n > d) {
remainder = n % d;
remainderCheck(n, d, remainder);
} else {
remainder = d % n;
remainderCheck(n, d, remainder);
}
}
public static void remainderCheck(long n, long d, long r) {
if (r == 0) {
calculationsRZero(n, d, r);
} else {
calculationsR(n, d, r);
}
}
public static void calculationsR(long n, long d, long r) {
numerator = n / remainder;
denominator = d / remainder;
displayFraction(n, d);
}
public static void calculationsRZero(long n, long d, long r) {
if (n > d) {
numerator = n / d;
denominator = 1;
displayFull(n, d);
} else {
denominator = d / n;
numerator = 1;
displayFull(n, d);
}
}
public static void displayFull(long n, long d) {
if (n > d) {
result = "The answer is: " + numerator;
} else {
result = "The answer is: " + numerator + "/" + denominator;
}
}
public static void displayFraction(long n, long d) {
result = "The answer is: " + numerator + "/" + denominator;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
public long getNumerator() {
return this.numerator;
}
public long getDenominator() {
return this.denominator;
}
public String getResult() {
return this.result;
}
}
このコードは少し面倒かもしれませんが、簡単な要点を説明します。分数を減らすことができる小さなプログラムを作成しています。分子と分母の両方の位置で負を処理でき、分母が1の場合は表示されず、分子は整数として表示されます(空想、私は知っています)。numNegativeCheck は、分数のどの部分が実際に負であるかを単純にチェックし、正常に機能します。2 番目のすべての負の部分は、単に負の数に関係するメソッドであり、最後の部分は正の数に関するものです。
問題について: プログラムはうまく動作しているように見えますが、正の分子 (例: 32) と負の分母 (例: -4) を入力すると、"-8/1" と表示されることに気付きました。これは正しいですが、私のプログラムが行うことの大部分は、分母が 1 の場合に分子だけを表示するという事実です。したがって、「-8」と表示されるはずです。
負の計算方法が終了すると、それらは負の表示方法に向けられます。ただし、奇妙な理由で、まったく別のセクション用の「displayFraction」メソッドが呼び出されます。私は過去 1 時間、このことについて考えていました。コンピューターの画面の前に座ってコードを 1 行ずつ何度も調べていましたが、 「displayNeg」メソッドは別のものを呼び出します。誰かが解決策を持っているなら、私はすべての耳です。