Ir ao conteúdo
  • Cadastre-se

C++ Definição do elemento MINMAX.


Alastor145
Ir à solução Resolvido por arfneto,

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

 

#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
Link para o comentário
Compartilhar em outros sites

@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 

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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.

 

 

Link para o comentário
Compartilhar em outros sites

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;
	
	
	
}

 

Link para o comentário
Compartilhar em outros sites

  • Solução

@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
Link para o comentário
Compartilhar em outros sites

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

 

Link para o comentário
Compartilhar em outros sites

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