• Nie Znaleziono Wyników

Programowanie obiektowe

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie obiektowe"

Copied!
52
0
0

Pełen tekst

(1)

Programowanie obiektowe

Monika Wrzosek

Instytut Matematyki Uniwersytet Gdański

Modelowanie matematyczne i analiza danych

2019/20

(2)

Sprawy organizacyjne

Kontakt i strona

E-mail: mwrzosek@mat.ug.edu.pl Konsultacje: p.323

Materiały: www.mat.ug.edu.pl/~mwrzosek

Literatura

podstawowa: Marcin Lis: "Praktyczny kurs Java", Wydanie IV. Helion 2015.

uzupełniająca: Cay S. Horstmann, Gary Cornell: "Java. Podstawy ", Wydanie IX. Helion 2013.

Egzamin

Egzamin pisemny:

zadania (np. podaj wynik działania programu)

krótkie pytania teoretyczne.

(3)

Sprawy organizacyjne

Instalacja

1

Pobierz i zainstaluj Java Development Kit (JDK) ze strony www.oracle.com/technetwork/java/javase/downloads/

jdk8-downloads-2133151.html

2

Pobierz zintegrowane środowisko programistyczne Eclipse ze strony www.eclipse.org/downloads/packages/installer

Po uruchomieniu instalatora wybierz:

Eclipse IDE for Java Developers.

Dokumentacja

API (ang. Application Programming Interface) - interfejs programowania aplikacji.

docs.oracle.com/javase/8/docs/api/

(4)

Sprawy organizacyjne

Szkic wykładu

Podstawowe elementy języka

- typy danych, zmienne, wyprowadzanie danych na ekran, operatory, instrukcja warunkowa, pętle, tablice

Podstawy programowania obiektowego

- klasy i obiekty, pola i metody, przeciążanie metod, konstruktory Dziedziczenie

- klasy potomne, hierarchia, specyfikatory dostępu, pakiety, przesłanianie metod, składowe statyczne, klasy i składowe finalne

Polimorfizm Klasy abstrakcyjne Interfejsy

Wyjątki

Kolekcje

(5)

Praca w IDE

IDE (ang. integrated development environment) - zintegrowane środowisko programistyczne.

1.

Po uruchomieniu programu Eclipse wybieramy File -> New Project.

2.

W oknie kreatora wybieramy pozycję Java Project.

3.

W kolejnym oknie wpisujemy nazwę projektu (np. Hello) i klikamy Finish.

(6)

4.

Utworzony projekt powinniśmy widzieć po lewej stronie w oknie Package Explorer.

5.

Aby rozwinąć zawartość projektu, klikamy w symbol > stojący przy ikonie folderu z nazwą naszego projektu (Hello).

6.

Aby dodać plik/klasę do projektu, klikamy prawym przyciskiem myszy w folder src i

wybieramy New -> Class.

(7)

7.

Następnie wpisujemy nazwę klasy (np. Test) i zaznaczamy kwadrat przy opcji public static void main(String[] args)

Uwaga: w projekcie może być tylko jeden plik zawierający metodę main.

8.

W metodzie main napiszmy proste polecenie wyświetlające w konsoli napis Hello:

9.

Aby skompilować napisany kod, z górnego paska wybieramy

Run -> Run As -> Java Application.

Wynik działania programu zobaczymy na dole w oknie Console.

(8)

Wprowadzenie

Każdy program w Javie składa się z klas, które są z kolei opisami obiektów.

W życiu realnym mianem obiektu określimy stół, krzesło, komputer, dom, samochód, radio itd.

Każdy z obiektów ma pewne swoje cechy, właściwości, które go opisują: wielkość, kolor, powierzchnię, wysokość itd.

Każdy obiekt może składać się z innych obiektów. Np. mieszkanie składa się z poszczególnych pomieszczeń, z których każde może być obiektem; w każdym pomieszczeniu mamy z kolei inne obiekty: sprzęty domowe, meble itd.

Obiekty mogą również wykonywać różne funkcje, zadania. Każdy obiekt ma przypisany pewien zestaw poleceń, które potrafi wykonywać.

Np. samochód wypełnia polecenia "uruchom silnik", "zgaś silnik", "skręć w prawo",

"przyspiesz"itp.

Funkcje te składają się na interfejs udostępniany przez ten samochód. Dzięki interfejsowi można wpływać na zachowanie samochodu i wydawać mu polecenia.

W programowaniu jest podobnie. Za pomocą klas programista stara się opisać obiekty, ich właściwości, zbudować konstrukcje, interfejs, dzięki któremu będzie można wydawać polecenia realizowane potem przez obiekty.

Obiekt powstaje jednak dopiero w trakcie działania programu jako instancja (wystąpienie, egzemplarz) danej klasy.

Obiektów danej klasy może być bardzo dużo. Np. jeśli klasą jest Samochód, to

instancją tej klasy będzie konkretny egzemplarz o danym numerze seryjnym.

(9)

Elementy języka Java

(10)

Wbudowane typy danych

Java udostępnia pewną liczbę wbudowanych typów danych. Nazywa się je typami prostymi lub podstawowymi.

Typy arytmetyczne całkowitoliczbowe: byte, short, int, long.

Typy arytmetyczne zmiennopozycyjne: float, double.

Typ char służy do reprezentacji znaków, czyli liter, cyfr, znaków przestankowych itp.

Typ boolean to typ logiczny, może reprezentować jedynie dwie wartości: true (prawda) i false (fałsz).

Typ Liczba bitów Zakres

byte 8 −128 . . . 127

short 16 −32768 . . . 32767

int 32 −2

31

. . . 2

31

− 1

long 64 −2

63

. . . 2

63

− 1

float 32 −3, 4 · 10

38

. . . 3, 4 · 10

38

double 64 −1, 8 · 10

308

. . . 1, 8 · 10

308

(11)

Zmienne

Zmienne służą do przechowywania danych. Każda zmienna ma swoją nazwę i typ.

Nazwa to jednoznaczny identyfikator, dzięki któremu istnieje możliwość odwoływania się do zmiennej w kodzie programu.

Typ określa, jakiego rodzaju dane zmienna może przechowywać.

Deklaracja zmiennej

Każda zmienna, zanim zostanie wykorzystana w kodzie programu, musi zostać zadeklarowana. Deklaracja polega na podaniu typu oraz nazwy zmiennej, według schematu:

typ_zmiennej nazwa_zmiennej Przykład: int x;

Uwaga: Średnik informuje kompilator o zakończeniu instrukcji programu.

Instrukcja przypisania - nadanie wartości zmiennej Aby nadać wartość zmiennej, używamy znaku równości.

Przykład: x = 100;

Deklarację zmiennej i nadanie jej wartości można zrealizować w jednej instrukcji.

Przykład: int x = 100;

Deklaracja wielu zmiennych, np: int x, y, z;

(12)

Wyprowadzanie danych na ekran

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t x = 1 0 0 , y = 5 ; S y s t e m . o u t . p r i n t l n ( x ) ;

S y s t e m . o u t . p r i n t l n (" Zmienna x ma w a r t o s c " + x ) ;

S y s t e m . o u t . p r i n t l n (" Zmienna x = " + x + " , z m i e n n a y = " + y ) ; }

}

Wynik działania programu:

100

Zmienna x ma w a r t o s c 100 Zmienna x = 1 0 0 , z m i e n n a y = 5

(13)

Operatory w Javie

Operatory arytmetyczne

+

dodawanie

-

odejmowanie

*

mnożenie

/

dzielenie

%

modulo

Operatory relacyjne (porównania)

<

mniejszy niż

<=

mniejszy lub równy

>

większy niż

>=

większy lub równy

==

równy

!=

różny od Operatory logiczne

!

negacja

||

alternatywa

&&

koniunkcja

(14)

Operatory w Javie

Złożone operatory przypisania

+ = a+ = b odpowiada a = a + b

− = a− = b odpowiada a = a − b

∗ = a∗ = b odpowiada a = a ∗ b

/ = a/ = b odpowiada a = a/b

% = a% = b odpowiada a = a%b

++ a + + odpowiada a = a + 1

−− a − − odpowiada a = a − 1

Operatory bitowe

<< przesunięcie bitowe w lewo

>> przesunięcie bitowe w prawo

| bitowa alternatywa

& bitowa koniunkcja

ˆ bitowa różnica symetryczna

∼ bitowa negacja

(15)

Operatory inkrementacji i dekrementacji

Operatory mają dwie formy: przedrostkową (++i) i przyrostkową (i++).

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t i = 5 ; i n t j = 5 ;

S y s t e m . o u t . p r i n t l n (" i = " + i + " j = " + j ) ; S y s t e m . o u t . p r i n t l n (" i++ = " + i++ + " ++j = " + ++j ) ; S y s t e m . o u t . p r i n t l n (" i = " + i + " j = " + j ) ; }

}

i = 5 j = 5

i++ = 5 ++j = 6

i = 6 j = 6

Zapis i++ oznacza użycie w wyrażeniu aktualnej wartości i, a potem

inkrementację tej zmiennej. Zapis ++i oznacza najpierw inkrementację zmiennej i,

potem użycie w wyrażeniu nowej wartości.

(16)

Instrukcja warunkowa if

Składnia if (warunek) {

blok_instrukcji }

Jeśli warunek jest spełniony, czyli daje wartość true (prawda), program wykonuje blok_instrukcji zawarty w nawiasach klamrowych.

Jeśli warunek nie jest spełniony, czyli daje wartość false (fałsz), blok_instrukcji jest pomijany.

W przypadku, gdy blok_instrukcji składa się z pojedynczej instrukcji, nawiasy klamrowe można pominąć.

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t i = 5 ;

i f ( i > 0 )

S y s t e m . o u t . p r i n t l n (" L i c z b a " + i + " j e s t d o d a t n i a . ") ; }

}

(17)

Instrukcja warunkowa if else

Instrukcja if pozwala zdecydować, czy dana instrukcja lub blok instrukcji mają być w ogóle wykonane.

Instrukcja if else pozwala zdecydować, która z dwóch instrukcji (lub bloków) ma być wykonana.

Składnia (1)

if (warunek_wyboru) instrukcja1

else

instrukcja2

Składnia (1) - inny sposób formatowania kodu if (warunek_wyboru) instrukcja1

else instrukcja2

(18)

Instrukcja warunkowa if else

Składnia (2)

if (warunek_wyboru) {

blok_instrukcji1 }

else {

blok_instrukcji2 }

Jeśli warunek_wyboru jest spełniony (ma wartość true), program wykona blok_instrukcji1, a blok_instrukcji2 pominie.

W przeciwnym razie, jeśli warunek_wyboru nie jest spełniony, program

pominie blok_instrukcji1, a wykona blok_instrukcji2.

(19)

Instrukcja warunkowa if else

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t i = −3;

i f ( i > 0 )

S y s t e m . o u t . p r i n t l n (" L i c z b a " + i + " j e s t d o d a t n i a . ") ; e l s e

S y s t e m . o u t . p r i n t l n (" L i c z b a " + i + " j e s t uje mna l u b r ówna z e r o . ") ; }

}

(20)

Instrukcja warunkowa if else

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t i = 0 ;

i f ( i > 0 ) i = i + 2 ;

S y s t e m . o u t . p r i n t l n (" Wynik : " + i ) ; e l s e

i = i + 5 ;

S y s t e m . o u t . p r i n t l n (" Wynik : " + i ) ; }

}

Program powoduje błąd kompilacji. Kompilator widzi pojedyncze if z instrukcją i

= i + 2;. Dalej jest instrukcja System.out.println. Jak dotąd wszystko w

porządku. Teraz jednak kompilator dochodzi do niepowiązanego z niczym else,

więc zgłasza błąd składniowy.

(21)

Instrukcja warunkowa if else

Jeśli do kodu dodamy nawiasy klamrowe, uzyskamy zamierzony efekt:

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t i = 0 ;

i f ( i > 0 ) {

i = i + 2 ;

S y s t e m . o u t . p r i n t l n (" Wynik : " + i ) ; }

e l s e {

i = i + 5 ;

S y s t e m . o u t . p r i n t l n (" Wynik : " + i ) ; }

} }

(22)

Konstrukcja if else if else

W programach często mamy więcej możliwości niż proste "tak" i "nie".

Instrukcję if else można rozbudować tak, aby obsługiwała także takie sytuacje.

Składnia (1)

if (warunek_wyboru1) instrukcja1

else

if (warunek_wyboru2) instrukcja2

else

instrukcja3

Składnia (1) - inny sposób formatowania kodu if (warunek_wyboru1)

instrukcja1

else if (warunek_wyboru2) instrukcja2

else

instrukcja3

(23)

Konstrukcja if else if else

Składnia (2)

if (warunek_wyboru1) {

blok_instrukcji1 }

else {

if (warunek_wyboru2) {

blok_instrukcji2 }

else {

blok_instrukcji3 }

}

(24)

Konstrukcja if else if else

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t i = −3;

i f ( i > 0 ) {

S y s t e m . o u t . p r i n t l n (" L i c z b a j e s t d o d a t n i a . ") ; }

e l s e {

i f ( i < 0 ) {

S y s t e m . o u t . p r i n t l n (" L i c z b a j e s t uj em na . ") ; }

e l s e {

S y s t e m . o u t . p r i n t l n (" L i c z b a j e s t r ówna 0 . ") ; }

} } }

(25)

Pętla for

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t i ;

for (i = 0; i <= 4; i = i + 1) {

System.out.println("Java zna pętle.");

}

S y s t e m . o u t . p r i n t l n (" J a v a w i e , k i e d y p r z e s t a ć . ") ; }

}

Wynik działania programu:

J a v a z n a p ę t l e . J a v a z n a p ę t l e . J a v a z n a p ę t l e . J a v a z n a p ę t l e . J a v a z n a p ę t l e .

J a v a w i e , k i e d y p r z e s t a ć .

(26)

Pętla for

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t i ;

for (i = 0; i <= 4; i = i + 1) {

S y s t e m . o u t . p r i n t l n (" J a v a z n a p ę t l e . ") ; }

S y s t e m . o u t . p r i n t l n (" J a v a w i e , k i e d y p r z e s t a ć . ") ; }

}

Inicjalizacja pętli. Pętla zaczyna się od ustawienia liczby całkowitej i na 0: i=0;.

Instrukcja ta wykonuje się tylko raz.

Warunek pętli. Program sprawdza, czy i jest mniejsze lub równe 4: i<=4;

Treść pętli. Jeżeli tak, program wykonuje następną instrukcję:

System.out.println("Java zna pętle.");

Krok pętli. Po zakończeniu treści pętli program zwiększa i o 1: i=i+1, co kończy pierwszy cykl pętli.

Następnie pętla zaczyna drugi cykl od porównania nowej wartości zmiennej i z 4.

Nowa wartość, 1, jest również mniejsza od 4, więc wyświetlany jest kolejny napis i

cykl kończy się zwiększeniem i . Kolejne etapy cyklu powtarzają się, aż i osiągnie

wartość 5. Wtedy sprawdzenie warunku daje fałsz, więc program przechodzi do

instrukcji znajdującej się bezpośrednio za pętlą.

(27)

Pętla for

Składnia

for (inicjalizacja; warunek_pętli; krok_pętli) {

treść }

Zwykle pętla for obejmuje następujące działania:

1. Ustawienie wartości początkowych (inicjalizacja).

2. Wykonanie testu w celu sprawdzenia, czy pętla ma być dalej wykonywana (warunek pętli).

3. Wykonanie działań objętych pętlą (treść pętli).

4. Aktualizacja wartości używanej (lub używanych) w teście (krok pętli).

(28)

Pętla for

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t i , s t a r t = 4 ;

f o r ( i = s t a r t ; i > 0 ; i = i − 1 ) S y s t e m . o u t . p r i n t l n (" i = " + i ) ;

S y s t e m . o u t . p r i n t l n (" Gotowe , bo j u ż i = " + i ) ; }

}

i = 4 i = 3 i = 2 i = 1

Gotowe , bo j u ż i = 0

Pętla for to pętla z uprzednim sprawdzeniem warunku, co oznacza, że warunek pętli jest sprawdzany przed każdym cyklem pętli.

Jeśli warunek już na samym początku nie będzie spełniony, pętla nie wykona się

ani razu (w przykładzie: dla start ≤ 0).

(29)

Pętla for

W pętli for możliwa jest deklaracja zmiennej.

Zmienna taka będzie jednak istniała tylko w tej pętli. Zatem kiedy program zakończy wykonywanie pętli, zmienna zostanie usunięta.

Poniższy program zakończy się błędem kompilacji.

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

f o r (int i = 0; i <= 4 ; i = i + 1 ) {

S y s t e m . o u t . p r i n t l n (" J a v a z n a p ę t l e . ") ; }

System.out.println(i);

} }

Instrukcję i = i + 1 można zastąpić operatorem inkrementacji i++.

Instrukcję i = i - 1 można zastąpić operatorem dekrementacji i--.

(30)

Pętla for

Program umożliwia obliczenie silni liczby naturalnej n.

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t n = 4 , s = 1 ;

f o r (i n t i = 2 ; i <= n ; i ++) {

s = s ∗ i ; }

S y s t e m . o u t . p r i n t l n (" S i l n i a l i c z b y " + n + " j e s t r ówna : " + s ) ; }

}

Wynik działania programu:

S i l n i a l i c z b y 4 j e s t r ówna 24

(31)

Pętla for

Program wyświetla wszystkie liczby naturalne nie większe od 100 i podzielne przez k oraz ich sumę.

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t k = 9 , s = 0 ;

f o r (i n t i = k ; i <= 1 0 0 ; i = i + k ) {

S y s t e m . o u t . p r i n t ( i + " ") ; s = s + i ;

}

S y s t e m . o u t . p r i n t l n (" \ nWynik = " + s ) ; }

}

Wynik działania programu:

9 18 27 36 45 54 63 72 81 90 99 Wynik = 594

(32)

Pętla while

Składnia

while (warunek_pętli) {

treść }

Najpierw program wyznacza wartość wyrażenia warunek_pętli ujętego w nawiasy. Jeśli wynikiem jest true, wykonywane są instrukcje z treści pętli.

Po zakończeniu treści pętli, program ponownie wyznacza wartość warunku pętli.

Proces trwa tak długo, dopóki warunek nie przyjmie wartości false.

(33)

Pętla for i pętla while

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

f o r (int i = 0; i < 5; i++)

S y s t e m . o u t . p r i n t l n (" J a v a z n a p ę t l e . ") ;

S y s t e m . o u t . p r i n t l n (" J a v a w i e , k i e d y p r z e s t a ć . ") ; }

}

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

int i = 0; w h i l e (i < 5) {

S y s t e m . o u t . p r i n t l n (" J a v a z n a p ę t l e . ") ; i++;

}

S y s t e m . o u t . p r i n t l n (" J a v a w i e , k i e d y p r z e s t a ć . ") ; }

}

(34)

Pętla for i pętla while

Pętla for w postaci:

for (inicjalizacja; warunek_pętli; aktualizacja) {

instrukcje }

może zostać zapisana następująco:

inicjalizacja;

while (warunek_pętli) {

instrukcje

aktualizacja

}

(35)

Pętla for i pętla while

Podobnie pętla while w postaci:

while (warunek_pętli) treść

może zostać zapisana następująco:

for ( ; warunek_pętli; ) treść

Pętla for wymaga trzech wyrażeń, ale mogą być to wyrażenia puste, obowiązkowe są tylko średniki. Brak warunku pętli for jest traktowany jako wyrażenie stałe true, więc następująca pętla będzie pętlą nieskończoną:

for ( ; ; ) treść

Pętle while są używane zwykle wtedy, kiedy trudno z góry przewidzieć, ile razy

pętla powinna się wykonać.

(36)

Program sumuje losowe liczby całkowite z przedziału [0, 9] do momentu wylosowania 0.

import java.util.Random;

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t x = 1 , s = 0 ; Random r = new Random();

w h i l e ( x != 0 ) {

x = r.nextInt(10);

S y s t e m . o u t . p r i n t l n (" Wylosowano l i c z b ę : " + x ) ; s = s + x ;

}

S y s t e m . o u t . p r i n t l n (" Suma w y l o s o w a n y c h l i c z b t o " + s ) ; }

}

Przykładowy wynik działania programu:

Wylosowano l i c z b ę : 5 Wylosowano l i c z b ę : 9 Wylosowano l i c z b ę : 2 Wylosowano l i c z b ę : 0

Suma w y l o s o w a n y c h l i c z b t o 16

(37)

Pętla do while

Pętla do while istotnie różni się od pętli for i while, gdyż warunek jest w niej sprawdzany po wykonaniu treści.

Wobec tego pętla do while wykona się zawsze co najmniej raz, niezależnie od spełnienia (bądź niespełnienia) warunku.

Składnia do {

treść

} while (warunek_pętli)

(38)

i m p o r t j a v a . u t i l . Random ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r = new Random ( ) ;

i n t x = r . n e x t I n t ( 1 0 ) ; i n t s = x ;

while ( x != 0 ){ x = r . n e x t I n t ( 1 0 ) ; s = s + x ;

}

S y s t e m . o u t . p r i n t l n (" Suma w y l o s o w a n y c h l i c z b t o " + s ) ; }

}

i m p o r t j a v a . u t i l . Random ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t s = 0 ;

Random r = new Random ( ) ; do {

x = r . n e x t I n t ( 1 0 ) ; s = s + x ;

} while ( x != 0 ) ;

S y s t e m . o u t . p r i n t l n (" Suma w y l o s o w a n y c h l i c z b t o " + s ) ; }

}

(39)

Pętla do while

Program sumuje losowe liczby całkowite z przedziału [a, b].

Sumowanie zostaje zakończone, gdy suma składników przekroczy wartość 100.

i m p o r t j a v a . u t i l . Random ; p u b l i c c l a s s Main

{

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t x , a = 1 5 , b = 2 5 , s = 0 , l i c z n i k = 0 ; Random r = new Random ( ) ;

do {

x = r . n e x t I n t (b - a + 1)+ a;

S y s t e m . o u t . p r i n t l n (" Wylosowano l i c z b ę : " + x ) ; s = s + x ;

l i c z n i k ++;

} w h i l e ( s <= 1 0 0 ) ;

S y s t e m . o u t . p r i n t l n (" Suma j e s t r ówna : " + s ) ;

S y s t e m . o u t . p r i n t l n (" L i c z b a s k ł a d n i k ów : " + l i c z n i k ) ; }

}

(40)

Instrukcja break

Instrukcja break powoduje przerwanie wykonywania pętli i opuszczenie jej bloku.

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

f o r (i n t i = 0 ; ; i ++)

{

S y s t e m . o u t . p r i n t l n (" I t e r a c j a n r " + i ) ; i f ( i == 4 )

{

b r e a k; }

} } }

Wynik działania programu:

I t e r a c j a n r 0 I t e r a c j a n r 1 I t e r a c j a n r 2 I t e r a c j a n r 3 I t e r a c j a n r 4

(41)

Instrukcja continue

Instrukcja continue powoduje przerwanie bieżącej iteracji pętli i przejście do kolejnej.

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { f o r (i n t i = 1 ; i <= 2 0 ; i ++)

{

i f ( i % 3 != 0 ) {

c o n t i n u e; }

S y s t e m . o u t . p r i n t l n ( i ) ; }

} }

Wynik działania programu:

3 6 9 12 15 18

(42)

Tablice

Aby móc skorzystać z tablicy, trzeba najpierw zadeklarować zmienną tablicową, a następnie utworzyć samą tablicę.

Deklaracja zmiennej tablicowej typ_tablicy nazwa_tablicy[ ];

lub

typ_tablicy[ ] nazwa_tablicy;

W ten sposób powstaje zmienna o nazwie nazwa_tablicy, dzięki której będzie można odwoływać się do tablicy, ale samej tablicy jeszcze nie ma. Trzeba ją dopiero utworzyć, korzystając z operatora new.

Deklaracja i utworzenie tablicy (I) typ_tablicy nazwa_tablicy[ ];

nazwa_tablicy[ ] = new typ_tablicy[liczba_elementów];

Deklaracja i utworzenie tablicy (II)

typ_tablicy nazwa_tablicy[ ] = new typ_tablicy[liczba_elementów];

(43)

Tablice

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

i n t t a b [ ] = new i n t[ 3 ] ; // l u b : i n t [ ] t a b = new i n t [ 3 ] t a b [ 0 ] = 5 ;

t a b [ 1 ] = 6 ; t a b [ 2 ] = 7 ;

i n t TAB [ ] = { 4 , 9 , −3};

S y s t e m . o u t . p r i n t l n (" P i e r w s z y e l e m e n t t a b l i c y : " + t a b [ 0 ] ) ; S y s t e m . o u t . p r i n t l n (" D r u g i e l e m e n t t a b l i c y : " + t a b [ 1 ] ) ; S y s t e m . o u t . p r i n t l n (" T r z e c i e l e m e n t t a b l i c y : " + t a b [ 2 ] ) ;

S y s t e m . o u t . p r i n t (" E l e m e n t y d r u g i e j t a b l i c y : ") ;

S y s t e m . o u t . p r i n t (TAB [ 0 ] + " , " + TAB [ 1 ] + " , " + TAB [ 2 ] ) ; }

}

P i e r w s z y e l e m e n t t a b l i c y : 5 D r u g i e l e m e n t t a b l i c y : 6 T r z e c i e l e m e n t t a b l i c y : 7

E l e m e n t y d r u g i e j t a b l i c y : 4 ,9 , −3

(44)

Program wypełnia tablicę losowymi liczbami całkowitymi z przedziału [0, 9], wyświetla je oraz oblicza średnią arytmetyczną.

i m p o r t j a v a . u t i l . Random ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r = new Random ( ) ;

i n t n = r . n e x t I n t ( 4 ) + 5 ; // d ł ugo ś ć t a b l i c y 5 , 6 , 7 l u b 8 i n t t a b [ ] = new i n t[ n ] ;

f o r (i n t i = 0 ; i < n ; i ++) t a b [ i ] = r . n e x t I n t ( 1 0 ) ;

S y s t e m . o u t . p r i n t (" E l e m e n t y t a b l i c y t o : ") ; f o r (i n t i = 0 ; i < n ; i ++)

S y s t e m . o u t . p r i n t ( t a b [ i ] + " ") ;

f l o a t s = 0 ;

f o r (i n t i = 0 ; i < t a b . l e n g t h ; i ++) s = s + t a b [ i ] ;

S y s t e m . o u t . p r i n t (" \ nŚ r e d n i a e l e m e n t ów t a b l i c y : " + s / n ) ; }

}

E l e m e n t y t a b l i c y t o : 9 4 1 5 8 4 2

Ś r e d n i a a r y t m e t y c z n a e l e m e n t ów t a b l i c y : 4 . 7 1 4 2 8 6

(45)

Tablice dwuwymiarowe

Przykład prostej inicjalizacji macierzy wymiaru 2x 4 oraz wypisania jej elementów.

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t t a b [ ] [ ] = {

{ 1 , 2 , 3 , 4 } , { 5 , 6 , 7 , 8 } } ;

f o r (i n t i = 0 ; i < 2 ; i ++) {

f o r (i n t j = 0 ; j < 4 ; j ++) {

S y s t e m . o u t . p r i n t (" t a b [ " + i + " , " + j + " ] = ") ; S y s t e m . o u t . p r i n t ( t a b [ i ] [ j ] + " ") ;

}

S y s t e m . o u t . p r i n t l n ( ) ; }

} }

t a b [ 0 , 0 ] = 1 t a b [ 0 , 1 ] = 2 t a b [ 0 , 2 ] = 3 t a b [ 0 , 3 ] = 4 t a b [ 1 , 0 ] = 5 t a b [ 1 , 1 ] = 6 t a b [ 1 , 2 ] = 7 t a b [ 1 , 3 ] = 8

(46)

Program tworzy macierz wymiaru 2x 5, wypełnia ją losowymi liczbami całkowitymi z przedziału [0, 9], wyświetla jej zawartość, a następnie oblicza sumę jej elementów.

i m p o r t j a v a . u t i l . Random ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r = new Random ( ) ;

i n t t a b [ ] [ ] = new i n t[ 2 ] [ 5 ] ; f o r (i n t i = 0 ; i < 2 ; i ++)

f o r (i n t j = 0 ; j < 5 ; j ++) t a b [ i ] [ j ] = r . n e x t I n t ( 1 0 ) ;

S y s t e m . o u t . p r i n t l n (" E l e m e n t y t a b l i c y 2 x5 t o : ") ; f o r (i n t i = 0 ; i < 2 ; i ++)

{

f o r (i n t j = 0 ; j < 5 ; j ++) {

S y s t e m . o u t . p r i n t ( t a b [ i ] [ j ] + " ") ; }

S y s t e m . o u t . p r i n t l n ( ) ; }

i n t suma = 0 ;

f o r (i n t i = 0 ; i < 2 ; i ++) f o r (i n t j = 0 ; j < 5 ; j ++)

suma = suma + t a b [ i ] [ j ] ;

S y s t e m . o u t . p r i n t (" Suma e l e m e n t ów m a c i e r z y : " + suma ) ; }

}

(47)

Tablice dwuwymiarowe

Zamiast stałych dosłownych:

f o r (i n t i = 0 ; i < 3; i ++) f o r (i n t j = 0 ; j < 5; j ++)

t a b [ i ] [ j ] = r . n e x t I n t ( 1 0 ) ;

możemy użyć length:

f o r (i n t i = 0 ; i < tab.length; i ++) f o r (i n t j = 0 ; j < tab[i].length; j ++)

t a b [ i ] [ j ] = r . n e x t I n t ( 1 0 ) ;

Właściwość length przydaje się szczególnie wtedy, gdy rozmiar tablicy nie jest z góry znany i zostaje ustalony dopiero w trakcie działania programu.

Co więcej, gdy stosuje się pierwszy sposób zapisu, łatwo o pomyłkę. Może się np.

zdarzyć, że programista zmieni rozmiar tablicy, ale zapomni zmodyfikować pętlę.

(48)

Łańcuchy

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { S t r i n g s 1 = " G d y n i a ";

S t r i n g s 2 = " Gdań s k "; S t r i n g s 3 = " S o p o t ";

i n t d l u g o s c = s 1 . l e n g t h ( ) ;

S y s t e m . o u t . p r i n t l n ( s 1 + " ma " + d l u g o s c + " z n a k ów . ") ;

S t r i n g s 4 = " Tr ó j m i a s t o = " + s 2 + " , " + s 3 + " , " + s 1 ; S y s t e m . o u t . p r i n t l n ( s 4 ) ;

S y s t e m . o u t . p r i n t l n ( s 4 . s u b s t r i n g ( 4 , 1 0 ) ) ;

S y s t e m . o u t . p r i n t l n ( s 3 . t o L o w e r C a s e ( ) ) ; S y s t e m . o u t . p r i n t l n ( s 3 . t o U p p e r C a s e ( ) ) ; }

}

G d y n i a ma 6 z n a k ów .

Tr ó j m i a s t o = Gdań sk , Sopot , G d y n i a m i a s t o

s o p o t SOPOT

(49)

Łańcuchy

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { S t r i n g s 1 = " G d y n i a ";

S t r i n g s 2 = " Gdań s k "; S t r i n g s 3 = " S o p o t ";

b o o l e a n b = s 1 . e q u a l s ( s 2 ) ;

i f ( b == t r u e) S y s t e m . o u t . p r i n t l n ("Ła ń c u c h y s ą i d e n t y c z n e . ") ; S y s t e m . o u t . p r i n t l n ("Ła ń c u c h y s ą r ó ż ne . ") ;

S y s t e m . o u t . p r i n t (" K o l e j n o ś ć a l f a b e t y c z n a : ") ; i n t i = s 1 . compareTo ( s 2 ) ;

i f ( i < 0 ) S y s t e m . o u t . p r i n t l n ( s 1 + " , " + s 2 ) ; e l s e i f ( i > 0 ) S y s t e m . o u t . p r i n t l n ( s 2 + " , " + s 1 ) ; e l s e S y s t e m . o u t . p r i n t l n ( s 1 ) ;

} }

Ła ń c u c h y s ą r ó ż ne .

K o l e j n o ś ć a l f a b e t y c z n a : Gdań sk , G d y n i a

Uwaga: Do porównywania łańcuchów nie należy używać operatorów ==, !=.

(50)

Odbieranie danych wejściowych

Wiadomo już, że drukowanie danych do standardowego strumienia

wyjściowego (tzn. do okna konsoli) jest łatwe. Wystarczy wywołać metodę System.out.println.

Pobieranie danych ze standardowego strumienia wejściowego System.in nie jest już takie proste. Czytanie danych odbywa się za pomocą skanera będącego obiektem klasy Scanner:

S c a n n e r i n = new S c a n n e r ( S y s t e m . i n ) ;

Następnie dane wejściowe odczytuje się za pomocą różnych metod klasy Scanner:

I in.nextLine() czyta jeden wiersz danych; przydaje się, gdy dane na wejściu

mogą zawierać spacje;

I in.next() odczytuje jedno słowo (ograniczone spacjami);

I in.nextInt() wczytuje liczbę całkowitą;

I in.nextDouble() wczytuje liczbę zmiennoprzecinkową;

(51)

Odbieranie danych wejściowych

import java.util.Scanner;

p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Scanner in = new Scanner(System.in);

S y s t e m . o u t . p r i n t l n (" J a k s i ę n a z y w a s z ? ") ; S t r i n g i m i e = in.nextLine();

S y s t e m . o u t . p r i n t l n (" I l e masz l a t ? ") ; i n t w i e k = in.nextInt();

S y s t e m . o u t . p r i n t l n (" W i t a j u ż y t k o w n i k u " + i m i e + " . "

+ " \nW p r z y s z ł ym r o k u b ę d z i e s z mie ć " + ( w i e k + 1 ) + " l a t ( a ) . ") ; }

}

J a k s i ę n a z y w a s z ? Jan K o w a l s k i

I l e masz l a t ? 20

W i t a j u ż y t k o w n i k u Jan K o w a l s k i .

W p r z y s z ł ym r o k u b ę d z i e s z mie ć 21 l a t ( a ) .

(52)

Funkcje i stałe matematyczne

Math.sqrt(x) Math.pow(x,n) Math.max(a,b) Math.sin(x) Math.cos(x) Math.tan(x) Math.exp(x) Math.log(x) Math.log10(x) Math.PI Math.E

Uwaga: Wszystkie funkcje klasy Math znajdziesz w dokumentacji:

docs.oracle.com/javase/8/docs/api/

Na podanej stronie znajdź i kliknij pakiet java.lang.

W Class Summary odszukaj i kliknij Math.

Cytaty

Powiązane dokumenty

• Prawo Charlesa mówi, że przy stałej objętości gazu stosunek ciśnienia i temperatury danej masy gazu jest

public void actionPerformed(ActionEvent arg0) {  setTitle(&#34;Anonimowa klasa wewnetrzna&#34;);  . } }

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 80/116 public class MenuWindow extends JFrame {.

strumieniowych związanych z plikami podaliśmy jako argument nazwę pliku → 4 klasy strumieni abstrakcyjnych. ● można także utworzyć strumień plikowy podając jako

protected void done() - wywoływana po zakończeniu zadania, wykonywana w EDT, można w niej przeprowadzić „sprzątanie” i zaprezentować w GUI główny rezultat wykonywanego

– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, → Łatwe, relacyjna... – Ustalamy jakiego DBMS będziemy używać.

Funkcja PokazDaneDokumentu() została natomiast stworzona do pracy z obiektami CDocument, zatem wykorzystuje jedynie informacje zawarte w klasie bazowej. Nie przeszkadza to jednak

Metody określone przez klasę odwołują się do atrybutów przechowywanych w obiekcie.. Czy klasy mogą