Java objectowa

0

Witam mam problem i bląd w kodzie lecz nie potrafię go zlokalizować.jestem początkującym programistą w javie mam

package ulamek;
 
import java.util.Scanner;

public class Ulamek {

    public static int licznik,mianownik;
    
    public static void main(String[] args)
    {
       Scanner scan = new Scanner(System.in); 
    
       Ulamek u1 = new Ulamek(4,12);
       Ulamek u2 = new Ulamek(3,6);
       
       licznik=scan.nextInt();
       mianownik=scan.nextInt();
       
       u1.wypisz();
        System.out.println(u1.oblicz());
        u1.dodaj(u1).wypisz();
    }

    public Ulamek(int a,int b)
    {
        a=licznik;
        b=mianownik;
    }
    public void wypisz()
    {
        System.out.println(licznik+"/"+mianownik);
    }
    public double oblicz()
    {
        return (float)licznik/mianownik;
    }
    public Ulamek dodaj(Ulamek u)
    {
        int a=Ulamek.mianownik*mianownik;
        int b=Ulamek.mianownik*licznik+Ulamek.licznik*mianownik;
        return new Ulamek(a,b);
    }
     public Ulamek dziel(Ulamek u)
     {
         int a=u.mianownik*mianownik;
        int b=u.mianownik*licznik+u.licznik*mianownik;
        return new Ulamek(a,b);
     }
     public double pierwiastek()
     {
         return Math.sqrt((float)licznik/mianownik);
     }
     //public skroc()
     //{
         
     //}
}

Chodzi o metodę Oblicz, która powinna wyświetlić sumę ułamków (licznik/mianownik) i argumentów z objectu u1 poprzez referencje.
Wydaje mi się że błąd leży w w tej metodzie i wywołaniu metody. Z góry dzięki

0

Dlaczego pola 'licznik' i 'mianownik' są statyczne?

0

Przeanalizuj ten konstruktor:

public Ulamek(int a,int b)
    {
        a=licznik;
        b=mianownik;
    }

Gdy usuniesz static z pól mianownik i licznik to zobaczysz błąd w poniższej metodzie:

public Ulamek dodaj(Ulamek u)
    {
        int a=Ulamek.mianownik*mianownik;
        int b=Ulamek.mianownik*licznik+Ulamek.licznik*mianownik;
        return new Ulamek(a,b);
    }
0

Na start rozdziel klasy:

  1. Run w której będziesz mieć samego maina
  2. Ułamek tak jak teraz, tylko bez maina
    Błędów jest tu co nie miara, jak rozdzielisz, to sam kompilator ci zacznie krzyczeć: ej, tak się nie da

Na przykład w konstruktorze NIC nie robisz =P

0

static czyli nie można zmienić wartości w innych metodach.

Nie dałeś final więc możesz zmieniać. Samo static oznacza że pole jest przypisane do klasy a nie poszczególnych obiektów (jest wspólne dla wszystkich obiektów).

To w jaki sposób mogę użyć wprowadzania z klawiatury?

Np. przypisz do zmiennych lokalnych metody main() lub w jakiś sposób wprowadź do utworzonych obiektów.
Przypomnij też sobie działania na ułamkach:
<br> \frac{a}{b}+\frac{c}{d}=?\<br> \frac{a}{b}\div\frac{c}{d}=?<br>

0

Tak w ogóle, to co to jest ten licznik i mianownik, który pobierasz ze skanera?

O to ci chodzi:

class Fraction {
	int nominator;
	int denominator;

	Fraction(int nominator, int denominator) {
		this.nominator = nominator;
		this.denominator = denominator;
	}

	add(Fraction fraction) { ... }
	minus(Fraction fraction) { ... }
}

class Run {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in); 

		Fraction u1 = new Fraction(scan.nextInt(),scan.nextInt());
		Fraction u2 = new Fraction(4, 12);

		print(u1);
		print(u2);
		print(u1.add(u2));
		print(u2.add(u1));
		print(u1.add(u1));
		print(u2.add(u2));
	}
}

Licznik i mianownik nie mogą być statyczne, bo wtedy są wspólne dla wszystkich ułamków jakie zrobisz.

0

Dodam może treść zadania może to pomoże
``Zdefiniuj klasę Ulamek o prywatnych polach licznik, mianownik - typu całkowitego,

*konstruktorze z argumentami Ulamek(int , int)
*metodzie wypisz wypisującej ułamek w postaci licznik/mianownik
*metodzie oblicz() – oblicza wartość ułamka np. ¼ = 0.25
*metodzie dodaj(Ulamek) // metoda zwraca referencję do obiektu klasy ulamek
*metodzie dziel(Ulamek) // metoda zwraca referencję do obiektu klasy ulamek
*metodzie pierwiastek() –oblicza pierwiastek kwadratowy z wartość ci ułamka np. ¼ - wynik 0.5
*metodzie skroc() zwracającej skrócony ułamek // metoda zwraca referencję do obiektu klasy ulamek
Wykorzystaj tę klasę w aplikacji, w której:
*wczytywane z klawiatury są licznik i mianownik
*tworzone są U1, U2, obiekty klasy Ulamek
*wypisywane są ułamki
*wykonywane są działania dodawania i dzielenia ułamków
*wypisywany jest pierwiastek kwadratowy z ułamka
*obliczany jest ułamek skrócony

0
Szymon Chmielewski napisał(a):

a dobra teraz wiem, a jeśli chodzi o "return new" w moim kodzie, różni się czym od return? Bo wiem, że na zajęciach tak trzeba było zrobić w metodzie dodaj i dziel

Masz to w treści zadania.

//Załóżmy, że masz dwa ułamki:
Fraction fraction1 = 3/5;
Fraction fraction2 = 1/5;
//Dodajesz do pierwszego ułamka drugi ułamek:
fraction1.add(fraction2);
//Pewnie naturalnym ci się wydaje, że taka akcja powinna zmodyfikować pierwszy ułamek i stan twoich ułamków wyglądałby następująco:
Fraction fraction1 = 4/5;
Fraction fraction2 = 1/5;

//Jednak dużo lepszą praktyką jest nie modyfikowanie starych ułamków i zamiast tego stworzenie trzeciego wynikowego ułamka:
Fraction fraction3 = fraction1.add(fraction2);
//Gdzie ich stan to:
Fraction fraction1 = 3/5;
Fraction fraction2 = 1/5;
Fraction fraction3 = 4/5;

//Wtedy w środku metody add musisz stworzyć nowy obiekt na podstawie dwóch innych
public Fraction add(Fraction fraction) {
	int fraction1Nominator = this.nominator;
	int fraction2Nominator = fraction.nominator;
	int fraction1Denominator = this.denominator;
	int fraction2Denominator = fraction.denominator;
	
	int resultNominator = //Implementacja na podstawie zmiennych wyżej
	int resultDenominator = //Implementacja na podstawie zmiennych wyżej
	Fraction resultFraction = new Fraction(resultNominator, resultDenominator);
	return result Fraction;
}

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