Praktyczne zastosowanie tablic w języku C++ | Korepetycje do matury z informatyki - Maurycy Gast

Praktyczne zastosowanie tablic w języku C++

W trzeciej części kursu C++ rozszerzymy możliwości przechowywania danych przez nasz program. Posłużą nam w tym celu tablice i stałe. Interesuje Cię w jaki sposób możesz przypisać kilka wartości do jednej zmiennej? Poznasz tutaj tę część języka C++, która używana jest przez każdego programistę ze względu na swoje możliwości.

Podczas programowania często możemy spotkać się z koniecznością przechowywania wielu informacji tego samego typu w jednym miejscu. W zadaniach maturalnych, które wymagają użycia języka programowania, musimy przeanalizować duże ilości danych tym samym algorytmem. Czasami wymagana jest też analiza informacji, w której istotny jest poprzedni wynik. Do takich celów mogą nam posłużyć właśnie tablice.

Stałe w języku C++

Zanim przejdziemy do tablic, wprowadźmy na szybko pojęcie stałej. Z przymrużeniem oka możemy powiedzieć, że stała to „zmienna”, której wartość znana jest w momencie kompilacji oraz nie zostanie zmieniona w trakcie wykonywania programu. Deklaracja stałej różni się od deklaracji zmiennej tylko dodaniem przed jej typem słowa kluczowego „const”:


const double pi = 3.1415926535

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


const int stala;

Stałe okazują się przydatne przy organizacji kodu. Zalecane jest definiowanie wszystkich szczególnych liczb jako stałe na początku pliku, aby późniejsze dopasowanie programu do innego zbioru danych ograniczało się zmiany definicji stałych.

Tablice w języku C++

Tablica może być przez nas traktowana jako zwykła zmienna, która przechowuje nie jedną, lecz kilka wartości. Pojęcie to można także rozumieć jako pewną półkę o ponumerowanych miejscach na dane. Niezależnie od tego, w jaki sposób wyobrażamy sobie tablicę, definicja tablicy w języku C++ wygląda następująco:


int tablica[5] = { 0, 1, 2, 3, 4 };

Zwróćmy uwagę na podobieństwo deklaracji tablicy do deklaracji zmiennej. Na początku definiujemy typ danych, które będą przechowywane w tablicy (Uwaga! Tablice w języku C++ mogą przechowywać tylko wartości tego samego typu). Później wpisujemy nazwę tablicy oraz jej rozmiar w nawiasach kwadratowych. Dodatkowo możemy od razu zdefiniować zawartość tablicy. Nie jest to jednak obowiązkowe. W tym wypadku wpisaliśmy do niej liczby całkowite od 0 do 4. Warto także zaznaczyć, że jeśli podajemy zawartość tablicy jednowymiarowej, to nie musimy podawać jej rozmiaru. Rozmiar będzie w takim wypadku zgodny z ilością elementów przypisanych do tablicy.

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


cout << tablica[2];        // w tym miejscu program wypisze liczbę 2

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. Inna osoba zapyta z kolei: „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.

Możemy także zadeklarować tablicę o danym rozmiarze bez podawania wartości. Wartości można przypisać już w dalszej części działania programu:


int tablica[5];

tablica[0] = 0;

tablica[1] = 1;

tablica[2] = 2;

tablica[3] = 3;

tablica[4] = 4;

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ć zadeklarowana rozmiarem, którego wartość nie jest stałą. Rozmiar tablicy musi być znany w momencie kompilacji. Nieprawidłowa jest zatem konstrukcja:


int rozmiar = 5;

int liczby[rozmiar];

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


const int rozmiar = 5;

int liczby[rozmiar];

Tablice mogą być także wielowymiarowe, wówczas ich deklaracja wygląda następująco:


int tablica2d[3][] {

{ 00, 01, 02 },

{ 10, 11, 12 },

{ 20, 21, 22 }

};

Zauważmy, że w przypadku deklaracji tablic wielowymiarowych z zawartością, nie musimy podawać ostatniego rozmiaru, musimy podać jednak wszystkie poprzednie. Aby odwołać się do zawartości tablicy wielowymiarowej używamy po prostu kilku nawiasów kwadratowych.


cout << tablica[2][1];    // w tym miejscu program wypisze liczbę 21

Tablicy dwuwymiarowej możemy użyć na przykład, aby zapisać w niej tabliczkę mnożenia:

int tabliczka_mnozenia[11][11] = {

{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },

{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },

{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 },

{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30 },

{ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40 },

{ 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 },

{ 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60 },

{ 0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70 },

{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80 },

{ 0, 9, 18, 27, 36, 45, 54, 63, 72, 81, 90 },

{ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }

}

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


int a = 2, b = 3;

cout << tabliczka_mnozenia[a][b] << endl;

// powyższa linijka jest w tej sytuacji równoważna linijce:

// cout << a*b << endl;

Przykład ten jest jednak bardzo teoretyczny. Nie ma potrzeby definiowania tabliczki mnożenia, gdy dysponujemy zwykłym mnożeniem. Obrazuje on jednak sposób używania tablic dwuwymiarowych. W kolejnej części kursu dowiemy się, w jaki sposób można zapisać w tablicy tabliczkę mnożenia generowaną przez program.

Używanie tablic przez początkującego programistę może niestety wiązać się z wieloma błędami. Wymienione powyżej zasady, streśćmy w poniższych podpunktach.

  1. Indeksy tablicy numerowane są od 0.
  2. Rozmiar tablicy oznacza ilość danych, które zapisaliśmy w tablicy.
  3. Odwołanie się poza zakres tablicy jest błędem.
  4. Tablica w języku C++ nie może być zadeklarowana rozmiarem podanym w zmiennej.

Tablice i stałe w praktyce

Przejdźmy teraz do praktycznego zastosowania stałych oraz tablic. W tym celu napiszmy program, który wczyta od użytkownika liczbę i wypisze nazwę odpowiadającego jej dnia tygodnia. Do rozwiązania takiego problemu można użyć na przykład instrukcji switch case. Przekonamy się jednak, że można w znacznie szybszy i bardziej zorganizowany sposób napisać taki program.

#include <iostream>
#include <string>
using namespace std;

const int ilosc_dni_tygodnia = 7;
const string dni_tygodnia[ilosc_dni_tygodnia] = {
	"poniedzialek", "wtorek", "sroda", "czwartek", "piatek", "sobota", "niedziela"
};

int main() {
	int dzien_tygodnia;
	cin >> dzien_tygodnia;

	// nie ma ujemnych dni tygodnia, oraz nie ma dni tygodnia po niedzieli
	if (dzien_tygodnia <= 0 || dzien_tygodnia > ilosc_dni_tygodnia) {
		cout << "Nie ma takiego dnia tygodnia" << endl;
	}
	else {
		// ponieważ dni tygodnia w tablicy numerujemy od 0,
// musimy odjąć 1 od liczby, którą wprowadził użytkownik
		cout << dni_tygodnia[dzien_tygodnia - 1] << endl;
	}
	return 0;
}

Zauważmy, że zadeklarowaliśmy tutaj stałą tablicę. Nie jest to konieczne, ale nadarzyła się okazja, żeby powiedzieć o takiej możliwości. Zadaniem dla Ciebie, czytelniku, będzie napisanie tego programu z użyciem instrukcji switch case. Na pewno zauważysz, że będzie on w takiej sytuacji dużo bardziej obszerny. Możliwe, że jeden ze sposobów będzie szybszy, jednak nie będziemy w stanie tego zauważyć. Na maturze z informatyki w części praktycznej nie musimy przejmować się czasem wykonywania programu, gdyż wymagany jest od nas tylko wynik oraz ślad o tym, w jaki sposób rozwiązaliśmy ten problem (np. program w C++ lub plik bazy danych w Accessie czy Excelu).

Podsumowanie

Mam nadzieję, że umiesz już korzystać z tablic. Być może wydają Ci się one na razie mało użyteczne, gdyż pokazane przykłady można było w prosty sposób zastąpić innymi instrukcjami. Zapewniam Cię jednak, że tablice nie raz uratują Ci skórę na maturze. W kolejnych lekcjach poznamy dla nich o wiele więcej zastosowań.

Zachęcam Cię do odwiedzenia następnych części kursu i życzę powodzenia w przygotowywaniu do rozszerzonej matury z informatyki.

Praca domowa

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 przećwiczyć używanie stałych.

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, o których nie powie nam kompilator.



1 komentarz

Dodaj komentarz