Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Rozwiązanie 2.2

Kolejny program kursu z programowania obiektowego. Postępujemy analogicznie do zadania 2.1, jednak tym razem klasę Firma rozbudowujemy o większą liczbę pracowników, a pola inicjujemy w dowolnych pętlach.

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

Jak widać klasa Pracownik pozostaje niezmieniona.

Zmiany zachodzą jednak w klasie Firma. Przede wszystkim najpierw musimy utworzyć 3 tablice przechowujące odpowiednio imiona, nazwiska i wiek pracowników. Następnie najwygodniej w klasie for przypisywać odpowiednie komórki tablic do odpowiednich pól obiektów typu pracownik, które także warto przechowywać w tablicy.

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

		String[] imiona = {"Wlodek", "Staszek", "Lukasz"};
		String[] nazwiska = {"Zieba", "Kowalski", "Zietek"};
		int[] wiek = {45, 34, 56};

		for(int i=0; i< pracownicy.length; i++){
			pracownicy[i] = new Pracownik();
			pracownicy[i].imie = imiona[i];
			pracownicy[i].nazwisko = nazwiska[i];
			pracownicy[i].wiek = wiek[i];
		}

		System.out.println("Pracownicy firmy to:");
		for(int i=0; i< pracownicy.length; i++)
			System.out.println(pracownicy[i].imie+" "+pracownicy[i].nazwisko+", "+pracownicy[i].wiek+" lat");
	}
}

Jak widać przykład jest nieco bardziej skomplikowany, niż mogłoby się wydawać. Utworzyliśmy 3 elementowe tablice: pierwsza przechowuje obiekty typu Pracownik, dwie kolejne typu String przechowują imiona i nazwiska, a ostatnia typu int wiek pracowników.

W pętli przede wszystkim pierwsza operacja, którą musimy wykonać jest utworzenie obiektu w odpowiedniej komórki tablicy pracownicy. Póki co była tam pusta referencja, a nie obiekt. Gdybyśmy próbowali się odwołać do pól, lub metod nieutworzonego obiektu otrzymalibyśmy przy próbie uruchomienia programu bardzo nieprzyjemny wyjątek NullPointerException.

Kolejne linie w pętli to proste uzupełnianie danych.

W drugiej pętli analogicznie wyświetlamy dane.

Jeśli ktoś nie użył do przechowywania Pracowników tablicy to oczywiście jest to poprawne, tylko wymaga więcej pisania. Powyższy przykład rozwiązania jest jednak bardziej dynamiczny i wyobraźmy sobie ile pracy kosztuje nas na przykład utworzenie w taki sposób bazy 100 pracowników, a ile w ręcznym pisaniu wszystkiego.

Zasada jest taka, jeśli da się gdzieś skrócić czas pracy i długość kodu, jednocześnie nie narażając programu na zauważalny spadek wydajności to zrób to.

Komentarze

Komentarze zamknięte. Zapraszamy do grupy na Facebooku
gabir

:( na razie tego nie rozumiem...

Natalii

Pewnie problem masz ze zrozumieniem uzycia tablicy do pracownikow.

Chodzi o to ze w danej tablicy nie musimy przechowywac tylko i wylacznie liczb czy stringow, nic nie stoi na przeszkodzie by w tablicy umiescic jeszcze inna tablice.

Najpierw tworzymy klase Pracownik. Potem tablice ktora bedzie przechowywala obiekty typu pracownik.
Pracownik[] pracownicy = new Pracownik[3];
Powyzsza linia mowi nam o tym ze bedziemy miec tablice w ktorej beda sie znajdowalay 3 obiekta typu pracownik. Innymi slowy bedziemy miec 3 pracownikow.

Kazdy pracownik ma imie nazwisko i wiek. Skad to wiemy? Bo klasa pracownik sklada sie z 3 zmiennych:
String imie;
String nazwisko;
int wiek;

Kazde pole tej klasy bedzie u nas tablica, czyli bedziemy miec tablice z imionami, nazwiskami i liczba lat pracownikow.
String[] imiona = {"Wlodek", "Staszek", "Lukasz"};
Powyzszy kod twiorzy nam tablice 3 elementowa z imionami pracownikow. Tak samo jest dla pozostalych pol klasy Pracownik.

Natomiast jesli chodzi o zapis
pracownicy[i] = new Pracownik();
to jest to nic innego jak poinformowanie program o tym ze tworzymy nowy obiekt w odpowiedniej komórce tablicy pracownicy.
Musimy utowrzyc nowy obiekt bo bez tego nie bedzemy mogli sie odwolywac do tej tablicy.
Czyli program wie ze teraz w komorce tablicy o zadanym indeksie bedzie wpisywal dane.
Jakie dane? No takie jakie znajduja sie w tablicach poszczegolnych pol klas:
pracownicy[i].imie = imiona[i];
pracownicy[i].nazwisko = nazwiska[i];
pracownicy[i].wiek = wiek[i];
Program(a dokladniej kompilator) teraz wie iz ma w komorce tablicy o indeksie i wpisac imie pochodzace z tablicy imiona o indeksie i oraz nazwisko pochodzace z tablicy nazwiska o indeksie i oraz wiek pochodzacy z tablicy wiek o indeksie i.

gabir

Natalii - wielkie dzięki, dużo mi Twój opis wyjaśnił - do mnie trzeba naprawdę mówić o Javie łopatologicznie, ale mam nadzieję, że wystarczy mi zacięcia i później już będzie łatwiej; bo przecież zawsze najtrudniejsze są początki :-)

Grzegorz

Natalii, powiem tak, jakby nie Ty, to bym się chyba pochlastał śniegiem z parapetu, zastanawiając się dlaczego to tak jest zapisane :) jesteś wielka!.
hmm... może autorzy powinni tak łopatologicznie to wszystko tłumaczyć? było by łatwiej :)

Ignacy

Zgadzam się z Grzegorzem i gabirem, gdyby nie ty, siedziałbym nad tym chyba z miesiąc :D
Wielkie dzięki!

webskee

"Jeśli ktoś nie użył do przechowywania Pracowników tablicy to oczywiście jest to poprawne, tylko wymaga więcej pisania. "
No nie wiem. Ja takiej tablicy nie użyłem a pisania miałem mniej - oczywiście przy założeniu, że program ma tylko wyświetlać dane a nie tworzyć bazę...

public class Firma2{
public static void main(String args[]){
String[] imiona = {"Adam","Ewa","Jacek"};
String[] nazwiska = {"Kowal","Nowak","Kosz"};
int wiek[] = {21, 46, 125};
Pracownik2 worker = new Pracownik2();
for(int i=0; i<3; i++){
worker.imie = imiona[i];
worker.nazwisko = nazwiska[i];
worker.wiek = wiek[i];
System.out.println("Pracownik "+i+":"+worker.imie+" "+worker.nazwisko+", wiek: "+worker.wiek);
}
}
}

Natalii

A teraz bez petli sprobuj dowiedziec sie wszystkiego na temat konkretnego pracownika.

Gdybys sie rozmyslil i probowal zmienic dane danego pracownika a potem chcial tylko te poprawione dane wyswietlic to nie masz juz takiej mozliwosci.
Umieszczenie pracownikow w innej tablicy daje nam mozliwosc wypisania danych interesujacej nas osoby.

Ponizszy zapis da nam dane o drugim pracowniku (indeksy tablicy zaczynaja sie od 0)
System.out.println(pracownicy[1].imie+" "+pracownicy[1].nazwisko+", "+pracownicy[1].wiek+" lat");

Gdybysmy teraz chcieli zmienic jego dane to wystarczy tylko zmienic dane w konkretnych miejscach tablic i aby nowe dane wyswietlic nie trzeba od poczatku calej petli robic tylko podac konkretny indeks pracownika.

Jak widac taki zapis ulatwia nam dostep do danych i skraca kod.

Michał

Nie wiem czemu to nie działa nalezycie.. :/
import java.util.Scanner;

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

Scanner odczyt=new Scanner(System.in);

System.out.println("podaj liczbe pracownikow");
int n=odczyt.nextInt();

String[] imiona=new String[n];
String[] nazwiska=new String[n];
int[] wiek=new int[n];
Pracownik[] pracownicy=new Pracownik[n];

for (int i=0;i<n;i++){
System.out.println("podaj imie pracownika"+(i+1));
imiona[i]=odczyt.nextLine();
System.out.println("podaj nazwisko pracownika"+(i+1));
nazwiska[i]=odczyt.nextLine();
System.out.println("podaj wiek pracownika"+(i+1));
wiek[i]=odczyt.nextInt();
}

for (int i=0;i<n;i++){
pracownicy[i].przypisz(imiona[i], nazwiska[i], wiek[i]);
pracownicy[i].pokaz();
}
}
}
--------------------------------------------------------------------
public class Pracownik{
String imie;
String nazwisko;
int wiek;
void przypisz(String a, String b, int c){
imie=a;
nazwisko=b;
wiek=c;
}
void pokaz(){
System.out.println(imie+" "+nazwisko+", lat "+wiek);
}
}

Slawek

Zapewne otrzymujesz nullpointerexception. Nigdzie nie zainicjowałeś elementów tablicy pracownicy. W pierwszej pętli musisz dodać pracownicy[i] = new Pracownik(). Bez tego jest ona wypełniona wartościami null, próba wywołania na nich metody kończy się wyjątkiem.

Michał

Dzięki!

Alo

Mam pytanie bo nie do końca coś rozumiem.
Skoro poniższy zapis oznacza, że tworzymy 3-elementową tablicę obiektów typu Pracownik:
Pracownik[] pracownicy = new Pracownik[3];

to dlaczego w pętli dodatkowo musimy każdemu elementowi tej tablicy przypisać znowu typ obiektu Pracownik?
pracownicy[i] = new Pracownik();

Greg

moje dwa grosze:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cw2_2;

/**
*
* @author Mysth
*/
public class Pracownik {

String imie;
String nazwisko;
int wiek;

void set(String i, String n, int w){
imie=i;
nazwisko=n;
wiek=w;
}
void get() {
System.out.println("Imie: "+imie+"\nNazwisko: "+nazwisko+"\nWiek: "+wiek+"\n");
}
String daj_i(){
return imie;
}
String daj_n(){
return nazwisko;
}
int daj_w(){
return wiek;
}
}



package cw2_2;
// import cw2_1.Pracownik;

public class Firma {

public static void main(String args[]){

Pracownik[] pr=new Pracownik[3];
String[] tab1={"A","B","C"};
String[] tab2={"X","Y","Z"};
int[] tab3={20,30,40};

for(int i=0; i<pr.length; i++){
pr[i]=new Pracownik();
pr[i].imie=tab1[i];
pr[i].nazwisko=tab2[i];
pr[i].wiek=tab3[i];
// lub wszystko od razu
pr[i].set(tab1[i],tab2[i],tab3[i]);
}
for(int i=0; i<pr.length; i++){
System.out.println("Imie: "+pr[i].imie+"\nNazwisko: "+pr[i].nazwisko+"\nWiek: "+pr[i].wiek+"\n");
// z wykorzystaniem metod 'zwracajacych'
System.out.println("Imie: "+pr[i].daj_i()+"\nNazwisko: "+pr[i].daj_n()+"\nWiek: "+pr[i].daj_w()+"\n");
// wszystko na raz
pr[i].get();
}

}
}

Slawek

Mała uwaga do ostatniej instrukcji "pr[i].get();"
Metody nazywane jako get(), getCośTam() zawsze powinny zwracać jakiś wynik i nie powinny być odpowiedzialne za wyświetlanie tekstu itp - taka konwencja.
To co zrobiłeś zdecydowanie lepiej jest zrobić przeciążając w klasie pracownik metodę toString() z klasy Object.
Wyglądałoby to mniej więcej tak:

public String toString() {
return "Imie: "+imie+"\nNazwisko: "+nazwisko+"\nWiek: "+wiek+"
}
i następnie w miejscu gdzie Ty używałeś pr[i].get(); robimy:

System.out.println(pr[i]); //nie trzeba nawet jawnie wywoływać metody toString(), zrobi się to automatycznie

Greg

co to znaczy "przeciążając" ?
Dlaczego przy budowaniu tej metody konieczne jest podanie specyfikatora dostępu?
Z góry dzięki za odp

Slawek

Przerób dwie kolejne lekcje i później wróć do tego, powinno się nieco wyjaśnić :)

Violka

w klasie for ? :D

NoName

Pytanie:

i<pracownicy.length; - Ten zwrot oznacza "wykonuj pętle póki i jest mniejsze od wielkości "czegoś-tu tablicy"" dobrze to zrozumiałem?

Witek

Witam

Można to tak powiedzieć - „ wykonuj dopóki są jakieś elementy w tablicy ”

W tablicach właściwość lenght - zawiera liczbę elementów, które może pomieścić tablica
Korzystamy z tej właściwości w pętli for, aby zarządzać ilościami powtórzeń, zamiast robić to ręcznie i pilnować wielkości tablicy.

Natomiast w klasie String metoda length() - zwraca aktualną długość tekstu
( znaków) .

Kuba

Witam zastanawiam się, gdyż pewnie jest to jakaś głupota ale mnie dręczy. Otóż napisałem program który ładnie działa poza jednym szczegółem .


public class Pracownicy {


String imie;
String nazwisko;
int wiek;

void przypisz(String a, String b, int c){
imie = a;
nazwisko = b;
wiek = c;

}
void przedstaw(){
System.out.println("Oto wynik "+imie+" "+nazwisko+" "+wiek);
}
}
--------------------------------------------------------------------------------------------------------------------
import java.util.Scanner;
public class Farma {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub


Scanner odczyt=new Scanner(System.in);

System.out.println("Prosze podac wielkosc tablicy");
int n=odczyt.nextInt();

Pracownicy[] pracownik= new Pracownicy[n];

for(int i=0; i<n; i++){
pracownik[i] = new Pracownicy();

System.out.println("Prosze podac imie"); ]
pracownik[i].imie = odczyt.nextLine(); ] W tym miejscu naraz wyskakują
] dwa pytania o imię i nazwisko.
System.out.println("Prosze podac nazwisko"); ] Dlaczego nazwisko nie czeka
pracownik[i].nazwisko = odczyt.nextLine(); ] grzecznie w kolejce?? ;f

System.out.println("Prosze podac wiek");
pracownik[i].wiek = odczyt.nextInt();
}

for(int i=0; i<n; i++){
pracownik[i].przedstaw();
}
}
}

Bardzo proszę o pomoc, gdyż tego typu zagadnienie trafia mi się podczas pisania innych "programów" ;]

gandy

No to masz taki sam problem jak i ja.

Slawek

Po scanner.nextInt() musicie dodać scanner.nextLine(), aby "zjadło" znak nowej linii.

gandy

Dzięki - nie pomyślałem,że Enter po liczbie trzeba oddzielnie przeczytać,żeby potem zacząć od nowej linii. Już wszystko OK.

Kuba

Nie rozumiem,mogę prosić jaśniej Panowie?

Slawek

Po linijce:
pracownik[i].wiek = odczyt.nextInt();
dodajesz linijkę
odczyt.nextLine();, aby pozbyć się z bufora znaku nowej linii.

Prośba, aby pytania z tak długim kodem wklejać na forum. Strona się zaczyna wolno ładować, gdy są wklejane takie tasiemce i zazwyczaj je po prostu usuwam.

Kuba

Wybacz Slawku tą niegodziwość, następnym razem udam sie na forum. A teraz wracając jeszcze do mojego pytania.
Dokonałem modyfikacji za Twoją radą i po linijce pracownik[i].wiek=odczyt.nextInt(); dodałem linijkę odczyt.nextLine();. Faktycznie to pomogło,lecz nie do końca, gdyż po uruchomieniu programu podaję wielkość tablicy np. 2, czyli dostanę zapytanie o parę imion, nazwisk i wieku. Program jednek zaczyna zachowywać się poprawnie dopiero po pierwszym zestawie pytań. Niżej przedstawiam działanie.

Prosze podac wielkosc tablicy
2
Prosze podac imie
Prosze podac nazwisko
Kuba
Prosze podac wiek
22
Prosze podac imie
Ewa
Prosze podac nazwisko
Wasiak
Prosze podac wiek
23
Oto wynik Kuba 22
Oto wynik Ewa Wasiak 23

Slawek

no ale przecież po odczytaniu wielkości tablicy musisz zrobić dokładnie to samo, jak po każdej metodzie nextInt, nextDouble itp.

gandy

Kuba -tak jak ja to rozumiem wygląda to następująco :przykładowo gdy wykonujesz odczyt.nextInt() i chcąc podać jakąś liczbę klikasz na klawiaturze załóżmy klawisz z cyfrą 5 oraz klawisz zakańczający wprowadzanie Enter to w takiej sytuacji wykonanie twojej instrukcji odczyt.nextInt() spowoduje,że zostanie tylko "wyczyszczona" z twojego obiektu odczyt tylko część dotycząca liczby całkowitej czyli liczba 5 natomiast kod klawisza enter dalej będzie w nim pozostawał i spowoduje te perturbacje, które obserwujesz w swoim programie. W przypadku odczyt.nextLine() jest inaczej gdyż "czyszczona" jest cała linia włącznie ze znakiem odpowiadającym wciśnięciu Entera na zakończenie wpisywania linii.

Michał

Druga pętla jest w zasadzie niepotrzebna, można wypisywanie danych wrzucić do pierwszej.

Marcin

Przy okazji - widziałem przy niektórych lekcjach wklejki kodu ładnie pokolorowane i sformatowane, jak to zrobić? Jakiś znacznik?

Lukasz

Nie powinno być czasem Pracownik[] pracownicy = new Pracownik[2]; ??? Skoro numerujemy tablice od 0 to mamy 4 pracowników :D

Lukasz

Sorry, skompilowałem i już wiem, że musi być 3(choć nie wiem dlaczego :()

Oskar

Jakby ktoś chciał to tu podaję wypisanie wszystkich pracowników z wykorzystaniem pętli foreach:

for(Pracownik x : pracownicy){
System.out.println("Dane o pracowniku: \n\t-Imie: "+x.imie+"\n\t-Nazwisko: "+x.nazwisko+"\n\t-Wiek: "+x.wiek);
}

ALTR

Co jest tutaj nie tak:
public class zad2_2{
public static void main(String args[]){
Pracownik[] pracownicy = new Pracownik[4];
String[] imiona = {"włodek", "Staszek", "Leszek", "ANdrzej"};
String[] nazwiska = {"Kowalski", "Malczewski", "Kozojebski", "Ciechanowski"};
int[] wieki = {25, 28, 30, 40};
for(i=0, i<pracownicy.length, i++){
pracownicy[i] = new Pracownik();
pracownicy[i].imie = imiona[i];
pracownicy[i].nazwisko = nazwiska[i];
pracownicy[i].wiek = wieki[i];
}
System.out.println("Pracownicy firmy to:");
for(i=0, i<pracownicy.length, i++){
System.out.println(pracownicy[i].imie+" "+pracownicy[i].nazwisko+" w wieku "+pracownicy[i].wiek);
}
}
}

Kazix

ALTR - wklejam poprawiony kod:

public class zad2_2{
public static void main(String args[]){
Pracownik[] pracownicy = new Pracownik[4];
String[] imiona = {"włodek", "Staszek", "Leszek", "ANdrzej"};
String[] nazwiska = {"Kowalski", "Malczewski", "Kozojebski", "Ciechanowski"};
int[] wieki = {25, 28, 30, 40};

for(int i=0; i <pracownicy.length; i++){
pracownicy[i] = new Pracownik();
pracownicy[i].Imie = imiona[i];
pracownicy[i].Nazwisko = nazwiska[i];
pracownicy[i].Wiek = wieki[i];
}
System.out.println("Pracownicy firmy to:");

for(int i=0; i<pracownicy.length; i++){
System.out.println(pracownicy[i].imie+" "+pracownicy[i].nazwisko+" w wieku "+pracownicy[i].wiek);
}

W pętlach for nie zadeklarowałeś zmiennej "i" jako int

starwarsfan

Nie wiem czy sie komus przyda ale ja rozwiązałem to zadanie w taki sposób
public class Pracownik{
String[] imie = {"Wlodek", "Staszek", "Lukasz"};
String[] nazwisko = {"Zieba", "Kowalski", "Zietek"};
int[] wiek = {45, 34, 56};
}
------------------------------------
public class Firma
{
public static void main(String[]args)
{ Pracownik pracownik=new Pracownik();
System.out.println("Pracownicy firmy to:");
for(int i=0; i<pracownik.imie.length; i++)
System.out.println(pracownik.imie[i]+" "+pracownik.nazwisko[i]+", "+pracownik.wiek[i]+" lat");
}
}
i prosiłbym o ewentualne uwagi jesli moj sposób sie nie nadaje

ALTR

Kazix dzięki za pomoc, ale mam kolejny problem - probowalem stworzyć baze wprowadzana za ponmoca System.in jednak poi wprowadzeniu danych pierwszego pracownika 2 zaczyna sie od nazwiska i ucina dane imienia pracownika nr 2, dlaczego?

import java.util.Scanner;

public class zad2_22{
public static void main(String[] args){
Robol[] robotnicy = new Robol[2];
System.out.println("Wprowadz dane pracownikow");
Scanner odczyt = new Scanner(System.in);

for(int i=0; i<robotnicy.length; i++){
robotnicy[i] = new Robol();
System.out.println("Wprowadz imie "+(i)+" pracownika");
robotnicy[i].imie = odczyt.nextLine();
System.out.println("Wprowadz nazwisko "+(i)+" pracownika");
robotnicy[i].nazwisko = odczyt.nextLine();
System.out.println("Wprowadz wiek "+(i)+" pracownika");
robotnicy[i].wiek = odczyt.nextInt();
}
System.out.println("To juz wszyscy pracownicy");
for(int i=0; i<robotnicy.length; i++){
System.out.println((i+1)+". "+robotnicy[i].imie+" "+robotnicy[i].nazwisko+" w wieku "+robotnicy[i].wiek);
}
}
}

Sławek

Hej,
kombinuję z rozwinięciem zadania i mam pewien problem.
Po skompilowaniu "opuszcza" mi podanie nazwiska, czego wynikiem jest zawsze pracownik z samym imieniem i wiekiem. Poniżej kod:
import java.io.PrintWriter;
import java.util.Scanner;
import java.io.FileNotFoundException;

public class ListaPracownikow {

public static void main(String[] args) throws FileNotFoundException {

Scanner input = new Scanner(System.in);
System.out.println("Podaj liczbę pracowników");
int n = input.nextInt();

Pracownik[] pracownik = new Pracownik[n];
String[] nazwisko = new String [n];
String[] imie = new String[n];
int[] wiek = new int[n];

PrintWriter zapis = new PrintWriter ("pracownicy.txt");


for (int i = 0; i < n; i++)
{
pracownik[i] = new Pracownik();
System.out.println("Podaj imię " + (i+1) + " pracownika");
imie[i] = input.nextLine();
System.out.println();
System.out.println("Podaj nazwisko " + (i+1) + " pracownika");
nazwisko[i] = input.nextLine();
System.out.println();
System.out.println("Podaj wiek " + (i+1) + " pracownika");
wiek[i] = input.nextInt();
System.out.println();
}
for (int i = 0; i < n; i++)
{
pracownik[i].przypisz(imie[i], nazwisko[i], wiek[i]);
pracownik[i].pokaz();
zapis.println(imie[i] + " " + nazwisko[i] + " lat " + wiek[i]);
}
zapis.close();

}

}

BTW. Serdecznie dziękuję za kurs, najlepszy jaki znalazłem ;)

Dominik

A ja zrobiłem wersję pro ;).
Najpierw pobieram imiona, nazwiska i wiek z klawiatury od użytkownika. Zapisują do tablicy a następnie z tablicy wyświetlam na konsolę :)
Co o tym sądzicie. Można coś gdzieś skrócić?

import java.util.Scanner;


public class Firma {

public static void main(String args[]){


Scanner odczyt=new Scanner(System.in);

Pracownicy[] pracownik=new Pracownicy[3];


String [] imiona= new String[3];
String [] nazwiska=new String[3];
int [] wiek = new int[3];

for(int i=0;i<imiona.length;i++){
int numer1=i+1;
System.out.println("Podaj "+numer1+" imię");
imiona[i]=odczyt.nextLine();
}


for(int k=0;k<nazwiska.length;k++){
int numer2=k+1;
System.out.println("Podaj "+numer2+" Nazwisko");
nazwiska[k]=odczyt.nextLine();
}

for(int l=0;l<wiek.length;l++){
int numer3=l+1;
System.out.println("Podaj wiek "+numer3+" osoby");
wiek[l]=odczyt.nextInt();
}

for(int i=0;i<pracownik.length;i++){
pracownik[i]=new Pracownicy();
pracownik[i].Imię=imiona[i];
pracownik[i].Nazwisko=nazwiska[i];
pracownik[i].Wiek=wiek[i];
}

odczyt.close();

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

for(int i=0;i<pracownik.length;i++){
int numerek=i+1;
System.out.println("Pracownik "+numerek+" to "+pracownik[i].Imię+"
"+pracownik[i].Nazwisko+" lat "+pracownik[i].Wiek);
System.out.println();
}
}

}

Dominik

"Po skompilowaniu „opuszcza” mi podanie nazwiska, czego wynikiem jest zawsze pracownik z samym imieniem i wiekiem. "


Stwórz sobie oddzielny obiekt klasy Scanner tylko do odczytu wieku. Nie wiem dlaczego tak się dzieje, ale jeżeli w pętli masz do odczytania 3 różne dane z klawiatury to wszystko jest w porządku dopóki są to dane tego samego typu np. String. Jeżeli mieszasz Stringi z Int to dzieją się cuda. Dlatego ja mam tak zawsze:

Scanner inputstring=new Scanner(System.in); - wykorzystuję do odczytu stringów
Scanner inputint=new Scanner(System.in); - wykorzystuję do odczytu int'ów

później w kodzie piszę tylko:

int a = inputint.nextInt()
lub
String x=inputstring.nextLine()

Nie wiem czy to po prostu strumień nie zdoła się odświeżyć w pętli ale na wszelki wypadek stosuję takie rozwiązanie.


powodzenia

Ola

Nie do końca rozumiem, czemu w przedostatniej linijce powtarzamy pętle.

kixub

Pierwsza pętla uzupełnia tablice danymi, druga wypisuje dane :)

k2marko

Zastanawiam się tylko czy tablica pracownicy składa się z trzech elementów dlatego, że mamy trzech pracowników czy dlatego, że mamy trzy parametry opisujące tychże pracowników :)

Vergn

Zrobiłem to sam, ale pracowników wklepuje się samemu i po podaniu pierwszego imienia wyswietla się to:

Exception in thread "main" java.lang.NullPointerException
at zwrotczlowiek.main(zwrotczlowiek.java:15)

cały kod jest tu:
import java.util.Scanner;

public class zwrotczlowiek{
public static void main(String[] args){
Scanner a = new Scanner(System.in);
czlowiek[] x = new czlowiek[2];
int i = 0;
int j = 0;
int l = 0;
String[] imiona = new String[2];
String[] wiek = new String[2];

while(i<2){
System.out.println("podaj imie");
x[i].imie = a.nextLine();
i++;
}
while(j<2){
System.out.println("podaj wiek");
x[i].wiek = a.nextInt();
j++;
}
while(l<2){
System.out.println(imiona[l]+"_"+wiek[l]);
l++;
}
}
}
Jak to naprawić?

Shoo

Hej wszystkim,
czemu w moim kodzie muszę zdublować linię "robotnik[i].imie = odczyt.nextLine();"
jeżeli jej nie zdubluje to program ją pomija i przechodzi od razu do nazwiska


import java.util.Scanner;

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

int liczba;
Scanner odczyt = new Scanner(System.in);
System.out.print("Ilu pracownikow chcesz wprowadzic: ");
liczba = odczyt.nextInt();
Pracownik[] robotnik = new Pracownik[liczba];


for (int i=0; i<liczba; i++){
robotnik[i] = new Pracownik();
System.out.print("Podaj imie pracownika o indexie "+i+": ");
robotnik[i].imie = odczyt.nextLine();
robotnik[i].imie = odczyt.nextLine();
System.out.print("Podaj nazwisko pracownika o indexie "+i+": ");
robotnik[i].nazwisko = odczyt.nextLine();
System.out.print("Podaj wiek pracownika o indexie "+i+": ");
robotnik[i].wiek = odczyt.nextInt();
System.out.print("\n");
}

System.out.println("\n*** WYKAZ PRACOWNIKOW ***");
for (int i=0; i<liczba; i++) {
System.out.print(i+") "+robotnik[i].imie);
System.out.print(" "+robotnik[i].nazwisko);
System.out.println(" lat "+robotnik[i].wiek);
}
}
}

Micgy

Spróbuj zamiast nextLine dać samo next()

Shoo

ale czemu tak trzeba? :)

Janosch

A tutaj moja wersja rozwiązania zadania 2.1.
http://forum.javastart.pl/Thread-Pierwszy-program-obiektowy?pid=992#pid992

Walterowicz

Moi drodzy, takie zadania jako przykład od Javy tylko odstraszają. Jak na material wytłumaczony zbyt wiele z niego było wymagane, i nie w pętlach sprawa a w możliwościach klas.

Tomek

Hej, pytanie offtopic trochę do profesjonalistów:
1. macie jakiś swój sprawdzony sposób, jak się efektywnie uczyć programowania? Macie jakieś metody, własne praktyki, wnioski, które wyciągneliście i teraz działają?
2. mama ten problem, że ucze się danej lekcji, rozumiem, zrobie zadanie idę dalej a po jakimś czasie nic nie zostaje. Pomyślałem, że może potrzebowałbym większej ilości zadań z tego samego tematu. Macie może jakaś stronkę taką z ilością kilku zadań na dany temat?
Pozdrawiam ;)

Lolo

1. Moim zdaniem najefektywniej jest się uczyć pisząc jakieś swoje programy i przy okazji szukać rozwiązań rzeczy których się jeszcze nie umie.
2.Nie rozumiem z czym masz problem? Zapamiętać pętli, instrukcji warunkowych, zmiennych, metod, klas czy czego?