Ir ao conteúdo

C++ Definição do elemento MINMAX.


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Bom dia, gostaria de pedir ajuda sobre uma questão que pede para que eu ache o minimáx de uma matriz randômica...Já consegui gerar a matriz, porém estou com dificuldade para implementar a verificação de minimáx... ficaria muito grato se alguém ajudasse!... o código que já consegui é esse, falta calcular o minimáx e printar junto com a matriz... não tô conseguindo de jeito nenhum. se puder alterar o código da forma certa agradeço demais. abraços

 

#include <iostream>
#include<cstdlib>
#include <time.h>

using namespace std;

int main ()
{
    
    int i, j,k,l, menor, pos_i, pos_j, matriz[4][7];
    
    
srand (time(NULL));

for(int i=0; i<4; i++){


for(int j=0; j<7; j++){
    
    matriz[i] [j] = rand()%100;
    
    
    
}
    
}
    
for(int i=0; i<4; i++){

for(int j=0; j<7; j++){
     
    cout << matriz[i][j] << " ";
}    
    cout << endl;        
}
    
return 0;


    
    
    

WhatsApp Image 2021-03-04 at 21.17.00.jpg

Minmáx.rar

Postado

 

#include <time.h>
using namespace std;

int main ()
{  
    int i, j,k,l, menor, pos_i, pos_j, matriz[4][7];    
    srand (time(NULL));
  
  // ...

 

  • Está incluindo time.h apenas para chamar time com NULL na chamada de srand(). É mais prejuízo do que lucro. Para testar seu programa é melhor usar um valor conhecido e constante porque assim a matriz será sempre a mesma. Para testar seu programa é muito melhor um valor conhecido.
    Use srand() com uma constante, como srand(210305) e assim a matriz será sempre a mesma e você poderá perseguir o resultado certo sem ele ficar mudando a cada teste, o que é um 1nf3rn0 afinal.

 

  • Escreva uma função para mostrar a matriz.

 

  • Não declare mais de uma variável por linha. É grátis.

 

53 minutos atrás, Alastor145 disse:

porém estou com dificuldade para implementar a verificação de minimáx

 

Mas não há qualquer tentativa de fazer isso no seu código.

 

image.png.35276a286cdb894525b43019baa9c921.png

 

  • Não use acentos em nomes de arquivo. Isso só dá problema.

 

 

 

De volta ao programa

 

Como vê no enunciado precisa do maior valor da linha que tem o menor valor.

  • Que tal ao menos tentar encontrar o menor valor da matriz?
    • E que tal fazer isso enquanto gera os valores, já que vai atribuir um or um à matriz como já está em seu código?
    • E depois que der certo que tal salvar também o maior valor de cada linha, já que está atribuindo linha a linha?

 

E aí já terá terminado o programa com o mesmo loop que usou:
 

for(int i=0; i<4; i++)
{
    for(int j=0; j<7; j++)
    {
        matriz[i] [j] = rand()%100;
    }
}

 

  • Alinhe melhor as chaves. 
     
  • Note que não precisa de chaves no código acima...
     
    for(int i=0; i<4; i++)
        for(int j=0; j<7; j++)
            matriz[i] [j] = rand()%100;


    ou mesmo
     

    for(int i=0; i<4; i++) for(int j=0; j<7; j++) matriz[i] [j] = rand()%100;

           já serviria

  • O enunciado é vago sobre os intervalos. Entre 0 e 100 pode sugerir que os extremos fazem parte ou não. Está usando entre 0 e 99 apenas.
     
  • C e C++ não tem de fato matrizes como em FORTRAN. Então os 4x7 valores estarão lá um depois do outro a partir do início. Pode usar isso também para facilitar a carga da matriz.

 

 

 

 

  • Curtir 1
Postado

@arfneto Eu havia tentado implementar num código anterior, mas sem sucesso... tô mais acostumado com matlab 😕

 

Fiz essa disciplina há uns 3 anos, essa atividade é de um colega, tô tentando implementar pra explicar, mas tá *****...

Eu havia pensado numa estrutura do tipo if-else-if dentro do laço...mas não tô conseguindo nem inicializar a variável menor....muito burro aqui kkkkkk 

Postado
for(int i=0; i<4; i++)
    for(int j=0; j<7; j++)
        matriz[i] [j] = rand()%100;

 

O segundo for vai carregar os valores em toda a linha i. É lá que você acha o menor valor da linha. Como está dentro do loop para a linha vai passar por todas elas então apenas salve o valor menor de cada linha e vá comparando. Ao final vai ter o par (i,j) onde tem o menor valor da matriz toda. Aí volta lá e acha o maior valor na tal linha. 

 

Ou salva os dois logo pra não ter que voltar: para cada linha salva o menor e o maior valor. Ao encontrar o valo mínimo na matriz terá o maior valor também.

 

Claro que o simples é varrer a matriz depois e achar o minimo, varrer a linha onde ele está e pegar o maximo. Mas é o trivial e menos eficiente.

  • Curtir 1
Postado
12 minutos atrás, arfneto disse:


for(int i=0; i<4; i++)
    for(int j=0; j<7; j++)
        matriz[i] [j] = rand()%100;

 

O segundo for vai carregar os valores em toda a linha i. É lá que você acha o menor valor da linha. Como está dentro do loop para a linha vai passar por todas elas então apenas salve o valor menor de cada linha e vá comparando. Ao final vai ter o par (i,j) onde tem o menor valor da matriz toda. Aí volta lá e acha o maior valor na tal linha. 

 

Ou salva os dois logo pra não ter que voltar: para cada linha salva o menor e o maior valor. Ao encontrar o valo mínimo na matriz terá o maior valor também.

 

Claro que o simples é varrer a matriz depois e achar o minimo, varrer a linha onde ele está e pegar o maximo. Mas é o trivial e menos eficiente.

eu havia pensado nisso

if(matriz[i][j]<menor) 
menor=matriz[i][j]; 
pos_i=i;
pos_j=j;

dentro do segundo For, mas não sei kkkkkkkkkk

Postado

@arfneto acho que também convém definir o menor como um numero propositalmente alto né? antes de entrar no laço....digo, alto >100.

se não o loop inicial não terá comparativo.

 

Postado

@Alastor145 A mais usual das maneiras é esta em que o problema é subdividido em dois; primeiro defina o método que localiza as coordenas [i, j] do menor elemento numérico na matriz, depois as coordenadas do maior elemento na submatriz [vetor] (i, j) tal que j vai de 0 até o limite das coordenas com 'i' constante: nessa segunda, determina-se O MAX de "MIMAX" onde somente coluna varia,  pois 'i' é constante. Faça tentativa sincera de solução e se duvidar que está correto compartilha para mais opiniões.  

Postado
1 hora atrás, mauro_b disse:

A mais usual das maneiras é esta em que o problema é subdividido em dois; primeiro defina o método que localiza as coordenas [i, j] do menor elemento numérico na matriz, depois as coordenadas do maior elemento na submatriz [vetor] (i, j) tal que i vai de 0 até o limite das coordenas com j constante: nessa segunda, determina-se O MAX de "MIMAX" onde somente alinha varia,  pois 'j' é constante. Faça tentativa sincera de solução e se duvidar que está correto compartilha para mais opiniões

 

image.png.75b77a1121c7997b6b38d5f900673cf8.pngNão, @mauro_b depois de determinado  o par (i,j) onde está o menor valor da matriz, a submatriz será a linha i toda, onde se identifica a coluna j onde está o minmax. i é constante e não j.

 

 

Postado

Obrigado por todas as ajudas e dicas amigos :), eu acabei desistindo um pouco, queria ajudar o colega, mas estou com uma prova de química orgânica pendente...eu entendi todos os conceitos que vocês sugeriram, porém meu problema está sendo com a linguagem, perdi toda a habilidade que eu tinha para transcrever a lógica, fazia muito tempo que eu não mexia com C++... agora vou só chorar em posição fetal kkkkkkkk... mas fiz a tentativa de várias forma, gerava erro. arrumei o máximo que consegui conforme o amigo @arfneto sugeriu, ficou bem mais organizado. Obrigado de coração por toda a atenção.

#include <iostream>
#include<cstdlib>


using namespace std;

int main ()
{
	
int i, j, matriz[4][7];
	
	
srand (210305);

for(int i=0; i<4; i++)
for(int j=0; j<7; j++)
matriz[i] [j] = rand()%100;
	
	

	
for(int i=0; i<4; i++)               {

for(int j=0; j<7; j++){
	 
	cout << matriz[i][j] << " ";
                       }	
	cout << endl;		
                                      }
	
return 0;
	
	
	
}

 

  • Solução
Postado

@Alastor145 em C++ isso provavelmente acabaria escrito de outro modo, porque é mais fácil usar uma classe e criar um método que devolve o tal MINMAX direto, para qualquer tamanho da matriz.

E a matriz seria criada no construtor provavelmente a partir dos parâmetros óbvios. linha e coluna. E destruída na saída.

 

Eis um exemplo do que quer fazer, mais do lado C do que do lado C++, e usando o modo mais eficiente, avaliando o minmax enquanto preenche a matriz

 

#include <iomanip>
#include <iostream>
using namespace std;

int         mostra(int[][7], int,int);

int main (void)
{
    int     matriz[4][7];
    int     maximo = INT_MIN;
    int     minimo = INT_MAX;
    
    srand (210306);
    for(int i=0; i<4; i++)
    {
        int maximo_l = INT_MIN; // maior na linha
        int minimo_l =  INT_MAX; // menor na linha
        for(int j=0; j<7; j++)
        {
            matriz[i][j] = rand()%101;
            if ( matriz[i][j] < minimo_l )
                minimo_l = matriz[i][j];
            else
                if ( matriz[i][j] > maximo_l ) maximo_l = matriz[i][j];
        };  // for()
        if ( minimo_l < minimo ) minimo = minimo_l,  maximo = maximo_l;
    }   // for(); 
    mostra( matriz,4,7 );

    cout << "MinMax = " << maximo << endl;
    return 0;  
};

int         mostra(int matriz[][7], int L, int C)
{    
    for(int i=0; i<L; i++)
    {
        for(int j=0; j<C; j++)
        {
            cout << setw(5) << matriz[i][j];
        }    
        cout << endl;        
    }
    return 0;
}

 

Que deve mostrar

 


PS C:\src\CPP> g++ -o tst -Wall -std=c++17 mm.cpp
PS C:\src\CPP> ./tst
   38   61   38   99   43   40  100
   19   98   77    1   52   93   72
   19    2   73   82   94   35   43
   39   84  100   40   97   98   61
MinMax = 98
PS C:\src\CPP> 

 

 

  • Obrigado 1
Postado

Tem um erro no código no post #12.  @Alastor145 Considere

 

#include <iomanip>
#include <iostream>
using namespace std;

int         mostra(int[][7], int,int);

int main (void)
{
    int     matriz[4][7];
    int     maximo = INT_MIN;
    int     minimo = INT_MAX;
    
    srand (210306);
    for(int i=0; i<4; i++)
    {
        int maximo_l = INT_MIN; // maior na linha
        int minimo_l =  INT_MAX; // menor na linha
        for(int j=0; j<7; j++)
        {
            matriz[i][j] = rand()%101;
            if ( matriz[i][j] < minimo_l ) minimo_l = matriz[i][j];
            if ( matriz[i][j] > maximo_l ) maximo_l = matriz[i][j];
        };  // for()
        if ( minimo_l < minimo ) minimo = minimo_l,  maximo = maximo_l;
    }   // for(); 
    mostra( matriz,4,7 );

    cout << "\n\tMinMax = " << maximo << "\n\n";
    return 0;  
};

int         mostra(int matriz[][7], int L, int C)
{    
    for(int i=0; i<L; i++)
    {
        for(int j=0; j<C; j++)
        {
            cout << setw(5) << matriz[i][j];
        }    
        cout << endl;        
    }
    return 0;
}

 

Esse if() estava errado:
 

    if ( matriz[i][j] < minimo_l )
        minimo_l = matriz[i][j];
    else
        if ( matriz[i][j] > maximo_l ) maximo_l = matriz[i][j];

 

Uma solução mais comum em C++ que funciona para qualquer tamanho de matriz, ok para C++ até 1998

 

Spoiler

#include <iomanip>
#include <iostream>
#include <memory>
using namespace std;

class matriz
{
private:
    int*    M;
    int     linhas;
    int     colunas;
    int     min_max;

public:
    int     minmax();
    void    mostra();

public:
    matriz();
    matriz(int, int);
    ~matriz();
};


int main(void)
{
    srand(210306);

    matriz B;
    B.mostra();
    cout << "\n\tminmax = " << B.minmax() << "\n\n";

    matriz A(3, 3);
    A.mostra();
    cout << "\n\tminmax = " << A.minmax() << "\n\n";

    matriz CA(6, 3);
    CA.mostra();
    cout << "\n\tminmax = " << CA.minmax() << "\n\n";

    matriz CD(2, 2);
    CD.mostra();
    cout << "\n\tminmax = " << CD.minmax() << "\n\n";
}

matriz::matriz() : matriz(4, 7) {};

matriz::matriz(int l, int c) :
    linhas(l), colunas(c)
{
    M = (int*) ::operator new(sizeof(int) * linhas * colunas);
    int     maximo = INT_MIN;
    int     minimo = INT_MAX;
    for (int i = 0; i < linhas; i++)
    {
        int maximo_l = INT_MIN; // maior na linha
        int minimo_l = INT_MAX; // menor na linha
        for (int j = 0; j < colunas; j++)
        {
            int* p = M + (i * colunas) + j;
            *p = rand() % 101;
            if (*p < minimo_l) minimo_l = *p;
            if (*p > maximo_l) maximo_l = *p;
        };  // for()
        if (minimo_l < minimo) minimo = minimo_l, maximo = maximo_l;
    }   // for(); 
    min_max = maximo;
};

matriz::~matriz() { delete[] M; };

int matriz::minmax()
{
    return min_max; // nada mais
};

void matriz::mostra()
{
    for (int i = 0; i < linhas; i++)
    {
        for (int j = 0; j < colunas; j++)
        {
            cout << setw(5) << *(M + i * colunas + j);
        }
        cout << endl;
    }
    return;
}

 

 

Ou usando algo um pouco mais moderno

 

mas não muito ;) 

#include <iomanip>
#include <iostream>
#include <memory>
using namespace std;

class matriz
{
private:
    unique_ptr<int> M;
    int     linhas;
    int     colunas;
    int     min_max;

public:
    int     minmax();
    void    mostra();

public:
    matriz();
    matriz(int, int);
};

int main(void)
{
    srand(210306);

    matriz B;
    B.mostra();
    cout << "\n\tminmax = " << B.minmax() << "\n\n";

    matriz A(3, 3);
    A.mostra();
    cout << "\n\tminmax = " << A.minmax() << "\n\n";

    matriz CA(6, 3);
    CA.mostra();
    cout << "\n\tminmax = " << CA.minmax() << "\n\n";

    matriz CD(2, 2);
    CD.mostra();
    cout << "\n\tminmax = " << CD.minmax() << "\n\n";
}


matriz::matriz() : matriz(4, 7) {};


matriz::matriz(int l, int c) :
    linhas(l), colunas(c)
{
    M = unique_ptr<int>(new int[(int)(linhas * colunas)]);
    int     maximo = INT_MIN;
    int     minimo = INT_MAX;
    for (int i = 0; i < linhas; i++)
    {
        int maximo_l = INT_MIN; // maior na linha
        int minimo_l = INT_MAX; // menor na linha
        for (int j = 0; j < colunas; j++)
        {
            int* p = M.get() + (i * colunas) + j;
            *p = rand() % 101;
            if (*p < minimo_l) minimo_l = *p;
            if (*p > maximo_l) maximo_l = *p;
        };  // for()
        if (minimo_l < minimo) minimo = minimo_l, maximo = maximo_l;
    }   // for(); 
    min_max = maximo;
};


int matriz::minmax()
{
    return min_max; // nada mais
};


void matriz::mostra()
{
    for (int i = 0; i < linhas; i++)
    {
        for (int j = 0; j < colunas; j++)
        {
            cout << setw(5) << *(M.get() + i * colunas + j);
        }
        cout << endl;
    }
    return;
}

 

Em main() se vê a diferença para a versão anterior:
 


int main(void)
{
    srand(210306);

    matriz B;
    B.mostra();
    cout << "\n\tminmax = " << B.minmax() << "\n\n";

    matriz A(3, 3);
    A.mostra();
    cout << "\n\tminmax = " << A.minmax() << "\n\n";

    matriz CA(6, 3);
    CA.mostra();
    cout << "\n\tminmax = " << CA.minmax() << "\n\n";

    matriz CD(2, 2);
    CD.mostra();
    cout << "\n\tminmax = " << CD.minmax() << "\n\n";
}

 

  • Ao declarar uma matriz sem parâmetros, como B no exemplo, é assumido o tamanho do enunciado, 4x7
     
  • minmax é calculado sempre ao preencher a matriz, porque é o simples. Não faz sentido varrer a matriz de novo só para isso
     
  • ao declarar
     
        Matriz matriz(x,y) 

    a matriz é criada com o tamanho certo, sempre
     
  • minmax() apenas lê o valor de minmax que já foi calculado

O resultado é o mesmo, claro

 

   38   61   38   99   43   40  100
   19   98   77    1   52   93   72
   19    2   73   82   94   35   43
   39   84  100   40   97   98   61

        minmax = 98

  100   45   60
   10   25   37
   60    8   24

        minmax = 60

   66   91   73
   53   40   75
  100   96   38
    6   12   68
   86    7   46
   54   72   70

        minmax = 68

   68   72
   32   97

        minmax = 97

 

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!