Kuinka luoda ja käyttää 2D-taulukoita C-kielellä
Taulukot mahdollistavat useiden toisiinsa liittyvien tietojen tallentamisen C-kielellä ilman, että on tarpeen luoda useita muuttujia. Taulukot ovat yleensä yksiulotteisia, mutta niitä voidaan laajentaa sisältämään mikä tahansa määrä ulottuvuuksia. Näytämme, kuinka luodaan 2D-taulukoita C-kielellä ja kuinka niitä käytetään tehokkaasti.
Mitkä ovat taulukoiden luomisen perusteet C-kielessä?
Jotta voit luoda ja hallita 2D-taulukoita C-kielellä, sinun on tunnettava tämän rakenteen perusteet C-ohjelmointikielessä.
Kuten monissa muissakin kielissä, C-kielessä taulukot ovat muistilohkoja, joihin voidaan tallentaa useita saman tietotyypin arvoja. Näin useita arvoja voidaan tallentaa ja yhdistää yhden muuttujan nimen alle. Taulukon koko on tiedettävä jo kääntämishetkellä, eikä sitä voi muuttaa myöhemmin. Seuraava koodilohko havainnollistaa taulukoiden 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};cTietotyyppi määritetään muuttujan nimen edessä. Tässä esimerkissä hakasulkeet osoittavat, että tämä muuttuja ei ole yksittäinen arvo, vaan taulukko. Hakasulkeiden välissä oleva kokonaisluku osoittaa, kuinka monta tämän tietotyypin elementtiä taulukkoon voidaan tallentaa. Yllä olevassa esimerkissä taulukko number1 luodaan alustamattomana. Tämä tarkoittaa, että kenttiin ei ole kirjoitettu arvoja. Ne voidaan täyttää arvoilla myöhemmin koodissa.
Taulukon number2 puolestaan alustetaan manuaalisesti luomisen yhteydessä. Tämä lähestymistapa on aikaa vievä suurempien taulukoiden kohdalla, ja tuloksena oleva koodi on usein vaikeaselkoinen. Siksi se ei useimmissa tapauksissa ole paras lähestymistapa. Yleensä on parempi yrittää täyttää taulukot ohjelmoimalla. Tämä voidaan tehdä esimerkiksi for-silmukalla:
int numbers3[100];
for(int i = 0; i < 100; i++) {
numbers3[i] = i + 1;
}
// Creates an array containing the integers 1 to 100.cRiippuen siitä, mikä käyttöjärjestelmä sinulla on, mitä C-standardia käytät ja missä olet määrittänyt alustamattoman muuttujan ohjelmassasi, tämä muuttuja voi sisältää satunnaisen arvon. Tämä koskee myös taulukon kenttiä. Siksi on parasta olla käyttämättä kenttiä, joita et ole vielä alustanut, etenkin jos niihin tallennettu arvo tulkitaan osoittimeksi.
Kun taulukko on luotu, voit käyttää sen indeksiä yksittäisten arvojen hakemiseen. On tärkeää huomata, että taulukot alkavat indeksistä 0. Alla oleva esimerkki havainnollistaa tätä:
int numbers2[5] = {1, 2, 3, 4, 5};
numbers2[3] = numbers2[2];
printf("%d\n", numbers2[3]);
// Output: 3c2D-taulukko voidaan toteuttaa C-kielellä luomalla taulukko, jossa jokainen kenttä sisältää toisen taulukon. Lisätietoja 2D-taulukoista on seuraavassa osassa.
Kuinka luoda 2D-taulukoita C-kielellä
C-kielessä 2D-taulukot ovat oikeastaan vain yksiulotteisia taulukoita. Jokainen kenttä sisältää vain toisen taulukon. 2D-taulukko voidaan ymmärtää arvojen taulukkona tai matriisina. 2D-taulukot voidaan luoda ja täyttää seuraavalla syntaksilla:
ints_two_dimensions[10][10];
ints_two_dimensions [0][1] = 0;
ints_two_dimensions [2][1] = 2;
ints_two_dimensions [9][4] = 36;
// etc.cTässä vasemmassa hakasulkeessa oleva numero edustaa ensimmäisessä taulukossa käytettävää indeksiä. Oikealla oleva numero edustaa toisessa taulukossa käytettävää indeksiä. Ajattele näitä kahta numeroa 2D-koordinaatteina tai rivi- tai sarakkeenumeroina. Yksidimensioisten taulukoiden tavoin myös kaksiulotteiset taulukot voidaan alustaa arvoilla niiden luomisen yhteydessä.
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}
}cToisen taulukon sisällä olevan taulukon periaate ei rajoitu kahteen ulottuvuuteen. Tätä menetelmää voidaan käyttää minkä tahansa ulottuvuuksien taulukoiden luomiseen.
int ints_four_dimensions[10][10][10][10];cKuinka voit käyttää 2D-taulukoita C-kielessä
Toista 2D-taulukon läpi
C-kielessä 2D-taulukoita (tai moniulotteisia taulukoita) käytetään yleisimmin moniulotteisten tietorakenteiden luomiseen. Seuraavassa esimerkissä kaksiulotteinen taulukko täytetään vuorotellen nollilla ja ykkösillä shakkilaudan esittämiseksi:
#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
*/cMerkkijonojoukot
Jos haluat käyttää taulukoita taitavasti, on tärkeää muistaa, että taulukko on vain osoitin muistipaikkaan ja näin C-kääntäjä sen ymmärtää. Yksittäisiin kenttiin kirjoitettaessa tai niitä luettaessa määritetty indeksi edustaa siirtymää taulukossa suhteessa perusosoitteeseen. Katsotaanpa seuraavaa esimerkkiä, jotta saamme paremman käsityksen 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
}cMerkkijonot käsitellään samalla tavalla C-kielessä. Merkkijonoa on mahdollista käsitellä kuin se olisi taulukko. Tämä näkyy seuraavassa esimerkissä, jossa taulukkoon tallennetut kolme tietuetta kirjoitetaan merkki merkiltä isoilla kirjaimilla. Merkkien käyttämiseksi käytetään taulukon indeksikenttää (hakasulkeet):
#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