1. Abstrakcyjne typy danych

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

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

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

Wykład 9 - struktury rekurencyjne uporządkowane

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

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

Wykład 7 Abstrakcyjne typy danych kolejka priorytetowa

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

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

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

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

int tab_a [ 2 ] [ 3 ];

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

Zofia Kruczkiewicz, ETE8305_2 1

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

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

Projektowanie klas c.d. Projektowanie klas przykład

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

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

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

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

tablica: dane_liczbowe

Szablony klas, zastosowanie szablonów w programach

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

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce.

Wstęp do programowania 1

Programowanie strukturalne i obiektowe

#include <iostream.h> #include <conio.h>

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

Język C, tablice i funkcje (laboratorium, EE1-DI)

Programowanie Proceduralne

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

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

INSTRUKCJE REPETYCYJNE PĘTLE

INSTRUKCJE REPETYCYJNE PĘTLE

Funkcja (podprogram) void

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

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

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

Wykład 1

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

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

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

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

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Wstęp do programowania

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

Język C, tablice i funkcje (laboratorium)

Część 4 życie programu

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

Dynamiczne struktury danych

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

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

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

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

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

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

Podstawy programowania C. dr. Krystyna Łapin

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

Wstęp do Programowania 2

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

Szablony funkcji i szablony klas

2 Przygotował: mgr inż. Maciej Lasota

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Podział programu na moduły

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

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

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

Stałe, tablice dynamiczne i wielowymiarowe

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

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

Wykład :37 PP2_W9

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

( wykł. dr Marek Piasecki )

Programowanie i struktury danych

Język ludzki kod maszynowy

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

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

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

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

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

Tablice, funkcje - wprowadzenie

PARADYGMATY PROGRAMOWANIA Wykład 3

Tablice deklaracja, reprezentacja wewnętrzna

Podstawy programowania w języku C++

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Zmienne i struktury dynamiczne

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Wstęp do Programowania 2

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

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Transkrypt:

1. Abstrakcyjne typy danych 1.1.Glówne cechy typów danych stosowanych w programach: 1) musza byc dostosowane do rozwiazywanego problemu 2) musza zawierac dwa rodzaje informacji: 2.1) zbiór wlasnosci 2.2) zbiór dzialan. Np. typ int wlasnosci: reprezentuje liczby calkowite o wartosciach od -32768 do +32767 zakodowanych w kodzie dwójkowym na dwóch bajtach dzialania: zmiana znaku, dodawanie, mnozenie, dzielenie, modulo... 1.2. Trzy etapy procesu definiowania typów przez programiste [wg Stephen Prata - Szkola programowania, Jezyk C]: 1) Przygotowanie opisu ADT (abstrakcyjnego typu danych). Abstrakcyjny opis obejmuje wlasnosci typu i operacji, jakie mozna na nim wykonac. Opis ten nie powinien byc zwiazany z zadna konkretna implementacja i jezykiem programowania. Taka formalna charakterystyka nosi nazwe abstrakcyjnego typu danych ADT. 2) Opracowanie interfejsu programistycznego realizujacego ADT - Jest to wskazanie sposobu przechowywania danych i opisanie zbioru funkcji wykonujacych potrzebne operacje. W jezyku C/C++ etap ten moze polegac na utworzeniu definicji struktury i prototypów funkcji przetwarzajacych. Funkcje te pelnia dla nowego typu te sama role, co operatory w przypadku podstawowych typów jezyka C/C++. Utworzony w ten sposób interfejs bedzie stosowany przez osoby, które chca skorzystac z nowego typu danych 3) Pisanie kodu implementujacego interfejs Ten krok jest kluczowy, w którym nalezy szczególowo zrealizowac wymagania wynikajace z opisu. Nalezy zauwazyc, ze programista korzystajacy z interfejsu nie musi juz orientowac sie w szczególach implementacji Wniosek: Utworzony typ danych, definiowany przez programiste stanowi pewien kompletny element jezyka, który moze byc uzywany wielokrotnie w programach. Jedyny wlasciwy sposób wykorzystania nowego typu odbywa sie za posrednictwem funkcji z interfejsu typu. Nie nalezy bezposrednio odwolywac sie do zmiennych reprezentujacych dana zdefiniowanego typu. Zofia Kruczkiewicz, p325 C3 2

2.1. Definiowanie listy nieuporzadkowanej jako statycznej tablicy struktur metoda ADT Etap 1 - Opis ADT Nazwa typu - Statyczna lista nieuporzadkowanych elementów Wlasnosci typu: Potrafi przechowac ciag elementów o ograniczonym rozmiarze Dostepne dzialania:» Inicjalizacja listy» Okreslenie, czy lista jest pelna» Okreslenie, czy lista jest pusta» Wyszukanie elementu» Dodanie elementu wewnatrz, na poczatku i na koncu listy,» Usuwanie elementu wewnatrz, na poczatku i na koncu listy,» Przejscie przez liste i przetwarzanie kazdego elementu» Przetwarzanie wyszukanego elementu Etap 2 - Budowa interfejsu void Inicjalizacja (int & ile); /* dzialanie: inicjuje liste warunki wstepne: lista nie jest zainicjowana warunki koncowe: lista zostaje zainicjowana jako pusta, ile jest równe 0 i jest numerem elementu pustego. Dopiero po wywolaniu tej funkcji prawdziwe sa definicje pozostalych funkcji */ int Pusta (int ile); /*dzialanie: okresla czy lista jest pusta warunki wstepne: ile jest numerem ostatniego elementu wstawionego do listy warunki koncowe: funkcja zwraca wartosc 1, gdy lista jest pusta, w przeciwnym wypadku zwraca 0*/ int Pelna (int ile); /*dzialanie: okresla czy lista jest pelna warunki wstepne: ile jest numerem ostatniego elementu wstawionego do listy warunki koncowe: funkcja zwraca wartosc 1, gdy lista jest pelna, w przeciwnym wypadku zwraca 0*/ int Szukaj(int ile, int ktory); /*dzialanie: szuka wskazanego elementu warunki poczatkowe: który jest numerem szukanego elementu, ile jest numerem ostatniego elementu przy usuwaniu lub wiekszym o 1 przy wstawianiu warunki koncowe: funkcja zwraca 1, gdy znaleziono element o numerze ktory spelniajacy warunki 1<=ktory<=ile, w przeciwnym wypadku zwraca 0 */ Zofia Kruczkiewicz, p325 C3 3

void Wstaw(OSOBA tab[], OSOBA dane, int ktory, int &ile); /*dzialanie: dodaje element na poczatku, wewnatrz lub na koncu listy warunki poczatkowe: ile jest numerem ostatnio wstawionego elementu do listy lub elementu pustego, wynik funkcji Pelna po podstawieniu wartosci ile jest równy 0, który jest numerem miejsca do wstawienia podanym przez funkcje Szukaj z wynikiem 1 dla ile=ile+1, który oznacza numer miejsca za ostatnio wstawionym elementem lub pustym warunki koncowe: funkcja dodaje element na wskazanym miejscu ktory po rozsunieciu elementów lub na koncu ciagu, zwieksza o 1 numer ostatniego elementu ile */ void Usun(OSOBA tab[], int ktory, int &ile); /*dzialanie: usuwa element nalezacy do listy warunki poczatkowe: wynik funkcji Pusta po podstawieniu wartosci ile jest równy 0, ile jest numerem ostatniego elementu wstawionego do listy, który jest numerem elementu do usuniecia podanym przez funkcje Szukaj z wynikiem 1, warunki koncowe: funkcja usuwa element na wskazanym miejscu ktory przez zsuniecie lub ostatni element ciagu, zmniejsza liczbe elementów w ile */ void Usun_tablice(int &ile); /*dzialanie: kasuje liczbe elementów i inicjuje tablice warunki poczatkowe: tablica jest pusta lub niepusta, ile oznacza numer ostatniego elementu wstawionego do listy lub elementu pustego warunki koncowe: ile jest numerem pustym, równym 0*/ void Dla_kazdego(OSOBA tab[], int ile, zrob); /*dzialanie: wykonuje funkcje na kazdym wstawionym elemencie do listy warunki poczatkowe: wynik funkcji Pusta po podstawieniu wartosci ile jest równy 0, ile jest numerem ostatniego elementu wstawionego do listy, zrob jest typem funkcji, która przetwarza element listy i nie zwraca wartosci. warunki koncowe: funkcja typu zrob jest wykonywana tylko raz dla kazdego elementu wstawionego do listy*/ void Dla_jednego(OSOBA tab[], int ile, int ktory, zrob); /*dzialanie: wykonuje funkcje na wybranym elemencie wstawionym do listy warunki poczatkowe: wynik funkcji Pusta po podstawieniu wartosci ile jest równy 0, ile jest numerem ostatniego elementu wstawionego do listy, zrob jest typem funkcji, która przetwarza element listy o numerze ktory podanym przez funkcje Szukaj z wynikiem 1 i nie zwraca wartosci. warunki koncowe: funkcja typu zrob jest wykonywana tylko raz dla elementu o numerze ktory*/ Zofia Kruczkiewicz, p325 C3 4

Etap 3 - Implementacja Definicja typu OSOBA w pliku naglówkowym strukt.h #ifndef STRUKT #define STRUKT const int DL=10; struct OSOBA int Numer; char Nazwisko[DL]; }; #endif Zawartosc pliku naglówkowego we_wy.h zawierajacego deklaracje uniwersalnych funkcji we/wy dla struktur typu OSOBA #ifndef WE_WY #define WE_WY #include "strukt.h" void Pokaz_dane (OSOBA &Dana); OSOBA Dane(); #endif Zawartosc pliku modulowego we_wy.cpp zawierajacego definicje uniwersalnych funkcji we/wy dla struktur typu OSOBA #include <conio.h> #include <stdlib.h> #include <string.h> #include "we_wy.h" #include "strukt.h" OSOBA Dane() char bufor[dl+2]; OSOBA Nowy; bufor[0]=dl; cprintf("\r\nnumer: "); cgets(bufor); Nowy.Numer=atoi(bufor+2); cprintf("\r\nnazwisko: "); strcpy(nowy.nazwisko,cgets(bufor)); return Nowy;} void Pokaz_dane(OSOBA &Dana) cprintf("\r\nnumer: %d\r\n", Dana.Numer); cprintf("nazwisko: %s\r\n", Dana.Nazwisko); cprintf("nacisnij dowolny klawisz...\r\n"); getch();} Zofia Kruczkiewicz, p325 C3 5

Zawartosc pliku naglówkowego tablica1.h z deklaracjami funkcji interfejsowych defniowanej statycznej tablicy struktur jako listy nieuporzadkowanej #ifndef TABLICA #define TABLICA #include "strukt.h" const int ROZ=5; typedef void(*zrob)(osoba &); void Inicjalizacja(int& ile); int Pelna(int ile); int Pusta(int ile); int Szukaj(int ile, int ktory); void Wstaw(OSOBA*tab, OSOBA dane, int ktory, int &ile); void Usun(OSOBA*tab, int ktory, int &ile); void Usun_tablice(int &ile); void Dla_kazdego(OSOBA*tab, int ile, zrob); void Dla_jednego(OSOBA*tab, int ktory, zrob); #endif Zawartosc pliku modulowego tablica1.cpp z definicjami funkcji interfejsowych #include "tablica1.h" void Inicjalizacja(int & ile) ile=0;} int Pelna(int ile) return ile==roz;} int Pusta(int ile) return ile==0;} int Szukaj(int ile, int ktory) return ktory>=1 && ktory<=ile;} //wy=1 tablica pelna, wy=0 jest miejsce //wy=1 tablica pusta, wy=0 sa elementy // wy-1 znalazl; wy = 0 nie void Wstaw(OSOBA* tab, OSOBA dane, int ktory,int &ile) for (int i=ile; i>=ktory; i--) // zalozenia: 0<=ile <N oraz 1<=ktory<=ile+1 tab[i]=tab[i-1]; tab[ktory-1]=dane; ile++;} void Usun(OSOBA* tab, int ktory, int &ile) for (int i=ktory-1; i<ile-1; i++) // zalozenia: 0<ile <=N i 1<=ktory<=ile tab[i]=tab[i+1]; ile--;} void Usun_tablice (int &ile) Inicjalizacja(ile); } void Dla_kazdego(OSOBA* tab, int ile, zrob funkcja) for (int i=0; i<ile;i++) funkcja(tab[i]); } //wykonaj operacje zrob na zawartosci tablicy void Dla_jednego(OSOBA* tab, int ktory, zrob funkcja) funkcja(tab[ktory-1]);} //wykonaj czynnosc zrob dla elementu tablicy Zofia Kruczkiewicz, p325 C3 6

Przykladowa aplikacja wykorzystujaca liste nieuporzadkowana reprezentowana przez statyczna tablice struktur (tablist1.cpp) #include <conio.h> #include <stdlib.h> #include "tablica1.h" #include "dodatki.h" #include "we_wy.h" //definicja statycznej tablicy struktur jako listy nieuporzadkowanej //uniwersalne funkcje obslugujace menu i komunikaty //uniwersalne funkcje we/wy dla struktur typu OSOBA char *Polecenia[POZ]="Tablica OSOBA tab[roz] - obsluga typu lista", " Nacisnij:", " 1 - aby wstawic element do listy", " 2 - aby usunac element z listy", " 3 - aby wyswietlic wybrany element z listy", " 4 - aby wyswietlic liste, ", " 5 - aby usunac liste", " 6 - aby zakonczyc prace."}; // funkcje posrednio przetwarzajace tab i ile za pomoca funkcji z modulu tablica1 void Wstaw_(OSOBA*tab,int &ile); void Usun_(OSOBA*tab, int &ile); void Pokaz_jeden(OSOBA*tab,int ile); void Pokaz_(OSOBA*tab,int ile); // funkcja ogólnego przeznaczenia int Losuj(int zakres); void main(void) int ile; OSOBA tab[roz]; char Co; randomize(); Inicjalizacja(ile); do Co = Menu(POZ,Polecenia); switch(co) case '1' : Wstaw_(tab,ile); break; case '2' : Usun_(tab,ile); break; case '3' : Pokaz_jeden(tab,ile); break; case '4' : Pokaz_(tab,ile); break; case '5' : Usun_tablice(ile); break; default : Komunikat("\r\nKoniec programu"); } }while (Co < '6' && Co>'0'); } Zofia Kruczkiewicz, p325 C3 7

int Losuj(int zakres) int ktory=random(zakres); cprintf("\r\n\nnumer elementu: %d",ktory); getch(); return ktory; } //model mylacego sie uzytkownika programu void Pokaz_jeden(OSOBA* tab,int ile) if (Pusta(ile)) Komunikat("\r\nTablica pusta"); int ktory=losuj(ile+4); if (Szukaj(ile,ktory)) Dla_jednego(tab,ktory,Pokaz_dane); Komunikat("\r\nPodano zly numer"); } } //obsluga wyszukania void Wstaw_(OSOBA*tab,int &ile) //obsluga wstawiania if (Pelna(ile)) Komunikat("\r\nPelna tablica"); int ktory=losuj(ile+4); if (!Szukaj(ile+1,ktory)) Komunikat("\r\nPodano zly numer"); cprintf("\r\npodaj tab[%d]",ktory-1); Wstaw(tab,Dane(),ktory,ile); } } } void Usun_(OSOBA* tab,int &ile) //obsluga usuwania if (Pusta(ile)) Komunikat("\r\nTablica pusta"); int ktory=losuj(ile+4); if (!Szukaj(ile,ktory)) Komunikat("\r\nPodano zly numer"); Usun(tab,ktory,ile); Komunikat("\r\nUsunieto element"); } } } void Pokaz_(OSOBA* tab,int ile) if (Pusta(ile)) Komunikat("\r\nTablica pusta"); Dla_kazdego(tab,ile,Pokaz_dane); } //obsluga wyswietlenia zawartosci tablicy Zofia Kruczkiewicz, p325 C3 8

Zawartosc pliku naglówkowego dodatki.h z pomocniczymi funkcjami obslugujacymi menu programu oraz komunikaty #ifndef DODATKI #define DODATKI const int POZ=8; void Komunikat(char*); char Menu(const int ile, char *Polecenia[POZ]); #endif Zawartosc pliku modulowego dodatki.cpp z pomocniczymi funkcjami obslugujacymi menu programu oraz komunikaty #include <conio.h> #include "dodatki.h" char Menu(const int ile, char *Polecenia[]) clrscr(); for (int i=0; i<ile;i++) cprintf("\r\n%s",polecenia[i]); return getch(); } void Komunikat(char* s) cprintf( %s,s); getch(); } Zofia Kruczkiewicz, p325 C3 9