[Java] Klasa Rational - problem ze skracaniem liczb

dajana0
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 16 mar 2011, o 16:10
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 6 razy

[Java] Klasa Rational - problem ze skracaniem liczb

Post autor: dajana0 »

A więc: mam do napisania klasę Rational i niestety nie wiem co napisać by te liczby się skracały (np. 6/4 =3/2). Proszę o pomoc. A to co do tej pory stworzyłam:

Kod: Zaznacz cały

import java.io.*;
import java.util.*;

public class Rational {
 
	
	Scanner scan = new Scanner(System.in);
	int licznik = 0;
  int mianownik = 1;
  

 
public Rational(){
	}

	public Rational (int licznik, int mianownik){
	this.licznik = licznik;
	if(mianownik == 0)
			throw new IllegalArgumentException();
	this.mianownik=mianownik;
	}
	
	
	public Rational add(Rational arg) {
    return new Rational((this.licznik * arg.mianownik) + (arg.licznik * this.mianownik), this.mianownik * arg.mianownik);
		
  }
	public Rational sub(Rational arg){
	return new Rational ((this.licznik * arg.mianownik) - (arg.licznik * this.mianownik),this.mianownik * arg.mianownik);
		
  }
	public Rational mul(Rational arg){
	return new Rational (this.licznik * arg.licznik, this.mianownik * arg.mianownik);
	
	}
	public Rational div(Rational arg){
	if(arg.licznik==0)
	throw new ArithmeticException();
	return new Rational (this.licznik * arg.mianownik,this.mianownik * arg.licznik);
	
	}
	public boolean equals(Rational arg){
	if ((this.licznik==arg.licznik)&&(this.mianownik==arg.mianownik)){
	
	
	}
	 if ((this.mianownik != 0) && (arg.mianownik != 0) && ((this.licznik / this.mianownik) == (arg.licznik / arg.mianownik)))
      return true;
    return false;
	}
	public boolean lessThan(Rational arg){
	if((this.licznik*arg.mianownik)<(arg.licznik*this.mianownik))
	return true;
		return false;
	}
	
	public boolean greaterThan(Rational arg){
	if((this.licznik*arg.mianownik)>(arg.licznik*this.mianownik))
	return true;
		return false;
	}
	

	public String toString() {
  
    if ((licznik == 0) || (mianownik == 1))
      return "( " + licznik  + " )";
    return "(" + this.licznik + "/" + this.mianownik + ")";
  }
  
  public static void main(String[] args){
  
	String data = javax.swing.JOptionPane.showInputDialog("1. licznik?");
		int m = Integer.parseInt(data);
	String data2 = javax.swing.JOptionPane.showInputDialog("1. mianownik?");
		int n = Integer.parseInt(data2);
		
	Rational r1=  new Rational(m, n);
		System.out.println("Pierwsza liczba to : "+r1);

	String data3 = javax.swing.JOptionPane.showInputDialog("2. licznik?");
		int m2 = Integer.parseInt(data3);
	String data4 = javax.swing.JOptionPane.showInputDialog("2. mianownik?");
		int n2 = Integer.parseInt(data4);
		
	Rational r2 = new Rational (m2, n2);
		System.out.println("Druga liczba to: "+r2);
		System.out.println();
		
	   Rational r3 = r1.add(r2);
	   Rational r4 = r1.sub(r2);
	   Rational r5 = r1.mul(r2);
	   Rational r6 = r1.div(r2);
	   for(int x=0; x<1; x++){
				if(r1.equals(r2))
			System.out.println("Liczby sa rowne ");
			if(r1.lessThan(r2))
			System.out.println("Pierwsza jest mniejsza");
			else
			System.out.println("Druga jest mniejsza");
	   }
	
		System.out.println("Suma to :" +r3);
	     System.out.println("Roznica to :" +r4);
		   System.out.println("Iloczyn to :" +r5);
		     System.out.println("Iloraz to :" +r6);
			 
			
			 
	
	   
    }
}
Z Góry dziękuję !!
Ostatnio zmieniony 5 sty 2014, o 12:07 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
ravgirl
Użytkownik
Użytkownik
Posty: 171
Rejestracja: 29 gru 2013, o 17:41
Płeć: Kobieta
Lokalizacja: Pruszków
Pomógł: 64 razy

[Java] Klasa Rational - problem ze skracaniem liczb

Post autor: ravgirl »

Metodę (pewnie w osobnej klasie) znajdującą NWD licznika i mianownika, oraz metodę (pewnie w klasie Rational) dzielącą licznik i mianownik przez znaleziony NWD, o ile jest on różny od 1
zeus_156
Użytkownik
Użytkownik
Posty: 36
Rejestracja: 9 sie 2013, o 15:16
Płeć: Mężczyzna
Lokalizacja: KRK
Pomógł: 7 razy

[Java] Klasa Rational - problem ze skracaniem liczb

Post autor: zeus_156 »

ravgirl pisze:Metodę (pewnie w osobnej klasie) znajdującą NWD licznika i mianownika, oraz metodę (pewnie w klasie Rational) dzielącą licznik i mianownik przez znaleziony NWD, o ile jest on różny od 1
Dobry pomysł z osobną klasą na metodę znajdującą NWD. Natomiast skracanie licznika i mianownika umieścił bym w konstruktorze klasy Rational, bo każda operacja arytmetyczna w tej klasie jako wynik tworzy nowy obiekt klasy Rational. To mogło by wyglądać tak:

Kod: Zaznacz cały

  public Rational (int licznik, int mianownik) {
    if(mianownik == 0)
      throw new IllegalArgumentException();
    if(licznik == 0) {
      // To jest potrzebne, bo nie wszystkie implementacje NWD radzą sobie z 0 (zerem)
      this.licznik = licznik;
      this.mianownik = 1;
    }
    else {
      int nwd = Nwd.Nwd(Math.abs(licznik), Math.abs(mianownik));
      if(nwd == 1) {
        this.licznik = licznik;
        this.mianownik = mianownik;
      }
      else {
        this.licznik = licznik / nwd;
        this.mianownik = mianownik / nwd;
      }
    }
  }
Najprostszy kod do NWD znajdziesz tu: w sekcji "Funkcja wyliczająca NWD w C/C++", który bez problemu przerobisz na java.


Zauważyłem też błąd w metodzie public boolean equals(Rational arg) - dzielenie liczb całkowitych daje liczbę całkowitą, więc jest wiele możliwości kiedy ta funkcja zwróci błędną wartość. Możesz to sprawdzić na przykładzie: czy 8/7 i 9/7 są "equals"?
Proponuje zamienić tą metodę na taki sam wzór jak metoda lessThan, co wyglądało by tak:

Kod: Zaznacz cały

   public boolean equals(Rational arg) {
   if((this.licznik * arg.mianownik) == (arg.licznik * this.mianownik))
      return true;
   return false;
   }
dajana0
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 16 mar 2011, o 16:10
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 6 razy

[Java] Klasa Rational - problem ze skracaniem liczb

Post autor: dajana0 »

Dziękuję, jesteście wielcy!!!
ODPOWIEDZ