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:
int age = 18;
boolean isAdult = true;
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.
byte daysInMonth = 31;
short daysInYear = 365;
long veryLargeNumber = 72036854775807L;
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 typu long
.
Pobierz opracowania zadań z rozmów kwalifikacyjnych
Przygotowałem rozwiązania kilku zadań algorytmicznych z rozmów kwalifikacyjnych. Rozkładam je na czynniki pierwsze i pokazuję różne sposoby ich rozwiązania. Dołącz do grupy ponad 6147 Samouków, którzy jako pierwsi dowiadują się o nowych treściach na blogu, a prześlę je na Twój e-mail.
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
0b11100
-0xFF00
0777
+78_123_898
45L
45l
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 jak78123898
, 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ą typint
. Żeby dać znać kompilatorowi o tym, ze ten literał może przechowywać większe wartości musimy dodaćL
na końcu45l
– podobnie jak powyżej literał typulong
, 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 z1
, szczególnie jeśli używana jest czcionka o stałej szerokości.
Domyślna konwersja
Możesz zadać sobie teraz pytanie. Dlaczego musimy dodawać L
na końcu liczby typu long
, a nie musimy nic dodawać dla liczby typu short
czy int
? Okazuje się, że kompilator wykonuje za nas automatycznej konwersji typu:
short daysInYear = (short) 365;
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ć.
int someSmallNumber = 356;
short daysInYear = (short) someSmallNumber;
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 :)
short overflow = (short) 1_111_111;
System.out.println(overflow);
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 1’111’111 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.
char firstAlphabetLetter = 'a';
'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.
float pi = 3.14F;
double g = 9.80665;
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:
byte b1 = 10;
Byte b2 = Byte.valueOf((byte) 10);
short s1 = 10;
Short s2 = Short.valueOf((short) 10);
int i1 = 10;
Integer i2 = Integer.valueOf(10);
long l1 = 10L;
Long l2 = Long.valueOf(10L);
boolean bo1 = true;
Boolean bo2 = Boolean.valueOf(true)
char c1 = 'c';
Character c2 = Character.valueOf('c');
float f1 = 1.2F;
Float f2 = Float.valueOf(1.2F);
double d1 = 1.2;
Double d2 = Double.valueOf(1.2);
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/unboxing:
Byte b3 = 10;
Short s3 = 10;
Integer i3 = 10;
Long l3 = 10L;
Boolean bo3 = true;
Character c3 = 'c';
Float f3 = 1.2F;
Double d3 = 1.2
W przykładach powyżej kompilator Javy automatycznie opakował typy proste do obiektów (autoboxing). Operacja odwrotna (unboxing) także jest możliwa:
int i4 = Integer.valueOf(12);
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:
Scanner inputScanner = new Scanner(System.in);
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.
public class AverageTemperature {
public static void main(String... args) {
double[] temperature = new double[7];
Scanner inputScanner = new Scanner(System.in);
for(int i = 0; i < temperature.length; i++) {
System.out.println("Wprowadź liczbę " + i);
temperature[i] = inputScanner.nextDouble();
}
double summarizedTemp = 0;
for (double temp : temperature) {
summarizedTemp += temp;
}
System.out.println("Średnia temperatura wynosi " + (summarizedTemp / temperature.length));
}
}
Jeśli masz jakiekolwiek pytania dotyczące kodu powyżej proszę zadaj je w komentarzach.
Ćwiczenie
Teraz ćwiczenie dla Ciebie. Napisz program, który policzy średnią z kilku przedmiotó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żdżonych 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:
int numberOfClasses = 3;
int numberOfNotes = 4;
for (int classIndex = 0; classIndex < numberOfClasses; classIndex++) {
for (int noteIndex = 0; noteIndex < numberOfNotes; noteIndex++) {
// zadanie ;)
}
}
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.
- Dokumentacja do klasy
Scanner
- System szesnastkowy zapisu liczb,
- System ósemkowy zapisu liczb,
- Rozdział w Java Language Specification dotyczący typów prostych,
- Rozdział w Java Language Specification dotyczący literałów,
- Kod źródłowy przykładów użytych w artykule.
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 literał 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 samouczkową stronę na Facebook’u. Trzymaj się! Do następnego razu!
Pobierz opracowania zadań z rozmów kwalifikacyjnych
Przygotowałem rozwiązania kilku zadań algorytmicznych z rozmów kwalifikacyjnych. Rozkładam je na czynniki pierwsze i pokazuję różne sposoby ich rozwiązania. Dołącz do grupy ponad 6147 Samouków, którzy jako pierwsi dowiadują się o nowych treściach na blogu, a prześlę je na Twój e-mail.
Zostaw komentarz