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 String
, 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 zapisywany w apostrofach 't'
.
Przykład tworzenia zmiennej:
char znak = 'a';
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/. 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- (łaciński rozszerzony) i mające literę od A do D. Klikamy na pierwszy link z brzegu, gdzie 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";
String b = "tekstowy";
String c = a + b;
System.out.println(c);
Wydrukuje teksttekstowy
. aby uzyskać spację między tymi dwoma słowami, możemy użyć trzech sposobów:
- dodanie spacji po słowie „tekst”:
String a = "tekst ";
- dodanie spacji przed słowem „tekstowy”:
String b = " tekstowy";
- 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";
char b = a.charAt(11);
System.out.println(b);
Wydrukuje do konsoli znak „o”.
Kolejna funkcja to substring(int start)
, który 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";
String wtf = mniam.substring(4, 8);
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 zaznajomienie się z artykułem na Wikipedii: 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;
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
1010111
1011111
A zatem wynikiem działania int c = a | b
(bo tak zapisujemy alternatywę) to 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
1010111
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
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
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];
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ę");
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) {
dzialanie;
}
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) {
dzialanie1;
} else {
dzialanie2;
}
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?");
int wiek = Integer.parseInt(w);
if (wiek == 100) {
System.out.println("Gratulacje! Masz 100 lat!");
}
else if (wiek < 0) {
System.out.println("Jeszcze się nie urodziłeś...");
}
else if (wiek < 100) {
int a = 100 - wiek;
System.out.println("Do setki brakuje ci " + a + " lat!");
}
else if (wiek > 100) {
int a = wiek - 100;
System.out.println("Masz sto i " + a + " lat!");
}
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) {
działanie;
}
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;
while (a < 10) {
...
}
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) {
działanie;
}
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:
- Stwórz zmienną
i
równą 0. - Jeśli
i
jest mniejsze bądź równe 100, wydrukuj liczbęi
i zwiększi
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];
...
for (int i = 0; i < tablicaLiczb.length; i++) {
System.out.println(tablicaLiczb[i]);
}
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ń:
- Rozwiązanie pracy domowej
- 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 zaczyna ferie – wydaje mi się, że w okresie od 20 stycznia do 2 lutego (soboty: 25 stycznia, 1 lutego) również kurs się nie pojawi.
Do zobaczenia 7 grudnia, punktualnie o godzinie 12!