segunda-feira, 1 de outubro de 2012

5.5 EX Maior valor e posição Matriz - JeysonC++

Para verificar o maior valor (ou o menor) em uma matriz, assim como com Vetores, deve-se percorrer todos os elementos dessa matriz armazenando o maior valor encontrado (a cada momento) em uma variável que represente o maior valor (ou o menor valor). Esse valor deve ser mostrado apenas no final da verificação.

A condição de verificação é intuitiva. Se o valor da variável que representa o maior valor for menor que o valor da posição comparada, o novo valor da variável maior deve ser agora o valor da própria variável comparada. Não sabendo da dimensão da matriz, assumiremos que o maior valor a princípio será o do primeiro elemento dessa matriz. Se tivéssemos uma matriz de 1 elemento, int M[1][1], o maior valor estaria na posição M[0][0]. Ou seja, se tivermos a seguinte matriz...


    int M[3][3] = {
    {5,6,3},
    {2,4,1},
    {8,9,7}};

int MAIOR = M[0][0];
for...

...estará definido que a princípio o maior valor será o 5 no elemento M[0][0], isso antes de verificar em toda a matriz.
Então, durante a verificação iremos comparar o valor de cada elemento com o valor da variável MAIOR.
O seguinte passo, será comparar o valor da variável MAIOR com o valor do segundo elemento da matriz M (já que MAIOR tem o valor do primeiro elemento da matriz M). Então, se MAIOR for menor que M[0][1], MAIOR deve receber o valor de M[0][1], já que até então o maior valor encontrado estará nesse elemento M[0][1]. Se MAIOR NÃO for menor que M[0][1], nada deverá acontecer. Isto nos leva a...

    (...)
    int n=3, m=3; //OBS: Para uma matriz genéria, deve-se receber a quantidade de linhas (n) e colunas (m).

    int M[3][3] = {
    {5,6,3},
    {2,4,1},
    {8,9,7}};


    int MAIOR = M[0][0] ...
    for (int i = 0; i < n; i++){
           for (int j = 0; j < m; j++){
                  if(MAIOR < M[i][j]){;
                        MAIOR = M[i][j];
                        ...

Para saber a posição desse valor na matriz, deveremos armazenar em outras variáveis os valores de i e j cada vez que o valor da variável MAIOR for atualizado, ou seja, a cada vez que a expressão MAIOR < M[i][j] retornar verdadeiro. Assim como fizemos a suposição de que o maior valor, a princípio estaria na primeira posição, deveremos inicializar também essas duas variáveis com os índices do primeiro elemento da matriz M (M[0][0]).

    (...)
    int MAIOR=M[0][0], Mi=0, Mj=0;
    for (int i = 0; i < n; i++){
           for (int j = 0; j < m; j++){
                  if (MAIOR < M[i][j]) {
                        MAIOR = M[i][j];
                        Mi = i;
                        Mj = j;
                   }
           }
    }
   cout << MAIOR << " M["<<Mi<<"]["<<Mj<<"]\n\n";



5 comentários:

  1. olá , estou com um problema para mostrar a posição do maior número na matriz Bidimensional, não sei como usar esse cout , então eu tentei assim :

    (.......)

    for(i=0;i<=6;i++)
    {
    for(j=0;j<=3;j++)
    {
    if(maior<m[i][j])
    {
    maior = m[i][j];
    Mj=j;
    Mi=i;
    }
    else;
    }
    }

    printf("o maior valor da matriz e: %d", maior);
    printf("\na posicao e : [%d] [%d]", Mi,Mj);
    (...)

    eu fiz uma matriz 7x4, e aparentemente está tudo ok, o unico problema é mostrar a posição do maior valor, se houver a possibilidade de me ajudar, estou aceitando , obrigado

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Olá, Douglas

      As suas rotinas printf estão corretas, creio que o seu problema não seja esse. Observe que não há a necessidade desse else nessa parte do seu código.

      Ok... Imprimir com cout é fácil também.
      Sem muitos detalhes, o cout é um objeto existente no arquivo de cabeçalho chamado iostream. Desse modo, para usá-lo, fazemos #include no topo do código em C++. Já o printf, está definido na stdio.h.

      Quando queremos imprimir algo com o objeto cout utilizamos o operador <<.
      Ex: cout << "Hello from C++.";

      Note que imprimimos apenas uma string. Mas, caso queira imprimir várias outras coisas em uma única instrução, basta adicionar o operador << antes de cada string/variável/palavra-chave a ser impressa.
      Ex: cout << "Maior está na posição [" << Mi << "][" << Mj << ']'; //ponto e vírgula ao final.


      Voltando à questão, veja como fiz (utilizando printf e cout):

      int main(){
      int m[7][4], maior,Mj,Mi,i,j;
      //Gera uma matriz com valores quaisquer...
      for(i=0;i<=6;i++){
      for(j=0;j<=3;j++){
      m[i][j] = (i*j*j)-(i*j);
      }
      }
      maior = m[0][0]; //O primeiro valor

      for(i=0;i<=6;i++){
      for(j=0;j<=3;j++){
      cout << m[i][j];//Imprime os valores da matriz
      if(maior<m[i][j]){
      maior = m[i][j];
      Mj=j;
      Mi=i;
      cout << '*'; //Coloca * em todos os valores que passaram pela var maior...
      //...exceto
      }
      cout << '\t';//Espaço após cada valor
      }
      cout << endl;//Pula uma linha ao final da última coluna.
      }

      printf("\nO maior valor da matriz e: %d", maior);
      printf("\na posicao e : [%d] [%d]", Mi,Mj);

      return 0;
      }


      Qualquer dúvida, me envie seu código completo pelo email jeysoncruz@gmail.com

      Um grande abraço,
      Jeyson Cruz

      Excluir
    3. muito obrigado, foi de grande ajuda, eu consegui fazer aqui ...
      aliás , to aprendendo muito neste seu blog...
      muito obrigado...

      Excluir
    4. Douglas,
      Indico que você se inscreva no nosso canal youtube.com/jeysoncruzs, pois, infelizmente não estou conseguindo atualizar o blog. Lá tem vários vídeos novos.
      Obrigado...

      Excluir

Redes Sociais

Eu, Jeyson Cruz, utilizo as seguintes redes sociais para divulgar meus trabalhos e projetos acadêmicos.

YouTube (Principal) --- ECT Vídeos
youtube.com/user/jeysoncruzs
Onde publico vídeo aulas e tutoriais.

facebook.com/ectvideos
Onde interajo mais diretamente com o pessoal.

ect-videos.blogspot.com.br/
Onde organizo os Vídeos e Playlists.

Obrigado, até mais.
Jeyson Cruz