Ir ao conteúdo
  • Cadastre-se

Nomenclatura de vetores multidimensionais


Posts recomendados

Bom dia amigos,

 

Pairou uma duvida em relação aos vetores multidimensionais em C.

no que se expressa [3][3][3] seriam vetores

1 2 3     1 2 3    1 2 3

4 5 6     4 5 6    4 5 6

7 8 9     7 8 9    7 8 9

Seria isso ?? 3 vetores 3 por 3 ??

 

mas e se mudar para [3][3][4] ??

 

 

para preencher os vetores de 3x3x3

for (i=0; i<3; i++)

for (j=0; j<3; j++)

for (k=0; k<3; k++)

 

 

Obrigado

Link para o comentário
Compartilhar em outros sites

@Fabio Aragao Suas observações estão corretas. Diz respeito as dimensões, logo uma matiz[3][3] é representável num plano 2D, onde se tem "altura x largura", e nas matrizes 3x3x3 se tem altura, largura e profundidade.

 

Mas matematicamente falando, no caso de mat[3][3][4], tem-se 4 x mat[3][3], ou "4x3" = 12 x mat[3], ou "12x3" = mat[36]; São diferentes formas de declarar o mesmo número de elementos do seu array.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

55 minutos atrás, CiroboyBR disse:

@Fabio Aragao Suas observações estão corretas. Diz respeito as dimensões, logo uma matiz[3][3] é representável num plano 2D, onde se tem "altura x largura", e nas matrizes 3x3x3 se tem altura, largura e profundidade.

 

Mas matematicamente falando, no caso de mat[3][3][4], tem-se 4 x mat[3][3], ou "4x3" = 12 x mat[3], ou "12x3" = mat[36]; São diferentes formas de declarar o mesmo número de elementos do seu array.

@CiroboyBR Obrigado por responder....

Se puder, você poderia me esclarecer algumas coisas ?

1 - [3][3][4] seria:

1 2 3     1 2 3    1 2 3    1 2 3

4 5 6     4 5 6    4 5 6    4 5 6

7 8 9     7 8 9    7 8 9    7 8 9

2 - Na matriz 3x3x3 seria 3 for e para esta 3x3x4, seriam 4 for ou 3 for com o ultimo diferenciado ??

 

No inicio da faculdade começamos com pascal, e com isso aprendemos que cada matriz(dimensão) declaravamos linha+coluna e no C é diferente.. 

Não ficou claro ainda a questão se 3x3x3 são 3 matrizes 3x3 e no caso a ultima posição controla a quantidade de dimensões ou a dimensão se dá pelo declaração [2][2][2][2] 4 matrizes 2x2. isso ainda está muito confuso na minha cabeça.

 

Obrigado pela ajuda

Link para o comentário
Compartilhar em outros sites

@Fabio Aragao na matrix 3x3x4 seriam ainda 3 for's, só que o terceiro for percorreria 4 posições.

 

#include <stdio.h>

int vet[3][3][4];

int main() {
  int i, j, k;

  for (i = 0; i < 3; i++) {
    printf("\n\nMatriz %d\n", i);
    for (j = 0; j < 3; j++) {
      printf("\n");
      for (k = 0; k < 4; k++) {
        printf("%3d ", vet[i][j][k]);
      }
    }
  }

  return 0;
}



 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, CiroboyBR disse:

@Fabio Aragao na matrix 3x3x4 seriam ainda 3 for's, só que o terceiro for percorreria 4 posições.

 


#include <stdio.h>

int vet[3][3][4];

int main() {
  int i, j, k;

  for (i = 0; i < 3; i++) {
    printf("\n\nMatriz %d\n", i);
    for (j = 0; j < 3; j++) {
      printf("\n");
      for (k = 0; k < 4; k++) {
        printf("%3d ", vet[i][j][k]);
      }
    }
  }

  return 0;
}


 

@CiroboyBR Então de qualquer forma seriam 3 matrizes.... sendo que a ultima com um trato especial... beleza.. entendi..

Agora, é correto afirmar que a linguagem faz um trato especial para formar as matrizes, ou seja:

para matriz bidimensional matriz[2][2] temos duas linhas e duas colunas.. está sendo declarado igual pascal ou é o fato de temos dois vetores que pelo " estrutura de repetição for" eu trato como linha e coluna ?

 

e no caso das matrizes tridimensionais em diante, como é tratado o fato da linha e da coluna, se for negativa a pergunta acima. ou seja, [3][3][3][3] onde está explicito o fato que são 3 linhas e 3 colunas ?

Link para o comentário
Compartilhar em outros sites

pense em arrays e tudo será mais fácil. Por exemplo temos o array normal char array[100];. Logo temos o array bidimensional, char array[2][100];, agora você tem 2X100 chars, ou seja, você pode guardar 2 frases de 100 letras.

Agora vamos ver o tridimensional... imagine que você tem 5 paginas onde cada pagina você tem 2 linhas que te permitem conter frases de 100 letras cada uma, isso seria algo como char array [5][2][100];
Agora vamos pensar que temos 10 livros com 5 paginas cada, e que cada pagina tenha 2 linhas que te permitem guardar uma frase de 100 letras em cada linha: char array[10][5][2][100], isso são 4 dimensões. E se agora tivesse 2 bibliotecas que contenham a mesma quantidade de livros? char array[2][10][5][2][100].... e assim por diante.
 

São conhecidos como arrays e arrays multidimensionais o que conhecemos como vetor e matrizes.
const int BIBLIOTECAS = 2;
const int LIVROS = 10;

const int PAGINAS = 5;

const int LINHAS = 2;

const int LETRAS = 100;
char biblioteca[BIBLIOTECAS][LIVROS][PAGINAS][LINHAS][LETRAS];

Acho que fica claro.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

45 minutos atrás, vangodp disse:

pense em arrays e tudo será mais fácil. Por exemplo temos o array normal char array[100];. Logo temos o array bidimensional, char array[2][100];, agora você tem 2X100 chars, ou seja, você pode guardar 2 frases de 100 letras.

Agora vamos ver o tridimensional... imagine que você tem 5 paginas onde cada pagina você tem 2 linhas que te permitem conter frases de 100 letras cada uma, isso seria algo como char array [5][2][100];
Agora vamos pensar que temos 10 livros com 5 paginas cada, e que cada pagina tenha 2 linhas que te permitem guardar uma frase de 100 letras em cada linha: char array[10][5][2][100], isso são 4 dimensões. E se agora tivesse 2 bibliotecas que contenham a mesma quantidade de livros? char array[2][10][5][2][100].... e assim por diante.
 

São conhecidos como arrays e arrays multidimensionais o que conhecemos como vetor e matrizes.
const int BIBLIOTECAS = 2;
const int LIVROS = 10;

const int PAGINAS = 5;

const int LINHAS = 2;

const int LETRAS = 100;
char biblioteca[BIBLIOTECAS][LIVROS][PAGINAS][LINHAS][LETRAS];

Acho que fica claro.

@vangodp Sim, fica claro.. está ajudando bastante...

Link para o comentário
Compartilhar em outros sites

@Fabio Aragao Ao que parece, a maneira que o C armazena arrays multidimensionais(matrizes), é da forma linear. Infelizmente eu nunca vi uma literatura do C que abordasse esse assunto(Mas quem sabe exista).

Eu pude perceber isso fazendo testes, veja esse código, acho que ele se auto explica quando compilado.

 

#include <stdio.h>

void preenche();
void imprime();

int vet[3][3][4];
int i, j, k;
//MAIN
int main() {
  preenche();
  imprime();

  int *p = (int*)(&vet);

  printf("\n\nvetor linear 1: %2d", *(p + 20)); // Demonstrandro que mesmo sendo uma matriz de 3 dimensões, ainda sim
  printf("\n\nVetor linear 2: %d", vet[0][0][20]); // a matriz é armazenada como um array linear.

  printf("\n\nLinha positiva: %d", vet[2][2][0]); //linha normal
  printf("\n\nLinha negativa: %d", vet[2][2][-1]); //linha negativa
  printf("\n\nLinha negativa: %d", vet[2][2][-2]); //linha negativa


  return 0;
}

void preenche() {
  int contador = 200;
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
      for (k = 0; k < 4; k++) {
        vet[i][j][k] = contador;
        contador++;
      }
    }
  }
}

void imprime() {
  for (i = 0; i < 3; i++) {
    printf("\n\nMatriz %d\n", i);
    for (j = 0; j < 3; j++) {
      printf("\n");
      for (k = 0; k < 4; k++) {
        printf("%3d ", vet[i][j][k]);
      }
    }
  }
}

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, CiroboyBR disse:

@Fabio Aragao Ao que parece, a maneira que o C armazena arrays multidimensionais(matrizes), é da forma linear. Infelizmente eu nunca vi uma literatura do C que abordasse esse assunto(Mas quem sabe exista).

Eu pude perceber isso fazendo testes, veja esse código, acho que ele se auto explica quando compilado.

Eu acho que ja falei sobre o assunto em algum outro tema deste fórum...
As matrizes são lineares sim. Uma matriz é um vetor de vetores... lembre disso. Que quer dizer isso? Que toda matriz por muita matriz que seja, na realidade ela é um vetor. Isso não aparece tão fácil em internet porém eu posso lhe explicar o por quê. Toda a matriz é um vetor(linear) porque a memória RAM é linear, no fundo uma matriz de [3][3][3] não passa de um vetor de 3*3*3 que traduzido é um vetor de 27 casinhas, porém cada uma fica atrás da outra de forma organizada "em linha" porque a memória é em linha, a memória não é "bidimensional" por esse motivo você pode fazer coisas como:

2 horas atrás, CiroboyBR disse:

...
  printf("\n\nvetor linear 1: %2d", *(p + 20)); // Demonstrandro que mesmo sendo uma matriz de 3 dimensões, ainda sim
  printf("\n\nVetor linear 2: %d", vet[0][0][20]); // a matriz é armazenada como um array linear.

  printf("\n\nLinha positiva: %d", vet[2][2][0]); //linha normal
  printf("\n\nLinha negativa: %d", vet[2][2][-1]); //linha negativa
  printf("\n\nLinha negativa: %d", vet[2][2][-2]); //linha negativa
...

 

 

Em outras palavras veja esse exemplo:
 

#include <stdio.h>
#include <stdlib.h>

int main (){
    char matriz[3][3][3] = {
        {{ 1, 2, 3},{ 4, 5, 6},{ 7, 8, 9}},
        {{10,11,12},{13,14,15},{16,17,18}},
        {{19,20,21},{22,23,24},{25,26,27}}
    };
    int i;
    for (i = 0; i< 3*3*3; i++) {
        printf("%2d, ", matriz[0][0][i]);
    }
    
    getchar();
    return 0;
}

quando eu imprimo a matriz tal como matriz[0][0] no laço for, podemos perceber 2 coisas, primeiramente que uso um só for e não 3, e segundo que trato a matriz como si fosse um vetor (matriz[0][0]) isso faz com que a matriz seja imprimida tal como ela está na memória RAM, ou seja, na ordem em que está armazenada, pois vetores e matriz não passam de um conjunto de variáveis com alguma forma de organização, o segredo consiste em nós saber-nos como é essa organização.
Na verdade a matriz[3][3][3]
        {{ 1, 2, 3},{ 4, 5, 6},{ 7, 8, 9}},
        {{10,11,12},{13,14,15},{16,17,18}},
        {{19,20,21},{22,23,24},{25,26,27}}

...não passa de...
matriz[3*3*3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27}


...por causa das limitações físicas da memória(linear). Se em vez de imprimir os valores imprimimos as direções de memória, nos daríamos conta da organização que tem a matriz, por isso em alguns casos podemos acessar a partes do vetor com valores negativos, na realidade nós só não deveríamos acessar a posição menor que zero, porém isso não é exatamente certo, imagine que nós reservássemos 2 vetores de forma consecutiva, podíamos trata-los como uma matriz, isso não é um erro.
Pense em uma imagem, toda imagem é uma matriz, porém tratar matrizes tem um custo mais elevado que tratar vetores, tudo se traduz em eficiência, com esse sistema de poder tratar uma matriz como um vetor aproveitando a estrutura da memória, ganhamos em eficiência, pois processar um vetor é mais rápido que processar uma matriz.

Pense que a memória começa na posição 0x0 e termina na posição 0x...(dependendo da quantidade de RAM que tenha seu computador), por isso a memória é sim linear, ela começa em 0 e termina em X, onde X é o tamanho da final RAM. O criador de C se deu conta disso, e resolveu tirar vantagem, por esse motivo C é muito mais poderoso que outras linguagens, em Java por exemplo é como andar em bicicleta com rodinhas, se nós sairmos do índice o próprio linguagem te avisa, porém em C somos nós que devemos ter claro a estrutura da memória para não cometer erros, porém podemos aproveitar a estrutura da memória em vários casos para nosso beneficio se conhecemos e sabemos como faze-lo.

Espero ter ajudado ;)
arraysja.gif

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

@vangodp Sabe o que eu vejo hoje nas faculdades, é que o professor tem MUITO conhecimento mas não tem didática...

Entre os amigos, comentamos sobre as matérias e sobre os professores e chegamos a conclusão deste fato, falta didática em muitos professores. Creio que nem cabe a questão de que temos que nos esforçar, isso é fato, temos sim.. mas se a matéria é longa.. divida dentro da grade.. se temos o problema de nivelamento dos alunos, creio eu, que uma boa equipe pedagógica resolveria 40% deste problema..... e fato é.. professores diferentes que lecionam a mesma matéria conseguem resultados diferentes com turmas diferentes... então, na minha ignorância, não cola o fato de que a culpa é do tempo que é curto ou do aluno que não se esforça, aceitaria a segunda opção se o mapa da média da turma estivesse no MINIMO um pouco abaixo da média.. e não BASTANTE abaixo da média...

Sempre recorri a este forum e sempre fui bem atendido, não vão me dar resposta pronta e acho isso muito justo, tenho que me esforçar para aprender, e forum foi feito para discutir duvidas, e não ter o trabalho pronto. Com isso tenho crescido nas áreas que tenho dificuldades. Eu só tenho a agradecer pela ajuda que sempre recebi de vocês.. e com isso tento ajudar outros colegas que tem dificuldades.

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, Fabio Aragao disse:

e com isso tento ajudar outros colegas que tem dificuldades.

Isso está muito bem ;) faça isso.

Para ser-lhe sincero eu nem passei pela universidade, nem sequer terminei a 6ª serie, programar não é meu ganha pão, isso eu faço por "prazer", hobby ou chame como quiser, é algo que eu sempre quis fazer e faço, sei que nunca vou conseguir um bom trabalho porém onde quero chegar é a dizer que não dependa somente do seu professor, seja uma esponja claro, aprenda tudo o que ele quer te ensinar, mas saiba que o maior dom de um programador é a auto pesquisa, ja seja em fórum ou internet, também em vídeos, etc. Não desista nunca! ;) 
 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...