Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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?

Editado por AnsiC

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?

Editado por AnsiC
Notação Matemática

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






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

×