Masyvai leidžia saugoti susijusių duomenų rinkinį C kalboje be būtinybės kurti kelis kin­ta­muo­sius. Paprastai masyvai yra vien­ma­ti­niai, tačiau juos galima išplėsti iki bet kokio matmenų skaičiaus. Pa­ro­dy­si­me, kaip kurti 2D masyvus C kalboje ir kaip juos efek­ty­viai naudoti.

Kokie yra masyvų kūrimo C kalboje pagrindai?

Norėdami kurti ir valdyti 2D masyvus C kalba, turite žinoti šios struk­tū­ros pagrindus C prog­ra­ma­vi­mo kalba.

Kaip ir daugelyje kitų kalbų, masyvai C kalboje yra atminties blokas, kuriame galima saugoti keletą to paties duomenų tipo verčių. Tai leidžia išsaugoti ir sujungti kelias vertes po vienu kintamojo vardu. Masyvo dydis turi būti žinomas kom­pi­lia­vi­mo metu ir vėliau negali būti keičiamas. Toliau pateiktas kodas iliust­ruo­ja, kaip kurti masyvus C kalboje:

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

Duomenų tipas nurodomas prieš kintamojo vardą. Šiame pavyzdyje kvad­ra­ti­nės skliaus­te­lės rodo, kad šis kin­ta­ma­sis nėra vie­nin­te­lis vertė, o masyvas. Skait­me­ni­nis skaičius tarp skliaus­te­lių rodo, kiek šio duomenų tipo elementų galima saugoti masyve. Pa­teik­ta­me pavyzdyje masyvas number1 sukurtas nei­ni­ci­juo­tas. Tai reiškia, kad laukuose nėra įrašytų verčių. Vėliau kodą galima užpildyti vertėmis.

Kita vertus, masyvas number2 yra ini­ci­juo­ja­mas rankiniu būdu jo sukūrimo metu. Šis metodas yra laiką eik­vo­jan­tis dideliems masyvams, o gautas kodas dažnai yra ne­su­pran­ta­mas. Taigi, daugeliu atvejų tai nėra ge­riau­sias metodas. Paprastai geriau yra bandyti užpildyti masyvus prog­ra­miš­kai. Tai galima padaryti, pa­vyz­džiui, naudojant for-loop:

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

Pri­klau­so­mai nuo to, kokią operacinę sistemą turite, kokį C standartą naudojate ir kur savo prog­ra­mo­je dekla­ra­vo­te nei­ni­ci­juo­tą kintamąjį, šis kin­ta­ma­sis gali turėti at­si­tik­ti­nę reikšmę. Tai taikoma ir masyvo laukams. Todėl geriausia ne­pa­siek­ti laukų, kurių dar nei­ni­ci­ja­vo­te, ypač jei juose išsaugota reikšmė in­ter­pre­tuo­ja­ma kaip rodyklė.

Sukūrus masyvą, galite naudoti jo indeksą, kad pa­siek­tu­mė­te atskiras reikšmes. Svarbu atkreipti dėmesį, kad masyvai prasideda nuo indekso 0. Tai parodys žemiau pateiktas pavyzdys:

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

2D masyvas gali būti sukurtas C kalba, sukuriant masyvą, kuriame kiek­vie­nas laukas turi kitą masyvą. Daugiau apie 2D masyvus galite skaityti kitame skyriuje.

Kaip sukurti 2D masyvus C kalba

2D masyvai C kalboje iš tiesų yra tik vien­ma­tiai masyvai. Kiek­vie­nas laukas tiesiog yra kitas masyvas. 2D masyvą galima suprasti kaip verčių lentelę arba matricą. 2D masyvus galima kurti ir užpildyti naudojant šią sintaksę:

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

Čia skaičius kairėje skliaus­tuo­se reiškia indeksą, kuriuo reikia pasiekti pirmąjį masyvą. Skaičius dešinėje reiškia indeksą antrajame masyve. Šiuos du skaičius galite įsi­vaiz­duo­ti kaip 2D ko­or­di­na­tes arba eilučių ar stulpelių numerius. Kaip ir vienmatės masyvai, dvimatės masyvai taip pat gali būti ini­ci­juo­ja­mi su reikš­mė­mis, kai jie yra sukurti.

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

Principas, kai vienas masyvas yra kito masyvo viduje, nėra ribojamas dviem mat­me­ni­mis. Šį metodą galite naudoti kurdami bet kokio matmenų skaičiaus masyvus.

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

Kaip naudoti 2D masyvus C kalboje

Kartokite per 2D masyvą

2D masyvai C kalboje (arba dau­gia­ma­tės matricos) daž­niau­siai naudojami dau­gia­ma­tėms duomenų struk­tū­roms kurti. Toliau pa­teik­ta­me pavyzdyje dvimatis masyvas už­pil­dy­tas pa­kai­to­mis nuliais ir vienetais, kad at­vaiz­duo­tų šachmatų lentą:

#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

String masyvai

Jei norite sumaniai naudoti masyvus, svarbu ne­pa­mirš­ti, kad masyvas yra tik rodyklė į atminties vietą, ir būtent taip jį supranta C kom­pi­lia­to­rius. Indeksas, nurodytas rašant į atskirus laukelius arba skaitant iš jų, reiškia poslinkį masyve, palyginti su baziniu adresu. Pa­žvel­ki­me į šį pavyzdį, kad geriau su­pras­tu­me:

#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

Stringai C kalboje yra trak­tuo­ja­mi taip pat. Stringą galima kartoti taip, tarsi ji būtų masyvas. Tai matyti iš toliau pateikto pavyzdžio, kuriame trys masyve saugomi įrašai yra rašomi di­džio­sio­mis raidėmis, po vieną simbolį. Norint pasiekti simbolius, nau­do­ja­mas masyvo indeksas (skliaus­te­lės):

#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
Go to Main Menu