Tablice

tablica c/c++

Tablice czyli pudełko na zmienne!

Czym jest tablica c/c++? Tablica to coś w rodzaju pudełka w którym jest x zmiennych. Każda z nich jest tego samego typu i tej samej nazwy różni się tylko indexem (numerkiem). A więc tablice pozwalają nam na sprawne zarządzanie wieloma jak i nie tysięcoma zmiennymi. Bardzo pomocne okażą się przy tym pętle. Pozwolą nam one na zapisywanie wartości jak i odczytywanie ale o tym za chwilę na przykładzie. Elementy w tablicy są numerowane od 0, dlaczego? To proste ponieważ jest 10 cyfr arabskich czyli od 0 do 9. Numerowanie od 1 byłoby marnotrawstwem. Warto o tym pamiętać aby uniknąć w przyszłości błędów.

tablica c/c++

Tworzenie tablic

Tablica składa się z 4 elementów. Pierwszym jest jej typ tutaj akurat jest to int następnym nazwa w tym przykładzie jest to tablica1 oraz nawiasów kwadratowych (zarezerwowanych tylko i wyłącznie dla tablic). Czwartym elementem jest jej rozmiar, zawsze musimy go podać tak aby komputer przygotował wystarczająco dużo miejsca w pamięci. W poniższym fragmencie kodu przedstawiam dwa sposoby tworzenia tablic.

#include <stdio.h>

int main()
{
    int tablica1[10] = {0,1,2,3,4,5,6,7,8,9}; //wartości tablicy uzupełniamy w kodzie
    printf("Wyswietlamy piaty element tablicy1 %d", tablica1[4]); //piąty element czyli 4
    
    float tablica2[3]; //zawsze podajemy jaki będzie rozmiar tablicy
    printf("\nPodaj pierwszy element tablicy ");
    scanf("%f", &tablica2[0]); //odwołujemy się do konkretnej komórki tablicy
    printf("Podaj drugi element tablicy ");
    scanf("%f", &tablica2[1]);
    printf("Podaj trzeci element tablicy ");
    scanf("%f", &tablica2[2]);
    printf("Wyswietlamy pierwszy element tablicy2 %.2f", tablica2[0]); 
    // 1 element czyli zerowy

    return 0;
}

Na pierwszy rzut oka może wyglądać to przerażająco ale wcale tak nie jest. Zacznijmy od początku tablica1 jest typu int czyli i ma 10 wartości. Spójrz że tworzenie tablic różni się od tworzenia zmiennych tylko tym że podaje się jej rozmiar (czyli ile zmiennych będzie w sobie trzymała). Pierwsza tablica ma 10 zmiennych i są one przypisane od razu w kodzie źródłowym. Taki zabieg jest możliwy przy użyciu nawiasów klamrowych zupełnie tak samo jak w matematyce. Następnie printf wyświetla piąty element czyli 4 dlatego że tablice numerowane są od zera. Później tworzymy tablice typu float w kwadratowych nawiasach charakterystycznych dla tablic podajemy ile elementów będzie ona przechowywała. Dalej w kodzie tradycyjnie pobieramy wartości scanf. Zwróć uwagę że nawet w funkcji scanf musimy odwoływać się do konkretnej komórki tablicy w tym przypadku 0, 1, 2.

Automatyczne uzupełnianie tablic

Zwróć uwagę na to że w poprzednim kodzie każdą wartość należało podawać lub wypisać własno ręcznie. Jest to naprawdę uciążliwe i zaśmieca kod źródłowy. Na szczęście z pomocą przychodzą pętle.

#include <stdio.h>

int main()
{
    printf("Ile elementow ma miec tablica? ");
    int ile;
    scanf("%d", &ile);
    int tablica[ile]; //ustalamy rozmiar tablicy
    printf("Podawaj wartosci do tablicy\n");
    for(int i=0; i<ile; i++) //liczmy
    {
        scanf("%d", &tablica[i]); //zmienna "i" odnosi się
        //do danego elementu tablicy
    }
    printf("Wypiszemy wszystkie elementy w odwrotnej kolejnosci\n");
    for(int i=ile-1; i>=0; i--) //odliczamy
    {
        printf("%d \n", tablica[i]); //w efekcie odwrotna kolejność 
    }

    return 0;
}

Dzięki pętlom cały proces przebiega automatycznie a o to przecież chodzi w informatyce. W tym przykładnie tablica nie ma określonego rozmiaru wszystko zależy od użytkownika. Następnie korzystając ze zmiennej ile wiemy ile razy ma się wykonać pętla tak aby uzupełnić całą tablice. Samo uzupełnianie odbywa się dzięki zmiennej która w każdym obiegu pętli zmienia się o 1. W pierwszym obiegu i=0 czyli uzupełniamy pierwszy element tablicy, następnie i=1 uzupełniamy drugi element i tak dalej. Ważne jest to że nigdy wychodzi poza zakres tablicy (czyli jej rozmiar). Spowodowałby to błąd a w następstwach wyłączenie programu, utratę danych i inne nie przewidziane skutki uboczne. Dlatego warto aby warunek kończący pętle był przemyślany i to uwzględniał. Niech ile=5 wówczas pętla zaczynając od 0 wykona się 5 razy: 0, 1, 2, 3, 4 a to dzięki temu że jest tam (znak mniejszości). 

Omówmy teraz wypisywanie. Warunek pętli jest zupełnie inny i=ile-1 to dlatego że zmienna ile mówi ile jest elementów w tablicy a nam chodzi o ostatni element. Załóżmy że ile=5 czyli tablica ma 5 elementów ale jej ostatni element ma index 4 i właśnie dlatego odejmujemy jedynkę. Pozwala to nam wypisać ostatni element jako pierwszy a w konsekwencji całą tablice od tyłu. Zmienna i w pętli z każdym obiegiem się dekrementuje (zmniejsza o jeden) aż dojdzie do czyli pierwszego elementu. Całe te zamieszanie jest dlatego że musimy pilnować zakresu tablicy tak aby z niego nie wyjść. Przecież nie możemy się odwołać do setnego elementu tablicy jeżeli liczy ona pięć elementów. Oczywiście warunek pętli mógłby być zupełnie inny np: i=ile ale wówczas w printf musi być taki zapis tablica[i-1] wyjdzie na to samo.

#include <stdio.h>

int main()
{
    int liczby[100];
    int wybor;
    for(int i=0; i<100; i++)
    {
        liczby[i] = i+1; //uzupełnianie tablicy liczbami 1...100
    }
    for(;;) //nigdy tego nie rób
    {
        printf("Wypisac 0 - parzyste 1 - nieparzyste ");
        scanf("%d", &wybor);
        if(wybor!=1 && wybor!=0) continue; //spójnik logiczny koniunkcji
        for(int i=0; i<100; i++)
        {
            if(liczby[i]%2== wybor) //wybór to reszta z dzielenia przez 2
            {
                printf("%d ", liczby[i]);
            }
        }
        break; //wyrwanie się z nieskończonej pętli
    }
    return 0;
}

Ten przykład jest o tyle ciekawy że przy omawianiu pętli ostrzegałem aby tego nigdy nie robić. Zwróć uwagę że tutaj nieskończona pętla jest pewnym zabezpieczeniem a to dlatego że jest tutaj continue break. Ciekawić może symbol && oznacza on koniunkcje (czyli i) oczywiście jest również alternatywa (czyli lub) symbolizowana ||. Tego fragmentu kodu nie będę szczegółowo omawiał ponieważ nie ma tutaj niczego nowego apropo tablic które omawiamy. Zachęcam Cię jednak do samodzielnej analizy tego kodu.

Tablice to nie tylko liczby

Słowa a nawet całe zdania również są tablicami tylko że liter a dokładniej mówiąc znaków. Oczywiście do tego służy specjalna biblioteka string.h. Potraktuj jako ciekawostkę poniższy fragment kodu. Tak po prostu dla odprężenia.

#include <stdio.h>

int main()
{
    char slowo[8] = {"makowiec"}; //zmienna char przeznaczona dla znaków
    for(int i=0; i<8; i++)
    {
        printf("%c ", slowo[i]); //%c odwołanie się do char
    }
    return 0;
}

Słowo „makowiec” zostało tutaj potraktowane jako tablica znaków. Oczywiście to za sprawą typu char którego jest tablica.

Podsumowanie

Domyślam się że masz niemały mętlik w głowie po przerobieniu tego tematu. Odpocznij i na spokojnie pomyśl o tym wszystkim jeszcze raz. Tablica c/c++ nie są niczym trudnym a na pewno warto je znać. Myślę że jak się z nimi oswoisz to nie będziesz mógł wyobrazić sobie pracy bez nich. Pamiętaj o tym że są one numerowane od 0. Mając to na uwadze unikniesz wielu problemów podczas programowania. Powodzenia!