PROE wykład 7 kontenery tablicowe, listy. dr inż. Jacek Naruniec



Podobne dokumenty
Jak spersonalizować wygląd bloga?

Wtedy wystarczy wybrać właściwego Taga z listy.

Jak korzystać z Group Tracks w programie Cubase na przykładzie EWQLSO Platinum (Pro)

Posiadane punkty lojalnościowe można również wykorzystać na opłacenie kosztów przesyłki.

Programowanie obiektowe w C++ Wykład 11

PODSTAWY METROLOGII ĆWICZENIE 4 PRZETWORNIKI AC/CA Międzywydziałowa Szkoła Inżynierii Biomedycznej 2009/2010 SEMESTR 3

Charakterystyka systemów plików

Bazy danych. Andrzej Łachwa, UJ, /15

Warszawska Giełda Towarowa S.A.

Ogólna charakterystyka kontraktów terminowych

Informacje o omawianym programie. Założenia programu omawianego w przykładzie

14.Rozwiązywanie zadań tekstowych wykorzystujących równania i nierówności kwadratowe.

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

API transakcyjne BitMarket.pl

GEO-SYSTEM Sp. z o.o. GEO-RCiWN Rejestr Cen i Wartości Nieruchomości Podręcznik dla uŝytkowników modułu wyszukiwania danych Warszawa 2007

Zestaw skróconych instrukcji dotyczący najważniejszych operacji w programie Merkury Quattro.

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

WordPad. Czyli mój pierwszy edytor tekstu

Opisy. Ikona: Polecenie: STCFG Menu: Stal Konfiguracja

Nowe funkcjonalności

Instrukcja obsługi Pano2QTVR

Archiwum Prac Dyplomowych

System zarządzania bazą danych (SZBD) Proces przechodzenia od świata rzeczywistego do jego informacyjnej reprezentacji w komputerze nazywać będziemy

WYKŁAD 8. Postacie obrazów na różnych etapach procesu przetwarzania

Microsoft Management Console

Opis programu do wizualizacji algorytmów z zakresu arytmetyki komputerowej

2.Prawo zachowania masy

SZABLONY KOMUNIKATÓW SPIS TREŚCI

REGULAMIN SAMORZĄDU SZKOŁY W ZESPOLE SZKÓŁ IM. JANUSZA KORCZAKA W PRUDNIKU

Motywuj świadomie. Przez kompetencje.

Instrukcja obsługi Norton Commander (NC) wersja 4.0. Autor: mgr inż. Tomasz Staniszewski

Platforma zamówień personelu JOBMAN.pl

Logowanie do systemu Faktura elektroniczna

Zad.1 Pokazać pierwszeństwo trybu odmów przed zezwalaj.

CitiDirect EB - Mobile

Zmiany w programie C GEO v. 6.5

Kancelaris - Zmiany w wersji 2.50

INSTRUKCJA KORZYSTANIA Z ELEKTRONICZNEJ ŚCIEŻKI WYKAZÓW

Warunki formalne dotyczące udziału w projekcie

Czy zdążyłbyś w czasie, w jakim potrzebuje światło słoneczne, aby dotrzeć do Saturna, oglądnąć polski hit kinowy: Nad życie Anny Pluteckiej-Mesjasz?

Akademia Młodego Ekonomisty

Metoda LBL (ang. Layer by Layer, pol. Warstwa Po Warstwie). Jest ona metodą najprostszą.

STRONA GŁÓWNA SPIS TREŚCI. Zarządzanie zawartością stron... 2 Tworzenie nowej strony... 4 Zakładka... 4 Prawa kolumna... 9

Photoshopa część zaawansowana

INSTRUKCJA Panel administracyjny

PERSON Kraków

Konfiguracja historii plików

Zagospodarowanie magazynu

1% r. ZWIĄZEK OCHOTNICZYCH STRAŻY POŻARNYCH RZECZYPOSPOLITEJ POLSKIEJ KRS: % podatku na rzecz Związku OSP RP

Akademickie Centrum Informatyki PS. Wydział Informatyki PS

INSTRUKCJA DLA UCZESTNIKÓW ZAWODÓW ZADANIA

Biznesplan - Projekt "Gdyński Kupiec" SEKCJA A - DANE WNIOSKODAWCY- ŻYCIORYS ZAWODOWY WNIOSKODAWCY SEKCJA B - OPIS PLANOWANEGO PRZEDSIĘWZIĘCIA

PRÓG RENTOWNOŚCI i PRÓG

Instalacja. Zawartość. Wyszukiwarka. Instalacja Konfiguracja Uruchomienie i praca z raportem Metody wyszukiwania...

JAK INWESTOWAĆ W ROPĘ?

XIII KONKURS MATEMATYCZNY

Osoby pracujące na obszarze Starego Miasta w różnym wymiarze godzin stanowią 23% respondentów, 17% odbywa na Starówce spotkania biznesowe i służbowe.

Instrukcja programu PControl Powiadowmienia.

Architektura komputerów

Specyfikacja techniczna banerów Flash

G PROGRAMMING. Part #4

ARAKS FAKTURY Instalujemy program i wystawiamy fakturę krok po kroku, oraz co wyróżnia nasz program od innych. - 1

OptiMore Importer Rejestru VAT. Instrukcja obsługi programu

OFERTA WYKŁADÓW, WARSZTATÓW I LABORATORIÓW DLA UCZNIÓW KLAS IV- VI SZKÓŁ PODSTAWOWYCH, GIMNAZJALNYCH I ŚREDNICH

JAK ZNALEŹĆ SZUKANY PRODUKT I DOKONAĆ ZAKUPU PRZEWODNIK KROK PO KROKU

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Instalacja Plugin. Rys. 1. Folder Plugin.

Elementy cyfrowe i układy logiczne

Moduł. Rama 2D suplement do wersji Konstruktora 4.6

Vademecum selekcji, czyli jak przeglądać i oceniać swoje fotografie

enova Workflow Obieg faktury kosztowej

Informatyka, I stopień. Programowanie (PRO300.1)

INSTRUKCJA PROGRAMU BHM SPIS TREŚCI

SCENARIUSZ LEKCJI WYCHOWAWCZEJ: AGRESJA I STRES. JAK SOBIE RADZIĆ ZE STRESEM?

32. Metody badania użyteczności stron WWW

Regulamin szkolnego konkursu matematycznego dla uczniów klasy II i III: Mały Matematyk

Zmiany w wersji 1.18 programu VinCent Office.

Egzamin na tłumacza przysięgłego: kryteria oceny

Instrukcja obsługi platformy zakupowej e-osaa (klient podstawowy)

Opis modułu analitycznego do śledzenia rotacji towaru oraz planowania dostaw dla programu WF-Mag dla Windows.

Przygotowały: Magdalena Golińska Ewa Karaś

System Zarządzania Relacyjną Bazą Danych (SZRBD) Microsoft Access 2010

Wstawianie wstawianie na stronę różnych elementów (tabela, obraz, kształt, nagłówek, wordart )

Rozliczenia z NFZ. Ogólne założenia. Spis treści

III. GOSPODARSTWA DOMOWE, RODZINY I GOSPODARSTWA ZBIOROWE

I. Zakładanie nowego konta użytkownika.

Roczne zeznanie podatkowe 2015

Strategia rozwoju kariery zawodowej - Twój scenariusz (program nagrania).

PRAWA ZACHOWANIA. Podstawowe terminy. Cia a tworz ce uk ad mechaniczny oddzia ywuj mi dzy sob i z cia ami nie nale cymi do uk adu za pomoc

OSTRZEŻENIA DANE TECHNICZNE. Wbudowana bateria słoneczna oraz alkaliczna bateria manganowa (1,5 V LR44)

Komunikacja w sieci Industrial Ethernet z wykorzystaniem Protokołu S7 oraz funkcji PUT/GET

Witamy w Bibliotece Wydziału Nauk Politycznych i Dziennikarstwa. Przygotowała mgr Ewelina Pilarska

INTERAKTYWNA APLIKACJA MAPOWA MIASTA RYBNIKA INSTRUKCJA OBSŁUGI

PFR Wstępnie wypełnione zeznanie podatkowe. PIT-37 i PIT-38 za rok 2015

Spring MVC Andrzej Klusiewicz 1/18

Działania arkusz dla uczniów. Zwycięska grupa opublikuje swoja akcje na

KONKURSY SPRAWNOŚCIOWE

Likwidacja barier architektonicznych to usuwanie tego, co przeszkadza ci korzystać z budynków, chodników, ulic i innych miejsc oraz mebli i sprzętów.

INSTRUKCJA BHP MYCIA I DEZYNFEKCJI POMIESZCZEŃ, MASZYN, URZĄDZEŃ, SPRZĘTU W PLACÓWKACH HANDLOWYCH I PRODUKCYJNYCH BRANŻY SPOŻYWCZEJ.

Transkrypt:

PROE wykład 7 kontenery tablicowe, listy dr inż. Jacek Naruniec

Prosty kontener oparty na tablicach Funkcja dodawanie pojedynczego słonia do kontenera: 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej. 4. Usuwamy starą, niepotrzebną tablicę. 41 42 43 44 45 46 47

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej. 4. Usuwamy starą, niepotrzebną tablicę. 41 42 43 44 45 46 47

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej. 4. Usuwamy starą, niepotrzebną tablicę. 41 42 43 44 45 46 47

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej. 4. Usuwamy starą, niepotrzebną tablicę. 41 42 43 44 45 46 47

Prosty kontener oparty na tablicach W kodzie: Testujemy:

Prosty kontener oparty na tablicach Usunięcie ostatniego elementu analogicznie: 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy - 1. 3. Kopiujemy elementy starej tablicy do nowej. 4. Usuwamy starą, niepotrzebną tablicę. 41 42 43 44 45 46 47

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy - 1. 3. Kopiujemy elementy starej tablicy do nowej. 4. Usuwamy starą, niepotrzebną tablicę. 41 42 43 44 45 46 47

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy - 1. 3. Kopiujemy elementy starej tablicy do nowej. 4. Usuwamy starą, niepotrzebną tablicę. 41 42 43 44 45 46 47

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy - 1. 3. Kopiujemy elementy starej tablicy do nowej. 4. Usuwamy starą, niepotrzebną tablicę. 41 42 43 44 45 46 47

Prosty kontener oparty na tablicach W kodzie:

Prosty kontener oparty na tablicach Operator indeksowania zwraca referencję na konkretnego słonia: W celu wykrycia błędów można wykorzystać wyjątki:

Prosty kontener oparty na tablicach Naturalnie w tym momencie musimy zadbać o ich odpowiednie wyłapanie:

Prosty kontener oparty na tablicach Wstawienie elementu w dowolne miejsce tablicy (operacja bardzo nieefektywna w wektorach!): 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 41 42 43 44 45 46 47 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej z pominięciem żądanego indeksu. 4. Kopiujemy nowy element w żądaną pozycję. 5. Usuwamy starą, niepotrzebną tablicę.

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 41 42 43 44 45 46 47 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej z pominięciem żądanego indeksu. 4. Kopiujemy nowy element w żądaną pozycję. 5. Usuwamy starą, niepotrzebną tablicę.

Prosty kontener oparty na tablicach Tutaj przykładowo wstawiamy w pozycji 2 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 41 42 43 44 45 46 47 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej z pominięciem żądanego indeksu. 4. Kopiujemy nowy element w żądaną pozycję. 5. Usuwamy starą, niepotrzebną tablicę.

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 41 42 43 44 45 46 47 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej z pominięciem żądanego indeksu. 4. Kopiujemy nowy element w żądaną pozycję. 5. Usuwamy starą, niepotrzebną tablicę.

Prosty kontener oparty na tablicach 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 41 42 43 44 45 46 47 1. Mamy jedynie starą tablicę. 2. Tworzymy nową tablicę o wielkości aktualnej tablicy + 1. 3. Kopiujemy elementy starej tablicy do nowej z pominięciem żądanego indeksu. 4. Kopiujemy nowy element w żądaną pozycję. 5. Usuwamy starą, niepotrzebną tablicę.

Prosty kontener oparty na tablicach W kodzie:

Prosty kontener oparty na tablicach Zamieniamy w szablon! W opcjach pliku (prawy/properties) Excluded from build = Yes Tu skompiluje się plik kontener.cpp

Prosty kontener oparty na tablicach W funkcjach zamieniamy Slon na T i odpowiednio definiujemy funkcje (Kontener.cpp):

Prosty kontener oparty na tablicach

Prosty kontener oparty na tablicach Możliwe ulepszenia zależnie od potrzeb: Przy dodawaniu kolejnego elementu do tablicy od razu rezerwowanie większej ilości pamięci na kolejne elementy (tak jak zachowuje się klasa vector). Usuwanie elementu nie musi oznaczać realokacji pamięci. Można usunąć wyjątki (szybsze działanie). Można usunąć szablony aby łatwiej debugować (dlatego dobrze na początku wykonać program BEZ szablonów). Usuwanie elementów ze środka, operatory, iteratory,

Prosty kontener oparty na tablicach Zalety: Prosta struktura Szybkie jeśli od razu rezerwujemy większą ilość pamięci Wady: Częste wykonywanie new/delete Wstawianie/usuwanie elementów ze środka tablicy zawsze wymaga kopiowania całej serii elementów.

Inne podejście kontenera Stwórzmy strukturę, która składa się z obiektu (będziemy trzymać słonie) i wskaźnika na inną strukturę tego samego typu: adres (np. 30)

Inne podejście do kontenera Stwórzmy obiekty Wezel. Każdy zawiera słonia Każdy zawiera wskaźnik na inny Wezel w1 trzyma adres na w2 w2 trzyma adres na w3 w3 trzyma adres na w1

Inne podejście do kontenera w1 w2 1 2 3 4 5 6 7 11 12 a15 13 14 15 16 a32 17 21 22 23 24 25 26 27 31 32 33 a11 34 35 36 37 41 42 43 44 45 46 47 w3

Inne podejście do kontenera Stwórzmy funkcję, która przyjmuje tylko wskaźnik na jeden węzeł: Na ekran zostanie wypisane imie i adres do w2 (bo taki wpisaliśmy)

Inne podejście do kontenera Jeśli mamy adres na drugi węzeł oznacza to, że możemy wypisać także imię przypisane do drugiego węzła: Jak widać w obiekcie typu Wezel wskazywanym przez *kolejny mamy wskaźnik do ostatniego już naszego węzła

Inne podejście do kontenera W takim razie wypiszmy dane wszystkich słoni: A co jeśli po raz kolejny weźmiemy kolejny węzeł?

Inne podejście do kontenera 1 2 3 4 5 6 7 11 12 a15 13 14 15 16 a32 17 21 22 23 24 25 26 27 31 32 33 a11 34 35 36 37 41 42 43 44 45 46 47 Według naszego obrazka przeszliśmy kolejno po adresach: a15, a32, a11, a15

Inne podejście do kontenera Można sobie to wyobrazić jako dłuuugą kolejkę na basen, w której chcemy znaleźć konkretną osobę. Adam Marysia - osoba ostatnia w kolejce (Adam) zna np. drugą osobę w kolejce (Marysia) i chce, żeby Marysia wykupiła karnet na dłużej, - Adam nie chce wychodzić z kolejki, żeby nie stracić miejsca. - każdy widzi tyko osobę przed sobą. Co robi? Przekaż dalej mówi kolejnej osobie, żeby przekazała kolejnej osobie itd. aż natrafi na Marysię, aby ta kupiła karnet na dłużej (nie ma innej Marysi w kolejce). [zdjęcie kolejki z www.mathworks.com]

Inne podejście do kontenera Inaczej: wskaźnik wskaźnik wskaźnik wskaźnik

Inne podejście do kontenera A może w sposób bardziej automatyczny?

Lista To jest właśnie lista! Spróbujmy jeszcze wykonać to samo, tylko stwórzmy węzły w sposób dynamiczny (przez new, wypiszimionasloni działa identycznie jak poprzednio): Program działa identycznie (ale oczywiście adresy się zmieniają za każdym wywołaniem programu, bo nie wiemy jaki tym razem adres przydzieli system)

Lista Oczywiście obiekty należałoby skasować, bo stworzyliśmy 3 obiekty w pamięci:

Lista Ale pamiętajmy, że trzymając pierwszy obiekt możemy dostać się do każdego kolejnego, więc napiszmy funkcję, która będzie kasować wszystkie elementy mając dostęp tylko do pierwszego węzła: btw dlaczego tak jest niepoprawnie?

Lista Analogicznie mając pierwszy element możemy stworzyć nowy węzeł i zawsze wstawić go na koniec naszej listy: tworzymy nowy węzeł w pamięci przechodzimy do ostatniego węzła zmieniamy jego wskaźnik na nasz nowy węzeł ustawiamy ostatni wskaźnik na pierwszy węzeł

Lista W pamięci teraz: 1 2 3 4 5 6 7 11 12 a15 13 14 15 16 a32 17 21 22 23 24 25 26 27 31 32 33 a11 34 35 36 37 41 42 43 44 45 46 47 1 2 3 4 5 6 7 11 12 a15 13 14 15 16 a32 17 21 22 23 24 25 26 27 31 32 33 a45 34 35 36 37 41 42 43 44 45 46 a11 47

Lista Dostęp do dowolnego elementu:

Lista Wszystkie operacje możemy wykonywać mając dostęp jedynie do pierwszego węzła! Zmodyfikujmy nasz program tak, aby widzieć tylko pierwszy węzeł (bo do reszty i tak umiemy się dostać):

Lista Innymi słowy mając dostęp do jednego elementu listy możemy: stworzyć kolejne elementy listy usunąć dowolne elementy listy (albo wszystkie) uzyskać dostęp do dowolnego elementu listy Elementy listy rezydują w pamięci (bo przecież każdy element stworzyliśmy przez new), ale mamy do nich dostęp tylko pośrednio. Możemy cały czas dbać o czystość pamięci (mimo że po new nie ma od razu delete)

Lista Przedstawiona lista jest listą cykliczną jednokierunkową (ostatni element wskazuje na pierwszy): wskaźnik wskaźnik wskaźnik wskaźnik

Lista Mogą być jeszcze listy (np.): acykliczne wskaźnik wskaźnik wskaźnik wskaźnik

Lista Dwukierunkowe: wskaźnik 1 wskaźnik 2 wskaźnik 1 wskaźnik 2 wskaźnik 1 wskaźnik 2

Lista Wystarczy, że klasa kontenera będzie zawierała tylko wskaźnik na pierwszy węzeł, bo przecież i tak do pozostałych węzłów potrafimy pośrednio dotrzeć.

Lista Utworzenie pustej listy (lista acykliczna) pierwszy NULL

Lista Przejście do konkretnego węzła. W przypadku chęci dostępu do nieistniejącego elementu zwracany jest NULL. p p P = NULL

Lista Dodanie kolejnego elementu na koniec listy stworzenie nowego węzła w pamięci (przez new) przejście na koniec listy zmiana wskaźnika ostatniego węzła na adres nowo stworzonego elementu ustawienie wskaźnika ostatniego węzła na NULL

Lista Usunięcie ostatniego elementu listy Dla przykładu: Przechodzimy do węzła o indeksie 3 pierwszy Usuwamy węzeł 4 Ustawiamy p3 na NULL p0 Indeks=1 Indeks=4 Indeks=3 Indeks=2 p1 p3 p4 = NULL p2

Lista Usunięcie ostatniego elementu listy:

Lista Usunięcie elementu listy Dla przykładowego węzła o indeksie 3: Przechodzimy do węzła o indeksie 2 Zapisujemy p3 pod tmp(wskaźnik z kasowanego węzła) Usuwamy węzeł 3 pierwszy Ustawiamy p2 na tmp p0 Indeks=1 Indeks=4 Indeks=3 Indeks=2 p1 p3 p4 = NULL p2

Lista Usunięcie elementu listy

Lista Operator indeksowania i wielkość kontenera: Operator [] zwraca referencję na słonia a nie na węzeł! Powinniśmy wprowadzić metodę size(), bo liczba_elementow jest prywatna.

Lista Oczywiście porządna lista powinna mieć destruktor kasujący wszystkie elementy po kolei:

I na końcu - szablon Wszystkie obiekty Slon zamienione na TYP.

I na końcu - szablon W pliku cpp:

Lista Działanie:

Lista Dodanie dwóch list, rozdzielenie ich jest banalnie proste! pierwszy pierwszy p0 Indeks=1 p0 Indeks=1 Indeks=2 p1 Indeks=2 p1 p2 p2