Java dziwnie zachowująca się pętla for

0

Dopiero się uczę programować, więc proszę o wyrozumiałość. Zrobiłem na zajęcia program http://pastebin.com/jzZ4xk0G . Mam problem z pierwszą pętlą for w moim programie, mianowicie gdy kompiluje za pierwszym razem pojawia mi się po kolei nazwisko imię pesel staż pensja. Wszystko ładnie wpisuje i dobrze się wyświetla. Ale jak pętla wraca do początku to nie wiem czemu pomija nazwisko nie mogę go wpisać. Bardzo proszę o pomoc, próbowałem coś z tym zrobić ale nie mam pojęcia czemu tak program działa.

Pozdrawiam

0

Z tego co pamiętam gdy korzysta się z klasy Scanner to ma problem z przejściami między pobieraniem wartości liczbowych a Stringów (metodą "nextLine()"). Najlepiej stwórz dwa skanery, jeden dla pobierania wartości liczbowych, a drugi dla wartości tekstowych.

Na przykład tak:

Scanner dane = new Scanner(System.in);
Scanner dane2 = new Scanner(System.in);       
        pracownik tab []  = new pracownik[2];
        for(int i=0;i<2;i++)
        {  
            /*System.out.println("Czy chcesz dodac pracownika? t/n");
            String koniec = dane.nextLine();
            if (koniec == "n")break;*/
            System.out.println("Podaj nazwisko: ");
            String Snaz = dane.nextLine();
            System.out.println("Podaj imię: ");
            String Simie = dane.nextLine();
            System.out.println("Podaj pesel: ");
            long Spes = dane2.nextLong();
            System.out.println("Podaj staz: ");
            int Sstaz = dane2.nextInt();
            System.out.println("Podaj pensje: ");
            double Spen = dane2.nextDouble();
            System.out.println("");
            pracownik prac = new pracownik(Snaz,Simie,Spes,Sstaz,Spen);
            tab[i]=prac;
        }
1

Omg, nextLine - jak wskazuje nazwa - czyta całą linię, łącznie z kończącym ją enterem. nextInt i nextDouble czytają tylko fragment linii zawierający liczbę, w szczególności nigdy nie pobierają z bufora klawiatury entera. Kolejne nextLine odczytuje - nie czekając na działania użytkownika - pustą linie. Bufor klawiatury trzeba czyścić samodzielnie.

            System.out.println("Podaj pensje: ");
            double Spen = dane2.nextDouble();
            dane2.nextLine(); //tego pewnie brakowało
            System.out.println("");
0

Dziękuje bardzo. Mam jeszcze jedno pytanie, mianowicie pesel mam typu long a jak wpisuje w konstruktorze domyślnym większą liczbę to wyświetla mi komunikat "The literal 9999999999 of type int is out of range". Co z tym zrobić ?

1

Zmienić typ pesela na String.

0

Niestety w treści zadania mam napisane że musi być typu long, masz może jakiś inny pomysł ?

1

Czytaj pesel metodą nextLong i przypisuj do zmiennej typu long
Maksymalna wartość dla typu 'long' to 9 223 372 036 854 775 807, zatem każdą liczbę 18-cyfrową da się odczytać, a pesele mają tylko 11 cyfr.

0

Mam jeszcze jedno pytanie, mam zrobić "Dodaj operacje na plikach (klasy: ObjectOutputStream, ObjectInputStream). Zapisz do pliku liczbę pracowników oraz kolejne elementy tablicy ( nie korzystaj z faktu, że tablica jest obiektem). Następnie odczytaj dane z pliku i wyświetl je." Mógłby mi ktoś dać link albo cokolwiek jak się z tym uporać bo siedzę już z 3h nad tym i nadal nie wiem jak to zrobić a jutro muszę oddać program ... dziękuje za pomoc :)

1

Zapis to jakoś tak:

FileOutputStream f = new FileOutputStream(nazwaPliku);
ObjectOutputStream str = new ObjectOutputStream(f);
str.writeObject(prac.length);
for(pracownik p:prac)
{
    str.write(p);
} 
str.flush();
f.close();

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