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



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

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

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

Lista 5 Typy dynamiczne kolejka

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.

Lab 9 Podstawy Programowania

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

Podstawowe struktury danych

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

lekcja 8a Gry komputerowe MasterMind

Struktury, unie, formatowanie, wskaźniki

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

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

*W uproszczeniu: jest dziewięciu sędziów przyznających po dwie noty: za wartość techniczną i artystyczną (skala od 0.0 do 6.0)

Programowanie komputerowe. Zajęcia 4

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

TABLICA (ang. array) pojedyncza zmienna z wieloma komórkami, w których można zapamiętać wiele wartości tego samego typu danych.

2 Przygotował: mgr inż. Maciej Lasota

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Podstawy Programowania 2

6 Przygotował: mgr inż. Maciej Lasota

Zasady programowania Dokumentacja

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

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

Zestaw 1 Organizacja plików: Oddajemy tylko źródła programów (pliki o rozszerzeniach.adb)!!!

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

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

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

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

W języku C/C++ pomiędzy wskaźnikami a tablicami istnieje bardzo ścisły związek. Do onumerowania elementów w tablicy służą tzw. INDEKSY.

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

Architektura komputerów

Podstawy Programowania

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

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

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI

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

Informatyka I. Wykład 4. Tablice. Dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

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

1 Wskaźniki i listy jednokierunkowe

Języki programowania obiektowego Nieobiektowe elementy języka C++

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

Tablice cz. I Tablice jednowymiarowe, proste operacje na tablicach

Podstawy programowania

STL: Lekcja 1&2. Filozofia STL

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

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

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

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Zestaw 1 ZESTAWY A. a 1 a 2 + a 3 ± a n, gdzie skªadnik a n jest odejmowany, gdy n jest liczb parzyst oraz dodawany w przeciwnym.

AKADEMIA MORSKA W SZCZECINIE WI-ET / IIT / ZTT. Instrukcja do zajęc laboratoryjnych nr 1 AUTOMATYZACJA I ROBOTYZACJA PROCESÓW PRODUKCYJNYCH

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

1 Podstawy c++ w pigułce.

Informatyka I: Instrukcja 4.2

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Zmienne i struktury dynamiczne

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

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

Podstawy Programowania C++

Architektura systemów komputerowych Laboratorium 7 Symulator SMS32 Stos, Tablice, Procedury

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Aplikacje w środowisku Java

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

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

Struktury danych: stos, kolejka, lista, drzewo

Programowanie Niskopoziomowe

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

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

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Podstawy programowania

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

1 Podstawy c++ w pigułce.

Podstawy programowania w języku C++

Programowanie w języku C++ Agnieszka Nowak Brzezińska Laboratorium nr 2

E S - uniwersum struktury stosu

1 Powtórzenie wiadomości

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

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

Podstawy i języki programowania

Podstawy obiektowości

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Microsoft Small Basic

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

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

Języki programowania imperatywnego

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

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

Język programowania PASCAL

Lekcja 6: Pascal. Procedura i funkcja

Pętle. Dodał Administrator niedziela, 14 marzec :27

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

Transkrypt:

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 wskaźników, są zwykłymi tablicami, które zamiast zmiennych przechowują wskaźniki. Sposób ich deklaracji jest identyczny do deklaracji zwykłych tablic (typ należy poprzedzić znakiem ^): nazwa : rray[od..do] of ^typ_wskaźnika; Tablice wskaźników mogą być wykorzystane, np. gdy mamy zamiar przechowywać dane, które mogą zająć dużo pamięci operacyjnej lub nie będą potrzebne przez cały czas działania programu. 1.2 jest jedną z najprostszych i najczęściej wykorzystywanych struktur danych, służy do przechowywania danych. Dane są w nim odkładane na sobie, co powoduje że można pobrać jedynie element znajdujący się na szczycie stosu (tzn. aby pobrać element znajdujący się na dnie stosu, musimy zdjąć wszystkie elementy). Odkładanie danych na stos (Instrukcja push): Przypuśćmy, że chcemy odłożyć na stosie 3 elementy:, i. 1. jest pusty. Odkładamy element (pierwsza instrukcja push) 2. Odkładamy element (druga instrukcja push)

3. Odkładamy element (trzecia instrukcja push): po odłożeniu wszystkich trzech elementów (można zauważyć, że dane są ułożone na sobie ): Pobieranie ze stosu (instrukcja pop): Chcemy teraz pobrać ze stosu element, zostawiając na nim resztę elementów. Ponieważ jest to stos, mamy jedynie dostęp do elementu znajdującego się na szczycie stosu. Dlatego w celu pobrania elementu musimy najpierw zdjąć ze stosu element. 1. Zdejmujemy ze stosu element (instrukcja pop), który w przypadku programu należałoby zapamiętać np. w zmiennej tymczasowej:

2. Zdejmujemy ze stosu element element o który nam chodziło (instrukcja pop): 3. Ponieważ chcemy resztę elementów stosu pozostawić bez zmian, musimy na niego z powrotem odłożyć element (instrukcja push): po wszystkich operacjach wygląda następująco: Jak można było zauważyć, w stosie nie ma możliwości bezpośredniego dostępu do danych znajdujących się pod szczytowym elementem. Szczegóły implementacyjne: można zaimplementować na dwa sposoby: używając tablicy lub używając specjalnie stworzonej struktury dynamicznej. oparty o tablicę: oparty o tablicę jest najprostszą implementacją stosu, posiada jednak wadę w postaci stałego rozmiaru (którym jest rozmiar tablicy) oraz gorszego zarządzania pamięcią w porównaniu z w pełni dynamicznym stosem (tablica łącznie ze wszystkimi jej elementami zajmuje pamięć

nawet gdy stos jest pusty). Struktura takiego stosu jest bardzo prosta składa się z tablicy oraz zmiennej przechowującej indeks ostatnio dodanego elementu (szczytu stosu). Na przykładzie 1 został przedstawiony stos przechowujący znaki. Dla większej czytelności i wygody używania został zadeklarowany typ rekordowy STOS, w którego środku znajduje się tablica i zmienna wskazująca na szczyt stosu. Pełny kod przykładu został przedstawiony w oddzielnym pliku. Przykład 1. type STOS = record stostab : rray [1..STOS_MX] of char; {Na stosie bedziemy przechowywali znaki} szczytu : integer; {przechowuje indeks elementu, ktory jest na szczycie stosu, oznacza, ze stos jest pusty} end; Działanie instrukcji push() dla stosu tablicowego: 1. sprawdź, czy nie osiągnięto maksymalnej pojemności (STOS_MX) (jeśli tak, zakończ) 2. zwiększ wartość zmiennej szczytu (jest to indeks w tablicy) 3. zapamiętaj w stostab[szczytu] wartość zmiennej do odłożenia na stos. Działanie instrukcji pop() dla stosu tablicowego: 1. sprawdź, czy stos nie jest pusty (sprawdź, czy wartość zmiennej szczytu nie jest mniejsza niż minimalny indeks w tablicy w tym przykładzie wartość 1) (jeśli tak, zakończ) 2. zapamiętaj w dodatkowej zmiennej wartość stostab[szczytu] 3. zmniejsz wartość zmiennej szczytu o 1 Wynik działania: Na rysunku można zauważyć typowe działanie stosu na stos odłożyliśmy napis PSCL, natomiast po zdjęciu go ze stosu otrzymaliśmy odwrócenie: LCSP. Jest to jeden z przykładów zastosowania stosu odwracanie napisów lub tablic. Maksymalny rozmiar stosu został ustawiony na 6 elementów, dlatego znak '!' nie mógł być już dodany.

w wersji dynamicznej: budowany w oparciu o struktury dynamiczne jest zazwyczaj o wiele lepszym rozwiązaniem niż stos stworzony z użyciem tablicy. Dzięki nieznacznie bardziej skomplikowanej implementacji otrzymujemy dużo większą kontrolę nad zużyciem pamięci (gdy stos jest pusty praktycznie nie zajmuje pamięci). Dodatkowo wielkość stosu jest ograniczona jedynie poprzez ilość wolnej pamięci, w przeciwieństwie do wersji tablicowej. W przykładzie 2 została przedstawiona struktura stosu przechowującego znaki (podobnie jak w poprzednim przykładzie został stworzony nowy typ). Pełny kod przykładu został przedstawiony w oddzielnym pliku. Przykład 2. type WSKDSTOS = ^DSTOS; DSTOS = record {typ rekordowy stosu} znak : char; {przechowywany typ - znaki} wskponizej : WSKDSTOS; {wskaznik na element znajdujacy sie ponizej w stosie} end; Typ DSTOS jest zwykłym rekordem, który służy do przechowywania pojedynczego elementu stosu. Każdy element składa się z dwóch zmiennych: przechowywanego znaku oraz wskaźnika na element znajdujący się bezpośrednio pod nim (w przypadku tablicy byłby to element o indeksie mniejszym o 1). Dzięki wskaźnikowi otrzymujemy powiązanie pomiędzy wszystkimi elementami odłożonymi na stosie bez użycia tablicy. Jak można zauważyć na poniższym rysunku, pod elementem znajdującym się na dnie stosu nie ma już żadnego innego elementu i jego wskaźnik ma

wartość nil 1. wskaźnik wskaźnik wskaźnik nil Oznaczenia: szczyt stosu wskaźnik na element, który znajduje się na szczycie stosu. Dzięki zaproponowanej strukturze jest to jedyny wskaźnik, jaki musimy posiadać dla stosu, aby z niego korzystać. Działanie instrukcji push(): 1. utwórz nowy element 2. zapisz w element^.znak znak do odłożenia na stos 3. ustaw wskaźnik element^.wskponizej na aktualny szczyt stosu 4. przypisz do wskaźnika szczyt stosu wskaźnik na nowo utworzony element Działanie instrukcji pop() dla stosu tablicowego: 1. sprawdź, czy stos nie jest pusty (sprawdź czy szczyt stosu nie jest równy nil) (jeśli tak, zakończ) 2. odczytaj/zapamiętaj w dodatkowej zmiennej wartość znaku z szczyt stosu^.znak 3. zapamiętaj wskaźnik na element poniżej szczytu stosu (szczyt stosu^.wskponizej) 4. usuń element wskazywany przez szczyt stosu (Dispose(szczyt stosu)) 5. do wskaźnika szczyt stosu przypisz zapamiętany wskaźnik z punktu 3. Wynik działania programu jest praktycznie identyczny do wyniku z przykładu 1. Jedyną różnicą jest to, że było możliwe dodanie znaku '!' (dzięki rezygnacji z tablicy i jej stałego rozmiaru). 1 nil jest to wartość w języku Pascal, która informuje że wskaźnik na nic nie wskazuje

2 Zadania 1. Uruchom przykładowe programy i prześledź sposób ich działania. Napisz z wykorzystaniem stosu dynamicznego program, który będzie odwracał ciąg liczb podanych przez użytkownika (aplikacja ma wyświetlać odwrócony ciąg). 2. Dany jest zestaw informacji o n studentach: nazwisko, imię, rok urodzenia, średnia ocen. Napisać program, który umożliwi umieszczenie tych danych w pamięci komputera w taki sposób, że dostęp do nich będzie się odbywał za pośrednictwem tablicy zawierającej wskaźniki do informacji o poszczególnych osobach. 3. Uzupełnić program z punktu 1 o funkcję wyznaczającą średnią arytmetyczną ocen wszystkich wprowadzonych studentów oraz o procedurę uwalniającą pamięć zajętą przez dane studentów. Sprawdzić dostępność danych po odblokowaniu przypisanej im pamięci. 4. Zmodyfikować rozwiązanie zadania z punktu 1 poprzez wykorzystanie stosu dynamicznego do przechowywania danych. 5. Uzupełnić program z punktu 3 o procedurę wyświetlającą zawartość stosu bez jego likwidacji.