Kako ustvariti in uporabljati 2D matrike v C
Nizi omogočajo shranjevanje niza povezanih podatkov v jeziku C, ne da bi bilo treba ustvariti več spremenljivk. Nizi so praviloma enodimenzionalni, vendar jih je mogoče razširiti na poljubno število dimenzij. Pokazali vam bomo, kako ustvariti dvodimenzionalne nize v jeziku C in kako jih učinkovito uporabljati.
Kaj so osnovni principi ustvarjanja nizov v jeziku C?
Da bi lahko ustvarjali in obvladali 2D matrike v C, morate poznati osnove te strukture v programskem jeziku C.
Podobno kot v mnogih drugih jezikih so nizi v C-ju pomnilniški blok, v katerem je mogoče shraniti več vrednosti istega podatkovnega tipa. To omogoča shranjevanje in združevanje več vrednosti pod enim imenom spremenljivke. Velikost niza mora biti znana ob prevajanju in je pozneje ni mogoče spremeniti. Naslednji kodni blok prikazuje, kako ustvariti nize v C-ju:
int numbers1[15];
// Optionally, the saved values can be specified when they are created:
int numbers2[5] = {1, 2, 3, 4, 5};cTip podatkov je naveden pred imenom spremenljivke. V tem primeru kvadratni oklepaji označujejo, da ta spremenljivka ni enotna vrednost, ampak niz. Celo število med oklepaji označuje, koliko elementov tega tipa podatkov je mogoče shraniti v nizu. V zgornjem primeru je niz number1 ustvarjen neinicializiran. To pomeni, da v polja niso zapisane nobene vrednosti. Te je mogoče kasneje v kodi zapolniti z vrednostmi.
Niz number2 pa se inicializira ročno ob ustvarjanju. Ta pristop je pri večjih nizih zamuden, končni kod pa je pogosto nerazumljiv. Zato v večini primerov ni najboljši pristop. Običajno je bolje, da nize napolnite programsko. To lahko storite na primer s for-zanko:
int numbers3[100];
for(int i = 0; i < 100; i++) {
numbers3[i] = i + 1;
}
// Creates an array containing the integers 1 to 100.cOdvisno od tega, kateri operacijski sistem imate, kateri standard C uporabljate in kje ste v programu deklarirali neinicializirano spremenljivko, lahko ta spremenljivka vsebuje naključno vrednost. To velja tudi za polja niza. Zato je najbolje, da ne dostopate do polj, ki jih še niste inicializirali, še posebej če se vrednost, shranjena v njih, interpretira kot kazalec.
Ko je niz ustvarjen, lahko uporabite njegov indeks za dostop do posameznih vrednosti. Pomembno je omeniti, da se nizi začnejo z indeksom 0. Spodnji primer vam bo to pokazal:
int numbers2[5] = {1, 2, 3, 4, 5};
numbers2[3] = numbers2[2];
printf("%d\n", numbers2[3]);
// Output: 3c2D matriko lahko izvedete v jeziku C tako, da ustvarite matriko, v kateri vsako polje vsebuje drugo matriko. Več o 2D matrikah lahko preberete v naslednjem poglavju.
Kako ustvariti 2D matrike v C
2D matrike v C so v resnici enodimenzionalne matrike. Vsako polje vsebuje samo drugo matriko. 2D matriko lahko razumemo kot tabelo ali matriko vrednosti. 2D matrike lahko ustvarimo in napolnimo z naslednjo sintakso:
ints_two_dimensions[10][10];
ints_two_dimensions [0][1] = 0;
ints_two_dimensions [2][1] = 2;
ints_two_dimensions [9][4] = 36;
// etc.cTukaj številka v levih oglatih oklepajih predstavlja indeks, do katerega je treba dostopati v prvem nizu. Številka na desni strani predstavlja indeks v drugem nizu. Ti dve številki si lahko predstavljate kot 2D koordinate ali številke vrstic ali stolpcev. Tako kot enodimenzionalni nizi se tudi dvodimenzionalni nizi lahko inicializirajo z vrednostmi , ko so ustvarjeni.
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}
}cNačelo matrike znotraj druge matrike ni omejeno na dve dimenziji. To metodo lahko uporabite za ustvarjanje matrik s poljubnim številom dimenzij.
int ints_four_dimensions[10][10][10][10];cKako lahko uporabljate 2D matrike v C-ju
Ponovi preko 2D matrike
2D matrike v C (ali večdimenzionalne matrike) se najpogosteje uporabljajo za ustvarjanje večdimenzionalnih podatkovnih struktur. V naslednjem primeru je dvodimenzionalna matrika izmenično zapolnjena z ničlami in enicami, da predstavlja šahovnico:
#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
*/cNizi nizov
Če želite spretno uporabljati nize, je pomembno, da imate v mislih, da je niz le kazalec na mesto v pomnilniku in tako ga razume tudi C-kompilator. Indeks, ki je določen pri pisanju ali branju posameznih polj, predstavlja premik vzdolž niza glede na osnovni naslov. Da bi bolje razumeli, si oglejmo naslednji primer:
#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
}cNizi se v jeziku C obravnavajo na enak način. Nizi je mogoče ponavljati, kot da bi bili nizi. To je mogoče videti v naslednjem primeru, kjer so trije zapisi, shranjeni v nizu, zapisani znak za znakom z velikimi črkami. Za dostop do znakov se uporablja polje indeksa niza (ogledne oklepaje):
#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