Ir ao conteúdo

Posts recomendados

Postado

Escreva um programa que lê todos os elementos de uma matriz N × N e mostra a matriz e a sua transposta na tela. Obs: O tamanho (N) da matriz deve ser lido do teclado e sua alocação deve ser dinâmica através da função malloc.

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

int main() {
 // alocando matriz
 int n = 3, m = 2;
 int **matriz = malloc(n * sizeof(int*));
 for (int i = 0; i < n; i++)
 matriz[i] = malloc(m * sizeof(int));

 // código omitido: lê os dados de matriz

 int **transp = transposta(matriz, n, m);

  // código omitido: imprime ou faz algo com transp

 // libera a memória alocada
 for(int i = 0; i < n; i++)
 free(matriz[i]);
 for (int j = 0; j < m; j++)
 free(transp[j]);
 free(matriz);
 free(transp);

 return 0;
}

 

Postado

Reservar uma matriz assim está errado.

  Em 02/05/2021 às 01:32, paulo luz magalhaes disse:

int **matriz = malloc(n * sizeof(int*));

Expandir  

O correto seria.

  Mostrar conteúdo oculto

 

Mas mesmo assim ainda não seria útil para você dessa maneira.

 

Outra maneira seria fazer igual o compilador faz.

  Mostrar conteúdo oculto

 

Recomendo ler o livro C completo e total na pagina 105 sobre indexação de ponteiros.

  • Curtir 2
  • Confuso 1
Postado
  Em 02/05/2021 às 03:36, kgin disse:

Reservar uma matriz assim está errado.

O correto seria.

  Mostrar conteúdo oculto

 

Mas mesmo assim ainda não seria útil para você dessa maneira.

 

Outra maneira seria fazer igual o compilador faz.

  Mostrar conteúdo oculto

 

Recomendo ler o livro C completo e total na pagina 105 sobre indexação de ponteiros.

Expandir  

como faço a transposta?

Postado
  Em 02/05/2021 às 03:36, kgin disse:

Reservar uma matriz assim está errado.

  Em 02/05/2021 às 01:32, paulo luz magalhaes disse:

int **matriz = malloc(n * sizeof(int*));

Expandir  
Expandir  

Não está errado.

 

Assim é alocado um vetor de n ponteiros. E depois para cada um é feita a alocação para os m elementos.

 

  Em 02/05/2021 às 04:46, paulo luz magalhaes disse:

como faço a transposta?

Expandir  

Faça a alocação na função como fez para a matriz, só que agora troque a quantidade de linhas e colunas, p.ex,

 

int **transposta(int **matriz, int n, int m){
    int **T = (int **)malloc(m * sizeof(int *));
...
    return T;
}

 

Postado
  Em 02/05/2021 às 15:01, Midori disse:

Não está errado.

 

Assim é alocado um vetor de n ponteiros. E depois para cada um é feita a alocação para os m elementos.

Expandir  

 

Você em razão @Midori não está errado. Mas pode estar errado. Não dá pra saber só com uma linha. E considerando que é uma matriz quadrada apesar de não estar sintaticamente errado está praticamente errado :) . Vou tentar explicar

 

Ao declarar isso em 64 bits:
 

    int****     coisa; 

 

se está declarando um ponteiro. Só um. 8 bytes de estiver compilando em 64bits. Isso não é por exemplo uma "matriz multidimensional" como já li aqui e em alguns lugares. Nem existe isso em C. E ****coisa é apenas um int.

 

EXEMPLO

 

Veja a saída
 

O int:        30
O int*:       30
O int**:      30
O int***:     30
O int****:    30
Um **((int**)(**(int****):    30

sizeof(int****):         8

 

Desse programa

 

#include <stdio.h>
int main()
{
    int         trinta = 30;
    int*        coisa1 = &trinta;
    int**       coisa2 = &coisa1;
    int***      coisa3 = &coisa2;
    int****     coisa4 = &coisa3;
    printf("O int: %9d\n", trinta);
    printf("O int*: %8d\n", *coisa1);
    printf("O int**: %7d\n", **coisa2);
    printf("O int***: %6d\n", ***coisa3);
    printf("O int****: %5d\n", ****coisa4);
    printf("Um **((int**)(**(int****): %5d\n", **((int**)(**coisa4)) );
    printf("\nsizeof(int****): %9d\n", (int) sizeof(coisa4));
    return 0;
}

 

E acho que vai entender o que quero dizer, Pode estar certo se o programa construir tudo certinho. Pode estar errado.

 

  Em 02/05/2021 às 15:01, Midori disse:

Assim é alocado um vetor de n ponteiros. E depois para cada um é feita a alocação para os m elementos.

 

Expandir  

 

Como você disse. Assim é alocado um vetor de ponteiros. E aí precisa fazer esse vetor de ponteiros apontar para as linhas da "matriz" alocando o espaço correto para cada linha.

 

O exemplo óbvio para entender isso é o sistema e main(). main() é 
 

    int     main(int argc, char**argv);


e o sistema constrói cuidadosamente um vetor de ponteiros a partir de cada argumento passado para cada programa n mundo C. **argv é apenas um char. *argv é o primeiro argumento, o nome do programa.

 

E a parte do praticamente errado?

 

É que se espera a matriz contínua na memória e por isso se aloca para uma "matriz" 3x4x5 de double uma área de 3x4x5xsizeof(double). E se usa aritmética para achar os dados.

 

Ao construir passo a passo pode ser que os valores das linhas não sejam contínuos e não se pode calcular as posições dos elementos a partir do endereço de início.
 

image.png.99892defa4ed0716e93c90924ba4de74.png

Essa é a fórmula geral, aqui copiada de Estruturas de Dados usando C (1a ed. 1995)

um livro texto clássico no mundo todo.

 

 

 

 

 

 

 

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...