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

Podobne dokumenty
Lista 5 Typy dynamiczne kolejka

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Zmienne i struktury dynamiczne

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

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

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

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.

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

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

TEMAT : KLASY DZIEDZICZENIE

Wykład 8: klasy cz. 4

Programowanie obiektowe

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

Języki i techniki programowania Ćwiczenia 2

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Podstawy programowania obiektowego

DYNAMICZNE PRZYDZIELANIE PAMIECI

Programowanie i struktury danych

Celem tego projektu jest stworzenie

Algorytm. a programowanie -

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

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Rozdział 4 KLASY, OBIEKTY, METODY

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie komputerowe. Zajęcia 4

1 Wskaźniki i listy jednokierunkowe

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

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

Programowanie obiektowe

Dynamiczne struktury danych

Wskaźniki w C. Anna Gogolińska

Programowanie obiektowe i C++ dla matematyków

Wstęp do Programowania, laboratorium 02

Programowanie strukturalne i obiektowe. Funkcje

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

- - Ocena wykonaniu zad3. Brak zad3

Podstawy Programowania Obiektowego

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Deklaracja struktury w C++

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Podstawy programowania

Laboratorium 5: Tablice. Wyszukiwanie binarne

Wykład 4: Klasy i Metody

Laboratorium 10: Maszyna stanów

Wyjątki (exceptions)

KURS C/C++ WYKŁAD 6. Wskaźniki

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

1 Podstawy c++ w pigułce.

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

Informatyka I: Instrukcja 4.2

Wykład 1: Wskaźniki i zmienne dynamiczne

Szablony klas, zastosowanie szablonów w programach

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Pole wielokąta. Wejście. Wyjście. Przykład

XML i nowoczesne technologie zarządzania treścią 2007/08

Lab 9 Podstawy Programowania

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

E S - uniwersum struktury stosu

Podstawy Programowania 2 Dwukierunkowa lista liniowa. Plan. Wstęp. Implementacja. Notatki. Notatki. Notatki. Notatki.

Algorytmy i język C++

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Wykład 5: Klasy cz. 3

Zadania z podstaw programowania obiektowego

Wykład 9: Polimorfizm i klasy wirtualne

Struktury - wprowadzenie

6 Przygotował: mgr inż. Maciej Lasota

Ada-95. Dariusz Wawrzyniak

Programowanie obiektowe

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

lekcja 8a Gry komputerowe MasterMind

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

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

Przeciążanie operatorów

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Programowanie i techniki algorytmiczne

Struktury. Przykład W8_1

Zdalny podgląd wizualizacji z panelu XV100 przez przeglądarkę internetową (WebServer)

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie Niskopoziomowe

Zaawansowane programowanie w języku C++ Klasy w C++

Podstawy Programowania C++

Podstawowym zadaniem, które realizuje

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

7. Pętle for. Przykłady

INSTRUKCJA UŻYTKOWNIKA. Spis treści. I. Wprowadzenie II. Tworzenie nowej karty pracy a. Obiekty b. Nauka pisania...

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.


XV. Wskaźniki Odczytywanie adresu pamięci istniejących zmiennych Wskaźniki pierwsze spojrzenie.

Transkrypt:

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ą danych: stosem. 1 Przebieg ćwiczenia Uwaga: Typy danych przechowywanych w dowolnego rodzaju dynamicznych strukturach danych są oczywiście dowolne (np. liczby całkowite itd. ). Następujące operacje są wspólne dla większości dynamicznych struktur danych, nie tylko dla stosów: Definicja typu strukturalnego Obecność wskaźnika głównego na element struktury Dodawanie nowego elementu do struktury Usuwanie elementu ze struktury 1.1 Definicja typu strukturalnego Dynamiczne struktury danych składają się z połączonych ze sobą przy pomocy wskaźników zmiennych dynamicznych. Dodatkowo każda zmienna dynamiczna przechowuje dane (co jest podstawowym przeznaczeniem dynamicznej struktury danych). Z tego powodu każda struktura dynamiczna posiada co najmniej: Składową przechowującą dane Wskaźnik na (następny) element struktury W bardziej zaawansowanych strukturach takich wskaźników może być więcej, niż jeden. Definicja typu strukturalnego, służącego do przechowywania liczb typu int w najprostszym przypadku ma zatem postać struct TTypStrukturalny { int DANE ; TTypStrukturalny * Nastepny ; }; 1

1.2 Tworzenie wskaźnika głównego Przed rozpoczęciem tworzenia konieczne jest określenie sposobu odwoływania się do dynamicznej struktury danych. W tym celu najczęściej wykorzystuje się zwykły wskaźnik do struktury (typu TTypStrukturalny), deklarowany jako zwykła zmienna (niedynamiczna). Wskaźnik taki jest zwykłym wskaźnikiem na typ TTypStrukturalny, dlatego tworzony jest w następujący sposób: TTypStrukturalny * ; Należy zauważyć, że wskaźnik ten nie wskazuje na żadne użyteczne dane. Z tego powodu w tym momencie odwołanie się do tego, na co wskazuje ten wskaźnik jest błędne. Zostanie on użyty do utworzenia nowej zmiennej dynamicznej. Wskaźnik 1.3 Tworzenie elementarnej stuktury: Każdą tworzoną dynamicznie strukturę należy utworzyć przy pomocy instrukcji = new TTypStrukturalny ; Wskaźnik DANE?? Następnie należy przypisać polom nowoutworzonej struktury dynamicznej określone dane (w przykładzie jest to liczba 1). -> DANE =1; Dodatkowo można również przypisać wskaźnikowi ->Nastepny wartość. Stanowi to dodatkowe zabezpieczenie przed popełnieniem błędu przez programistę podczas dalszego tworzenia dynamicznej struktury danych. W przypadku stosu linia ta nie jest jednak konieczna, gdyż w następnym kroku jego tworzenia wskaźnik ten wskaże na następny element stosu. -> Nastepny = ; 2

Wskaźnik Jedną z najprostszych w implementacji dynamicznych struktur danych jest stos. 2 Tworzenie stosu Stos jest dynamiczną strukturą danych, w której dołączanie i usuwanie elementów zachodzi tylko w jednym miejscu: na wierzchołku. Stos można wyobrazić sobie jako stos książek: chcąc wyjąć jedną, należy wcześniej wyjąć wszystkie znajdujące się powyżej. Wskaźnik główny () ma zawsze wskazywać na wierzchołek stosu. Aby usunąć element o wartości w Wartość oznaczająca koniec stosu Wskaźnik wskazujący zawsze na wierzchołek stosu Dodawanie nowych danych Usuwanie danych Rysunek 1: Gotowy stos polu DANE równej 2 należy najpierw usunąć wszystkie elementy znajdujące się przed usuwanym elementem (w przykładzie będzie to element o wartości 3 w polu DANE)). 2.1 Tworzenie pierwszego elementu = new TTypStrukturalny ; - > DANE = 1; - > Nastepny = ; To już jest stos, tyle, że nieco mało użyteczny.... Wskaźnik 3

2.2 Następne elementy Od teraz dodawanie każdego nowego elementu będzie przebiegało identycznie: Najpierw należy utworzyć elementarną cegiełkę nową zmienną dynamiczną (typu TTypStrukturalny), która zostanie dodany do stosu. Aby to uczynić niezbędne jest zadeklarowanie pomocniczego wskaźnika TTypStrukturalny * ; Przy pomocy wskaźnika tworzona jest nowa zmienna dynamiczna = new TTypStrukturalny ; -> DANE = 2; - > Nastepny = ; // To przypisanie w zasadzie nie jest // konieczne, gdyż zaraz - > Nastepny // zostanie zmieniony Następnie można połączyć tę nową cegiełkę z resztą stosu: - > Nastepny = ; Ponieważ w przypadku stosu KONIECZNE jest zapewnienie, aby wskazywał na rzeczywisty wierzchołek stosu, dlatego należy go przesunąć. Przy tej operacji wystarczy zauważyć, że wskaźnik wskazuje na wierzchołek stosu. = ; 4

(Gotowy stos; Zmienna nie jest już potrzebna i można ją wykorzystać do innych celów) 2.3 Dodawanie nowego elementu do stosu o dwóch elementach Należy zauważyć, że dodawanie danych do stosu o dowolnym rozmiarze (od pustego stosu aż do utworzenia potrzebnej liczby elementów) przebiega zawsze w ten sam, omówiony w poprzednich podpunktach, sposób: utworzenie nowej zmiennej dynamicznej = new TtypStrukturalny ; -> DANE = 3; podpięcie jej na wierzchołek stosu: - > Nastepny = ; przeniesienie wskaźnika na wierzcholek stosu. = ; 5

Wskaźniki oraz wskazują na tę samą zmienną dynamiczną. Gotowy stos. Zmienna nie jest już potrzebna i można ją wykorzystać do innych celów. Aby ułatwić sprawdzanie błędów należy jednak ustawić ten wskaźnik na : = ; Dodawanie pozostałych elementów następuje analogicznie. 3 Usuwanie elementów ze stosu Przy usuwaniu elementu ze stosu również niezbędne będzie użycie pomocniczego wskaźnika : TTypStrukturalny * ; Przed usunięciem elementu należy odczytać przechowywaną przez niego (w polu DANE) wartość po usunięciu zmiennej dynamicznej nie będzie to możliwe. Jako przykład wykorzystania wartości w tym polu przyjmijmy jego wypisanie na ekranie: printf ("%d", -> DANE ); Najczęściej usuwanie danych ze stosu realizowanej jest przy pomocy funkcji zwracającej usunięty element. Z tego powodu najczęściej wpisuje się ->DANE do zmiennej pomocniczej, której wartość używana jest jako wartość zwracana z funkcji: int wartosczwracana ; /*... */ wartosczwracana = - > DANE ; /* usuwanie elementu */ return wartosczwracana ; Przy pomocy zmiennej tymczasowej należy przejść na następny element stosu: = -> ; 6

Przygotowanie danych do usunięcia. Zmienna dynamiczna na którą wskazuje wskaźnik zostanie za chwilę usunięta. Dla ułatwienia sprawdzania błędów można najpierw ustawić wskaźnik -> (na poniższym rysunku oznaczony kolorem czerwonym) na. UWAGA: PRZED odcięciem zmiennej dynamicznej, na którą wskazuje wskaźnik od reszty stosu KONIECZNE jest zapewnienie, że na resztę struktury wskazuje jakiś inny wskaźnik tutaj. Jeśli tak nie będzie, wtedy NIE MA MOŻLIWOŚCI NAPRAWY TEGO BŁĘDU STRUKTURA ZOSTANIE NIEODWRACALNIE UTRACONA!!!). Wierzchołek -> = ; Pojedyncza zmienna dynamiczna, na którą wskazuje wskaźnik została odcięta od reszty stosu. Na pozostałą część stosu wskazuje zmienna Teraz można już usunąć element na wierzchołku stosu: delete ; /* Usunięcie zmiennej dynamicznej, na którą wskazuje wskaźnik. */ Po wykonaniu tej linii, wskaźnik NIE wskazuje na żaden użyteczny obszar pamięci. Napisanie więc (*) lub ->cokolwiek jest BŁĘDNE). Można jednak oczywiście nadal zmieniać wartość wskaźnika (to, na co ma wskazywać wskaźnik). Poprawne jest więc przypisanie wskaźnikowi dowolnej wartości (np. =). Po wykonaniu instrukcji delete ; wskaźnik wskazuje na bezużyteczne dane: 7

Ponieważ wskaźnik powinien zawsze wskazywać na wierzchołek stosu, dlatego konieczne jest jego ponowne ustawienie na wierzchołek pozostałej części stosu (na którą aktualnie wskazuje wskaźnik ): = ; Teraz znowu wskazuje na użyteczną zmienną dynamiczną - na początek stosu. Zmienna TMP nie jest już potrzebna i może zostać użyta do innych celów. Usuwanie pozostałych elementów realizuje się analogicznie. 4 Zadania 1. Zaimplementować funkcję służącą do dodawania elementów do stosu 2. Zaimplementować funkcję służącą do usuwania elementów stosu. W przypadku próby usunięcia elementu z pustego stosu należy wypisać komunikat o błędzie. 3. Przy pomocy funkcji z p. 1 i 2, dodać do stosu po kolei liczby: 1,3,5,7,9,11,13,15,17,19. Następnie usunąć wszystkie elementy. Po usunięciu każdego z nich wypisać wartość liczby na ekranie. 8