Klasa ułamek w Javie

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.

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;
    }

}

2

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

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.

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"

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.

1
    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;
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1