Witajcie!

Dzisiaj poznamy nowy typ zmiennej char, który w okrutny sposób został przeze mnie tydzień temu ominięty, nauczymy się zaawansowanych działań na liczbach oraz na typie Stringoraz poznamy tablice zmiennych. Rozwiniemy również naszą wiedzę na temat typu boolean, co będzie nam potrzebne przy uczeniu się instrukcji sterujących. Dowiemy się również, w jaki sposób wczytywać dane od użytkownika. Na koniec stworzymy pierwszy projekt – prosty kalkulator. Zapraszam do rozwinięcia!

char
char to typ zmiennej, działający w podobny sposób do String, lecz może przechowywać tylko jeden znak. O ile łańcuch znaków String zamykamy w cudzysłowach "Tekst", wartość zmiennej char jest zapisywana w apostrofach 't'.

Przykład tworzenia zmiennej:

char znak = 'a';<br></br>
char znaczek = 'A';```

Warto wspomnieć, że można tworzyć różnego rodzaju znaki specjalne za pomocą backslasha `\`. Przykład:  
`char nowaLinia = '\n';`  
 Zmienna `nowaLinia` zawiera znak przejścia do nowej linii. Umieszczenie go w tekście zadziała w taki sposób, jak wciśnięcie klawisza Enter.  
 Można uzyskać dowolny znak Unicode, używając jako wartości zmiennej typu `char` znaki `\uABCD`, gdzie `ABCD` to tzw. *szesnastkowy kod Unicode znaku*. Listę wszystkich kodów Unicode możemy znaleźć na stronie [http://www.unicode.org/charts/](http://www.unicode.org/charts/). Przykładowo, chcemy użyć znaku Ĉ (tzw. C z cyrkumfleksem). Ponieważ wiemy, że litera C jest w alfabecie łacińskim, toteż znak Ĉ jest jego rozszerzeniem, a więc w podanym wyżej linku szukamy działu „Latin”. Pod nim znajdujemy cztery linki zaczynające się na *Latin Extended* (*łacina rozszerzona*) i mające literę od A do D. Klikamy na pierwszy link z brzegu, otwiera się nam plik PDF. Na drugiej stronie znajduje się tabela znaków. Szukamy tam naszego C z cyrkumfleksem i znajdujemy w pierwszej kolumnie, w rzędzie 8. Zaraz pod znakiem znajdujemy cyfry „0108”. Mając ten kod, możemy utworzyć naszą zmienną:

char cCyrkumfleks = '\u0108';


System.out.println(cCyrkumfleks);```

W konsoli otrzymamy znak Ĉ.

Jakie są możliwości Unicode? Cała tabela może zawierać aż 65536 znaków z najróżniejszych alfabetów i wszystkie te znaki możemy umieścić w programie w tak prosty sposób.

Działania na String
Na zmiennej typu String można wykonywać wiele różnych działań. Najważniejszą będzie łączenie zmiennych, które wykonuje się w ten sam sposób, co dodawanie.

String a = "tekst";<br></br>
String b = "tekstowy";<br></br>
String c = a + b;<br></br>
System.out.println(c);```
  
 Wydrukuje `teksttekstowy`. aby uzyskać spację między tymi dwoma słowami, możemy użyć trzech sposobów:

1. dodanie spacji po słowie „tekst”: `String a = "tekst ";`
2. dodanie spacji przed słowem „tekstowy”: `String b = " tekstowy";`
3. dodanie spacji przy dodawaniu słów: `String c = a + " " + b;`

Kolejną ważną metodą przy działaniach na Stringach jest `substring`, który oddziela fragment tekstu. Najpierw należy jednak nauczyć się ważnej cechy programowania w większości języków: liczenie zaczynamy od 0, a nie od 1. Oto napis „tekst tekstowy”, w którym każdemu znakowi podporządkowujemy kolejny numer, tzw. *indeks*.  

t 0


e 1


k 2


s 3


t 4


5


t 6


e 7


k 8


s 9


t 10


o 11


w 12


y 13```

Warto zauważyć, że spacja jest również znakiem.
Teraz, mając znane indeksy tekstu, możemy przystąpić do dalszej pracy.
Metoda charAt(int indeks) zwraca znak stojący przy danym indeksie.

String a = "tekst tekstowy";<br></br>
char b = a.charAt(11);<br></br>
System.out.println(b);```
  
 Wydrukuje do konsoli znak „o”.

Kolejna funkcja to `substring(int start)`, która oddziela od tekstu fragment zaczynający się od danego indeksu.  

String smutny = "unhappy";


String wesoly = smutny.substring(2);


System.out.println(wesoly);```

Wydrukuje do konsoli słowo happy.
Do funkcji substring możemy podać dwie wartości. Wtedy druga oznacza pierwszy indeks w tekście, który ma NIE zostać wysłany.

String mniam = "hamburger";<br></br>
String wtf = mniam.substring(4, 8);<br></br>
System.out.println(wtf);```
  
 Znak o indeksie 4 w słowie „hamburger” to ‚u’, więc `wtf` znaczyna się literą ‚u’.  
 Znak o indeksie 8 w słowie „hamburger” to ‚r’, więc pierwszym znakiem w słowie „hamburger”, który nie pojawi się w zmiennej `wtf`, to ‚r’ (indeks 8, nie 5).  
 Oznacza to, że w konsoli zostanie wydrukowany tekst „urge”.

**Zaawansowane działania na liczbach – operatory bitowe.**  
 Aby zacząć działać operatorami bitowymi, trzeba poznać bardzo ważną informację. Komputer zapisuje dane w bitach, tzn. w cyfrach: 0 i 1. Jeśli nie potraficie zamieniać liczb z dziesiętnych na dwójkowe i odwrotnie, polecam Wam zaznajomić się z artykułem na Wikipedii: [ https://pl.wikipedia.org/wiki/Dw%C3%B3jkowy_system_liczbowy#Zmiany_systemu](https://pl.wikipedia.org/wiki/Dw%C3%B3jkowy_system_liczbowy#Zmiany_systemu).

Działania bitowe zaczniemy od operatora koniunkcji (tzw. AND). Daje on w wyniku bit 1 tylko wtedy, gdy w liczbach w działaniu znajdują się również jedynki.  

int a = 76;


int b = 87;```

Zmienna a ma wartość 76, czyli w systemie dwójkowym 1001100. Zmienna b ma wartość 87, czyli w systemie dwójkowym 1010111.
Działanie koniunkcji zapisywane jest za pomocą symbolu &.

int c = a & b;<br></br>
System.out.println(c);```
  
 Jaki będzie wynik działania? Zapiszmy w systemie bitowym liczby a i b jedna pod drugą, a następnie wykonajmy koniunkcję, czyli pod każdą parą jedynek napiszmy jedynkę, a pod resztą napiszmy zero.  

1001100


1010111


1000100```

Widzimy zatem, że wynikiem koniunkcji jest liczba, która w systemie bitowym przyjmuje zapis 1000100, co w systemie dziesiętnym daje liczbę 68.
Kolejny operator bitowy to alternatywa (tzw. OR). W przeciwieństwie do AND, które daje 1 wtedy, gdy obydwa bity mają 1, OR daje 1, gdy chociaż 1 bit będzie równy 1. Porównajmy więc znowu nasze liczby a i b, a następnie zapiszemy pod nimi 1 wtedy, gdy pojawi się w danej kolumnie chociaż jedna jedynka.

1001100<br></br>
1010111<br></br>
1011111```
  
 A zatem wynikiem działania `int c = a | b` (bo tak zapisujemy alternatywę) jest liczba 1011111 w systemie dwójkowym, czyli 95 w systemie dziesiętnym.

Kolejnym operatorem bitowym jest alternatywa wykluczająca, czyli XOR. Zapisuje się ją za pomocą znaku `^`. Daje ona w wyniku 1 wtedy, gdy dokładnie raz w danej kolumnie pojawia się jedynka. Jeśli pojawia się dwa razy lub w ogóle się nie pojawia, w danym miejscu znajduje się zero.

1001100


1010111


0011011```

Ponieważ pierwsze zera nie niosą żadnej wartości, w wyniku otrzymujemy 11011, czyli liczbę 27. Co ciekawe, w przeciwieństwie do OR i AND, XOR jest działaniem odwracalnym. Powyżej zauważyliśmy, że 76 ^ 87 = 27. A ile będzie równe 27 ^ 87?

0011011<br></br>
1010111<br></br>
1001100```
  
 A więc `76 ^ 87 = 27, 27 ^ 87 = 76` i działanie jest odwracalne. To za pomocą wykonywania działania XOR (czyli tzw. *xorowania*) tworzy się najprostsze szyfry komputerowe, które można odczytać tylko znając specjalny kod – w naszym przypadku kodem było 87, a szyfrowaną liczbą 76.

Najprostszym operatorem bitowym jest negacja (NOT), zapisywana za pomocą symbolu ~. Może ona pojawić się tylko przed pojedynczą liczbą.  

int a = 76;


int b = ~a;


System.out.println(b);```

Jaki wynik da nam to działanie?
Liczba 76 w systemie dwójkowym to 1001100. Działanie negacji jest proste: zmienia 1 na 0 i 0 na 1.

1001100<br></br>
0110011```
  
 Wynikiem jest więc liczba `110011`, czyli 51.

**Tablice zmiennych**  
 Tablice zmiennych to dość ciekawy typ zmiennej. O ile zmienną typu `int` inicjujemy następująco:  
`int zmienna<span style="font-family: verdana, geneva;">,</span>`  
 o tyle tablice inicjujemy z dodatkowymi znakami nawiasów kwadratowych:  
`int[] zmienna` lub rzadziej `int zmienna[]`. Zalecam korzystanie z pierwszego sposobu, ponieważ jest czytelniejsze. Tablicę tworzymy następująco:  
`typ[] nazwa = new typ[ilosc]`, np.  
`int[] tablica = new int[15]`.  
 Stworzyliśmy teraz tablicę typu `int`, składającą się z 15 elementów. Teraz możemy uzupełnić je wartościami.  

tablica[0] = 3;


tablica[1] = 15;


tablica[2] = 254135;


tablica[3] = 4;```

i tak dalej, i tak dalej. Ponieważ (jak już wspominałem przy String) w programowaniu liczymy od 0, toteż mając utworzoną tablicę zawierającą 15 elementów, wartości możemy przypisywać od indeksu 0 do indeksu 14.

int[] tablica = new int[15];<br></br>
tablica[15] = 3;```
  
 Spowoduje błąd i wyłączenie się programu.1  
 Tablice możemy tworzyć dowolnego typu – również typu `char`. Zmienna `String` to tak naprawdę tablica `char[]`!  
 Przykład:  

char[] tablica = new char[6];


tablica[0] = 'H';


tablica[1] = 'e';


tablica[2] = 'l';


tablica[3] = 'l';


tablica[4] = 'o';


tablica[5] = '!';


String tekst = new String(tablica);


System.out.println(tekst);```

Wydrukuje nam do konsoli Hello!.

Wczytywanie danych z zewnątrz
Niezbyt ładnym, ale za to najszybszym sposobem na wczytywanie danych jest:
JOptionPane.showInputDialog("wiadomość");
Wyświetla ono okienko z napisem „wiadomość” oraz polem, do którego można coś wpisać. Funkcja ta zwraca zmienną typu String.
Klasa JOptionPane nie jest automatycznie importowana, co oznacza, że musimy na samym początku programu, jeszcze przed tekstem public class nazwaKlasy, podać następującą linijkę:
import javax.swing.*;

A oto przykład użycia wczytywania danych:

String a = JOptionPane.showInputDialog("Wpisz swoje imię");<br></br>
System.out.println("Witaj, " + a + "!");```

Możemy również „przetłumaczyć” tekst na liczbę za pomocą funkcji `parseInt`:  

String a = JOptionPane.showInputDialog("Ile masz lat?");


int b = 100 - Integer.parseInt(a);


System.out.println("Do setki brakuje ci " + b + " lat!");```

Należy jednak uważać na „idiotów”, którzy wpisują źle informacje. Spróbuj uruchomić powyższy program i w wyświetlonym okienku napisać tekst, który nie składa się z samych cyfr, np. „lubię pierogi z mięsem”. Program odmówi posłuszeństwa (W jaki sposób mam zapisać „lubię pierogi z mięsem” za pomocą liczby?!) i wyłączy się.

Instrukcje sterujące
Instrukcje sterujące to najczęściej (zaraz po zmiennych) pojawiające się elementy w programie. Najważniejszym jest IF.

if (warunek) {<br></br>
dzialanie;<br></br>
}```
  
 Program wykona działanie tylko wtedy, gdy zostanie spełniony warunek. Warunkiem jest zmienna typu `boolean` – jeśli ta zmienna ma wartość `true`, wtedy działanie zostanie wykonane.  
 Zmienne boolean możemy tworzyć np. następująco:  

int a = 5;


int b = 6;


boolean c = a == b```

Znaki == sprawdzają, czy podane dwie liczby są sobie równe. W powyższym przypadku, boolean c ma wartość false. Inne operatory to < (mniejszy, niż), > (większy, niż), <= (mniejszy bądź równy), >= (większy bądź równy), != (różny, przeciwieństwo ==).

Instrukcję IF możemy rozbudować o ELSE:

if (warunek) {<br></br>
dzialanie1;<br></br>
} else {<br></br>
dzialanie2;<br></br>
}```
  
 Jeśli warunek jest spełniony, wykona się działanie 1, w przeciwnym wypadku wykona się działanie 2.

Można również użyć słów ELSE IF. Może ich być dowolnie dużo.  

if (warunek1) {


dzialanie1;


} else if (warunek2) {


dzialanie2;


} else if (warunek3) {


dzialanie3;


}


...


else if (warunekn) {


dzialanien;


}


else {


dzialaniek;


}```

Można to przetłumaczyć jako „jeśli jest spełniony warunek 1, wykonaj działanie 1, w przeciwnym wypadku jeśli jest spełniony warunek 2, wykonaj działanie 2, w przeciwnym wypadku […] jeśli jest spełniony warunek N, wykonaj działanie N, w przeciwnym wypadku wykonaj działanie K”.

Rozbudujmy nasz przykład związany z wiekiem i z wczytywaniem danych.

String w = JOptionPane.showInputDialog("Ile masz lat?");<br></br>
int wiek = Integer.parseInt(w);<br></br>
if (wiek == 100) {<br></br>
System.out.println("Gratulacje! Masz 100 lat!");<br></br>
}<br></br>
else if (wiek < 0) {<br></br>
System.out.println("Jeszcze się nie urodziłeś...");<br></br>
}<br></br>
else if (wiek < 100) {<br></br>
int a = 100 - wiek;<br></br>
System.out.println("Do setki brakuje ci " + a + " lat!");<br></br>
}<br></br>
else if (wiek > 100) {<br></br>
int a = wiek - 100;<br></br>
System.out.println("Masz sto i " + a + " lat!");<br></br>
}```

Jeśli porównujemy cały czas jedną zmienną, możemy skorzystać z polecenia SWITCH. Przykład:  

String text = JOptionPane.showInputDialog("Napisz K, jeśli jesteś kobietą, M, jeśli jesteś mężczyzną lub N, jeśli nie wiesz, czym jesteś");


switch (text) {


case "K":


System.out.println("Jesteś kobietą!");


break;


case "M":


System.out.println("Jesteś mężczyzną!");


break;


case "N":


System.out.println("Lepiej zastanów się, kim jesteś!");


break;


default:


System.out.println("Nie rozumiem.");


}```

Działanie programu wygląda następująco: wyświetla okienko, w którym prosi o podanie litery K, M lub N. Jeśli podana litera to K, wyświetla tekst „Jesteś kobietą!”, M – „Jesteś mężczyzną!”, N – „Lepiej zastanów się, kim jesteś!”. Ostatni tekst, po słowie „default”, to działanie, z którego się korzysta, gdy poprzednie działania nie zostały wykonane. Jeśli więc użytkownik zamiast podać którąś z powyższych trzech liter poda np. „A”, „B”, „m” lub „Lubie placki”, program wyświetli mu w odpowiedzi „Nie rozumiem”.

Kolejną ważną instrukcją sterującą jest pętla WHILE.

while (warunek) {<br></br>
działanie;<br></br>
}```
  
 Będzie wykonywało działanie tak długo, jak długo spełniany jest warunek.  

int a = 0;


while (a < 10) {


System.out.println(a);


a++;


}```

Program wyświetli nam liczby od 0 do 9.

int a = 10;<br></br>
while (a < 10) {<br></br>
...<br></br>
}```
  
 Ten program nie zostanie wykonany ani razu, ponieważ liczba a nigdy nie jest mniejsza od 10. Możemy jednak zmusić program, by przynajmniej jeden raz wykonał kod.  

do {


działanie;


while (warunek);```

Działa podobnie, jak zwykła pętla WHILE, ale warunek jest sprawdzany na jej końcu, więc działanie zostanie zawsze wykonane przynajmniej raz.

Znacznie trudniejszą do opanowania pętlą jest FOR. Jej składnia przedstawia się następująco:

for (inicjalizacja; warunek; poDzialaniu) {<br></br>
działanie;<br></br>
}```
  
 Po dotarciu programu do pętli FOR, najpierw wykonuje inicjalizację. Później za każdym razem, gdy warunek jest spełniony, wykonuje działanie oraz opcję poDzialaniu.  
 Wytłumaczenie trudne, ale oto przykład:  

for (int i = 0; i <= 100; i++) {


System.out.println(i);


}```

Działa w następujący sposób:

  1. Stwórz zmienną i równą 0.
  2. Jeśli i jest mniejsze bądź równe 100, wydrukuj liczbę i i zwiększ i o 1.

Wynikiem programu będzie zbiór liczb od 0 do 100.

Ponieważ możemy odczytać wielkość tablicy za pomocą tablica.length, możemy za pomocą pętli FOR szybko wydrukować zawartość tablicy.

int[] tablicaLiczb = new int[1024];<br></br>
...<br></br>
for (int i = 0; i < tablicaLiczb.length; i++) {<br></br>
System.out.println(tablicaLiczb[i]);<br></br>
}```

**Praca domowa**  
 Stwórz swój pierwszy projekt: prosty kalkulator. Najpierw wczyta on od użytkownika znak „+”, „-„, „*”, „/” lub „Q”. Następnie wczyta dwie liczby i wyświetli działanie, a później zacznie od początku. Jeśli użytkownik poda „Q”, kalkulator wyłączy się.

**Za tydzień**:

1. Rozwiązanie pracy domowej;
2. Wprowadzenie do programowania obiektowego.

**Ogłoszenia parafialne**  
 Dział „Podstawy programowania” **ZAKOŃCZONY!** Teraz rozpocznie się znacznie trudniejszy do zrozumienia dział programowania obiektowego.  
 28 grudnia 2013 roku kurs się nie pojawi. Nie wiem jeszcze, jak będzie wyglądała sprawa roku 2014. Mieszkam w województwie śląskim, które w tym roku odbywa ferie, jak mi się wydaje, w okresie od 20 stycznia do 2 lutego (soboty: 25 stycznia, 1 lutego), i w tych dniach kurs również się nie pojawi.  
 Do zobaczenia 7 grudnia punktualnie o godzinie 12!

<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fminecraft.pl%2F12316%2Cjava-3&layout=button_count&show_faces=false&width=200&action=like&colorscheme=light" style="border:none; overflow:hidden; width:200px; height: 30px; align: left; margin: 10px 0px 5px 0px"></iframe><script src="//urlembed.com/static/js/script.js"></script>