[Java] Klasa Rational - kilka obliczeń...

ŚwIeRsZcZ
Użytkownik
Użytkownik
Posty: 232
Rejestracja: 8 paź 2006, o 16:21
Płeć: Mężczyzna
Lokalizacja: Wawa
Podziękował: 121 razy
Pomógł: 1 raz

[Java] Klasa Rational - kilka obliczeń...

Post autor: ŚwIeRsZcZ »

Witam ! Mam takie zadanie:

Posługując się klasą Rational napisz metody realizujące poniższe zadania.

Liczniki i mianowniki dla tworzonych liczb wymiernych można pobierać z konsoli lub w oknie dialogowym.

1. Dla dwóch liczb wymiernych policz i wypisz:
1. ich średnią arytmetyczną.
2. ich średnią harmoniczną
2. Dla liczb wymiernych a11, a12, a21, a22 policz i wypisz wyznacznik macierzy, którą one tworzą oraz samą macierz.
3. Dla liczb wymiernych a11, a12, a21, a22, b11, b12, b21, b22 policz i wypisz iloczyn macierzy, które one tworzą oraz same macierze.
4. Dla macierzy A o elementach a11, a12, a21, a22 policz i wypisz macierz do niej odwrotną.

klasa wygląda tak:
Dana jest klasa Rational reprezentująca liczby wymierne i udostępniająca następujące metody:

1. dodawanie: Rational add(Rational arg);
2. mnożenie: Rational mul(Rational arg);
3. odejmowanie: Rational sub(Rational arg);
4. dzielenie: Rational div(Rational arg);
5. równość: boolean equals(Rational arg);
6. tekstowa reprezentacja liczby: String toString();

Obiekty tej klasy tworzy się tak: new Rational(licznik, mianownik) gdzie licznik i mianownik są liczbami całkowitymi, przy czym mianownik musi być różny od 0.
Wszystkie metody zwracają nowe obiekty, nie modyfikując argumentów.

Sposób użycia:

Rational r1 = new Rational(1, 2); // 1/2
Rational r2 = new Rational(1, 3); // 1/3
Rational r3 = r1.add(r2); // r3 = r1 + r2;
Rational r4 = r1.mul(r2.add(r3)); // r4 = r1 * (r2 + r3)
System.out.println(r3); // niejawne wywołanie metody toString()
System.out.println(r4.sub(new Rational(1, 1)));


Za jakąkolwiek pomoc będę bardzo wdzięczny.. niestety w programowaniu jestem zielony, stawiam pierwsze kroki ale na tym etapie ten program mnie przewyższa... Dzięki
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[Java] Klasa Rational - kilka obliczeń...

Post autor: smiechowiec »

Kod: Zaznacz cały

package rational;

public class Rational {
  int licznik = 0;
  int mianownik = 1;
  
  /** Creates a new instance of Rational */
  public Rational(int licznik, int mianownik) {
    this.licznik = licznik;
    if (mianownik == 0) {
      mianownik = 1;
      System.err.println("Błąd klasy Rational.
Mianownik nie może być równy 0.");
    }
    this.mianownik = mianownik;
  }
   
  private Rational add(Rational argument) {
    return new Rational((this.licznik * argument.mianownik) + (argument.licznik * this.mianownik),
        this.mianownik * argument.mianownik);
  }
  
  private Rational mul(Rational argument) {
    return new Rational(this.licznik * argument.licznik, this.mianownik * argument.mianownik);
  }
  
  private Rational sub(Rational argument) {
    return new Rational((this.licznik * argument.mianownik) - (argument.licznik * this.mianownik),
        this.mianownik * argument.mianownik);
  }

  private Rational div(Rational argument) {
    return new Rational(this.licznik * argument.mianownik, this.mianownik * argument.licznik);
  }

  public String toString() {
    return "(" + this.licznik + "/" + this.mianownik + ")";
  }

  // ułamek odwrotny
  private Rational reverse() {
    return new Rational(this.mianownik , this.licznik);
  }

  // ułamek o przeciwnym zanku
  private Rational inverse() {
    return new Rational( - this.licznik, this.mianownik);
  }
  
  public boolean equals(Rational argument) {
    if ((this.licznik == argument.licznik) && (this.mianownik == argument.mianownik))
      return true;
    if ((this.mianownik != 0) && (argument.mianownik != 0)
    && ((this.licznik / this.mianownik) == (argument.licznik / argument.mianownik)))
      return true;
    return false;
  }
  
  private float tofloat() {
    return ((float) this.licznik / (float) this.mianownik);
  }
  
  public static void main(String[] args) {
    Rational r1 = new Rational(1, 2);
    Rational r2 = new Rational(1, 4);
    Rational r3 = r1.add(r2).mul(new Rational(1, 2));
    System.out.println("Średnia arytmetyczna liczb " + r1 + " i " + r2 + " = " + r3);
    r3 = new Rational(2, 1).div( r1.reverse().add(r2.reverse()) );
    System.out.println("Średnia harmonmiczna liczb " + r1 + " i " + r2 + " = " + r3);
    Rational a11 = new Rational(1, 1);
    Rational a12 = new Rational(2, 1);
    Rational a21 = new Rational(2, 1);
    Rational a22 = new Rational(3, 1);
    r3 = a11.mul(a22).sub( a12.mul(a21) ); // det(A)
    System.out.println("Macierz A");
    System.out.println(a11 + "	" + a12);
    System.out.println(a21 + "	" + a22);
    System.out.println("Wyznacznik macierzy " + r3);
    Rational b11 = a22.div(r3);
    Rational b12 = a12.div(r3).inverse();
    Rational b21 = a21.div(r3).inverse();
    Rational b22 = a11.div(r3);
    System.out.println("Macierz B odwrotna do A");
    System.out.println(b11 + "	" + b12);
    System.out.println(b12 + "	" + b22);
    System.out.println("Iloczyn macierzy A * B");
    System.out.print(a11.mul(b11).add(a12.mul(b21)));
    System.out.println(a11.mul(b21).add(a12.mul(b22)));
    System.out.print(a21.mul(b11).add(a22.mul(b21)));
    System.out.println(a12.mul(b21).add(a22.mul(b22))); 
  }  
}
Ostatnio zmieniony 16 lis 2008, o 09:31 przez smiechowiec, łącznie zmieniany 1 raz.
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

[Java] Klasa Rational - kilka obliczeń...

Post autor: spajder »

uważaj na takie rzeczy, tj. na konwersję. Np. metoda toFloat działać nie będzie, bo najpierw oblicza wynik z dzielenia dwóch liczb całkowitych a potem konwertuje do float. Czy np. \(\displaystyle{ \frac{1}{3}}\) zamieni na \(\displaystyle{ $0$}\)
Ostatnio zmieniony 16 lis 2008, o 07:02 przez spajder, łącznie zmieniany 1 raz.
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[Java] Klasa Rational - kilka obliczeń...

Post autor: smiechowiec »

Prawda.

Kod: Zaznacz cały

package rational;

public class Rational {
  int licznik = 0;
  int mianownik = 1;
  
  /** Creates a new instance of Rational */
  public Rational(int licznik, int mianownik) {
    this.licznik = licznik;
    if (mianownik == 0) {
      mianownik = 1;
      System.err.println("Błąd klasy Rational.
Mianownik nie może być równy 0.");
    }
    this.mianownik = mianownik;
    shortr();
  }
   
  private Rational add(Rational argument) {
    return new Rational((this.licznik * argument.mianownik) + (argument.licznik * this.mianownik),
        this.mianownik * argument.mianownik);
  }
  
  private Rational mul(Rational argument) {
    return new Rational(this.licznik * argument.licznik, this.mianownik * argument.mianownik);
  }
  
  private Rational sub(Rational argument) {
    return new Rational((this.licznik * argument.mianownik) - (argument.licznik * this.mianownik),
        this.mianownik * argument.mianownik);
  }

  private Rational div(Rational argument) {
    return new Rational(this.licznik * argument.mianownik, this.mianownik * argument.licznik);
  }

  public String toString() {
    shortr();
    if ((licznik == 0) || (mianownik == 1))
      return "( " + licznik  + " )";
    return "(" + this.licznik + "/" + this.mianownik + ")";
  }

  // ułamek odwrotny
  private Rational reverse() {
    return new Rational(this.mianownik , this.licznik);
  }

  // ułamek o przeciwnym zanku
  private Rational inverse() {
    return new Rational( - this.licznik, this.mianownik);
  }
  // po skróceniu
  private Rational shortr() {
    if ((licznik % mianownik) == 0) {
      licznik = licznik / mianownik;
      mianownik = 1;
    }
    int ipom = licznik;
    if (licznik > mianownik)
      ipom = mianownik;
    for(int i = 2; i <= ipom; i++)
      if (((licznik % i) == 0) && ((mianownik % i) == 0)) {
        licznik = licznik / i;
        mianownik = mianownik / i;
      }
    return this;
  }

  public boolean equals(Rational argument) {
    if ((this.licznik == argument.licznik) && (this.mianownik == argument.mianownik))
      return true;
    if ((this.mianownik != 0) && (argument.mianownik != 0)
    && ((this.licznik / this.mianownik) == (argument.licznik / argument.mianownik)))
      return true;
    return false;
  }
  
  private float tofloat() {
    return ((float) this.licznik / (float) this.mianownik);
  }
  
  
  public static void main(String[] args) {
    Rational r1 = new Rational(1, 2);
    Rational r2 = new Rational(1, 4);
    Rational r3 = r1.add(r2).mul(new Rational(1, 2));
    System.out.println("Średnia arytmetyczna liczb " + r1 + " i " + r2 + " = " + r3);
    r3 = new Rational(2, 1).div( r1.reverse().add(r2.reverse()) );
    System.out.println("Średnia harmonmiczna liczb " + r1 + " i " + r2 + " = " + r3);
    Rational a11 = new Rational(1, 1);
    Rational a12 = new Rational(2, 1);
    Rational a21 = new Rational(2, 1);
    Rational a22 = new Rational(3, 1);
    r3 = a11.mul(a22).sub( a12.mul(a21) ); // det(A)
    System.out.println("Macierz A");
    System.out.println(a11 + "	" + a12);
    System.out.println(a21 + "	" + a22);
    System.out.println("Wyznacznik macierzy " + r3);
    Rational b11 = a22.div(r3);
    Rational b12 = a12.div(r3).inverse();
    Rational b21 = a21.div(r3).inverse();
    Rational b22 = a11.div(r3);
    System.out.println("Macierz B odwrotna do A");
    System.out.println(b11 + "	" + b12);
    System.out.println(b12 + "	" + b22);
    System.out.println("Iloczyn macierzy A * B");
    System.out.print(a11.mul(b11).add(a12.mul(b21)));
    System.out.println(a11.mul(b21).add(a12.mul(b22)));
    System.out.print(a21.mul(b11).add(a22.mul(b21)));
    System.out.println(a12.mul(b21).add(a22.mul(b22))); 
  }  
}
ŚwIeRsZcZ
Użytkownik
Użytkownik
Posty: 232
Rejestracja: 8 paź 2006, o 16:21
Płeć: Mężczyzna
Lokalizacja: Wawa
Podziękował: 121 razy
Pomógł: 1 raz

[Java] Klasa Rational - kilka obliczeń...

Post autor: ŚwIeRsZcZ »

Bardzo dziękuje za pomoc, program się odpala bez żadnych problemów.. Mam pytanie czy da się jakoś łatwo zmodyfikować kod, żeby program wczytywał liczby z konsoli ??

I jeszcze jedno pytanie, co możecie doradzić dla osoby chcącej nauczyć się programować w Javie , jakieś konkretne publikacje, sposoby na poznanie języka ?? Obecnie programowanie sprawia mi wiele problemów, najgorsze jest dla mnie to że przy jakiś zadaniach poprostu nie wiem "od czego zacząć" , jakim "sposobem" rozwiązać jakieś zadanie...

Dzięki wielkie
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[Java] Klasa Rational - kilka obliczeń...

Post autor: smiechowiec »

ŚwIeRsZcZ pisze:Mam pytanie czy da się jakoś łatwo zmodyfikować kod, żeby program wczytywał liczby z konsoli ??
Trochę poprawiłem powinno być mniej więcej dobrze,
Uruchamiasz w konsoli
java -jar "Rational.jar"

Kod: Zaznacz cały

package rational;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Rational {
  int licznik = 0;
  int mianownik = 1;
  
  /** Creates a new instance of Rational */
  public Rational(int licznik, int mianownik) {
    this.licznik = licznik;
    if (mianownik == 0) {
      mianownik = 1;
      System.err.println("Błąd klasy Rational.
Mianownik nie może być równy 0.");
    }
    this.mianownik = mianownik;
    if (this.mianownik < 0) {
      this.mianownik = - this.mianownik;
      this.licznik = - this.licznik;
    }
    shortr();
  }
   
  private Rational add(Rational argument) {
    return new Rational((this.licznik * argument.mianownik) + (argument.licznik * this.mianownik),
        this.mianownik * argument.mianownik);
  }
  
  private Rational mul(Rational argument) {
    return new Rational(this.licznik * argument.licznik, this.mianownik * argument.mianownik);
  }
  
  private Rational sub(Rational argument) {
    return new Rational((this.licznik * argument.mianownik) - (argument.licznik * this.mianownik),
        this.mianownik * argument.mianownik);
  }

  private Rational div(Rational argument) {
    return new Rational(this.licznik * argument.mianownik, this.mianownik * argument.licznik);
  }

  public String toString() {
    shortr();
    if ((licznik == 0) || (mianownik == 1))
      return "( " + licznik  + " )";
    return "(" + this.licznik + "/" + this.mianownik + ")";
  }

  // ułamek odwrotny
  private Rational reverse() {
    return new Rational(this.mianownik , this.licznik);
  }

  // ułamek o przeciwnym zanku
  private Rational inverse() {
    return new Rational( - this.licznik, this.mianownik);
  }
  // po skróceniu
  private Rational shortr() {
    if ((licznik % mianownik) == 0) {
      licznik = licznik / mianownik;
      mianownik = 1;
    }
    int ipom = licznik;
    if (licznik > mianownik)
      ipom = mianownik;
    if (ipom < 0)
      ipom = -ipom;
    for(int i = 2; i < ipom; i++)
      if (((licznik % i) == 0) && ((mianownik % i) == 0)) {
        licznik = licznik / i;
        mianownik = mianownik / i;
      }
    return this;
  }

  public boolean equals(Rational argument) {
    if ((this.licznik == argument.licznik) && (this.mianownik == argument.mianownik))
      return true;
    if ((this.mianownik != 0) && (argument.mianownik != 0)
    && (((float) this.licznik / (float) this.mianownik) == ((float) argument.licznik / (float) argument.mianownik)))
      return true;
    return false;
  }
  
  private float tofloat() {
    return ((float) this.licznik / (float) this.mianownik);
  }

  public static Rational strtoRat(String s) {
    int i = 1, j = 1;
    String ts[] = s.trim().split("/");
    i = new Integer(ts[0]);
    if (ts.length > 1) // jeżeli jest znak ułamka
      j = new Integer(ts[1]);
    return new Rational(i, j);
  }
  
  
  public static void main(String[] args) {
    BufferedReader we = new BufferedReader(new InputStreamReader(System.in)); // Bufor odczytu 
    String s = "";
    String ts[];
    System.out.print("Podaj dwa ułamki zwykłe przedzielone znakiem spacji np. 1/2 1/3 : ");
    Rational r1 = null;
    Rational r2 = null;
    try {
      s = we.readLine();
      if ((s != null) && (!s.equals(""))) {
        ts = s.trim().split(" "); // zapisujemy ułamki w tablicy ts[0] i ts[1]
        r1 = strtoRat(ts[0]);
        r2 = strtoRat(ts[1]);
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    } 
    Rational r3 = r1.add(r2).mul(new Rational(1, 2));
    System.out.println("
Średnia arytmetyczna liczb " + r1 + " i " + r2 + " = " + r3);
    r3 = new Rational(2, 1).div( r1.reverse().add(r2.reverse()) );
    System.out.println("Średnia harmonmiczna liczb " + r1 + " i " + r2 + " = " + r3);
    Rational a11 = null;
    Rational a12 = null;
    Rational a21 = null;
    Rational a22 = null;
    System.out.println("Podaj 4 wspólczynniki macierzy A a11 a12 a21 a22 (ułamki zwykłe) przedzielone znakiem spacji");
    System.out.println("np. 1/2 1/3 5/5 7/2 ");
    try {
      s = we.readLine();
      if ((s != null) && (!s.equals(""))) {
        ts = s.trim().split(" "); // zapisujemy ułamki w tablicy ts[0] i ts[1] ts[2] i ts[3]
        a11 = strtoRat(ts[0]);
        a12 = strtoRat(ts[1]);
        a21 = strtoRat(ts[2]);
        a22 = strtoRat(ts[3]);
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    } 
    
    r3 = a11.mul(a22).sub( a12.mul(a21) ); // det(A)
    System.out.println("Macierz A");
    System.out.println(a11 + "	" + a12);
    System.out.println(a21 + "	" + a22);
    System.out.println("Wyznacznik macierzy " + r3);
    Rational b11 = a22.div(r3);
    Rational b12 = a12.div(r3).inverse();
    Rational b21 = a21.div(r3).inverse();
    Rational b22 = a11.div(r3);
    System.out.println("Macierz odwrotna do A");
    System.out.println(b11 + "	" + b12);
    System.out.println(b21 + "	" + b22);
    System.out.println("Podaj 4 wspólczynniki macierzy B a11 a12 a21 a22 (ułamki zwykłe) przedzielone znakiem spacji");
    System.out.println("np. 1/2 1/3 5/5 7/2");
    try {
      s = we.readLine();
      if ((s != null) && (!s.equals(""))) {
        ts = s.trim().split(" "); // zapisujemy ułamki w tablicy ts[0] i ts[1] ts[2] i ts[3]
        b11 = strtoRat(ts[0]);
        b12 = strtoRat(ts[1]);
        b21 = strtoRat(ts[2]);
        b22 = strtoRat(ts[3]);
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    } 
    System.out.println("Macierz A");
    System.out.println(a11 + "	" + a12);
    System.out.println(a21 + "	" + a22);
    System.out.println("Macierz B");
    System.out.println(b11 + "	" + b12);
    System.out.println(b12 + "	" + b22);
    
    System.out.println("Iloczyn macierzy A * B");
    System.out.print(a11.mul(b11).add(a12.mul(b21)) );
    System.out.println(a11.mul(b12).add(a12.mul(b22)) );
    System.out.print(a21.mul(b11).add(a22.mul(b21)) );
    System.out.println(a21.mul(b12).add(a22.mul(b22)) ); 
  }  
}
co możecie doradzić dla osoby chcącej nauczyć się programować w Javie
np książekę "Java 2" wydawnictwa Helion (pozycja polska)
Widziałem jej skany w skany w internecie.
ODPOWIEDZ