Ir ao conteúdo

Posts recomendados

Postado

Na teoria dos sistemas, define-se como elemento minimax de uma matriz o menor elemento de uma linha onde se encontra o maior elemento da matriz. Faça uma função que recebe, por parâmetro, uma matriz A(10,10) e retorna o seu elemento minimax, juntamente com a sua posição.

 

Boa noite estou aprendendo programação pelo visualg e "entalei nessa questão" , eu consigo popular a matriz , achar o maior valor e ainda exibir a posição da linha e da coluna do maior valor , agora pra achar o minimax eu achei que dentro do "se - fimse" eu criaria um "para" com um contador e do contador2 que vai do valor da linha x linha e coluna x coluna (pra meio que travar onde o maior valor ficou ) , mais não está dando certo , tentei colocar como parâmetro o valor xmatriz [1,1] (primeiro valor da matriz) , na variável para conseguir o menor valor na linha da matriz , mais tb não deu certo . Gostaria de uma ajuda pra tentar resolver isso .

 

 

OBS : Fazendo esse exercício eu me deparei com outra dúvida se na matriz o maior valor aparecer mais de uma vez ? Como eu poderia mostrar o valor e a posição das duas ou mais MINIMAX ?

Algoritmo "semnome"
//Na teoria dos sistemas, define-se como elemento minimax de uma matriz
//o menor elemento de uma linha onde se encontra o maior elemento da matriz.
//Faça uma função que recebe, por parâmetro, uma matriz A(10,10) e
//retorna o seu elemento minimax, juntamente com a sua posição.

funcao minimax (): inteiro

var
maior_valor : inteiro
valor_minimax : inteiro
contador : inteiro
contador2 : inteiro
 inicio
maior_valor <- xmatriz [1,1]

para linha de 1 ate 10 faca
    para coluna de 1 ate 10 faca
            se xmatriz [linha,coluna] > maior_valor entao // maior valor da matriz esta ok
            maior_valor <-   xmatriz [linha,coluna]
       para contador de linha ate linha faca
            para contador2 de coluna ate coluna faca
             se valor_minimax <  xmatriz [linha,coluna] entao // Aqui e onde eu "empaquei"
             xmatriz [linha,coluna] <-  valor_minimax
             fimse

          fimpara
        fimpara

            escreval ("Valor minimax" ,valor_minimax," posicao",linha ,",",coluna) // Aqui eu coloquei pra exibir as posições de linha e coluna pra eu conseguir entender
       retorne  maior_valor
       fimse
     fimpara
fimpara


fimfuncao

Var
linha,coluna : inteiro
xmatriz : vetor [1..10,1..10] de inteiro

Inicio
escreva ("popule a matriz")
para linha de 1 ate 10 faca
     para coluna de 1 ate 10 faca
     leia (xmatriz[linha,coluna])
     fimpara
fimpara
limpatela

para linha de 1 ate 10 faca
     para coluna de 1 ate 10 faca
     escreva (xmatriz[linha,coluna]:5)
     fimpara
      escreval
fimpara
escreval ()
escreval ()
escreval (minimax ())
Fimalgoritmo

 

  • Membro VIP
Postado

@Rafael_RJ, são duas etapas distintas... Primeiro acha o maior valor da matriz (ignore por enquanto a questão da possibilidade de ter maiores iguais. Pegue o primeiro maior). Depois de ter o maior valor, você vai pegar o menor valor na linha onde está esse maior. Ou seja: quando estiver pegando o maior, também pegue a sua linha. Daí, para pegar o menor, use essa linha como referência. Lembrando: são etapas distintas... Não faz sentido tentar fazer as duas coisas ao mesmo tempo, já que para saber o maior, precisar varrer toda a matriz antes...(Se não tem o maior ainda, como vai querer achar o menor?)

Postado
Em 02/05/2022 às 10:51, Simon Viegas disse:

@Rafael_RJ, são duas etapas distintas... Primeiro acha o maior valor da matriz (ignore por enquanto a questão da possibilidade de ter maiores iguais. Pegue o primeiro maior). Depois de ter o maior valor, você vai pegar o menor valor na linha onde está esse maior. Ou seja: quando estiver pegando o maior, também pegue a sua linha. Daí, para pegar o menor, use essa linha como referência. Lembrando: são etapas distintas... Não faz sentido tentar fazer as duas coisas ao mesmo tempo, já que para saber o maior, precisar varrer toda a matriz antes...(Se não tem o maior ainda, como vai querer achar o menor?)

Muito obrigado entendi o que você me disse , então depois achar o maior valor , eu guardo o valor da linha em uma variável e coloco a coluna em um uma repetição <para> , para analisar todos os valores da linha , mesmo assim ainda não está retornando o valor correto , na variável onde ficará o menor valor eu coloquei o maior valor da tabela como referência (coloquei para preencher automático de 0 a 100) , o visualg até retorna um valor menor mais não é o valor da linha que estou mandando ele analisar . Alterei somente na função

 

Algoritmo "semnome"
//Na teoria dos sistemas, define-se como elemento minimax de uma matriz
//o menor elemento de uma linha onde se encontra o maior elemento da matriz.
//Faça uma função que recebe, por parâmetro, uma matriz A(10,10) e
//retorna o seu elemento minimax, juntamente com a sua posição.

funcao minimax (): inteiro

var
   maior_valor : inteiro
   valor_minimax : inteiro
   contador : inteiro
   contador2 : inteiro
   auxiliar : inteiro
inicio
   maior_valor <- xmatriz [1,1]
   valor_minimax <- 100
   para linha de 1 ate 10 faca
      para coluna de 1 ate 10 faca
         se xmatriz [linha,coluna] > maior_valor entao // maior valor da matriz esta ok
            maior_valor <-   xmatriz [linha,coluna]

         fimse

      fimpara
   fimpara


   para linha de 1 ate 10 faca
      para coluna de 1 ate 10 faca
         se  xmatriz [linha,coluna] = maior_valor entao // aqui coloquei uma pesquisa para achar o maior valor , pois no para acima a variavel linha vai //mudando de valor
            contador<-linha    // valor da linha armazenado
         fimse

      fimpara
   fimpara

   para coluna de 1 ate 10 faca                                                  // valor contador fixo e faço um <para> para analisar todas as colunas
      se    valor_minimax <  xmatriz [contador,coluna]      entao
         valor_minimax <-   xmatriz [contador,coluna]

      fimse
   fimpara

   escreval (contador)
   escreval ()
   retorne  maior_valor

fimfuncao

Var
   linha,coluna : inteiro
   xmatriz : vetor [1..10,1..10] de inteiro

Inicio
   escreva ("popule a matriz")
   para linha de 1 ate 10 faca
      para coluna de 1 ate 10 faca
         leia (xmatriz[linha,coluna])
      fimpara
   fimpara
   limpatela

   para linha de 1 ate 10 faca
      para coluna de 1 ate 10 faca
         escreva (xmatriz[linha,coluna]:5)
      fimpara
      escreval
   fimpara
   escreval ()
   escreval ()
   escreval (minimax ())
Fimalgoritmo

 

 

  • Membro VIP
Postado

@Rafael_RJ, alguns pontos:

Sobre a semântica no código
image.png


A função chama-se "minimax()", mas eventualmente está retornando "maior_valor"? Percebe que tem alguma coisa está errada? Aí você precisa devolver valor_minimax.

 

 


Sobre a verificação do menor na linha:

   para coluna de 1 ate 10 faca // valor contador fixo e faço um <para> para analisar todas as colunas
      se (valor_minimax < xmatriz[contador,coluna]) entao
         valor_minimax <- xmatriz[contador,coluna]
      fimse
   fimpara


O sinal está trocado... ali no se, em vez de "<", seria ">".




Sobre a linha encontrada... a nomenclatura "contador" está meio estranha... sugeriria algo como linhaMaior ou algo o tipo...

Adendo: a variável onde será definida o valor da linha poderia ser atualizada junto com o valor do maior.. algo como:
 

         se (xmatriz[linha,coluna] > maior_valor) entao
            maior_valor <- xmatriz[linha,coluna]
            linha_maior <- linha
         fimse

 

  • Membro VIP
Postado

Exemplo de possível solução:
 

algoritmo "Valor e posição minimax de uma matriz"
//Na teoria dos sistemas, define-se como elemento minimax de uma matriz
//o menor elemento de uma linha onde se encontra o maior elemento da matriz.
//Faça uma função que recebe, por parâmetro, uma matriz A(10,10) e
//retorna o seu elemento minimax, juntamente com a sua posição.

funcao Minimax (var posI, posJ: inteiro): inteiro
var
   maiorValorMatriz: inteiro
   valorMinimax: inteiro
   i, j: inteiro
inicio
   maiorValorMatriz <- matriz[1,1]

   para i de 1 ate 10 faca
      para j de 1 ate 10 faca
         se (matriz[i,j] > maiorValorMatriz) entao
            maiorValorMatriz <- matriz[i,j]
            posI <- i
         fimSe
      fimPara
   fimPara

   valorMinimax <- 999
   para j de 1 ate 10 faca
      se (matriz[posI,j] < valorMinimax)  entao
         valorMinimax <- matriz[posI,j]
         posJ <- j
      fimSe
   fimPara

   retorne valorMinimax
fimFuncao

procedimento preencherMatriz()
var
   i, j: inteiro
inicio
   para i de 1 ate 10 faca
      para j de 1 ate 10 faca
         //leia(matriz[i,j])
         matriz[i,j] <- RandI(100) //gera valores de 0 a 99
         //escreva (matriz[i,j]:3) exibir valor na tela
      fimPara
   fimPara
   escrevaL()
fimProcedimento

procedimento ExibirMatriz()
var
   i, j: inteiro
inicio
   para i de 1 ate 10 faca
      para j de 1 ate 10 faca
         escreva (matriz[i,j]:5)
      fimPara
      escrevaL()
   fimPara
fimProcedimento

var
   matriz: vetor [1..10,1..10] de inteiro
   valorMinimax: inteiro
   posX, posY: inteiro
inicio
   escrevaL("Preenchendo a matriz...")
   preencherMatriz()
   valorMinimax <- Minimax(posX, posY)
   escrevaL()
   escrevaL("MATRIZ INFORMADA")
   ExibirMatriz()
   escrevaL()
   escrevaL("Minimax: ", valorMinimax:1, ". Posição: (", posX:1, ",", posY:1, ")")
fimAlgoritmo


image.png

Adendo 1: não necessariamente essa resposta está correta;

Adendo 2: de um modo geral, não copie o código ou trecho dele, redigite e ajuste de acordo com seu próprio entendimento. 

 

Segue um outro código separando a parte de localizar o maior número da matriz:

 

algoritmo "Valor e posição minimax de uma matriz"
//Na teoria dos sistemas, define-se como elemento minimax de uma matriz
//o menor elemento de uma linha onde se encontra o maior elemento da matriz.
//Faça uma função que recebe, por parâmetro, uma matriz A(10,10) e
//retorna o seu elemento minimax, juntamente com a sua posição.

funcao MaiorValor (var posI, posX: inteiro): inteiro
var
   i, j: inteiro
   maiorValorMatriz: inteiro
inicio
   maiorValorMatriz <- matriz[1,1]
   
   para i de 1 ate 10 faca
      para j de 1 ate 10 faca
         se (matriz[i,j] > maiorValorMatriz) entao
            maiorValorMatriz <- matriz[i,j]
            posI <- i
            posX <- j
         fimSe
      fimPara
   fimPara

   retorne maiorValorMatriz
fimFuncao

funcao Minimax (var posI, posJ: inteiro): inteiro
var
   maiorValorMatriz: inteiro
   valorMinimax: inteiro
   posMaiori, posMaiorJ, i, j: inteiro
inicio
   maiorValorMatriz <- maiorValor(posMaiorI, posMaiorJ)

   posI <- posMaiorI

   valorMinimax <- 999
   para j de 1 ate 10 faca
      se (matriz[posI,j] < valorMinimax)  entao
         valorMinimax <- matriz[posI,j]
         posJ <- j
      fimSe
   fimPara

   retorne valorMinimax
fimFuncao

procedimento preencherMatriz()
var
   i, j: inteiro
inicio
   para i de 1 ate 10 faca
      para j de 1 ate 10 faca
         //leia(matriz[i,j])
         matriz[i,j] <- RandI(100) //gera valores de 0 a 99
         //escreva (matriz[i,j]:3) exibir valor na tela
      fimPara
   fimPara
   escrevaL()
fimProcedimento

procedimento ExibirMatriz()
var
   i, j: inteiro
inicio
   para i de 1 ate 10 faca
      para j de 1 ate 10 faca
         escreva (matriz[i,j]:5)
      fimPara
      escrevaL()
   fimPara
fimProcedimento

var
   matriz: vetor [1..10,1..10] de inteiro
   valorMinimax: inteiro
   posX, posY: inteiro
inicio
   escrevaL("Preenchendo a matriz...")
   preencherMatriz()
   valorMinimax <- Minimax(posX, posY)
   escrevaL()
   escrevaL("MATRIZ INFORMADA")
   ExibirMatriz()
   escrevaL()
   escrevaL("Minimax: ", valorMinimax:1, ". Posição: (", posX:1, ",", posY:1, ")")
fimAlgoritmo


O resultado é exatamente o mesmo... apenas criei uma função apenas para localizar o maior..

Adendo 3: pode parecer confuso um pouco a questão das variáveis locais... se observar tem "várias variáveis com o mesmo nome" (e tem coisas que pode melhorar, rs)... mas veja (se é que não sabe ainda): as variáveis locais só existem dentro da própria função onde ela foi criada... o resto do programa não enxerga. Daí, por exemplo, teria teria a posI (seria posição ou coordenada i) de um contexto não tem nada a ver com uma outra posI de outro contexto. O uso de parâmetros na função servem justamente para fazer uma função (ou procedimento) se comunicar com o outro (ou com o programa principal)... o uso do var no parâmetro das funções servem para definir como "passagem por referência", ou seja, a variável local seria um link para a própria variável que foi utilizada na chamada da função (que em outras palavras seria dizer que "o que foi alterado na variável dentro da função, vai ser refletida na variável que foi utilizada ao chamar a função"). Por aí vai...

Postado
Em 04/05/2022 às 14:04, Simon Viegas disse:

@Rafael_RJ, alguns pontos:

Sobre a semântica no código
image.png


A função chama-se "minimax()", mas eventualmente está retornando "maior_valor"? Percebe que tem alguma coisa está errada? Aí você precisa devolver valor_minimax.

 

 


Sobre a verificação do menor na linha:

   para coluna de 1 ate 10 faca // valor contador fixo e faço um <para> para analisar todas as colunas
      se (valor_minimax < xmatriz[contador,coluna]) entao
         valor_minimax <- xmatriz[contador,coluna]
      fimse
   fimpara


O sinal está trocado... ali no se, em vez de "<", seria ">".




Sobre a linha encontrada... a nomenclatura "contador" está meio estranha... sugeriria algo como linhaMaior ou algo o tipo...

Adendo: a variável onde será definida o valor da linha poderia ser atualizada junto com o valor do maior.. algo como:
 

         se (xmatriz[linha,coluna] > maior_valor) entao
            maior_valor <- xmatriz[linha,coluna]
            linha_maior <- linha
         fimse

 

 

Obrigado pela dica , então na função como eu estava "testando" coloquei ela para retornar o maior valor só para eu ficar procurando o menor da linha pra ver se estava correto , também tenho a péssima mania de criar variável pra testar digitando qualquer nome , vou me atentar a isso . (Infelizmente) ainda não faço faculdade , n vou copiar o código , só vou mudar os "i" e os "j" , e colocar linha e coluna , para mim e mais fácil entender assim , obrigado tb por explicar o porque você colocou passagem por referência . Eu não tenho costume de fazer assim porque a maioria das questões que peguei , pediu passagem por parâmetro mais vou começar a fazer por referência para "começar a pensar em fazer desse jeito" se para a solução do problema for necessário . Novamente muito obrigado pelos toques e pela ajuda .

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!