Języki Programowania
Tablice i typy złożone
Wejście i wyjście
WyjÄ…tki
Tablica
żð Tablice sÄ… obiektami do przechowywania dużej porcji
informacji
żð Tablica jest uporzÄ…dkowanÄ… listÄ… wartoÅ›ci
Cała tablica ma
Każda wartość ma numeryczny indeks
jednÄ… nazwÄ™
0 1 2 3 4 5 6 7 8 9
wyniki
79 87 94 82 67 98 87 81 74 91
żð Ta tablica przechowuje 10 wartoÅ›ci które majÄ… indeksy od
0 do 9
żð Tablica o rozmiarze N ma indeksy od zera do N-1
2
1
Tablice odwołanie do elementu
żð Do konkretnej wartoÅ›ci tablicy odwoÅ‚ujemy siÄ™
używając nazwy tablicy i indeksu w nawiasie
żð np. wyrażenie
wyniki[2]
odwołuje się do wartości 94 (trzecia wartość w
całej tablicy)
żð indeksy muszÄ… być liczbÄ… caÅ‚kowitÄ…
3
Tablice - przykłady
żð przykÅ‚ady odwoÅ‚aÅ„ do elementów tablicy (przypisanie, do obliczeÅ„, do
wydruków)
wyniki[2] = 89;
wyniki[pierwszy] = wyniki[pierwszy] + 2;
srednia = (wyniki[0] + wyniki[1])/2;
System.out.println ( Max = " + wyniki[5]);
żð WartoÅ›ci przechowywane w tablicy nazywane sÄ… tablicÄ… elementów
żð Tablica przechowuje wiele elementów tego samego typu
żð Typ elementu może być prymitywny lub może być obiektem
żð WiÄ™c możemy utworzyć tablicÄ™ liczb int, znaków, tablicÄ™ obiektów
String, tablicę obiektów Konto, itp.
4
2
Tablice - definicja
żð Inny sposób żð Tablica wyniki może być
zobrazowania
zdefiniowana jako:
tablicy wyniki:
int[] wyniki = new int[10];
wyniki
79
żð Typ pola wyniki jest int[] (tablica
87
liczb int)
94
żð Należy pamiÄ™tać, że tablica nie okreÅ›la
82
rozmiaru elementu/obiektu, każdy
67
obiekt ma swój rozmiar
98
87 żð pole/zmienna wyniki jest ustawione
81 jako nowa tablica która może
przechowywać 10 liczb int
74
91
5
Deklarowanie tablic
żð Inne przykÅ‚ady deklaracji tablic:
float[] ceny = new float[500];
boolean[] flagi;
flagi = new boolean[20];
char[] kody = new char[1750];
żð iterator w pÄ™tli for może być używany do przetwarzania
tablicy elementów
objekt
for (int indeks : wyniki)
wartość int
System.out.println (indeks);
żð Taki zapis jest tylko poprawny jeÅ›li przetwarzamy wszystkie
elementy tablicy od najniższego do najwyższego indeksu
6
3
Sprawdzanie ograniczeń - Bounds Checking
żð Po utworzeniu tablicy, ma ona staÅ‚y rozmiar
żð Oznacza to, że wartość indeksów musi być w granicach od 0 do N-1
żð interpreter Java zgÅ‚asza: ArrayIndexOutOfBoundsException
jeśli indeks tablicy jest poza granicami
żð nazywa to siÄ™ automatyczne sprawdzanie ograniczeÅ„ - bounds
checking
żð np., jeÅ›li tablica kody może pomieÅ›cić 100 wartoÅ›ci, to ma indeksy
tylko od 0 do 99
żð jeÅ›li zmienna licznik jest równa 100, to referencja
kody[licznik] spowoduje wyjÄ…tek
for (int licznik=0; licznik <= 100; licznik++)
kody[licznik] = licznik*50 + epsilon;
problem
7
Sprawdzanie ograniczeń
żð każda tablica (obiekt) posiada pole (public) zwane length które
przechowuje rozmiar tablicy
żð do tego pola możemy odwoÅ‚ać siÄ™ przez:
wyniki.length
żð pamiÄ™taj, że pole length przechowuje liczbÄ™ elementów a nie
największy indeks
żð dopuszczalne sÄ… dwa sposoby deklaracji tablicy (nawiasy przy typie
elementów lub przy nazwie tablicy):
float[] prices;
float prices[];
żð Pierwszy z nich jest bardziej czytelny i powinien być używany
8
4
Inicjalizacja lista inicjalizacji
żð tworzenie instancji i wypeÅ‚nianie tablicy w jednym kroku
żð wartoÅ›ci sÄ… podane w nawiasie i oddzielone przecinkami (muszÄ…
być odpowiednie typy danych)
żð przykÅ‚adu:
int[] jednostki = {147, 323, 89, 933, 540,
269, 97, 114, 298, 476};
char[] litery = {'A', 'B', 'C', 'D', F'};
żð Kiedy używamy listy inicjalizacji:
żð nie używamy operatora new
żð nie podajemy rozmiaru tablicy
żð rozmiar tablicy jest wyznaczany przez liczbÄ™ elementów z listy
żð lista inicjalizacji może być użyta tylko na etapie deklaracji
tablicy
9
Deklaracja i inicjalizacja
Inny, prostszy sposób
Tablica jest obiektem i domyślne wartości
elementów to w tym przypadku 0!
10
5
Tablice jako parametry metod
żð caÅ‚a tablica może być przekazana jako parametr do
metody/funkcji
żð podobnie jak inne obiekty przekazywana jest referencja
żð dlatego, zmiana elementu tablicy w metodzie zmienia
tablicÄ™ w oryginale
żð elementy indywidualne tablicy mogÄ… być też
przekazywane ale w tym przypadku sÄ… one tylko
parametrami formalnymi
11
Tablice obiektów
żð elementami tablicy mogÄ… być referencje do obiektów
żð poniższa deklaracja rezerwuje przestrzeÅ„ dla 5.
referencji obiektów typu String
String[] slowa = new String[5];
żð to nie tworzy obiektów String
żð poczÄ…tkowo tablica obiektów przechowuje referencje
na null
żð każdy z obiektów takiej tablicy musi być ustawiony
oddzielnie
12
6
Tablice obiektów c.d.
żð tablica slowa po deklaracji:
slowa -
-
elementy null
-
-
-
żð po takiej deklaracji wydrukuje siÄ™ null :
System.out.println (slowa[0]);
żð natomiast, poniższa referencja spowoduje wyjÄ…tek
NullPointerException:
System.out.println(slowa[0].toUpperCase());
13
Tablice obiektów c.d.
żð po kilku ustawieniach obiektów:
styczen
slowa
luty
marzec
-
-
żð poniższa deklaracja tworzy tablicÄ™ obiektów i wypeÅ‚nia jÄ…
referencjami
String[] impreza = { nudna", ciekawa", glosna"};
14
7
Listy o zmiennej długości
żð załóżmy, że chcemy napisać metodÄ™, która przetwarza
różną liczbę danych (przy kolejnych wywołaniach)
żð np. metoda o nazwie srednia która zwraca wartość
średnia z wprowadzonych elementów int
// pierwsze wywołanie metody z 3. elementami
mean1 = srednia (42, 69, 37);
// inne wywołanie metody z 7. elementami
mean2 = srednia (35, 43, 93, 23, 40, 21, 75);
15
Listy o zmiennej długości
żð za pomocÄ… specjalnej skÅ‚adni możemy przekazać do
metody różną (dowolną) liczbę elementów z tablicy
(listy)
żð dla każdego wywoÅ‚ania, parametry sÄ… automatycznie
wprowadzane do tablicy
wskazuje zmienną (listę) o możliwie rożnej długości
public double average (int ... list)
{
// whatever
}
typ elementów
nazwa tablicy
16
8
Lista o zmiennej długości - przykład
// example of variable length
// parameter list
public double srednia (int ... lista){
double wynik = 0.0;
if (lista.length != 0)
{
int sum = 0;
for (int num : lista)
sum += num;
wynik = (double)sum/lista.length;
}
return wynik ;
}
17
Tablice dwuwymiarowe
żð deklarowana przez okreÅ›lenie wielkoÅ›ci każdego wymiaru
oddzielnie :
int[][] wyniki = new int[12][50];
żð odwoÅ‚anie do elementu tablicy:
value = wyniki [3][6];
18
9
Tablice dwuwymiarowe
19
Tablice dwuwymiarowe
20
10
Tablice wielowymiarowe
żð tablica może mieć wiele wymiarów - jeÅ›li ma wiÄ™cej niż
jeden wymiar, nazywana jest tablica wielowymiarowa
żð każdy wymiar ma swoje pole (staÅ‚e) length
żð ponieważ każdy wymiar jest tablicÄ… odwoÅ‚aÅ„ do tablic,
tablice w jednym wymiarze mogą mieć różne długości
żð czasami nazywane nierównymi tablicami - ragged arrays
21
Typy generyczne - generics
żð czasami potrzebujemy różnych typów w programie
(prymitywne, obiekty, tablice obiektów)
żð ale czasami jeszcze bardzie zaawansowane struktury
danych
żð Java wspiera takie struktury, nazywane generics
żð Collections (kolekcje elementy podlegajÄ… Å›ciÅ›le okreÅ›lonym
regułom)
żð Lists (rozszerzenie Collections o nowe metody)
żð Sets (do przechowywania nie powtarzajÄ…cych siÄ™ elementów)
żð Maps (odwzorowania przechowywanie pary klucz-wartość)
22
11
Wejście wyjście
Strumienie - streams
żð Stream jednokierunkowy kanaÅ‚ danych
żð wszystkie zewnÄ™trzne peryferia używajÄ… strumieni do komunikacji
żð drukarki, modemy, klawiatury, CD-ROM, itd.
żð odczyt danych
żð Input streams
data
żð Typowe metody
żð read(), readln() ...
żð zapis danych
data
żð Output streams
żð Typowe metody
żð write(char c), writeln(String s) ...
żð Wszystkie niezbÄ™dne klasy sÄ… w pakiecie java.io
24
12
Strumienie znaków
żð Java ma wiele predefiniowanych strumieni dla zapisu i odczytu znaków.
Najbardziej przydatne są wymienione poniżej.
BufferedReader
Reader
InputStreamReader FileReader
& & &
Object
BufferedWriter
Writer OutputStreamWriter FileWriter
PrintWriter
& & &
25
Strumienie binarne
żð ... również do zapisu i odczytu bajtów
FileInputStream
BufferedInputStream
InputStream
FilterInputStream
DataInputStream
Object
FileOutputStream
BufferedOutputStream
OutputStream
DataOutputStream
FilterOutputStream
PrintStream
26
13
Konsola i klawiatura
żð możemy użyć konsoli (ekranu) i klawiatury jako strumieni
danych
żð klawiatura to InputStream
żð klasa System definiuje pole statyczne in
żð public class System{ static InputStream in; ...}
żð ekran to PrintStream
żð klasa System definiuje pole statyczne out
żð public class System{ static PrintStream out; ...}
27
Wyjście (ekran) w Java
żð nazywane Text Window & .
System.out.print( Stuff_to_Print );
System.out.println( Stuff_to_Print );
żð Stuff_to_Print może być to coÅ› nie tylko String te dwie
metody mogą być przeciążone - overloaded
28
14
Wyjście (ekran) w Java
żð jest też metoda System.out.printf() do
formatowania tekstu wyjściowego
żð Np.
System.out.printf("Pi to %5.2f", Math.PI);
żð wyÅ›wietla:
Pi to 3.14
System.out.printf("Pi to %5.2f, E to %.5f",
Math.PI, Math.E);
żð wyÅ›wietla :
Pi to 3.14, E to 2.71828
29
Wejście w Java
żð można użyć InputStream
żðodnosi siÄ™ do pola System.in
żð ale Å‚atwiej użyć klasy Scanner
żðma wiele funkcjonalnych metod
30
15
Wejście w Java
żð Klasa Scanner musi być importowana:
import java.util.Scanner;
żð użycie w programie:
Scanner input = new Scanner(System.in);
żð i dalej:
System.out.print("Please enter a number: ");
double aNum = input.nextDouble();
31
WyjÄ…tki
16
WyjÄ…tki - exceptions
żð Errors np. dzielenie przez 0
żð Exceptions nieprawidÅ‚owe sytuacje
żðgenerowane przez metody, które zwykle dajÄ…
prawidłowy wynik, ale czasami błędny
żðprogram powinien wykryć (przechwycić - catch)
wyjątki i je obsłużyć w odpowiedni sposób
33
WyjÄ…tki
żð aby zdefiniować metodÄ™, która może wygenerować wyjÄ…tek, używamy
słowa kluczowego throws w sygnaturze metody, np.
Object find(Object[]mySet, Object x)throws
NotFoundException
{
...
}
żð WyjÄ…tek mogÄ… zawierać dodatkowe informacje
żð tekst
żð ...
żð inne dane
żð wiÄ™c wyjÄ…tki sÄ… Obiektami i Java ma odpowiednie klasy do ich obsÅ‚ugi
34
17
WyjÄ…tki w Java
35
Przestępstwo bankowe jako wyjątek
public class AlarmException extends Exception {
int kwota;
String zlodziej;
String ofiara;
AlarmException(String zlodziej,String ofiara, int kwota){
this.zlodziej=zlodziej;
this.ofiara=ofiara;
this.kwota=kwota;
żð zwykle w bankach jest wszystko dobrze
}
ale czasami ktoś może chcieć ukraść
}
pieniądze; definiujemy więc wyjątek
AlarmException
żð Potrzebujemy znać:
żð zÅ‚odzieja
żð ofiarÄ™
żð kwotÄ™
36
18
Pułapka na złodzieja
żð zÅ‚odzieje bÄ™dÄ… próbować ukraść pieniÄ…dze przez
transfer negatywnej kwoty
żð aktywacja wyjÄ…tku puÅ‚apki może wyglÄ…dać tak:
void przelew(Konto odbiorca, int kwota)throws AlarmException{
if (kwota >= 0) {
wyplata(kwota);
odbiorca.wplata(kwota);
}
else throw new AlarmException(this.wlasciciel,
odbiorca.wlasciciel, -kwota);
}
37
Wyjątki zarządzać lub wyjść
żð istniejÄ… dwa sposoby traktowania wyjÄ…tków
żðobsÅ‚uga wyjÄ…tku w metodzie w której wystÄ…piÅ‚
try{ ... } catch (...){ ... }
żðdelegowanie (przesÅ‚anie) wyjÄ…tku poza metodÄ™
throws
żðdelegowanie jest najprostszym sposobem ale jeÅ›li
kolejna metoda zrobi to samo, to mamy: run time
error i wyjście z programu z odpowiednim
komunikatem
38
19
Obsługa wyjątków
public class MojeFinanse{
static String wlasciciel = J. Bond ;
static Konto mojeAktywa = new Konto(wlasciciel);
static Konto akcje = new Konto(wlasciciel);
public static void sprzedaj(int kwota){
try{
jeśli wszystko OK
mojeAktywa.przelew(akcje,kwota);
}
jeśli wyjątek
catch (AlarmException k){
System.out.println( Zlapany + k.zlodziej);
System.out.println( ukradl +k.kwota+ +k.ofiara);
}
}
39
Więcej wyjątków
żð metody mogÄ… zgÅ‚aszać wiÄ™cej wyjÄ…tków
żð delegowanie
myMethod() throws AlarmException, IOException{ ... }
żð obsÅ‚uga
try {...normal processing...}
catch (AlarmException k) {...handler...}
catch(IOException e){...handler}
...
finally{...space for...}
żð opcjonalne wyrażenie finally oznacza dziaÅ‚anie po obsÅ‚udze
wszystkich wyjątków
40
20
Pliki I/O
żð Pliki zapewniajÄ… wygodny sposób przechowywania i
ponownego zapisywania w pamięci większej ilości
danych
żð Trzy rodzaje plików:
żð Text (znaki)
żð Binary (bajty)
żð Random access
żð omówienie tylko plików tekstowych, wiÄ™cej w Java
documentation
41
Zapis do pliku
żð Utworzenie strumienia do zapisu
żð FileWriter myLetter =
new FileWritter( C:/Examples/Jane.txt );
żð taki plik bÄ™dzie
żð automatycznie utworzony lub (jeÅ›li już istnieje)
żð nadpisany (nowÄ… zawartoÅ›ciÄ…)
żð Zapis
żð myLetter.write( Hello Jane,\nneed coal\n );
żð myLetter.write( Your uncle\nSam );
żð ZamkniÄ™cie pliku
żð myLetter.close();
42
21
Zapis do pliku
import java.io.*;
DOS wymaga \\
public class LetterToJane{
w nazwie ścieżki
static void piszList(){
try{ FileWriter myLetter =
new FileWriter( C:\\examples\\Jane.txt );
myLetter.write( Hello Jane\nneed coal\n );
myLetter.write( always Yours\nuncle Sam );
myLetter.close();
}
catch(IOException e){ } \n nowa linia
}
}
43
Czytanie z pliku
żð utworzenie strumienia do czytania z pliku
żð FileReader aLetter = new FileReader( Jane.txt );
żð FileReader reads data as integers by default
żð czytanie liczby int
żð int number;
żð number = aLetter.read();
żð while(number != -1){..do something..; number=aLetter.read();}
żð czytanie char
żð char ch;
żð ch = (char)aLetter.read();
żð zamkniÄ™cie pliku
żð aLetter.close();
żð poza wyjÄ…tkiem IOException należy zwrócić uwagÄ™ na:
żð FileNotFoundException
44
22
Czytanie pliku - przykałd
import java.io.*;
public class JaneReads{
static void readAndEcho(){
try{
FileReader aLetter = new FileReader( Jane.txt );
int c = aLetter.read();
while(c != -1){
System.out.print((char)c);
c = aLetter.read();
}
Hello Jane
aLetter.close();
need coal
}
always Yours
catch(FileNotFoundException f){}
uncle Sam
catch(IOException e){}
}
}
45
Buforowane wejście i wyjście
żð czytanie i zapis znak po znaku jest bardzo nieefektywne
żð w praktyce, RAM, dyski wymieniajÄ… dane blokami
żð dane sÄ… buforowane w głównej pamiÄ™ci komputera
data
data
46
23
Buforowane wejście i wyjście
żð kiedy używamy bufora możemy czytać:
FileReader aData = FileRedaer( Jane.txt );
BufferedReader aLetter = new BufferedReader(aData);
żð lub w jednym kroku:
BufferedReader aLetter =
new BufferedReader(new FileReader( Jane.txt ));
żð podobnie zapis przez bufor:
new BufferedWriter(new FileWriter( Jane.txt )
47
Zapis przez bufor
import java.io.*;
FileWriter
zapisuje do
public class LetterToJane{
BufferedWriter
static void piszList(){
try{ BufferedWriter myLetter =
new BufferedWriter(new FileWriter( Jane.txt ));
myLetter.write( Hello Jane\nhow are You\n );
myLetter.write( always Yours\nuncle Sam );
myLetter.close();
}
catch(FileNotFoundException f){}
catch(IOException e){ }
}
}
48
24
... i odczyt
Hello Jane
How are You
always Yours
import java.io.*;
uncle Sam
public class JaneReads{
static void readAndEcho(){
try{
BuffereReader aLetter =
new BufferedReader(new FileReader( Jane.txt ));
String line = aLetter.readLine();
while(line != null){
FileReader
System.out.println(line);
zapisuje do
line = aLetter.readLine();
} BufferedReader
aLetter.close();
}
catch(FileNotFoundException f){} czytanie linia po linii
catch(IOException e){}
}
}
FileNotFoundException jest
podklasÄ… dla IOException
49
25
Wyszukiwarka
Podobne podstrony:
JP SS 6 Klasy i obiektyJP SS 2 algorytmy i podstawy programowaniaJP SS 5 podstawy JavaJP SS 4 start JavaJP SS 5 podstawy Java (3)JP SS Interfejs graficznyJP SS 1 podstawy JPJP SS 4 wprowadzenie JavaJP SS 1 podstawy JPJP SS 5 podstawy JavaJP SS 7 Klasy i obiektyJP SS 6 BlueJJP SS 3 jezyk CJP SS 3 jezyk CJP SS 4 start JavaJP SS 8 Instrukcje, pętleJP SS 7 Typy i operacjeJP SS 3 jezyk Cwięcej podobnych podstron