pętle i instrukcje warunkowe
Pętle i instrukcje warunkowe w języku Java
18 listopada 2015
Interfejsy w języku Java
16 grudnia 2015
artykuł logo typy proste

Dzisiaj poznasz kilka nowych typów prostych oraz klas z biblioteki standardowej. Dowiesz się czym jest literał. Poznasz kilka przykładów literałów w języku Java. Przeczytasz też o sposobie pobierania danych od użytkownika. Z tych klocków poskładamy program do obliczania średniej temperatury dla ostatniego tygodnia. Do dzieła 🙂

To jest jeden z artykułów w ramach darmowego kursu programowania w Javie. Proszę zapoznaj się z pozostałymi częściami, mogą one być pomocne w zrozumieniu materiału z tego artykułu.

Typ prosty

Znasz już typy proste z poprzednich artykułów. int czy boolean są tu dobrymi przykładami. Typy proste nie są instancjami obiektów więc nie mają żadnych metod. Poniżej przykład zmiennych typów, które już znasz:

Jednak poza powyższymi przykładami istnieją też inne typy proste:

  • byte typ, który może przechowywać liczby całkowite z zakresu od -128 do 127,
  • short typ, który może przechowywać liczby całkowite z zakresu od -32’768 do 32’767,
  • int ten już znasz, nowy dla Ciebie będzie zakres możliwych liczb do przechowania -2’147’483’648 do 2’147’483’647,
  • long podobnie jak poprzednie typy służy do przechowywania liczb całkowitych, jednak tutaj zakres jest znacznie większy: od -9’223’372’036’854’775’808 do 9’223’372’036’854’775’807.

Proszę zwróć uwagę na zmienną veryLargeNumber. Zauważyłeś L na końcu? Dołączenie L na końcu sprawia, że używamy literału innego typu.

Czym jest literał?

Zaraz, zaraz! Czym jest literał!? To nic skomplikowanego, jest to po prostu fragment kodu programu, który może być przypisany do zmiennej i nie jest wywołaniem konstruktora ani złożoną instrukcją. Przykładowe literały, które przechowują liczby:

  • 18 – nic nowego, zwykła liczba, którą już znasz,
  • 0b11100 – też liczba, tylko zapisana binarnie, o tym typie zapisywania liczb przeczytasz w jednym z kolejnych artykułów,
  • -0xFF00 – tym razem liczba zapisana w systemie szesnastkowym,
  • 0777 – tak wygląda liczba zapisana w systemie ósemkowym,
  • +78_123_898 – to nic innego jak 78123898, tylko zapisane w troszkę inny sposób. Znak + na początku jest zbędny (domyślnie literały przechowują liczby dodatnie). Znaki _ podobnie nie są obowiązkowe, służą jedynie do zwiększenia czytelności liczby.
  • 45L – domyślnie wszystkie literały liczb całkowitych mają typ int. Żeby dać znać kompilatorowi o tym, ze ten literał może przechowywać większe wartości musimy dodać L na końcu
  • 45l – podobnie jak powyżej literał typu long, jednak tutaj na końcu widzimy małą literę l. Mimo tego, że taka konstrukcja jest dopuszczalna nie jest dobrą praktyką. l często może być pomylone z 1, szczególnie jeśli używana jest czcionka o stałej szerokości.

Domyślna konwersja

Możesz zadać sobie teraz pytanie. Po co musimy dodawać L na końcu liczby typu long a nie musimy dodawać nic dla liczby typu short czy int? Okazuje się, że kompilator wykonuje za nas automatycznej konwersji typu.

Wartość w nawiasie mówi o tym na jaki typ chcemy rzutować 365 będące typu int. W tym przypadku rzutowanie nie jest potrzebne bo kompilator wykona tą konwersję za nas. Jeśli jednak będziesz chciał przypisać wartość typu int do wartości typu short musisz takiej konwersji dokonać.

W przykładzie powyżej kompilator już takiej konwersji nie wykona automatycznie, programista musi sam o nią zadbać.

Zupełnie inną sprawą jest czy powinniśmy tak robić 🙂 Jakim cudem int, który może przechowywać dużo większe liczby może się „zmieścić” w typie short? Otóż nie może 🙂

Jak myślisz co zostanie wyświetlone na konsoli? Nie, nie będzie to 1’111’111. Komputer wyświetli -3001 🙂 Dzieje się tak dlatego, że liczba 1111111 jest większa od maksymalnej wartości jaką może przechowywać short.

To co musisz zapamiętać z tego podrozdziału to fakt, że część konwersji wykonywana jest automatycznie a część spada na programistę. Te drugie są bardziej niebezpieczne bo mogą prowadzić do niespodziewanych rezultatów.

Znak

Znasz już klasę String. Instancja klasy String przechowuje łańcuch znaków. Pojedynczy znak natomiast może być przechowywany w zmiennej typu char jak w przykładzie poniżej.

'a' też jest literałem, jest to literał typu char. Jeśli jesteśmy przy znakach to możemy zahaczyć też o łańcuchy znaków. Znany Ci już "xyz" to literał typu String.

Liczby zmiennoprzecinkowe

Do tej pory używaliśmy wyłącznie liczb całkowitych. W Javie istnieją też oczywiście typy proste, które mogą przechowywać liczby zmiennoprzecinkowe. Istnieją dwa takie typy

  • float,
  • double.

Podobnie jak w przypadku int i long, float i double różnią się wielkością liczb, które mogą przechowywać. double może przechowywać dużo większe liczby niż float. Na końcu literałów typu float musimy dodawać f bądź F jak w przykładzie poniżej.

Chociaż typy te doskonale nadają się do przechowywania np. temperatury w programie, który napiszesz w ramach ćwiczenia to już do „poważnych” obliczeń te typy się nie nadają. W dużym uproszczeniu można powiedzieć, że komputer ma problem z przechowywaniem pewnych ułamków. W poważniejszych obliczeniach wymagających liczb zmiennoprzecinkowych używamy innych typów takich jak java.math.BigDecimal.

123 jest literałem, podobnie jest z 3.14F, ten drugi to literał przechowujący liczbę zmiennoprzecinkową. W Javie zawsze do oddzielenia liczby całkowitej (3) od dziesiętnej (14) używamy znaku . (kropki).

Typy proste a obiekty

Każdy z typów prostych ma odpowiadający mu obiekt:

Jak widzisz tworzenie obiektów jest trochę „trudniejsze” niż tworzenie zmiennych typów prostych. Jednak nie jest to wymagane. W Javie istnieje tak zwany autoboxing/autounboxing:

W przykładach powyżej kompilator Javy automatycznie opakował typy proste do obiektów (autoboxing). Operacja odwrotna (autounboxing) także jest możliwa:

Pobieranie danych od użytkownika

Teraz jak znasz już wszystkie typy proste w języku Java nadszedł moment na napisane pierwszego interaktywnego programu. W programie zapytamy użytkownika o siedem kolejnych temperatur i policzymy średnią temperaturę. Do napisania takiego programu użyjemy znanych już pętli.

Zanim jednak do tego przejdziemy musisz poznać klasę java.util.Scanner. Jest to klasa dostępna w standardowej bibliotece Javy, która może nam pomóc w pobieraniu danych od użytkownika.

Standardowe wejście i standardowe wyjście

W przypadku komputerów możemy mówić o tak zwanym standardowym wejściu i standardowym wyjściu. Możemy to uprościć do tego, że standardowe wyjście to znaki, które wypisujemy na konsoli. Standardowe wyjście jest reprezentowane przez obiekt System.out. Już to znasz: System.out.println("standardowe wyjście"). To nic innego jak użycie metody println na obiekcie System.out.

Klasa Scanner używa obiektu standardowego wejścia upraszczając programiście pobieranie danych od użytkownika:

Klasa Scanner ma kilka ciekawych metod, których możemy użyć, m.in.:

  • inputScanner.nextInt(),
  • inputScanner.nextDouble().

Metody te odpowiednio pobierają liczbę całkowitą i liczbę zmiennoprzecinkową. Poniżej przykładowy program pobierający siedem temperatur dla kolejnych dni.

Jeśli masz jakiekolwiek pytania dotyczącke kodu powyżej proszę zadaj je w komentarzach.

Ćwiczenie

Teraz ćwiczenie dla Ciebie. Napisz program, który policzy średnią z kilku przedmitów. Możemy założyć, że uczeń w szkole ma 3 przedmioty i z każdego z nich dostał po 4 oceny.

Do wykonania tego zadania możesz potrzebować tablic wielowymiarowych i zagnieżdzonyh pętli. Dla przypomnienia możesz zajrzeć do artykułu o tablicach wielowymiarowych i pętlach w języku Java.

Zagnieżdżona pętla to nic innego jak pętla umieszczona w ciele innej pętli. Dla przykładu pętle, które mogą pomóc Ci wykonać zadanie mogą wyglądać tak:

Jeśli masz jakiekolwiek pytania podziel się nimi w komentarzach. Pochwal się też jeśli udało Ci się wykonać to zadanie 🙂 Jeśli będziesz miał problemy z jego wykonaniem możesz rzucić okiem do przykładowego rozwiązania.

Materiały dodatkowe

Temat bynajmniej nie jest wyczerpany. Jeśli chcesz bardziej pogłębić swoją wiedzę przygotowałem dla Ciebie zestaw linków z dodatkowymi materiałami do nauki. Część z nich jest w języku angielskim.

Podsumowanie

Dzisiaj poznałeś całkiem sporo nowych rzeczy. Znasz już wszystkie typy proste w Javie i typy je opakowujące. Wiesz już czym jest iterał i jakie są ich rodzaje. Umiesz pobierać dane od użytkownika. Innymi słowy masz już wszystkie klocki potrzebne do budowania interaktywnych programów 🙂

Mam nadzieję, że artykuł Ci się spodobał. Jeśli tak to proszę podziel się nim ze swoimi znajomymi. Jeśli chcesz wiedzieć o nowych wpisach proszę polub naszą stronę na facebooku. Trzymaj się! Do następnego razu!

Newsletter

  Jeśli chcesz otrzymywać informacje o nowych artykułach na blogu prosto na Twój email, zapisz się 🙂

10 Komentarze

  1. Krzysztof napisał(a):

    Cześć,

    męczę się okropnie z tym zadaniem i nie jestem w stanie go wykonać. Pewnie coś za dużo kombinuję. Czy byłbyś w stanie podesłać mi przykładowe rozwiązanie?

    Pozdrawiam,

  2. Lukasz napisał(a):

    Hej, a da się to zadanie zrobić tak aby wpisać ocene 3.5? Tablice mamy typu int ale oceny np. float.

    • Marcin Pietraszek napisał(a):

      Przeczytaj proszę artykuł o konwersji i rzutowaniu. Dowiesz się tam jakie są konsekwencje (i jak to zrobić) przypisania liczby typu float do zmiennej typu int.

      Jeśli chcesz mieć „ułamki” wówczas musisz użyć tablicy typu float[]. Proszę też o trochę cierpliwości, gdy na konsoli zamiast 3.5 wyświetli Ci się na przykład 3.4999999999999999997. Dlaczego tak się może stać wytłumaczę o osobnym artykule 😉.

  3. Łukasz napisał(a):

    Skąd kompilator wie że odnosimy się do wierszy a nie kolumn? To dlatego że tablica wielowymiarowa jest zawsze tablicą wierszy?

    • Marcin Pietraszek napisał(a):

      Spróbuj rozłożyć to sobie na części pierwsze. Co jest elementami tablicy typu int[]? Są to liczby typu int.

      Podobne pytanie możemy zadać dla tablicy typu int[][]. W tym przypadku elementami tablicy są elementy typu int[]. Które łatwo możesz „przetłumaczyć” na wiersze.

      * dla „programu” tablica zajmuje obszar pamięci, gdzie pierwsze X elemntów to pierwszy „wiersz”, kolejne X elementów do drugi wiersz itd.

  4. W napisał(a):

    Cześć
    U mnie takie coś nie działa byte b4 = new Byte(12);
    takie coś działa: byte b4 = new Byte((byte) 12);

    Pozdro

    • W napisał(a):

      Ja zrobiłem to tak:
      http://imgur.com/Oy7BoYb

      Ale patrzac po twoim rozwiązaniu zrobie jak Ty 😀 Bardzo fajna stronka!

    • Marcin Pietraszek napisał(a):

      Rzeczywiście przeoczyłem to w treści artykułu, już poprawiam. Dzięki! Jeśli chesz wiedzieć dlaczego to (byte) jest konieczne zachęcam do przeczytania arytkułu o konwersji i rzutowaniu w języku Java.

      Jeśli chodzi o Twoje rozwiązanie, to moim zdaniem za dużo w nim duplikacji. Dobrze byłoby wydzielić wspólne, powtarzające się fragmenty do osobnych metod.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *