STRUKTURY DANYCH. Janusz Marecki

Wielkość: px
Rozpocząć pokaz od strony:

Download "STRUKTURY DANYCH. Janusz Marecki"

Transkrypt

1 STRUKTURY DANYCH Janusz Marecki

2 Struktury danych 2

3 Słowo wstępne Słowo wstępne Jednym z istotnych zadań informatyki jest przetwarzanie i przesyłanie informacji. Realizacja tych zadań wymaga coraz bardziej skomplikowanych programów komputerowych. Duże znaczenie ma przy tym opracowanie ogólnych zasad, struktur i języków programowania. Książka STRUKTURY DANYCH Pana Janusza Mareckiego, którą mam przyjemność Państwu przedstawić dotyczy aktualnej w informatyce problematyki. Autor w sposób logiczny i systematyczny opisuje kolejne struktury danych: listy, stosy, kolejki, odwzorowania, drzewa, grafy, zbiory i słowniki. Implementację tych struktur przedstawiono jasno w języku Pascal. Ponadto każdy rozdział jest zakończony przykładem zastosowaniia omawianej struktury danych. STRUKTURY DANYCH mogą być z powodzeniem wykorzystywane w przedmiotach: podstawy informatyki, podstawy programowania lub bazy danych i wiedzy. Dobrym ćwiczeniem może być implementacja przedstawionych struktur w innych językach programowania. Niniejsza publikacja stanowi dobrą pomoc dydaktyczną dla studentów Wyższej Szkoły Informatyki i Zarządzania w Bielsku-Białej. Może być również pomocny dla studentów informatyki innych uczelni. Prof. zw. dr hab. inż. Andrzej Grzywak Dyrektor Instytutu Informatyki Politechniki Śląskiej w Gliwicach 3

4 Struktury danych 4

5 Słowo wstępne Spis treści 1 Listy Wprowadzenie Operacje ADT LIST Tablicowa implementacja ADT LIST Wskaźnikowa implementacja ADT LIST Porównanie implementacji tablicowej i wskaźnikowej Implementacja kursorowa ADT LIST. Symulacja pamięci komputera Przykład zastosowania ADT LIST Stosy Wprowadzenie Operacje ADT STACK Tablicowa implementacja ADT STACK Wskaźnikowa implementacja ADT STACK Przykład zastosowania ADT STACK Kolejki Wprowadzenie Operacje ADT QUEUE Wskaźnikowa implementacja ADT QUEUE Implementacja kolejki cyklicznej Przykład zastosowania ADT QUEUE Odwzorowania Wprowadzenie Operacje ADT MAPPING Tablicowa implementacja ADT MAPPING Listowa implementacja ADT MAPPING Przykład zastosowania ADT MAPPING Drzewa Wprowadzenie Operacje ADT TREE Tablicowa implementacja ADT TREE Implementacja ADT TREE za pomocą list dzieci Implementacja ADT TREE przez sąsiada i dziecko

6 Struktury danych 5.6 Implementacja ADT TREE przez sąsiada, dziecko i rodzica Drzewa binarne Przykład zastosowania ADT TREE Grafy skierowane Wprowadzenie Operacje ADT GRAPH Macierzowa implementacja Grafu Implementacja grafu przez listy sąsiedztwa Przykład zastosowania ADT GRAPH Zbiory Wprowadzenie Operacje ADT SET Bitowo Wektorowa implementacja ADT SET Implementacja ADT SET przez listy uporządkowane Przykład zastosowania ADT SET Słowniki Wprowadzenie Operacje ADT DICTIONARY Tablicowo-Kursorowa implementacja ADT DICTIONARY Implementacja ADT DICTIONARY przez Haszowanie Otwarte Implementacja ADT DICTIONARY przez Haszowanie Zamknięte Przykład zastosowania ADT DICTIONARY Pytania kontrolne Literatura

7 Słowo wstępne Przedmowa Na wstępie chciałbym podziękować wszystkim, którzy zdecydowali się skorzystać z tego właśnie skryptu. Omawiane tutaj zagadnienia starałem się przedstawić możliwie przejrzyście i zrozumiale. Algorytmy i implementacje przedstawione są w języku Pascal. Mimo, iż wielu programistów uważa, że jest to język, którego złoty wiek już się skończył, moim zdaniem, do prezentacji problemów informtycznych nadaje się on doskonale. Zanim zagłębimy się w same struktyry danych, chciałbym w tym miejscu podziękować wyszystkim, którzy w mniejszym, bądź większym stopniu pomogli mi przenieść zebraną podczas nauki wiedzę na kartki tego skryptu. Nie sposób tutaj kogokolwiek faworyzować, dlatego uchylę się od monotonnej listy nazwisk. Pragnę po prostu okazać moją wdzięczność i prosić Ciebie, drogi czytelniku o wyrozumiałość! Czym są struktury danych? Każdy program komputerowy korzysta z zasobów komputera, głównie z pamięci operacyjnej i procesora. Procesor, mimo iż może wykonywać skomplikowane obliczenia na liczbach zapisanych w systemie dwójkowym, nie potrafi interpretować wszystkich typów danych, które spotykamy w językach programowania. Dopiero kompilatory tłumaczą program oparty na liczbach rzeczywistych, ciągach napisów i typach wyliczeniowych na kod maszynowy kierujący pracą procesora. Dzięki temu programy stają się bardziej zrozumiałe, nawet dla samego programisty. Kompilatory zwykło się uważać za pierwsze ogniwo w łańcuchu rozwoju oprogramowania. Kolejnym etapem w tymże rozwoju było stworzenie nowych, bardziej intuicyjnych typów danych, typów, z którymi mamy kontakt na co dzień. Tak powstały struktury danych, będące poniekąd zestawieniem danych niższego poziomu, czyli znajdujących się we wcześniejszych ogniwach omawianego łańcucha. Dla przykładu weźmy omawianą w tym skrypcie strukturę kolejki. W informatyce ma ona takie samo znaczenie, jak w rzeczywistości. Przeważnie widząc kolejkę zadajemy pytanie: kto stoi na jej czele?, chcemy także wiedzieć kiedy ktoś dochodzi do kolejki, albo zostaje obsłużony. Tak sformułowane pytania będziemy kierowali bezpośrednio do struktury danych, nie przejmując się, w jaki sposób zostanie to przetłumaczone na język procesora. Komunikacja z naszą strukturą będzie więc bardzo prosta i intuicyjna. Dla kogo są struktury danych? 7

8 Struktury danych Starałem się ten skrypt napisać tak, by mógł z niego skorzystać każdy użytkownik komputera, który miał kontakt z programowaniem. Niewątpliwie dużym ułatwieniem dla czytelnika jest znajomość Pascala, w którym napisane są wszystkie zamieszczone tutaj programy. Osobiście polecam ten skrypt studentom, którzy mają za sobą wstęp do programowania i nie gubią się w typie wskaźnikowym. Programistą staje się ten, kto pisze programy, dlatego uważam, że dobrym ćwiczeniem, które pomogłoby każdemu zaznajomić się z omawianym w tym skrypcie materiałem, byłoby przetłumaczenie go na inny język programowania. Jak czytać ten skrypt? Cały skrypt podzielony jest tematycznie na 8 części, w skład których wchodzą: listy, stosy, kolejki, odwzorowania, drzewa, grafy, zbiory i słowniki. Na początku każdego rodziału, który rozpoczyna się krótkim wprowadzeniem, wypisane są wszystkie operacje, które będą charakterystyczne dla omawianej struktury danych (w przypadku kolejki, będą to operacje opisujące dodanie elementu na koniec kolejki, sprawdzenie co znajduje się na początku kolejki itp.). W dalszej części rozdziału podane są co najmniej dwa różne sposoby implementacji w Pascalu danej struktury danych wraz z jej operacjami. Każdy rozdział kończy się krótkim przykładem ilustrującym zastosowanie omawianej struktury danych. Osobiście zalecam każdemu czytelnikowi zaznajomienie się z pierwszym rozdziałem, czyli z listami, nim przejdzie on do bardziej skomplikowanych struktur danych. Ponadto dla poprawnego zrozumienia rozdziału 6, opisującego grafy, należy koniecznie przeczytać rozdział 5, związany z drzewami. Jedną z istotnych cech sztuki programowania jest przyjęcie, że żaden napisany program nie jest doskonały, zawsze można go ulepszyć i poprawić. To samo dotyczy wszystkich moich programów, które wcale nie uważam za całkowicie doskonałe. Przeciwnie, za wszelkie uwagi na ich temat będę Tobie, Drogi Czytelniku, szczerze wdzięczny! Janusz Marecki Bielsko-Biała, wrzesień 1999 roku 8

9 Listy 1 Listy 1.1 Wprowadzenie Z punktu widzenia programisty, listy są doskonałym sposobem na zorganizowanie i ułożenie danych w dobry porządek. Wynika z tego, że każdą niepustą listę charakteryzują następujące wyróżniki: Posiada element pierwszy Posiada element ostatni Każdy element listy może posiadać tylko jednego poprzednika Każdy element listy może posiadać tylko jednego następnika Trudno sobie wyobrazić dzisiejsze oprogramowanie bez istnienia list. W każdym środowisku graficznym mamy przecież do czynienia z różnego rodzaju suwakami, rozwijanymi menu, nakładającymi się kartami itp. Wykorzystanie list można bardzo wyraźnie zauważyć w systemach, które prezentują swoje dane w oknach. Stosuje się tutaj odpowiednią listę kolejności, która zawiera odnośniki do poszczególnych okien. Program, który ma za zadanie odświeżyć obraz, wywołuje funkcję rysowania dla kolejnych elementów tej listy, a użytkownik ma wrażenie, że okna są na wierzchu, lub pod spodem. W momencie kliknięcia na jakiekolwiek okno, jego odnośnik wędruje na koniec listy kolejności i wywoływany jest program odświeżający obraz. Każdy edytor tekstu jest zorganizowany przez wiele różnego rodzaju list. Kolejne linijki zapisane słowami są w rzeczywistości elementami listy, dlatego program wyświetlający tekst na ekranie musi posiadać odnośnik do pierwszego obiektu listy (w tym wypadku pierwszej linii tekstu). Przemieszczając się po tekście, aktualizujemy ten odnośnik, co wywołuje program odświeżania obrazu. W obu tych przykładach, w których stosuje się listy zaskakuje nas funkcjonalność oraz wyjątkowo prosta implementacja. Każda lista składa się z połączonych ze sobą obiektów. Z kolei każdy obiekt przechowuje dwie informacje: Merytoryczną, widoczną na zewnątrz systemu, czyli współpracującą z jego użytkownikiem np.: tekst, kolor itp. Organizacyjną, widoczną wewnątrz systemu, którą jest odnośnik (bądź kilka odnośników) do innego elementu danej listy. 9

10 Struktury danych Powyższa struktura obiektu kryje jednak w sobie dosyć istotne rozszerzenie, które jest powszechnie stosowane w programach komputerowych. Wyobraźmy sobie listę obiektów, których informacją merytoryczną są odnośniki do innych list (niekoniecznie tego samego typu). Powoduje to, że pozornie jednowymiarowa lista zawiera w sobie podlisty, które mogą z kolei dalej się rozszerzać. Powstaje w ten sposób wielowymiarowa struktura, w której można się jednak dosyć sprawnie poruszać. Przykładem może być tutaj wielopoziomowe rozwijane menu, które spotykamy w systemach WINDOWS. Gdy informacją organizacyjną jest jeden odnośnik (do poprzednika lub następnika), wówczas mówimy o liście jednokierunkowej. Gdy występują dwa odnośniki (do poprzednika i następnika) wtedy mamy do czynienia z listą dwukierunkową. Istnieje także wiele innych list, których obiekty posiadają co najmniej 2 różne odnośniki. Są to listy wielokierunkowe, lub wielokrotnie wiązane. Mówimy wtedy o powstawaniu bardziej słożonych struktur informatycznych, jak np.: drzewa lub grafy, które omówione będą później. Warto w tym miejscu zaznaczyć, że istnieje różnica między listą dwukierunkową, a listą podwójnie wiązaną. Dla każdego obiektu listy dwukierunkowej zachodzi bowiem reguła: Następnik Poprzednika = Poprzednik Następnika = Ten sam obiekt Listy jednokierunkowe posiadają jedną, dosyć ważną wadę. Jeśli jest to lista, której obiekty posiadają odnośniki do następników, wówczas każdorazowe wyznaczenie poprzednika danego obiektu wymaga przejścia niekiedy nawet całej listy, co z kolei znacznie spowalnia całą operację. Tak więc kosztem zaoszczędzenia pamięci komputera (w przypadku list jednokierunkowych ich obiekty muszą pamiętać tylko jeden odnośnik) wydłużamy czas niektórych operacji. Przy dalszych zagadnieniach dotyczących list musimy wprowadzić dwa nowe pojęcia: Head głowa listy. Tail ogon listy. Głowa i Ogon listy są bez wątpienia jej obiektami, jednak posiadają one pewne specyficzne cechy: Ich informacja merytoryczna jest nieistotna. Głowa listy nie posiada odnośnika do swojego poprzednika, a Ogon do następnika 10

11 Listy Rysunek 1 Schemat jednokierunkowej listy wskaźnikowej z głową i ogonem Jeśli założymy, że nasza lista posiada zarówno Głowę jak i Ogon, wówczas nawet lista pusta będzie się składała z dwóch obiektów, bowiem Head i Tail nie mogą zostać z niej usunięte. Wprowadzenie Head i Tail znacznie upraszcza implementację listy i zwiększa jej niezawodność, gdyż nie musimy się przejmować w którym miejscu dodajemy obiekt, bądź też z którego miejsca go usuwamy. Przy tworzeniu większych aplikacji dużą wygodą jest posiadanie gotowego zestawu funkcji operujących na listach. W dalszej części tego rozdziału stworzymy nowy typ danych typ listowy: ADT LIST (Abstract Data Type LIST). 11

12 Struktury danych 1.2 Operacje ADT LIST Każdy nowy typ danych posiada zestaw procedur i funkcji, które go obsługują i modyfikują. Ponadto zmienne nowego typu posiadają szereg parametrów, bez których nie mogłyby istnieć. Na początku należy wprowadzić dwa typy: ElementType jest to rodzaj informacji merytorycznej zawartej w obiektach listy Position jest to pozycja w liście, która w zależności od rodzaju implementacji może być typu wskaźnikowego lub wyliczeniowego Należy jeszcze zapoznać się z pojęciem Pozycji za ostatnim elementem. Jeśli pozycja ostatniego elementu jest dla nas zrozumiała, to jej następnik jest właśnie Pozycją za ostatnim elementem. W implementacji znajdują się także dwie wartości stałe: EmptyElement typu ElementType jest to pusty element (jego informacja merytoryczna nie istnieje) NullPosition typu Position jest to oznaczenie nieistniejącej pozycji. Teraz możemy już wyróżnić podstawowe funkcje ADT LIST: function _END(L : List) : Position; Funkcja ta zwraca pozycję elementu za ostatnim w liście L, która jest różnie zdefiniowana w zależności od implementacji ADT LIST function INSERT(X : ElementType; P : Position; L : List) : Position; Funkcja wstawia do listy L element X na pozycję określaną przez P. Jeśli operacja się powiodła, zwraca wskaźnik do dodanego elementu w liście L. Jeśli operacja się nie powiodła, zwraca wskaźnik do elementu za ostastnim w liście L. function DELETE(P : Position; L : List) : Position; Funkcja usuwa element wskazywany przez P w liście L. Jeśli operacja się powiowła, zwracany jest wskaźnik do głowy listy L. Jeśli operacja się nie powiodła, zwracany jest wskaźnik do elementu za ostatnim w liście L. function FIRST( L : List) : Position; Jeśli lista L istnieje, funkcja ta zwraca wskaźnik do jej głowy. Jeśli lista L nie istnieje (co oznacza, że nie posiada głowy), wówczas zwracana jest NullPosition. function NEXT(P : Position; L : List) : Position; Funkcja zwraca wskaźnik do elementu następnego w stosunku do wskazywanego przez P w liście L, jeśli oczywiście następnik istnieje. Jeśli P wskazuje na element ostatni, wówczas zwracana jest pozycja zo ostatnim. 12

13 Listy function PREVIOUS(P : Position; L : List) : Position; Funkcja zwraca wskaźnik do elementu poprzedniego w stosunku do wskazywanego przez P w liście L, jeśli oczywiście poprzednik istnieje. Jeśli P jest głową listy L, wówczas zwracana jest NullPosition. function LOCATE(X : ElementType; L : List) : Position; Funkcja ta znajduje element X w liście L. Jeśli element X występuje, wówczas zwracana jest jego pozycja w liście. Jeśli elementu X nie ma, funkcja zwraca pozycję za ostatnim. function RETRIEVE(P : Position; L : List) : ElementType; Funkcja zwraca element znajdujący się na pozycji P w liście L. Jeśli pozycja P jest pozycją pustą (nie zawiera informacji merytorycznej) wtedy funkcja zwraca EmptyElement. function INIT_LIST( L : List) : Position; Funkcja ta jest odpowiedzialna za inicjację listy. Tworzy ona głowę listy L i zwraca jej pozycję. Gdy w komputerze występuje brak pamięci, funkcja ta zatrzymuje wykonywanie programu. procedure MAKENULL_LIST( L : List); Procedura ta jest odpowiedzialna za usunięcie wszystkich elementów listy L oprócz jej głowy. procedure DESTROY_LIST( L : List); Procedura ta usuwa wszystkie elementy listy L razem z jej głową. Po jej wywołaniu zwalniana jest cała pamięć, którą zajmowała lista L. Oprócz wymienionych wcześniej procedur i funkcji często stosuje się funkcje pomocnicze: function PRINTLIST(P : Position; L : List) : Position; Funkcja wypisuje element listy L znajdujący się na pozycji P i zwraca pozycję poprzednika P. W przypadku, gdy element na pozycji P nie istnieje, zwracana jest EmptyPosition. function INLIST(X : ElementType; L : List) : Integer; Funkcja ta zwraca ilość wystąpień elementu X w liście L. W dalszej części tego rozdziału pokazane zostaną trzy podstawowe implementacje typu listowego: Tablicowa Wskaźnikowa Kursorowa 13

14 Struktury danych Rysunek 2 - Połączenie listy wskaźnikowej i kursorowej. Pierwsza lista zawiera kursory do pierwszego i ostatniego elementu drugiej listy 14

15 Listy 1.3 Tablicowa implementacja ADT LIST Główną wadą tej implementacji jest to, że niezależnie od rozmiaru listy, zajmuje ona zawsze tą samą ilość pamięci. W nagłówku programu należy zdefiniować stałą MaxLenght, która określa maksymalny rozmiar listy. W implemantacji tablicowej lista ma postać rekordu. Rekord ten składa się z: Tablicy Elements zawierającej MaxLength elementów typu ElementType Zmiennej Last typu integer, która jest ostatnią pozycją listy xlength ement ement t) element ściwa lista wykorzystana pamięć W tej implementacji pozycja jest kursorem do danego elementu. Nie stosuje się więc głowy listy, a pozycja za ostatnim elementem jest równa Last+1. Nagłowek naszej implementacji wygląda następująco: const MaxLength = 1000; EmptyElement = ''; type Position = integer; ElementType = String[10]; List = Record Elements : array[1..maxlength] of ElementType; Last : Position; Teraz przyjrzyjmy się głównym funkcjom w tej implementacji: function _END(L : List) : Position; _END := L.Last+1; function INSERT(X : ElementType; P : Position; L : List) : Position; VAR Q : Position; if L.Last >= MaxLength then write('lista pelna!'); 15

16 Struktury danych INSERT := _END(L); end else if (P < 1) or (P > L.Last+1) then write('pozycja nie istnieje! (INSERT)'); INSERT := _END(L); end else for Q := L.Last downto P do L.Elements[Q+1] := L.Elements[Q]; {Przesunięcie elementów w } {prawo} L.Elements[P] := X; {Wstawienie elementu X na pozycję P} L.Last := L.Last+1; {Zwiększenie długości listy} INSERT := P; {INSERT} function DELETE(P : Position; L : List) : Position; Q : Position; if (P < 1) or (P>L.Last) then write('pozycja nie istnieje (DELETE)'); DELETE := _END(L); end else Q := P; while Q < L.Last do L.Elements[Q] := L.Elements[Q+1]; {Przesunięcie elementów w } {lewo} Q := Q+1; {Element na pozycji Q zostanie zamazany} L.Elements[L.Last] := EmptyElement; {usunięcie niepotrzebnego } {elementu} L.Last := L.Last-1; {skrócenie listy} DELETE := 1; {DELETE} function FIRST( L : List) : Position; if L.Last = 0 then {Lista jest pusta, jej długość = 0 } FIRST := _END(L) else FIRST := 1; 16

17 Listy function NEXT(P : Position; L : List) : Position; if P >= L.Last then NEXT := _END(L) else NEXT := P+1; {FIRST} {P nie posiada następnika} function PREVIOUS(P : Position; L : List) : Position; if P <= 1 then {P nie posiada poprzednika} PREVIOUS := _END(L) else PREVIOUS := P-1; function LOCATE(X : ElementType; L : List) : Position; Q : Position; LOCATE := _END(L); for Q:=1 to L.Last do {Sprawdzenie wszystkich elementów listy} if L.Elements[Q] = X then {Element został znaleziony} LOCATE := Q; function RETRIEVE(P : Position; L : List) : ElementType; RETRIEVE := EmptyElement; if (P >= 1) and (P <= L.Last) then {Jeśli pozycja znajduje się wewnątrz } {listy} RETRIEVE := L.Elements[P] else write('pozycja nie istnieje (RETRIEVE)'); procedure INIT_LIST( L : List); L.Last := 0; {Lista nie ma głowy, więc nie posiada żadnych } {elementów} {INIT} function MAKENULL_LIST( L : List) : Position; 17

18 Struktury danych Q : Position; Q := 1; while Q <= L.Last do {pętla dopóki istnieje pierwszy element} DELETE(Q,L); {usunięcie pierwszego elementu listy} MAKENULL := _END(L); {MAKENULL_LIST} W implementacji tablicowej nie stosuje się funkcji DESTROY_LIST, bowiem nie jest możliwe zwolnienie pamięci, która jest przydzielana w momencie uruchamiania programu. 18

19 Listy 1.4 Wskaźnikowa implementacja ADT LIST Jest to w pełni dynamiczna implementacja, dzięki czemu pamięć przydzielana jest obiektom listy w trakcie działania programu. Będzie zatem konieczne użycie typu wskaźnikowego. W tej implementacji listą jest wskaźnik do głowy. Nim jednak zdefiniujemy wszystkie funkcje na bazie listy dwukierunkowej z głową, wprowadzimy pewną zmianę do pojęcia Pozycji. W naszej implementacji pozycją elementu X będzie wskaźnik do elementu poprzedniego. Tak więc: Głowa listy nie będzie miała określonej pozycji Jako pozycję pierwszego elementu listy (posiadającego informację merytoryczną) będziemy rozumieli wskaźnik do głowy Wskaźnik do ostatniego elementu listy (posiadającego informację merytoryczną) będzie zarazem pozycją za ostatnim elementem. Rysunek 3 - Lista dwukierunkowa z głową Na rysunku nr 3 pokazany jest prosty przykład. Pozycją elementu A jest wskaźnik p, elementu B jest wskaźnik q, itd. Chcąc usunąć element C będziemy usuwali element na pozycji r. Pozycją za ostatnim elementem jest s. Ponadto wskaźnik Next będzie określał następnika danego elementu, a wskaźnik Previous poprzednika danego elementu. Dlatego p = q^.previous s = r^.next p^.previous = Nil itp. Niech ElementType będzie typu integer. Nagłówek implementacji wskaźnikowej wygląda następująco: const EmptyElement=0; NullPosition = nil; type ElementType = integer; Position = ^CellType; CellType = record Element : ElementType; Next,Previous : Position; 19

20 Struktury danych List = Position; {Lista jest wskaźnikiem do głowy} Zdefiniujemy teraz wszystkie operacje ADT LIST: function _END( L : List) : Position; Q : Position; Q := L; {Ustawiamy wskaźnik Q na głowę listy L} while Q^.Next <> nil do {Przesuwamy się aż do ostatniego elementu} Q := Q^.Next; _END := Q; function INSERT(X : ElementType; P : Position; L : List) : Position; {Wstawiamy element X za pozycją P} VAR Q : Position; new(q); if Q = nil then writeln('blad przydzialu pamieci'); INSERT := nil; end else Q^.Element := X; {Przypisujemy wartość X nowemu obiektowi} Q^.Next := P^.Next; {Aktualizujemy wskaźniki Next } P^.Next := Q; {dla obiektów P oraz Q } Q^.Next^.Previous := Q; {Aktualizujemy wskaźniki Previous } Q^.Previous := P; {dla obiektów Q^.Next oraz Q } INSERT := P; {Zwracamy pozycje X} function DELETE(P : Position; L : List) : Position; VAR Q : Position; Q := P^.Next; {Kasujemy element na pozycji P, wskazywany przez Q} if Q <> nil then P^.Next := P^.Next^.Next; {Na pozycji P będzie teraz następnik Q} if Q^.Next <> nil then Q^.Next^.Previous := P; {Jeśli usuwany element nie był ostatni, } {, to jego następnik będzie posiadał nowego poprzednika} dispose(q); {usunięcie elementu z pozycji P} 20

21 Listy DELETE := L; end else DELETE := nil; end {funkcja zwróci głowę nowej listy} {Usunięcie elementu nie jest możliwe} function FIRST( L : List) : Position; FIRST := L; function NEXT(P : Position; L : List) : Position; if P^.Next <> nil then NEXT := P^.Next else NEXT := nil; function PREVIOUS(P : Position; L : List) : Position; if P^.Previous <> nil then PREVIOUS := P^.Previous else PREVIOUS := nil; {Jeśli P ma następnika} {Jeśli P ma poprzednika} function LOCATE(X : ElementType; L : List) : Position; Q : Position; LOCATE := _END(L); Q := L; {Zaczynamy poszukiwania od pierwszej pozycji, czyli głowy} while Q^.Next <> nil do {Sprawdzamy wszystkie pozycje} if Q^.Next^.Element = X then {Jeśli X jest na pozycji Q} LOCATE := Q; Q := Q^.Next; function RETRIEVE(P : Position; L : List) : ElementType; if (P^.Next = nil) or (P = nil) then {Sprawdzamy poprawność pozycji} 21

22 Struktury danych RETRIEVE := EmptyElement else RETRIEVE := P^.Next^.Element; {Pobieramy element z pozycji P} function INIT_LIST( L : List) : Position; new(l); {Dynamiczne stworzenie głowy listy L} if L = nil then writeln('blad inicjacji listy'); L^.Next := nil; {Głowa listy L nie posiada następnika} L^.Previous :=nil; {Głowa listy L nie posiada poprzednika} INIT_LIST := L; procedure MAKENULL_LIST( L : List); while L^.Next <> nil do {Jeśli głowa listy L będzie miała jeszcze } {następnika} DELETE(L,L); {Usuwamy element z pierwszej pozycji, jaką jest } { głowa listy} procedure DESTROY_LIST( L : List); MAKENULL_LIST(L); {Usunięcie elementów z wszystkich pozycji} dispose(l); {Usunięcie głowy listy} function INLIST(X : ElementType; L : List) : Integer; P : Position; Temp : Integer; Temp :=0; {Ustawiamy licznik występowania X w liście L na 0 } P := FIRST(L); while P <> _END(L) do if RETRIEVE(P,L) = X then {Sprawdzamy, czy X jest na pozycji P} Inc(Temp); P := NEXT(P,L); {Przesuwamy się na następną pozycję} INLIST := Temp; 22

23 Listy 1.5 Porównanie implementacji tablicowej i wskaźnikowej Z zależności od potrzeb użytkownika, jak również możliwości sprzętowych należy zawsze wybrać jedną z dwóch przedstawionych implementacji typu listowego. W poniższej tabeli zestawiono główne czynniki przemawiające za i przeciw każdej z implementacji: lementacja tablicowa Operacje PREVIOUS oraz _END zajmują stały czas niezależnie od wielkości listy Dla globalnej tablicy nie musimy się obawiać przypadkowego naruszenia listy przez inne funkcje Nie trzeba pamiętać wskaźników lementacja wskaźnikowa ZALETY Wykorzystujemy zawsze tyle pamięci, ile potrzebuje dana lista Nie ma potrzeby określania ilości potrzebnej pamięci przed uruchomieniem programu WADY Konieczność określenia W miarę powiększania się rozmiaru tablicy przed rozmiarów listy, operacje uruchomieniem programu Może prowadzić do PREVIOUS i _END zajmują coraz więcej czasu (dla list marnotrawienia pamięci, jednokierunkowych) gdyż liczba elementów listy Zachodzi niebezpieczeństwo bywa czasem mniejsza od naruszenia struktury listy liczby elementów, dla których przy korzystaniu z tych wcześniej zarezerwowaliśmy samych wskaźnikow na pamięć Szybkość operacji INSERT zewnątrz i wewnątrz funkcji Jeśli informacja merytoryczna oraz DELETE maleje wraz ze zajmuje mało pamięci, wzrostem ilości elementów listy wówczas na rozmiar listy wpływa pamięć zajmowana przez wskaźniki WNIOSKI lementacja idealna dla dużych list, jeślilementację tę należy stosować w iemy jakich będą one rozmiarów. Nie ażdym przypadku, kiedy nie wiemy ależy jej stosować, jeśli wykorzystujemy kich rozmiarów może być lista. Należy ylko część z góry zadeklarowanej amiętać, że wskaźniki także zajmują blicy. amięć, której w trakcie wykonywania ogramu może nagle zabraknąć. 23

24 Struktury danych 1.6 Implementacja kursorowa ADT LIST. Symulacja pamięci komputera Implementacja kursorowa, to w rzeczywistości symulacja wskaźników w tablicy. Każdą listę możemy więc utożsamiać z ciągiem indeksów (kursorów) pewnej tablicy globalnej w tym przypadku tablicy SPACE, a w przypadku ogólnym pamięci komputera. Każda komórka tablicy SPACE przechowuje dwie informacje: Merytoryczną czyli istotną dla użytkownika programu Organizacyjną, którą jest pojedynczy kursor (indeks) do innej komórki tablicy SPACE. Lista jest więc kursorem do komórki tablicy SPACE. W implementacji będziemy stosowali listy z głowami, dlatego komórka, która będzie wskazywana przez głowę będzie posiadała bezużyteczną informację merytoryczną. Z kolei komórka, która zamiast adresu swojego następnika będzie przechowywała adres 0 (zerowy) będzie oznaczała, że w tym miejscu kończy się jakaś lista. Ponadto w przestrzeni SPACE będzie zawsze istniała lista komórek wolnych, której głową będzie kursor Avialable. Wszystkie te prawidła przedstawia rysunek nr 4. Rysunek 4 - Przestrzeń dla komórek różnych list Łatwo zauważyć, że w przedstawionym modelu pamięci występują tylko trzy wolne komórki pamięci. Są to trzy dowolnie wybrane kursory z listy Avialable. 24

25 Podobnie jak w przypadku wskaźnikowej implementacji listy, także tutaj stosujemy pojęcie pozycji elementu jako kursora do poprzednika tego elementu. Listy W kursorowej implementacji listy istnieje elementarna funkcja: Function MOVE( P,Q : Cursor) : boolean Która powoduje oderwanie pierwszej komórki wskazywanej przez kursor P i dołączenie jej na początek listy wskazywanej przez kursor Q. Sytuację tą przedstawia rysunek nr 5. Rysunek 5 - Funkcja MOVE dla przestrzeni komórek SPACE łówek kursorowej implementacji ADT demonstracji obszaru pamięci SPACE IST wygląda następująco: rzyjmujemy zmienne globalne: Const MaxLength = 1000; EmptyElement = ''; Type ElementType = string[10]; Cursor = integer; CellType = record Element : ElementType; Next : Cursor; List = Cursor; SPACE : ARRAY[1..MaxLength] of CellType; Avialable,L1,L2 : List; oraz L2 będą przykładowymi listami. Pozostaje nam zdefiniować wszystkie potrzebne funkcje: procedure INITIALIZE; k : Cursor; {Inicjalizacja obszaru pamięci SPACE} 25

26 Struktury danych for k := MaxLength-1 downto 1 do SPACE[k].Next := k+1; {Łączenie komórek w jedną listę Avialable} SPACE[MaxLength].Next := 0; {Ustalenie końca listy Avialable } Avialable := 1; {Ustalenie głowy listy Avialable} function MOVE( P,Q : Cursor) : boolean; TempCursor : Cursor; {Tymczasowy kursor, który zachowa wartość Q} if P = 0 then writeln('komorka nie istnieje!'); MOVE := false; end else TempCursor := Q; Q := P; {Aktualizacja kursora Q} P := SPACE[P].Next; {Aktualizacja kursora P} SPACE[Q].Next := TempCursor; {Aktualzacja następnika kursora Q} MOVE := true; function INIT_LIST( L : List) : boolean; L := 0; INIT := false; if MOVE(Avialable,L) = false then writeln('blad przy inicjacji listy : Brak wolnej pamieci'); else INIT := true; {Zmiana kursora L występuje przy jednoczesnym przesunięciu głowy } {listy Avialable na wskazywany przez nią kursor} function FIRST(L : List) : Cursor; FIRST := L; function NEXT(P : Cursor; L : List) : Cursor; if SPACE[P].Next = 0 then {komórka wskazuje koniec listy} writeln('blad przy funkcji NEXT : Wyjscie poza zakres listy'); NEXT := 0; end else NEXT := SPACE[P].Next; 26

27 Listy function PREVIOUS(P : Cursor; L : List) : Cursor; C : Cursor; C := FIRST(L); PREVIOUS := 0; if P = C then {Głowa nie posiada poprzednika} writeln('blad przy funkcji PREVIOUS : Wyjscie poza zakres listy') else {Przemieszczamy się kursorami począwszy od głowy} while (SPACE[C].Next <> P) and (C<>0) do { listy, aż następnikiem } C := NEXT(C,L); {będzie P} PREVIOUS := C; function _END( L : List) : Cursor; C : Cursor; C := L; {Ustawiamy kursor C na głowie listy L} while SPACE[C].Next <> 0 do C := NEXT(C,L); {Przesuwamy się na } _END := C; {koniec listy L} function INSERT(X : ElementType; P : Cursor; L : List) : Cursor; VAR C : Cursor; {C jest kursorem do następnika P} if P = _END(L) then C := 0 {Wstawianie X na koncu listy L} else C := SPACE[P].Next; {Wstawianie X nie na koncu listy L} if MOVE(Avialable,C) then {C będzie nową pustą komórką} SPACE[C].Element := X; {Przypisanie X do komórki wskazywanej } {przez C} SPACE[P].Next := C; {Połączenie listy L w jedną całość} INSERT := P; end else writeln('blad przy wstawianiu do listy : Brak Pamieci'); INSERT := 0; {INSERT} 27

28 Struktury danych function DELETE(P : Cursor; L : List) : Cursor; if P <> _END(L) then {Usuwany element nie jest za ostatnim } MOVE(SPACE[P].Next,Avialable); DELETE := FIRST(L); procedure MAKENULL_LIST( L : List); while L <> _END(L) do DELETE(L,L); {Usuwamy zawsze pierwszy } {element listy L, pozostaje jedynie głowa listy L} procedure DESTROY_LIST( L : List); MAKENULL(L); MOVE(L,Avialable); {Usuwamy głowę listy L} function LOCATE(X : ElementType; L : List) : Cursor; Q : Cursor; LOCATE := _END(L); Q := L; while Q <> _END(L) do {Przeszukujemy całą listę od pierwszej pozycji} if SPACE[SPACE[Q].Next].Element = X then LOCATE := Q; {X znajduje się na pozycji Q} Q := NEXT(Q,L); {Przejście na następną pozycję} function RETRIEVE(P : Cursor; L : List) : ElementType; if P = _END(L) then writeln('blad odczytu listy : element nie istnieje'); RETRIEVE := EmptyElement; end else RETRIEVE := SPACE[SPACE[P].Next].Element; {Pobranie elementu znajdującego się na pozycji P} 28

29 Listy Dynamiczne tworzenie list w kursorowej implementacji ADT LIST przedstawia przykład:... INITIALIZE; {Inicjalizacja przestrzeni komórek SPACE} INIT_LIST(L1); {Inicjalizacja pierwszej listy} INIT_LIST(L2); {Inicjalizacja drugiej listy} INSERT('Jan',_END(L1),L1); INSERT('Marek',FIRST(L1),L1); {Modyfikacje list} INSERT('Danuta',_END(L2),L2); INSERT('Ewa',NEXT(FIRST(L1),L1),L1); DESTROY_LIST(L1); {Usunięcie pierwszej listy} DESTROY_LIST(L2); {Usunięcie drugiej listy}... 29

30 Struktury danych 1.7 Przykład zastosowania ADT LIST Przygotowanie biblioteki zawierającej operacje na listach procentuje, gdyż pozwala programiście zaoszczędzić wiele czasu. Podczas dalszych prac nad programem może on posługiwać się stabilnym i przejrzystym zestawem instrukcji bez wnikania w szczegóły implementacji. Poniżej znajduje się funkcja, która usuwa z listy duplikaty: procedure PURGE( L : List); P,Q : Position; P := FIRST(L); while P <> _END(L) do Q := NEXT(P,L); while Q <> _END(L) do if RETRIEVE(P,L) = RETRIEVE(Q,L) then DELETE(Q,L) else Q := NEXT(Q,L); P := NEXT(P,L); Jak widać jest ona przejrzysta i zrozumiała. 30

31 Stosy 2 Stosy 2.1 Wprowadzenie Stos (Stack) jest elementarną strukturą przechowywania danych. W językach niskiego poziomu (np. Assembler) spotykamy instrukcje, które bezpośrednio się do niego odwołują. Każdy program napisany w języku proceduralnym potrzebuje do działania pewnej podręcznej pamięci, w tym wypadku właśnie stosu. Przy zagłębianiu się w procedurę na stosie umieszczane są wartości zmiennych występujących w programie, oraz aktualna zawartość rejestrów mikroprocesora. Po obsłużeniu takiej procedury, ze stosu w odwrotnej kolejności pobierane są stare wartości i program wykonywany jest dalej. Warto przy tym dodać, że ilość pamięci, która zostanie zarezerwowana dla stosu jest ustalana przez programistę. Gdy podczas działania programu pamięci tej zabraknie, wówczas wystąpi przepełnienie stosu i przerwanie działania programu. Każdy stos jest odmianą kolejki LIFO Last In First Out co oznacza, że ostatni element, który umieścimy na stosie będzie pierwszym elementem, którego będziemy mogli z niego zdjąć. Sytuaję tą przedstawia rysunek nr 6. Rysunek 6 - Odwrócenie kolejności przy użyciu Stosu Stos służy także do zapamiętywania ciągu poleceń dla linii tekstu. Możemy bowiem przyjąć dwa specjalne symbole: # kasuje znak kasuje wszystkie znaki poprzedzające w linii Wówczas umieszczony na stosie ciąg znaków a@bc#de#a oznacza bda. Za takie przetworzenie danych będzie odpowiadać specjalna procedura: EDIT. W tym rozdziale zdefiniujemy nowy typ danych ADT STACK, z którego będziemy mogli korzystać w późniejszych programach. 2.2 Operacje ADT STACK 31

32 Struktury danych Każda prawidłowa implementacja stosu powinna zawierać takie funkcje jak: function EMPTY(S : pointer) : boolean; Funkcja zwraca wartość logiczną, która mówi czy stos S jest pusty. function TOP( S : pointer) : ElementType; Funkcja zwraca wartość elementu znajdującego się na górze stosu S. Element ten jednak pozostaje nienaruszony. procedure POP( S : pointer); Procedura ta zdejmuje (usuwa) ze stosu pierwszy element, jeśli oczywiście stos nie jest pusty. procedure PUSH(X : ELEMENTTYPE; S : pointer); Procedura umieszcza na stosie S element X. Jeśli wystąpi przepełnienie stosu S, program powinien się zatrzymać. procedure MAKENULL_STACK( S : pointer); Procedura ta usuwa ze stosu S wszystkie jego elementy. Sama informacja o istnieniu stosu pozostaje. Ponadto w implementacji wskaźnikowej zdefiniujemy kilka innych procedur: procedure INIT_STACK( S : pointer); Procedura inicjująca stos S. W pamięci tworzony jest ogon nowego stosu. procedure DESTROY_STACK( S : pointer); Procedura, która fizycznie usuwa z pamięci wszystkie elementy związane ze stosem S (zniszczeniu ulega także ogon stosu). Z uwagi na fakt, że przy operacji na stosie często występują programowe wyjątki zdefiniujemy także globalny rejestr flagowy FlagRegister, jako 3 elementową tablicę, o wartościach 1 - błąd oraz 0 wszystko w porządku. FlagRegister[1] - Operacja TOP(S), gdy stos jest pusty FlagRegister[2] - Operacja POP(S), gdy stos jest pusty FlagRegister[3] - Operacja PUSH(X,S), gdy stos jest pelny 32

33 Kolejki 2.3 Tablicowa implementacja ADT STACK W tablicowej implementacji Stos jest Rekordem zawierającym tablicę Elements typu ElementType, oraz zmienną Top typu integer, która określa numer pierwszego elementu stosu. Zapełnianie tej tablicy (przez odkładanie na stos kolejnych elementów) odbywa się począwszy od Top = MaxLength, aż do Top = 1. Dla Top = 1 stos będzie pełny. Gdy wystąpi Top > MaxLength, wtedy stos będziemy traktowali jako pusty. Sytuację tą przedstawia poniższy schemat: xlength... wszy element gi element atni element zar wolny zar zajęty Nagłówek tablicowej implementacji stosu wygląda następująco: const MaxLength = 1000; {Maksymalna wielkość stosu} type FlagRegister = array[1..3] of byte; ElementType = integer; {Typ informacji merytorycznej} STACK = record Top : integer; Elements : array[1..maxlength] of ElementType; FR : FLAGREGISTER; {Definiowany globalnie rejestr flagowy} Poniżej przedstawiona jest implementacja wszystkich funkcji ADT STACK. procedure MAKENULL_STACK( S : STACK); S.Top := MaxLength+1; {Stos staje się pusty, Top wskazuje na } {element poza stosem} function EMPTY(S : STACK) : boolean; EMPTY := S.Top > MaxLength; {Porównanie Top oraz MaxLength } procedure POP( S : STACK); 33

34 Struktury danych if EMPTY(S) then FR[2] := 1; ERROR; end else S.Top := S.Top+1; {Modyfikacja rejestru flagowego} {Przerwanie wykonywania programu} {Top zbliżył się o 1 do wartości MaxLength} function TOP( S : STACK) : ElementType; if EMPTY(S) then FR[1] := 1; {Z pustego stosu nie możemy pobrać żadnej wartości} ERROR; end else TOP := S.Elements[S.Top]; {Pobranie elementu z góry stosu} procedure PUSH(X : ElementType; S : STACK); if S.Top = 1 then {Stos jest pełny} FR[3] := 1; ERROR; end else S.Top := S.Top-1; {Zmienna Top zbliża się do 1} S.Elements[S.Top] := X; {Umieszczenie X na odpowiednim miejscu } {tablicy Elements} 34

35 Kolejki 2.4 Wskaźnikowa implementacja ADT STACK Implementacja ta jest całkowicie dynamiczna, dzięki czemu stos zajmuje tylko tyle pamięci operacyjnej komputera, ile jest aktualnie potrzebne. Wyróżniamy tutaj wyraźnie ogon stosu, jako stały element stosu nie posiadający informacji merytorycznej. Przy inicjacji stosu tworzony jest więc nowy obiekt, którego wskaźnik jest nil. W miarę odkładania na stos kolejnych elementów, ich wskaźniki łączą się szeregowo. Wskaźnik do stosu jest zarazem wskaźnikiem do szczytu stosu, co przedstawia rysunek nr 7. Rysunek 7 - Wskaźnikowa implementacja stosu Nagłówek dla tej implementacji ADT STACK wygląda następująco: type ElementType = integer; FlagRegister = array[1..3] of byte; pointer = ^CELL; {typ pointer jest wskaźnikiem do stosu} Stack = pointer; CELL = record Next : pointer; Element : ElementType; FR : FLAGREGISTER; {Definiowany globalnie rejestr flagowy} Poniżej przedstawione są funkcje dla wskaźnikowej implementacji stosu. function EMPTY(S : pointer) : boolean; pom : pointer; 35

36 Struktury danych pom := S; {Ustawiamy wskaźnik pomocniczy pom na górę stosu} while pom^.next <> nil do {Przechodzimy wgłąb stosu aż do ogona} pom := pom^.next; EMPTY := pom = S; {Jeśli wskaźnik stosu pokrywa się z ogonem, to } {stos jest pusty} procedure POP( S : pointer); pom : pointer; if EMPTY(S) then {jeśli stos jest pusty, sygnalizuj błąd} FR[2] := 1; ERROR; end else pom := S; S := S^.Next; {Na szczycie stosu jest teraz następnik S} dispose(pom); {Usuwamy z pamięci stary szczyt stosu} procedure PUSH(X : ElementType; S : pointer); pom : pointer; new(pom); {Alokacja pamięci dla nowego obiektu} if pom = nil then {brak wolnej pamieci, stos jest już pelny} FR[3] := 1; ERROR; end else pom^.next := S; {Następnikiem nowego elementu będzie } {dotychczasowy szczyt stosu S} pom^.element := X; {Przypisanie wartości X nowemu elementowi } {pom} S := pom; {Element pom staje się nowym szczytem stosu} function TOP( S : pointer) : ElementType; if EMPTY(S) then {Stos jest pusty, nie można pobrać elementu z } FR[1] := 1; {jego szczytu} ERROR; end else TOP := S^.Element; {Pobranie elementu ze szczytu stosu S} 36

37 Kolejki procedure INIT_STACK( S : pointer); new(s); {Stworzenie ogona stosu, który jest aktualnie jego szczytem} S^.Next := nil; {Ogon stosu nie posiada następnika} procedure MAKENULL_STACK( S : pointer); while not EMPTY(S) do POP(S); {Dopóki stos nie będzie pusty,będziemy} { z niego zdejmowali kolejne elementy, pozostanie tylko ogon} procedure DESTROY_STACK( S : pointer); MAKENULL_STACK(S); {Zdjęcie wszystkich elementów ze stosu S} dispose(s); {Usunięcie ogona stosu S} 37

38 Struktury danych 2.5 Przykład zastosowania ADT STACK Przy pomocy zdefiniowanych operacji ADT STACK możemy zbudować procedurę EDIT omawianą na początku tego rozdziału. procedure EDIT( S : STACK; Str : EditString); {typ EditString jest łańcuchem znaków} {Str jest wejściowym ciągiem znaków} L : integer; C : char; MAKENULL_STACK(S); for L := 1 to Length(Str) do {Sprawdzamy kolejno wszystkie znaki ciągu Str } C := Str[L]; if C = '#' then POP(S) {Wymazujemy ostatni znak} else if C = '@' then MAKENULL_STACK(S) {Wymazujemy wszystkie dotychczasowe znaki} else PUSH(C,S); {Umieszczamy na stosie S znak C } 38

39 Kolejki 3 Kolejki 3.1 Wprowadzenie Przy wyjaśnianiu zasady funkcjonowania kolejki pomocna okazuje nam się intuicja. Kolejkę możemy traktować jako listę jednokierunkową z głową i ogonem. W tym przypadku głowę będziemy traktować jak przód kolejki i nazywać Front, a ogon jako tył i nazywać Rear. Dołączając do kolejki nowy element, doczepiamy go do aktualnego Rear; gdy element opuszcza kolejkę, Front wskazuje się element następny w kolejce. Każda kolejka jest więc typu LILO Last In Last Out, co przedstawia poniższy rysunek. Rysunek 8 - Kolejka LILO Kolejki znajdują szerokie zastosowanie w przedmiocie Systemy Obsługi Masowej. Zmieniającą się kolejkę i strumień przepływający przez nią można wiarygodne symulować przy pomocy odpowiedniego oprogramowania. W dajszej części tego rozdziału stworzymy kolejkowy typ danych: ADT QUEUE. Zaimplementujemy go na dwa sposoby: Dynamicznie przy użyciu wskaźników do głowy i ogona Statycznie tworząc kolejkę cykliczną umieszczoną w tablicy. 39

40 Struktury danych 3.2 Operacje ADT QUEUE Podobnie jak w przypadku stosu zastosujemy globalny rejestr flagowy FlagRegister. Jego flagi będą odpowiednio określały: FlagRegister[1] - Operacja FRONT(Q), gdy kolejka jest pusta. FlagRegister[2] - Operacja ENQUEUE(X,Q), gdy kolejka jest pelna. FlagRegister[3] - Operacja DEQUEUE(Q), gdy kolejka jest pusta. function EMPTY(Q : QUEUE) : boolean; Funkcja zwraca wartość logiczną, mówiącą czy kolejka Q jest pusta. procedure DEQUEUE( Q : QUEUE); Procedura usuwa z kolejki Q pierwszy element, zmieniając przy tym Rear. Gdy kolejka jest pusta, procedura powinna ustalić FlagRegistger[3] = 1. procedure ENQUEUE(X : ELEMENTTYPE; Q : QUEUE); Procedura doczepia na koniec kolejki Q nowy element X, aktualizując jednocześnie Rear. W przypadku przepełnienia kolejki, procedura powinna ustalić FlagRegister[2] = 1. function FRONT( Q : QUEUE) : ElementType; Funkcja zwraca wartość pierwszego elementu kolejki Q. Sam element pozostaje nienaruszony. procedure INIT_QUEUE( Q : QUEUE); Procedura inicjująca kolejkę Q. Niezależnie od implementacji po jej wykonaniu Front kolejki pokrywa się z jej Rear. procedure MAKENULL_QUEUE( Q : QUEUE); Procedura usuwająca z kolejki Q wszystkie elementy. Po jej wykonaniu Front pokrywa się z Rear. procedure DESTROY_QUEUE( Q : QUEUE); Procedura stosowana jest tylko we wskaźnikowej implementacji ADT QUEUE. Oprócz usunięcia wszystkich elementów kolejki Q, zwalnia całą pamięć, która dotychczas była zarezerwowana przez Front i Rear. 40

41 Kolejki 3.3 Wskaźnikowa implementacja ADT QUEUE We wskaźnikowej implementacji, Kolejka jest rekordem składającym się z dwóch wskaźników: Front i Rear. Odpowiednio Rear wskazuje na ostatni element w kolejce, który posiada informację merytoryczną - jego następnikiem jest nil. Front wskazuje z kolei na element, który nie posiada informacji merytorycznej. Sytuację tą przedstawia rysunek nr 9. Rysunek 9 - Wskaźnikowa implementacja kolejki Przy takiej implementacji kolejki zwykłe zamienienie ze sobą wskaźników Front i Rear nie odwróci kolejkości kolejki. Nagłówek tej implementacji wygląda następująco: type ElementType = char; FlagRegister = array[1..3] of byte; pointer = ^CELLTYPE; {Wskaźnik do pojedyńczego elementu kolejki} CELLTYPE = record {Element kolejki} Next : pointer; {Wskaźnik do następnika danego elementu} Element : ElementType; {Informacja merytoryczna elementu kolejki} QUEUE = record {Rekord będący właściwą kolejką} Front, Rear : pointer; {Wskaźniki do Głowy i Ogona kolejki} FR : FlagRegister; {Definiowany globalnie rejestr flagowy} Poszczególne operacje mają postać: function EMPTY(Q : QUEUE) : boolean; EMPTY := Q.Front = Q.Rear; {Kolejka jest pusta, gdy Front porywa } {się z Rear } 41

42 Struktury danych procedure DEQUEUE( Q : QUEUE); pom : pointer; if EMPTY(Q) then {Kolejka jest pusta, nie można z niej usunąć } {żadnego elementu} FR[3] := 1; ERROR; end else pom := Q.Front; {Zapamiętanie starego Rear kolejki Q} Q.Front := Q.Front^.Next; {Nową głową stanie się następnik } {dotychczasowej głowy} dispose(pom); {Zwolnienmie pamieci zajmowanej przez stary } { Front kolejki Q} procedure ENQUEUE(X : ElementType; Q : QUEUE); new(q.rear^.next); {Stworzenie nowego elementu dołączonego do } { Rear kolejki Q} if Q.Rear^.Next = nil then {brak pamieci, kolejka Q jest pelna} FR[2] := 1; ERROR; end else Q.Rear := Q.Rear^.Next; {Ustalenie nowego Rear kolejki Q} Q.Rear^.Element := X; {Przypisanie nowemu elementowi wartości X} Q.Rear^.Next := nil; {Nowy Rear nie może posiadać następnika} function FRONT( Q : QUEUE) : ElementType; if EMPTY(Q) then {Kolejka jest pusta} FR[1] := 1; ERROR; end else FRONT := Q.Front^.Next^.Element; {Zwrócenie wartości pierwszego} {elementu, który jest następnikiem Front (rys. nr 8) } procedure INIT_QUEUE( Q : QUEUE); new(q.front); {Stworzenie nowego elementu kolejki, który nie będzie} Q.Front^.Next := nil; { posiadał informacji merytorycznej. Będą na } {niego wskazywały zarówno Front jak i Rear. } 42

43 Kolejki Q.Rear := Q.Front; {Element ten nie będzie posiadał następnika} procedure MAKENULL_QUEUE( Q : QUEUE); while not EMPTY(Q) do DEQUEUE(Q); {Usunięcie wszystkich elementów} {kolejki, które zawierają informację merytoryczną } procedure DESTROY( Q : QUEUE); MAKENULL(Q); {Usunięcie wszystkich elementów, zawierających } {informację merytoryczną, oraz głowy (Front) kolejki } dispose(q.front); 43

44 Struktury danych 3.4 Implementacja kolejki cyklicznej Kolejka cykliczna to kolejka, której elementy umieszczone są w tablicy, którą możemy interpretować jako podzielony na części pierścień. Ilość tych części (MaxLength) jest wielkością tablicy, czyli pamięcią, w której są przechowywane elementy. Umownie możemy przyjąć, że wydłużanie się kolejki (dołączanie nowych elementów) postępuje zgodnie z ruchem wskazówek zegara. Sytuację tą przedstawia rysunek nr 10. Rysunek 10 - Schemat kolejki cyklicznej Aby rozróżnić sytuację, kiedy kolejka będzie pusta bądź pełna musimy poświęcić w tablicy jeden element, który będzie głową. Tak więc: Dla kolejki pustej Front = Rear Dla kolejki pełnej (Front + 1) mod MaxLength = Rear. Dla kolejki cyklicznej musimy zdefiniować funkcję cyklicznego przejścia po kolejnych elementach tablicy. function ADDONE(I : integer) : integer; ADDONE := (I + 1) mod MaxLength; {ADDONE(MaxLength) = 1} Zatem pierwszy element tablicy, zawierający informację merytoryczną będzie się znajdował na pozycji ADDONE(Front), a ostatni na pozycji Rear. Nagłówek tej implementacji ADT QUEUE będzie wyglądał następująco: const MaxLength = 1000; {Maksymalna wielkość tablicy iość podziałów na} 44

45 Kolejki {kole} type ElementType = char; FlagRegister = array[1..3] of byte; QUEUE = record {Kolejka jest tutaj rekordem} Elements : array[1..maxlength] of ElementType; {Tablica, która} {zawiera elementy kolejki} Front, Rear : integer; {Przód i tył cyklicznej kolejki} FR : FlagRegister; {Definiowany globalnie rejestr flagowy} Poniżej przedstawione są wszystkie funkcje dla tej implementacji kolejki. function EMPTY(Q : QUEUE) : boolean; EMPTY := Q.Front = Q.Rear; procedure DEQUEUE( Q : QUEUE); if EMPTY(Q) then FR[3] := 1; ERROR; end else Q.Front := ADDONE(Q.Front); {Przesuwamy głowę kolejki zgodnie z} {ruchem wskazówek zegara } procedure ENQUEUE(X : ELEMENTTYPE; Q : QUEUE); if ADDONE(Q.Rear) = Q.Front then {brak pamieci, kolejka Q jest } FR[2] := 1; {pelna} ERROR; end else Q.Rear := ADDONE(Q.Rear); {Przesuwamy ogon} Q.Elements[Q.Rear] := X; {Przypisujemy odpowiedniej komórce } {tablicy wartość X} function FRONT( Q : QUEUE) : ElementType; if EMPTY(Q) then FR[1] := 1; ERROR; 45

46 Struktury danych end else FRONT := Q.Elements[ADDONE(Q.Front)]; {Pobieramy pierwszy element z kolejki} procedure INIT_QUEUE( Q : QUEUE); Q.Front := 1; {Dla poprawnej inicjacji kolejki wystarczy jedynie, aby } { Front=Rear } Q.Rear := Q.Front; procedure MAKENULL_QUEUE ( Q : QUEUE); Q.Front = Q.Rear; {Usunięcie wszystkich elementów kolejki} 46

47 Kolejki 3.5 Przykład zastosowania ADT QUEUE Możemy zademonstrować działanie ADT AUEUE na prostym przykładzie. INIT_QUEUE(Q); writeln('podaj początkowe wejście do funkcji EDIT : '); readln(ed); EDIT(Q,ED); EDIT(Q,ED); {Powtórne wywołanie EDIT(Q), aby sprawdzić, czy} { działa operacja MAKENULL(Q) na niepustej kolejce {wypisanie elementow kolejki wraz z ich usuwaniem} write('elementy kolejki: '); while not EMPTY(Q) do write(front(q)); DEQUEUE(Q); readln; DESTROY(Q); 47

48 Struktury danych 4 Odwzorowania 4.1 Wprowadzenie Odwzorowanie (pamięć asocjacyjna) jest funkcją przyporządkowującą elementom jednego typu, elementy drugiego typu. Będziemy przyjmować oznaczenia: Domain type typ dziedziny Range type typ przeciwdziedziny W tym rozdziale zaimplementujemy na dwa sposoby typ danych reprezentujący odwzorowanie: ADT MAPPING. 4.2 Operacje ADT MAPPING Do podstawowych operacji na typie reprezentującym odwzorowanie należą: Procedure MAKENULL_MAPPING( M : MAPPING); Procedura ta czyni odwzorowanie M odwzorowaniem pustym. Procedure ASSIGN( M : MAPPING; d : DomainType; r : RangeType); Procedura definiuje M(d) równe r, bez względu na to, czy M(d) było wcześniej zdefiniowane. Function COMPUTE( M : MAPPING; d : DomainType; r : RangeType) : boolean Funkcja zwraca wartość true i nadaje paramertowi r wartość M(d), gdy M(d) jest zdefiniowane; w przeciwnym wypadku zwraca wartość false; 48

KOLEJKA (QUEUE) (lista fifo first in, first out)

KOLEJKA (QUEUE) (lista fifo first in, first out) KOLEJKA (QUEUE) (lista fifo first in, first out) Kolejki są listami, których elementy można wstawiać z jednego końca (rear-tył) a usuwać z drugiego (front - przód). Operacje: 1. MAKENULL(Q) czyni kolejkę

Bardziej szczegółowo

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno Instrukcja laboratoryjna 2 Podstawy programowania 2 Temat: Zmienne dynamiczne tablica wskaźników i stos dynamiczny Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Tablice wskaźników Tablice

Bardziej szczegółowo

Struktury danych (I): kolejka, stos itp.

Struktury danych (I): kolejka, stos itp. Letnie Warsztaty Matematyczno-Informatyczne Algorytmy i struktury danych Struktury danych (I): kolejka, stos itp. Struktury danych (I): kolejka, stos itp. Struktura danych stanowi sposób uporządkowania

Bardziej szczegółowo

Struktury danych: stos, kolejka, lista, drzewo

Struktury danych: stos, kolejka, lista, drzewo Struktury danych: stos, kolejka, lista, drzewo Wykład: dane w strukturze, funkcje i rodzaje struktur, LIFO, last in first out, kolejka FIFO, first in first out, push, pop, size, empty, głowa, ogon, implementacja

Bardziej szczegółowo

Dynamiczne struktury danych

Dynamiczne struktury danych Dynamiczne struktury danych 391 Dynamiczne struktury danych Przez dynamiczne struktury danych rozumiemy proste i złożone struktury danych, którym pamięć jest przydzielana i zwalniana na żądanie w trakcie

Bardziej szczegółowo

Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel Wstęp do programowania Listy Piotr Chrząstowski-Wachtel Do czego stosujemy listy? Listy stosuje się wszędzie tam, gdzie występuje duży rozrzut w możliwym rozmiarze danych, np. w reprezentacji grafów jeśli

Bardziej szczegółowo

ZASADY PROGRAMOWANIA KOMPUTERÓW

ZASADY PROGRAMOWANIA KOMPUTERÓW POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.

Bardziej szczegółowo

Podstawy programowania skrót z wykładów:

Podstawy programowania skrót z wykładów: Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace

Bardziej szczegółowo

Lista 5 Typy dynamiczne kolejka

Lista 5 Typy dynamiczne kolejka Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Metody i języki programowania 1 Wprowadzenie Lista 5 Typy dynamiczne kolejka Kolejka jest jedną z podstawowych struktur umożliwiających

Bardziej szczegółowo

Podstawowe struktury danych

Podstawowe struktury danych Podstawowe struktury danych 1) Listy Lista to skończony ciąg elementów: q=[x 1, x 2,..., x n ]. Skrajne elementy x 1 i x n nazywamy końcami listy, a wielkość q = n długością (rozmiarem) listy. Szczególnym

Bardziej szczegółowo

Abstrakcyjne struktury danych - stos, lista, drzewo

Abstrakcyjne struktury danych - stos, lista, drzewo Sprawozdanie Podstawy Informatyki Laboratoria Abstrakcyjne struktury danych - stos, lista, drzewo Maciej Tarkowski maciek@akom.pl grupa VII 1/8 1. Stos Stos (ang. Stack) jest podstawową liniową strukturą

Bardziej szczegółowo

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych: Struktura danych Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych: rekord tablica lista stos kolejka drzewo i jego odmiany (np. drzewo

Bardziej szczegółowo

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy) Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013

Bardziej szczegółowo

Zmienne i struktury dynamiczne

Zmienne i struktury dynamiczne Zmienne i struktury dynamiczne Zmienne dynamiczne są to zmienne, które tworzymy w trakcie działania programu za pomocą operatora new. Usuwa się je operatorem delete. Czas ich występowania w programie jest

Bardziej szczegółowo

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych: Zmienna i typ Pascal typy danych Zmienna to obiekt, który może przybierać różne wartości. Typ zmiennej to zakres wartości, które może przybierać zmienna. Deklarujemy je w nagłówku poprzedzając słowem kluczowym

Bardziej szczegółowo

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy Wykład 3 Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy Dynamiczne struktury danych Lista jest to liniowo uporządkowany zbiór elementów, z których dowolny element

Bardziej szczegółowo

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą

Bardziej szczegółowo

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe Algorytmy i złożoności Wykład 3. Listy jednokierunkowe Wstęp. Lista jednokierunkowa jest strukturą pozwalającą na pamiętanie danych w postaci uporzadkowanej, a także na bardzo szybkie wstawianie i usuwanie

Bardziej szczegółowo

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem. Podstawy programowania Wykład PASCAL Zmienne wskaźnikowe i dynamiczne 1 dr Artur Bartoszewski - Podstawy prograowania, sem. 1- WYKŁAD Rodzaje zmiennych Zmienne dzielą się na statyczne i dynamiczne. Zmienna

Bardziej szczegółowo

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno Instrukcja laboratoryjna 5 Podstawy programowania 2 Temat: Drzewa binarne Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny Drzewa są jedną z częściej wykorzystywanych struktur danych. Reprezentują

Bardziej szczegółowo

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu Programowanie strukturalne Opis ogólny programu w Turbo Pascalu STRUKTURA PROGRAMU W TURBO PASCALU Program nazwa; } nagłówek programu uses nazwy modułów; } blok deklaracji modułów const } blok deklaracji

Bardziej szczegółowo

Podstawy Programowania C++

Podstawy Programowania C++ Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:

Bardziej szczegółowo

E S - uniwersum struktury stosu

E S - uniwersum struktury stosu Temat: Struktura stosu i kolejki Struktura danych to system relacyjny r I r i i I U,, gdzie U to uniwersum systemu, a i i - zbiór relacji (operacji na strukturze danych). Uniwersum systemu to zbiór typów

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Cel zajęć. Celem zajęć jest zapoznanie się ze sposobem działania popularnych. Wprowadzenie teoretyczne. Rozważana w ramach niniejszych zajęć

Bardziej szczegółowo

Listy, kolejki, stosy

Listy, kolejki, stosy Listy, kolejki, stosy abc Lista O Struktura danych składa się z węzłów, gdzie mamy informacje (dane) i wskaźniki do następnych węzłów. Zajmuje tyle miejsca w pamięci ile mamy węzłów O Gdzie można wykorzystać:

Bardziej szczegółowo

Programowanie w języku Python. Grażyna Koba

Programowanie w języku Python. Grażyna Koba Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i

Bardziej szczegółowo

Dynamiczne struktury danych

Dynamiczne struktury danych Listy Zbiór dynamiczny Zbiór dynamiczny to zbiór wartości pochodzących z pewnego określonego uniwersum, którego zawartość zmienia się w trakcie działania programu. Elementy zbioru dynamicznego musimy co

Bardziej szczegółowo

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 INFORMATYKA W SZKOLE Dr inż. Grażyna KRUPIŃSKA grazyna@fis.agh.edu.pl D-10 pokój 227 Podyplomowe Studia Pedagogiczne Sortowanie Dane wejściowe : trzy liczby w dowolnym porządku Dane wyjściowe: trzy liczby

Bardziej szczegółowo

JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI

JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI Gdy wywołujesz daną funkcję, program przechodzi do tej funkcji, przekazywane są parametry i następuje wykonanie ciała funkcji. Gdy funkcja zakończy działanie, zwracana

Bardziej szczegółowo

Język programowania PASCAL

Język programowania PASCAL Język programowania PASCAL (wersja podstawowa - standard) Literatura: dowolny podręcznik do języka PASCAL (na laboratoriach Borland) Iglewski, Madey, Matwin PASCAL STANDARD, PASCAL 360 Marciniak TURBO

Bardziej szczegółowo

Wstęp do programowania. Różne różności

Wstęp do programowania. Różne różności Wstęp do programowania Różne różności Typy danych Typ danych określa dwie rzeczy: Jak wartości danego typu są określane w pamięci Jakie operacje są dozwolone na obiektach danego typu 2 Rodzaje typów Proste

Bardziej szczegółowo

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Cel zajęć. Celem zajęć jest zapoznanie się ze sposobem działania popularnych kolekcji. Wprowadzenie teoretyczne. Rozważana w ramach niniejszych

Bardziej szczegółowo

WSTĘP DO INFORMATYKI. Struktury liniowe

WSTĘP DO INFORMATYKI. Struktury liniowe Akademia Górniczo-Hutnicza Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej WSTĘP DO INFORMATYKI Adrian Horzyk Struktury liniowe www.agh.edu.pl STRUKTURY LINIOWE SEKWENCJE Struktury

Bardziej szczegółowo

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy. PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy. 1. Instrukcję case t of... w przedstawionym fragmencie programu moŝna zastąpić: var t : integer; write( Podaj

Bardziej szczegółowo

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel Wstęp do programowania Procedury i funkcje Piotr Chrząstowski-Wachtel Po co procedury i funkcje? Gdyby jakis tyran zabronił korzystać z procedur lub funkcji, to informatyka by upadła! Procedury i funkcje

Bardziej szczegółowo

Metody getter https://www.python-course.eu/python3_object_oriented_programming.php 0_class http://interactivepython.org/runestone/static/pythonds/index.html https://www.cs.auckland.ac.nz/compsci105s1c/lectures/

Bardziej szczegółowo

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie

Bardziej szczegółowo

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.) Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.) Kontenery - - wektor vector - - lista list - - kolejka queue - - stos stack Kontener asocjacyjny map 2016-01-08 Bazy danych-1 W5 1 Kontenery W programowaniu

Bardziej szczegółowo

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1 Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem

Bardziej szczegółowo

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to

Bardziej szczegółowo

Algorytmy i struktury danych

Algorytmy i struktury danych Algorytmy i struktury danych Proste algorytmy sortowania Witold Marańda maranda@dmcs.p.lodz.pl 1 Pojęcie sortowania Sortowaniem nazywa się proces ustawiania zbioru obiektów w określonym porządku Sortowanie

Bardziej szczegółowo

1 Wskaźniki i listy jednokierunkowe

1 Wskaźniki i listy jednokierunkowe 1 Wskaźniki i listy jednokierunkowe 1.1 Model pamięci komputera Pamięć komputera możemy wyobrażać sobie tak, jak na rysunku: Zawartość:... 01001011 01101010 11100101 00111001 00100010 01110011... adresy:

Bardziej szczegółowo

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych. Algorytmy i Struktury Danych. Podstawowe struktury danych dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych.

Bardziej szczegółowo

Wstęp do programowania. Stosy i kolejki. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Stosy i kolejki. Piotr Chrząstowski-Wachtel Wstęp do programowania Stosy i kolejki Piotr Chrząstowski-Wachtel Stosy Stosy elementów ze zbioru A, to struktury danych, które umożliwiają wykonanie następujących operacji i funkcji {var x:typa; s:stack

Bardziej szczegółowo

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych

Bardziej szczegółowo

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,

Bardziej szczegółowo

Zapisywanie algorytmów w języku programowania

Zapisywanie algorytmów w języku programowania Temat C5 Zapisywanie algorytmów w języku programowania Cele edukacyjne Zrozumienie, na czym polega programowanie. Poznanie sposobu zapisu algorytmu w postaci programu komputerowego. Zrozumienie, na czym

Bardziej szczegółowo

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303 Wykład 9 J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303 stos i operacje na stosie odwrotna notacja polska języki oparte na ONP przykłady programów J. Cichoń, P. Kobylański Wstęp

Bardziej szczegółowo

OPERACJE NA PLIKACH. Podstawowe pojęcia:

OPERACJE NA PLIKACH. Podstawowe pojęcia: OPERACJE NA PLIKACH Podstawowe pojęcia: plik fizyczny, zbiór informacji w pamięci zewnętrznej wykorzystywany do trwałego przechowywania danych lub jako przedłużenie pamięci operacyjnej w przypadku przetwarzania

Bardziej szczegółowo

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika. Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika. 1. Pojcie struktury danych Nieformalnie Struktura danych (ang. data

Bardziej szczegółowo

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku System plików 1. Pojęcie pliku 2. Typy i struktury plików 3. etody dostępu do plików 4. Katalogi 5. Budowa systemu plików Pojęcie pliku (ang( ang. file)! Plik jest abstrakcyjnym obrazem informacji gromadzonej

Bardziej szczegółowo

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych: Struktura danych Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych: rekord tablica lista stos kolejka drzewo i jego odmiany (np. drzewo

Bardziej szczegółowo

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny Klasa 2 INFORMATYKA dla szkół ponadgimnazjalnych zakres rozszerzony Założone osiągnięcia ucznia wymagania edukacyjne na poszczególne oceny Algorytmy 2 3 4 5 6 Wie, co to jest algorytm. Wymienia przykłady

Bardziej szczegółowo

INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra

INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra INFORMATYKA Podstawy programowania w języku C (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra INFORMATYKA Temat: Struktury dynamiczne Wykład 7 Struktury dynamiczne lista jednokierunkowa,

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych. Algorytmy i Struktury Danych. Abstrakcyjne struktury danych dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych. Algorytmy i Struktury Danych. Liniowe struktury danych. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład

Bardziej szczegółowo

Algorytmy i struktury danych. wykład 5

Algorytmy i struktury danych. wykład 5 Plan wykładu: Wskaźniki. : listy, drzewa, kopce. Wskaźniki - wskaźniki Wskaźnik jest to liczba lub symbol który w ogólności wskazuje adres komórki pamięci. W językach wysokiego poziomu wskaźniki mogą również

Bardziej szczegółowo

Programowanie i struktury danych

Programowanie i struktury danych Programowanie i struktury danych 1 / 19 Dynamiczne struktury danych Dynamiczną strukturą danych nazywamy taka strukturę danych, której rozmiar, a więc liczba przechowywanych w niej danych, może się dowolnie

Bardziej szczegółowo

Programowanie i techniki algorytmiczne

Programowanie i techniki algorytmiczne Temat 2. Programowanie i techniki algorytmiczne Realizacja podstawy programowej 1) wyjaśnia pojęcie algorytmu, podaje odpowiednie przykłady algorytmów rozwiązywania różnych 2) formułuje ścisły opis prostej

Bardziej szczegółowo

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Podstawy informatyki Elektrotechnika I rok Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Katedra Energoelektroniki i Automatyki Systemów Przetwarzania Energii AGH Kraków 2017 Tematyka

Bardziej szczegółowo

Temat 1. Więcej o opracowywaniu tekstu

Temat 1. Więcej o opracowywaniu tekstu Temat 1. Więcej o opracowywaniu tekstu Cele edukacyjne Celem tematu 1. jest uporządkowanie i rozszerzenie wiedzy uczniów na temat opracowywania dokumentów tekstowych (m.in. stosowania tabulatorów, spacji

Bardziej szczegółowo

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe Podstawy programowania Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe 1 Podstawy programowania Część I Łańcuchy znaków 2 I. Zmienne łańcuchowe Klasyfikacja zmiennych statycznych

Bardziej szczegółowo

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Turbo Pascal jest językiem wysokiego poziomu, czyli nie jest rozumiany bezpośrednio dla komputera, ale jednocześnie jest wygodny dla programisty,

Bardziej szczegółowo

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0 Uwaga: DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0 1. Zostały pominięte diagramy: CYFRA, CYFRA SZESNASTKOWA, ZNAK i LITERA. Nie została uwzględniona możliwość posługiwania się komentarzami. 2. Brakuje

Bardziej szczegółowo

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno Instrukcja laboratoryjna 1 Podstawy programowania 2 Temat: Wprowadzenie do wskaźników Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny Rysunek przedstawia najważniejszą różnicę pomiędzy zmiennymi,

Bardziej szczegółowo

Podstawy Informatyki. Wykład 6. Struktury danych

Podstawy Informatyki. Wykład 6. Struktury danych Podstawy Informatyki Wykład 6 Struktury danych Stałe i zmienne Podstawowymi obiektami występującymi w programie są stałe i zmienne. Ich znaczenie jest takie samo jak w matematyce. Stałe i zmienne muszą

Bardziej szczegółowo

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA Rekurencja - zdolność podprogramu (procedury) do wywoływania samego (samej) siebie Wieże Hanoi dane wejściowe - trzy kołki i N krążków o różniących się średnicach wynik - sekwencja ruchów przenosząca krążki

Bardziej szczegółowo

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor. Zadaniem centralnej jednostki przetwarzającej CPU (ang. Central Processing Unit), oprócz przetwarzania informacji jest sterowanie pracą pozostałych układów systemu. W skład CPU wchodzą mikroprocesor oraz

Bardziej szczegółowo

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane

Bardziej szczegółowo

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych Wykład 6_ Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych Abstrakcyjny typ danych Klient korzystający z abstrakcyjnego typu danych: o ma do dyspozycji jedynie

Bardziej szczegółowo

Wykład 8: klasy cz. 4

Wykład 8: klasy cz. 4 Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD

Bardziej szczegółowo

Języki i techniki programowania Ćwiczenia 2

Języki i techniki programowania Ćwiczenia 2 Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...

Bardziej szczegółowo

Paradygmaty programowania

Paradygmaty programowania Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów

Bardziej szczegółowo

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów

Bardziej szczegółowo

Tablice cz. I Tablice jednowymiarowe, proste operacje na tablicach

Tablice cz. I Tablice jednowymiarowe, proste operacje na tablicach Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Tablice cz. I Tablice jednowymiarowe, proste operacje na tablicach Tablice Powiedzmy, że chcemy zapamiętać w programie

Bardziej szczegółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja

Bardziej szczegółowo

wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK

wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK 1 2 3 Pamięć zewnętrzna Pamięć zewnętrzna organizacja plikowa. Pamięć operacyjna organizacja blokowa. 4 Bufory bazy danych. STRUKTURA PROSTA

Bardziej szczegółowo

Lista, Stos, Kolejka, Tablica Asocjacyjna

Lista, Stos, Kolejka, Tablica Asocjacyjna Lista, Stos, Kolejka, Tablica Asocjacyjna Listy Lista zbiór elementów tego samego typu może dynamicznie zmieniać rozmiar, pozwala na dostęp do poszczególnych elementów Typowo dwie implementacje: tablicowa,

Bardziej szczegółowo

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre) Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie

Bardziej szczegółowo

Podstawy Programowania 2

Podstawy Programowania 2 Podstawy Programowania 2 Laboratorium 7 Instrukcja 6 Object Pascal Opracował: mgr inż. Leszek Ciopiński Wstęp: Programowanie obiektowe a programowanie strukturalne. W programowaniu strukturalnym, któremu

Bardziej szczegółowo

Pascal - wprowadzenie

Pascal - wprowadzenie Pascal - wprowadzenie Ogólne informacje o specyfice języka i budowaniu programów Filip Jarmuszczak kl. III c Historia Pascal dawniej jeden z najpopularniejszych języków programowania, uniwersalny, wysokiego

Bardziej szczegółowo

Struktury Danych i Złożoność Obliczeniowa

Struktury Danych i Złożoność Obliczeniowa Struktury Danych i Złożoność Obliczeniowa Zajęcia 1 Podstawowe struktury danych Tablica Najprostsza metoda przechowywania serii danych, zalety: prostota, wady: musimy wiedzieć, ile elementów chcemy przechowywać

Bardziej szczegółowo

Funkcje i instrukcje języka JavaScript

Funkcje i instrukcje języka JavaScript Funkcje i instrukcje języka JavaScript 1. Cele lekcji a) Wiadomości Uczeń : zna operatory i typy danych języka JavaScript, zna konstrukcję definicji funkcji, zna pętlę If i For, Do i While oraz podaje

Bardziej szczegółowo

Typy, klasy typów, składnie w funkcji

Typy, klasy typów, składnie w funkcji Typy, klasy typów, składnie w funkcji Typy w Haskell Każde wyrażenie w Haskell posiada zdefiniowany typ. Dzięki temu już na etapie kompilacji kodu następuje sprawdzenie poprawności kodu i zabezpiecza nas

Bardziej szczegółowo

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula Programowanie i struktury danych Wykład 4 Dr Piotr ybula Typ wska ź nikowy int* pointer; //wskaźnik do zmiennych typu int pozwala na dostęp do dowolnego miejsca pamięci (zmienne

Bardziej szczegółowo

Podstawy programowania w języku C++

Podstawy programowania w języku C++ Podstawy programowania w języku C++ Część ósma Zmienne wskaźnikowe koncepcja, podstawowe zastosowania Wersja skrócona, tylko C++ Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski

Bardziej szczegółowo

Delphi Laboratorium 3

Delphi Laboratorium 3 Delphi Laboratorium 3 1. Procedury i funkcje Funkcja jest to wydzielony blok kodu, który wykonuje określoną czynność i zwraca wynik. Procedura jest to wydzielony blok kodu, który wykonuje określoną czynność,

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc. Zmienne powłoki Zmienne powłoki (shell variables) to tymczasowe zmienne, które mogą przechowywać wartości liczbowe lub ciągi znaków. Związane są z powłoką, Przypisania wartości do zmiennej następuje poprzez

Bardziej szczegółowo

Deklaracja struktury w C++

Deklaracja struktury w C++ Struktury to złożone typy danych pozwalające przechowywać różne informacje. Za pomocą struktur możliwe jest grupowanie wielu zmiennych o różnych typach w jeden obiekt. Strukturę można nazywać obiektem

Bardziej szczegółowo

Lab 9 Podstawy Programowania

Lab 9 Podstawy Programowania Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany

Bardziej szczegółowo

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne: Instrukcje podsumowanie Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne: - grupująca end - warunkowa if

Bardziej szczegółowo

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania 1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja nie ma parametru i zwraca wartość na zewnątrz. nie ma parametru i nie zwraca wartości na zewnątrz. ma parametr o nazwie void i zwraca

Bardziej szczegółowo

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach 27 kwietnia 2012 Wiedząc, że deklarowanie typu rekordowego w języku C/ C++ wygląda następująco: struct element

Bardziej szczegółowo

Wykład 1: Wskaźniki i zmienne dynamiczne

Wykład 1: Wskaźniki i zmienne dynamiczne Programowanie obiektowe Wykład 1: Wskaźniki i zmienne dynamiczne 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD Podstawy programowania w C++ Wskaźniki 2 dr Artur Bartoszewski - Programowanie

Bardziej szczegółowo

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos) Algorytmy i struktury danych Wykład 3: Stosy, kolejki i listy Dr inż. Paweł Kasprowski pawel@kasprowski.pl Kolejki FIFO First In First Out (kolejka) LIFO Last In First Out (stos) Stos (stack) Dostęp jedynie

Bardziej szczegółowo

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()

Bardziej szczegółowo