Struktury. Przykład W8_1

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

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.

Pliki. Informacje ogólne. Obsługa plików w języku C

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

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

Biblioteka standardowa - operacje wejścia/wyjścia

Pliki. Informacje ogólne. Obsługa plików w języku C

Funkcje zawarte w bibliotece < io.h >

Funkcja, argumenty funkcji

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

Funkcje zawarte w bibliotece < io.h >

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Wykład 4: Klasy i Metody

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Dynamiczne struktury danych

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Wskaźniki. Programowanie Proceduralne 1

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

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

Lab 9 Podstawy Programowania

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

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

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

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

Podstawy programowania w języku C++

Języki i metodyka programowania. Wskaźniki i tablice.

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

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

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

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

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

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

Uzupełnienie dot. przekazywania argumentów

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

Struktury czyli rekordy w C/C++

Podstawy programowania w języku C++

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

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Spis treści JĘZYK C - PLIKI BINARNE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF30

Programowanie i struktury danych

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

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Programowanie obiektowe

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Stałe i zmienne znakowe. Stała znakowa: znak

Ghost in the machine

E S - uniwersum struktury stosu

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

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

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

Podstawy programowania w języku C++

Wskaźniki w C. Anna Gogolińska

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

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)

Szablony klas, zastosowanie szablonów w programach

int f(); //f - funkcja zwracająca wartość typu int int (*f)(); //f - wskaźnik do funkcji zwracającej wartość typu int

Programowanie Proceduralne

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Tablice, funkcje - wprowadzenie

MATERIAŁY POMOCNICZE PODSTAWY PROGRAMOWANIA Na podstawie: Programowanie w C - Stworzone na Wikibooks, bibliotece wolny podręczników

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

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

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

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


Języki i metody programowania I

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

Wskaźniki. Informatyka

Linux Kernel III. Character devices

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

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

Struktury dynamiczne

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

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

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

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

Podstawy programowania w języku C++

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Podstawy programowania w języku C++

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

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

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

Podstawy programowania w języku C++

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Zmienne i struktury dynamiczne

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Programowanie Proceduralne

Programowanie Niskopoziomowe

Podstawy programowania komputerów

Programowanie Procedurale. Pliki w języku C++

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

Zmienne, stałe i operatory

Transkrypt:

Struktury Struktury pozwalają na grupowanie zmiennych różnych typów pod wspólną nazwą. To istotnie ułatwia organizacje danych, które okazują się w jednym miejscu kodu programu. To jest bardzo ważne dla dużych programów, dla tego że pozwala uporządkować kod. Jest koniecznym warunkiem (ale nie wystarczającym) obiektowego oprogramowania dane, zebrane jako elementy struktury, tworzą obiekty danych (nie wystarcza im metod funkcji, które zabezpieczają działania nad danymi). Składowymi struktur mogą być zmienne dowolnych typów, tablice i struktury również. Przykład W8_1

1. Sposoby definicji struktur struct STUDENT_ACCOUNT //definicja struktury int rok; char name[128]; char lastname[128]; }; //deklaracja obiektów o nazwie s1, s2 typu struct STUDENT_ACCOUNT struct STUDENT_ACCOUNT s1, s2; 2. struct STUDENT_ACCOUNT int rok; char name[128]; char lastname[128]; }s1, s2; //definicja struktury oraz deklaracja obiektów o nazwie s1, s2 typu struct STUDENT_ACCOUNT

3. Deklarujemy wskaźnik do struktury typu STUDENT_ACCOUNT STUDENT_ACCOUNT //definicja struktury int rok; char name[128]; char lastname[128]; }; //deklaracja wskaźnika wydzielono 4 B dla wskaźnika. //dla struktury pamięć nie pozostała zaalokowaną. STUDENT_ACCOUNT *ptr_s = NULL; //alokujemy pamięć ptr_s = (STUDENT_ACCOUNT *)malloc(sizeof(student_account)); if(!ptr_s). } ptr_s->rok = 1988;... free(ptr_s); ptr_s = NULL;

1. Odwołanie do elementów struktury: STUDENT_ACCOUNT s1; s1.rok = 27; printf( name = %s\n, s1.name); sprintf(s1.lastname, Kowalski ); 2. Odwołanie do elementów struktury przez wskaźnik do struktury: STUDENT_ACCOUNT *ptr_s = NULL; ptr_s = (STUDENT_ACCOUNT *) malloc(sizeof(student_account)); if(!ptr_s)... } ptr_s->rok = 27; printf( name = %s\n, ptr_s-> name); sprintf(ptr_s-> lastname, Kowalski ); free(ptr_s); ptr_s = NULL;

3. Odwołanie do elementów tablicy struktur: STUDENT_ACCOUNT *ptr_s = NULL; ptr_s = (STUDENT_ACCOUNT *) malloc(1*sizeof(student_account)); if(!ptr_s)... } for(i=; i<1; i++) ptr_s[i].rok = 27; printf( name = %s\n, ptr_s[i].name); sprintf(ptr_s[i].lastname, Kowalski ); } free(ptr_s); ptr_s = NULL; //id_wskażnik[element_tablicy].id_pola

Przykład WW_8.3. Operator przypisania =, a również funkcja memcpy, memset są bardzo niebezpieczne dla struktur. Na poziomie języka C trzeba pisać funkcje dla kopiowania pól struktur takiego samego typu.

Struktury danych: Tablica, Kolejka, Stos, Lista, Drzewo binarne. Tablica zajmuje ciągłe bajty pamięci. Odbywa się bezpośredni (najszybszy) dostęp do elementów (obiektów) tablicy. Inne struktury tylko sekwencyjny dostęp. Dla dostępu do elementu o numerze n trzeba sekwencyjnie pobrać poprzednie n 1 elementów.

Kolejka dostęp do elementów na podstawie FIFO (first in, first out). Element, który był pierwszym umieszczony w kolejce, pierwszym będzie pobrany. Dostęp do danych tego elementu jest możliwy tylko przy pobraniu. Pobranie jest możliwe tylko przy usunięciu elementu z kolejki. Chronimy tylko wskaźnik do. Dostęp mamy tylko do. Żeby pobrać kolejny element, musimy najpierw pobrać, a dalej przestawić do kolejnego elementu. Przykład Queue!! Kolejka Dodajemy element do kolejki (push) Info_4 next next next next next usuwamy element z kolejki (pop) next next Info_4

Stos - dostęp do elementów na podstawie LIFO (last in, first out). Element, który był umieszczony w stosie ostatnim, pierwszym będzie pobrany. Dostęp do danych tego elementu jest możliwy tylko przy pobraniu. Pobranie jest możliwe tylko przy usunięci elementu ze stosu. Chronimy tylko wskaźnik do. Dostęp mamy tylko do. Żeby pobrać kolejny element, musimy najpierw pobrać, a dalej przestawić do kolejnego elementu. Stos Dodajemy element do stosu (push) Info_4 prev prev prev prev prev usuwamy element ze stosu (pop) Info_4 prev prev

Lista dwustronna. Każdy element ma referencje do poprzedniego i do następnego. Pobranie dowolnego elementu nie oznacza usunięcie jedo z listy. Dla usunięcia elementu z listy trzeba osobne działanie. Listę dwustronną można przeglądać jako od początku do końca, tak i odwrotnie. (Na różnice od tablicy lista nadaje możliwość tylko sekwencyjnego dostępu do elementów). Przy uszkodzeniu danych łatwiej odnowić. Łatwiejsze wykonanie wielu działań. To jest tak zwana dynamiczna struktura danych ilość elementów staje wiadoma tylko przy wykonaniu programu. info info info info next prev next prev next prev

Info to jest dane (structura danych języka C) Wskaźnik do poprszednie go elementy prev Wskaźnik do następnego elementy next Każdy element zawiera: Dane Wskaźnik do poprzedniego elementu Wskaźnik do następnego elementu Wskazanie do elementów listy Przykład W8_2_1

wskaźnik do początku listy. - wskaźnik do końca listy Dodawanie elementów listy 1. Lista pusta. = NULL, = NULL. 2. Dodajemy pierwszy element: Teraz i wskazują do pierwszego elementu 3. Dodajemy drugi element: 4. Dodajemy trzeci element: next prev next prev next prev

1. Usunięcie elementu Usunięcie elementów listy next prev next prev next next prev next prev

Usunięcie elementów listy 1. Usunięcie elementu! i! next next prev next prev next prev prev next prev

1. Usunięcie elementu Usunięcie elementów listy next prev next prev next prev prev next prev

Algorytmy (metody) obsługiwania listy: struct STUDENT_ACCOUNT int rok; //rok urodzenia char name[256]; //imie char sname[256]; //nazwisko STUDENT_ACCOUNT *prev; STUDENT_ACCOUNT *next; }; int LIST_Add(STUDENT_ACCOUNT s); void LIST_Remove(STUDENT_ACCOUNT *s); STUDENT_ACCOUNT *LIST_Find(STUDENT_ACCOUNT s); void LIST_LookForward(); int LIST_StoreToDisk(); int LIST_ReadFromDisk(); void LIST_Erase(); void LIST_Free();

Zapis danych do pliku binarnego: Funkcje obsługi plików binarnych size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream); buffer - bufor, ktory piszemy na dysk size - rozmiar jednostki zapisu w B count - ilosc zapisow stream - wskaznik do pliku zwraca ilosc zapisow, ktore aktualne pozostale zapisane Przykład: piszemy 1 zapisów danych typu STUDENT_ACCOUNT w plik, na który wskazuje pf size_t count_written; count_written = fwrite((const void *)tmp, sizeof(student_account), 1, pf); if(count_written!= 1) return ; // błąd!

Czytanie danych z pliku binarnego: Funkcje obsługi plików binarnych size_t fread(void *buffer, size_t size, size_t count, FILE *stream); buffer - bufor, ktory piszemy na dysk size - rozmiar jednostki zapisu w B count - ilosc zapisow stream - wskaznik do pliku zwraca ilosc zapisow, ktore aktualne pozostale zapisane Przykład: czytamy 1 zapisów danych typu STUDENT_ACCOUNT z pliku, na który wskazuje pf, w bufor tmp; STUDENT_ACCOUNT *tmp = (STUDENT_ACCOUNT *)malloc(1*sizeof(student_account )); if(!tmp) return ; //błąd! size_t count_read; count_read = fread((void *)tmp, sizeof(student_account), 1, pf); count_read!= 1) return ; // błąd!

Funkcje obsługi plików binarnych Ustawienie wskaźnika pozycji pliku: int fseek( FILE *stream, long offset, int origin ); Przesuwa wskaźnik pliku na offset bajtów od origin. Origin: SEEK_CUR - od bieżącej pozycji SEEK_END - od końca pliku SEEK_SET - od początku plku Zwraca, jeśli OK. long ftell( FILE *stream ); Zwraca wskaźnik bieżącej pozycji pliku.

Funkcje obsługi plików binarnych Przykład: //otworzymy pusty plik na zapis i czytanie. Jeśli plik już istnieje, będzie //wyczyszczony. FILE *pf = fopen( my_plik_data.inf, w+b );... long plik_pos[1]; size_t count_written, count_read; plik_pos[] = ftell(pf); // plik_pos[] wskazuje na początek zapisu obj_1 w pliku count_written = fwrite((const void *)&obj_1, sizeof(objekt_1), 1, pf); if(count_written!= 1) return ; // błąd! plik_pos[1] = ftell(pf); // plik_pos[1] wskazuje na początek następnego zapisu... //przesuwamy wskaźnik pozycji pliku do czytania (zapisu) obj_1 if(fseek(pf, plik_pos[], SEEK_SET)!= ) return ; //błąd! count_read = fread((void *)&obj_1, sizeof(objekt_1), 1, pf); if(count_read!= 1) return; //błąd!

typedef type-declaration synonym; Deklaracja typedef nadaje możliwość wprowadzenia swoich własnych nazw istniejących typów danych. Nadaje możliwość zmian istniejących typów danych bez istotnych zmian w kodzie. Oprócz tego robi kod bardziej czytelnym z punktu widzenia merytorycznego. type-declaration - jeden z istniejących typów danych. Synonym - nowa nazwa. Przykład 1. typedef long GRAPHNODE;... GRAPHNODE it; //to jest long it; GRAPHNODE arr[512]; //to jest long arr[512]; GRAPHNODE *ptr_a; //to jest long *ptr_a; To oznacza, że wszędzie, gdzie używana definicje typu GRAPHNODE, faktycznie jest zastosowany typ long. GRAPHNODE to synonim long. Jeśli wynika konieczność zmiany typu bazowego long na int64, wystarczy tylko w jednym miejscu programy zmienić

typedef int64 GRAPHNODE;... GRAPHNODE it; //to jest int64 it; GRAPHNODE arr[512]; //to jest int64 arr[512]; GRAPHNODE *ptr_a; //to jest int64 *ptr_a; Przykład 2. typedef struct MY_TYP_DATA int i; double a; } MYSTRUCT; int main() MYSTRUCT ms; ms.i = 1; ms.a = -1.e-4;... return ; }

Przykład 3. (To jest to samo, co przykład 2) struct MY_TYP_DATA int i; double a; }; typedef struct MY_TYP_DATA MYSTRUCT; int main() MYSTRUCT ms; ms.i = 1; ms.a = -1.e-4;... return ; }

Wskaźnik do funkcji. Jest możliwe tylko dwa działania z funkcjami wywołanie i pobranie adresu. Pobranie adresu: void fun(char *p); //prototyp funkcji //deklaracja wskaźnika do funkcji, która zwraca void i ma listę argumentów //char *p: void (*efct)(char *p); int main() efct = &fun; //efct ma teraz adres funkcji fun (*efct)( błąd... ); //wywołanie funkcji przez wskaźniku... } void fun(char *p)... }

Przekazanie argumentów przy wywołaniu funkcji przez wskaźnik jest dokładnie takim samym, jak i przy wywołaniu zwykłym. Przykład W8_2 Definicja tablicy wskaźników do funkcji: //prototypy funkcji, które mają taką samą listę argumentów formalnych i //zwracają ten samy typ int fun(double a); int fun_1(double a); //definiujemy tablice wskaźników i inicjalizujemy int (*tabfun[ ])(double a) = &fun, &fun_1};... //wywołanie: int ret = (*tabfun[])(1.); //wywołujemy fun int ret1 = (*tabfun[1])(2.); //wywołujemy fun_1

Zagadnienie: Dla podanej funkcji y = f(x) odnaleźć takie x, dla których f(x) =. Metoda Newtona: zakładamy, że my znamy wartość x, bliską do rozwiązania xꞌ = x+δx. Linearyzacja: y y y y f x x f x x f df dx df dx x x x x ; x x;

Algorytm: Przykład W8_2_3 x x; i while(err y f (x ) err i 1 y i i tol) if (err tol) break; y f (x ) y x df x i dx x x x end _ while i