How not to repeat terms in printf

4

I have another problem. My activity this time is to create and read the elements of two vectors, A and B, with 5 and 7 values, respectively. Then the program will show you what elements are repeated. Here's the code:

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

int main() {
    int a[5], b[7], i, j;

    for (i=0; i<5; i++) {
        printf("Digite o %d elemento do vetor A: ",i+1);
        scanf("%d",&a[i]);
    }
    for (j=0; j<7; j++) {
        printf("Digite o %d elemento do vetor B: ",j+1);
        scanf("%d",&b[j]);
    }
    printf("\n");

    for (i=0; i<5; i++) {
        for (j=0; j<7; j++) {
            if (a[i]==b[j]) {
                printf("O numero %d esta nos dois vetores\n",a[i]);
                break;
            }
        }
    }
}

My problem is, if in one of the vectors the value is repeated, the program prints the information twice. It's not a bug, since I did not put a condition, but I'd like it to show only once.

How it happens:

  

a [0] = 5 In the first vector I put equal terms in the first 2 elements.

     

a [1] = 5

     

.

     

.

     

.

     

b [0] = 5 In the second, I repeated the term.

     

.

     

.

     

.

When printing repeats, it prints the response twice (since it checks for a[0]b[0] and then a[1]b[0] ):

The number 5 is in both vectors. Is there a way to show that you are on both vectors just once?

    
asked by anonymous 19.12.2014 / 01:56

4 answers

2

You can change your ties to see if it is not a repeated number:

// Percorre o vetor a.
for (i=0; i<5; i++) {

    // Percorre o vetor b.
    for (j=0; j<7; j++) {

        // Se o número está em ambos os vetores.
        if (a[i]==b[j]) {
            int repetido = 0; // Não é repetido até que se prove o contrário.

            // Percorre novamente os elementos já percorridos do vetor a para saber se não é repetido.
            for (k=0; k<i; k++) {

               // Se já está em uma posição anterior do vetor a, então é repetido.
               if (a[i]==a[k]) {
                   repetido = 1;
                   break; // Já sabe que é repetido, não precisa continuar procurando.
               }
            }

            // Só mostra a mensagem se não for repetido.
            if (!repetido) printf("O numero %d esta nos dois vetores\n",a[i]);

            // Interrompe o laço que itera o vetor b, pois já sabe que está em ambos os vetores, não precisa continuar procurando.
            break;
        }
    }
}
    
19.12.2014 / 02:14
1

An alternative way to solve this problem more efficiently is to first order the two vectors and then merge, similar to what you would do in mergesort.

    
20.12.2014 / 13:48
0
#include <stdio.h>

int main(){
    int a[5] = { 110, 2, 99, 99, 106 },
        b[7] = { 2, 7, 8, 9, 110, 99 },
        i = 0, j = 0, N99 = 0;
    char numrepet[5] = {NULL, NULL, NULL, NULL, NULL};

    for (i = 0; i < 5; i++){

        for (j = 0; j < 7; j++){//Com esses loops colocamos os numeros repetidos em numrepet[]

            if (a[i] == b[j]){
                if (a[i] == 110){//coloco um 'c' porque 110 é o valor do 'n' você vai entender lá em baixo
                    numrepet[i] = 'c';
                    break;
                }
                else if (a[i] == 99 && !N99){//99 é o valor do 'c' usado ali em cima tive que tratar esse caso também.
                    N99 = 1;
                    printf("O numero 99 esta nos dois vetores\n", a[i]);
                }
                else {
                    numrepet[i] = a[i];
                    break;
                }
            }

        }

    }

    for (i = 0; i < 5; i++){

        for (j = i+1; j < 5; j++){//Com esses loops comparamos numrepet[i] com os demais elementos

            if (numrepet[i] == numrepet[j]){
                numrepet[j] = 'n';//tira números repetidos e coloca 'n' que será o nosso null
                //Exemplo numrepet[] {'1', '1', '2', '2'} transforma-se em numrepet[] {'1', 'n', '2', 'n'}
            }

        }

    }

    for (i = 0; i < 5; i++){

        if (numrepet[i] != 'n' && numrepet[i] != NULL){
            printf("O numero %d esta nos dois vetores\n", a[i]);
        }

    }
    getchar();
    return 0;
}

If you want to see the output: code

Note: It does not work with some very large numbers, but I do not think it will use large numbers in this application and many others, but for security it is better to bar these large numbers, but that will leave it to you.

    
19.12.2014 / 23:28
0

The secret is the creation of a vector x capable of mapping the repetitions and even the frequency of them.

1) Solution - Mapping of the repetition of the values of the vector a in the vector b :

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

#define INT_MAX_VALUE  (100)

int main( int argc, char * argv[] )
{
    int a[5] = { 1, 1, 3, 3, 6 };
    int b[7] = { 1, 3, 3, 5, 7, 9, 11 };
    int x[INT_MAX_VALUE]; 

    int i;
    int j;

    /* Inicializa os itens do mapa com valor 0 */
    for( i = 0; i < INT_MAX_VALUE; i++ )
        x[i] = 0;

    /* Mapeamento de repeticoes */
    for( i = 0; i < 5; i++ )
    {
        for( j = 0; j < 7; j++ )
        {
            if( a[i] == b[j] )
            {
                x[ a[i] ] = 1;
                break;
            }
        }
    }

    /* Exibe somente os valores repetidos */
    for( i = 0; i < INT_MAX_VALUE; i++ )
        if( x[i] )
            printf("O valor %d contido no vetor A, se repete no vetor B.\n", i );

    return 0;
}

/* fim-de-arquivo */ 

Compiling (on Linux):

$ gcc -Wall vetores.c -o vetores

Testing:

$ ./vetores
O valor 1 contido no vetor A, se repete no vetor B.
O valor 3 contido no vetor A, se repete no vetor B.

2) Mapping the repetition frequency of elements of the% vector of% in the vector a :

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

int main( int argc, char * argv[] )
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int b[7] = { 1, 3, 5, 5, 7, 9, 11 };
    int x[5] = { 0, 0, 0, 0, 0 }; 

    int i;
    int j;

    for( i = 0; i < 5; i++ )
        for( j = 0; j < 7; j++ )
            if( a[i] == b[j] )
                x[i]++;

    for( i = 0; i < 5; i++ )
        if( x[i] > 0 )
            printf("O numero %d se repete %d veze(s) no vetor b.\n", a[i], x[i] );

    return 0;
}

/* fim-de-arquivo */

Compiling (on Linux):

$ gcc -Wall vetores.c -o vetores

Testing:

$ ./vetores
O numero 1 se repete 1 veze(s) no vetor b.
O numero 3 se repete 1 veze(s) no vetor b.
O numero 5 se repete 2 veze(s) no vetor b.

I hope it helps!

    
09.05.2016 / 02:31