Informatyka I Wykład 4. Tablice. Pliki Dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2017
Tablice Tablica uporządkowany zbiór elementów określonego typu Każdy element tablicy posiada własną wartość oraz unikatowy indeks wartość T[0] T[1] T[2] T[n-1] indeks 0 1 2 n-1
Deklaracja tablicy Obowiązkowo: Nazwa tablicy (zmienna) Typu danych elementów tablicy Opcjonalnie: Liczba elementów tablicy Wartości elementów tablicy Tablicowy typ danych jest złożonym typem danych
Tworzenie obiektu tablicy Tablice są złożonym typem danych Przy tworzeniu obiektu tablicy należy posłużyć się konstrukcją new oraz wskazać jej rozmiar Rozmiar tablicy może być obliczany w trakcie działania programu (!)
Diagram deklaracji tablicy Typ danych [ ] Nazwa zmiennej ; = new Typ danych [ Rozmiar ]
Tworzenie obiektu tablicy przez wskazanie wartości jej elementów Tablica może być zadeklarowana poprzez podanie wartości jej elementów ale wyłącznie w momencie deklarowania zmiennej tablicowej
Rozmiar tablicy Liczbę elementów w tablicy można uzyskać poprzez pole.length zmiennej tablicowej
Elementy tablicy Wszystkie elementy tablicy reprezentują jednakowy typ danych Typem danych może być dowolny typ języka Java (prosty lub złożony) Elementy tablicy są numerowane od zera Dla tablicy z N elementów: Indeks pierwszego elementu = 0 Indeks ostatniego elementu = (N 1) Próba wykroczenia poza granice tablicy skutkuje błędem typu ArrayIndexOutOfBoundsException
Adresacja elementów tablicy Adresacja elementu tablicy odbywa się poprzez jego indeks w tablicy [w nawiasach kwadratowych] oraz nazwę tablicy Element tablicy zachowuje się jako zwykła zmienna, tj. może wystąpić po obu stronach instrukcji przypisania T [ i ] Nazwa tablicy Indeks elementu
Typowe operacje na tablicach Zapis lub odczyt wartości elementu Wyświetlanie zawartości całej tablicy Zmienna tablicowa może być użyta np. w instrukcji System.out.println() Wynik zależy od typu danych elementów tablicy Operacja przypisania wartości A=B dla zmiennych typu tablicowego (złożonego) działa inaczej niż w przypadku zmiennej typu prostego: obie zmienne będą wskazywały na tę samą tablicę w pamięci
Tablice wielowymiarowe Tablica może posiadać wiele wymiarów Każdy wymiar ma własny indeks T [n] [m] [k] Adresacja pojedynczej wartości odbywa się za pomocą konstrukcji T [ indeks 1] [indeks 2].. [indeks n]
Deklaracja tablicy wielowymiarowej poprzez wartości jej elementów
Tablice dynamiczne Rozmiar zwykłej tablicy nie może być zmieniony po jej zadeklarowaniu Jeśli z algorytmu wprost nie wynika maksymalna liczba elementów, można zastosować tablicę dynamiczną zbudowaną z użyciem klasy ArrayList Typ tablicowy Typ elementu tablicy Zmienna tablicowa
Rozmiar tablicy dynamicznej Bieżący rozmiar tablicy dynamicznej (liczbę elementów) można pobrać za pomocą funkcji.size()
Dodanie elementu do tablicy dynamicznej Dodanie elementu odbywa się za pomocą metody.add zmiennej tablicowej
Pobranie lub modyfikacja wartości elementu tablicy dynamicznej Pobranie wartości elementu poprzez indeks Zmiana wartości elementu wskazanego
Usunięcie elementu tablicy dynamicznej Wybrany element można usunąć wskazując jego indeks lub wartość Wszystkie elementy można usunąć stosując funkcję
Przejście iteracyjne po wszystkich elementach tablicy Zmienna przechowuje wartość kolejnego elementu z tablicy TS Tablica dynamiczna elementów typu String
Często wykonywane operacje na tablicach Wyszukiwanie elementu tablicy o wskazanej / minimalnej / maksymalnej wartości Sortowanie elementów tablicy Złączenie tablic
Typ danych String Jest złożonym typem danych tablica elementów typu char Różnice pomiędzy typem String a Char[] Funkcja Char[] String Liczba elementów Operacja konkatenacji + Wybrany element o indeksie k.length Zawsze taka sama Nie.size() zmienna Tak [ k ].charat( k )
Operacje typu danych String Pobranie wskazanego elementu charat( n ) Porównanie wartości metoda.compareto metoda.equals Wycinanie Metoda substring Wyszukiwanie i zamiana metody startswith, endswith metoda indexof metoda replace Inne metoda trim
Pliki Plik struktura o sekwencyjnym dostępie przeznaczona do przechowania danych w zewnętrznej pamięci komputera Zmienne w programie są przechowywane w pamięci operacyjnej RAM komputera i nie istnieją po jego wyłączeniu Plik istnieje niezależnie od stanu komputera (wł./wył.) Rozmiar pliku jest nieograniczony (maksymalny rozmiar jest narzucany przez system operacyjny) Wniosek: do operowania na plikach wymagane są odrębne mechanizmy dostępu sekwencyjnego.
Organizacja pliku Segment danych Segment danych Segment danych Segment danych. Segment danych Początek pliku Koniec pliku EOF (End Of File) Bieżąca pozycja odczytu / zapisu danych SEEK POSITION
Organizacja pliku (c.d.) Plik z punktu widzenia programu jest strumieniem danych Odczyt lub zapis danych odbywa się w pozycji bieżącej Jednocześnie można wykonać jedną z operacji: odczyt, zapis, przesunięcie pozycji bieżącej Po dokonaniu operacji bieżąca pozycja jest przesuwana o liczbę wczytanych bajtów
Format pliku Plik może zawierać dane o dowolnym typie Podział plików na tekstowe (txt, csv, cmd, xml, ) oraz binarne (com, exe, dll, bmp, jpg, ) istnieje wyłącznie z punktu widzenia użytkownika Wniosek: ten sam plik może być traktowany w zależności od potrzeb, na różne sposoby
Operacje na plikach open Otwarcie pliku read write seek Odczyt danych Zapis danych Zmiana pozycji bieżącej close Zamknięcie pliku
Zapis danych do pliku Utworzyć zmienną typu FileWriter Podać nazwę pliku Zapisać dane metodą write Obsłużyć wyjątki Zamknąć plik
Tworzenie pliku do zapisu Przy tworzeniu zmiennej typu FileWriter należy wskazać nazwę pliku wyjściowego który ma zostać utworzony, oraz opcjonalnie tryb nadpisania istniejącej zawartości System operacyjny powinien umożliwiać zapis we wskazanej lokalizacji, w przeciwnym razie zostanie zgłoszony wyjątek IOException
Zapis danych do pliku Zapis tekstu Zapis pozostałych typów jest możliwa po konwersji na String Zapis danych w postaci binarnej
Odczyt danych z pliku Otworzyć plik (nazwa, tryb) Obsłużyć wyjątki (brak pliku, dostęp zabroniony, etc.) Odczytać dane z pliku Zamknąć plik Obsłużyć wyjątki (niewłaściwy format, brak danych, koniec pliku)
Klasa FileReader Klasa FileReader realizuje odczyt danych z pliku w postaci binarnej (bajt po bajcie) Metoda read() zwraca kolejną wartość wczytaną z pliku, lub -1 jeśli plik został wczytany w całości Metoda ready() zwraca false w momencie kiedy wszystkie dane z pliku zostaną wczytane
Klasa FileReader: odczyt zawartości pliku w postaci binarnej
Klasa Scanner Klasa Scanner realizuje odczyt z pliku dla danych określonego typu Za pomocą metody hasnext () sprawdzamy, czy dana jest dostępna do odczytu hasnextint() hasnextstring() etc. Następnie za pomocą metody next...() wczytujemy ją
Klasa Scanner: odczyt danych typu String z pliku tekstowego
Przyczyny wyjątków przy odczycie z pliku Brak pliku we wskazanej lokalizacji Brak możliwości otwarcia pliku do odczytu Format wczytanych danych różni się od oczekiwanego Osiągnięto koniec pliku
Zamknięcie pliku Plik raz otwarty koniecznie musi zostać zamknięty przed rozpoczęciem kolejnej operacji Zamknięcie pliku zwalnia zasoby w programie przeznaczone do obsługi pliku, oraz pozwala na dostęp do pliku innym użytkownikom Brak instrukcji zamknięcia pliku prowadzi do błędów na różnych etapach wykonania programu, dlatego należy pilnować wykonania instrukcji close()