• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JAVA Przesyłanie danych między klasami

42 Warsaw Coding Academy
+1 głos
3,430 wizyt
pytanie zadane 2 września 2016 w Java przez Kacperos_89 Początkujący (400 p.)

Witam :)

Potrzebuję pomocy w przesyłaniu danych między klasami. Chciał bym żeby mój program w jednym pliku *.java pobierał dane z klawiatury i wypisywał jakieś informacje a drugi plik, żeby wykonywał same obliczenia, żeby wyglądało to mniej więcej tak:

Program startuje od pierwszego pliku

1.java

import java.util.Scanner;

public class Spalanie 
{

	public static void main(String[] args) 
	{		
		Scanner input = new Scanner(System.in);
		System.out.println("Podaj przejechane kilometry");
		double km = input.nextDouble();
		System.out.println("Podaj zatankowane paliwo");
		double paliwo = input.nextDouble();
		System.out.println("Podaj cenę litra paliwa");
		double zł = input.nextDouble();

Teraz przejście do pliku

2.java

		//PRZELICZANIE
		
		double cena = paliwo * zł;
		
		km = km / 100;
		double spalanie = paliwo / km;

i powrót do pierwszego pliku

1.java

		System.out.println("Spalanie wynosi " + spalanie + " litrów na 100 kilometrów.");
		System.out.println("Koszt tankowania wynosi " + cena + " złotych.");
	}

}

 

3 odpowiedzi

+1 głos
odpowiedź 2 września 2016 przez K0XM4N Gaduła (3,640 p.)
Jako drugi plik, stwórz sobie klasę, która będzie miała odpowiednie pola. Napisz konstruktor, który przyjmie wartości takie jak paliwo itd. a obliczenia wykonaj w metodzie :)
Albo po prostu w jednej klasie dopisz metodę metodę statyczną obliczająca te dane. Nie chce podawać gotowego rozwiązania, żebyś mógł sam pomyśleć nad tym, gdyby coś to pisz :)
+1 głos
odpowiedź 2 września 2016 przez MichuDev Pasjonat (20,300 p.)

Przypuszczam, że nic nie wiesz o programowaniu obiektowym, więc najlepszym wyjściem dla ciebie będzie stworzenie statycznej metody, możesz ją umieścić w innym pliku, oto jak to powinno wyglądać:

NazwaKlasy.nazwaMetody(argument1,argument2);
nazwaMetody(argument1,argument2); // jeśli metoda jest w tej samej klasie. Ilość argumentów może być mniejsza i większa

Możesz również użyć typów obiektowych dla prymitywów np. double ma obiektowy typ Double. Daje to tobie możliwość odwoływania się za pomocą referencji do obiektu nawet w kilku miejscach w programie. Uwaga! Ze względów wydajnościowych używanie tych typów nie jest najlepsze, ale czasem trzeba to robić.

Plik z kodem źródłowym języka Java ma ścisły związek z nazwą klasy, dlatego nie nazywamy pliku 1.java itp. Proszę również o pisanie kodu po angielsku, ale bez stosowania języka polskiego (mieszania języków), proszę nie umieszczać w nazwach zmiennych polskich znaków np. ąćżźęó.

Tak mały projekt bardziej potrzebuje podziału na funkcje w jednej klasie niż na wiele klas, trzeba pamiętać, by nie robić klas kilku-inijkowych oraz takich które robią wszystko w rozbudowanych aplikacjach i mają kilka tysięcy linii kodu.

Masz pytania, napisz w komentarzu pod moją odpowiedzią.

komentarz 2 września 2016 przez mbabane Szeryf (79,260 p.)
edycja 2 września 2016 przez mbabane
albo zwyczajnie jesli pytajacy chce sie uczyc javy to powienien czym predzej wrocic do poczatku i rozpoczac nauke jeszcze raz - a nie od razu budowac Krakow.

Na tym etapie nauki mozna jeszcze przymknac oko na brak kodu po ang. jedank jesli sie zna w miare przyzwoicie ang (powiedzmy na poziomie maturalnym +-) to dobrze by bylo stosowac (ale nie kazdy tez musi umiec ang. i trzeba to uszanowac,  jednak moze to nieco utrudnic nauke programowania).
komentarz 2 września 2016 przez MichuDev Pasjonat (20,300 p.)

mbabane - wiem, ale zawsze warto wiedzieć.

komentarz 2 września 2016 przez mbabane Szeryf (79,260 p.)
I przepraszam ze zwroce uwage ale piszesz jakims dziwnym tonem (przynajmniej dla mnie) "prosze to prosze tamto" - wedlug mnie taki ton tylko powoduje niechec do zadawania pytan do Ciebie, wedlug mnie powinno to brzmiec, mniej wiecej: "Pamietaj ze nazwy zmiennych i metod powinno pisac sie po ang. i staraj sie nie mieszac ang nazw z polskimi. Unikaj także stosowania ąćżźęó - a wręcz ich nie uzywaj.". Przynajmniej ja to tak odbieram.
komentarz 2 września 2016 przez MichuDev Pasjonat (20,300 p.)

mbabane - można pominąć ten punkt, ale cała reszta mówi całkiem dużo ważnych informacji. 

komentarz 2 września 2016 przez mbabane Szeryf (79,260 p.)
nie, nie, procz tego malutkiego 'ale' w pierwszym komentarzu, nie mam zadnych zastrzezen co to kwestii merytorycznej Twojej wypowiedzi. Ale juz nie tracmy moze czasu na takie glupotki.

Powodzenia!
0 głosów
odpowiedź 4 września 2016 przez Kacperos_89 Początkujący (400 p.)

Dzięki słowa klucze pomogły :) Tak faktycznie moja wina za nie jasne nazwanie plików, napisałem te nazwy od czapy moja wina Przepraszam. Udało mi się zrobić działający "programik" który wygląda tak:


import java.util.Scanner;

public class Spalanie
{
	public static void main(String[] args) 
	{
		Liczenie liczenie = new Liczenie();
	
		Scanner skaner = new Scanner(System.in);
		System.out.println("Podaj przejechane kilometry");
		liczenie.km = skaner.nextDouble();
		System.out.println("Podaj zatankowane paliwo");
		liczenie.paliwo = skaner.nextDouble();
		System.out.println("Podaj cenę litra paliwa");
		liczenie.pln = skaner.nextDouble();
		
		liczenie.liczSpalanie();
		liczenie.liczCena();
						
		System.out.println("Spalanie wynosi " + liczenie.spalanie + " litrów na 100 kilometrów.");
		System.out.println("Koszt tankowania wynosi " + liczenie.cena + " złotych.");
	}

}

i druga klasa:


public class Liczenie 
{
	double km;
	double paliwo;
	double pln;
	
	double cena;
	double spalanie;
	
	//Pobierz dane
	double pobierzTrasa()
	{
		return km;
	}
	double pobierzPaliwo()
	{
		return paliwo;
	}
	double pobierzPln()
	{
		return pln;
	}
	
	//Oblicz
	double liczCena()
	{
		cena = paliwo * pln;
		return cena;
	}
	double liczSpalanie()
	{
		km = km / 100;
		spalanie = paliwo / km;
		return spalanie;
	}

}

Faktycznie mieszanie języków wygląda źle i postaram się na przyszłość trzymać zasady nie używania polskich znaków :)

Mały projekt dziele na klasy bo łatwiej będzie mi się w tym połapać i chodziło mi tylko o przyswojenie umiejętności działań między klasami :)

komentarz 5 września 2016 przez K0XM4N Gaduła (3,640 p.)
Postaraj się używać hermetyzacji. Pola w klasie liczenie ustaw na prywatne i dodaj gettery, settery do nich ;). W sumie konstruktora też mógłbyś dodać. W chwili gdy tworzysz obiekt możesz mu przekazać argumenty w konstruktorze (km paliwo i pln).Dzięki temu nie musisz przypisywać wartości do pól bo zostały przekazane w konstruktorze obiektu :)
komentarz 6 września 2016 przez Kacperos_89 Początkujący (400 p.)

Prawie mi wyszło. Gettery i settery dodane ale nie mogę sobie poradzić żeby wartość ze scanner'a przekazać do set'a. Kiedy liczenie.km = skaner.nextDouble(); po prostu zamieniam na liczenie.setKm() = skaner.nextDouble(); wyskakuje mi błąd. aktualnie program wygląda tak:


package Spalanie;

import java.util.Scanner;

public class Main
{
	public static void main(String[] args) 
	{
		Liczenie liczenie = new Liczenie(0, 0, 0);
	
		/**
		Scanner skaner = new Scanner(System.in);
		System.out.println("Podaj przejechane kilometry");
		liczenie.km = skaner.nextDouble();
		System.out.println("Podaj zatankowane paliwo");
		liczenie.paliwo = skaner.nextDouble();
		System.out.println("Podaj cenę litra paliwa");
		liczenie.pln = skaner.nextDouble();
		**/
		
		liczenie.setKm(733);
		liczenie.setPaliwo(33.87);
		liczenie.setPln(4.21);
		
		liczenie.liczSpalanie();
		liczenie.liczCena();
						
		System.out.println("Spalanie wynosi " + liczenie.spalanie + " litrów na 100 kilometrów.");
		System.out.println("Koszt tankowania wynosi " + liczenie.cena + " złotych.");
	}

}
package Spalanie;

public class Liczenie 
{
	private double km;
	private double paliwo;
	private double pln;
	
	double cena;
	double spalanie;
	

	public Liczenie(double km, double paliwo, double pln)
	{
		this.km=km;
		this.paliwo=paliwo;
		this.pln=pln;
	}
	
	//Pobierz dane
	public double getKm()
	{	
		return km;
	}
	public double getPaliwo()
	{	
		return paliwo;
	}
	public double getPln()
	{	
		return pln;
	}
	
	public void setKm(double km)
	{
		this.km = km;
	}
	public void setPaliwo(double paliwo)
	{
		this.paliwo = paliwo;
	}
	public void setPln(double pln)
	{
		this.pln = pln;
	}
	
	//Oblicz
	double liczCena()
	{
		cena = paliwo * pln;
		return cena;
	}
	double liczSpalanie()
	{
		km = km / 100;
		spalanie = paliwo / km;
		return spalanie;
	}

}

Po dodaniu setterów i getterów zastanawiam się nad sensem konstruktorów. Z mojej perspektywy nie ma większych zmian czy one są czy nie.

komentarz 7 września 2016 przez K0XM4N Gaduła (3,640 p.)

Wyskakuje Ci błąd ponieważ, musisz podać w setterze argument. Popatrz.Stworzyłeś sobie settery np. 

public void setKm(double km){
       this.km = km;
}

w nawiasie znajduje się argument(zmienna) i jego typ który przyjmuje. Ta metoda musi dostać zmienną, ale musi się znaleźć w nawiasie.

Tak to powinno wyglądać:

liczenie.setKm( skaner.nextDouble() ); // przekazujesz zmienna z klawiatury

//ogólny zamysł to

liczenie.setKm( jakaśZmienna )// może też być input scannera jak wyżej

A co do konstruktorów, tworzysz 1000 obiektów. Każdemu z nich będziesz ustawiać setterem pola? Po co skoro możesz ustawić je w konstruktorze od razu.

Podobne pytania

0 głosów
2 odpowiedzi 219 wizyt
pytanie zadane 13 sierpnia 2018 w JavaScript przez Programista 22 Bywalec (2,270 p.)
0 głosów
1 odpowiedź 385 wizyt
+1 głos
0 odpowiedzi 718 wizyt
pytanie zadane 22 czerwca 2017 w Java przez Mariusz Dobrogosz Nowicjusz (180 p.)

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...