Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gustavo Rodrigues Torre

Elementos repetidos na Matriz

Recommended Posts

hmm, é mais fácil mesmo passar os valores da matriz pro vetor e depois ordenar Imagem Postada

quanto a outra parte, de tirar o vetor verificado da lista, foi exatamente o que fiz no segundo code que postei por últmo, usando a flag ali, se ele for igual, aramazena na flag, dai eu mando o vetor ler apenas os vetores que são maiores que a flag, ou seja, inibo os vetores que eu já sei que tem elementos repetidos.

 

Intendi a tua idéia, mas como vou fazer pra remover o valor do vet(2) e jogar o vetor seguinte na posição dele?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Intendi a tua idéia, mas como vou fazer pra remover o valor do vet(2) e jogar o vetor seguinte na posição dele?

Ai ja é simples, pra você eliminar um elemento use a seguinte ideia:
k=posicao_do_elemento_a_eliminar;para i de k ate tamanho_do_vetor-1 do vetor passo 1	vet(i)=vet(i+1);proximo
exemplo usando vetor 1122334
k=2; // atribui 2 a k porque é o indice do elemento que queremos eliminar, considerar que o indice do primeiro seje 1	para i de k ate tamanho-1 passo 1		 vet(i)=vet(i+1);	proximo	//vector ficará assim 122334
:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando te falei de flag era isso:

 

#include <stdio.h>
#include <limits.h>
#define FLAG INT_MIN
#define SIZE 5
int main(void) {
 int matriz[SIZE][SIZE];
 int i,j;

 /* Leitura */
 for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++) {
	printf("\nDigite o valor de matriz[%d][%d]:",i,j);
	LOOP_ERRO:
	  scanf("%d",&matriz[i][j]);
	  if (matriz[i][j] == FLAG) {
		 puts("\nERRO: digite outro numero");
		 goto LOOP_ERRO;
	  }
}
 /* Verificacao de numeros repetidos */
 int contagem;
 int k,l;
 for(i=0;i<SIZE;i++) {
for(j=0;j<SIZE;j++) {
	if (matriz[i][j] == FLAG)
	  continue;
	else {
	  k = (j+1 == SIZE)? 0 : j+1; // Coluna
	  l = (k == 0)? i+1:i; // Linha
	  contagem = 0;
	  while (l < SIZE) {
		while (k <SIZE) {
			if (matriz[l][k] == matriz[i][j]) {
			  contagem++;
			  matriz[l][k] = FLAG;
			}
			k++;
		}
		k = 0;
		l++;
	  }
	  if (contagem > 0)
			printf("\nO numero %d se repete %d vezes.\n",matriz[i][j],contagem);
	}
}
 }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Intendi a tua idéia, mas como vou fazer pra remover o valor do vet(2) e jogar o vetor seguinte na posição dele?

Ai ja é simples, pra você eliminar um elemento use a seguinte ideia:
k=posicao_do_elemento_a_eliminar;para i de k ate tamanho_do_vetor-1 do vetor passo 1	vet(i)=vet(i+1);proximo
exemplo usando vetor 1122334
k=2; // atribui 2 a k porque é o indice do elemento que queremos eliminar, considerar que o indice do primeiro seje 1	para i de k ate tamanho-1 passo 1		 vet(i)=vet(i+1);	proximo	//vector ficará assim 122334
:thumbsup:

 

aff velho so burro, não consigo intender isso, fiz algo assim, mas ta errado, isso que você mostrou, tem que ser dentro dos dois laços neh??
cont <- 0	para i de 0 ate 6 - 1 passo 1		para j de i+1 ate 6 - 1 passo 1			se (v[i] = v[j]) entao				cont <- cont + 1				v[i] <- v[i+1]			fimse		proximo	proximo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao velho!!!...desculpa aí gRoOvE... o problema xta em eliminar um elemento no vetor, certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom, consegui fazer essa parte finalmente, agora to com dificuldade de acumular a quantidade de repetições de um determinado elemento..Consegui pegar o número repetido: repetido <- v, mas pra contar quantas repetições ele tem ta f*** "/

 

//Verificando Repetido
	k <- 0
	para i de k ate L*C - 1 passo 1
		se (v[i] = v[i+1]) entao
			contrep[i] <- contrep[i] + 1
			repetido[i] <- v[i]
			v[i] <- v[i+1]
			k <- i
		fimse	
	proximo  
	//escrevendo vetor depois de tirar os repetidos
	escrever "\n"
	para i de 0 ate L*C - 1 passo 1
		se (v[i] =/= repetido[i] ) entao
			escrever "\nVetor depois de tirar os repetidos V[",i,"]: ",v[i],""
		fimse
	proximo

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ideia ja xta se encaixando, pra contar o numero de vezes que um elemento se repetiu use tbm um vetor, mas esse vetor tem que estar inicializado com 1 em todas as posicoes, porque consideramos que cada elemento aparece pelo menos uma vez....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você nao precisa guardar as repeticoes...

 

#include <stdio.h>
#include <limits.h>
#include <string.h>
#define SIZE 5
#define TRUE 1
#define FALSE 0
int IN (int I,int* A) {
 int i;
 for(i=0;i<SIZE*SIZE/2;i++)
if (A[i] == I)
  return TRUE;
 return FALSE;
}


int main(void) {
 int matriz[SIZE][SIZE];
 int rep[SIZE*SIZE/2]; // Armazena os elementos repetidos encontrados
 memset(&rep,INT_MIN,sizeof(int)*SIZE*SIZE/2);

 int i,j;
 for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
  scanf("%d",&matriz[i][j]);


 /* Repeticao */
 int k = 0;
 int l,m;
 int contagem;
 for(i=0;i<SIZE;i++) {
for(j=0;j<SIZE;j++) {
   contagem = 0;
   if (IN(matriz[i][j],rep)) // Se o elemento sendo verificado esta no array dos repetidos, pula para a proxima iteracao
	 continue;
   else {
	 /* Verificacao */
	 l = (j == SIZE-1)?  0 : j+1; //coluna
	 m = (l == 0)? i+1 : i; // linha
	 while(m<SIZE) {
		while(l <SIZE) {
		  if(matriz[m][l] == matriz[i][j]) {
			contagem++;
			if (matriz[m][l] != rep[k]) // Se o elemento nao esta no array dos repetidos,insere
			  rep[k] = matriz[i][j];
		  }
		  l++;
		}
		m++;
		l = 0;
	 }
   }
   if (contagem > 0) {
	 printf("\n O elemento %d se repete %d vezes.\n",rep[k],contagem);
	 k++;
   }
}
 }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

calma Isis, estou tentando fazer da forma que o Ritchie falou, primeiro quero resolver dessa forma, depois vou analisar os códigos que você postou, pois tem coisa ai que eu nem sei o que é hasuehsuhesa Imagem Postada e é mais fácil pra mim intender primeiro com vetor, depois ir pra matriz ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ideia ja xta se encaixando, pra contar o numero de vezes que um elemento se repetiu use tbm um vetor, mas esse vetor tem que estar inicializado com 1 em todas as posicoes, porque consideramos que cada elemento aparece pelo menos uma vez....

não consigo somar os repetidos de um mesmo elemento, como faço pra dexar o vetor do numero repetido fixo e depois rodar o laço e ir somando nele?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai gRoOvE desculpa ai a demora, estava meio ocupado.....

Mas vamos voltar ao assunto...

Dê uma olhada na minha ideia:

Depois dos dados da matriz estarem no vetor e o vetor estar ordenado

para k de 1 ate n-1 faca	 para i de k ate n faca	   se vet[k]==vet[i+1]	  cont[k]=cont[k]+1;	  //remove o elemento repetido 		 para j de i+1 ate n-1 faca		 vet[j]=vet[j+1];	  fimpara;		 //decrementa o valor de n porque depois de eliminar a quantidade de elementos diminui	  n=n-1;		 // Como foi eliminado 1 valor o proximo valor a ser comparado recua uma casa.		  i=i-1;	   fimse;	 fimpara;   fimpara;   para i de 1 ate n faca	 escreva("O valor",vet[i],"aparece",cont[i],"Vezes");   fimpara;
Mas o vetor cont[] tem que estar inicializado a 1 em todas as suas posicoes porque considera-se que 1 elemento aparece pelo menos uma vez....

Tente ver ai a ideia e vai postando as duvidas.... Espero ter ajudado... :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ritchie, fiz umas gambiarras aqui e deu certo velho, ve ai o que acha. Vou fazer da forma que você propos, usa menos processamento e ficou mais legível Imagem Postada. Obs.: meu code está nas mesmas condições que você citou.

Depois dos dados da matriz estarem no vetor e o vetor estar ordenado

//Verificando Repetido	k <- 0	para i de k ate L*C - 1 passo 1		se (v[i] = v[i+1]) entao			contrep[i] <- contrep[i] + 1			repetido[i] <- v[i]			v[i] <- v[i+1]			k <- i		fimse	proximo	i <- 0	k <- 0	para i de 0 ate L*C - 1 passo 1		para k de 0 ate L*C - 1 passo 1			se (contrep[k] > 0) entao				se (repetido[k] = v[i]) entao					total[i] <- total[i] + contrep[k]				fimse			fimse		proximo	proximo	//escrevendo vetor depois de tirar os repetidos	escrever "n"	para i de 0 ate L*C - 1 passo 1		se (v[i] =/= repetido[i]) entao			se (total[i] > 0) entao				escrever "nNumero repetido V[",i,"]: ",v[i],",repetido ",total[i]," vezes""			fimse 		fimse	proximo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai velho tava vendo o seu codigo e achei legal a meneira como você simplificou a eliminação dos elementos, tem uma coisa que eu acho q você devia mudar no primeiro ciclo: k=i; devia ser i=i-1; porque quando ele vola pra cima o i vai pra o proximo valor e nao recebe mais o valor de k. E outra coisa que você devia aumentar é a diminuiação do limite do ciclo( L*C-1), devias colocar isso em uma variavel e ir decrementando a medida que você vai eliminando 1 elemento no vetor.... Vamo fzr o seguinte, transforma as ideias pra C e vamos testando as tuas inovações. O minha ideia ja xta correndo conforme postei ai em cima, mas as tuas inovações vao fzendo com que eu aprenda tbm novas formas... Posta aí em C e vamos analisar juntos....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ritchie estou com algumas dúvidas em relação ao seu código...

 

para k de 1 ate n-1 faca
pq começa do 1? está desprezando a possibilidade do elemento v[0] se repita?

 

//remove o elemento repetido 
		 para j de i+1 ate n-1 faca
		 vet[j]=vet[j+1];
	  fimpara;
nesse caso, o último elemento [j+1] sempre vai ser maior que n-1 e vai dar erro pois não existe tal elemento

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ritchie estou com algumas dúvidas em relação ao seu código...

 

para k de 1 ate n-1 faca

 

pq começa do 1? está desprezando a possibilidade do elemento v[0] se repita?

 

//remove o elemento repetido 		 para j de i+1 ate n-1 faca		 vet[j]=vet[j+1];	  fimpara;

 

nesse caso, o último elemento [j+1] sempre vai ser maior que n-1 e vai dar erro pois não existe tal elemento

 

Nao, eu estava considerando a que a inicialização seria de v[1], essa coisa de resolver comecando de 0 as vezes atrapalha um pouco uahuhauh,.. mas tem toda razao....mas é so você alterar e fazer k de 0 ate n-2... n-2 porque a ideia é quando ele chegar no penultimo[n-2] comparar com o ultimo[n-1]... :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

ehasuiheauhease, é um saco msm essa de começar do zero. Fiz umas adaptações no teu código, mas do teu jeito ficou bem mais organizado, faz mais sentido e usa menos processamento Imagem Postada. Eu consegui resolver, mas usei bem mais linhas, aquela segunda alteração que você sugeriu, acredito que não tenha como fazer, pois eu to usando apenas um laço no primeiro ciclo "/

Segue o code, da uma analisada. Amanha vou implementar em C ^^

dobro <- L*C	//Verificando Repetido	para i de 0 ate dobro - 1 passo 1		para k de i + 1 ate dobro - 1 passo 1			se (v[i] = v[k]) entao				contrep[i] <- contrep[i] + 1				para j de k ate dobro - 1 passo 1					se ((j+1) < dobro) entao						v[j] <- v[j+1]					fimse				proximo				dobro <- dobro - 1				k <- k - 1			fimse		proximo	proximo	escrever "n"	//Escrevendo resultado	para i de 0 ate dobro - 1 passo 1		escrever "nO Numero ",v[i]," repete ",contrep[i]," vez(es)"	proximo
Obs.: contarep[L*C] foi inicializado com zero.

Compartilhar este post


Link para o post
Compartilhar em outros sites

To meio apressado, nem vi direito o teu algoritmo.... Sei que aqui nao é lugar pra postar C, mas dê uma olhada no meu programa em C completo.

#include<stdio.h>#include<conio.h>main(){  int mat[3][3],vet[8],cont[8],aux,i,j,k,n;  clrscr();  k=0;  for(i=0;i<3;i++)  {	 for(j=0;j<3;j++)	 {	scanf("%d",&mat[i][j]);	vet[k]=mat[i][j]; //Passa os elementos da matriz pra o vector	k++;	 }  }  //inicializa o vetor cont[] em 1  for(i=0;i<9;i++)	 cont[i]=1;  // ordena o vector  for(i=0;i<k;i++)  {	 for(j=0;j<k-1;j++)	 {	if(vet[j]>vet[j+1])	{	  aux=vet[j];	  vet[j]=vet[j+1];	  vet[j+1]=aux;	}	 }  }  //passa o tamanho do vetor pra n  n=k;  //verifica os repetidos  for(k=0;k<n-1;k++)  {	for(i=k;i<n;i++)	{	  if(vet[k]==vet[i+1])	  {	 cont[k]++;	 for(j=i+1;j<n-1;j++)		vet[j]=vet[j+1];	 n--;	 i--;	  }	 }   }   //apresenta o elemento que se repete e quantas vezes ele repetiu   //O ciclo agora vai ate n+1 porque em cima sera decrementada 1X desnecessariamente   for(i=0;i<n+1;i++)	 printf("nO elemento %d repetiu %d Vezes",vet[i],cont[i]);   getch();  return 0;}

Dê uma olhada ao :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz um pouco diferente do teu, mas funciona de boa:

 

#include <stdio.h>
#define L 2
#define C 3

void main(void)
{
	int M[L][C], v[L*C];
	int i,j,k, aux, cont, dobro, contrep[L*C] = {0,0,0,0,0,0,};
	//Ler Matriz
	for(i=0;i<L;i++)
	{
		for(j=0;j<C;j++)
		{
			printf("Digite um numero M[%d][%d]: ",i,j);
			scanf("%d",&M[i][j]);
		}
	}
	//Passar o valor da matriz para vetor
	cont = 0;
	for(i=0;i<L;i++)
	{
		for(j=0;j<C;j++)
		{
			v[cont] = M[i][j];
			cont++;
		}
	}
	//Ordenando Vetor
	for(i=0;i<L*C;i++)
	{
		for(j=i+1;j<L*C;j++)
		{
			if(v[i] > v[j])
			{
				aux = v[i];
				v[i] = v[j];
				v[j] = aux;
			}
		}
	}
	//Escrevendo vetor ordenado
	for(i=0;i<L*C;i++)
	{
		printf("\nVetor Ordenado V[%d]", v[i]);
	}
	dobro = L*C;
	//Verificar numero repetido
	for(i=0;i<dobro;i++)
	{
		for(k=i+1;k<dobro;k++)
		{
			if(v[i] == v[k])
			{
				contrep[i] = contrep[i] + 1;
				for(j=k;j<dobro;j++)
				{
					if((j+1) < dobro)
					{
						v[j] = v[j+1];
					}
				}
				dobro--;
				k--;
			}
		}
	}
	printf("\n");
	//Escrever Resultado
	for(i=0;i<dobro;i++)
	{
		if(contrep[i] > 0)
		{
			printf("\nO numero %d repete %d vez(es)",v[i], contrep[i]);
		}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao acho que chegamos ao final do exercicio... Espero que as minha dicas tenham ajudado!!! Tambem aprendi com esse topico.. :clap: :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que ainda não Ritchie, precisamos resolver direto com matriz, como a Isis postou ai em cima. Tentei entender o code dela, mas já empaquei na parte da flag ali, no bloco /* leitura */, não consigo entender aquele MIN_INT da biblioteca limits.h "/

 

http://forum.imasters.com.br/index.php?showtopic=289541

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.