czwartek, 23 lipca 2009

Rozdział 2. "Zmienne, operatory i instrukcje"

Witam po długiej przerwie!

Czas najwyższy zabrać się za podstawy programowania w Javie. Jak wcześniej wspomninałem zajmiemy się najpierw książką Marcina Lisa, lecz postanowiłem przerobić jedynie kilka z jej rozdziałów:
  • Rozdział 1. "Krótkie wprowadzenie" (już omówiony)
  • Rozdział 2. "Zmienne, operatory i instrukcje" (będący przedmiotem rozważań w tym poście)
  • Rozdział 3. "Obiekty i klasy"
  • Rozdział 4. "Wyjątki"
Dlaczego jedynie 4 z 11 rozdziałów? Ano dlatego, że są one esencją podstawowych wiadomości jakie potrzebuje osoba chcąca pisać programy w Javie zgodnie z ideą programowania zorientowanego obiektowo, lecz nie wchodząc zbyt szczegółowo w samą teorię OOP. Dzięki tej wiedzy znacznie łatwiej (i szybciej) będziemy mogli przejść do najważniejszej dla Javisty książki na początku jego wędrówki - "Thinking in Java." w wydaniu IV (polskim). Do tego chciałbym przeplatać te posty różną dodatkową wiedzą, a więc całość będzie krótsza, spójniejsza i bardziej oparta na kodzie i przykładach niż na teorii.

A więc do roboty!! :)

Pierwsza część rozdziału 2 opowiada o zmiennych typu prostego. Możemy je podzielić na:
  • typy całkowitoliczbowe (takie jak byte, short, int i long) - do przechowywania liczb całkowitych
  • typy zmiennopozycyjne (float i double) - do przechowywania liczb posiadających część ułamkową
  • typ boolean - logiczny typ przyjmujący jedynie dwie możliwe wartości: true oraz false
  • typ char - służący do reprezentacji znaków Unicode (choć czasem używa się go do operacji arytmetycznych)

Zmienne deklarujemy w następujacy sposób:
typ_zmiennej
nazwa_zmiennej;

Natomiast odpowiednią wartość nadajemy poprzez zapis:
nazwa_zmiennej = wartość;

Programy pokazujące operowanie na zmiennych typu prostego mają numery od 1 do 3.

Następnym istotnym i występującym obecnie chyba w każdym języku programowania elementem są tablice. Dzięki tablicy możemy deklarować wiele zmiennych tego samego typu i połączyć je w taki sposób, że odwoływanie się do kolejnych zmiennych będzie bardzo szybkie i proste. Struktura deklaracji tablicy wygląda następująco:
typ_zmiennej nazwa_tablicy[] = new typ_zmiennej[rozmiar_tablicy];

Natomiast odwołanie się do i-tego elementu tej tablicy:
nazwa_tablicy[index];

przy czy index jest liczony od 0 do rozmiar_tablicy - 1!!

Tablice takie (w przeciwieństwie do niektórych kontenerów, o których już za kilka postów) mają stałą, z góry ustaloną wielkość. Nasuwa się więc pytanie co się stanie, gdy zechcemy odwołać się do elementu nieistniejącego (przekraczającego rozmiar)? Nie możemy wykonać takiego odwołania, ponieważ już na etapie kompilacji kompilator rozpozna taką sytuację i przekaże nam na ten temat stosowną informację! Czyż to nie piękne? ;)

W omawianym rozdziale znajdziemy informacje takie jak operacje arytmetyczne na zmiennych, dzielenie modulo operatory inkrementacji i dekrementacji (zarówno pre jak i post), operatory logiczne, przypisania. Ja chciałbym się natomiast skupić na kilku ważnych rzeczach:

1) Operator warunkowy:
warunek ? wartość1 : wartość2;

Jest bardzo użytecznym operatorem. W przypadku, gdy warunek będzie prawdziwy operator zwróci wartość 1, natomiast jeśli fałszywy wartość 2. Jest to prosta konstrukcja, która dosyć często potrafi sprawić, że kod jest krótszy i czytelniejszy.

2) Instrukcja warunkowa if...else oraz if...else if:

if (wyrażenie_warunkowe) {
// instrukcje do wykonania, jeśli warunek jest prawdziwy
}
else {
// instrukcje do wykonania, jeśli warunek jest fałszywy
}

if (warunek1) {
// instrukcje 1
}
else if (warunek2) {
// instrukcje 2
}
else if (warunek3) {
// instrukcje 3
}
else {
// instrukcje 4
}

Instrukcje w klamrach są blokami kodu, nie koniecznie pojedyńczymi instrukcjami. W pierwszym przypadku sytuacja jest analogiczna do operatora warunkowego. Jeśli warunek jest prawdziwy wykona się pierwszy blok kodu, jeśli fałszywy drugi blok. Czasem jednak jest tak, że dana sytuacja/problem może mieć więcej niż dwa rozwiązania. Wtedy stosujemy drugą konstrukcję. Przy konstruowaniu złożonych instrukcji warunkowych if...else nalezy pamiętać, że jeśli prawdziwe są dwa warunki, to wykonany zostanie jedynie tej występujący wcześniej.

3) Instrukcja wyboru switch:

switch (a) {
case 1:
instrukcje1;
break;
case 50:
instrukcje2;
break;
case 23:
instrukcje3;
break;
default:
instrukcje4;
}


Switch jest bardzo podobny do instrukcji if...else if lecz jest bardziej praktyczny w przypadku, gdy jako warunek logiczny występuje sprawdzenie, czy dana liczba całkowita ma określoną wartość (kolejne przypadki, ang. case). Instrukcja break podowuje wyjście z bloku switch (ale o tym za chwilę).

4) Pętla for:

for (wyrażenie_początkowe; wyrażenie_warunkowe; wyrażenie_modyfikujące) {
// instrukcje do wykonania
}


Pętla for wykonuje określoną (przynajmniej taka jest dobra praktyka) ilośc razy instrukcje wewnątrz jej bloku. Wyrażenie początkowe, warunkowe i modyfikujące mogą znajdować się poza nawiasem, lecz należy wtedy bardzo uważać, by nie spowodować, że pętla będzie się wykonywać w nieskończoność (co jest częstym błędem początkujących programistów w każdym języku programowania, tak więc nie ma co się przejmowac, a jedynie starać się uczyć na błędach :)).

5) Pętle while i do...while:

while (wyrażenie_warunkowe) {
// instrukcje
}


do {
// instrukcje
} while (wyrażenie_warunkowe);

W przypadku obu tych pętli zazwyczaj ilość iteracji nie jest z góry znana, więc pętla, jak sama nazwa wskazuje, będzie wykonywać się do momentu spełnienia warunku. Pętla do...while będzie wykonana zawsze conajmniej raz, ponieważ sprawdzenie warunku wyjścia z pętli jest sprawdzane dopiero po wykonaniu bloku instrukcji.

6) Pętla foreach:

for (typ val : tablica) {
// instrukcje
}


Pętla ta jest nowością w Javie od wersji 1.5. Jest ogromną zaletą i przeznaczeniem jest przejrzenie wszystkich elementów tablicy i wykonywanie instrukcji na nich. Dzięki temu nie musimy znać rozmiaru tablicy, by przejrzeć wszystkie jej elementy! Typ val musi być zgodny z typem tablicy.

7) Instrukcje break i continue:
  • break - służy do natychmiastowego przerwania wykonywania pętli
  • continue - powoduje przerwanie bieżącej iteracji pętli i rozpoczęcie kolejnej

Postarałem się w dosyć krótki i spójny sposób zebrać najważniejsze informacje z tego rozdziału. Mam nadzieję, że następnym razem wyjdzie trochę mniej książkowo i będę operował na większej ilości kodu w samej treści postu. Bardzo gorąco zachęcam do zapoznania się z kodami źródłowymi zadań rozdziału 2, gdyż to one pokazują prawdziwe działanie i istotę rzeczy omawianych w tym cyklu postów. Znaleźć je można pod adresem: http://github.com/Smoczysko/Java.Cwiczenia-praktyczne/ -> Rozdział 2.

Pozdrawiam i do następnego razu!

Brak komentarzy:

Publikowanie komentarza