Praktyczne zastosowanie tablic w języku C++ – jednowymiarowe i wielowymiarowe

W trzeciej części kursu C++ zapoznasz się z rozszerzeniem możliwości przechowywania danych przez Twój program. Posłużą Ci w tym celu tablice i stałe. Jeśli interesuje Cię, w jaki sposób możesz przypisać kilka wartości do jednej zmiennej, koniecznie czytaj dalej, a poznasz tę część języka C++.

Podczas programowania często zdarza się, że musisz przechowywać  w jednym miejscu wiele informacji tego samego typu. Również w zadaniach maturalnych, które wymagają użycia języka programowania, możesz spotkać się z koniecznością przeanalizowania dużych ilości danych tym samym algorytmem. Może też być wymagana od Ciebie analiza informacji, w której istotny jest poprzedni wynik. Do takich celów posłużą Ci właśnie tablice.

Tablice jednowymiarowe C++ – deklaracja i przykłady

Tablica może być przez Ciebie traktowana jako zwykła zmienna, która przechowuje nie jedną, lecz kilka wartości. Pojęcie to możesz zwizualizować sobie jako półkę o numerowanych miejscach na dane. Niezależnie od tego, w jaki sposób to sobie wyobrażasz, deklaracja tablicy w języku programowania C++ wygląda następująco:

Zwróć uwagę na podobieństwo deklaracji tablicy do deklaracji zmiennej. Na początku musisz zdefiniować typ danych, które będą w niej przechowywane (pamiętaj, że tablice w języku C++ mogą przechowywać tylko wartości tego samego rodzaju). Następnie wpisujesz nazwę tablicy oraz jej rozmiar (liczbę elementów/indeksów) w nawiasach kwadratowych. Dodatkowo możesz od razu zdefiniować zawartość tablicy (nie jest to jednak obowiązkowe). W tym wypadku wpisano do niej liczby całkowite od 0 do 4. Warto w tym miejscu zaznaczyć, że jeśli podajesz zawartość tablicy jednowymiarowej, to nie musisz wpisywać jej zakresu – w takim przypadku rozmiar będzie zgodny z liczbą elementów przypisanych do tablicy.

Aby odwołać się do poszczególnych wartości tablicy, użyj poniższej składni:

Niektórzy jednak w tym miejscu zapytają:

„Dlaczego 2? Przecież odwołujemy się do drugiego miejsca w tablicy, a tam jest liczba 1”. 

Jest tak dlatego, że w języku C++ indeksy w tablicach numerowane są od zera.

Ktoś inny może z kolei zapytać:

„Skoro numerujemy od zera, to dlaczego podaliśmy rozmiar 5, a wpisaliśmy tylko 5 wartości do tablicy?”. 

W tym przypadku język C++ zakłada jednak, że rozmiar oznacza faktyczną ilość danych, które możemy wpisać do tablicy.

Tablica jednowymiarowa C++
Tablicę jednowymiarową możesz wyobrazić sobie w podany powyżej sposób. Pod każdym indeksem można znaleźć odpowiednią, wcześniej przypisaną wartość.

Możesz także zadeklarować tablicę o danym rozmiarze bez podawania wartości – będzie można je przypisać później.

Częstym błędem, który nie jest zgłaszany przez niektóre kompilatory, jest deklaracja tablicy z rozmiarem zapisanym w zmiennej. Tablica w języku C++ nie powinna być tworzona z pomocą zakresu, którego wartość nie jest stałą. Rozmiar tablicy musi być znany w momencie kompilacji. Nieprawidłowa jest zatem konstrukcja:

Tego, jak konstruować tablice, których rozmiar jest zależny od wartości zmiennej, nauczysz się w późniejszej części kursu. Aby umożliwić zmianę rozmiaru tablicy w ramach napisanego kodu, możesz zdefiniować stałą na początku kodu, która zostanie użyta do deklaracji tablicy:

Z przymrużeniem oka można powiedzieć, że stała to „zmienna”, której wartość znana jest w momencie kompilacji i nie zostanie zmieniona w trakcie wykonywania programu. Deklaracja stałej różni się od deklaracji zmiennej jedynie dodaniem przed jej typem słowa kluczowego „const”:

Przy deklaracji stałej musi zostać podana jej wartość. Nieprawidłowy byłby zatem zapis:

Stałe są przydatne przy organizacji kodu. Zalecane jest definiowanie wszystkich szczególnych liczb jako stałych na początku pliku, aby późniejsze dopasowanie programu do innego zbioru danych ograniczało się do zmiany definicji stałych. Zapobiega to powstawaniu błędów wynikających z nadpisania określonych wartości.
Przejdźmy teraz do praktycznego zastosowania stałych oraz tablic. Załóżmy, że masz napisać program, który wczyta od użytkownika liczbę i wypisze nazwę odpowiadającego jej dnia tygodnia. Możesz to zrobić za pomocą instrukcji switch-case. Przekonasz się jednak, że można to zrobić w znacznie szybszy i bardziej zorganizowany sposób.

Zauważ, że zadeklarowano tutaj stałą tablicę w języku C++. Nie jest to konieczne, ale nadarzyła się okazja, żeby powiedzieć o takiej możliwości.

Tablice wielowymiarowe C++ – deklaracja i przykłady

Tablice mogą być wielowymiarowe, a więc posiadać większą liczbę „półek”, o których wspomniano wcześniej. W takiej sytuacji ich deklaracja wygląda następująco:

Zauważ, że w przypadku deklaracji tablic wielowymiarowych z zawartością w C++ nie musisz podawać pierwszego rozmiaru, choć należy podać wszystkie następne. Aby odwołać się do zawartości tablicy wielowymiarowej, użyj po prostu kilku nawiasów kwadratowych.

Tablicy dwuwymiarowej możesz użyć na przykład do zapisania w niej tabliczki mnożenia:

Wówczas można wydobyć z niej informację o wyniku działania a * b w następujący sposób:

Przykład ten jest jednak bardzo teoretyczny – nie ma bowiem potrzeby definiowania tabliczki mnożenia, skoro można wykonać operację mnożenia. Przywołaliśmy go jednak, ponieważ obrazuje sposób używania tablic dwuwymiarowych. W kolejnej części kursu dowiesz się, w jaki sposób można zapisać w tablicy tabliczkę mnożenia generowaną przez program.

Tablice wielowymiarowe C++
Tablicę dwuwymiarową możesz sobie łatwo wyobrazić jako dwuwymiarową planszę, na której pozycję każdego pola określisz z pomocą dwóch indeksów (wymiarów).

Początkujący programista może popełnić wiele błędów, nieodpowiednio używając tablic. Dlatego wymienione powyżej zasady podsumowaliśmy w poniższych punktach:

  • Indeksy tablicy numerowane są od 0 do n – 1 (gdzie n to zadeklarowana liczba elementów w tablicy).
  • Rozmiar tablicy oznacza ilość danych, które zapisaliśmy w tablicy.
  • Odwołanie się poza zakres tablicy to błąd.
  • Tablica w języku C++ nie może być zadeklarowana rozmiarem podanym w zmiennej.

Poniżej znajdziesz przykład zastosowania tablicy dwuwymiarowej w celu przechowania tabliczki mnożenia:

ads banner
Jak obliczyć zużycie pamięci przez tablicę C++?

Tak jak każda zmienna, również tablice (czyli w praktyce zbiór zmiennych) zużywają pamięć. Za pomocą deklaracji dużej liczby elementów w tablicy możesz szybko zużyć zbyt dużo pamięci. Jeśli chcesz zadbać o jej minimalne zużycie przez program, warto wiedzieć, jak obliczyć wymaganą pamięć. Wzór jest prosty:

rozmiar typu danych * liczba elementów = zużycie pamięci przez tablicę

W przypadku przykładowej tablicy int z 5 elementami prezentuje się to następująco:

4 * 5 = 20 (bajtów)

Natomiast tablica wielowymiarowa int 5 i 5, to:

4 * 5 * 5 = 100 (bajtów)

Znacznie łatwiej jest określić zużycie pamięci w samym programie, w czym jest w stanie pomóc Ci prosty operator:

Można go zastosować dwojako:

lub

W obu przypadkach zdołasz obliczyć liczbę bajtów zajmowaną przez tablicę. Pamiętaj, że wynik zwracany przez sizeof należy wypisać na ekranie, żeby móc go odczytać.

Funkcje obsługujące tablice C++

W przypadku zarówno tradycyjnych tablic, jak i tablic typu array (o których będzie mowa w dalszej części artykułu) można skorzystać z trzech poniższych funkcji. Pochodzą one z biblioteki algorithm, dzięki czemu możliwe jest ich zastosowanie przy obu rodzajach tablic. Oczywiście, konieczna jest deklaracja tablicy poprzez linijkę “ #include <algorithm>; “.

  • fill – ustawia wszystkie elementy tablicy na określoną wartość. Przykładowe użycie to “   std::fill(tablica, tablica+rozmiar, 50); “, dzięki czemu każdy element zwróci wartość 50,
  • copy – to niezwykle przydatna funkcja, dzięki której można skopiować wcześniej stworzoną tablicę. Jej użycie prezentuje się tak: “ copy(tablica, tablica + rozmiar, kopia_tablicy); “. Oczywiście, wcześniej trzeba zadeklarować obie tablice i muszą one mieć ten sam zakres elementów.
  • sort – to kolejna funkcja pochodząca z biblioteki algorithm. Jak sama nazwa wskazuje, służy do sortowania tablic (rosnąco). Działa w przypadku obu typów tablic:  standardowych i array. W przypadku tych pierwszych należy zastosować kod typu: “ int wielkosc = sizeof(tablica) / sizeof(tablica[0]); sort(tablica, tablica + wielkosc); “.
    Natomiast jeśli chodzi o tablice array, można zastosować: “ sort(tablica.begin(), tablica.end()); ”. Funkcja begin zwraca wskaźnik do pierwszego elementu tablicy, natomiast end do elementu za elementem ostatnim w tablicy (poza zakresem faktycznych elementów w tablicy), jednak działają one tylko przy tablicach typu array.

Zalety i wady – tablice w C++

Po przeanalizowaniu powyższych informacji możesz zacząć zastanawiać się, czy warto korzystać z tablic, skoro są one bardziej podatne na błędy niż zwykłe zmienne. O ile jednak z początku mogą sprawiać pewną trudność, to już po krótkim czasie przekonasz się, że są niezwykle wygodne w użyciu.

Zalety tablic w C++
  • Wygoda przy operacjach na dużych zbiorach danych – dzięki zapisaniu wartości w tablicy możesz łatwo z nich korzystać z pomocą odpowiednich indeksów. To niezwykle użyteczne rozwiązanie w połączeniu z pętlą, ze względu na możliwość automatyzacji konkretnych zadań (na przykład przypisywania określonych wartości).
  • Porządek w kodzie – korzystanie z tablic pozwala na zmniejszenie liczby deklaracji zmiennych: możesz wpisać jedną linię kodu zamiast dziesięciu. Ponadto nie musisz pamiętać o wszystkich nazwach – wystarczy odpowiednia organizacja indeksów w tablicy.
Wady tablic w C++
  • Brak elastyczności pod względem typów pamięci – tablica jest w stanie przechowywać dane tylko jednego typu, np. int czy string.
  • Większa liczba potencjalnych błędów – używanie tablic często okazuje się niewygodne dla początkującego programisty. Dlatego warto skorzystać z grafik poglądowych (dostępnych we wcześniejszej części artykułu), które ułatwią zrozumienie, jak korzystać z indeksacji w przypadku jedno- i dwuwymiarowych tablic (te bowiem są najczęściej wykorzystywane).

Najczęstsze błędy związane z tablicami w C++

Oczywiste jest, że popełnianie błędów to naturalna część procesu nauki programowania, ale istnieje kilka powszechnych pułapek, które często spotykane są u początkujących programistów. Zwrócenie na nie uwagi może zdecydowanie pomóc uniknąć wielu powiadomień zwracanych przez kompilator.

Brak przypisania wartości

Jednym z częstych błędów, które zdarzają się na początku pracy z tablicami w C++, jest brak przypisania wartości do konkretnych elementów tablicy. Tego typu sytuację przedstawiono na poniższym przykładzie:

Jak widać, próbuje się wypisać tablicę bez wcześniejszego przypisania do niej jakichkolwiek wartości. W przypadku takiego kodu zostanie wypisana nieprzewidywalna wartość.

Dzieje się tak, ponieważ program zakłada, że w konkretnym miejscu pamięci znajduje się tablica (jej elementy), ale nie resetuje wartości, które są tam umieszczone. W konsekwencji w wyniku wykonania powyższego kodu zostanie wypisana wartość, która była tam umieszczona przez komputer.

Prawidłowy kod prezentuje się następująco:

Przekazywanie tablicy do funkcji

W przypadku przekazywania tablicy do funkcji przekazuje się tak naprawdę wskaźnik do niej, czyli specjalny adres, który wskazuje na tablicę umiejscowioną gdzieś w pamięci.

Przy powyższym kodzie nie przekazujemy zatem tablicy do funkcji, jako osobnej listy zmiennych, tylko jako wskaźnik do oryginalnej tablicy. Dlatego w przypadku wszelkich zmian tablicy, które nastąpią w ramach wykonywania funkcji, te modyfikacje są widoczne również po wywołaniu (czy też w tym przypadku wypisaniu) tablicy w głównej funkcji programu main.

Tablice typu array w C++ – Twój wygodny kontener na dane

Opisywane do tej pory tablice stworzono jeszcze w ramach języka C. I choć ich funkcjonalność stoi na wysokim poziomie, to w ramach usprawniania rozmaitych elementów języka C++ tablice również wzięto pod uwagę. Tak właśnie powstał typ std::array, który okazuje się znacznie wygodniejszy na dłuższą metę. Dodano go w standardzie C++11 w ramach biblioteki array.

Podstawowe zastosowanie tego kontenera jest prawie identyczne jak przy tablicach w stylu C, jednak dużym plusem okazują się rozmaite dodatkowe funkcje, które są w niego wbudowane. Z ich pomocą można znacznie łatwiej obsługiwać zbiory danych niż bez nich.

Jak użyć array w C++ – tablice jednowymiarowe i wielowymiarowe

Wbrew pozorom, używanie tablic array wygląda praktycznie tak samo jak korzystanie z tablic w stylu C. Konieczne jest jednak pamiętanie o deklaracji biblioteki array, użyciu „using namespace std;”, a także o odpowiedniej formie deklaracji tablicy. Jej wzór wygląda tak:

Natomiast korzystanie z tablicy jest identyczne jak wcześniej:

Poniżej znajdziesz podstawowy kod, wyświetlający pierwszy element z tablicy jednowymiarowej std::array:

W przypadku tablicy dwuwymiarowej array wzór prezentuje się następująco:

Funkcjonalny kod, obsługujący tablicę dwuwymiarową w array, to:

Jak widać, ich podstawowa deklaracja i zastosowanie są bardzo proste, z łatwością można je opanować. Jednak najważniejsze są dodatkowe funkcje usprawniające pracę z tablicami, które znajdziesz poniżej.

Przekazywanie tablicy array do funkcji działa podobnie jak w przypadku standardowych tablic (w stylu C). Jednak, co istotne, nie jest konieczne podawanie liczby elementów, bo można je sprawdzić za pomocą metody .size().

Zastosowano tu również ciekawą formę pętli for. Chodzi konkretnie o linijkę “ for (int element : arr) ”, gdzie zamiast typowej trójczęściowej formy (deklaracja zmiennej, warunek, zwiększenia lub zmniejszenia zmiennej) stosuje się tzw. pętlę zakresu w stylu C++. Dzięki temu deklaruje się zmienną, która przechodzi przez wszystkie elementy w ramach tablicy array, a więc zmienna przy wykonywaniu pętli zawiera w sobie wartość dostępną w kolejnych elementach podanej tablicy, co widać na załączonym wcześniej kodzie.

Dodatkowe funkcje tablic array

Dzięki opanowaniu poniższych metod dalsza praca nad kodem w C++ okaże się znacznie łatwiejsza. Array okazuje się przydatny przede wszystkim ze względu na następujące funkcje:

  • operatory porównania – ten rodzaj kontenera posiada przeładowanie operatory porównania == , != , < , <= , > , >=. Można więc przykładowo porównać ze sobą bezpośrednio dwie tablice i, jeśli odpowiadające sobie elementy są identyczne, zwracana jest prawda (true). Przykładem jest użycie instrukcji warunkowej: “ if ( tablica1 == tablica2 ) ”,
  • size – ta metoda pozwala określić liczbę elementów w danej tablicy. Przykładowe jej użycie: “ liczba_elementow = tablica1.size() “,
  • empty – zawiera informację o tym, czy tablica jest pusta, czy też zawiera jakikolwiek zapisany element. Gdyby więc przykładowo zadeklarować tylko “ array<int, 5> tablica1; ”, to warunek w instrukcji “ if (tablica1.empty()) “ zwróci prawdę (true),
  • auto – możliwe jest skopiowanie tablicy array poprzez zastosowanie prostego przypisania: “ auto tablica2 = tablica1; “,
  • at – funkcja pozwalająca uzyskać wskaźnik do konkretnego elementu tablicy. Można z niego korzystać do odczytywania lub modyfikacji danej wartości, jednak najbardziej przydatną funkcjonalnością tej metody jest to, że pozwala sprawdzić, czy element istnieje, czy też nie. Przykładowe użycie: “ int wartosc = tablica.at(indeks); “. W momencie, gdyby element o danym indeksie nie istniał, zostałby zwrócony wyjątek std::out_of_range.
Podsumowanie – tablice w C++

Mam nadzieję, że dzięki tej części kursu nauczysz się korzystać z tablic. Być może wydają Ci się one na razie mało użyteczne, gdyż można było skorzystać z prostszych instrukcji, zapewniam Cię jednak, że tablice na pewno pomogą Ci na maturze. W kolejnych lekcjach poznasz dla nich o wiele więcej zastosowań.

Praca domowa
  1. Napisz program, który poprosi użytkownika o wpisanie 5 liczb i obliczy z nich średnią. Pamiętaj, że średnia nie musi być liczbą całkowitą. Dobierz odpowiedni typ zmiennych. Zdefiniuj liczbę 5 jako stałą oraz użyj jej przy deklaracji tablicy, aby poćwiczyć używanie stałych.
  2. Sprawdź, czy i jakie ostrzeżenia wyświetli używany przez Ciebie kompilator, gdy popełnisz 4 wymienione w tym wpisie najczęstsze błędy dotyczące tablic. Uwaga! Niektóre kompilatory nie zgłaszają wszystkich błędów ze względu na techniczną możliwość realizacji źle zleconych zadań. Należy zatem zwrócić szczególną uwagę, aby nie popełniać tych błędów, które może zignorować kompilator.

Jeśli potrzebujesz profesjonalnego przygotowania do matury z informatyki, sprawdź nasze korepetycje z informatyki!

Najczęściej zadawane pytania o tablice w C++

Czy tablica może przechowywać zerową liczbę elementów?

Tablica w C++ może mieć zerową liczbę elementów (przykładowo int tab[0]), jednak nie posiada ona realnych zastosowań. Przy tym (jak podano w wyżej wymienionych przykładach) można zadeklarować tablicę o konkretnym zakresie indeksów, bez przypisania im wartości. Jeśli pobierze się wtedy wartość z konkretnego elementu, to zostanie zwrócona losowa wartość danego typu.

Jakie są różnice między tablicami jednowymiarowymi i wielowymiarowymi w C++?

Różnica jest prosta – chodzi jedynie o liczbę wymiarów, a więc o stopień skomplikowania indeksacji, która umożliwia zbudowanie różnorodnych struktur danych. Oczywiście, w zależności od liczby elementów i od wymiarów potrzeba więcej lub mniej pamięci. Można też zdefiniować tablicę wielowymiarową jako tablicę tablic.

Czy tablice w C++ są podatne na błędy?

Tablice nie są szczególnie podatne na awarie typu sprzętowego, jeśli chodzi o język C++, problemem może okazać się jednak ich nieprawidłowe użycie przez programistę. Najczęstszym błędem występującym przy użyciu tablic C++ jest przekroczenie granicy indeksacji (przykładowo: wywoływanie indeksu „7” w przypadku, gdy tablica posiada 5 elementów). Najczęściej jednak błędem jest to, że początkujący programista liczy indeksację od 1 zamiast od 0, przez co próbuje odczytać ostatni element tablicy jako 5 zamiast jako 4 (bazując na przykładzie, że tablica ma zadeklarowane 5 elementów).

ads banner

Wpisy, które mogą Cię zainteresować:



Jeden komentarz

Komentarze zostały wyłączone