Ir ao conteúdo

Posts recomendados

Postado

Pessoal, estou com bastante dificuldade de resolver este exercício de ED1 (Janelas de Matrizes).

 

Ele pede para fazer os seguintes itens:

1.Incrementar um valor inteiro em cada elemento (x,y) da sub-matriz (x1,y1,x2,y2). Crie uma função chamada increment_matrix;

Ex: image.png.d0e31d44681059be1fd740f997833571.png

 

2.Atribuir um valor inteiro em cada elemento (x,y) da sub-mâtriz (x1,y1,x2,y2). Crie uma função chamada set_value_into_matrix.

Ex:

image.png.568c0ca6bd155658046ad1328463b25b.png

3.Imprimir os vâlores do somâto rio, mínimo e máximo dos elementos sub-matriz (x1,y1,x2,y2). Crie uma função chamada "print_matrix_metrics".

Ex: image.png.37cd432489aa08cb09bccaf72b18e222.png

 

Preciso de muita ajuda de vcs!!

 

Para quem quer realizar os testes do código:

#include <stdio.h>
#include <stdlib.h>

/*
Incrementar um valor inteiro em cada elemento (x,y) da sub-matriz (x1,y1,x2,y2).
Crie uma função chamada increment_matrix;
*/
void incrementMatrix(int matriz, int x1, int y1, int x2, int y2, int valor){
    for (int i=x1; i<=x2; i++){
        for (int j=y1; j<=y2; j++){
            printf(" %d ", valor);
        }
        printf("\n");
    }
    printf("\n");
}
/*
Atribuir um valor inteiro em cada elemento (x,y) da sub-matriz (x1,y1,x2,y2).
Crie uma funçao chamada set_value_into_matrix.
*/
void setValueIntoMatrix(int matriz, int x1, int y1, int x2, int y2, int valor){
    int novoValor = 0;
    for (int i=x1; i<=x2; i++){
        for (int j=y1; j<=y2; j++){
            novoValor = novoValor + valor;
            printf(" %d ", novoValor);
        }
        printf("\n");
    }
    printf("\n");
}

/*
Imprimir os vâlores do somatorio, mínimo e maximo dos elementos sub-mâtriz (x1,y1,x2,y2).
Crie uma funçao chamada print_matrix_metrics
*/
void printMatrixMetrics(int **matriz, int x1, int y1, int x2, int y2){
    int somatorio = 0;
    int maximo = 0, minimo = 0;
    for (int i=x1; i<=x2; i++){
        for (int j=y1; j<=y2; j++){
            if (minimo < matriz[i][j]){
                minimo = matriz[i][j];
            }

            if (maximo > matriz[i][j]){
                maximo = matriz[i][j];
            }

            somatorio = somatorio + matriz[i][j];
        }
    }

    printf("%d %d %d", somatorio, minimo, maximo);
}

int main(){
    int numLinha, numColuna, numOperacoes;

    scanf("%d %d %d", &numLinha, &numColuna, &numOperacoes);
    int **matriz;

    matriz = (int**) calloc (numLinha, sizeof(int));

    for (int i=0; i<numLinha; i++){
        matriz = (int**) calloc (numColuna, sizeof(int));
    }

    for (int i=0; i<numOperacoes; i++){
        int tipoOperacao;
        int x1, y1, x2, y2;
        int valor;

        scanf("%d %d %d %d %d", &tipoOperacao, &x1, &y1, &x2, &y2);

        if (tipoOperacao == 1){
            scanf("%d", &valor);
            incrementMatrix(matriz, x1, y1, x2, y2, valor);
        }
        else if (tipoOperacao == 2){
            scanf("%d", &valor);
            setValueIntoMatrix(matriz, x1, y1, x2, y2, valor);
        }
        else {
            printMatrixMetrics(**matriz, x1, y1, x2, y2);
        }
    }

    free(matriz);
    return 0;
}

 

Postado

mas qual a sua dúvida afinal?

 

  • porque tentou escrever o programa todo antes de resolver um desses itens, já que são todos iguais
  • porque usar calloc() se vai atribuir valores à matriz toda?
  • porque usar alocação dinâmica da matriz se o enunciado só mostra uma simples matriz 5x5 e nem fala em ler a matriz, apenas em operar com ela?
     
	matriz = (int**) calloc (numLinha, sizeof(int));
    for (int i=0; i<numLinha; i++){
        matriz = (int**) calloc (numColuna, sizeof(int));
    }
  •  que pretende nas linhas acima? Como quer construir a area para a matriz? C não tem vetores de mais de uma dimensão, então pode usar o simples e usar linha a linha. Assim como fez não vai funcionar...
  • copiar um loop para mostrar a matriz para todas as funções pode fazer você se sentir melhor ao ler o programa com as funções todas, mas é ilusão. Faça o simples e use uma matriz com valores inicias e escreva as funções uma a uma. De verdade. E deixe uma função para claro mostrar a matriz, funcionando antes de tudo.
Postado

@arfneto Bom, primeiramente, desculpe por não dizer a minha dúvida.

Estava com muitas dificuldades: por exemplo, no 2º item, queria atribuir um valor inteiro em cada elemento da sub-matriz (x1,y1,x2,y2). E também no 3º item (criar a função 'print_matrix_metrics'), que é para somar todos os elementos de uma submatriz (x1,y1,x2,y2) e, depois, imprimir o somatório, o menor e o maoir elemento da sub-matriz.

14 minutos atrás, arfneto disse:

mas qual a sua dúvida afinal?

 

  • porque tentou escrever o programa todo antes de resolver um desses itens, já que são todos iguais
  • porque usar calloc() se vai atribuir valores à matriz toda?
  • porque usar alocação dinâmica da matriz se o enunciado só mostra uma simples matriz 5x5 e nem fala em ler a matriz, apenas em operar com ela?
     

	matriz = (int**) calloc (numLinha, sizeof(int));
    for (int i=0; i<numLinha; i++){
        matriz = (int**) calloc (numColuna, sizeof(int));
    }
  •  que pretende nas linhas acima? Como quer construir a area para a matriz? C não tem vetores de mais de uma dimensão, então pode usar o simples e usar linha a linha. Assim como fez não vai funcionar...
  • copiar um loop para mostrar a matriz para todas as funções pode fazer você se sentir melhor ao ler o programa com as funções todas, mas é ilusão. Faça o simples e use uma matriz com valores inicias e escreva as funções uma a uma. De verdade. E deixe uma função para claro mostrar a matriz, funcionando antes de tudo.

Bom, tentei fazer este item, seguindo da forma que em ED1 pede.

 

Sobre colocar o calloc, ao invés do malloc, não sabia qual dos dois tipos de alocação colocar.

 

Sobre o 3º item que você colocou em cima, posso fazer dessa maneira?
 

 matriz = malloc (numLinha * numColuna, sizeof(int));

 

Mas como é uma matriz, para isso, devo criar um novo elemento chamado "subMatriz" para inserir os elementos dentro da matriz?
Mas o problema é esse: como posso incrementar e atribuir os dados dentro do elemento "matriz" inicialmente declarado?

Postado

antes de tudo escreva o programa para mostrar a matriz e entenda como endereçar os elementos nessa sub-matriz. Esqueça esse lance de construir a matriz na memória. Faça uma coisa por vez.


Pense no simples. Esta provavelmente superestimando o problema
 

    int teste[5][5] =
    {
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 }
    };

 

Isso por exemplo cria e preenche uma matriz e você pode escrever o resto com isso. Escreva a partir dos dados. Só isso

Postado
11 minutos atrás, arfneto disse:

antes de tudo escreva o programa para mostrar a matriz e entenda como endereçar os elementos nessa sub-matriz. Esqueça esse lance de construir a matriz na memória. Faça uma coisa por vez.


Pense no simples. Esta provavelmente superestimando o problema
 


    int teste[5][5] =
    {
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 }
    };

 

Isso por exemplo cria e preenche uma matriz e você pode escrever o resto com isso. Escreva a partir dos dados. Só isso

beleza. :D

E se eu quiser pegar os elementos em um intervalo (x,y), devo criar uma matriz (ex: int teste2[lin][col])?

 

Postado
2 minutos atrás, NhemonF disse:

E se eu quiser pegar os elementos em um intervalo (x,y), devo criar uma matriz (ex: int teste2[lin][col])?

 

Não entendi. Se você quer "pegar" os elementos apenas use os indices deles. Se quer copiar claro que vai precisar de um destino. "pegar" seria o que? 

Postado
agora, arfneto disse:

 

Não entendi. Se você quer "pegar" os elementos apenas use os indices deles. Se quer copiar claro que vai precisar de um destino. "pegar" seria o que? 

Isso!! "Pegar" era exatamente o que você havia dito.


Agora, então, pra substituir, devo colocar o valor, e substituir em um intervalo (x,y) da matriz "teste" pelo número que eu quero?

 

Por exemplo, neste código aqui:

 

scanf("%d %d %d %d $d", x1, y1, x2, y2, valor);
for (int i=x1; i<x2; i++){
  for (int j=y1; j<y2; j++){
    teste[i][j] = valor;
    printf("%d", teste[i][j]);
  }
  printf("\n");
}

 

Postado
1 minuto atrás, NhemonF disse:

Agora, então, pra substituir, devo colocar o valor, e substituir em um intervalo (x,y) da matriz "teste" pelo número que eu quero?

 

sim, para atribuir, atribua.

 

scanf("%d %d %d %d $d", x1, y1, x2, y2, valor);

 

scanf() retorna um valor. TESTE.

 

Não siga adiante sem saber se leu. É bobagem.

 

Leia e rode esse programa

 #include <stdio.h>
 int  mostra_matriz(int m[5][5]);
 int  mostra_sub_matriz(int m[5][5], int,int,int,int);

int main(void)
{
    int teste[5][5] =
    {
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 },
        { 2,4,6,8,10 }
    };

    int m1 [5] [5];

    for (int i=0; i<5; i+=1)
        for (int j=0; j<5; j++)
            m1[i][j] = 1 + i*5 + j;
     
    mostra_matriz(m1);
    mostra_sub_matriz(m1,2,2,4,4);
  
    return 0;
};

int mostra_matriz(int m[5][5])
{
    printf("Matriz 5x5\n\n");
    for (int i=0; i<5; i+=1)
    {
        for (int j=0; j<5; j++)
        {
            printf("%5d", m [i] [j] );
        }
        printf("\n");
    }
    printf("\n");
};

int mostra_sub_matriz(
    int m[5][5],
    int x1, int y1,
    int x2, int y2 )
{
    printf("Sub-Matriz entre (%d,%d) e (%d,%d)\n\n",
        x1,y1,x2,y2);
    for (int i=x1; i<=x2; i+=1)
    {
        for (int j=y1; j<=y2; j++)
        {
            printf("%5d", m [i] [j] );
        }
        printf("\n");
    }
    printf("\n");
};

 

Que mostra

 

PS C:\src\ifdef> ./mat
Matriz 5x5

    1    2    3    4    5
    6    7    8    9   10
   11   12   13   14   15
   16   17   18   19   20
   21   22   23   24   25

Sub-Matriz entre (2,2) e (4,4)

   13   14   15
   18   19   20
   23   24   25

 

Está superestimando o problema.

 

Faça o simples

 

Primeiro aprenda como referenciar a matriz.

 

Escreva em torno dos dados

 

  • Curtir 1
Postado

Acho que agora, estou entendendo.

35 minutos atrás, arfneto disse:

Sub-Matriz entre (2,2) e (4,4) 13 14 15 18 19 20 23 24 25

Agora pra fazer a somatória, encontrar o menor valor e o maior valor da sub-matriz, é só também procurar nos índices da submatriz e declará-los como "maior" e "menor"?

 

tipo assim: image.png.f746f6d758f2f81bafd99f6f0dacae14.png

Postado
5 minutos atrás, NhemonF disse:

Agora pra fazer a somatória, encontrar o menor valor e o maior valor da sub-matriz, é só também procurar nos índices da submatriz e declará-los como "maior" e "menor"

 

Só isso. Ao invés de mostrar na tela compare. Insisto em que está superestimando o problema

 

Postado
1 minuto atrás, arfneto disse:

 

Só isso. Ao invés de mostrar na tela compare. Insisto em que está superestimando o problema

 

Ok :D

Sim. Talvez esteja superestimando ele.

Mas estou começando a entender aos poucos. Achei este exercício da faculdade bastante difícil. Por isso, queria uma ajuda com este exercício.

Muito obrigado pela ajuda!!

Postado
4 minutos atrás, NhemonF disse:

Mas estou começando a entender aos poucos. Achei este exercício da faculdade bastante difícil. Por isso, queria uma ajuda com este exercício.

 

Isso que eu te mostrei é praticamente a resposta. Escreva uma função por vez. A primeira teria que ser a que mostra a matriz. A segunda a que mostra a sub-matriz.

 

Te mostrei as duas.

 

Para mostrar a matriz tem que percorrer tudo. Se sabe como percorrer a matriz ou a sub-matriz pode fazer qualquer conta, como somar um valor... é só isso.

  • 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!