Ir para conteúdo
thalesrafaell

Comparação de 2 vetores

Recommended Posts

Pessoal boa tarde, boa noite ou algo do tipo. Tô iniciando C e já me dei de cara com uma braba.

O programa consiste em criar 2 vetores, compará-los e mostrar na tela os valores dos vetores que estão REPETIDOS. Eu fiz toda a lógica mas de forma alguma funciona. Segue abaixo o código.

 



#include <stdio.h>
#include <conio.h>
int main()
{
int vetA[5], vetB[8], vetC[8], i, j, r=0, total = 0;
printf("--- VETOR A ---\n\n");
printf("Informe 5 numeros: \n");
for(i = 0; i < 5; i++)
{
scanf("%d", &vetA);
}
printf("--- VETOR B ---\n\n");
printf("Informe 8 numeros: \n");
for(i = 0; i < 8; i++)
{
scanf("%d", &vetB);
}
for(i = 0; i < 9; i++)
{
for(j = 0; j < 6; j++)
{
if(vetA == vetB[j])
{
vetC[r] = vetB[j];
total++;
}
}
}
if(total == 0)
{
printf("Nao ha valores iguais");
}
else
{
printf("\n\nValores iguais: \n");
for(i = 0; i < total; i++)
{
printf("\n%d", vetC[r]);
}
}
printf("\n\n");
system("pause");
}

 

 

A indentação se perdeu com o ctrl+c ~ ctrl +v ..... x)

 

Deve estar algo errado aí mas eu não consigo encontrar, já tentei e todas as forma mudar algumas coisas aqui e ali mas nada. Se rodar esse código aqui acaba acontecendo isso como na imagem abaixo.

SR98Jg.png

 

 

Alguém dá um help?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

#include <stdio.h>
#define MAX 5
int main(void) {
  int vet_A[MAX], vet_B[MAX];
  int repeated_count, repeated[MAX] = {};
  unsigned int i,j;
 
  puts("-- Leitura do primeiro array --");
  for(i=0; i<MAX; i++) {
    printf("Informe o %d número: ", i+1);
    scanf("%d", &vet_A[i]);
  }
 
  puts("-- Leitura do segundo array --");
  for(i=0; i<MAX; i++) {
    printf("Informe o %d número: ", i+1);
    scanf("%d", &vet_B[i]);
  }
 
  repeated_count = 0;
  for(i=0; i<MAX; i++) {
    for(j=0; j<MAX && vet_A[i] != vet_B[j]; j++); // É um for vazio apenas p/ percorrer o segundo array até encontrar um valor repetido.
    if (j < MAX) {
      for(j=0; repeated_count && j<repeated_count && vet_A[i] != repeated[j]; j++); // Verifica se já temos o valor na lista de números repetidos.
      if (j >= repeated_count) { // Neste ponto temos um número repetido que não está na lista de repetidos (novo número)
        repeated[repeated_count] = vet_A[i];
        repeated_count++;
      }
    }
  }
 
  if (!repeated_count) {
    puts("Não há números repetidos.");
  } else {
    for(i=0; i<repeated_count; i++)
      printf("%d\n", repeated[i]);
  }
  return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Wow _Isis_ ...

 

Mas isso é em C ou C++?

 

Tem comandos que não aprendi ou não vi ainda, tem como simplificar ou fazer em C (Se é que não já é...) só mostrar onde eu tô errando no meu código lá?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é C.

A única coisa que tem de diferente é a função puts e a macro define (procure na internet).

Observe os comentários e compare os códigos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.bem para começar vamos observar alguns pontos:

 

1 - Para que ta servindo a variável inteira 'r=0'?

2 - Todo vetor começa sua contagem do '0' então se você o define assim 'vetA [5]' o for deve ser usado assim: for (i=0;i<5;i++) por que ele começa a contar do '0' ;('0' até '4' são 5 espaços alocados,isto é,você não usa o ultimo vetor por que nele fica um caractere nulo)

3 - Para que você usa o system("pause");?se for para ver a mensagem "pressione qualquer tecla para continuar..." beleza agora se for para ver o resultado do program fora do compilador recomendo que use a função "getchar();" da biblioteca <stdio.h>;a proposito a biblioteca do system(); e a <stdlib.h>,e a biblioteca <conio.h> já esta saindo de uso por isso recomendo que não a use...

4 - Quando for exibir o resultado utilizando a variável 'total' decremente 1 antes do for;

 

Rodei seu program numa boa aqui apenas observando esses erros...

Se não resolver sozinho posto os erros detalhados do programa,não posto logo por que você como programador tem que aprender a encontrar erros sozinho de preferencia...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.bem para começar vamos observar alguns pontos:

 

1 - Para que ta servindo a variável inteira 'r=0'?

2 - Todo vetor começa sua contagem do '0' então se você o define assim 'vetA [5]' o for deve ser usado assim: for (i=0;i<5;i++) por que ele começa a contar do '0' ;('0' até '4' são 5 espaços alocados,isto é,você não usa o ultimo vetor por que nele fica um caractere nulo)

3 - Para que você usa o system("pause");?se for para ver a mensagem "pressione qualquer tecla para continuar..." beleza agora se for para ver o resultado do program fora do compilador recomendo que use a função "getchar();" da biblioteca <stdio.h>;a proposito a biblioteca do system(); e a <stdlib.h>,e a biblioteca <conio.h> já esta saindo de uso por isso recomendo que não a use...

4 - Quando for exibir o resultado utilizando a variável 'total' decremente 1 antes do for;

 

Rodei seu program numa boa aqui apenas observando esses erros...

Se não resolver sozinho posto os erros detalhados do programa,não posto logo por que você como programador tem que aprender a encontrar erros sozinho de preferencia...

 

Eu fiz algumas mudanças e não rodou, deu um bug e fechou o programa :/ tem como mandar a mudança que você fez pra comparar?

 

 

Isso é C.

A única coisa que tem de diferente é a função puts e a macro define (procure na internet).

Observe os comentários e compare os códigos.

 

 

Adaptei assim, não rodou, tô deixando algo passar?

 

#include <stdio.h>
#include <conio.h>
int main()
{
int vetA[5], vetB[8], vetC[8], i, j, r=0, total = 0;
printf("--- VETOR A ---\n\n");
printf("Informe 5 numeros: \n");
for(i = 0; i < 5; i++)
{
scanf("%d", &vetA);
}
printf("--- VETOR B ---\n\n");
printf("Informe 8 numeros: \n");
for(i = 0; i < 8; i++)
{
scanf("%d", &vetB);
}
for(i = 0; i < 8; i++)
{
for(j = 0; j < 5 && vetA != vetB[j]; j++)
{
if(j < 5)
{
for(j=0; total && j<total && vetA != vetC[j]; j++)
{
if(j>=total)
{
vetC[total]=vetA;
total++;
}
}
}
}
}
if(total == 0)
{
printf("Nao ha valores iguais");
}
else
{
printf("\n\nValores iguais: \n");
for(i = 0; i < total; i++)
{
printf("\n%d", vetC);
}
}
printf("\n\n");
system("pause");
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem vamos lá.já que não conseguiu resolver os erros vou mostra-los detalhadamente:

#include <stdio.h>  // Só há necessidade de usar esta biblioteca pois a <conio.h> esta fora de uso; E a função system("pause") só funciona com a biblioteca <stdlib.h>.mas não vejo necessidade de usa-la// 

int main()
{
    int vetA[5], vetB[8], vetC[8], i, j, total = 0; //Bem como te disse antes não tinha necessidade de usar a variável 'r';//
    
    printf("--- VETOR A ---\n\n");
    printf("Informe 5 numeros: \n");
    
    for(i = 0; i < 5; i++) //Laço para salvar os elementos no vetor A//
    {
        scanf("%d", &vetA[i]);
    }
    
    printf("--- VETOR B ---\n\n");
    printf("Informe 8 numeros: \n");
    
    for(i = 0; i < 8; i++) //Laço para salvar o elementos no vetor B//
    {
        scanf("%d", &vetB[i]);
    }
    
    for(i = 0; i < 8; i++) //Salva os elementos repetidos do vetor A no B e os salva no vetor C//
    {
        for(j = 0; j < 5; j++)
        {
            if(vetA[i] == vetB[j])
            {
                vetC[i] = vetB[j];
total++;
            }
        }
    }
    
    if(total == 0)
    {
        printf("Nao ha valores iguais");
    }
    else
    {
        total--; //decrementa 1 de 'total' pois ele faz 6 incrementos(0 á 5),mas o vetor C possui apenas 5 elementos (0 á 4)//
        printf("\n\nValores iguais: \n");
        
        for(i = 0; i < total; i++) //laço para a repetição//
        {
            printf("\n%d", vetC[i]);
        }
    }
    
    getchar(); //Função para visualizar o resultado do programa fora do compilador//
    
    return 0;
} 

Observe bem onde você errou!

  • Obrigado! 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem vamos lá.já que não conseguiu resolver os erros vou mostra-los detalhadamente:

#include <stdio.h>  // Só há necessidade de usar esta biblioteca pois a <conio.h> esta fora de uso; E a função system("pause") só funciona com a biblioteca <stdlib.h>.mas não vejo necessidade de usa-la// 

int main()
{
    int vetA[5], vetB[8], vetC[8], i, j, total = 0; //Bem como te disse antes não tinha necessidade de usar a variável 'r';//
    
    printf("--- VETOR A ---\n\n");
    printf("Informe 5 numeros: \n");
    
    for(i = 0; i < 5; i++) //Laço para salvar os elementos no vetor A//
    {
        scanf("%d", &vetA[i]);
    }
    
    printf("--- VETOR B ---\n\n");
    printf("Informe 8 numeros: \n");
    
    for(i = 0; i < 8; i++) //Laço para salvar o elementos no vetor B//
    {
        scanf("%d", &vetB[i]);
    }
    
    for(i = 0; i < 8; i++) //Salva os elementos repetidos do vetor A no B e os salva no vetor C//
    {
        for(j = 0; j < 5; j++)
        {
            if(vetA[i] == vetB[j])
            {
                vetC[i] = vetB[j];
total++;
            }
        }
    }
    
    if(total == 0)
    {
        printf("Nao ha valores iguais");
    }
    else
    {
        total--; //decrementa 1 de 'total' pois ele faz 6 incrementos(0 á 5),mas o vetor C possui apenas 5 elementos (0 á 4)//
        printf("\n\nValores iguais: \n");
        
        for(i = 0; i < total; i++) //laço para a repetição//
        {
            printf("\n%d", vetC[i]);
        }
    }
    
    getchar(); //Função para visualizar o resultado do programa fora do compilador//
    
    return 0;
} 

Observe bem onde você errou!

 

Ok entendi os pontos citados, realmente tava viajando em algumas coisas, mas tem alguns erros ainda, o código aparentemente não deixa "o porque" desse erro acontecer mas vê aí nas imagens alguns exemplos;

 

SR98Jg.png

 

lvuoLD.png

 

Deve ser problema na hora da alocação dos espaços dos vetores, nos laços de repetição ou tá faltando alguma incrementação no "for" de comparação. Fugiu um pouco do meu controle isso.

 

Se eu botar: Vetor A : 12345

Vetor B: 12345

 

Ele dá certinho: 12345

 

Mas se eu colocar número aleatórios fora de ordem já n funciona. Como deu pra ver aí; (Ah, e usei o System("Pause"), vou precisar dele no exercício e usei agora pra poder mostrar pra voces ;])

Editado por thalesrafaell
  • Obrigado! 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>
#define MAX 5 //para não ter de ficar toda hora mudando o tamanho fiz um macro
int main(int argc, char **argv){
	int i,j,k; //são meus iteradores de for
	int v1[MAX],v2[MAX]; //obviamente os vetores 1 e 2 de tamanho definidos no macro lá em cima
	int flag; //essa flag é 0 se o valor não repete nos dois vetores OU ele já foi avaliado antes(caso o vetor um tenha 2 valores repetidos)
	puts("Digite os valores para V1...");
	for(i=0;i<MAX;i++){
		scanf("%d",&v1[i]);
	}
	puts("Digite os valores do V2...");
	for(i=0;i<MAX;i++){
		scanf("%d",&v2[i]);
	}
	puts("Numeros que se repetem nos dois vetores.");
	/*
		abaixo eu faço o seguinte, fixo um elemento no vetor 1
		e comparo ele com TODOS do vetor 2, se em algum momento
		o elemento fixo do vetor 1 for igual a qualquer elemento do vetor 2
		eu seto a flag pra true(aquele elemento do vetor um fixo se repete
		no vetor2) e saio do for com o break já que eu só preciso saber se 
		ele ocorre pelo menos uma vez e não quantas vezes ele aparece
	*/
	for(i=0;i<MAX;i++){
		flag=0; //para cada elemento do vetor um eu assumo que não exista no vetor 2
		for(j=0;j<MAX;j++){
			if(v1[i]==v2[j]){
				flag=1;
				break;
			}
		}
		// abaixo eu faco a checagem se esse número do vetor 1 já foi impresso
		// se já eu seto a flag para falso e ai ele não será mostrado
		// caso não tenha sido mostrado ainda eu imprimo ele
		for (k = 0; k < i; k++)
		{
			if (v1[k]==v1[i])
			{
				flag=0;
			}
		}
		if(flag){
			printf("%d\n",v1[i]);
		}
	}
	return 0;
}

mudei o código que agora acho que fica mais bem explicado :)

Editado por Fabiano Amaral

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>
#define MAX 5 //para não ter de ficar toda hora mudando o tamanho fiz um macro
int main(int argc, char **argv){
	int i,j,k; //são meus iteradores de for
	int v1[MAX],v2[MAX]; //obviamente os vetores 1 e 2 de tamanho definidos no macro lá em cima
	int flag; //essa flag é 0 se o valor não repete nos dois vetores OU ele já foi avaliado antes(caso o vetor um tenha 2 valores repetidos)
	puts("Digite os valores para V1...");
	for(i=0;i<MAX;i++){
		scanf("%d",&v1[i]);
	}
	puts("Digite os valores do V2...");
	for(i=0;i<MAX;i++){
		scanf("%d",&v2[i]);
	}
	puts("Numeros que se repetem nos dois vetores.");
	/*
		abaixo eu faço o seguinte, fixo um elemento no vetor 1
		e comparo ele com TODOS do vetor 2, se em algum momento
		o elemento fixo do vetor 1 for igual a qualquer elemento do vetor 2
		eu seto a flag pra true(aquele elemento do vetor um fixo se repete
		no vetor2) e saio do for com o break já que eu só preciso saber se 
		ele ocorre pelo menos uma vez e não quantas vezes ele aparece
	*/
	for(i=0;i<MAX;i++){
		flag=0; //para cada elemento do vetor um eu assumo que não exista no vetor 2
		for(j=0;j<MAX;j++){
			if(v1[i]==v2[j]){
				flag=1;
				break;
			}
		}
		// abaixo eu faco a checagem se esse número do vetor 1 já foi impresso
		// se já eu seto a flag para falso e ai ele não será mostrado
		// caso não tenha sido mostrado ainda eu imprimo ele
		for (k = 0; k < i; k++)
		{
			if (v1[k]==v1[i])
			{
				flag=0;
			}
		}
		if(flag){
			printf("%d\n",v1[i]);
		}
	}
	return 0;
}

mudei o código que agora acho que fica mais bem explicado :)

 

 

Dá o mesmo erro do meu último post. // Eu alterei os valores dos vetores pra o que a questão pede (Vetor 1=5, Vetor B = 8)

 

IEqgCD.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que seu erro foi na hora de alterar o código, mudei aqui pra sua questão e funcionou com o exemplo que deu errado no seu, testa ai

#include <stdio.h>
#include <stdlib.h>
#define MAX 5 //para não ter de ficar toda hora mudando o tamanho fiz um macro
int main(int argc, char **argv){
	int i,j,k; //são meus iteradores de for
	int v1[5],v2[8]; //obviamente os vetores 1 e 2 de tamanho definidos no macro lá em cima
	int flag; //essa flag é 0 se o valor não repete nos dois vetores OU ele já foi avaliado antes(caso o vetor um tenha 2 valores repetidos)
	puts("Digite os valores para V1...");
	for(i=0;i<5;i++){
		scanf("%d",&v1[i]);
	}
	puts("Digite os valores do V2...");
	for(i=0;i<8;i++){
		scanf("%d",&v2[i]);
	}
	puts("Numeros que se repetem nos dois vetores.");
	/*
		abaixo eu faço o seguinte, fixo um elemento no vetor 1
		e comparo ele com TODOS do vetor 2, se em algum momento
		o elemento fixo do vetor 1 for igual a qualquer elemento do vetor 2
		eu seto a flag pra true(aquele elemento do vetor um fixo se repete
		no vetor2) e saio do for com o break já que eu só preciso saber se 
		ele ocorre pelo menos uma vez e não quantas vezes ele aparece
	*/
	for(i=0;i<5;i++){
		flag=0; //para cada elemento do vetor um eu assumo que não exista no vetor 2
		for(j=0;j<8;j++){
			if(v1[i]==v2[j]){
				flag=1;
				break;
			}
		}
		// abaixo eu faco a checagem se esse número do vetor 1 já foi impresso
		// se já eu seto a flag para falso e ai ele não será mostrado
		// caso não tenha sido mostrado ainda eu imprimo ele
		for (k = 0; k < i; k++)
		{
			if (v1[k]==v1[i])
			{
				flag=0;
			}
		}
		if(flag){
			printf("%d\n",v1[i]);
		}
	}
	return 0;
}
  • Obrigado! 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Acredito que seu erro foi na hora de alterar o código, mudei aqui pra sua questão e funcionou com o exemplo que deu errado no seu, testa ai

#include <stdio.h>
#include <stdlib.h>
#define MAX 5 //para não ter de ficar toda hora mudando o tamanho fiz um macro
int main(int argc, char **argv){
	int i,j,k; //são meus iteradores de for
	int v1[5],v2[8]; //obviamente os vetores 1 e 2 de tamanho definidos no macro lá em cima
	int flag; //essa flag é 0 se o valor não repete nos dois vetores OU ele já foi avaliado antes(caso o vetor um tenha 2 valores repetidos)
	puts("Digite os valores para V1...");
	for(i=0;i<5;i++){
		scanf("%d",&v1[i]);
	}
	puts("Digite os valores do V2...");
	for(i=0;i<8;i++){
		scanf("%d",&v2[i]);
	}
	puts("Numeros que se repetem nos dois vetores.");
	/*
		abaixo eu faço o seguinte, fixo um elemento no vetor 1
		e comparo ele com TODOS do vetor 2, se em algum momento
		o elemento fixo do vetor 1 for igual a qualquer elemento do vetor 2
		eu seto a flag pra true(aquele elemento do vetor um fixo se repete
		no vetor2) e saio do for com o break já que eu só preciso saber se 
		ele ocorre pelo menos uma vez e não quantas vezes ele aparece
	*/
	for(i=0;i<5;i++){
		flag=0; //para cada elemento do vetor um eu assumo que não exista no vetor 2
		for(j=0;j<8;j++){
			if(v1[i]==v2[j]){
				flag=1;
				break;
			}
		}
		// abaixo eu faco a checagem se esse número do vetor 1 já foi impresso
		// se já eu seto a flag para falso e ai ele não será mostrado
		// caso não tenha sido mostrado ainda eu imprimo ele
		for (k = 0; k < i; k++)
		{
			if (v1[k]==v1[i])
			{
				flag=0;
			}
		}
		if(flag){
			printf("%d\n",v1[i]);
		}
	}
	return 0;
}

 

OPA cara é isso aí mesmo, acho que eu tive a imbecilidade de mexer no macro na hora de fazer as alterações mas rodou tranquilo, eu ainda não sou acostumado a usar flag, mas acabei dando uma estudada melhor nele graças a você(s) :)))

Só que por causa da flag acabei me confundindo também em outra coisa. Porque eu não queria misturar as coisas na hora de mostrar meu problema real aqui. Mas a questão também pede pra ordenar os valores repetidos. Eu já até tinha feito o código separadamente só pra depois inserir, mas agora com a flag acabei sem saber onde colocar: Segue o código

 for(int i = 0; i < n; i++)      
          {           
               for(int j = i; j < n; j++)
                        {                         
                              if(vetor[i] > vetor[j]) 
                                       {                          
                                           int aux = vetor[i]; 
                                           vetor[i] = vetor[j]; 
                                           vetor[j] = aux;
                                        }
                         }
           }               
Editado por thalesrafaell

Compartilhar este post


Link para o post
Compartilhar em outros sites

flag é só uma variável que marca um determinado estado do seu algoritmo, não tem mistério, tem gente que usa qualquer outro nome, mas curto flag por causa do assembly(registrador de flags) mas isso é outro assunto. Desculpa a demora, seu código, conseguiu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite pessoal , gostaria de tira duas  duvidas em relação a C, a primeira é que tenho que comparar um vetor de char com outro, para que onde tenha uma letra igual ele fique na posição ex Char letra [2] [26]={'a','b,'c'}, o segunda seria uma frase onde se tive essas letras ele ia comparar, só que essas letras iam ser comparadas com relação ao numero iguais que se repete as letras, não sei se a senhora me entendo. A segunda duvida é como salvar isso e mostra a frase, como se fosse uma descriptografia. tem como fazer isso? 

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

×

Informação importante

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