sexta-feira, 20 de março de 2009

Transpor Matriz em Vetor

Olá galera do ICC!!

Hoje vou postar um programinha feito por mim durante uma aula de revisão, ele é muito simples, possui basicamente uma matriz de ordem 10 e um vetor de 100 elementos.

Segue abaixo o código-fonte.


/*
Data: 09/03/2009
Autor: Bolívar Arthur Butzke

E-mail: bolivarbutzke@gmail.com
Blog: bolivarbutzke.blogspot.com

1) Considerando uma matriz “M”, com a seguinte definição: 

              [ M(I,J), (I = 1..10), (J = 1..10) ] e um vetor

              V(I), (I = 1..100), escreva os seguintes procedimentos:

i) Um procedimento que mostre a diagonal principal da matriz
ii) Um procedimento de consulta e um de atribuição para os elementos da matriz “M”
iii) Um procedimento que transponha a matriz “M” para o vetor “V”
*/

#include stdio.h
#include time.h

/* Prototipação das Funções */
void DiagonalPrincipal(void);
void Consultar(void);
void Atribuir(void);
void Trasnpor(void);
void ExibirVetor(void);
void ExibirMatriz(void);

/* Declaração das variáveis Globais */
int M[10][10], i, j, V[100], n; 

int main()
{
 /* Preenche a matriz com números aleatórios */ 
 for (i=0;i<10;i++)
  for (j=0;j<10;j++)
  {
   srand(time(NULL)+i*j);   
   M[i][j] = rand() % 100;
  }
 /* Chama função que exibe a matriz */
 ExibirMatriz();
 /* Chama função que exibe a diagonal principal */
 DiagonalPrincipal();
 /* Chama função que consulta na matriz */
 Consultar();
 /* Chama função que cadastra valor na matriz */ 
 Atribuir();
 /* Chama função que transpoe a matriz em vetor */
 Trasnpor();
 /* Chama função que exibe o vetor */
 ExibirVetor();
 /* Encerra a função main retornando um inteiro -> 0 */
 return 0;
}

void DiagonalPrincipal(void)
{
 /* Procedimento que Exibe a diagonal principal da matriz */
 printf("\n\n--------------------------------------------------\n");
 printf(" Diagonal Principal da Matriz");
 printf("\n--------------------------------------------------\n");
 for (i=0;i<10;i++)
  for (j=0;j<10;j++)
   if (i==j)    
    printf("%d ",M[i][j]); 
}

void Consultar(void)
{
 /* Procedimento de Consulta na Matriz M */ 
 printf("\n\n--------------------------------------------------\n");
 printf(" Consulta dos Elementos da Matriz");
 printf("\n--------------------------------------------------\n");
 printf("\n Informe a linha do elemento: ");
 scanf("%d",&i);
 printf("\n Informe a coluna do elemento: ");
 scanf("%d",&j);
 printf("\n Valor armazenado Matriz[%d][%d]: %d\n",i,j,M[i][j]);
}

void Atribuir(void)
{
 /* Procedimento de Atribuição de Valor para um elemento da Matriz M */
 printf("\n\n--------------------------------------------------\n");
 printf(" Atribuição de Valor para um elemento da Matriz");
 printf("\n--------------------------------------------------\n");
 printf("\n Informe a linha do elemento: ");
 scanf("%d",&i);
 printf("\n Informe a coluna do elemento: ");
 scanf("%d",&j);
 printf("\n Informe o valor para armazenar: ");
 scanf("%d",&M[i][j]);
 printf("\n Valor armazenado Matriz[%d][%d]: %d\n\n",i,j,M[i][j]); 
}

void Trasnpor(void)
{
 /* Procedimento para transpor a Matriz M para o Vetor V */
 printf("\n\n--------------------------------------------------\n");
 printf(" Transposição da Matriz M para o Vetor V");
 printf("\n--------------------------------------------------\n");
 n = 0;
 for (i=0;i<10;i++)
  for (j=0;j<10;j++)
  {    
   V[n] = M[i][j];
   n++;
  }
}

void ExibirVetor(void)
{
 /* Exibe dados no vetor */
 printf("\n\n--------------------------------------------------\n");
 printf(" Dados do Vetor");
 printf("\n--------------------------------------------------\n");
 for (n=0;n<100;n++)
  printf("Vetor[%d] = %d\n",n,V[n]);
}

void ExibirMatriz(void)
{
 /* Exibe dados da matriz */
 printf("\n\n--------------------------------------------------\n");
 printf(" Dados armazenados na Matriz");
 printf("\n--------------------------------------------------\n");
 for (i=0;i<10;i++)
 {
  for (j=0;j<10;j++)
  {
   printf("%d ",M[i][j]);
  }
 printf("\n");
 }
}


Bem, no início do programa eu precisei incluir o arquivo de cabeçalho (header) stdio.h (Standart Input/Output) para poder executar os comandos de entrada e saída como printf e scanf, sendo que o printf serve para imprimir uma mensagem na tela e o scanf serve para ler algum valor formatado, por isso precisa passar um parametro dizendo qual o tipo de dados que vai receber e em qual variável vai armazenar, neste caso as variáveis eram todas do tipo integer (valores inteiros) então a máscara é %d. Também precisei incluir o time.h para usar a função time e poder atribuir valores aleatórios conforme hora do sistema nos elementos da matriz.

Quando copiar este código para testar lembre-se de que precisa ter o sinal de "menor que" antes do nome dos arquivos de cabeçalho e o sinal de "maior que" no final para que o seu compilador preferido busque estes arquivos.header na pasta padrão do compilador, se por acaso você tiver estes arquivos cole-os no mesmo diretório/pasta do arquivo com código-fonte.c e então coloque os nomes dos arquivos de cabeçalho dentro de "aspas duplas".

A função que passa os valores armazenados na matriz para o vetor é muito simples, primeiramente inicializamos a variável n com o valor zero, que corresponde ao primeiro elemento do vetor (lembre-se que sempre começamos a contar do zero). Depois fizemos dois for , que chamamos de laços aninhados para acessar os elementos da matriz, no primeiro laço dizemos qual linha estamos e no segundo a coluna, assim podemos percorrer todos os elementos da matriz.

Dentro deste laços aninhados, atribuimos o valor da matriz para o vetor e somamos 1 na variável n, assim quando o laço se repetir a segunda vez passaremos o valor armazenada na linha 0 e coluna 1 para a posição 1 do vetor, na terceira vez ainda será o valor da linha zero mas coluna dois e n valerá 2, e assim por diante até passarmos os 100 valores armazenados na matriz para o vetor.

A função "DiagonalPrincipal" serve para exibir os elementos que se encontram na Diagonal Principal, ou seja, os elementos onde o número da linha é igual ao número da coluna. Outras funções mais simples são para atribuir um valor para um determinado elemento da matriz e consultar o valor de um elemento da matriz, em nenhuma das funções eu precisei passar valores por parametros ou ponteiros porque neste programa específico estamos utilizando variáveis globais que ficam visíveis em todo o programa.

Por enquanto é isso, em breve artigo sobre listas encadeadas.

7 comentários:

  1. bom, seu código me ajudou muito!
    gostei!
    eu preciso criar uma matriz 8x8 e posicionar nela algumas bombas aleatoriamente e nas casas vazias dizer quantas bombas tem nas adjacencias. O que ta dificil é seguir o raciocinio que criei. Pensei em fazer uma varredura na minha matriz buscando as bombas e adicionando as posições dela (os indices de i e j) nesse vetor. Depois eu faria um for nesse vetor e para cada posição da bomba incrementar 1 as suas adjacencias.

    Sabe me dizer se é possível fazer isso?

    Talvez eu tenho que criar uma variável e ir incrementando e pegar o valor que desse como sendo o indice.

    ResponderExcluir
  2. Para estudar Vetor e Matriz e muito dificil? Porque eu to fazendo técnico em informática to achando muito complicado!

    ResponderExcluir
  3. Nossa! Quanto tempo eu não olhava este blog, tem comentário de mais de ano sem resposta... vou responder da Mileide que está mais fácil :D.

    Estudar matriz e vetores não é muito difícil, é umas das coisas mais simples e portanto uma das primeiras que os professores exigem, estas atividades ajudam a desenvolver o raciocínio lógico que todos os programadores devem ter muito bem desenvolvido, isso ajuda pra resolver problemas diversos, não apenas em computação, mas em todas as áreas. Se você está achando difícil é porque não praticou o suficiente, depois que aprende é fácil. :D

    Esta tal de lógica é uma das coisas que está fazendo os Engenheiros assumirem tantos cargos de gerência, nas engenharias é muito forte o estudo de Cálculos para resolver problemas, algo muito necessário para quem quer ser um bom administrador.

    Abraços

    ResponderExcluir
  4. Realmente o codigo acima é bom,embora após fazer todos os testes em meu compilador, algumas funcoes não davam o resultado que se esperava, a localização do elemento não esta a pegar o elemento certo e a alteração se for por 0 ele finalisa o programa.


    mais de qualquer forma foi bem pensado...
    Abraços.

    ResponderExcluir
  5. Muito massa cara ! Me ajudou bastante.

    ResponderExcluir
  6. Pessoal, essa função transpor. Gostaria de um jeito de pegar um char cpf(11);
    e passar para uma matriz[linha][coluna]. Quero pegar a cpf[0] e passar para matriz[i][j] desde que j seja maior que 2 (os primeiros 2 campos são nomes e idade).

    nao quero deixar o usuario digitando digito por digito do cpf

    Enfim, olha como esta o exercicio:

    /*
    fazer um vetor de 20 posições que vai pra primeira -LINHA- da matriz. Ele vai armazenar o ID.
    Depois a segunda linha da matriz vai ser Idade.
    Da linha 3 a 13 vai ser o CPF, ou seja:
    coluna
    ID - 1 - 2 - 3 - 4 - 5 - linhas
    Age - 11 - 22 - 33 - 44 - 55
    1nCpf - 4 - 1
    2nCpf - 1 - 2
    3nCpf - 3 - 5
    4nCpf - 0 - 7
    5nCpf - 4 - 8
    6nCpf - 4 - 0
    7nCpf - 7 - 1
    8nCpf - 6 - 6
    9nCpf - 8 - 8
    10nCpf - 8 - 2
    11nCpf - 0 - 3

    */

    ResponderExcluir
    Respostas
    1. /*
      fazer um vetor de 20 posições que vai pra primeira -LINHA- da matriz. Ele vai armazenar o ID.
      Depois a segunda linha da matriz vai ser Idade.
      Da linha 3 a 13 vai ser o CPF, ou seja:
      coluna
      ID - 1 - 2 - 3 - 4 - 5 - linhas
      Age - 11 - 22 - 33 - 44 - 55
      1nCpf - 4 - 1
      2nCpf - 1 - 2
      3nCpf - 3 - 5
      4nCpf - 0 - 7
      5nCpf - 4 - 8
      6nCpf - 4 - 0
      7nCpf - 7 - 1
      8nCpf - 6 - 6
      9nCpf - 8 - 8
      10nCpf - 8 - 2
      11nCpf - 0 - 3

      */
      #include
      #include
      #include
      #include
      int _numClientes = 1; // Quando alterar o tamanho do vetor alterar essa linha.
      int _numLinhas = 13;
      int _vetor[5] = {54, 33, 22, 88, 34}; // 56, 76, 42, 89, 36, 77, 87, 45, 54, 32, 12, 14, 18, 19, 20};
      int _matriz[13][5];

      int inserir(){
      int i=0,j=0, n=0;
      char cpf[11];

      //passando os ids do vetor para a linha0 da matriz
      for(i=0;i<_numClientes;i++){
      _matriz[0][i] = _vetor[i];
      printf("%d - ", _matriz[0][i]);
      }
      /*Tentando fazer uma forma de o usuário digitar o CPF uma vez ao invés de linha por linha
      i=0;
      for(i=0;i<5;i++){
      printf("\nDigite o cpf do %dº cliente: ", i);
      scanf("%s", &cpf[i]);
      }
      // pegando os arrays do vetor cpf char e colocando na matriz
      for(i=0;i<5;i++){
      for(j=2;j<13;j++){//a partir da linha 3 armazena os dados
      n=0;
      _matriz[j][i] = (int)cpf[n];
      n++;
      }
      }
      //mostrando os valores armazenados na matriz
      for(i=0;i<5;i++){
      for(i=2;i<13;i++){
      printf("%d \n", _matriz[j][i]);
      }
      }
      getch();
      */

      // inserir a idade
      for(i=0;i<_numClientes;i++){
      printf("\nDigite a idade do %dº cliente: ",i);
      scanf("%d", &_matriz[i][1]);
      }
      // Aqui ele faz o programa digitar um a um o cpf
      j=2; //começa a armazenar a partir da posição 2 da matriz

      for(i=0;i<_numClientes;i++){
      for(j=2;j<_numLinhas;j++){
      printf("\nDigite o CPF do cliente%d: ", i);
      scanf("%d", &_matriz[i][j]);
      }
      }
      //mostrando os valores armazenados na matriz
      for(i=0;i<5;i++){
      for(i=2;i<13;i++){
      printf("%d \n", _matriz[j][i]);
      }
      }
      getch();


      }


      main(){
      setlocale(LC_ALL, "Portuguese");
      int opc;

      printf("O que você deseja?: \n 1-Inserir \n 2-Consultar \n 3-Sair \n\n Opção: ");
      scanf("%d", &opc);
      if(opc < 1 || opc > 3){
      printf("\nValor Inválido! \n");
      system("PAUSE");
      }
      switch(opc){
      case 1:{
      inserir();
      break;
      }

      case 2:{

      break;
      }

      case 3:{

      break;
      }
      }
      }











      Excluir