How not to repeat terms on printf

Asked

Viewed 1,177 times

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 which elements are repeated. This is 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 is not a mistake, since I did not put a condition, but I would like you to show only once.

As 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 the repeaters, he prints the answer twice (since he checks by a[0]b[0] and then by a[1]b[0]):

The number 5 is in the two vectors. There is some way to show that it is in the two vectors only once?

4 answers

2

You can change your loops to check 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;
        }
    }
}

1

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

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 way out: code

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

  • I tried with int a[5] = { 110, 2, 99, 5, 106 }, b[7] = { 2, 7, 8, 9, 110, 99 }. The result was that he found the numbers 110 and 2 in the vectors, but he couldn’t find 99. http://ideone.com/stueRn The reason is that the character 'c' has the code 99, but he has found the 110 before.

  • @Victor Now that I can change, so I’ve created a specific case for 99 as well.

0

The secret is the creation of a vector x able to map the repetitions and even their frequency.

1) Solution - Mapping the repetition of vector values 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 of the frequency of repetition of vector elements a in the vector b:

#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!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.