Wykorzystanie struktur w algorytmach

StrukturystrukturaStruktury to złożone typy danych umożliwiające przechowywanie informacji różnego typu. Znajdują wiele zastosowań w algorytmach, ponieważ pozwalają w prosty sposób opisać złożone obiekty.

Przeanalizujmy przykład użycia struktur. Załóżmy, że chcemy obliczyć i zapisać pola 100 trójkątów, mając podane długości ich podstaw oraz wysokości. W tym celu możemy oczywiście zainicjować trzy tablice, z których jedna będzie przechowywać wartości wysokości, druga podstawy, a trzecia pola. Takie rozwiązanie byłoby jednak nieczytelne i niepraktyczne. Lepszym podejściem będzie wykorzystanie struktur. Zapiszmy rozwiązanie tego problemu za pomocą pseudokodu.

Pierwszym krokiem jest stworzenie struktury, która składa się z trzech pólpolepól. Definiujemy je następująco:

Linia 1. struktura Trojkat otwórz nawias klamrowy. Linia 2. Podstawa dwukropek liczba zmiennoprzecinkowa. Linia 3. Wysokosc dwukropek liczba zmiennoprzecinkowa. Linia 4. Pole dwukropek liczba zmiennoprzecinkowa. Linia 5. zamknij nawias klamrowy.

Skoro trójkątów ma być 100, najlepszym rozwiązaniem jest stworzenie tablicy, która będzie przechowywać wszystkie struktury. Na potrzeby przykładu zakładamy, że w tablicy znajdują się elementy z wypełnionymi wartościami pól Podstawa oraz Wysokosc.

Linia 1. struktura Trojkat otwórz nawias klamrowy. Linia 2. Podstawa dwukropek liczba zmiennoprzecinkowa. Linia 3. Wysokosc dwukropek liczba zmiennoprzecinkowa. Linia 4. Pole dwukropek liczba zmiennoprzecinkowa. Linia 5. zamknij nawias klamrowy. Linia 7. tablicaTrojkatow otwórz nawias kwadratowy 100 zamknij nawias kwadratowy dwukropek tablica elementów typu Trojkat.

Potrzebujemy teraz pętli, która przeiteruje po tablicy i obliczy pole każdego trójkąta, a następnie zapisze wyniki w strukturze.

Linia 1. struktura Trojkat otwórz nawias klamrowy. Linia 2. Podstawa dwukropek liczba zmiennoprzecinkowa. Linia 3. Wysokosc dwukropek liczba zmiennoprzecinkowa. Linia 4. Pole dwukropek liczba zmiennoprzecinkowa. Linia 5. zamknij nawias klamrowy. Linia 7. tablicaTrojkatow otwórz nawias kwadratowy 100 zamknij nawias kwadratowy dwukropek tablica elementów typu Trojkat. Linia 9. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły tablicaTrojkatow zamknij nawias okrągły minus 1 wykonuj dwukropek.

Następnie obliczymy pole każdego z trójkątów, których dane zapisane są w stworzonej wcześniej tablicy tablicaTrojkatow. Każdy element tej tablicy jest elementem typu Trojkat, a zatem jest strukturą przechowującą informacje o długości podstawy trójkąta i jego wysokości, a także mogącą przechowywać obliczone pole trójkąta.

Aby obliczyć pole trójkąta, potrzebujemy niezbędnych danych. Pobieramy je z elementu tablicy z danymi odpowiedniego trójkąta (przechowywanego w komórce tablicy wyznaczonej przez wartość iteratora pętli) za pomocą notacji z kropką. Składa się ona z identyfikatora obiektu i nazwy pola, w którym wartość jest przechowywana, oddzielonych kropką, np. Obiekt.Pole.

Obliczamy pole trójkąta, pobierając potrzebne wartości tablicaTrojkatow[i].PodstawatablicaTrojkatow[i].Wysokosc, mnożymy je przez siebie i dzielimy przez 2 zgodnie ze wzorem na pole trójkąta (ah)÷2. Wynik tego działania zapisujemy w polu tablicaTrojkatow[i].Pole.

Linia 1. struktura Trojkat otwórz nawias klamrowy. Linia 2. Podstawa dwukropek liczba zmiennoprzecinkowa. Linia 3. Wysokosc dwukropek liczba zmiennoprzecinkowa. Linia 4. Pole dwukropek liczba zmiennoprzecinkowa. Linia 5. zamknij nawias klamrowy. Linia 7. tablicaTrojkatow otwórz nawias kwadratowy 100 zamknij nawias kwadratowy dwukropek tablica elementów typu Trojkat. Linia 9. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły tablicaTrojkatow zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 10. tablicaTrojkatow otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Pole ← otwórz nawias okrągły tablicaTrojkatow otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Podstawa asterysk tablicaTrojkatow otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Wysokosc zamknij nawias okrągły prawy ukośnik 2.

Porównajmy to rozwiązanie do wersji bez wykorzystania struktur. Użyjemy trzech tablic. Zainicjujmy je:

Linia 1. podstawy otwórz nawias kwadratowy 100 zamknij nawias kwadratowy. Linia 2. wysokosci otwórz nawias kwadratowy 100 zamknij nawias kwadratowy. Linia 3. pola otwórz nawias kwadratowy 100 zamknij nawias kwadratowy.

Podobnie jak w przypadku przedstawionych wcześniej obliczeń z wykorzystaniem struktur, tak i tu zakładamy, że dane o długości podstaw i wysokości trójkątów są już zapisane w odpowiednich tablicach. Następnie potrzebna będzie pętla, która przeiteruje po tablicach. Zawierają one informacje o 100 trójkątach, dlatego instrukcja wewnętrzna pętli musi zostać wykonana 100 razy.

Linia 1. podstawy otwórz nawias kwadratowy 100 zamknij nawias kwadratowy. Linia 2. wysokosci otwórz nawias kwadratowy 100 zamknij nawias kwadratowy. Linia 3. pola otwórz nawias kwadratowy 100 zamknij nawias kwadratowy. Linia 5. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły podstawy zamknij nawias okrągły minus 1 wykonuj dwukropek.

Każda wartość iteratora pętli wskazuje indeks komórek tablic zawierających dane opisujące jeden trójkąt. Chcąc obliczyć jego pole, pobieramy wartości z komórek tablic podstawy oraz wysokosci o tym samym indeksie. Następnie wartości te podstawiamy do wzoru na pole trójkąta, a wynik zapisujemy do tablicy pola do komórki o takim samym indeksie, jak komórki tablic, z których pobieraliśmy dane.

Linia 1. podstawy otwórz nawias kwadratowy 100 zamknij nawias kwadratowy. Linia 2. wysokosci otwórz nawias kwadratowy 100 zamknij nawias kwadratowy. Linia 3. pola otwórz nawias kwadratowy 100 zamknij nawias kwadratowy. Linia 5. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły podstawy zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 6. pola otwórz nawias kwadratowy i zamknij nawias kwadratowy ← otwórz nawias okrągły podstawy otwórz nawias kwadratowy i zamknij nawias kwadratowy asterysk wysokosci otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły prawy ukośnik 2.

Pola wszystkich trójkątów są teraz dostępne w tablicy pola.

Redundancja

W omawianym przykładzie została zastosowana redundancja, mimo że w wielu e‑materiałach zjawisko to jest przedstawione jako niepożądane.

Zwróćmy uwagę, że nie ma potrzeby przechowywania w strukturze reprezentującej trójkąt informacji o jego polu, jeśli przechowujemy już wartości reprezentujące jego podstawę oraz wysokość. Jednak w wypadku bardziej złożonego programu, w którym np. chcielibyśmy wielokrotnie użyć pola trójkąta, musielibyśmy obliczyć jego wartość za każdym razem. To podejście jest w takiej sytuacji niepraktyczne – zwiększa złożoność obliczeniową programu.

Złym rozwiązaniem byłoby, gdybyśmy oprócz struktury reprezentującej trójkąt przechowywali również tablice reprezentujące podstawy, wysokości oraz pola trójkątów – taka redundancja jest niepożądana.

W wielu sytuacjach stosuje się redundancję – np. przechowując średnią arytmetyczną ocen, podczas gdy mamy wszystkie oceny ucznia. 

Słownik

pole
pole

składowa struktury, która ma własną nazwę oraz określony typ danych

struktura
struktura

złożony typy danych umożliwiający przechowywanie informacji różnego typu