Java возвращает 0 только в том случае, если уравнение не поддается факторизации


import java.util.Scanner;

public class QuadraticEquation
{
   private int a, b, c, d, s1, s2;

   public QuadraticEquation()
   {
      a = 1;
      b = 2;
      c = 1;
      d = 0;
      s1 = -1;
      s1 = -1;
   }

   public QuadraticEquation(int a, int b, int c)
   {
      this.a = a;
      this.b = b;
      this.c = c;
   }

   public int findDiscriminant(int a, int b, int c)
   {
      this.d = (int)Math.pow(b,2) - (4*a*c);
      return this.d;
   }

   public boolean equalRoots()
   {
      if (getSolution1() == getSolution2())
      {
         return true;
      } else {
         return false;
      }
   }

   public boolean noSolution()
   {
      if (Math.sqrt(this.d) == 0)
      {
         return false;
      } else {
         return true;
      }
   }

   public int getSolution1()
   {
      this.s1 = (int)(-b + Math.sqrt(this.d))/(2*a);
      return this.s1;
   }

   public int getSolution2()
   {
      this.s2 = (int)(-b - Math.sqrt(this.d))/(2*a);
      return this.s2;
   }

   public static void main (String args[])
   {
      Scanner input = new Scanner (System.in);
      for (int k = 1; k <= 3; k++)
      {
         System.out.print("Enter a, b, and c: ");
         int a = input.nextInt();
         int b = input.nextInt();
         int c = input.nextInt();

         QuadraticEquation q = new QuadraticEquation(a,b,c);

         if (q.noSolution() == true)
         {
            System.out.println("No real solution");
         } else if (q.equalRoots() == true) {
            System.out.println("The only solution is: " + q.getSolution1());
         } else {
            System.out.println("The two real solutions are: ");
            System.out.println(q.getSolution1());
            System.out.println(q.getSolution2());
         } //Else
      } //For
   } //Main
} //QuadraticEquations
У меня есть этот код, и я пытаюсь получить коэффициенты уравнения. Если решения не являются целыми числами, то он возвращает "нет реального решения". Если факторы одинаковы, то он возвращает единственный фактор. Если есть два фактора, то он должен вернуть два фактора. Это работает, когда есть только 1 фактор, (ex. когда a=1, b=2 и c=1), но это не работает, когда уравнение не поддается факторизации, и когда есть два решения, оно возвращает только 1.

Здесь текущий неверный вывод:

 ----jGRASP exec: java QuadraticEquation
Enter a, b, and c: 1 1 1
The only solution is: 0
Enter a, b, and c: 
 ----jGRASP: process ended by user.

 ----jGRASP exec: java QuadraticEquation
Enter a, b, and c: 1 -5 6
The only solution is: 2
Enter a, b, and c: 
 ----jGRASP: process ended by user.

 ----jGRASP exec: java QuadraticEquation
Enter a, b, and c: 1 2 1
The only solution is: -1
Enter a, b, and c: 
 ----jGRASP: process ended by user.

 ----jGRASP exec: java QuadraticEquation
Enter a, b, and c: 1 -4 4
The only solution is: 2
Enter a, b, and c:

Правка:

Благодаря bcsb1001 я пересмотрел свой код, и он работает.

import java.util.Scanner;

public class QuadraticEquation
{
   private int a, b, c, d;

   public QuadraticEquation(int a, int b, int c)
   {
      this.a = a;
      this.b = b;
      this.c = c;
      this.d = findDiscriminant(a, b, c);
   }

   public int findDiscriminant(int a, int b, int c)
   {
      return (int)Math.pow(b,2) - (4*a*c);
   }

   public boolean equalRoots()
   {
      return this.d == 0;
   }

   public boolean noSolution()
   {
      return this.d < 0;
   }

   public int getSolution1()
   {
      return (int)(-b + Math.sqrt(this.d))/(2*a);
   }

   public int getSolution2()
   {
      return (int)(-b - Math.sqrt(this.d))/(2*a);
   }

   public static void main (String args[])
   {
      Scanner input = new Scanner (System.in);
      for (int k = 1; k <= 3; k++)
      {
         System.out.print("Enter a, b, and c: ");
         int a = input.nextInt();
         int b = input.nextInt();
         int c = input.nextInt();

         QuadraticEquation q = new QuadraticEquation(a,b,c);

         if (q.noSolution() == true)
         {
            System.out.println("No real solution");
         } else if (q.equalRoots() == true) {
            System.out.println("The only solution is: " + q.getSolution1());
         } else {
            System.out.println("The two real solutions are: ");
            System.out.println(q.getSolution1());
            System.out.println(q.getSolution2());
         } //Else
      } //For
   } //Main
} //QuadraticEquations
Кстати, я был вынужден делать некоторые вещи, такие как создание "findDiscriminant", потому что рабочий лист заставил меня сделать это. Это дало мне основной метод, и я должен был выяснить все оттуда.
1 2

1 ответ:

Ваша базовая логика кода неисправна.

equalRoots() должно называться hasOnlyOneSolution и должно быть точно
return this.d == 0.

noSolution() должно быть просто return this.d < 0.

И обратите внимание, что Вы Никогда не вызываете findDiscriminant, что заставляет d оставаться 0.

Это основное математическое различие, которое вы делаете, когда работаете над этой проблемой на бумаге. И точно такая же логика должна быть реализована в коде.

Последнее замечание: вы смешиваете поля и локальные переменные, как сумасшедший. Почему findDiscriminant возвращает что-то и устанавливает d. И почему его пропускают a, b и c вместо того, чтобы просто обращаться к полям с тем же именем и, надеюсь, с тем же содержанием?


public class QuadraticEquation {
    private int a, b, d;

    public QuadraticEquation(int a, int b, int c) {
        this.a = a;
        this.b = b;
        this.d = b * b - (4 * a * c);
    }

    public boolean hasOnlyOneSolution() {
        return d == 0;
    }

    public boolean noSolution() {
        return d < 0;
    }

    public int getSolution1() {
        return (int) (-b + Math.sqrt(this.d)) / (2 * a);
    }

    public int getSolution2() {
        return (int) (-b - Math.sqrt(this.d)) / (2 * a);
    }

    // + your main method
}