Początki obiektów, silnia.

0

Witam
Dopiero zacząłem wchodzić w obiekty i już zaczynają mi się problemy, których nie mogę zrozumieć.
Otóż, mam program, który ma liczyć silnię. Mam jedną klasę, w której pobieram dane oraz jedną, w której wykonuję obliczenia, oraz oczywiście main. Jednakże Nie mogę zrozumieć jak poprawnie przywołać daną z jednej klasy do innej aby poprawnie wyświetlało wyniki. Już podaję przykład dla wyjaśnienia.

Tutaj jest main:

package Silnia;

public class Main {
	public static void main (String[] args) {
		
		
		Dane zmienna=new Dane();
		int dana=zmienna.Wprowadzenie(0);
		Silnia Iteracja=new Silnia();
		int mnozenie=Iteracja.obliczenie(0);
		System.out.println("Silnia jest równa: "+mnozenie);
		//System.out.println("Rekurencją:");
		//SilniaRekurencja rekurencja=new SilniaRekurencja();
		//int rekuruj=rekurencja.rekurencja(0, 0);
		//System.out.println("Silnia jest równa: "+rekuruj);
	}

}
 

Tutaj jest klasa Dane, w której pobierana jest wartość wpisana z klawiatury.

 package Silnia;
import java.util.*;
public class Dane {
int Wprowadzenie (int x) {
	Scanner in=new Scanner(System.in);
	System.out.println("Wprowadź liczbę");
	 x=in.nextInt();
	
	return x;
}
}

Oraz klasa Silnia

 package Silnia;
import java.util.*;

public class Silnia {
private Scanner in;

int obliczenie (int x) {
	Dane dana=new Dane();
	int liczy=dana.Wprowadzenie(x);
	int l=1, suma=1;
	//in = new Scanner(System.in);
	//System.out.println("Wprowadź liczbę.");
	//x=in.nextInt();
	while (l!=(x+1)){
		suma*=l;
		l++;
	}
	
	return suma;
}
}

Kiedy ignoruję klasę Dane i po prostu proces pobierania danych od użytkownika przenoszę do samej klasy Silnia. Program działa jak trzeba i wyświetla dobry wynik, jednakże chciałem zrobić tak aby za pobieranie danych odpowiadała osobna klasa a klasa Silnia pobierała z niej wartość i na jej podstawie wykonywała obliczenia. Chciałem tak zrobić bo program miał wykonywać te same obliczenia za pomocą iteracji i w innej klasie rekurencji i chciałem wykorzystać tylko jedno wprowadzanie danych, poza tym trochę sobie utrudniłem bo chciałem po prostu lepiej zrozumieć operowanie tym.
Problem polega na tym, że gdy próbuję wczytać do klasy Silnia dane z klasy Dane, w ogólnym rozliczeniu program dwa razy chce pobierać ode mnie dane oraz wyświetla wynik: "1" dla wartości 5.

Nie rozumiem też dla czego, gdy wywołuję klasę w main jak np. tutaj:

Dane zmienna=new Dane();
		int dana=zmienna.Wprowadzenie(0); 

W nawiasie przy "wprowadzenie" nie mogę wpisać innej wartości niż 0?
Proszę o jakieś naświetlenie mi sytuacji i ewentualną pomoc w rozwiązaniu problemu programu.

Mam nadzieję, że jasno wytłumaczyłem o co mi chodzi.
Wszystkie te widoczne powyżej komentarze w linijkach kodu to po prostu pozostałości po moim kombinowaniu z programem. Zamiast usuwać linijkę, robię z niej komentarz, aby potem ewentualnie szybko do niej wrócić gdy mnie coś oświeci. ;)

0
int Wprowadzenie (int x) {
    Scanner in=new Scanner(System.in);
    System.out.println("Wprowadź liczbę");
     x=in.nextInt();
 
    return x;
}

Ta metoda nie ma najmniejszego sensu. Wytłumacz mi proszę w jakim celu przekazujesz jej argument x?

2.Usuń zależność klasy Silnia od klasy Dane i napisz metodę obliczającą silnię z podanej liczby niekoniecznie wczytanej od użytkownika.
Innymi słowy: doprowadź do stanu, aby istniała taka metoda Silnia.oblicz, która będzie przyjmowała jeden argument n i zwracała liczbę n!. Na przykład wywołanie System.out.print(Silnia.oblicz(6)); powinno wyświetlić 720.

0

Te błąd musiał wyniknąć z mojej małej wiedzy.
Chciałem tylko aby w tym miejscu, użytkownik wprowadzał daną z klawiatury, która potem będzie obliczana w innej klasie.

Teraz to wygląda tak:

package Silnia;

public class Main {
	public static void main (String[] args) {
		
		
		Dane zmienna=new Dane();
		int dana=zmienna.Wprowadzenie(0);
		Silnia Iteracja=new Silnia();
		int mnozenie=Iteracja.obliczenie(6);
		System.out.println("Silnia jest równa: "+mnozenie);
		
	}

}

 
package Silnia;
import java.util.*;

public class Silnia {
private Scanner in;

int obliczenie (int x) {
	int l=1, suma=1;
	while (l!=(x+1)){
		suma*=l;
		l++;
	}
	
	return suma;
}
}
 

Program zwraca n! równą 720. Nie jestem pewien czy o takie rozwiązanie Ci chodziło.
W tym momencie program jedyne co robi to zwraca wartość 720 niezależnie od tego co wpisze użytkownik. Ja bym chciał aby program w jednej osobnej klasie pobierał daną z klawiatury a natomiast w drugiej klasie osobnej obliczał silnie jednakże na podstawie danej, która została wczytana z klawiatury w innej klasie.

0

Wybaczcie za dublowanie, ale jeszcze nie założyłem sobie tutaj konta i brak mi opcji edytuj.
Poszperałem jeszcze w programie i działa. Chociaż nie jestem pewien na jakiej zasadzie. Teraz wygląda to tak:

package Silnia;

public class Main {
	public static void main (String[] args) {
		
		
		Dane zmienna=new Dane();
		int dana=zmienna.Wprowadzenie();
		Silnia Iteracja=new Silnia();
		int mnozenie=Iteracja.obliczenie(dana);
		System.out.println("Silnia jest równa: "+mnozenie);
		
	}

}
 
 package Silnia;
import java.util.*;
public class Dane {
int Wprowadzenie () {
	int x=0;
	Scanner in=new Scanner(System.in);
	System.out.println("Wprowadź liczbę");
	 x=in.nextInt();
	
	return x;
}
}
package Silnia;
import java.util.*;

public class Silnia {
private Scanner in;

int obliczenie (int x) {
	int l=1, suma=1;
	while (l!=(x+1)){
		suma*=l;
		l++;
	}
	
	return suma;
}
}
 

Nie rozumiem tylko dokładnie wypłynęło na jego działanie.
Jedyne co tak naprawdę zrobiłem to:

 Silnia Iteracja=new Silnia();
		int mnozenie=Iteracja.obliczenie(dana);

Niby problem solved, jednak czuję, że ciągle za mało rozumiem co ja właściwie zrobiłem.

0

Zrobiłeś niesamowicie ważną rzecz: dokonałeś separation of concerns.

Masz w swoim programie trzy klasy, które mają różne zadania:

  1. Zadaniem klasy Silnia jest obliczanie silni z danej liczby.
  2. Zadaniem klasy Wprowadzanie jest obsługa wczytywania danych od użytkownika.
  3. Zadaniem klasy Main jest zebranie kodu w całość.
    W Twoim poprzednim kodzie klasa Silnia miała dwa zadania: zarówno wczytywała dane od użytkownika, jak i obliczała silnię.
    Wczytywanie danych od użytkownika nie jest celem istnienia klasy Silnia, która powinna być jak najbardziej uniwersalna (zasada high cohesion, low coupling).

W aktualnej wersji kodu masz ładnie oddzielone samo pobieranie wejścia użytkownika oraz liczenie, co może tutaj niewiele tak naprawdę zmienia, lecz w miarę rozrostu aplikacji, jest jedyną słuszną drogą nieprowadzącą do tworzenia spaghetti code.

0

Wielkie dzięki za pomoc. Chyba coś z tego zrozumiałem.
Teraz tylko pozostało mi ogarnąć rekurencję. ;)

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