Ir ao conteúdo
  • Cadastre-se

C matriz com alocação dinamica


Posts recomendados

Gente é eu n entendi o que é para fazer, é pra fazer uma função, um for? eu to tentando assim porém não está indo.

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

int main(){
	
	int m,n,i,j,s;
	
	scanf("%d %d",&m,&n);
	
	int**x = (int**) malloc(m*sizeof(int*));
	
	for(i=0; i<m; i++)
		x[i] = (int*) malloc(n*sizeof(int));
		
	for(i=0; i<m; i++){
		for(j=0; j<n; j++){
			scanf("%d",&x[i][j]);
		}
	}
	for(i=0; i<m; i++){
		for(j=0; j<n; j++){
			if(x[i][j] != x[j][i]){
				s=0;
			}
		}
	}
	
		if(s == 0)	{
			
			printf("N Eh simetrica\n");
			
		}else{
			
			printf("Ela eh simetrica\n");
		}

	return 0;
}	


Se eu coloco desse jeito, n funciona por exemplo eu coloco a matriz

2 1

2 2

no caso ela n é simétrica porém no programa mostra ao contrario que ela é simétrica...

Link para o comentário
Compartilhar em outros sites

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

int main(){
	
	int m,n,i,j,s;
	
	s=5;
	
	scanf("%d %d",&m,&n);
	
	int**x = (int**) malloc(m*sizeof(int*));
	
	for(i=0; i<m; i++)
		x[i] = (int*) malloc(n*sizeof(int));
		
	for(i=0; i<m; i++){
		for(j=0; j<n; j++){
			scanf("%d",&x[i][j]);
		}
	}
	for(i=0; i<m; i++){
		for(j=0; j<n; j++){
			if(x[i][j] != x[j][i]){
				s=0;
			}
		}
	}
	
		if(s == 0)	{
			
			printf("N Eh simetrica\n");
			
		}else{
			
			printf("Ela eh simetrica\n");
		}

	return 0;
}	


Assim aparentemente tudo funcionou corretamente mais quando eu coloco a matriz

2 3

1

2

3

4

5

6

 

ela n aparece, nem se essa matriz é simétrica e nem se ela não é simétrica, alguém sabe o porque?

No meu programa tem que aparecer no caso que essa matriz que não é simétrica.

Link para o comentário
Compartilhar em outros sites

Uma matriz com dimensão 2 x 3 não é quadrada, logo você pode afirmar que ela não tem como ser simétrica.

 

O motivo que não imprime nada é porque vai dar erro no programa, pois ele tenta acessar posições da matriz que não existem nesse if:

if(x[i][j] != x[j][i]){

Pois como a matriz não é quadrada tem posições ij para as quais não existe uma posição ji correspondente.

 

Então você tem que testar primeiro se n == m, para se certificar que a matriz é quadrada, se não for quadrada então a matriz automaticamente não é simétrica. Apenas se for quadrada você faz as comparações entre as casas para verificar se é simétrica.

adicionado 29 minutos depois

 

 

@Guilherme Cesila Seu programa tem um problema grave, que é que você não usa free() para liberar a memória alocada dinamicamente quando não precisa mais dela. Isso é obrigatório, sempre é necessário liberar a memória que é alocada dinamicamente, então de preferência já coloque um free correspondente a cada malloc imediatamente toda vez que usar malloc, assim evita esquecer de colocar depois.

 

for(i=0; i<m; i++)
    free(x[i]);

free(x);

 

 

E falando em alocar matriz dinamicamente, o método que você usou é válido, mas tem a desvantagem de que usa vários mallocs para criar a matriz, e cada malloc aloca memória em um lugar diferente da memória, então sua matriz fica espalhada em vários lugares da memória, criando uma perda de desempenho comparado com se fosse alocada em um lugar só, de modo que todos os dados da matriz ficam agrupados continuamente na memória.

 

Existem alguns métodos para alocar a matriz inteira de 1 vez, mas eu diria que o melhor é este:

int (*matriz)[m] = malloc(n * m * sizeof(int));

ou

int (*matriz)[m] = malloc(n * sizeof *matriz);

ou

int (*matriz)[m] = malloc(sizeof(int[n][m]));

Aí você acessa a matriz normalmente pelos índices matriz[ i ][ j ], e dessa maneira é possível usar 1 único free para liberar a memória alocada dinamicamente para a matriz.

 

free(matriz);

 

  • Amei 1
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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!