Ir ao conteúdo
  • Cadastre-se

C++ Criar uma terceira Matriz composta pelos maiores elementos de outras duas


Posts recomendados

6. Leia duas matrizes 4 x 4 e escreva uma terceira com os maiores elementos entre
as primeiras. 

Sei que a ideia é ordená-las em ordem crescente e pegar os quatro últimos elementos de cada uma, a partir daí tenho que criar a nova matriz.

A minha dúvida é: como pegar os maiores elementos num vetor bidimensional ?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Dica: Ordene em ordem decrescente e poderá pegar os primeiros elementos ao invés dos últimos.

 

 

Uma matriz 4x4 tem 16 posições (4 vezes 4), uma maneira de acessar todas as posições da matriz usando 1 único ciclo é assim:

for(i = 0; i < 16; i++){
    matriz[i/4][i%4];
}

Onde pegamos a divisão e o resto da divisão por 4, para obter a coordenada da linha e da coluna respectivamente. O motivo que usamos o número 4 é por que este é o número de colunas da matriz.

 

De forma geral uma matriz de dimensão LxC pode ser percorrida fazendo:

for (i = 0; i < L*C; i++){
    matriz[i/C][i%C];
}

 

Usando isto você pode tratar a matriz do mesmo modo que trataria um vetor, e usar um algoritmo de ordenação qualquer para ordenar os elementos da matriz.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Sobre:

Em 22/05/2018 às 15:55, Lucas Tezolini Herler disse:

6. Leia duas matrizes 4 x 4 e escreva uma terceira com os maiores elementos entre
as primeiras. 

 

Depende! Os "maiores elementos" em relação a o quê? é 8 de uma e 8 da outra, ou seria 16 maiores no geral? ou seria outra coisa?


Eu particularmente entendi que seria os maiores no geral! Seria uma interpretação diferente, que por consequência necessitaria de uma lógica diferente.

 

RESUMINDO:
Primeiro precisa entender o problema, o que deve ser feito... para só depois tentar solucionar.

 

Se de fato for metade de cada, talvez a melhor forma seria mesmo ordenar em ordem decrescente as 2, jogar os 8 primeiros números de cada na 3ª matriz.

Logo, sua primeira preocupação seria "ordenar uma matriz"... daí, apenas foque nisso.. pegue uma única matriz, e tente ordená-la... Só após, tente fazer com duas e jogar o que deve jogar na terceira.

 

Não tente fazer tudo de uma vez!!! É pior!

Link para o comentário
Compartilhar em outros sites

Olá, me disseram um outro jeito de fazer isso e assim o implementei. Porém na hora de imprimir, é mostrado valores aleatórios.. Alguém sabe o que poderia ser ?

/* 6. Leia duas matrizes 4 x 4 e escreva uma terceira com os maiores elementos entre
as primeiras;*/
#include<stdio.h>
#include<locale.h>
#define t 2
int main ()
{
    setlocale(LC_ALL,"Portuguese_Brazil");
    int m1[t][t], m2[t][t], m3[t][t], i, j;
    preencher(m1);
    preencher(m2);
    mostrar(m3);
}
int preencher (int m1[t][t])
{
    int i,j;
    for (i=0;i<t;i++)
    {
        for (j=0;j<t;j++)
        {
            printf("Digite o valor de posição %d%d ", i, j);
            scanf("%d ", &m1[i][j]);
        }
    }
}
int ler (int m1[t][t], int m2[t][t], int m3[t][t]) /* função que vai realizar a operação*/
{
    int i,j;
    for (i=0;i<t;i++)
    {
        for (j=0;j<t;j++)
        {
            if (m1[i][j] > m2[i][j])
            {
                m3[i][j] = m1[i][j];
            }
            else
            {
                m3[i][j] = m2[i][j];
            }
        }
    }
}
int mostrar (int m3[t][t])
{
    int i, j;
    for (i=0;i<t;i++)
    {
        for (j=0;j<t;j++)
        {
            printf("%d \t", m3[i][j]);
        }
        printf("\n");
    }
}

 

Link para o comentário
Compartilhar em outros sites

O problema é que no main() você não usou a função ler() que é onde a matriz m3 receberia os valores maiores.

 

Alguns detalhes que tabém pode corrigir:

 

- Os tipos das funções que não retornam nenhum valor deveria ser void (não int).

- A função main() está com o tipo correto, o tipo int, só que ficou faltando colocar o "return 0;" na última linha do main() para retornar zero indicando que o programa foi encerrado corretamente.

- Algumas variáveis foram declaradas mas não são usadas dentro da função, então remova a declaração.

- No C sempre deve-se declarar algo primeiro para depois usar, mas seu programa está com a função main() no começo do código e ela usa funções que só são declaradas depois dela... Então mova a função main() para o fim do código.

adicionado 13 minutos depois

@Simon Viegas Ele interpretou o enunciado de maneira diferente, quer que compare os números na mesma posição das 2 matrizes, e guarde o número maior na mesma posição da terceira matriz.

Link para o comentário
Compartilhar em outros sites

- esse ''novo jeito'' seria verificar cada valor de cada matriz e guardar apenas o maior deles. Ex: m1[0][0] = 32, m2[0][0] = 40, na nova matriz m3, o valor de posição 0,0 vai ser 40

 

-não to entendendo, na minha visão, todas as funções que eu usei têm que retornar algo.. A gabarito me diz o as respostas corretas e a ler me diz quantas questões certo aluno acertou 

 

- ok, alterei isso, obrigado

 

- considerei o que disse, porém to usando todas as variáveis, acabei de verificar, ou cometi alguma redudância

 

- quando eu coloquei a int main no fim do código apareceu um warning

 

 

Link para o comentário
Compartilhar em outros sites

@Lucas Tezolini Herler Uma função "retornar" algo refere-se apenas a quando se usa a palavra-chave return para retornar um valor, se não precisou usar return então a função não retornou nenhum valor, esse tipo de função recebe o tipo void.

 

Exemplo de função com retorno do tipo int:

int dobro(int x){
    return 2 * x;
}


Como essa função retorna um valor podemos usá-la em atribuições e outras operações, veja:

a = 10
y = dobro(a); //A função retorna o número 20, e atribuimos esse valor a y

 

 

Abaixo segue seu código com as alterações que mencionei (me informe se dá algum warning):

#include<stdio.h>
#include<locale.h>
#define t 2
void preencher (int m1[t][t])
{
    int i,j;
    for (i=0;i<t;i++)
    {
        for (j=0;j<t;j++)
        {
            printf("Digite o valor de posição %d%d ", i, j);
            scanf("%d", &m1[i][j]);
        }
    }
}
void ler (int m1[t][t], int m2[t][t], int m3[t][t]) /* função que vai realizar a operação*/
{
    int i,j;
    for (i=0;i<t;i++)
    {
        for (j=0;j<t;j++)
        {
            if (m1[i][j] > m2[i][j])
            {
                m3[i][j] = m1[i][j];
            }
            else
            {
                m3[i][j] = m2[i][j];
            }
        }
    }
}
void mostrar (int m3[t][t])
{
    int i, j;
    for (i=0;i<t;i++)
    {
        for (j=0;j<t;j++)
        {
            printf("%d \t", m3[i][j]);
        }
        printf("\n");
    }
}
int main () //Main movido para o fim do código
{
    setlocale(LC_ALL,"Portuguese_Brazil");
    int m1[t][t], m2[t][t], m3[t][t]; // i, j; <- Declaradas mas não usadas
    preencher(m1);
    preencher(m2);
    ler(m1, m2, m3); //Estava faltando essa linha para funcionar corretamente
    mostrar(m3);
    return 0; //main() returna zero = programa acabou corretamente
}

 

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!