Taulukot mah­dol­lis­ta­vat useiden toisiinsa liit­ty­vien tietojen tal­len­ta­mi­sen C-kielellä ilman, että on tarpeen luoda useita muuttujia. Taulukot ovat yleensä yk­siu­lot­tei­sia, mutta niitä voidaan laajentaa si­säl­tä­mään mikä tahansa määrä ulot­tu­vuuk­sia. Näytämme, kuinka luodaan 2D-tau­lu­koi­ta C-kielellä ja kuinka niitä käytetään te­hok­kaas­ti.

Mitkä ovat tau­lu­koi­den luomisen perusteet C-kielessä?

Jotta voit luoda ja hallita 2D-tau­lu­koi­ta C-kielellä, sinun on tun­net­ta­va tämän rakenteen perusteet C-oh­jel­moin­ti­kie­les­sä.

Kuten monissa muissakin kielissä, C-kielessä taulukot ovat muis­ti­loh­ko­ja, joihin voidaan tallentaa useita saman tie­to­tyy­pin arvoja. Näin useita arvoja voidaan tallentaa ja yhdistää yhden muuttujan nimen alle. Taulukon koko on tie­det­tä­vä jo kään­tä­mis­het­kel­lä, eikä sitä voi muuttaa myöhemmin. Seuraava koo­di­loh­ko ha­vain­nol­lis­taa tau­lu­koi­den luomista C-kielessä:

int numbers1[15];
// Optionally, the saved values can be specified when they are created:
int numbers2[5] = {1, 2, 3, 4, 5};
c

Tie­to­tyyp­pi mää­ri­te­tään muuttujan nimen edessä. Tässä esi­mer­kis­sä ha­ka­sul­keet osoit­ta­vat, että tämä muuttuja ei ole yk­sit­täi­nen arvo, vaan taulukko. Ha­ka­sul­kei­den välissä oleva ko­ko­nais­lu­ku osoittaa, kuinka monta tämän tie­to­tyy­pin ele­ment­tiä tau­luk­koon voidaan tallentaa. Yllä olevassa esi­mer­kis­sä taulukko number1 luodaan alus­ta­mat­to­ma­na. Tämä tar­koit­taa, että kenttiin ei ole kir­joi­tet­tu arvoja. Ne voidaan täyttää arvoilla myöhemmin koodissa.

Taulukon number2 puo­les­taan alus­te­taan ma­nu­aa­li­ses­ti luomisen yh­tey­des­sä. Tämä lä­hes­ty­mis­ta­pa on aikaa vievä suu­rem­pien tau­lu­koi­den kohdalla, ja tuloksena oleva koodi on usein vai­kea­sel­koi­nen. Siksi se ei useim­mis­sa ta­pauk­sis­sa ole paras lä­hes­ty­mis­ta­pa. Yleensä on parempi yrittää täyttää taulukot oh­jel­moi­mal­la. Tämä voidaan tehdä esi­mer­kik­si for-sil­mu­kal­la:

int numbers3[100];
for(int i = 0; i < 100; i++) {
numbers3[i] = i + 1;
}
// Creates an array containing the integers 1 to 100.
c
Vinkki

Riippuen siitä, mikä käyt­tö­jär­jes­tel­mä sinulla on, mitä C-stan­dar­dia käytät ja missä olet mää­rit­tä­nyt alus­ta­mat­to­man muuttujan oh­jel­mas­sa­si, tämä muuttuja voi sisältää sa­tun­nai­sen arvon. Tämä koskee myös taulukon kenttiä. Siksi on parasta olla käyt­tä­mät­tä kenttiä, joita et ole vielä alustanut, etenkin jos niihin tal­len­net­tu arvo tulkitaan osoit­ti­mek­si.

Kun taulukko on luotu, voit käyttää sen indeksiä yk­sit­täis­ten arvojen ha­ke­mi­seen. On tärkeää huomata, että taulukot alkavat in­dek­sis­tä 0. Alla oleva esimerkki ha­vain­nol­lis­taa tätä:

int numbers2[5] = {1, 2, 3, 4, 5};
numbers2[3] = numbers2[2];
printf("%d\n", numbers2[3]);
// Output: 3
c

2D-taulukko voidaan toteuttaa C-kielellä luomalla taulukko, jossa jokainen kenttä sisältää toisen taulukon. Li­sä­tie­to­ja 2D-tau­lu­kois­ta on seu­raa­vas­sa osassa.

Kuinka luoda 2D-tau­lu­koi­ta C-kielellä

C-kielessä 2D-taulukot ovat oi­keas­taan vain yk­siu­lot­tei­sia tau­lu­koi­ta. Jokainen kenttä sisältää vain toisen taulukon. 2D-taulukko voidaan ymmärtää arvojen tau­luk­ko­na tai mat­rii­si­na. 2D-taulukot voidaan luoda ja täyttää seu­raa­val­la syn­tak­sil­la:

ints_two_dimensions[10][10];
ints_two_dimensions [0][1] = 0;
ints_two_dimensions [2][1] = 2;
ints_two_dimensions [9][4] = 36;
// etc.
c

Tässä va­sem­mas­sa ha­ka­sul­kees­sa oleva numero edustaa en­sim­mäi­ses­sä tau­lu­kos­sa käy­tet­tä­vää indeksiä. Oikealla oleva numero edustaa toisessa tau­lu­kos­sa käy­tet­tä­vää indeksiä. Ajattele näitä kahta numeroa 2D-koor­di­naat­tei­na tai rivi- tai sa­rak­kee­nu­me­roi­na. Yk­si­di­men­siois­ten tau­lu­koi­den tavoin myös kak­siu­lot­tei­set taulukot voidaan alustaa arvoilla niiden luomisen yh­tey­des­sä.

floats_two_dimensions[2][6] = {
{0.1, 3.56, 6.346, 8.9, 45.345, 2.284},
{7.0, 1.12, 9.74, 0.0, 3.56, 4.4}
}
c

Toisen taulukon sisällä olevan taulukon periaate ei rajoitu kahteen ulot­tu­vuu­teen. Tätä me­ne­tel­mää voidaan käyttää minkä tahansa ulot­tu­vuuk­sien tau­lu­koi­den luomiseen.

int ints_four_dimensions[10][10][10][10];
c

Kuinka voit käyttää 2D-tau­lu­koi­ta C-kielessä

Toista 2D-taulukon läpi

C-kielessä 2D-tau­lu­koi­ta (tai mo­niu­lot­tei­sia tau­lu­koi­ta) käytetään ylei­sim­min mo­niu­lot­teis­ten tie­to­ra­ken­tei­den luomiseen. Seu­raa­vas­sa esi­mer­kis­sä kak­siu­lot­tei­nen taulukko täytetään vuo­ro­tel­len nollilla ja ykkösillä shak­ki­lau­dan esit­tä­mi­sek­si:

#include <stdio.h>
#define ARRAY_LENGTH 8
int main() {
    int chessboard[8][8];
    for(int i = 0; i < ARRAY_LENGTH; i++) {
        for(int j = 0; j < ARRAY_LENGTH; j++) {
            chessboard[i][j] = (i + j) % 2;
            printf("%d", chessboard[i][j]);
        }
        printf("\n");
    }
    return 0;
}
/*
Output:
01010101
10101010
01010101
10101010
01010101
10101010
01010101
10101010
*/
c

Merk­ki­jo­no­jou­kot

Jos haluat käyttää tau­lu­koi­ta tai­ta­vas­ti, on tärkeää muistaa, että taulukko on vain osoitin muis­ti­paik­kaan ja näin C-kääntäjä sen ymmärtää. Yk­sit­täi­siin kenttiin kir­joi­tet­taes­sa tai niitä luet­taes­sa mää­ri­tet­ty indeksi edustaa siirtymää tau­lu­kos­sa suhteessa pe­rus­o­soit­tee­seen. Kat­so­taan­pa seuraavaa esi­merk­kiä, jotta saamme paremman kä­si­tyk­sen asiasta:

#include <stdio.h>
int main() {
int number2[5] = {1, 2, 3, 4, 5};
printf("%d\n", *number2);
// Output: 1
printf("%d\n", *(number2 + 2));
// Output: 3
}
c

Merk­ki­jo­not kä­si­tel­lään samalla tavalla C-kielessä. Merk­ki­jo­noa on mah­dol­lis­ta käsitellä kuin se olisi taulukko. Tämä näkyy seu­raa­vas­sa esi­mer­kis­sä, jossa tau­luk­koon tal­len­ne­tut kolme tietuetta kir­joi­te­taan merkki merkiltä isoilla kir­jai­mil­la. Merkkien käyt­tä­mi­sek­si käytetään taulukon in­dek­si­kent­tää (ha­ka­sul­keet):

#include <stdio.h>
int main() {
    char* sentences[3];
    sentences[0] = "Hello, this is the first sentence.\n";
    sentences[1] = "This is the second sentence.\n";
    sentences[2] = "And now there are three.\n";
    printf("Original sentences:\n\n");
    for(int i = 0; i < 3; i++) {
        printf("%s", sentences[i]);
    }
    printf("\nChanged sentences:\n\n");
    for(int i = 0; i < 3; i++) {
        int j = 0;
        while(sentences[i][j] != '\n') {
            if(sentences[i][j] >= 'a' && sentences[i][j] <= 'z') {
                printf("%c", sentences[i][j] - 0x20);
            } else {
                printf("%c", sentences[i][j]);
            }
            j++;
        }
        printf("\n");
    }
}
/*
Output:
Original sentences:
Hello, this is the first sentence.
This is the second sentence.
And now there are three.
Changed sentences:
HELLO, THIS IS THE FIRST SENTENCE.
THIS IS THE SECOND SENTENCE.
AND NOW THERE ARE THREE.
*/
c
Siirry pää­va­lik­koon