Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Matrizes


Giza

Pergunta

Olá,

Estou tentando fazer um programa que pede que seja informado uma matriz 4x4 e seja encontrado o menor valor contido na matriz e a sua posição, sei que em matrizes bidimensionais é necessario um for para linha e outro para coluna, no entanto não consegui pegar a logica de como comparar elemento com elemento e ainda achar a sua posição.

Se alguém poder me ajudar, agradeço desde já.

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

Olá Giza,

Bem, você já sabe como percorrer por todos os dados da matriz, então está mais fácil. É isso mesmo, você vai precisar de 2 for's e para encontrar o menor, você pode criar uma variável, do mesmo tipo da matriz, para colocar o menor valor e apresentá-lo posteriormente. Quando os for's estiverem no primeiro laço, você pode colocar este primeiro valor na variável 'menor' e nos outros laços você verifica se são menores que o 'menor' e se for, atualiza as variável.

Exemplo:

long matriz[4][4], menor;
int i, j, pos_i, pos_j;
for(i=0;i<4;i++)
{
  for(j=0;j<4;j++)
  {
    if(j==0 && i==0) //primeiro laço
    {
      menor=matriz[i][j];
      pos_i=i; //atualizando as posições
      pos_j=j;
    }
    else //outros laços
    {
      if(matriz[i][j]<menor)
      {
        menor=matriz[i][j];
        pos_i=i; //atualizando as posições
        pos_j=j;
      }
    }
  }
}

Se alguém ter outra lógica, apresente para que a gente aprenda.

Abraço,

Link para o comentário
Compartilhar em outros sites

  • 0

Bruno,

não creio que exista uma logica muito diferente desta. Mas há algo que pode ser incrementado:

Ao invés de se fazer um if dentro do laco, sugiro que, antes dele, atribua-se o primeiro valor 'a variavel menor. Isso porque o laco não precisara fazer varias vezes o comando if, que sabemos que sera executado apenas uma vez. O codigo ficaria assim:

long matriz[4][4], menor;
int i, j, pos_i, pos_j;
menor = matriz [0][0];
for(i=0;i<4;i++)
{
  for(j=0;j<4;j++)
  {
      if(matriz[i][j]<menor)
      {
        menor=matriz[i][j];
        pos_i=i; //atualizando as posições
        pos_j=j;
      }
  }
}

Numa aplicacao pequena como esta, não notaremos a diferenca, mas em uma aplicacao maior, estes cuidados são interessantes. Outra observacao seria a respeito da primeira atribuicao da variavel menor: não precisa, necessariamente, ser o primeiro valor da matriz. Pode ser um valor que já se saiba de antemao que sera maior que todos os outros. Deste modo, o codigo faz uma comparacao a mais que do primeiro que apresentei. Se houverem varios lacos no codigo, perde-se algum tempo extra assim.

Espero que não tenha ficado confuso. Desculpem pela falta de acentos, mas meu teclado não ajuda muito.

Abracos!

Edit: Acabo de notar que o forum coloca alguns acentos automaticamente. Menos mal!

Editado por RSalvador
Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite,

Estou tentando fazer esse programa, achar o menor ele está achando, porem a posicao em que ele está não aparece certa.

Tambem não entendi como funciona a parte: pos_i=i; pos_j=j; Pois assim ele sempre vai mostrar a ultima posição, ou seja:[3][3], estou certa?

segue o codigo abaixo:

#include <stdio.h>
#include <stdlib.h>
#define lin 4
#define col 4
int main()
{
   int mat[lin][col], i, j, menor=mat[0][0], pos_i, pos_j;
   
   printf("Informe os elementos da matriz\n");
   for(i=0;i<lin;i++){
      for(j=0;j<col;j++){
         printf("[%d][%d]\n", i,j);
         scanf("%d", &mat[i][j]);
         if(mat[i][j]<menor)
            menor=mat[i][j];
            pos_i=i;
            pos_j=j;
      }
   }
   printf("O menor elemento: %d\n", menor);
   printf("Posicao: [%d][%d]\n", pos_i,pos_j);
   
  system("PAUSE");    
  return 0;
}

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Giza,

Está ocorrendo isso porque você esqueceu de colocar chaves:

if(mat[i][j]<menor)
            menor=mat[i][j];
            pos_i=i;
            pos_j=j;
O correto seria:
if(mat[i][j]<menor)
{
            menor=mat[i][j];
            pos_i=i;
            pos_j=j;
}

Sem chaves, após um if, o que fará parte da condição é apenas a primeira linha. Nesse caso, as variáveis pos_i e pos_j estavam sendo preenchidas em todas as repetições do for. Sendo assim, quando tem mais de uma linha de comando em um if (ou for, while, etc.), é obrigatório o uso de chaves.

Qualquer dúvida é só postar.

Abraço,

Link para o comentário
Compartilhar em outros sites

  • 0

Sem querer ser chata, mas estou fazendo um programa de vetores, ler um vetor de 10 elementos e mostra-los invertidos, fiz alguns passos e não consegui inverte-los, então pesquisei e achei uma solução, no entanto não entendi o seguinte passo: no for, porque max/2?? #define max 10

for (i=0; i < max/2; i++) {
        aux = vet[i];
        vet[i] = vet[max-i-1];
        vet[max-i-1] = aux;
   }
      for(i=0;i<max;i++){
         printf("\n\Vetor invertido %d\n", vet[i]);
      }
  system("PAUSE");    
  return 0;

Obrigada.

Desculpem,

esse tópico é de Matrizes...

deveria ter pesquisado os topicos ou aberto um tópico de vetores.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Giza

Li rapidamente o código e acho que o caso é o seguinte: A atribuição i<max/2, neste caso, é pra evitar que ele desfaça todas as operações que acabou de fazer. Note, ele vai invertendo os valores das posições até o meio do vetor. Se ele passar do meio, ele vai inverter de novo, voltando ao vetor original. Entendeu?

Pra ficar mais claro, faça um teste de mesa. Faça uma tabelinha com as variáveis e imagine que você é o compilador, lendo o código linha por linha. Você verá claramente o que acontece.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite Rsalvador,

Fiz o teste de mesa, entendi como o vetor é invertido, mas não compreendi a condição max/2, pois no teste de mesa o 'i' vai de 4 a 0 invertendo as posições.

Mesmo assim agradeço, tenho aula amanhã, vou ver se o professor faz isso entrar na minha cabeça.

Obrigada.

Link para o comentário
Compartilhar em outros sites

  • 0

É, já fiz isso e realmente o vetor é impresso igual como digitado, sei que max/2 é o correto, pois dá certinho.

Vou ver se consigo entender, porque se não na hora da prova já viu né? Copiar não adianta, o bom é quebrar a cabeça um pouquinho.

Obrigada, ultimamente esse forum vem me ajudando muito.

Boa noite

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Giza,

Para entender, é só pensar que é metade, max/2, porque a cada repetição você já está trocando 2 números. Caso não seje a metade, seja o tamanho real, você irá destrocar novamente, fazendo com que fique do mesmo jeito inicial.

Bem, espero estar ajudando ao invés de atrapalhar.

Abraço,

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Bruno,

Agora consegui entender, claro, pois assim toda hora que ele compara ele arruma a posição compararda, e por conseguinte a posição compararda a ele. Se não tivesse o "/2" ele voltaria tudo ao normal.

Muito obrigada a todos vocês que me ajudaram na resolução desse problema!

Abrs,

Link para o comentário
Compartilhar em outros sites

  • 0

Ola gente poderia me ajudar o porque o numero do indice não esta pegando corretamente?

 


// Bibliotecas
#include<stdlib.h>
#include<stdio.h>
#include <locale.h>
#define linha 3
#define coluna 3


/*na teoria de sistemas, defini-se minimax o menor elemento da linha em que se 
encontra o maior elemento da matriz, faça um progrma que leia uma matriz (10x10) 
e diga qual o minimax e a posição onde ele se encontra*/

// Início

main ()
{
    setlocale(LC_ALL,"Portuguese");
    int i, j, matriz[linha][coluna], menor=0, ind_i=0, ind_j=0;
    
    printf("DIGITE OS VALORES DAS LINHAS E COLUNAS:\n");


    for(i=0; i<linha; i++){
        for(j=0; j<coluna; j++){
            scanf("%d", &matriz[j]);                                
        }
    }   
    
    printf("\tOS DADOS DA MATRIZ são:\n");
    
    for(i=0; i<linha; i++){       
        for(j=0; j<coluna; j++){            
            printf("\t(%d)", matriz[j]);                                
        }
        printf("\n");
    }
        
        menor = matriz[0][0];    
    
    for(i=0; i<linha; i++){
        for(j=0; j<coluna; j++){
            
                if(matriz[j]<menor){
                    menor=matriz[j];
                    ind_i=i;
                    ind_j=j;                    
                }
         }
    }
    
       //imprimir o menor valor
        for(i=0; i<1; i++){
            printf("\n\n");
                if(menor){                    
                    printf("\t menor valor da matriz é:[%d]\n\n", menor);
                    printf("\t posicao:%d\n", ind_i);                
         }
    }    
    system("pause");
    return 0;

} //fim main

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...