Jump to content
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?

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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á?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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");
}

 

 

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 ;])

Edited by thalesrafaell
  • Obrigado! 1

Share this post


Link to post
Share on other 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 :)

Edited by Fabiano Amaral

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
                                        }
                         }
           }               
Edited by thalesrafaell

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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? 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.