Java objectowa

Szymon Chmielewski
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:12
0

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

Kopiuj
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

Sarrus
Popraw ten tytuł bo oczy bolą. Napisz albo java obiektowa, albo objective java. Poza tym temat nic nie mówi o treści postu.
CR
  • Rejestracja:około 6 lat
  • Ostatnio:około 12 godzin
  • Postów:113
0

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

edytowany 1x, ostatnio: Crazy_Rockman
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0

Przeanalizuj ten konstruktor:

Kopiuj
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:

Kopiuj
public Ulamek dodaj(Ulamek u)
    {
        int a=Ulamek.mianownik*mianownik;
        int b=Ulamek.mianownik*licznik+Ulamek.licznik*mianownik;
        return new Ulamek(a,b);
    }
edytowany 1x, ostatnio: Delor
Szymon Chmielewski
jeśli usunę static to nie będę mógł wprowadzić danych z klawiatury w main
Delor
To przeczytaj co oznacza static. I zastanów się które pola chcesz ustawić (którego obiektu).
Szymon Chmielewski
static czyli nie można zmienić wartości w innych metodach. To w jaki sposób mogę użyć wprowadzania z klawiatury?
TY
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:204
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

Szymon Chmielewski
rozdzieliłem na 2 class'y i wyskakuje Identyczny błąd tyle że classa Run nie widzi licznika i mianownika
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
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>

edytowany 1x, ostatnio: Delor
Szymon Chmielewski
Dodawanie powinno działać , dzielenie tylko skopiowane. Nie mogę przypisać do zmiennych lokalnych ten sam błąd
Delor
Dodawanie masz odwrócone. Jaki błąd i której linii dotyczy?
Szymon Chmielewski
racja, nie zauważyłem :)
TY
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:204
0

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

O to ci chodzi:

Kopiuj
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.

edytowany 5x, ostatnio: Tyvrel
Zobacz pozostałe 4 komentarze
TY
Proszę cie bardzo, zmieniłem kod. Możesz śmiało implementować add i minus nie interesując się jak obiekty powstały
Szymon Chmielewski
add i miusa jeszcze nie miałem, ale spróbuje to jakoś przyswoić , dzięki. A jeszcze pytanie 1 jeśli zmienię dominator i nominator na prywatne to będzie można kompilować ??
TY
add, to twoje dodaj; minus faktycznie nie miałeś. Pisząc zgodnie ze sztuką denominator i nominator powinny być private final =)
Szymon Chmielewski
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
Szymon Chmielewski
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:12
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

edytowany 1x, ostatnio: Szymon Chmielewski
TY
Co za %^&*# uczy pisać kod po polsku...
TY
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:204
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.

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

edytowany 3x, ostatnio: Tyvrel

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.