Ir ao conteúdo
  • Cadastre-se
ngiovana

C Verificar valores repetidos num vetor

Recommended Posts

Preciso de ajuda num exercício. Ele pede que o usuário insira valores em dois vetores do tipo inteiro, podendo escolher qual inserir primeiro, que tenha um critério de parada (no caso, 0), e que verifique se o valor já foi inserido, para evitar a repetição de valores. 

O que fiz até agora foi isto:

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

void main (){
	int a[100],b[100],i,escolha,cont=0;
	do{
	printf ("Escolha o conjunto que deseja inserir os valores. Digite:\n1- Conjunto A\n2- Conjunto B\n");
	scanf ("%d",&escolha);
		if (escolha!=1 && escolha!=2){
			printf ("Erro. Digite novamente!\n");
		}
	}while (escolha!=1 && escolha!=2);
	switch (escolha){
		case 1:		
		for (i=0;i<100 && a[i-1]!=0;i++){
			printf ("Digite o valor para a posição %d, ou 0 para sair: ",i);
			scanf ("%i",&a[i]);
		}
	}
}

Não consigo fazer a parte em que ele verifica se o número já foi digitado e pede para digitar novamente. Dá pra fazer isso já na parte que está lendo os números ou somente no final, tendo que digitar o conjunto inteiro novamente?

Eu tinha tentado colocando um outro for, com uma variável j = i -1 e verificando se a==a[j], mas não deu certo.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basicamente @ngiovana , somente salvaremos os números que não consta na lista.

Quais os assuntos que estudou até momento? Já estou funções?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não estudei funções ainda, mas consegui resolver colocando um do while. Além disso dei a opção de remover os valores do conjunto (como pedido no exercício) e também mostrei os conjuntos na tela, mas preciso ainda fazer a união dos conjuntos a e b, formando um terceiro vetor, a intersecção e verificar se um conjunto está contido no outro. Meu código está assim:

void main (){
	int a[100],b[100],u[200],m[100],i,escolha,va,vb,cont=0,cont2=0,n;
	do{
	do{
	printf ("Escolha o conjunto que deseja inserir os valores. Digite:\n1- Conjunto A\n2- Conjunto B\n");
	scanf ("%d",&escolha);
		if (escolha!=1 && escolha!=2){
			printf ("Erro. Digite novamente!\n");
		}
	}while (escolha!=1 && escolha!=2);
	do{	
	switch (escolha){
		case 1:
		cont=0;
		va=0;		
		for (i=0;i<100 && a[i-1]!=0;i++){
		do{
			printf ("Digite o valor para a posição %d, ou 0 para sair: ",i);
			scanf ("%i",&a[i]);
			if (a[i]==a[i-1]){
				printf ("Número repetido. Digite novamente!\n");
			}
		}while (a[i]==a[i-1]);
		va++;
		}
		cont++;
		break;
		case 2:
		cont2=0;
		vb=0;
		for (i=0;i<100 && b[i-1]!=0;i++){
		do{
			printf ("Digite o valor para a posição %d, ou 0 para sair: ",i);
			scanf ("%i",&b[i]);
			if (b[i]==b[i-1]){
				printf ("Número repetido. Digite novamente!\n");
			}
		}while (b[i]==b[i-1]);
		vb++;
		}
		cont2++;
		break;	
		}
		printf ("Caso queira reescrever os valores do conjunto, digite 3. Caso contrário, digite 0.\n");
		scanf ("%d",&n);
		if (n==3){
			printf ("Digite 1 para reescrever o conjunto 1, ou 2 para reescrever o conjunto 2.\n");
			scanf ("%d",&escolha);
		 }
		}while (n==3);		
	}while (cont!=1 || cont2!=1);
	printf ("O conjunto A é: \n");
	if (a[0]==0){
		printf ("Vazio.");
	}
	else{
		for (i=0;i<va-1;i++){
			printf ("%i ",a[i]);
		}
	}
	if (b[0]==0){
		printf("Vazio.");
	}
	else{
	printf ("\nO conjunto B é: \n");
		for (i=0;i<vb-1;i++){
			printf ("%i ",b[i]);
		}
	}
}

Queria só uma luz da lógica pra fazer essas operações que faltam...

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Para determinar a intersecção: Vai ter que investigar todos os elementos em A, e verificar se exitem também em B, assim digamos que a1 é um elemento que pertence A; é B= [b1, b2, b3, b4, b5 ... bn], então temos que comparar a1 com todos elementos em B e determinar se existe um elemento a1 == b1 até bn, repetir essa comparação de a1 até an. Os elementos do vetor intersecção são todos elementos em A que também estão em B:

 

A∩B= {x : x ∈ A && x ∈ B}

52 minutos atrás, ngiovana disse:

... a intersecção ...

 

entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada, entendi!! Mas agora está dando um erro no meu código, não sei porque. Ele está assim:

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

void main (){
	int a[100],b[100],u[200],i,escolha,escolha2,va,vb,cont=0,cont2=0,n,j,maior=0;
	int  escolha3,contab=0,contba=0;
	do{
	do{
	printf ("Escolha o conjunto que deseja inserir os valores. Digite:\n1- Conjunto A\n2- Conjunto B\n");
	scanf ("%d",&escolha);
		if (escolha!=1 && escolha!=2){
			printf ("Erro. Digite novamente!\n");
		}
	}while (escolha!=1 && escolha!=2);
	do{	
	switch (escolha){
		case 1:
		cont=0;
		va=0;		
		for (i=0;i<100 && a[i-1]!=0;i++){
		do{
			printf ("Digite o valor para a posição %d, ou 0 para sair: ",i);
			scanf ("%i",&a[i]);
			if (a[i]==a[i-1]){
				printf ("Número repetido. Digite novamente!\n");
			}
		}while (a[i]==a[i-1]);
		va++;
		}
		cont++;
		break;
		case 2:
		cont2=0;
		vb=0;
		for (i=0;i<100 && b[i-1]!=0;i++){
		do{
			printf ("Digite o valor para a posição %d, ou 0 para sair: ",i);
			scanf ("%i",&b[i]);
			if (b[i]==b[i-1]){
				printf ("Número repetido. Digite novamente!\n");
			}
		}while (b[i]==b[i-1]);
		vb++;
		}
		cont2++;
		break;	
		}
		printf ("Caso queira reescrever os valores do conjunto, digite 3. Caso contrário, digite 0.\n");
		scanf ("%d",&n);
		if (n==3){
			printf ("Digite 1 para reescrever o conjunto 1, ou 2 para reescrever o conjunto 2.\n");
			scanf ("%d",&escolha);
		 }
		}while (n==3);		
	}while (cont!=1 || cont2!=1);
	if (va>vb){
		maior=va;
	}
	if (vb>=va){
		maior=vb;
	}
	printf ("O conjunto A é: \n");
	if (a[0]==0){
		printf ("Vazio.");
	}
	else{
		for (i=0;i<va-1;i++){
			printf ("%i ",a[i]);
		}
	}
	if (b[0]==0){
		printf("Vazio.");
	}
	else{
	printf ("\nO conjunto B é: \n");
		for (i=0;i<vb-1;i++){
			printf ("%i ",b[i]);
		}
	}
	printf ("\nUnião entre os conjuntos:\n");
	for (i=0;i<va-1;i++){
		for (j=0;j<vb-1;j++){
			if (a[i]!=b[j]){
			printf ("%i %i ",a[i],b[j]);
			}
			else{
				printf("%i",a[i]);
			}
		}
	}
	printf ("\nIntersecção entre A e B:\n");
	for (i=0;i<va-1;i++){
		for (j=0;j<vb-1;j++){
			if (a[i]==b[j]){
				printf ("%i ",a[i]);
			}
		}
	}
	printf ("\nDiferença entre os vetores:\n");
	do{
	printf ("Digite 1 para A - B, ou digite 2 para B - A:\n");
	scanf ("%d",&escolha2);
	if (escolha2!=1 && escolha2!=2){
		printf ("Erro. Digite novamente!");
	}
	}while (escolha2!=1 && escolha2!=2);
	switch (escolha2){
		case 1:
			printf("A - B = \n");
			for (i=0;i<maior-1;i++){
				printf ("%i ",a[i]-b[i]);
			}
		break;
		case 2:
			printf ("B - A = \n");
			for (i=0;i<maior-1;i++){
				printf ("%i ",b[i]-a[i]);
			}
		break;
	}
	printf ("\nUm conjunto contido no outro: \n");
	do{
		printf ("Digite 1 para verificar se A está contido em B, ou 2 para verificar se B está contido em A: \n");
		scanf ("%d",&escolha3);
		if (escolha3!=1 && escolha3!=2){
			printf ("Erro. Digite Novamente!\n");
		}
	}while (escolha3!=1 && escolha3!=2);
	switch (escolha3){
		case 1:
			for (i=0;i<va-1;i++){
				for (j=0;j<vb-1;j++){
					if (a[i]==b[j]){
						contab++;
					}
				}
			}
			if (contab==va-1){
				printf ("A está contido em B.\n");
			}
			else{
				printf ("A não está contido em B.\n");
			}
		break;
		case 2:
			for (i=0;i<vb-1;i++){
				for (j=0;j<va-1;j++){
				 	if (b[i]==a[j]){
				 		contba++;
					 }
				}
			}
				if (contba==vb-1){
						printf ("B está contido em A.\n");
					}
					else{
						printf ("B não está contido em A.\n");
					}
		break;
	}
}

Pode desconsiderar a parte da união, que ainda vou tentar ajeitar, e a parte para verificar se um conjunto está contido no outro também não consegui testar. O erro é que depois que escrevi a última parte (para verificar se um conjunto está contido no outro), o início não funciona mais, e não dá pra inserir os valores do conjunto B. Não sei se o erro é do dev ou algo do final realmente interfere no início.

quando o código está assim ele funciona:

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

void main (){
	int a[100],b[100],u[200],i,escolha,escolha2,va,vb,cont=0,cont2=0,n,j,maior=0;
	do{
	do{
	printf ("Escolha o conjunto que deseja inserir os valores. Digite:\n1- Conjunto A\n2- Conjunto B\n");
	scanf ("%d",&escolha);
		if (escolha!=1 && escolha!=2){
			printf ("Erro. Digite novamente!\n");
		}
	}while (escolha!=1 && escolha!=2);
	do{	
	switch (escolha){
		case 1:
		cont=0;
		va=0;		
		for (i=0;i<100 && a[i-1]!=0;i++){
		do{
			printf ("Digite o valor para a posição %d, ou 0 para sair: ",i);
			scanf ("%i",&a[i]);
			if (a[i]==a[i-1]){
				printf ("Número repetido. Digite novamente!\n");
			}
		}while (a[i]==a[i-1]);
		va++;
		}
		cont++;
		break;
		case 2:
		cont2=0;
		vb=0;
		for (i=0;i<100 && b[i-1]!=0;i++){
		do{
			printf ("Digite o valor para a posição %d, ou 0 para sair: ",i);
			scanf ("%i",&b[i]);
			if (b[i]==b[i-1]){
				printf ("Número repetido. Digite novamente!\n");
			}
		}while (b[i]==b[i-1]);
		vb++;
		}
		cont2++;
		break;	
		}
		printf ("Caso queira reescrever os valores do conjunto, digite 3. Caso contrário, digite 0.\n");
		scanf ("%d",&n);
		if (n==3){
			printf ("Digite 1 para reescrever o conjunto 1, ou 2 para reescrever o conjunto 2.\n");
			scanf ("%d",&escolha);
		 }
		}while (n==3);		
	}while (cont!=1 || cont2!=1);
	if (va>vb){
		maior=va;
	}
	if (vb>=va){
		maior=vb;
	}
	printf ("O conjunto A é: \n");
	if (a[0]==0){
		printf ("Vazio.");
	}
	else{
		for (i=0;i<va-1;i++){
			printf ("%i ",a[i]);
		}
	}
	if (b[0]==0){
		printf("Vazio.");
	}
	else{
	printf ("\nO conjunto B é: \n");
		for (i=0;i<vb-1;i++){
			printf ("%i ",b[i]);
		}
	}
	printf ("\nUnião entre os conjuntos:\n");
	for (i=0;i<va-1;i++){
		for (j=0;j<vb-1;j++){
			if (a[i]!=b[j]){
			printf ("%i %i ",a[i],b[j]);
			}
			else{
				printf("%i",a[i]);
			}
		}
	}
	printf ("\nIntersecção entre A e B:\n");
	for (i=0;i<va-1;i++){
		for (j=0;j<vb-1;j++){
			if (a[i]==b[j]){
				printf ("%i ",a[i]);
			}
		}
	}
	printf ("\nDiferença entre os vetores:\n");
	do{
	printf ("Digite 1 para A - B, ou digite 2 para B - A:\n");
	scanf ("%d",&escolha2);
	if (escolha2!=1 && escolha2!=2){
		printf ("Erro. Digite novamente!");
	}
	}while (escolha2!=1 && escolha2!=2);
	switch (escolha2){
		case 1:
			printf("A - B = \n");
			for (i=0;i<maior-1;i++){
				printf ("%i ",a[i]-b[i]);
			}
		break;
		case 2:
			printf ("B - A = \n");
			for (i=0;i<maior-1;i++){
				printf ("%i ",b[i]-a[i]);
			}
		break;
	}
	printf ("\nUm conjunto contido no outro: \n");
	
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

E impossível para mim, acompanhar o algoritmo do problema .

Veremos se alguma outro consegue.

Desculpa-me e até.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×