Ir para conteúdo
Entre para seguir isso  
Dark Skyllen

#8~2 - Vetores e Matrizes

Recommended Posts

Dark Skyllen    7
Dark Skyllen

Vetores e Matrizes

parte 2

 

 

 

Bom, vamos continuar nossa aula de Vetores e Matrizes! OiaeuMae

 

  • O que é uma Matriz?

Pra quem já sabe o que é um vetor, uma matriz se torna muito mais fácil. No vetor, temos uma "linha fatiada" de espaços na variável pra guardar valores. Na matriz teremos linhas e colunas. Vejam a imagem e diferenciem vetores de matrizes.

 

Se declararmos uma matriz[7][6]:

 

matriz2.png

 

É como se tivessemos 7 vetores de 6 posições! :coolface:

 

Agora, suponhando que eu queria pegar o valor que estiver na linha 5 e na coluna 4:

 

 

 

matriz3.png

 

Como faríamos para acessar esse valor?

Usando a mesma for para vetores:

 

matriz[4][3]

 

 

Lembrando que temos o 0, por isso há essa mudança de números o que pode confundir vocês!

 

 

 

 

 

 

Agora que aprendemos um pouco sobre matrizes, vamos colocá-las em uso?

#include <iostream.h>
#include <conio.h>

int main()
{
   int matriz[3][3] = {1,2,3,
                        4,5,6,
                        7,8,9};

   cout << "Acessando valor da 2 linha e 2 coluna: " << matriz[1][1];
getch();
}

O código acima inicializa a matriz no braço e depois exibe as coordenadas passadas.

 

Agora vamos ver como preencher a matriz inteira:

 

#include <iostream.h>
#include <conio.h>

int main()
{
   int matriz[3][3];

   /* Inicia a matriz com os valores digitados pelo usuário */
   for (int linha=0; linha<3; linha++)
   /* Quando o for da coluna terminar, ai sim ele implementa esse */
       for (int coluna=0; coluna<3; coluna++)
       {
           cout << "Digite o valor da coordenada matriz[" << linha << "][" << coluna << "]: ";
           cin >> matriz[linha][coluna];
       }

   /* Printa a matriz inteira */
   for (int linha=0; linha<3; linha++)
   {
       for (int coluna=0; coluna<3; coluna++)
           cout << matriz[linha][coluna] << "\t";

       /* Quando acabar o for da coluna, ele quebra a linha */
       cout << "\n";
   }
   getch();
}




Sobre matriz é isso pessoal! Qualquer dúvida perguntar no tópico!

 

 

 

 

 

 

 

Calloc

 

  • Usando o calloc!

Chegamos em uma parte complicada, que vai dar dor de cabeça em muitos.

Mas não é possível declarar um vetor sem especificar o tamanho do mesmo, a não ser que utilizamos um comando chamado calloc.

O calloc vai dizer pra memória quantos espacinhos fatiados e quantos bytes o vetor irá ocupar. Com isso a memória consegue entender que aquele endereço de memória pertence/pertencerá a um vetor.Na verdade o que fazeremos a seguir, é fazer com que o ponteiro aponte para um endereço de memória "fatiado", e ele possa ser usado como vetor.

 

O comando é simples:

 

calloc(Quantos espaços, Quantos BYTES pra cada espacinho)



Já expliquei na parte 1 dessa aula como pegar os BYTES ocupados por cada tipo de variável, mas se alguém quiser, faça isso:

 

 

 

 

 

 

 

 

sizeof(tipo_de_dado) // ex: int, float, long int, double...

Como vamos trabalhar com endereços de memória, o nosso vetor precisa ser do tipo ponteiro.

 

Vou dar um exemplo de alocação de vetores, bem explicado e detalhado:

 

#include <iostream.h>
#include <conio.h>
#include <stdlib.h> /* Nova lib pra uso do EXIT_FAILURE */

int main()
{
   int* vetor;
   int tam;

   cout << "Digite o tamanho do vetor: ";
   cin >> tam;

   if (tam < 1) /* Não podemos abrigar um vetor com 0 ou posições negativas */
      exit(EXIT_FAILURE); /* Fecha o programa */

   if ((vetor = (int*)/* Força a entrada apenas de int* */ calloc(tam, sizeof(int*)))/* Tenta "fatiar" o endereço de memória do vetor */ == NULL)
   /* Se toda a tentativa de alocação for nula, não tem espaço na memória ou ocorreu algum erro. Então fecha o programa */
      exit(EXIT_FAILURE);

   /* Preenche vetor */
   for (int i=0; i<tam; i++)
   {
       cout << "Digite o " << i+1 << "o valor do vetor: ";
       cin >> vetor[i];
   }

   /* Exibe o vetor */
   for (int i=0; i<tam; i++)
       cout << "\nVetor[" << i << "] = " << vetor[i];

   free(vetor); /* Libera a memória que o vetor está utilizando */


 getch();

}



Sim, eu sei, é bem complicado, mas é essencial. Leia quantas vezes for necessário para vocês entenderem! OiaeuMae

 

 

 

 

 

 

 

Exercícios:

1 - Faça uma matriz[5][5] que receba somente valores de 0 à 10. Depois de receber os valores, verifique quantos números '1' existem na matriz. Escreva a quantidade de números '1' encontrados.

 

2- Faça um vetor onde o usuário decida o tamanho dele, preencha ele e depois ordene de ordem crescente os elementos do vetor. Exiba o vetor em ordem crescente.

 

Por hoje é só pessoal!

 

Até a próxima aula,

Abraços!

Editado por Dark Skyllen

Compartilhar este post


Link para o post
Compartilhar em outros sites
Raphael Carnaúba    1
Raphael Carnaúba

Exercicio 1:

int main()
{
  int vetor[5][5];
  int n, cont=0;


  for(int i =0; i < 5; i++)
  {
      for(int j=0; j < 5; j++)
      {
         cin >> n;
         if(!(n <= 10))
              j--;
         else
              vetor[i][j] = n;
         if(vetor[i][j] == 1)
            cont++;

      }   
  } 

  cout << "Numero 1 encontrados: " << cont << endl;     

  return 1;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Dark Skyllen    7
Dark Skyllen

@Raphael Carnaúba

 

Perfeito cara. Exatamente o que eu queria, só faltou o exercício 2.

Faz o exercício 2 e posta para avaliação.. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites
Raphael Carnaúba    1
Raphael Carnaúba

Exercicio 2:

 

int main()
{
  int M, N;
  cin >> M >> N;

  int vetor[M][N];
  int n;

  for(int i =0; i < M; i++)
  {
       for(int j=0; j < N; j++)
       {
            cin >> vetor[i][j];                
       }   
  } 

  for(int i =0; i < M; i++)
  {
        for(int j=0; j < N; j++)
        { 
              cout << "|" << vetor[i][j];            
        }
        cout << "|" << endl;
  }
  return 1;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Dark Skyllen    7
Dark Skyllen

@Rapha

 

Na verdade faltou ordenar os valores do vetor em ordem crescente, só isso.

E também você fez uma matriz, sendo que era um vetor, mas não é problema, contanto que você consiga ordenar em ordem crescente.

Compartilhar este post


Link para o post
Compartilhar em outros sites
dragonlorde    0
dragonlorde

Nao entendi essa linha:

if ((vetor = (int*)/* Força a entrada apenas de int* */ calloc(tam, sizeof(int*)))/* Tenta "fatiar" o endereço de memória do vetor */ == NULL)

Poderia explicar?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Dark Skyllen    7
Dark Skyllen

@dragonlorde

 

Não sei se você lembra das aulas de ponteiros, mas a função deles é apontar para um endereço de memória, correto? Ao usarmos o comando calloc, ele vai "fatiar" um endereço de memória pra que este endereço seja igual ao de um vetor. O que a variável ponteiro irá fazer, é apontar para esse endereço "fatiado", entendeu?

Com isso a variável ponteiro ficará como se fosse um vetor.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Antharaz    4
Antharaz
Como faríamos para acessar esse valor?

Usando a mesma for para vetores:

 

Citação:

matriz[5][4]

 

No caso, seria matriz[4][3] para acessar o valor já que começa do 0, ou estou errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Baxnie    8
Baxnie

Agora só falta ensinar a declarar matrizes grandes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
Entre para seguir isso  

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×