Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Podobne dokumenty
Etap 2 - Budowa interfejsu. typedef struct ELEMENT* stos; struct ELEMENT { dane Dane; stos Nastepny; }; struct kolejka { stos Poczatek, Koniec; };

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

Wykład 7 Abstrakcyjne typy danych kolejka priorytetowa

1. Abstrakcyjne typy danych

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Wykład 9 - struktury rekurencyjne uporządkowane

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Co nie powinno być umieszczane w plikach nagłówkowych:

Wstęp do programowania

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

struct Student { char nazwisko[30]; int wiek; float ocena; }; #define MAX_ROZMIAR 3 Student lista_studentow[max_rozmiar];

int tab_a [ 2 ] [ 3 ];

Wykład 5_2 Algorytm ograniczania liczby serii za pomocą kopcowego rozdzielania serii początkowych

Ćwiczenie 4 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

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

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Wstęp do programowania 1

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

Programowanie Proceduralne

Szablony klas, zastosowanie szablonów w programach

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

tablica: dane_liczbowe

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Algorytmy i Struktury Danych.

Ćwiczenie 5 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych.

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Drzewa wyszukiwań binarnych (BST)

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

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

// dane umieszczone liście. Autor: Zofia Kruczkiewicz, p.325 C3 1 USM, Algorytmy i struktury danych, Wykład 8

Wyklad 7 Funkcje (c.d.). Tablice jednowymiarowe znaków

E S - uniwersum struktury stosu

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

Kontrola przebiegu programu

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane

Algorytmy sortowania w języku C. Autor: mgr inż. Sławomir Samolej. Zagadnienie 1. (Sortowanie)

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

Wskaźniki w C. Anna Gogolińska

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

TEMAT : KLASY POLIMORFIZM

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

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

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

Dynamiczne struktury danych

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

Zmienne i struktury dynamiczne

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

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

Wykład 1 Wprowadzenie do algorytmów. Zawartość wykładu 1. Wstęp do algorytmów i struktur danych 2. Algorytmy z rozgałęzieniami.

Wstęp do wskaźników w języku ANSI C

Strategia "dziel i zwyciężaj"

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

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Podejście obiektowe. Tablice (1) obiektów

Programowanie Proceduralne

Język ludzki kod maszynowy

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

INSTRUKCJE REPETYCYJNE PĘTLE

INSTRUKCJE REPETYCYJNE PĘTLE

Tworzenie aplikacji w języku Java

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Wskaźniki. Programowanie Proceduralne 1

Wykład 4. Klasa List Kolejki Stosy Słowniki

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

ALGORYTMY I STRUKTURY DANYCH

Semafor ustaw_semafor(key_t nazwa, int start); Semafor usun_semafor(semafor sem); void signal(semafor sem); void wait(semafor sem);

Zasady programowania Dokumentacja

1 Podstawy c++ w pigułce.

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Wstęp do programowania

C-struktury wykład. Dorota Pylak

Język C zajęcia nr 5

Porządek symetryczny: right(x)

Drzewa poszukiwań binarnych

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Część 4 życie programu

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Ćwiczenie nr 3. Temat: Definicje i wykorzystanie funkcji, parametry funkcji

Projektowanie klas c.d. Projektowanie klas przykład

Proste algorytmy w języku C

Języki programowania - podstawy

Programowanie w języku C++

Funkcja (podprogram) void

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Transkrypt:

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli) Definicja słownika: Słownik (tablica lub lista symboli) to struktura danych zawierająca elementy z kluczami, która pozwala na przeprowadzanie dwóch podstawowych operacji: wstawiania nowego elementu i zwrot elementu z podanym kluczem (R.Sedgewick,Algorytmy w C++) Zastosowania słownika (wg R.Sedgewick,Algorytmy w C++) Organizowanie informacji Organizacja oprogramowania systemów komputerowych (dla programów listy symboli występują w roli słowników: klucze są nazwami symbolicznymi występującymi w programach, elementy opisują nazywany przedmiot) Organizacja sieci komputerowych, gdzie stosuje się nazwy symboliczne pamięć skojarzeniowa na poziomie sprzętu Implementacje słowników (listy symboli): Tablice indeksowane kluczem (dla niewielkiej liczby kluczy wykład 7) Tablice uporządkowane ( ćwiczenie 7) Listy wiązane uporządkowane ( ćwiczenie 7) Drzewa poszukiwań binarnych (Algorytmy i struktury danych 2)... Autor: Zofia Kruczkiewicz, p.325 C3 1 Wykład 7, Algorytmy i struktury danych 1

Słownik (lista symboli) Etap 1 - Opis ADT Nazwa typu: Lista elementów z kluczami (symbolami) Własności typu: Potrafi przechować ciąg elementów i zwraca element z podanym kluczem Dostępne działania: Inicjalizacja słownika Wyszukanie jednego lub wielu elementów z kluczem Dodanie nowego elementu Usuwanie określonego elementu Wybranie k-tego największego elementu Pokazanie wszystkich elementów w kolejności kluczy Podanie liczby kluczy Etap 2 - Budowa interfejsu const int Maks=10; const int c_zero=; struct Osoba int klucz; ; typedef Osoba dane; const dane zero=c_zero; inline int f_zero(dane d, const int zero); struct lista_s dane zero; ; int rozmiar; dane* tab; void Inicjalizacja(lista_s& Slownik, dane zero, int Maks); działanie: inicjuje słownik warunki wstępne: Slownik jest pustą listą symboli warunki końcowe: Lista symboli zostaje zainicjowana jako pusta Autor: Zofia Kruczkiewicz, p.325 C3 2 Wykład 7, Algorytmy i struktury danych 1

int Wstaw(lista_s& Slownik, dane Dana); działanie: dodaje element do uporządkowanej listy symboli warunki początkowe: Dana jest daną do wstawienia do zainicjowanej listy symboli Slownik warunki końcowe: jeśli jest to możliwe, funkcja dodaje daną Dana do listy symboli Slownik i zwraca 1, w przeciwnym wypadku 0 int Usun( lista_s& Slownik, dane Dana); działanie: usuwa element o wg klucza z listy symboli Slownik, warunki początkowe: Slownik jest zainicjowaną niepustą listą symboli, Dana jest daną do usunięcia warunki końcowe: usuwa element wg jego klucza z listy symboli i zwraca 1, jeśli taki element znajdował się w słowniku, w przeciwnym wypadku zwraca 2, jeśli takiego elementu nie było lub 0, jeśli podano niewłaściwy klucz (symbol). Po usunięciu lista symboli może być pusta i musi być zainicjowana dane Szukaj_element(lista_s& Slownik, int Klucz); działanie: podaje element wg klucza z listy symboli Slownik, warunki początkowe: Slownik jest zainicjowaną niepustą listą symboli. Zakłada się, że klucz należy do zakresu symboli słownika warunki końcowe: podaje przez return element wg jego klucza z listy symboli. dane Wybierz(lista_s Slownik, int numer); działanie: podaje największy element o numerze numer z listy symboli Slownik, warunki początkowe: Slownik jest zainicjowaną niepustą listą symboli. warunki końcowe: podaje przez return element o numerze numer z listy symboli, licząc jedynie elementy z kluczem niepustym int Liczba_s(lista_s Slownik); działanie: podaje liczbę elementów z niepustym kluczem z listy symboli Slownik, warunki początkowe: Slownik jest zainicjowaną niepustą listą symboli. warunki końcowe: podaje przez return liczbę elementów, licząc jedynie elementy z kluczem niepustym void Pokaz_liste(lista_s& Slownik, void(*p)(dane Dana)); działanie: wyświetla listę posortowaną elementów z niepustym kluczem z listy symboli Slownik, warunki początkowe: Slownik jest zainicjowaną niepustą listą symboli. warunki końcowe: wyświetla za pomocą funkcji wyświetlającej, podanej za pomocą wskaźnika na funkję p, jedynie elementy z kluczem niepustym Autor: Zofia Kruczkiewicz, p.325 C3 3 Wykład 7, Algorytmy i struktury danych 1

Etap 3 - Implementacja za pomocą tablicy indeksowanej symbolami pamięć statyczna Wstawianie tab klucz 0 1 2 1 2 pamięć dynamiczna (sterta) 2. tab[klucz]=dana (sterta) 3 4 //rozmiar=5, klucz=dana.klucz równy 1 1. if (klucz >=0 && klucz < rozmiar) // ten warunek kontroluje wartość klucza int Wstaw(lista_s& Slownik, dane Dana) if (Zakres(Slownik, Dana.klucz)) Slownik.tab[Dana.klucz]=Dana; return 1; else return 0; Autor: Zofia Kruczkiewicz, p.325 C3 4 Wykład 7, Algorytmy i struktury danych 1

pamięć statyczna Usuwanie tab klucz 0 1 2 2 pamięć dynamiczna (sterta) 3 4 // rozmiar=5, klucz=dana.klucz 1. if (klucz>=0 && klucz<rozmiar) if (tab[klucz].klucz!= ) tab[klucz].klucz= ; return 1; //jest element o podanym kluczu else return 2; //brak elementu o podanym kluczu else return 0; //zły zakres klucza int Usun(lista_s& Slownik, dane Dana) if (Zakres(Slownik, Dana.klucz)) if (!f_zero(slownik.tab[dana.klucz], c_zero)) Slownik.tab[Dana.klucz]=Slownik.zero; return 1; else return 2; else return 0; Autor: Zofia Kruczkiewicz, p.325 C3 5 Wykład 7, Algorytmy i struktury danych 1

#include <conio.h> #include <stdio.h> #include <stdlib.h> //1. interfejs ADT listy symboli const int Maks=10; const int c_zero=; struct Osoba int klucz; ; // dane umieszczone liście symboli typedef Osoba dane; const dane zero=c_zero; //funkcja obsługująca klucz elementu słownika inline int f_zero(dane d, const int zero); struct lista_s dane zero; //dana zerowa zawierająca klucz pusty równy stałej c_zero int rozmiar; //rozmiar tablicy symboli odpowiadająca zakresowi kluczy dane* tab; //tablica symboli ; //funkcje ADT listy symboli void Inicjalizacja(lista_s& Lista, dane zero, int Maks); dane Szukaj_element(lista_s& Lista, int Klucz); dane Wybierz(lista_s Lista, int numer); int Liczba_s(lista_s Lista); int Wstaw(lista_s& Lista, dane Dana); int Usun(lista_s& Lista, dane Dana); void Pokaz_liste(lista_s& Lista, void(*p)(dane Dana)); //2. funkcje we/wy dla danych umieszczonych na liście symboli void Pokaz_dane (dane Dana); dane Dane(char* s); Autor: Zofia Kruczkiewicz, p.325 C3 6 Wykład 7, Algorytmy i struktury danych 1

//3. funkcje ogólnego przeznaczenia void Komunikat(char*); char Menu(const int ile, char *Polecenia[]); //4. elementy programu const int Esc=27; const int POZ=4; char * Tab_menu[POZ] = "1 : Wstawianie do listy symboli ", "2 : Usuwanie z listy symboli", "3 : Wydruk listy symboli", " >Esc Koniec programu"; //5.funkcje klienta korzystajace ze listy symboli void Wstaw_do_listy_s(lista_s& Slownik); void Usun_z_listy_s(lista_s& Slownik); void main(void) lista_s Slownik; char Wybor; clrscr(); Inicjalizacja(Slownik,zero,Maks); do Wybor= Menu(POZ, Tab_menu); switch (Wybor) case '1' : Wstaw_do_listy_s(Slownik); break; case '2' : Usun_z_listy_s(Slownik); break; case '3' : Pokaz_liste(Slownik, Pokaz_dane); break; while (Wybor!=Esc ); Autor: Zofia Kruczkiewicz, p.325 C3 7 Wykład 7, Algorytmy i struktury danych 1

//*********funkcje ogólnego przeznaczenia************ char Menu(const int ile, char *Polecenia[]) clrscr(); for (int i=0; i<ile;i++) printf("\n%s",polecenia[i]); return getch(); void Komunikat(char* s) printf(s); getch(); //**************funkcje klienta korzystające z listy symboli*********** void Wstaw_do_listy_s(lista_s& Slownik) dane Dana= Dane("Podaj dane do wstawienia: "); if (Wstaw(Slownik, Dana)) Komunikat("\nWstawiono do listy symboli"); else Komunikat("\nZly zakres symboli"); void Usun_z_listy_s(lista_s& Slownik) dane Dana = Dane("Podaj dane do usuniecia z listy symboli: "); int d = Usun(Slownik,Dana); if (d==1) Komunikat("\n Usunieto z listy symboli"); else if (d==2) Komunikat("\n brak na liscie elementu z takim symbolem"); else Komunikat("\nSymbol poza zakresem"); //******funkcje we/wy dla danych umieszczonych na liscie symboli********* dane Dane(char* s) dane a; do fflush(stdin); printf("\n\n%s",s); while (scanf("%d",&a.klucz)!=1); return a; void Pokaz_dane(dane Dana) printf("\nnumer: %d\n", Dana.klucz); printf("nacisnij dowolny klawisz...\n"); getch(); Autor: Zofia Kruczkiewicz, p.325 C3 8 Wykład 7, Algorytmy i struktury danych 1

//*********interfejs ADT listy symboli************ inline int f_zero(dane d, const int c_zero) return d.klucz==c_zero; int Zmien(lista_s& Slownik, int delta) dane* pom; pom = (dane*)realloc(slownik.tab,sizeof(dane)*(slownik.rozmiar+delta)); if (pom) Slownik.tab=pom; Slownik.rozmiar+=delta; return pom!=null; void Inicjalizacja(lista_s& Slownik, dane zero, int Maks) Slownik.rozmiar=0; Slownik.zero=zero; Slownik.tab=NULL; if (!Zmien(Slownik,Maks)) exit(0); for (int i=0; i<maks;i++) Slownik.tab[i]=zero; //wstawianie symboli z pustymi kluczami inline int Zakres(lista_s Slownik, int Klucz) return (Klucz >=0 && Klucz<Slownik.rozmiar); dane Szukaj_element(lista_s& Slownik, int Klucz) return Slownik.tab[Klucz]; int Wstaw(lista_s& Slownik, dane Dana) if (Zakres(Slownik, Dana.klucz)) Slownik.tab[Dana.klucz]=Dana; return 1; else return 0; Autor: Zofia Kruczkiewicz, p.325 C3 9 Wykład 7, Algorytmy i struktury danych 1

int Usun(lista_s& Slownik, dane Dana) if (Zakres(Slownik, Dana.klucz)) if (!f_zero(slownik.tab[dana.klucz], c_zero)) Slownik.tab[Dana.klucz] = Slownik.zero; return 1; else return 2; else return 0; dane Wybierz(lista_s Slownik, int numer) for (int i=0;i<slownik.rozmiar;i++) if (Slownik.tab[i].klucz!= Slownik.zero.klucz) if (numer-- == 0) return Slownik.tab[i]; return Slownik.zero; int Liczba(lista_s Slownik) int ile=0; for (int i=0; i<slownik.rozmiar; i++) if (Slownik.tab[i].klucz!= Slownik.zero.klucz) ile++; return ile; void Pokaz_liste(lista_s& Slownik, void(*p)(dane Dana)) for (int i=0;i<slownik.rozmiar;i++) if (!f_zero(slownik.tab[i], c_zero)) p(slownik.tab[i]); //wyświetlanie elementów z niepustym kluczem Autor: Zofia Kruczkiewicz, p.325 C3 10 Wykład 7, Algorytmy i struktury danych 1