plik


ÿþIDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ Java. Æwiczenia SPIS TRERCI SPIS TRERCI praktyczne. Wydanie II KATALOG KSI¥¯EK KATALOG KSI¥¯EK Autor: Marcin Lis ISBN: 83-246-0327-1 KATALOG ONLINE KATALOG ONLINE Format: B5, stron: 192 ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG Rozpocznij przygodê z programowaniem w Javie TWÓJ KOSZYK TWÓJ KOSZYK " Poznaj podstawowe elementy jêzyka Java DODAJ DO KOSZYKA DODAJ DO KOSZYKA " Opanuj zasady programowania obiektowego " Napisz w³asne aplety i aplikacje " Wykorzystaj komponenty do tworzenia interfejsów u¿ytkownika CENNIK I INFORMACJE CENNIK I INFORMACJE Java w ci¹gu kilku ostatnich lat przeby³a drogê od niemal nieznanej technologii do jednego z najpopularniejszych jêzyków programowania na Swiecie. DziS jej ZAMÓW INFORMACJE ZAMÓW INFORMACJE g³ównym atutem nie s¹ aplety, które w za³o¿eniu twórców mia³y umilaæ czas O NOWORCIACH O NOWORCIACH osobom odwiedzaj¹cym witryny WWW, lecz rozbudowane aplikacje przetwarzaj¹ce setki danych. Java to uznana platforma programistyczna stosowana zarówno przez ZAMÓW CENNIK ZAMÓW CENNIK najwiêksze firmy z bran¿y informatycznej, jak i przez programistów amatorów do realizacji przeró¿nych zadañ z wykorzystaniem technik obiektowych.  Java. Æwiczenia praktyczne. Wydanie II to zbiór krótkich æwiczeñ, dziêki którym CZYTELNIA CZYTELNIA poznasz podstawy programowania w tym jêzyku. Przeczytasz o g³ównych elementach Javy i technikach obiektowych. Dowiesz siê, jak definiowaæ zmienne, przetwarzaæ dane FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE tekstowe, tworzyæ proste aplety i bardziej z³o¿one aplikacje. Nauczysz siê korzystaæ z komponentów, buduj¹c interfejsy u¿ytkownika swoich aplikacji i zaimplementujesz operacje wejScia i wyjScia na plikach. Zdobêdziesz solidne podstawy do dalszej nauki Javy. " Instalacja Java Development Kit w Windows i Linuksie " Deklarowanie zmiennych " Operatory i ich priorytety " Instrukcje warunkowe i pêtle " Obiekty i klasy " Wyj¹tki i obs³uga b³êdów " Tworzenie apletów Wydawnictwo Helion " Grafika i dxwiêk w Javie ul. Chopina 6 " Tworzenie interfejsów u¿ytkownika za pomoc¹ komponentów 44-100 Gliwice " Operacje na plikach tel. (32)230-98-63 e-mail: helion@helion.pl Programowanie w Javie 5 RozdziaB 1. Krótkie wprowadzenie 9 Instalacja JDK 9 Pierwszy program 12 B-kod, kompilacja i maszyna wirtualna 13 Java a C++ 14 Obiektowy jzyk programowania 15 Struktura programu 16 RozdziaB 2. Zmienne, operatory i instrukcje 17 Zmienne 17 Operatory 26 Instrukcje 37 RozdziaB 3. Obiekty i klasy 51 Metody 53 Konstruktory 59 Specyfikatory dostpu 62 Dziedziczenie 66 RozdziaB 4. Wyjtki 71 BBdy w programach 71 Instrukcja try...catch 75 ZgBaszanie wyjtków 77 Hierarchia wyjtków 79 4 Java " wiczenia praktyczne RozdziaB 5. Rysowanie 81 Aplikacja a aplet 81 Pierwszy aplet 82 Jak to dziaBa? 84 Cykl |ycia apletu 86 Czcionki 86 Rysowanie grafiki 89 Kolory 95 Wy[wietlanie obrazów 98 RozdziaB 6. Dzwiki 103 RozdziaB 7. Animacje 107 PBywajcy napis 107 PBywajcy napis z buforowaniem 112 Zegar cyfrowy 114 Animacja poklatkowa 116 Zegar analogowy 118 RozdziaB 8. Interakcja z u|ytkownikiem 123 ObsBuga myszy 123 Rysowanie figur (I) 126 Rysowanie figur (II) 130 Rysowanie figur (III) 131 RozdziaB 9. Okna i menu 137 Tworzenie okna aplikacji 137 Budowanie menu 139 Wielopoziomowe menu 146 RozdziaB 10. Grafika i komponenty 151 Rysowanie elementów graficznych 151 ObsBuga komponentów 152 RozdziaB 11. Operacje wej[cia-wyj[cia 169 Wczytywanie danych z klawiatury 169 Operacje na plikach 176 Zmienna jest to miejsce, w którym mo|emy przechowywa jakie[ dane, np. liczby czy cigi znaków. Ka|da zmienna musi mie swoj nazw, która j jednoznacznie identyfikuje, a tak- |e typ, który informuje o tym, jakiego rodzaju dane mo|na w niej przechowywa. Np. zmienna typu int przechowuje liczby caBkowite, a zmienna typu float liczby zmiennoprzecinkowe. Typy w Javie dziel si na dwa rodzaje: typy podstawowe (ang. primitive types) oraz typy odno[nikowe (ang. reference types). Typy podstawowe Typy podstawowe dziel si na: typy caBkowitoliczbowe (z ang. integral types), typy zmiennopozycyjne (rzeczywiste, z ang. floating-point types), typ boolean, typ char. 18 Java " wiczenia praktyczne Typy caBkowitoliczbowe Rodzina typów caBkowitoliczbowych skBada si z czterech typów: byte, short, int, long. W przeciwieDstwie do C++ dokBadnie okre[lono sposób reprezentacji tych danych. Niezale|nie wic od tego, na jakim systemie pracujemy (16-, 32- czy 64-bitowym), dokBadnie wiadomo, na ilu bitach zapisa- na jest zmienna danego typu. Wiadomo te| dokBadnie, z jakiego za- kresu warto[ci mo|e ona przyjmowa, nie ma wic dowolno[ci, która w przypadku jzyka C mogBa prowadzi do sporych trudno[ci przy przenoszeniu programów pomidzy ró|nymi platformami. W tabeli 2.1 zaprezentowano zakresy poszczególnych typów danych oraz liczb bitów niezbdn do zapisania zmiennych danego typu. Tabela 2.1. Zakresy typów arytmetycznych w Javie Typ Liczba bitów Liczba bajtów Zakres byte 8 1 od  128 do 127 short 16 2 od  32 768 do 32 767 int 32 4 od  2 147 483 648 do 2 147 483 647 long 64 8 od  9 223 372 036 854 775 808 do 9 223 372 036 854 775 807 Typy zmiennoprzecinkowe Typy zmiennoprzecinkowe wystpuj tylko w dwóch odmianach: float (pojedynczej precyzji), double (podwójnej precyzji). Zakres oraz liczb bitów i bajtów potrzebnych do zapisu tych zmien- nych prezentuje tabela 2.2. RozdziaB 2. " Zmienne, operatory i instrukcje 19 Tabela 2.2. Zakresy dla typów zmiennoprzecinkowych w Javie Typ Liczba bitów Liczba bajtów Zakres float 32 4 od  3,4e38 do 3,4e38 double 64 8 od  1,8e308 do 1,8e308 Format danych float i double jest zgodny ze specyfikacj standardu ANSI/IEEE 754. Zapis 3,4e48 oznacza 3,4 * 1038. Typ boolean Jest to typ logiczny. Mo|e on reprezentowa jedynie dwie warto[ci: true (prawda) i false (faBsz). Mo|e by wykorzystywany przy spraw- dzaniu ró|nych warunków w instrukcjach if, a tak|e w ptlach i in- nych konstrukcjach programistycznych, które zostan przedstawione w dalszej cz[ci rozdziaBu. Typ char Typ char sBu|y do reprezentacji znaków (liter, znaków przestankowych, ogólnie wszelkich znaków alfanumerycznych), przy czym w Javie jest on 16-bitowy i zawiera znaki Unicode. Poniewa| znaki reprezen- towane s tak naprawd jako 16-bitowe kody liczbowe, typ ten zali- cza si czasem do typów arytmetycznych. Deklarowanie zmiennych typów podstawowych Aby móc u|y jakiej[ zmiennej w programie, najpierw trzeba j za- deklarowa, tzn. poda jej typ oraz nazw. Ogólna deklaracja wygl- da nastpujco: typ_zmiennej nazwa_zmiennej; Po takiej deklaracji zmienna jest ju| gotowa do u|ycia, tzn. mo|emy jej przypisywa ró|ne warto[ci bdz te| wykonywa na niej ró|ne operacje, np. dodawanie. Przypisanie warto[ci zmiennej odbywa si przy u|yciu znaku (operatora) =. 20 Java " wiczenia praktyczne  W I C Z E N I E 2.1. Deklarowanie zmiennych Zadeklaruj dwie zmienne caBkowite i przypisz im dowolne warto[ci. Wyniki wy[wietl na ekranie (rysunek 2.1). Rysunek 2.1. Wynik dziaBania programu z wiczenia 2.1 public class Main { public static void main (String args[]) { int pierwszaLiczba; int drugaLiczba; pierwszaLiczba = 10; drugaLiczba = 20; System.out.println ("pierwsza liczba: " + pierwszaLiczba); System.out.println ("druga liczba: " + drugaLiczba); } } Instrukcja System.out.println pozwala wyprowadzi cig znaków na ekran. Warto[ zmiennej mo|na równie| przypisa ju| w trakcie deklaracji, piszc: typ_zmiennej nazwa_zmiennej = warto[; Mo|na równie| zadeklarowa wiele zmiennych danego typu, oddzie- lajc ich nazwy przecinkami. Cz[ z nich mo|e by te| od razu za- inicjowana: typ_zmiennej nazwa1, nazwa2, nazwa3; typ_zmiennej nazwa1 = warto[1, nazwa2, nazwa3 = warto[2; Zmienne w Javie, podobnie jak w C czy C++, ale inaczej ni| w Pas- calu, mo|na deklarowa wedle potrzeb wewntrz funkcji czy metody. RozdziaB 2. " Zmienne, operatory i instrukcje 21  W I C Z E N I E 2.2. Jednoczesna deklaracja i inicjacja zmiennych Zadeklaruj i jednocze[nie zainicjalizuj dwie zmienne typu caBkowi- tego. Wynik wy[wietl na ekranie. public class Main { public static void main (String args[]) { int pierwszaLiczba = 10; int drugaLiczba = 20; System.out.println ("pierwsza liczba: " + pierwszaLiczba); System.out.println ("druga liczba: " + drugaLiczba); } }  W I C Z E N I E 2.3. Deklarowanie zmiennych w jednym wierszu Zadeklaruj kilka zmiennych typu caBkowitego w jednym wierszu. Kilka z nich zainicjuj. public class Main { public static void main (String args[]) { int pierwszaLiczba = 10, drugaLiczba = 20, i, j, k; System.out.println ("pierwsza liczba: " + pierwszaLiczba); System.out.println ("druga liczba: " + drugaLiczba); } } Przy nazywaniu zmiennych obowizuj pewne zasady. Otó| nazwa mo|e si skBada z wielkich i maBych liter oraz cyfr, ale nie mo|e si zaczyna od cyfry. Cho nie jest to zabronione, raczej unika si sto- sowania polskich znaków diakrytycznych. Nazwa zmiennej powinna tak|e odzwierciedla funkcj peBnion w programie. Je|eli na przy- kBad okre[la ona liczb punktów w jakim[ zbiorze, to najlepiej na- zwa j liczbaPunktow lub nawet liczbaPunktowWZbiorze. Mimo |e tak dBuga nazwa mo|e wydawa si dziwna, jednak bardzo poprawia czytelno[ programu oraz uBatwia jego analiz. Naprawd warto ten sposób stosowa. Przyjmuje si te|, co równie| jest bardzo wygodne, |e nazw zmiennej rozpoczynamy maB liter, a poszczególne czBony 22 Java " wiczenia praktyczne tej nazwy (wyrazy, które si na ni skBadaj) rozpoczynamy wielk liter  dokBadnie tak jak w powy|szych przykBadach. Typy odno[nikowe Typy odno[nikowe (ang. reference types) mo|emy podzieli na dwa umowne rodzaje: typy klasowe (ang. class types)1, typy tablicowe (ang. array types). Zacznijmy od typów tablicowych. Tablice s to wektory elementów danego typu i sBu| do uporzdkowanego przechowywania warto[ci tego typu. Mog by jedno- bdz wielowymiarowe. Dostp do danego elementu tablicy jest realizowany poprzez podanie jego indeksu, czyli miejsca w tablicy, w którym si on znajduje. Dla tablicy jedno- wymiarowej bdzie to po prostu kolejny numer elementu, dla tablicy dwuwymiarowej trzeba ju| poda numer wiersza i kolumny itd. Je[li chcemy zatem przechowa w programie 10 liczb caBkowitych, naj- wygodniej bdzie u|y w tym celu 10-elementowej tablicy typu int. Typy klasowe pozwalaj na tworzenie klas i deklarowanie zmiennych obiektowych. Zajmiemy si nimi w rozdziale 3. Deklarowanie zmiennych typów odno[nikowych Zmienne typów odno[nikowych deklarujemy podobnie jak w przy- padku zmiennych typów podstawowych, tzn. piszc: typ_zmiennej nazwa_zmiennej; lub: typ_zmiennej nazwa_zmiennej_1, nazwa_zmiennej_2, nazwa_zmiennej_3; Stosujc taki zapis, inaczej ni| w przypadku typów prostych, zadekla- rowali[my jednak jedynie tzw. odniesienie (ang. reference) do obiek- tu, a nie sam byt, jakim jest obiekt! Takiemu odniesieniu domy[lnie 1 Typy klasowe mogliby[my podzieli z kolei na obiektowe i interfejsowe; s to jednak rozwa|ania, którymi nie bdziemy si w niniejszej publikacji zajmowa. RozdziaB 2. " Zmienne, operatory i instrukcje 23 przypisana jest warto[ pusta (null), czyli praktycznie nie mo|emy wykonywa na nim |adnej operacji. Dopiero po utworzeniu odpo- wiedniego obiektu w pamici mo|emy powiza go z tak zadeklaro- wan zmienn. Je[li zatem napiszemy np.: int a; bdziemy mieli gotow do u|ycia zmienn typu caBkowitego. Mo|e- my jej przypisa np. warto[ 10. {eby jednak móc skorzysta z tabli- cy, musimy zadeklarowa zmienn odno[nikow typu tablicowego, utworzy obiekt tablicy i powiza go ze zmienn. Dopiero wtedy bdziemy mogli swobodnie odwoBywa si do kolejnych elementów. Piszc zatem: int tablica[]; zadeklarujemy odniesienie do tablicy, która bdzie mogBa zawiera elementy typu int, czyli 32-bitowe liczby caBkowite. Samej tablicy jednak jeszcze wcale nie ma. Przekonamy si o tym, wykonujc ko- lejne wiczenia.  W I C Z E N I E 2.4. Deklarowanie tablicy Zadeklaruj tablic elementów typu caBkowitego. Przypisz zerowemu elementowi tablicy dowoln warto[. Spróbuj skompilowa i uru- chomi program. public class Main { public static void main (String args[]) { int tablica[]; tablica[0] = 11; System.out.println ("Zerowy element tablicy to: " + tablica[0]); } } Ju| przy próbie kompilacji kompilator wypisze na ekranie tekst: Va- riable tablica might not have been initialized, informujcy nas, |e chcemy odwoBa si do zmiennej, która prawdopodobnie nie zo- staBa zainicjalizowana (rysunek 2.2). Widzimy te| wyraznie, |e w ra- zie wystpienia bBdu na etapie kompilacji otrzymujemy kilka wa|- nych i pomocnych informacji. Przede wszystkim jest to nazwa pliku, w którym wystpiB bBd (jest to wa|ne, gdy| program mo|e skBada si z bardzo wielu klas, a ka|da z nich jest zazwyczaj definiowana w oddzielnym pliku), numer wiersza w tym pliku oraz konkretne 24 Java " wiczenia praktyczne miejsce wystpienia bBdu. Na samym koDcu kompilator podaje te| caBkowit liczb bBdów. Rysunek 2.2. BBd kompilacji. Nie zainicjowali[my zmiennej tablica Skoro jednak wystpiB bBd, nale|y go natychmiast naprawi.  W I C Z E N I E 2.5. Deklaracja i utworzenie tablicy Zadeklaruj i utwórz tablic elementów typu caBkowitego. Przypisz zerowemu elementowi tablicy dowoln warto[. Spróbuj wy[wietli zawarto[ tego elementu na ekranie. public class Main { public static void main (String args[]) { int tablica[] = new int[10]; tablica[0] = 11; System.out.println ("Zerowy element tablicy to: " + tablica[0]); } } Wyra|enie new tablica[10] oznacza utworzenie nowej, jednowy- miarowej tablicy liczb typu int o rozmiarze 10 elementów. Ta nowa tablica zostaBa przypisana zmiennej odno[nikowej o nazwie tablica. Po takim przypisaniu mo|emy odwoBywa si do kolejnych elementów tej tablicy, piszc: tablica[index] Warto przy tym zauwa|y, |e elementy tablicy numerowane s od zera, a nie od 1. Oznacza to, |e pierwszy element tablicy 10-elementowej ma indeks 0, a ostatni 9 (a nie 10!). Co si jednak stanie, je[li  nieprzyzwyczajeni do takiego sposobu indeksowania  odwoBamy si do indeksu o numerze 10? RozdziaB 2. " Zmienne, operatory i instrukcje 25  W I C Z E N I E 2.6. OdwoBanie do nieistniejcego indeksu Zadeklaruj i zainicjalizuj tablic dziesicioelementow. Spróbuj przy- pisa elementowi o indeksie 10 dowoln liczb caBkowit. public class Main { public static void main (String args[]) { int tablica[] = new int[10]; tablica[10] = 11; System.out.println ("Dziesity element tablicy to: " + tablica[10]); } } Efekt dziaBania kodu jest widoczny na rysunku 2.3. Wbrew pozorom nie staBo si jednak nic strasznego. WystpiB bBd, zostaB on jednak obsBu|ony przez maszyn wirtualn Javy. Konkretnie zostaB wygene- rowany tzw. wyjtek i program standardowo zakoDczyB dziaBanie. Taki wyjtek mo|emy jednak przechwyci i tym samym zapobiec niekontrolowanemu zakoDczeniu aplikacji. Jest to jednak odrbny, aczkolwiek bardzo wa|ny temat; zajmiemy si nim wic nieco póz- niej. Godne uwagi jest to, |e próba odwoBania si do nieistniejcego elementu zostaBa wykryta i to odwoBanie tak naprawd nie wystpiBo! Program nie naruszyB wic niezarezerwowanego dla niego obszaru pamici. Rysunek 2.3. Próba odwoBania si do nieistniejcego elementu tablicy 26 Java " wiczenia praktyczne Poznali[my ju| zmienne, musimy jednak wiedzie, jakie operacje mo- |emy na nich wykonywa. Operacje wykonujemy za pomoc ró|nych operatorów, np. odejmowania, dodawania, przypisania itd. Operatory te mo|emy podzieli na nastpujce grupy2: arytmetyczne, bitowe, logiczne, przypisania, porównania. Operatory arytmetyczne W[ród tych operatorów znajdziemy standardowo dziaBajce: +  dodawanie,   odejmowanie, *  mno|enie, /  dzielenie.  W I C Z E N I E 2.7. Operacje arytmetyczne na zmiennych Zadeklaruj dwie zmienne typu caBkowitego. Wykonaj na nich kilka operacji arytmetycznych. Wyniki wy[wietl na ekranie. public class Main { public static void main(String args[]) { int a, b, c; a = 10; b = 25; c = b - a; System.out.println("a = " + a); 2 Mo|na wydzieli równie| inne grupy, co wykracza jednak poza ramy tematyczne niniejszej publikacji. RozdziaB 2. " Zmienne, operatory i instrukcje 27 System.out.println("b = " + b); System.out.println("b - a = " + c); c = a * b; System.out.println("a * b = " + c); } } Do operatorów arytmetycznych nale|y równie| znak %, przy czym nie oznacza on obliczania procentów, ale dzielenie modulo (reszt z dzielenia). Np. wynik dziaBania 12 % 5 wynosi 2, pitka mie[ci si bowiem w dwunastu 2 razy, pozostawiajc reszt 2 (5 2 = 10, 10 + 2 = 12).  W I C Z E N I E 2.8. Dzielenie modulo Zadeklaruj kilka zmiennych. Wykonaj na nich operacje dzielenia modulo. Wyniki wy[wietl na ekranie. public class Main { public static void main(String args[]) { int a, b, c; a = 10; b = 25; c = b % a; System.out.println("b % a = " + c); System.out.println("a % 3 = " + a % 3); c = a * b; System.out.println("(a * b) % 120 = " + c % 120); } } Kolejne operatory typu arytmetycznego to operator inkrementacji i dekrementacji. Operator inkrementacji (czyli zwikszenia), którego symbolem jest ++, powoduje przyrost warto[ci zmiennej o jeden. Mo|e wystpowa w formie przyrostkowej bdz przedrostkowej. Oznacza to, |e je[li mamy zmienn, która nazywa si np. x, forma przedrostkowa bdzie wyglda: ++x, natomiast przyrostkowa: x++. Oba te wyra|enia zwiksz warto[ zmiennej x o jeden, jednak nie s one równowa|ne. Otó| operacja x++ zwiksza warto[ zmiennej po jej wykorzystaniu, natomiast ++x przed jej wykorzystaniem. Czasem takie rozró|nienie jest bardzo pomocne przy pisaniu programu. 28 Java " wiczenia praktyczne  W I C Z E N I E 2.9. Operator inkrementacji Przeanalizuj poni|szy kod. Nie uruchamiaj programu, ale zastanów si, jaki bdzie wy[wietlony cig liczb. Nastpnie, po uruchomieniu kodu, sprawdz swoje przypuszczenia. public class Main { public static void main (String args[]) { /*1*/ int x = 1, y; /*2*/ System.out.println (++x); /*3*/ System.out.println (x++); /*4*/ System.out.println (x); /*5*/ y = x++; /*6*/ System.out.println (y); /*7*/ y = ++x; /*8*/ System.out.println (++y); } } Dla uBatwienia poszczególne wiersze w programie zostaBy oznaczone kolejnymi liczbami. Wynikiem dziaBania tego programu bdzie cig liczb: 2, 2, 3, 3, 6. Dlaczego? Na pocztku zmienna x przyjmuje war- to[ 1. W 2. wierszu wystpuje operator ++x, zatem najpierw jest ona zwikszana o jeden (x = 2), a dopiero potem wy[wietlana na ekranie. W wierszu o numerze 3 jest odwrotnie. Najpierw warto[ zmiennej x jest wy[wietlana (x = 2), a dopiero potem zwikszana o 1 (x = 3). W wierszu 4. po prostu wy[wietlamy warto[ x (x = 3). W wierszu 5. najpierw zmiennej y jest przypisywana dotychczasowa warto[ x (x = 3, y = 3), a nastpnie warto[ x jest zwikszana o jeden (x = 4). W wier- szu 6. wy[wietlamy warto[ y (y = 3). W wierszu 7. najpierw zwik- szamy warto[ x o jeden (x = 5), a nastpnie przypisujemy t war- to[ zmiennej y. W wierszu ostatnim, ósmym, zwikszamy y o jeden (y = 6) i wy[wietlamy na ekranie. Operator dekrementacji (--) dziaBa analogicznie, z tym |e zamiast zwik- sza warto[ci zmiennych  zmniejsza je, oczywi[cie zawsze o jeden.  W I C Z E N I E 2.10. Operator dekrementacji ZmieD kod z wiczenia 2.9 tak, aby operator ++ zostaB zastpiony operatorem --. Nastpnie przeanalizuj jego dziaBanie i sprawdz, czy RozdziaB 2. " Zmienne, operatory i instrukcje 29 otrzymany wynik jest taki sam, jak otrzymany na ekranie po urucho- mieniu kodu. public class Main { public static void main (String args[]) { /*1*/ int x = 1, y; /*2*/ System.out.println (--x); /*3*/ System.out.println (x--); /*4*/ System.out.println (x); /*5*/ y = x--; /*6*/ System.out.println (y); /*7*/ y = --x; /*8*/ System.out.println (--y); } } DziaBania operatorów arytmetycznych na liczbach caBkowitych nie trzeba chyba wyja[nia, z dwoma mo|e wyjtkami. Otó| co si sta- nie, je|eli wynik dzielenia dwóch liczb caBkowitych nie bdzie liczb caBkowit? Odpowiedz na szcz[cie jest prosta, wynik zostanie za- okrglony w dóB. Zatem wynikiem dziaBania 7/2 w arytmetyce liczb caBkowitych bdzie 3 ( prawdziwym wynikiem jest oczywi[cie 3,5, która to warto[ zostaje zaokrglona w dóB do najbli|szej liczby caB- kowitej, czyli trzech).  W I C Z E N I E 2.11. Dzielenie liczb caBkowitych Wykonaj dzielenie zmiennych typu caBkowitego. Sprawdz rezultaty w sytuacji, gdy rzeczywisty wynik jest uBamkiem. public class Main { public static void main(String args[]) { int a, b, c; a = 8; b = 3; c = 2; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("a / b = " + a / b); System.out.println("a / c = " + a / c); System.out.println("b / c = " + b / c); } } 30 Java " wiczenia praktyczne Drugim problemem jest to, co si stanie, je|eli przekroczymy zakres jakiej[ zmiennej. Pamitamy np., |e zmienna typu byte jest zapisy- wana na 8 bitach i mo|e przyjmowa warto[ci od  128 do 127 (patrz tabela 2.1). Spróbujmy zatem przypisa zmiennej tego typu warto[ 128. Szybko przekonamy si, |e kompilator do tego nie dopu[ci (ry- sunek 2.4). Rysunek 2.4. Próba przekroczenia dopuszczalnej warto[ci zmiennej  W I C Z E N I E 2.12. Przekroczenie zakresu w trakcie kompilacji Zadeklaruj zmienn typu byte. Przypisz jej warto[ 128. Spróbuj do- kona kompilacji otrzymanego kodu. public class Main { public static void main (String args[]) { byte zmienna; zmienna = 128; System.out.println(zmienna); } } Niestety, kompilator nie zawsze bdzie w stanie wykry tego typu bBd. Mo|e si bowiem zdarzy, |e zakres przekroczymy w trakcie wykonywania programu. Co wtedy?  W I C Z E N I E 2.13. Przekroczenie zakresu w trakcie dziaBania kodu Zadeklaruj zmienne typu long. Wykonaj operacje arytmetyczne prze- kraczajce dopuszczaln warto[ takiej zmiennej. Wynik wy[wietl na ekranie. RozdziaB 2. " Zmienne, operatory i instrukcje 31 public class Main { public static void main (String args[]) { long a, b = (long) Math.pow(2, 63) + 1; a = b + b; System.out.println ("a = " + a); } } Operacja (long) Math.pow(2, 63) oznacza podniesienie liczby 2 do potgi 63., a nastpnie skonwertowanie wyniku (który jest liczb ty- pu double) do typu long. Zmiennej a jest przypisywany wynik dzia- Bania b + b i okazuje si, |e jest to 0. Dlaczego? Otó| je|eli jaka[ war- to[ przekracza dopuszczalny zakres swojego typu, jest  zawijana do pocztku tego zakresu. Obrazowo ilustruje to rysunek 2.5. Rysunek 2.5. Przekroczenie dopuszczalnego zakresu dla typu int Operatory bitowe Operacje te, jak sama nazwa wskazuje, dokonywane s na bitach. Przypomnijmy zatem podstawowe wiadomo[ci o systemach liczbo- wych. W systemie dziesitnym, z którego korzystamy na co dzieD, wykorzystywanych jest dziesi cyfr  od 0 do 9. W systemie dwój- kowym bd zatem wykorzystywane jedynie dwie cyfry  0 i 1. Kolejne liczby budowane s z tych dwóch cyfr, dokBadnie tak samo jak w systemie dziesitnym; przedstawia to tabela 2.3. Wida wyraz- nie, |e np. 4 dziesitnie to 100 dwójkowo, a 10 dziesitnie to 1010 dwójkowo. 32 Java " wiczenia praktyczne Tabela 2.3. Reprezentacja liczb w systemie dwójkowym i dziesitnym System dwójkowy System dziesitny 00 11 10 2 11 3 100 4 101 5 110 6 111 7 1000 8 1001 9 1010 10 1011 11 1100 12 1101 13 1110 14 1111 15 Na tak zdefiniowanych liczbach mo|emy dokonywa znanych ze szkoBy operacji bitowych AND (iloczyn bitowy), OR (suma bitowa) oraz XOR (bitowa alternatywa wykluczajca). Symbolem operatora AND jest znak & (ampersand), operatora OR znak | (pionowa kreska), natomiast operatora XOR znak ^ (strzaBka w gór). Oprócz tego mo|na równie| wykonywa operacje przesuni bitów. Zestawienie wystpujcych w Javie operatorów bitowych zostaBo przedstawione w tabeli 2.4. Operatory logiczne Argumentami operacji takiego typu musz by wyra|enia posiadajce warto[ logiczn, czyli true lub false (prawda i faBsz). PrzykBadowo, wyra|enie 10 < 20 jest niewtpliwie prawdziwe (10 jest mniejsze od 20), RozdziaB 2. " Zmienne, operatory i instrukcje 33 Tabela 2.4. Operatory bitowe w Javie Operator Symbol & AND | OR ~ NOT ^ XOR >> Przesunicie bitowe w prawo << Przesunicie bitowe w lewo >>> Przesunicie bitowe w prawo z wypeBnieniem zerami zatem jego warto[ logiczna jest równa true. W grupie tej wyró|nia- my trzy operatory: logiczne AND (&&), logiczne OR (||), logiczna negacja (!). Warto zauwa|y, |e w cz[ci przypadków stosowania operacji logicz- nych, aby otrzyma wynik, wystarczy obliczy tylko pierwszy argu- ment. Wynika to, oczywi[cie, z wBa[ciwo[ci operatorów. Je[li bowiem wynikiem obliczenia pierwszego argumentu jest warto[ true, a wy- konujemy operacj OR, to niezale|nie od stanu drugiego argumentu warto[ci caBego wyra|enia bdzie true. Podobnie przy stosowaniu operatora AND  je|eli warto[ci pierwszego argumentu bdzie false, to i warto[ci caBego wyra|enia bdzie false. Operatory przypisania Operacje przypisania s dwuargumentowe i powoduj przypisanie warto[ci argumentu znajdujcego si z prawej strony do argumentu znajdujcego si z lewej strony. Najprostszym operatorem tego typu jest oczywi[cie klasyczny znak równo[ci. Zapis liczba = 5 oznacza, |e zmiennej liczba chcemy przypisa warto[ 5. Oprócz tego mamy jeszcze do dyspozycji operatory Bczce klasyczne przypisanie z in- nym operatorem arytmetycznym bdz bitowym. ZostaBy one zebrane w tabeli 2.5. 34 Java " wiczenia praktyczne Tabela 2.5. Operatory przypisania i ich znaczenie w Javie Argument 1 Operator Argument 2 Znaczenie x=yx = y x += y x = x + y x -= y x = x  y x *= y x = x * y x /= y x = x / y x %= y x = x % y x <<= y x = x << y x >>= y x = x >> y x >>>= y x = x >>> y x &= y x = x & y x |= y x = x | y x ^= y x = x ^ y Operatory porównania (relacyjne) Operatory porównania, czyli relacyjne, sBu| oczywi[cie do porów- nywania argumentów. Wynikiem takiego porównania jest warto[ logiczna true (je[li jest ono prawdziwe) lub false (je[li jest faBszy- we). Zatem wynikiem operacji argument1 == argument2 bdzie true, je|eli argumenty s sobie równe, lub false, je|eli argumenty s ró|ne. Czyli 4 == 5 ma warto[ false, a 2 == 2 ma warto[ true. Do dyspo- zycji mamy operatory porównania zawarte w tabeli 2.6. Operator warunkowy Operator warunkowy ma nastpujc skBadni: warunek ? warto[1 : warto[2; Wyra|enie takie przybiera warto[1, je|eli warunek jest prawdziwy, lub warto[2 w przeciwnym przypadku. RozdziaB 2. " Zmienne, operatory i instrukcje 35 Tabela 2.6. Operatory porównania w Javie Operator Opis == je[li argumenty s sobie równe, wynikiem jest true != je[li argumenty s ró|ne, wynikiem jest true > je[li argument prawostronny jest mniejszy od lewostronnego, wynikiem jest true < je[li argument prawostronny jest wikszy od lewostronnego, wynikiem jest true >= je[li argument prawostronny jest mniejszy lub równy lewostronnemu, wynikiem jest true <= je[li argument prawostronny jest wikszy lub równy lewostronnemu, wynikiem jest true  W I C Z E N I E 2.14. Wykorzystanie operatora warunkowego Wykorzystaj operator warunkowy do zmodyfikowania warto[ci do- wolnej zmiennej typu caBkowitego (int). public class Main { public static void main (String args[]) { int x = 1, y; y = (x == 1 ? 10 : 20); System.out.println ("y = " + y); } } W powy|szym wiczeniu najwa|niejszy jest oczywi[cie wiersz: y = (x == 1? 10 : 20); który oznacza: je|eli x jest równe 1, przypisz zmiennej y warto[ 10, w przeciwnym przypadku przypisz zmiennej y warto[ 20. Poniewa| zmienn x zainicjalizowali[my warto[ci 1, na ekranie zostanie wy- [wietlony cig znaków y = 10. 36 Java " wiczenia praktyczne Priorytety operatorów Sama znajomo[ operatorów to jednak nie wszystko. Niezbdna jest jeszcze wiedza na temat tego, jaki maj one priorytet, czyli jaka jest kolejno[ ich wykonywania. Wiadomo na przykBad, |e mno|enie jest  silniejsze od dodawania, zatem najpierw mno|ymy, potem doda- jemy. W Javie jest podobnie, siBa ka|dego operatora jest [ci[le okre- [lona. Przedstawia to tabela 2.73. Im wy|sza pozycja w tabeli, tym wy|szy priorytet operatora. Operatory znajdujce si na jednym po- ziomie (w jednym wierszu) maj ten sam priorytet. Tabela 2.7. Priorytety operatorów w Javie Grupa operatorów Symbole inkrementacja przyrostkowa ++, -- inkrementacja przedrostkowa, negacje ++, --, ~, ! mno|enie, dzielenie *, /, % przesunicia bitowe <<, >>, >>> porównania <, >, <=, >= porównania ==, != & bitowe AND ^ bitowe XOR | bitowe OR && logiczne AND || logiczne OR ? warunkowe przypisania =, +=, -=, *=, /=, %=, >>=, <<=, >>>=, &=, ^=, |= 3 Tabela nie przedstawia wszystkich operatorów wystpujcych w Javie, a jedynie omawiane w ksi|ce. RozdziaB 2. " Zmienne, operatory i instrukcje 37 Instrukcja warunkowa if...else Bardzo czsto w programie zachodzi potrzeba sprawdzenia jakiego[ warunku i w zale|no[ci od tego, czy jest on prawdziwy, czy faBszywy, wykonanie ró|nych instrukcji. Do takiego sprawdzania sBu|y wBa[nie instrukcja warunkowa if...else. Ma ona ogóln posta: if (wyra|enie warunkowe){ //instrukcje do wykonania, je|eli warunek jest prawdziwy } else{ //instrukcje do wykonania, je|eli warunek jest faBszywy } wyra|enie warunkowe, inaczej ni| w C i C++, musi da w wyniku warto[ typu boolean, tzn. true lub false.  W I C Z E N I E 2.15. U|ycie instrukcji warunkowej if...else Wykorzystaj instrukcj warunkow if...else do stwierdzenia, czy warto[ zmiennej typu caBkowitego jest mniejsza od zera. public class Main { public static void main (String args[]) { int a = -10; if (a > 0){ System.out.println ("Zmienna a jest wiksza od zera"); } else{ System.out.println ("Zmienna a nie jest wiksza od zera"); } } } Spróbujmy teraz czego[ nieco bardziej skomplikowanego. Zajmijmy si klasycznym przykBadem liczenia pierwiastków równania kwadra- towego. Przypomnijmy, |e je[li mamy równanie o postaci A * x2 + B * x + C = 0, to  aby obliczy jego rozwizanie  liczymy tzw. delt ("), która jest równa B2  4 * A * C. Je|eli delta jest wiksza od zera, mamy dwa pierwiastki: x1 = ( B + " ) / (2 * A) i x2 = ( B  " ) / (2 * A). 38 Java " wiczenia praktyczne Je|eli delta jest równa zero, istnieje tylko jedno rozwizanie  mia- nowicie x =  B / (2 * A). W przypadku trzecim, je|eli delta jest mniejsza od zera, równanie takie nie ma rozwizaD w zbiorze liczb rzeczywistych. Skoro jest tutaj tyle warunków do sprawdzenia, to jest to doskonaBy przykBad do potrenowania zastosowania instrukcji if...else. Aby nie komplikowa zagadnienia, nie bdziemy si w tej chwili zajmo- wa wczytywaniem parametrów równania z klawiatury, ale podamy je bezpo[rednio w kodzie.  W I C Z E N I E 2.16. Pierwiastki równania kwadratowego Wykorzystaj operacje arytmetyczne oraz instrukcj if...else do ob- liczenia pierwiastków równania kwadratowego o parametrach poda- nych bezpo[rednio w kodzie programu. public class Main { public static void main (String args[]) { int parametrA = 1, parametrB = -1, parametrC = -6; System.out.println ("Parametry równania:\n"); System.out.println ("A: " + parametrA + " B: " + parametrB + " C: " + parametrC + "\n"); if (parametrA == 0){ System.out.println ("To nie jest równanie kwadratowe: A = 0!"); } else{ double delta = parametrB * parametrB - 4 * parametrA * parametrC; if (delta < 0){ System.out.println ("Delta < 0."); System.out.println ("To równanie nie ma rozwizania w zbiorze liczb rzeczywistych"); } else{ double wynik; if (delta == 0){ wynik = - parametrB / 2 * parametrA; System.out.println ("Rozwizanie: x = " + wynik); } else{ wynik = (- parametrB + Math.sqrt(delta)) / 2 * parametrA; System.out.print ("Rozwizanie: x1 = " + wynik); wynik = (- parametrB - Math.sqrt(delta)) / 2 * parametrA; System.out.println (", x2 = " + wynik); } RozdziaB 2. " Zmienne, operatory i instrukcje 39 } } } } Jak Batwo zauwa|y, instrukcj warunkow mo|na zagnie|d|a, tzn. po jednym if mo|e wystpowa kolejne, po nim nastpne itd. Jed- nak je|eli zapiszemy to w sposób podany w poprzednim wiczeniu, przy wielu zagnie|d|eniach otrzymamy bardzo nieczytelny kod. Mo|emy wic posBu|y si konstrukcj if...else if. Zamiast two- rzy mniej wygodn konstrukcj, tak jak przedstawiona poni|ej: if (warunek1){ //instrukcje 1 } else{ if (warunek2){ //instrukcje 2 } else{ if (warunek3){ //instrukcje 3 } else{ //instrukcje 4 } } } caBo[ mo|emy zapisa du|o pro[ciej i czytelniej w postaci: if (warunek1){ //instrukcje 1 } else if (warunek2){ //instrukcje 2 } else if (warunek3){ //instrukcje 3 } else{ //instrukcje 4 }  W I C Z E N I E 2.17. Zastosowanie instrukcji if...else if Napisz kod obliczajcy pierwiastki równania kwadratowego o para- metrach zadanych w programie. Wykorzystaj instrukcj if...else if. public class Main { public static void main (String args[]) 40 Java " wiczenia praktyczne { int parametrA = 1, parametrB = -1, parametrC = -6; System.out.println ("Parametry równania:\n"); System.out.println ("A: " + parametrA + " B: " + parametrB + " C: " + parametrC + "\n"); if (parametrA == 0){ System.out.println ("To nie jest równanie kwadratowe: A = 0!"); } else{ double delta = parametrB * parametrB - 4 * parametrA * parametrC; double wynik; if (delta < 0){ System.out.println ("Delta < 0."); System.out.println ("To równanie nie ma rozwizania w zbiorze liczb rzeczywistych"); } else if (delta == 0){ wynik = - parametrB / 2 * parametrA; System.out.println ("Rozwizanie: x = " + wynik); } else{ wynik = (- parametrB + Math.sqrt(delta)) / 2 * parametrA; System.out.print ("Rozwizanie: x1 = " + wynik); wynik = (- parametrB - Math.sqrt(delta)) / 2 * parametrA; System.out.println (" x2 = " + wynik); } } } } Instrukcja wyboru switch Instrukcja switch pozwala w wygodny i przejrzysty sposób spraw- dza cig warunków i wykonywa ró|ny kod w zale|no[ci od tego, czy s one prawdziwe, czy faBszywe. Mo|na ni zastpi cig in- strukcji if...else if. Je|eli mamy w kodzie przykBadow konstruk- cj w postaci: if (a == 1){ instrukcje1; } else if (a == 50){ instrukcje2; } else if (a == 23){ instrukcje3; } else{ instrukcje4; } RozdziaB 2. " Zmienne, operatory i instrukcje 41 to mo|emy zastpi j nastpujco: switch (a){ case 1: instrukcje1; break; case 50: instrukcje2; break; case 23: instrukcje3; break; default: instrukcje4; } Po kolei jest tu sprawdzane, czy a jest równe 1, potem 50 i w koDcu 23. Je|eli równo[ zostanie w jednym z przypadków stwierdzona, wyko- nywane s instrukcje po odpowiedniej klauzuli case. Je|eli a nie jest równe |adnej z wymienionych liczb, wykonywane s instrukcje po sBowie default. Instrukcja break powoduje wyj[cie z bloku switch.  W I C Z E N I E 2.18. U|ycie instrukcji wyboru switch U|ywajc instrukcji switch, napisz program sprawdzajcy, czy war- to[ zadeklarowanej zmiennej jest równa 1, czy 10. Wy[wietl na ekra- nie stosowny komunikat. public class Main { public static void main (String args[]) { int a = 10; switch (a){ case 1 : System.out.println("a = 1"); break; case 10: System.out.println("a = 10"); break; default: System.out.println("a nie jest równe ani 1, ani 10."); } } } Uwaga! Je|eli zapomnimy o sBowie break, wykonywanie instrukcji switch bdzie kontynuowane, co mo|e prowadzi do otrzymania niespodziewanych efektów. W szczególno[ci zostanie wtedy wykonany 42 Java " wiczenia praktyczne blok instrukcji wystpujcy po default. Mo|e to by, oczywi[cie, efektem zamierzonym, mo|e te| jednak powodowa trudne do wy- krycia bBdy.  W I C Z E N I E 2.19. Efekt pominicia instrukcji break Zmodyfikuj kod z wiczenia 2.18, usuwajc instrukcj break. Zaob- serwuj, jak zmieniBo si dziaBanie programu. public class Main { public static void main (String args[]) { int a = 10; switch (a){ case 1: System.out.println("a = 1"); case 10: System.out.println("a = 10"); default: System.out.println("a nie jest równe ani 1, ani 10"); } } } Wida wyraznie (rysunek 2.5), |e teraz wedBug naszego programu zmienna a jest jednocze[nie równa 10, jak i ró|na od dziesiciu. Rysunek 2.5. Ilustracja bBdu z wiczenia 2.19 Ptla for Ptle w jzykach programowania pozwalaj na wykonywanie powta- rzajcych si czynno[ci. Nie inaczej jest w Javie. Je[li chcemy np. wypisa na ekranie 10 razy napis Java, to mo|emy zrobi to, piszc RozdziaB 2. " Zmienne, operatory i instrukcje 43 10 razy System.out.println("Java");. Je|eli jednak chcieliby[my mie ju| 150 takich napisów, to, pomijajc oczywi[cie sensowno[ tej czynno[ci, byBby to ju| problem. Na szcz[cie z pomoc przycho- dz nam wBa[nie ptle. Ptla typu for ma nastpujc skBadni: for (wyra|enie pocztkowe; wyra|enie warunkowe; wyra|enie modyfikujce){ //instrukcje do wykonania } wyra|enie pocztkowe jest stosowane do zainicjalizowania zmiennej u|ywanej jako licznik liczby wykonaD ptli. wyra|enie warunkowe okre[la warunek, jaki musi by speBniony, aby dokona kolejnego przej[cia w ptli, wyra|enie modyfikujce jest zwykle u|ywane do modyfikacji zmiennej bdcej licznikiem.  W I C Z E N I E 2.20. Budowa ptli for Wykorzystujc ptl typu for, napisz program wy[wietlajcy na ekra- nie 10 razy napis Java. public class Main { public static void main (String args[]) { for (int i = 1; i <= 10; i++){ System.out.println ("Java"); } } } Zmienna i to tzw. zmienna iteracyjna, której na pocztku przypisu- jemy warto[ 1 (int i = 1). Nastpnie w ka|dym przebiegu ptli jest ona zwikszana o jeden (i++) oraz wykonywana jest instrukcja Sys- tem.out.println ("Java");. Wszystko trwa tak dBugo, a| i osignie warto[ 10 (i <= 10). Wyra|enie modyfikujce jest zwykle u|ywane do modyfikacji zmien- nej iteracyjnej. Takiej modyfikacji mo|emy jednak dokona równie| wewntrz ptli. Struktura tego typu wyglda nastpujco: for (wyra|enie pocztkowe; wyra|enie warunkowe;){ instrukcje do wykonania wyra|enie modyfikujce } 44 Java " wiczenia praktyczne  W I C Z E N I E 2.21. Wyra|enie modyfikujce w bloku instrukcji Zmodyfikuj ptl typu for z wiczenia 2.20 tak, aby wyra|enie mo- dyfikujce znalazBo si w bloku instrukcji. public class Main { public static void main (String args[]) { for (int i = 1; i <= 10;){ System.out.println ("Java"); i++; } } } Zwrómy uwag, |e mimo i| wyra|enie modyfikujce jest teraz we- wntrz ptli, [rednik znajdujcy si po i <= 10 jest niezbdny! Je[li o nim zapomnimy, kompilator zgBosi bBd. Kolejn ciekaw mo|liwo[ci jest poBczenie wyra|enia warunkowego i modyfikujcego.  W I C Z E N I E 2.22. Aczenie wyra|enia warunkowego i modyfikujcego Napisz tak ptl typu for, aby wyra|enie warunkowe byBo jedno- cze[nie wyra|eniem modyfikujcym. public class Main { public static void main (String args[]) { for (int i = 1; i++ <= 10;){ System.out.println ("Java"); } } } W podobny sposób jak w poprzednich przykBadach mo|emy si po- zby wyra|enia pocztkowego, które przeniesiemy przed ptl. Sche- mat wyglda nastpujco: wyra|enie pocztkowe; for (; wyra|enie warunkowe;){ instrukcje do wykonania wyra|enie modyfikujce } RozdziaB 2. " Zmienne, operatory i instrukcje 45  W I C Z E N I E 2.23. Wyra|enie pocztkowe przed ptl Zmodyfikuj ptl typu for w taki sposób, aby wyra|enie pocztkowe znalazBo si przed ptl, a wyra|enie modyfikujce wewntrz niej. public class Main { public static void main (String args[]) { int i = 1; for (; i <= 10;){ System.out.println ("Java"); i++; } } } Skoro zaszli[my ju| tak daleko w pozbywaniu si wyra|eD steruj- cych, usuDmy równie| wyra|enie warunkowe. Jest to jak najbardziej mo|liwe!  W I C Z E N I E 2.24. Ptla bez wyra|eD Zmodyfikuj ptl typu for w taki sposób, aby wyra|enie pocztkowe znalazBo si przed ptl, natomiast wyra|enie modyfikujce i warun- kowe wewntrz ptli. public class Main { public static void main (String args[]) { int i = 1; for ( ; ; ){ System.out.println ("Java"); if (i++ >= 10) break; } } } Przy stosowaniu tego typu konstrukcji pamitajmy, |e oba [redniki w nawiasach okrgBych wystpujcych po for s niezbdne do pra- widBowego funkcjonowania kodu. Warto te| zwróci uwag na zmian kierunku nierówno[ci. We wcze[niejszych przykBadach sprawdzali[my bowiem, czy i jest mniejsze bdz równe 10, a teraz, czy jest wik- sze bdz równe. Dzieje si tak, dlatego |e poprzednio sprawdzali[my, 46 Java " wiczenia praktyczne czy ptla ma by dalej wykonywana, natomiast obecnie, czy ma zosta zakoDczona. Przy okazji wykorzystali[my te| kolejn instrukcj, mianowicie break. SBu|y ona do natychmiastowego przerwania wy- konywania ptli. Kolejna przydatna instrukcja, continue, powoduje rozpoczcie ko- lejnej iteracji, tzn. w miejscu jej wystpienia wykonywanie bie|cej iteracji jest przerywane i rozpoczyna si kolejny przebieg.  W I C Z E N I E 2.25. Zastosowanie instrukcji continue Napisz program wy[wietlajcy na ekranie liczby od 1 do 20, które nie s podzielne przez 2. Skorzystaj z ptli for i instrukcji continue. public class Main { public static void main (String args[]) { for (int i = 1; i <= 20; i++){ if (i % 2 == 0) continue; System.out.println (i); } } } Przypomnijmy, |e % to operator dzielenia modulo, tzn. dostarcza on reszt z dzielenia. Nic jednak nie stoi na przeszkodzie, aby dziaBajc w taki sam sposób aplikacj napisa bez u|ycia instrukcji continue.  W I C Z E N I E 2.26. Liczby niepodzielne przez dwa Zmodyfikuj kod z wiczenia 2.25 tak, aby nie byBo konieczno[ci u|ycia instrukcji continue. public class Main { public static void main (String args[]) { for (int i = 1; i <= 20; i++){ if (i % 2 != 0) System.out.println (i); } } } RozdziaB 2. " Zmienne, operatory i instrukcje 47 Ptla while O ile ptla typu for sBu|y raczej do wykonywania znanej z góry licz- by operacji, to w przypadku ptli while liczba ta nie jest zwykle zna- na. Nie jest to, oczywi[cie, obligatoryjny podziaB. Tak naprawd obie mo|na napisa w taki sposób, aby byBy swoimi funkcjonalnymi od- powiednikami. Ogólna konstrukcja ptli typu while jest nastpujca: while (wyra|enie warunkowe){ instrukcje } Instrukcje s wykonywane tak dBugo, dopóki wyra|enie warunkowe jest prawdziwe. Oznacza to, |e gdzie[ w ptli musi wystpi modyfi- kacja warunku bdz te| instrukcja break. Inaczej bdzie si ona wy- konywaBa w nieskoDczono[!  W I C Z E N I E 2.27. Budowa ptli while U|ywajc ptli typu while, napisz program wy[wietlajcy na ekranie 10 razy napis Java. public class Main { public static void main (String args[]) { int i = 1; while (i <= 10){ System.out.println ("Java"); i++; } } }  W I C Z E N I E 2.28. PoBczone wyra|enia Zmodyfikuj kod z wiczenia 2.27 tak, aby wyra|enie warunkowe zmieniaBo jednocze[nie warto[ zmiennej i. public class Main { public static void main (String args[]) { int i = 1; 48 Java " wiczenia praktyczne while (i++ <= 10){ System.out.println ("Java"); } } }  W I C Z E N I E 2.29. Liczby nieparzyste i ptla while Korzystajc z ptli while, napisz program wy[wietlajcy na ekranie liczby od 1 do 20 niepodzielne przez 2. public class Main { public static void main (String args[]) { int i = 1; while (i <= 20){ if (i % 2 != 0) System.out.println (i); i++; } } } Ptla do...while Istnieje jeszcze jedna odmiana ptli. Jest to do...while. Jej konstruk- cja jest nastpujca: do{ instrukcje; } while (warunek);  W I C Z E N I E 2.30. Budowa ptli do...while Korzystajc z ptli do...while, napisz program wy[wietlajcy na ekranie 10 razy dowolny napis. public class Main { public static void main (String args[]) { RozdziaB 2. " Zmienne, operatory i instrukcje 49 int i = 1; do{ System.out.println ("Java"); } while (i++ <= 9); } } Wydawa by si mogBo, |e to przecie| to samo, co zwykBa ptla whi- le. Jest jednak pewna ró|nica. Otó| w przypadku ptli do...while instrukcje wykonane s co najmniej jeden raz, nawet je[li warunek jest na pewno faBszywy.  W I C Z E N I E 2.31. Ptla do...while z faBszywym warunkiem Zmodyfikuj kod z wiczenia 2.30 w taki sposób, aby wyra|enie wa- runkowe na pewno byBo faBszywe. Zaobserwuj wyniki dziaBania pro- gramu. public class Main { public static void main (String args[]) { int i = 10; do{ System.out.println ("Java"); } while (i++ <= 9); } } Ptla foreach Poczwszy od wersji 1.5 (5.0), Java udostpnia nowy rodzaj ptli. Jest ona nazywana ptl foreach lub rozszerzon ptl for (z ang. enhanced for) i pozwala na automatyczn iteracj po kolekcji obiek- tów lub te| po tablicy. Jej dziaBanie poka|emy wBa[nie w tym drugim przypadku. Je[li bowiem mamy tablic tab zawierajc warto[ci pewnego typu, to do przejrzenia wszystkich jej elementów mo|emy u|y konstrukcji w postaci: for(typ val: tablica){ //instrukcje } 50 Java " wiczenia praktyczne W takim przypadku w kolejnych przebiegach ptli for pod val bdzie podstawiana warto[ kolejnej komórki.  W I C Z E N I E 2.32. Wykorzystanie rozszerzonej ptli for Zadeklaruj tablic liczb typu int i wypeBnij j przykBadowymi da- nymi. Nastpnie u|yj rozszerzonej ptli for do wy[wietlenia zawar- to[ci tablicy na ekranie. public class Main { public static void main (String args[]) { int tab[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for(int val: tab){ System.out.println(val); } } }

Wyszukiwarka

Podobne podstrony:
GIMP cwiczenia praktyczne Wydanie II
C cwiczenia praktyczne Wydanie II
JavaScript cwiczenia praktyczne Wydanie II cwjas2
Java cwiczenia praktyczne Wydanie III cwjav3
Internet cwiczenia praktyczne Wydanie II cwint2
Access 03 PL cwiczenia praktyczne Wydanie II cwa232
MySQL?rmowa?za?nych cwiczenia praktyczne Wydanie II cwmsq2
Turbo Pascal cwiczenia praktyczne Wydanie II
Excel 03 PL cwiczenia praktyczne Wydanie II cwexc2
SQL cwiczenia praktyczne Wydanie II cwsqw2
Programowanie w jezyku C cwiczenia praktyczne Wydanie II cwprc2

więcej podobnych podstron