/ / Różne sposoby drukowania zawartości tablicy dwuwymiarowej - c, tablice, pętle

Różne sposoby drukowania zawartości tablicy dwuwymiarowej - c, tablice, pętle

Jak możesz sprawdzić ten kod:

#include<stdio.h>

int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[0][i]=12-i;
printf("a[0][%i] = %in", i, a[0][i]);
}
return 0;
}

Prawidłowo drukuje liczbę od 12 do 1. Jednak ten fragment kodu:

#include<stdio.h>

int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[i][0]=12-i;
printf("a[%i][0] = %in", i, a[i][0]);
}
return 0;
}

Drukuje 12, 11, 10, 1, 2, 1. Jaki może być problem? Wiem, że możesz to wydrukować za pomocą 2 pętli i zmiennych, ale staram się nauczyć, jak to zrobić.

Odpowiedzi:

3 dla odpowiedzi № 1

To, co tam robisz, jest złą praktyką w obu przypadkach. Masz szczęście, że działa pierwszy sposób (ponieważ 3 podrzędne tablice o rozmiarze 4 są w pamięci kolejne).

Jeśli chcesz pracować z tablicami dwuwymiarowymi w jednowymiarowej pętli, powinieneś użyć dwóch sposobów podziału liczb całkowitych: / i %:

int main(){
int a[3][4];
int i;
for(i=0;i<12;i++){
a[i/4][i%4]=12-i;
printf("a[%i][%i] = %in", i/4, i%4, a[i/4][i%4]);
}
return 0;
}

Na przykład dla i = 7, mamy i/4 == 1 („podziel i zaokrąglij w dół do liczby całkowitej”) i i%4 == 3 („reszta po podziale”).


0 dla odpowiedzi nr 2

Ma to związek ze sposobem przechowywania danychpamięć. W pierwszym przypadku dodajesz je sekwencyjnie i ma miejsce na 3 * 4 = 12 elementów. Możesz więc na szczęście włożyć wszystkie elementy do środka, ponieważ masz w sumie 3 * 4 komórki. W drugim przypadku próbujesz umieścić dane tylko w pierwszej komórce każdego wiersza, ale nie zaznaczyłeś spacji 12, po wskazaniu 3 wierszy. Aby uzyskać więcej informacji o pamięci w tablicach wielowymiarowych, spójrz tutaj:

Jak formatowane są wielowymiarowe tablice w pamięci?


-1 dla odpowiedzi nr 3
+---------------------------------------------------------------------------------+
|    a[0][0]      <--a[0][1]         <--a[0][0]                                   |
|    a[0][1]      <--a[0][2]                                                      |
|    a[0][2]      <--a[0][3]                                                      |
|    a[0][3]            .                                                         |
|    a[1][0]            .            <--a[1][0]                                   |
|    a[1][1]            .                                                         |
|    a[1][2]            .                                                         |
|    a[1][3]            .                                                         |
|    a[2][0]            .            <--a[2][0]                                   |
|    a[2][1]            .                                                         |
|    a[2][2]      <--a[0][10]                                                     |
|    a[2][3]      <--a[0][11]                                                     |
|       ^               ^            <--a[3][0]  <-- already memory overflow !    |
|       |               |                .                                        |
|  array memory     Y 1th code           .                                        |
|                                  others all memory overflow!                  |
|                                                                                 |
|                                      you 2th code                               |
+---------------------------------------------------------------------------------+

Więc możesz użyća[i/4][i%4] tylko upewnij się, że nie ma przepełnienia pamięci.

Pozwól mi powiedzieć : oczywiście, że twój pierwszy kod ma rację, nie sądzę, że to szczęście. W C dwuwymiarowa tablica jest zawsze połączona z dwuwymiarowym zestawieniem. Jednak, patrz moje zdanie, Nie warto tego używać.

Jeśli naprawdę potrzebujesz prędkości, nie chcesz / i „%” Myślę, że nadal możesz użyć cide 1.