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

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

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

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

Zmienne i struktury dynamiczne

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

Lab 9 Podstawy Programowania

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

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

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

Podstawy Programowania C++

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

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

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

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

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

Wykład 1: Wskaźniki i zmienne dynamiczne

Tablice, funkcje - wprowadzenie

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

tablica: dane_liczbowe

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

Wykład 3 Składnia języka C# (cz. 2)

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

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

Wskaźniki w C. Anna Gogolińska

Podstawy programowania

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

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

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

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

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

Analiza konstrukcji zawierających wskaźniki. Piotr Błaszyński

Tablice, funkcje, wskaźniki - wprowadzenie

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

Wstęp do programowania

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

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

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

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:

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Stałe, tablice dynamiczne i wielowymiarowe

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

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

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

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

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

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

Język C, tablice i funkcje (laboratorium)

Podstawy programowania komputerów

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

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

Podstawy programowania. Wykład: 6. Tablice statyczne. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

Tablicę 2-wymiarową można przedstawić jako pewien zestaw tablic 1-wymiarowych np.:

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

Język ANSI C tablice wielowymiarowe

Podstawy Programowania Obiektowego

Przekazywanie argumentów wskaźniki

Języki i techniki programowania Ćwiczenia 2

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

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

Wskaźniki. Informatyka

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

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

1 Podstawy c++ w pigułce.

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

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

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.

Podstawowe struktury danych

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

Wykład 4: Klasy i Metody

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

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

1 Podstawy c++ w pigułce.

Wskaźniki. Programowanie Proceduralne 1

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

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

Struktury. Przykład W8_1

IX. Wskaźniki.(3 godz.)

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

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

Podstawy programowania w języku C++

Programowanie komputerowe. Zajęcia 4

dodatkowe operacje dla kopca binarnego: typu min oraz typu max:

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

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

Podstawy programowania. Podstawy C# Tablice

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

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

Język C zajęcia nr 11. Funkcje

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

6 Przygotował: mgr inż. Maciej Lasota

Część 4 życie programu

Transkrypt:

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

Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane są tablice dwuwymiarowe matematycznym odpowiednikiem tablic dwuwymiarowych są macierze Definicja tablicy k wymiarowej ma postać: typ nazwa[n_1][n_2]..[n_k]; // + ewentualne inicjowanie, np. int tab_int_2d[2][3] = { {0,1,2}, {4,5,6} }; np. dla tablicy znaków przechowującej wiele linii teksu: #define MAX_DL_L 55 // maksymalna liczba znaków w jednej linii tekstu #define MAX_N_L 15 // maksymalna liczba linii tekstu char tekst_wieloliniowy[max_n_l][max_dl_l]; Tablice wielowymiarowe przechowywane są w kolejnych komórkach pamięci istnieje tylko jeden symbol (nie zmienna) w programie zawierający adres tablicy wielowymiarowej Krzysztof Banaś Podstawy programowania 2

Tablice wielowymiarowe Dostęp do elementu tablicy wykorzystuje notację: int linia = 5; int znak_w_linii = 27; tekst_wieloliniowy[ linia ][ znak_w_linii ] = 'q'; printf("%c", tekst_wieloliniowy[ 5 ][ 27 ]); Indeksy elementu tablicy służą do prostego obliczenia jego adresu: adres = początek + ( linia*max_dl_l + znak_w_linii ) * rozmiar_typu z tego względu tablice wielowymiarowe często zamieniane są na tablice jednowymiarowe: char tekst_wieloliniowy_1d[ MAX_N_L*MAX_DL_L ]; int linia = 5; int znak_w_linii = 27; tekst_wieloliniowy_1d[ linia*max_dl_l + znak_w_linii ] = 'q'; printf("%c", tekst_wieloliniowy_1d[ 5*MAX_DL_L + 27 ]); standardowy sposób przechowywania tablic dwuwymiarowych w C oznacza przechowywanie macierzy wierszami Krzysztof Banaś Podstawy programowania 3

Tablice wielowymiarowe Przesyłanie tablic wielowymiarowych jako argumentów funkcji realizuje prosta notacja: funkcja_tab_wielo( nazwa_tab_wielo ); wczytaj_tekst ( tekst_wieloliniowy ); Każdorazowo wewnątrz funkcji musi być możliwe obliczenie adresu dowolnego elementu posługując się indeksami elementu, jak np. w przypadku przykładowej tablicy dwuwymiarowej: adres = początek + ( linia*max_dl_l + znak_w_linii ) * rozmiar_typu oznacza to, że poza nazwą tablicy (czyli adresem jej początku) muszą zostać przekazane dodatkowe parametry określające rozmiar tablicy, np. w przypadku przykładowej tablicy dwuwymiarowej parametr MAX_DL_L parametr ten musi znaleźć się w deklaracji funkcji, co oznacza, że musi być znany w trakcie kompilacji! (w klasycznym C) Krzysztof Banaś Podstawy programowania 4

Tablice wielowymiarowe Deklaracje funkcji przyjmujących jako argument tablicę wielowymiarową mogą mieć jedną z równoważnych postaci: wczytaj_tekst ( char tekst_wieloliniowy [N_L] [MAX_DL_L] ); wczytaj_tekst ( char tekst_wieloliniowy [ ] [MAX_DL_L] ); wczytaj_tekst ( char (*tekst_wieloliniowy)[max_dl_l] ); ostatnia postać wykorzystuje utożsamienie nazwy tablicy ze wskaźnikiem W przypadku alternatywnego przechowywania macierzy w postaci tablic jednowymiarowych: parametry (wymiary) tablicy nie muszą być znane w czasie kompilacji muszą jednak zostać w jakiś sposób przekazane funkcji deklaracja funkcji: wczytaj_tekst_1d( char* tekst_wieloliniowy, int max_dl_l); wywołanie: wczytaj_tekst_1d( tekst_wieloliniowy, max_dl_l); Krzysztof Banaś Podstawy programowania 5

Tablice wskaźników Tablice wielowymiarowe nie są elastycznym i często używanym elementem C Znacznie częściej stosowane są bardziej elastyczne tablice wskaźników, np. dla poprzedniego przykładu: #define MAX_N_L 15 // maksymalna liczba linii tekstu char* tekst_wieloliniowy_tab_wsk[max_n_l] = {NULL}; // notacja! wskaźniki są zainicjowane dla bezpiecznego użycia ich wartości muszą zostać podstawione jako adresy istniejących zmiennych lub za pomocą funkcji alokacji pamięci, np. char napis_tab[10] = "..."; tekst_wieloliniowy_tab_wsk[0] = napis_tab; int dl_l = 25; int linia =5; tekst_wieloliniowy_tab_wsk[linia] = malloc( dl_l*sizeof(char)); w powyższym przypadku tekst_wieloliniowy_tab_wsk jest symbolem oznaczającym tablicę (jej adres), natomiast składowe tej tablicy są zmiennymi, które mogą przyjmować różne wartości (adresów) Krzysztof Banaś Podstawy programowania 6

Tablice wskaźników Wskaźniki będące składowymi tablicy wskaźników mogą pokazywać na rozmaite obiekty w pamięci wskaźniki muszą zachować zgodność typu wskazywanych obiektów z deklaracją tablicy: int* tab_wsk_int[10] = {NULL}; double* tab_wsk_d[10] = {NULL}; char* tekst_wieloliniowy_tab_wsk[max_n_l] = {NULL}; Dostęp do obiektów wskazywanych przez elementy tablicy wskaźników zależy od tego na co wskazują elementy: elementy mogą pokazywać na pojedyncze zmienne, np.: int liczba_int=5; int* tab_wsk_int[10] = {NULL}; tab_wsk_int[0] = &liczba_int; printf("%d", *tab_wsk_int[0]); // lub printf("%d", tab_wsk_int[0][0]); taki sposób wydaje się nie mieć uzasadnienia wygodniej jest stosować po prostu tablice liczb Krzysztof Banaś Podstawy programowania 7

Tablice wskaźników Dostęp do obiektów wskazywanych przez elementy tablicy wskaźników zależy od tego na co wskazują elementy: elementy mogą pokazywać na tablice zmiennych: double tab_d[10] = {1.0, 2.0, 0}; double* tab_wsk_d[10] = {NULL}; tab_wsk_d[0] = tab_d; printf("%lf", tab_wsk_d[0][1]); taki sposób użycia daje elastyczność stosowania wskazywane tablice mogą mieć różną długość (jak w poprzednim przykładzie) elementy mogą pokazywać na struktury typedef struct mg_punkt_2d{ double x; double y; } mg_punkt_2d; mg_punkt_2d* koniec[2] = {NULL}; mg_punkt_2d p1 = {0.0,0.0}; koniec[0] = &p1; koniec[0]->x = 1.0; printf("%lf\n", koniec[0]->x); tablice wskaźników do struktur mogą służyć do konstruowania złożonych struktur danych Krzysztof Banaś Podstawy programowania 8

Tablice wskaźników Przesyłanie tablic wskaźników jako argumentów funkcji wykorzystuje notacje: deklaracji funkcji (2 możliwe warianty): wypisz_tekst( char* tekst_wieloliniowy_tab_wsk[] ); wypisz_tekst( char** tekst_wieloliniowy_tab_wsk ); notacja char** zwraca uwagę na fakt, że na stosie funkcji wypisz_tekst będzie znajdowała się zmienna będąca wskaźnikiem do tablicy wskaźników (czyli wskaźnikiem do wskaźnika ten ostatni wskaźnik jest pierwszym elementem tablicy) wywołania funkcji wypisz_tekst( tekst_wieloliniowy_tab_wsk ); wewnątrz funkcji musi istnieć sposób poprawnego realizowania dostępu do obiektów wskazywanych przez elementy tablicy dla tablic napisów można wykorzystać fakt istnienia '\0' na końcu napisu Krzysztof Banaś Podstawy programowania 9

Struktury, wskaźniki i lista powiązana Lista powiązana (linked list) jest strukturą danych zawierającą elementy, tworzące węzły listy, zawierające dowolne dane lista powiązana jest strukturą dynamiczną, liczba elementów listy może się zmieniać w trakcie wykonania programu dostęp do elementów listy wykorzystuje zasadę, że każdy element listy wskazuje na element następny najważniejszym elementem listy jest jej "głowa" uchwyt (wskaźnik) do elementu początkowego "głowa" jest reprezentacją listy w funkcjach korzystających z listy chcąc uzyskać dostęp do dowolnego elementu listy należy uzyskać dostęp do jej "głowy", a następnie odwiedzać kolejne węzły (korzystając ze wskaźników w celu przejścia od jednego węzła do kolejnego), aż do znalezienia szukanego elementu inicjowanie listy polega na nadaniu wartości NULL "głowie" listy końcem listy jest węzeł, który nie wskazuje na żaden kolejny węzeł Krzysztof Banaś Podstawy programowania 10

Struktury, wskaźniki i lista powiązana Lista powiązana (linked list) struktury są wygodnym typem danych do przechowywania zawartości elementów listy: typedef struct element_listy{ char* nazwa_wezla; // dowolne inne składniki pojedynczego elementu listy wsk_el_list nastepny_wezel; // wskaźnik do kolejnego elementu } el_list; wskaźnik do następnego elementu może posługiwać się typem: typedef struct element_listy* wsk_el_list; pojedyncze elementy listy są obiektami typu el_list: el_list element_1 = { "Węzeł 1", NULL }; operacje na elementach mogą posługiwać się wskaźnikami: el_list* element_1_wsk = &element_1; miejsce w pamięci dla elementów listy można alokować dynamicznie el_list* element_wsk = malloc( sizeof(el_list) ); Krzysztof Banaś Podstawy programowania 11

Struktury, wskaźniki i lista powiązana Lista powiązana (linked list) zmiana liczby elementów listy polega na wstawianiu kolejnych elementów i ich usuwaniu węzeł listy można wstawić w dowolne miejsce: na początek (zmieniając wartość wskaźnika będącego "głową" listy), w środek (pomiędzy dwa węzły) lub na koniec wstawienie i usunięcie węzła polega zawsze na modyfikacji powiązań pomiędzy węzłami, np.: int wstaw_na_poczatek( // funkcja zwraca kod sukcesu lub błędu el_list** Glowa_wsk, // lista - identyfikowana przez wskaźnik el_list* Element // wskaźnik do elementu wstawianego na listę ){ // na początku: obsługa błędów danych wejściowych Element->nastepny_wezel=*Glowa_wsk; *Glowa_wsk=Element; // modyfikacja Głowy używając *Głowa_wsk return(0); } Krzysztof Banaś Podstawy programowania 12

Struktury, wskaźniki i lista powiązana Lista powiązana (linked list) niektóre z operacji na liście mogą wymagać przeglądania kolejnych elementów listy: int usun_element_listy( // funkcja zwraca kod sukcesu lub błędu el_list** Glowa_wsk, // lista - identyfikowana przez wskaźnik el_list* Element // wskaźnik do elementu usuwanego z listy ) { // na początku: obsługa błędów danych wejściowych if(*glowa_wsk==element) *Glowa_wsk=Element->nastepny_wezel; else{ el_list* poprzedni_wezel = *Glowa_wsk; while(poprzedni_wezel->nastepny_wezel!= Element){ poprzedni_wezel = poprzedni_wezel->nastepny_wezel; } poprzedni_wezel->nastepny_wezel = Element->nastepny_wezel; } // funkcja może także zwalniać pamięć jeśli była zaalokowana return 0; } Krzysztof Banaś Podstawy programowania 13

Przykład złożonej struktury danych // definicje struktur w pakiecie mg moja grafika wersja 1 typedef struct mg_punkt_2d{ // punkt w przestrzeni 2D double x; // współrzędna x double y; // współrzędna y } mg_punkt_2d; typedef struct mg_krawedz_2d{ // krawędź w przestrzeni 2D mg_punkt_2d koniec[2]; // punkty będące wierzchołkami } mg_krawedz_2d; typedef struct mg_trojkat_2d{ // trójkąt w przestrzeni 2D mg_krawedz_2d krawedzie[3]; // krawędzie trójkąta } mg_trojkat_2d; Uwaga: nie ma punktów wspólnych dla krawędzi, krawędzi wspólnych dla trójkątów itp. Uwaga: zmiana współrzędnych punktów nie zmienia położenia krawędzi Krzysztof Banaś Podstawy programowania 14

Przykład złożonej struktury danych // definicje struktur w pakiecie mg moja grafika wersja 2 typedef struct mg_punkt_2d{ // punkt w przestrzeni 2D double x; // współrzędna x double y; // współrzędna y } mg_punkt_2d; typedef struct mg_krawedz_2d{ // krawędź w przestrzeni 2D mg_punkt_2d* koniec[2]; // punkty będące wierzchołkami } mg_krawedz_2d; typedef struct mg_trojkat_2d{ // trójkąt w przestrzeni 2D mg_krawedz_2d* krawedzie[3]; // krawędzie trójkąta } mg_trojkat_2d; Uwaga: mogą istnieć punkty wspólne dla krawędzi, krawędzie wspólne dla trójkątów itp. Uwaga: zmiana współrzędnych punktów zmienia położenie krawędzi Krzysztof Banaś Podstawy programowania 15

Przykład złożonej struktury danych // definicje struktur w pakiecie mg moja grafika wersja 2.1 typedef struct mg_punkt_2d{ // punkt w przestrzeni 2D double x; // współrzędna x double y; // współrzędna y struct mg_trojkat_2d* *trojkaty; // trójkąty zawierające punkt // tablica o długości nieznanej w trakcie kompilacji } mg_punkt_2d; typedef struct mg_krawedz_2d{ // krawędź w przestrzeni 2D struct mg_punkt_2d* koniec[2]; // punkty będące wierzchołkami struct mg_trojkat_2d* trojkaty[2]; // trójkąty zawierające krawędź } mg_krawedz_2d; typedef struct mg_trojkat_2d{ // trójkąt w przestrzeni 2D struct mg_krawedz_2d* boki[3]; // krawędzie (boki) trójkąta struct mg_trojkat_2d* sasiedzi[3]; // sąsiednie trójkąty } mg_trojkat_2d; Krzysztof Banaś Podstawy programowania 16

Przykład złożonej struktury danych Definicja struktury obejmującej całą siatkę trójkątów typedef struct mg_siatka_2d{ int liczba_punktow; mg_punkt_2d* tablica_punktow; int liczba_krawedzi; mg_krawedz_2d* tablica_krawedzi; int liczba_trojkatow; mg_trojkat_2d* tablica_trojkatow; } mg_siatka_2d; Parametry siatki (liczba punktów, krawędzi, trójkątów) zadawane są w trakcie wykonania programu Tablice alokowane są w trakcie wykonania Składowe struktur zawierają wskaźniki do odpowiednich elementów tablic Krzysztof Banaś Podstawy programowania 17

Przykład złożonej struktury danych Zastosowanie tablic struktur pozwala na posługiwanie się indeksami w tablicach zamiast wskaźnikami do struktur: // definicje struktur w pakiecie mg moja grafika wersja 2.2 typedef struct mg_punkt_2d{ // punkt w przestrzeni 2D double x; // współrzędna x double y; // współrzędna y int *trojkaty; // indeksy trójkątów zawierających punkt } mg_punkt_2d; typedef struct mg_krawedz_2d{ // krawędź w przestrzeni 2D int koniec[2]; // indeksy punktów będących wierzchołkami int trojkaty[2]; // indeksy trójkątów zawierających krawędź } mg_krawedz_2d; typedef struct mg_trojkat_2d{ // trójkąt w przestrzeni 2D int boki[3]; // indeksy krawędzi (boków) trójkąta int sasiedzi[3]; // indeksy sąsiednich trójkątów } mg_trojkat_2d; Krzysztof Banaś Podstawy programowania 18

Przykład złożonej struktury danych Zdefiniowane wcześniej struktury danych pozwalają na szybkie wykonywanie dużej liczby operacji na całej siatce (dodawanie nowych punktów, krawędzi, trójkątów) Istnieją inne możliwe struktury danych wystarczające do realizacji operacji, np. minimalistyczna struktura danych: // definicje struktur w pakiecie mg moja grafika wersja 3 typedef struct mg_punkt_2d{ // punkt w przestrzeni 2D double x; double y; // współrzędne x i y } mg_punkt_2d; typedef struct mg_trojkat_2d{ // trójkąt w przestrzeni 2D int wierzcholki[3]; // indeksy wierzchołków trójkąta w tablicy punktów } mg_trojkat_2d; typedef struct mg_siatka_2d{ int liczba_punktow; int liczba_trojkatow; } mg_siatka_2d; mg_punkt_2d* tablica_punktow; mg_trojkat_2d* tablica_trojkatow; Krzysztof Banaś Podstawy programowania 19

Przykład złożonej struktury danych W definicji siatki zastosowane zostały tablice struktur (AOS array of structures) W celu zwiększenia wydajności obliczeń, stosuje się często alternatywne warianty struktur danych zawierające pojedynczą strukturę z tablicami zmiennych elementarnych typów liczbowych (SOA structure of arrays) W przypadku programu grafiki 2D struktura danych SOA mogłaby mieć postać: typedef struct mg_siatka_2d{ int liczba_punktow; int liczba_trojkatow; } mg_siatka_2d; double* wspolrzedne_punktow; int* punkty_trojkatow; Tak zdefiniowana struktura eliminuje potrzebę definiowania jakichkolwiek innych struktur ceną jest zmniejszenie czytelności kodu operacji na siatce trójkątów Krzysztof Banaś Podstawy programowania 20