Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Rozwiązanie 2.1

To pierwsze zadanie kursu z programowania obiektowego. Należało w nim przede wszystkim utworzyć dwie klasy. Jedna do przechowywania danych. Druga do operowania obiektami i prezentacji danych.

Klasa pracownik powinna przechowywać trzy zmienne. Dwie typu String i jedną typu int. Przykładowy jej wygląd to:

public class Pracownik {
	String imie;
	String nazwisko;
	int wiek;
}

Jak widać nie ma tutaj nic skomplikowanego.

Klasa Firma powinna z kolei utworzyć dwa obiekty klasy Pracownik i odpowiednio zainicjować pola.

public class Firma{
	public static void main(String args[]){
		Pracownik pracownik1 = new Pracownik();
		Pracownik pracownik2 = new Pracownik();

		pracownik1.imie = "Staszek";
		pracownik1.nazwisko = "Ptaszek";
		pracownik1.wiek = 35;

		pracownik2.imie = "Wlodek";
		pracownik2.nazwisko = "Zieba";
		pracownik2.wiek = 45;

		System.out.println("Pracownicy firmy to:");
		System.out.println(pracownik1.imie+" "+pracownik1.nazwisko+", "+pracownik1.wiek+" lat");
		System.out.println(pracownik2.imie+" "+pracownik2.nazwisko+", "+pracownik2.wiek+" lat");
	}
}

Utworzyliśmy dwa obiekty: pracownik1 i pracownik2. Następnie zainicjowaliśmy ich pola: imie, nazwisko i wiek dowolnymi danymi. Wyświetlamy dane w analogiczny sposób.

Komentarze

Komentarze zamknięte. Zapraszamy do grupy na Facebooku
YeeeZooo

Zrobiłem podobnie tyle że użyłem printf
public class Firma{

public static void main(String args[]){

Pracownik p1 = new Pracownik();
Pracownik p2 = new Pracownik();

p1.imie = "Tomek";
p1.nazwisko = "Pawlowski";
p1.wiek = 30;

System.out.printf("Dane pracownika 1: imie:%s, nazwisko:%s, wiek:%d \n", p1.imie, p1.nazwisko, p1.wiek);

p2.imie = "Slawek";
p2.nazwisko = "Majewski";
p2.wiek = 36;

System.out.printf("Dane pracownika 2: imie:%s, nazwisko:%s, wiek:%d \n", p2.imie, p2.nazwisko, p2.wiek);

}
}

Bryla

A ja zrobiłem jeszcze inaczej:
public class Firma {
public static void main(String args[]) {
Pracownik pracownik = new Pracownik();
Pracownik innypracownik = new Pracownik();

pracownik.ustawImie("Jan");
pracownik.ustawNazwisko("Kowalski");
pracownik.ustawWiek(25);

innypracownik.ustawImie("Adam");
innypracownik.ustawNazwisko("Nowak");
innypracownik.ustawWiek(30);

System.out.println("Pracownicy firmy to: ");
pracownik.dajDane();
innypracownik.dajDane();

}
}

Greg

w jaki sposób zdefiniowałeś metode dajDane(); w pliku Pracownik.java? Chodzi mi o konwersje itp. To ponizej chyba nie ma sensu:
String daj_dane(){
return imie;
return nazwisko;
return wiek;

}

Czarownica

Moja wersja:

public class Pracownik {
// prywatne pola
private String imie;
private String nazwisko;
private int wiek;

// publiczna metoda dostępu do pól
String dajI() {
return imie;
}
String dajN() {
return nazwisko;
}
int dajW() {
return wiek;
}

// publiczne metody zmiany wartości
void ustawI(String i) {
imie = i;
}
void ustawN(String n) {
nazwisko = n;
}
void ustawW(int w) {
wiek = w;
}

void przedstaw() {
System.out.println("Imie: "+imie+"\nNazwisko: "+nazwisko+"\nWiek: "+wiek+"\n");
}
}

oraz

public class Firma {
public static void main(String[] args) {
// towrzymy dwa obiekty klasy Pracownik
Pracownik a = new Pracownik();
Pracownik b = new Pracownik();

// usatwiamy dane pracownika a
a.ustawI("Iwona");
a.ustawN("Sasak");
a.ustawW(22);

// usatwiamy dane pracownika b
b.ustawI("Karolina");
b.ustawN("Sasak");
b.ustawW(17);

// wyświetlenie informacji o pracowniku
// System.out.println("Imie: "+a.dajI()+"\nNazwisko: "+a.dajN()+"\nWiek: "+a.dajW()+"\n");
// System.out.println("Imie: "+ b.dajI() +"\nNazwisko: "+ b.dajN() +"\nWiek: "+ b.dajW() + "\n");

// Przedstawienie pracowników
a.przedstaw();
b.przedstaw();
}
}

Greg

Ładnie śpiewasz:)

Czarownica

Dziękuję...

kaszelek

Stworzyłem niemal identyczny kod ;) I tak się teraz zastanawiam...

Czy ten kod zaproponowany przez autora kursu jest całkowicie poprawny i zgodny ze wszystkimi standardami?

Słyszałem że bardziej poprawną metodą jest odwoływanie się do tych metod set i get a nie tak jak tutaj pracownik1.imie;

Nie wiem czy ktoś mnie rozumie, ale chce wiedzieć czy to jest jakaś różnica i czy sposób pisania wpływa znacząco na dalszy proces tworzenia aplikacji?

Sławek Ludwiczak

zasadniczo na działanie aplikacji nie ma to żadnego wpływu.Na tym poziomie kursu pojęcia getterów i setterów nie były po prostu wprowadzane, choć rzeczywiście jest to dobra praktyka, żeby ich używać i maksymalnie ograniczać dostęp do pól obiektów.

kaszelek

Wielkie dzięki za odpowiedź, jak i za cały kurs! :)

GJeszka

public class Pracownik {
string imie;
string nazwisko;
int wiek;

void set(String _imie, String _nazwizko, int _wiek){
imie= _imie;
nazwisko= _nazwisko;
wiek= _wiek;
}

void get(){
System.out.println(pracownik: ("imie+" "+nazwisko+" "+wiek"));
}
}


public class Firma{
public static void main(String args[]){
Pracownik prac1 = new Pracownik();
Pracoenik prac2 = new Pracownik();

prac1.set("Adrianna", "Lima", 24);
prac2.set("Bill", "Clinton", 90);

prac1.get();
prac2.get();
}
}

Witek

Typ zmiennej String piszemy z wielkiej litery, a nie z małej.

Greg

czy moglbys przyblizyc co sie tu sie dzieje?

System.out.println(pracownik: („imie+” „+nazwisko+” „+wiek”));

jako ze moj kompilator ma problem z ta czescia kodu.
Z gory dzieki

LM

problem w „ zmien na " ;)

Paweł

A ktoś mi powie dlaczego nie działa mi to: public class Firma {
public static void main (String[] args) throws FileNotFoundException {
Scanner IME = new Scanner(System.in);
PrintWriter zapis = new PrintWriter("pracownicy.txt");
Pracownicy user = new Pracownicy();

for (int i = 0; i<2; i++) {
System.out.print("Imię pracownika: ");
user.name(IME.nextLine());
System.out.print("Nazwisko pracownika: ");
user.surname(IME.nextLine());
System.out.print("Wiek pracownika: ");
user.age(IME.nextInt());
zapis.println((1+i)+".\t"+user.GETname()+"\t"+user.GETsurname()+"\t"+user.GETage());
}

zapis.close();
}
}

Program "przeskakuje" i nie pozwala wpisywać Imion kolejnych osób:

Imię pracownika: Andrzej
Nazwisko pracownika: Kowalski
Wiek pracownika: 45
Imię pracownika: Nazwisko pracownika: Kowalski
Wiek pracownika: 33

Paweł

Nie wiem dlaczego jest taka różnica, ale korzystając z podpowiedzi eclipse wybrałem next() a nie nextLine() i już działa poprawnie, jest jakieś logiczne wytłumaczenie którego kiedy używać?

folcrum

Mam taki tyci problem. Oto mój kod :

public class Objektglowny1 {

public static void main(String[] args) {

Scanner daj = new Scanner(System.in);
objekt1 pracownik1 = new objekt1();
objekt1 pracownik2 = new objekt1();

System.out.print("podaj imie 1 pracownika : ");
pracownik1.imie = daj.nextLine();
System.out.print("podaj nazwisko 1 pracownika : ");
pracownik1.nazwisko = daj.nextLine();
System.out.print("podaj wiek 1 pracownika : ");
pracownik1.wiek = daj.nextInt();

System.out.print("podaj imie 2 pracownika : ");
pracownik2.imie = daj.nextLine();
// pracownik2.imie = daj.nextLine();
System.out.print("podaj nazwisko 2 pracownika : ");
pracownik2.nazwisko = daj.nextLine();
System.out.print("podaj wiek 2 pracownika : ");
pracownik2.wiek = daj.nextInt();

System.out.println("dane pracownikow");
System.out.println (pracownik1.imie+" "+pracownik1.nazwisko+" "+pracownik1.wiek);
System.out.println(pracownik2.imie+" "+pracownik2.nazwisko+" "+pracownik2.wiek);

}
}


Niestety po odczytaniu wieku z klawiatury dla pierwszego pracownika pomija mi pobieranie imienia dla drugiego pracownika. Podejżewam, że automatycznie wbija mi znak "ENTER" do bufora po podaniu cyfry. Czy jest jakaś instrukcja czyszczaca bufor klawiatury abym mógł zastosowac ?

Witek

Witam
- czy zrobiłeś klasę Obiekt1, jeśli nie to ją musisz utworzyć,
- w klasie Objektglowny1, obiekt1 musi być napisany z wiekiej litery, tak jak to pokazane jest w kursie, zobacz inne przykłady.

Witek

PS.
Poniżej masz poprawiony program działa tak jak chciałeś, zwróc uwage na jak zadeklarowałem zmienną " daj " - klasy Scanner, u mnie jest to zmienna globalna, mam nadzieję, że taki sposób może być.
Poprawiony kod:

public class Obiekt1_A {
String imie;
String nazwisko;
int wiek;
}
import java.util.Scanner;


public class Objektglowny1 extends Obiekt1_A {

public static void main(String[] args) {

Scanner daj;

Obiekt1_A pracownik1 = new Obiekt1_A();
Obiekt1_A pracownik2 = new Obiekt1_A();

daj = new Scanner(System.in);

System.out.print("podaj imie 1 pracownika : ");
pracownik1.imie = daj.nextLine();
System.out.print("podaj nazwisko 1 pracownika : ");
pracownik1.nazwisko = daj.nextLine();
System.out.print("podaj wiek 1 pracownika : ");
pracownik1.wiek = daj.nextInt();
System.out.println();

daj = new Scanner(System.in);

System.out.print("podaj imie 2 pracownika : ");
pracownik2.imie = daj.nextLine();
System.out.print("podaj nazwisko 2 pracownika : ");
pracownik2.nazwisko = daj.nextLine();
System.out.print("podaj wiek 2 pracownika : ");
pracownik2.wiek = daj.nextInt();

System.out.println();
System.out.println("dane pracownikow");
System.out.println (pracownik1.imie+" "+pracownik1.nazwisko+" "+pracownik1.wiek);
System.out.println(pracownik2.imie+" "+pracownik2.nazwisko+" "+pracownik2.wiek);

}
}




moominek

Tak na przyszłość :)
Ten program może i działa ale nie jest napisany poprawnie :/ Wiem że wysłano go bardzo dawno ale dla przyszłych osób które znajdą ten temat :)
1. Klasa z metodą uruchomiającą program nie może rozszerzać innej klasy obiektowej - w ogóle po co ma to robić?
2. Twój program Witek niczym się nie różni poza tym że najpierw zdeklarowałeś zmienną daj - a potem ja zainicjowałeś w innej linii - to tylko strata miejsca i zmniejszenie czyteności kodu.
3. Zmienna daj nie jest bardziej globlana niż w programie folcrum'a :)
4. A jedyna zmiana to to że drugi raz inicjujesz scanner - dla ergonomi kodu może lepiej by było najpierw zamknąc stary scanner :)

Pozdrawiam

folcrum

Wojtku mam stworzoną klase objekt1, dla pewności (choć nie powinno mieć to znaczenia dla kompilatora) stworzyłem nowy Objekt1 (z duzej litery) i efekt jest ten sam. Się mi wydaje, że problem leży w zapełnieniu bufora znakiem "ENTER" po podaniu liczby i chcialbym ten bufor wyczyścić jakąś instrukcją jak ma to naprzyklad miejsce w TURBO PASCALU " while keypressed do readkey".

Witek

Zobacz mój ostatni post, w którym podaprawiłem twój kod i działa tak jak chciałeś. Mam nadzieję, że nie zostatnie usunięty, jakby tak się stało to mogę go ponownie wkleić.
Pozdrawiam

Witek



Witek:

PS.Poniżej masz poprawiony program działa tak jak chciałeś, mam nadzieję, że taki sposób może być.Poprawiony kod:public class Obiekt1_A {String imie;String nazwisko;int wiek;}import java.util.Scanner;
public class Objektglowny1 extends Obiekt1_A {
public static void main(String[] args) {
Scanner daj;
Obiekt1_A pracownik1 = new Obiekt1_A();Obiekt1_A pracownik2 = new Obiekt1_A();
daj = new Scanner(System.in);
System.out.print("podaj imie 1 pracownika : ");pracownik1.imie = daj.nextLine();System.out.print("podaj nazwisko 1 pracownika : ");pracownik1.nazwisko = daj.nextLine();System.out.print("podaj wiek 1 pracownika : ");pracownik1.wiek = daj.nextInt();System.out.println();
daj = new Scanner(System.in);
System.out.print("podaj imie 2 pracownika : ");pracownik2.imie = daj.nextLine();System.out.print("podaj nazwisko 2 pracownika : ");pracownik2.nazwisko = daj.nextLine();System.out.print("podaj wiek 2 pracownika : ");pracownik2.wiek = daj.nextInt();
System.out.println();System.out.println("dane pracownikow");System.out.println (pracownik1.imie+" "+pracownik1.nazwisko+" "+pracownik1.wiek);System.out.println(pracownik2.imie+" "+pracownik2.nazwisko+" "+pracownik2.wiek);
}}

folcrum

Przepraszam miało być Witku :), twój program żeczywiście działa prawidlowo ale widze, że użyleś dziedziczenia (co nie ma znaczenia) a pozatym problem rozwiązał sie poprzez ponowne inicjowanie obiektu daj. Tak czy inaczej czy istnieje w Javie jakaś instrukcja czyszcząca bufor klawiatury ?

Witek

Tego nie wiem, ponieważ nie słyszałem o czymś takim, więc nie odpowiem Ci na to pytanie. Tak dokładnie jak przeanalizowałeś poprawiony program to zuważyłeś, że zastosowałem dwa razy inicjowanie zmiennej daj.
Jak widać oba rozwiązania dają ten sam efekt.
Pozdrawiam.

Witek

Wpisałem Twoje pytanie w Google , ale niestety nic na ten temat nie znalazłem.

folcrum

Też szukałem i na razie nie znalazłem, tak czy inaczej dziekuje za poświecony mi czas.

w4ldekk

Dlaczego wiek musi być jako int, a nie np. byte? Przecież nikt nie będzie miał więcej niż 255 lat.

Witek

Witam
Wiek wcale nie musi być typu int, może być równie dobrze typu byte, nie ma tu żadnych przeciwwskazań, chociaż int zajmuje trochę więcej miejsca w pamięci niż byte, pewnie jest z przyzwyczajenia i tyle.

Asr

źle sprecyzowane zadanie

G++

Klasa pracownik:
- 3 pola (private, bo nie chcemy ich zmieniać) ,
- 2 metody:
- ustaw, metoda przypisywania zmiennym z klasy pracownik odpowiadających im argumentów
- wyswietl, metoda która pozwala wyświetlić na ekranie


public class Pracownik {
private String Imie;
private String Nazwisko;
private int Wiek;

/*
* this - opcja dla leniwych
* nie potrzeba wymyślać nowych nazw zmiennych
*/
void ustaw (String Imie, String Nazwisko, int Wiek)
{
this.Imie=Imie;
this.Nazwisko=Nazwisko;
this.Wiek=Wiek;
}

void wyswietl()
{
System.out.println("Imię: "+Imie+", "+"Nazwisko: "+Nazwisko+", "+"Wiek: "+Wiek);
}
}

Klasa Firma:
- zainicjowane są dwa obiekty, p1/p2 - jest zmienną obiektową (dzięki, której odwołujemy się do metod z klasy Pracownik);
- przekazanie jako parametr metody: Imiona, Nazwiska i Wieku.

public class Firma {
public static void main(String[] args) {

// Stworzenie obiektów
Pracownik p1=new Pracownik();
Pracownik p2=new Pracownik();

System.out.println("Pracownicy Firmy: ");

// Ustawienie i przekazanie przez argument
p1.ustaw("Dorota", "Myszka", 23);
p1.wyswietl(); // Wyświetlenie

p2.ustaw("Henryk", "Dziadek", 70);
p2.wyswietl();

}
}

Marbibu

//Pracownik
package doFirmy;
public class Pracownik{
private String Imie,Nazwisko;
private int Wiek;
public Pracownik(String Imie,String Nazwisko,int Wiek){
//Konstruktor
this.Imie=Imie;
this.Nazwisko=Nazwisko;
this.Wiek=Wiek;
}
public void show(){
//Wyswietla dane o pracowniku
System.out.println(Imie+" "+Nazwisko+" "+Wiek);
}
}


//Firma
import doFirmy.Pracownik;
public class Firma{
public static void main(String[] args){
//Wyswietlamy pracownikow
new Pracownik("Adam","Wisniewski",43).show();
new Pracownik("Mariola","Skalska",32).show();
}
}

takitam

Nie jest to błąd per se, ale zawsze powinno się definiować datę urodzenia, a nie wiek. Nie będzie trzeba co roku zwiększać wartości tego pola.

Poza tym, świetny tutorial, dzięki!