Home > OS >  practicing the basic - problem with program
practicing the basic - problem with program

Time:06-01

Im new in this site hope its ok to post question like that. Im trying to learn c language and I got a problem to solve that im stuck with.

-- I need to get 10 number and than print it but with no duplicate number: like if i get 1 2 3 4 5 6 1 2 3 - I need to print only 1 2 3 4 5 6. --

this is what I did:

#include <stdio.h>

int main()
{
    int arr1[10] = {0};
    int arr2[10] = {0};
    int i, j, c;
    
    printf("Please enter 10 numbers:\n");
    
    for (i=0; i<10;   i) {
        scanf(" %d", &arr1[i]);
    }
    
    i = j = c = 0;
    
    for (i=0; i<10;   i) {
        while (arr1[i] != arr2[j], j<10) {
              j;
        }
         if (j==10) {
               arr2[c] = arr1[i];
                 c;
            }
        j=0;
    
    }
    
    for (i=0; i<10;   i) {
        printf("%d ", arr2[i]);
    }
    
   

    return 0;
}

input - 8 1 2 1 2 3 4 5 6 7

output - 8 1 2 1 2 3 4 5 6 7 (I should not print the dupicate numbers)

CodePudding user response:

In this while loop

while (arr1[i] != arr2[j], j<10) 

there is used an expression with the comma operator. The value of the first operand arr1[i] != arr2[j] of the comma operator is discarded and the result of the expression is the value of the second operand of the comma operator j<10.

So after the loop the variable j will be always equal to 10. In fact you have the following loop

    while ( j < 10 ) {
          j;
    }

because the first operand of the comma operator has no side effect.

You have to write

while ( j < c && arr1[i] != arr2[j] ) 
          j;
    }
     if (j==c) {
           arr2[c] = arr1[i];
             c;
        }

That is there is needed to check only c elements of the second array.

Also this for loop

for (i=0; i<10;   i) {
    printf("%d ", arr2[i]);
}

should be rewritten like

for (i=0; i < c;   i) {
    printf("%d ", arr2[i]);
}

Actually to output unique elements of an array there is no need to create a second array. The program can look the following way

#include <stdio.h>

int main( void )
{
    enum { N = 10 };
    int arr1[N] = {0};
    
    printf( "Please enter %d numbers:\n", N );
    
    for ( size_t i = 0; i < N;   i ) 
    {
        scanf( "%d", &arr1[i] );
    }
    
    for ( size_t i = 0; i < N;   i ) 
    {
        size_t j = 0;

        while ( j != i && arr1[i] != arr1[j] )   j;

        if ( j == i ) printf( "%d ", arr1[i] );
    }

    putchar( '\n' );
}

Pay attention to that you should use named constants instead of magic numbers like 10 and you should declare variables in minimum scopes where they are used.

CodePudding user response:

#include <stdio.h>
#include <stdbool.h>

int main()
{
    int arr1[10] = {0};
    int arr2[10] = {0};
    int i, j, number_of_unique_elements;
    
    printf("Please enter 10 numbers:\n");
    for (i = 0; i < 10; i  ) {
        scanf(" %d", &arr1[i]);
    }
    
    i = j = number_of_unique_elements = 0;
    
    // iterate over input, i.e. all values
    for (i = 0; i < 10; i  ) {
        bool exists_already = false;
        // iterate over target as far as already filled
        // and check if value already in there
        for (j = 0; j < number_of_unique_elements; j  ) {
            if (arr1[i] == arr2[j]) {
                exists_already = true;
                break; // leave inner loop
            }
        }
        if (!exists_already) {
            arr2[number_of_unique_elements] = arr1[i];
            number_of_unique_elements  ;
        }    
    }
    
    for (i = 0; i < number_of_unique_elements; i  ) {
        printf("%d ", arr2[i]);
    }
    printf("\n");

    return 0;
}

Test run:

$ gcc -Wall numbers.c
$ ./a.out            
Please enter 10 numbers:
1
2
3
4
5
1
2
3
0
5
1 2 3 4 5 0 
$  
  • Related