Klasa ułamek w Javie

Klasa ułamek w Javie
M5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

Mam zadanie:
Zdefiniuj klasę ułamek. Zaimplementuj metody dodawanie, odejmowania oraz skracania ułamka.

Niżej mój kod, czasem daje poprawne wyniki, czasem nie. Nie mogę znaleźć co jest źle, będę wdzięczny jak ktoś podpowie gdzie jest błąd.

Kopiuj
import java.util.Scanner;

public class Ulamek{
    public static void main(String[] args){

        Scanner input = new Scanner(System.in);
        System.out.println("Podaj licznik i mianownik pierwszego ulamka: ");
        Fraction ulamek1 = new Fraction(input.nextInt(), input.nextInt());
        System.out.println("Podaj licznik i mianownik drugiego ulamka: ");
        Fraction ulamek2 = new Fraction(input.nextInt(), input.nextInt());
        System.out.println("Jaka operacje chcesz wykonac? ( +, -)");
        char c = input.next().charAt(0);
        System.out.print(ulamek1);
        System.out.print(" " + c + " ");
        System.out.println(ulamek2);
        switch(c){
            case '-':
            System.out.println(ulamek1.sub(ulamek2));
            break;
            case '+':
            System.out.println(ulamek1.sum(ulamek2));
            break;
        }
    }
}

class Fraction{
    private int numerator;
    private int denominator;

    public Fraction(int numerator, int denominator){
        if(denominator < 0){
           this.numerator = -numerator;
           this.denominator = -denominator;
        }else{
              this.numerator = numerator;
              this.denominator = denominator;
        }
    }

    public Fraction sum(Fraction other){
        int nww =  nww(other.denominator, this.denominator);
        int newNumerator = nww/this.denominator*this.numerator + nww/other.denominator*numerator;
        return new Fraction(newNumerator, nww).reduce();
    }

    public Fraction sub(Fraction other){
        int nww = nww(this.denominator, other.denominator);
        int newNumerator = nww/this.denominator*this.numerator - nww/other.denominator*other.numerator;
        return new Fraction(newNumerator, nww).reduce();
    }

    public Fraction reduce(){
        int nwd = nwd(this.numerator, this.denominator);
        return new Fraction(this.numerator/nwd, this.denominator/nwd);
    }

    private int nwd(int a, int b){
        if(a < 0){
            a = -a;
        }
        if(b < 0){
            b = -b;
        }
       while(b != 0){
          int temp = b;
          b = a % b;
          a = temp;
       }
       return a;
    }

    private int nww(int a, int b){
        return a*b/nwd(a, b);
    }

    public String toString(){
        return numerator + "/" + denominator;
    }

}

PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 225
2

Hasło, którego szukasz, to debugger.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
1
maksym572285 napisał(a):

Niżej mój kod, czasem daje poprawne wyniki, czasem nie. Nie mogę znaleźć co jest źle, będę wdzięczny jak ktoś podpowie gdzie jest błąd.

Podaj przykłady kiedy dostajesz poprawne wyniki, kiedy nie.

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
1
maksym572285 napisał(a):

czasem daje poprawne wyniki, czasem nie.

To właśnie twoje zadanie. Mgliste określenie okolicznosci błędu masz przekuć w twarde

Nitk za ciebie nie okresli tego "czasem"

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3297
4

Pytanie pomocnicze, jaki jest najwyższy wspólny dzielnik 2 i 3? Co ma się stać, jak zrobisz 1/2 +1/3?
W sumowaniu i odejmowaniu zwracasz ułamek, którego mianownikiem jest nwd.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
    public Fraction(int numerator, int denominator)
    {
        if(denominator<0)
        {
           numerator=-numerator;
           denominator=-denominator;
        }
        int _nwd=nwd(numerator,denominator);
        this.numerator=numerator/_nwd;
        this.denominator=denominator/_nwd;
    }
    
    public static Fraction sum(Fraction a,Fraction b)
    {
        return new Fraction(a.numerator*b.denominator+b.numerator*a.denominator,a.denominator*b.denominator);
    }

    public static Fraction sub(Fraction a,Fraction b)
    {
        return new Fraction(a.numerator*b.denominator-b.numerator*a.denominator,a.denominator*b.denominator);
    }
    
    private int nwd(int a,int b)
    {
        a=Math.abs(a);
        b=Math.abs(b);
        while(b!=0)
        {
          int temp=b;
          b=a%b;
          a=temp;
       }
       return a;
    }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.