Kaip kurti ir naudoti 2D masyvus C kalboje
Masyvai leidžia saugoti susijusių duomenų rinkinį C kalboje be būtinybės kurti kelis kintamuosius. Paprastai masyvai yra vienmatiniai, tačiau juos galima išplėsti iki bet kokio matmenų skaičiaus. Parodysime, kaip kurti 2D masyvus C kalboje ir kaip juos efektyviai naudoti.
Kokie yra masyvų kūrimo C kalboje pagrindai?
Norėdami kurti ir valdyti 2D masyvus C kalba, turite žinoti šios struktūros pagrindus C programavimo 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 kompiliavimo metu ir vėliau negali būti keičiamas. Toliau pateiktas kodas iliustruoja, 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};cDuomenų tipas nurodomas prieš kintamojo vardą. Šiame pavyzdyje kvadratinės skliaustelės rodo, kad šis kintamasis nėra vienintelis vertė, o masyvas. Skaitmeninis skaičius tarp skliaustelių rodo, kiek šio duomenų tipo elementų galima saugoti masyve. Pateiktame pavyzdyje masyvas number1 sukurtas neinicijuotas. Tai reiškia, kad laukuose nėra įrašytų verčių. Vėliau kodą galima užpildyti vertėmis.
Kita vertus, masyvas number2 yra inicijuojamas rankiniu būdu jo sukūrimo metu. Šis metodas yra laiką eikvojantis dideliems masyvams, o gautas kodas dažnai yra nesuprantamas. Taigi, daugeliu atvejų tai nėra geriausias metodas. Paprastai geriau yra bandyti užpildyti masyvus programiškai. Tai galima padaryti, pavyzdž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.cPriklausomai nuo to, kokią operacinę sistemą turite, kokį C standartą naudojate ir kur savo programoje deklaravote neinicijuotą kintamąjį, šis kintamasis gali turėti atsitiktinę reikšmę. Tai taikoma ir masyvo laukams. Todėl geriausia nepasiekti laukų, kurių dar neinicijavote, ypač jei juose išsaugota reikšmė interpretuojama kaip rodyklė.
Sukūrus masyvą, galite naudoti jo indeksą, kad pasiektumė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: 3c2D masyvas gali būti sukurtas C kalba, sukuriant masyvą, kuriame kiekvienas 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 vienmatiai masyvai. Kiekvienas 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 skliaustuose reiškia indeksą, kuriuo reikia pasiekti pirmąjį masyvą. Skaičius dešinėje reiškia indeksą antrajame masyve. Šiuos du skaičius galite įsivaizduoti kaip 2D koordinates arba eilučių ar stulpelių numerius. Kaip ir vienmatės masyvai, dvimatės masyvai taip pat gali būti inicijuojami 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}
}cPrincipas, kai vienas masyvas yra kito masyvo viduje, nėra ribojamas dviem matmenimis. Šį metodą galite naudoti kurdami bet kokio matmenų skaičiaus masyvus.
int ints_four_dimensions[10][10][10][10];cKaip naudoti 2D masyvus C kalboje
Kartokite per 2D masyvą
2D masyvai C kalboje (arba daugiamatės matricos) dažniausiai naudojami daugiamatėms duomenų struktūroms kurti. Toliau pateiktame pavyzdyje dvimatis masyvas užpildytas pakaitomis nuliais ir vienetais, kad atvaizduotų š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
*/cString masyvai
Jei norite sumaniai naudoti masyvus, svarbu nepamiršti, kad masyvas yra tik rodyklė į atminties vietą, ir būtent taip jį supranta C kompiliatorius. Indeksas, nurodytas rašant į atskirus laukelius arba skaitant iš jų, reiškia poslinkį masyve, palyginti su baziniu adresu. Pažvelkime į šį pavyzdį, kad geriau suprastume:
#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
}cStringai C kalboje yra traktuojami 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 didžiosiomis raidėmis, po vieną simbolį. Norint pasiekti simbolius, naudojamas masyvo indeksas (skliaustelė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