Przekazywanie wartosci zmiennych miedzy obiektami

0

Najpierw troche kodu:

import java.util.Scanner;
public class glowny_main {

	public static void main(String[] args) {
		dzialania cyfra = new dzialania();
		pokazWynik pokaz = new pokazWynik();
		Scanner myScanner = new Scanner(System.in);
		
System.out.print("Podaj x: ");		
	cyfra.x= myScanner.nextInt();
System.out.print("Podaj y: ");
	cyfra.y= myScanner.nextInt();


cyfra.wynik_plus();
cyfra.wynik_minus();
cyfra.wynik_razy();
	
pokaz.pokazPlus();
pokaz.pokazMinus();
pokaz.pokazRazy();
	}

}
class dzialania 
{
	int x, y;

	int wynik_plus ()
	{
		int wynikPlus=x+y;
		return wynikPlus;
	}
	int wynik_minus()
	{
		int wynikMinus=x-y;
		return wynikMinus;
	}
	int wynik_razy()
	{
		int wynikRazy=x*y;
		return wynikRazy;
	}
	int podajX()
	{
		return x;	
	}
	int podajY()
	{
		return y;
	}
}
class pokazWynik 
{
	dzialania cyfra = new dzialania();	
	
	void pokazPlus()
		{
			System.out.print(cyfra.podajX()+" + "+cyfra.podajY()+" = "+cyfra.wynik_plus()+"\n");
		}
	void pokazMinus()
		{
			System.out.print(cyfra.podajX()+" - "+cyfra.podajY()+" = "+cyfra.wynik_minus()+"\n");
		}
	void pokazRazy()
		{
			System.out.print(cyfra.podajX()+" * "+cyfra.podajY()+" = "+cyfra.wynik_razy()+"\n");
		}
}

Z zalozenia programik ma byc napisany obiektowo.
Wymyslilem sobie ze najpierw wprowadzam liczby ktore sa przekazywane do zmiennych x i y w klasie dzialania. Realizuje ona tez podstawowe dzialania na liczbach i zwraca wyniki.
Zadaniem klasy pokazWynik jest pobranie wynikow oraz zmiennych x, y z dzialaniai wydrukowanie ich.

Problem jest taki ze w rezultacie mam na ekranie same zera.
Gdzie jest blad? Jak to naprawic?

Dzieki z gory za pomoc [browar] </b>

0

A jak je przekazujesz do obiektu "pokaz" klasy "dzialania"? Bo jakoś tego w twoim kodzie nie widzę, więc jak ma wypisać coś innego jak same zera?

0

Sory, klasy "pokazWynik".

0

w pokazWynik tworzysz jakiś obiekt i wykonujesz na nim operacje... a raczej nie jest to intencją Twoją.
obiekt którym ma sie zajmować klasa pokazWynik powinien być przekazywany poprzez konstruktor lub do funkcji ( to drugie chyba lepsze ). Podobnie z klasą działania itd. pracują na zmiennych które nie zostały przez Ciebie zainicjowane i w ogóle te klasy nie mają między sobą sensownych zależności.

0

OK dzieki chlopaki.. Ten problem odloze sobie chyba na pozniej bo kombinuje i nie bardzo mi cos wychodzi.

Jesli ktos bylby chetny na poprawienie kodu bylbym wdzieczny. Moglbym przeanalizowac i dojsc do jakichs sensownych wnioskow.

Pozdrawian Dzieki jeszcze raz

0

Logika programu troche ci się rozjechała, powinneś pojść za spostrzeżeniem nicka, ktory zauważył ze nie potrzebnie tworzysz obiekt działania w klasie pokazWynik.
Przesledzmiy program głowny,
tworzysz obietk działania pod zmienna cyfra,(dla ułatwienia nazwe go cyfra1)
tworzysz obietk pokazWynik pod zmienna wynik, ktory sam tworzy sobie nowy obiekt działania pod zmienna cyfra(nazwe go cyfra2), ta zminenna cyfra2 jest ukryta w obiekcie wynik, program głowny nie ma do niej dostepu bezposredniego, referencja jest ukryta w obiekcie wynik.
tworzysz scaner i inicjalizujesz pola obiektu cyfra1, czyli x i y(nie jest to poprwane działąnie, ale to za chwile)
na rzecz obiektu cyfra1 wywołujesz kolejno metody, ktore zwracaja wyniki suowania, odejmowania i mnozenia, wyniki nie sa nigdzie zapisywane wiec sa tracone.
Po czym na rzecz obkiektu pokaz wywołujesz metody pokazPlus()
wiec metoda wyswietla zmienne pola z obiektu cyfra2 x, y i sumowanie tych pol, ale te pola nie zostały nigdzie zainicjalizowane, wiec dostały wartości domysle czyli dla zmiennej int jest to zero. To samo dzieje się z następnymi metodami.
Twoj bład to po prostu zgubienie logiki działania, wywołujesz metody na rzecz jednego obiektu a wyniki rzadasz od innego.

Jesli chcesz miec dostęp do obiektu cyfra przekarz referencje do niego w konstuktroze klasy pokazWyniki
Co do samego kodu to dobra praktyka wymaga nazywać kasy z wielkiej litery, pola powinny byc utworzone ze specyfikatorem private a ich inicjalizacja powinna nastepować w konstruktrze.

Na szybko twoj kod mozna naprawic w czterech linijkach kodu
wyrąbac tworzenie obiektu cyfra w klasie pokazWyniki i zastąpić go czyms takim

dzialania cyfra = null;
        public pokazWynik(dzialania d){
        	cyfra = d;
        }   

nastepnie przekazac obiekt cyfra do obiektu pokaz

pokazWynik pokaz = new pokazWynik(cyfra);

mozesz wywalic te wywołania

cyfra.wynik_plus();
cyfra.wynik_minus();
cyfra.wynik_razy();

to nic nie zmienia, wiec jest nie potrzebnie

Pozdrawiam BookaYashee

0

W miedzyczasie wykombinowalem cos takiego.. teraz dziala

import java.util.Scanner;
public class glowny_main {

	public static void main(String[] args) {

	pokazWynik pokaz = new pokazWynik();
	Scanner myScanner = new Scanner(System.in);
		
System.out.print("Podaj x: ");		
	dzialania.x= myScanner.nextInt();
System.out.print("Podaj y: ");
	dzialania.y= myScanner.nextInt();

pokaz.pokazPlus();
pokaz.pokazMinus();
pokaz.pokazRazy();
pokaz.pokazPodziel();

	}

}

class pokazWynik 
{
	//dzialania cyfra = new dzialania();	
	void pokazPlus()
		{
			System.out.print(dzialania.podajX()+" + "+dzialania.podajY()+" = "+dzialania.wynik_plus()+"\n");
		}
	void pokazMinus()
		{
			System.out.print(dzialania.podajX()+" - "+dzialania.podajY()+" = "+dzialania.wynik_minus()+"\n");
		}
	void pokazRazy()
		{
			System.out.print(dzialania.podajX()+" * "+dzialania.podajY()+" = "+dzialania.wynik_razy()+"\n");
		}
	void pokazPodziel()
		{
			System.out.print(dzialania.podajX()+" / "+dzialania.podajY()+" = "+dzialania.wynik_podziel()+","+dzialania.reszta()+"\n");
		}

}
public class dzialania 
{
	public static int x, y;
	public static int wynik_plus ()
	{
		int wynikPlus=x+y;
		return wynikPlus;
	}
	public static int wynik_minus()
	{
		int wynikMinus=x-y;
		return wynikMinus;
		
	}
	public static int wynik_razy()
	{
		int wynikRazy=x*y;
		return wynikRazy;
	}
	public static int wynik_podziel()
	{
		int wynikPodziel=x/y;
		return wynikPodziel;
	}
	public static int reszta()
	{
		int Reszta=x%y;
		return Reszta;
	}
	public static int podajX()
	{
		return x;	
	}
	public static int podajY()
	{
		return y;
	}
}

Dzieki za pomoc BookaYashee. Rzeczowo i na temat to mi sie podoba!
Twoje rozwiazanie na pewno przetestuje!

Masz moze jakies zastrzezenia/sugestie do powyzszego kodu?

0

W pierwszym poscie napisałeś:

Z zalozenia programik ma byc napisany obiektowo.

no niestety ale juz tak nie jest, metody statyczne nie wiążą się z istenieniem obiektu, zmienne x i y nie sa juz polami obiektu, ale zmiennymi klasowymi, a sama klasa działania jest czymś co swiadczy usługi, ale nie jako obiekt, zreszta sam obiekt typu działania w programie nie istnieje.
W sumie program do przełknięcia, gdyby nie twoje załozenie.
Sugerowałbym jednak to co pisałem wyżej.

Pzdrawiam BookaYashee

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