14,696,571 members
See more:
Hello.I have a problem with a C code.
I want to check if an array contains a number twice or more...

For example, I have an array with a capacity of 20.
With a for loop I give random numbers(between 1 to 20) and store them to this array.But every time the program gives a random number,I check if this number is contained to array (with a do-while).

But every time I recieve a number twice or more...
Τhe rest of the code does not matter.
Ι want help only with check_array(.....) function...

Thanks!!!

What I have tried:

```Code:

int check_array(int *pinakas , int N)
{
int checked = 1;
for(int i = 0; i < N; i++)
{
for(int j = i + 1; j < N; j++)
{
if(*(pinakas + j) == (*(pinakas + i)) )
{
checked = 0;
}
}
}
checked = 1;

void init_array(int *array , int N , int a , int b)
{
srand(time(NULL));
for(int i = 0; i < N; i++)
{
do
{
*(array + i) = a + rand() % (b - a + 1);
}
while(check_array(array , N) == 0);
}
}```
Posted
Updated 22-Jul-20 11:52am
v2
Joe Woodbury 22-Jul-20 14:51pm

Given your requirements, you may want to consider using the Fisher-Yates inside-out shuffle. (https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_%22inside-out%22_algorithm)
Shao Voon Wong 24-Jul-20 23:59pm

I do not see any relevance of your post to OP's question but I want to thank you for the link. Just learned something useful today. Shuffling is something I do quite often in my hobbyist projects. Up to today, mostly doing the naive shuffle. Thanks again!
Joe Woodbury 25-Jul-20 0:06am

It solves the problem he presented; he wants 20 unique random numbers in an array in the range 1 to 20.

(BTW, I got to that link after reading about over-shuffling, which I'd been doing. Here's one: https://www.i-programmer.info/programming/theory/2744-how-not-to-shuffle-the-kunth-fisher-yates-algorithm.html)

## Solution 1

Take out this line from the end of the function:
```checked = 1;
```

And replace it with this:
```return(checked);
}```

Then, look at your code - it's not the check that is wrong now, it's the init_array.
Try this:
```int main()
{
printf("Main started\n");
int arr[100];
init_array(arr, 20, 1, 15);
printf("Init complete\n");
int x = check_array(arr, 20);
printf("%u\n", x);
return 0;
}```
Run you app and look at what you get printed:
`Main started`
Is all you get.
So, why doesn't it exit from init_complete?
Simple: it never gets out of your `do` ... `while` loop, so i never gets increased. And because the array is initialized to zeros, it will automatically find a match every time it tries to check ...

Have a look with the debugger and see if you can see what I mean.
v2

## Solution 2

```int check_array(int *pinakas , int N)
{
int checked = 1;
for(int i = 0; i < N; i++)
{
for(int j = i + 1; j < N; j++)
{
if(*(pinakas + j) == (*(pinakas + i)) )
{
checked = 0;
}
}
}
checked = 1;
// And you plan to return an answer ?

// Looks like the end of function is missing here    ```

## Solution 3

Try a simpler approach. I am not sure why you have a nested for loop to check the array. From your description a single loop is all you need. Here is an alternative function that will check the array :
```int check_array( int array[], int size, int value )
{
int found = 0;
int index;
for( index = 0; index < size; ++n )
{
if( array[ index ] == value )
{
found = 1;    // the value is already in the array
break;
}
}
return found;
}```
This makes it simple - either the value is in the array or it is not and that's all you need from it. Change your other logic to see if the new value is in the array. If it is then ignore it and get another value. If it is not then add it to the array.
```void init_array( int *array , int maxSize, int minVal, int maxVal )
{
int span = maxVal - minVal + 1;
int count = 0;
int newvalue = 0;

srand( time( NULL ) );
while( count < maxSize )
{
// rand() mod span will give values from 0 to 19
// offset it to give values from 1 to 20

newvalue = minVal + ( rand() % span );

if( ! check_array( array, count, newvalue ) )
{
// the new value is not in the array so add it

array[ count ] = newvalue;
++count;
}

// if the new value is not in the array then
// loop back around and get another value
}
}```
v2

## Solution 4

Ok .I found it.I did something else.
I initialize the array with some different values in init_array().
Code:
```for(int i = 0; i < N; i++)
{
*(array + i) = i-N;
printf("%d  ",array[i]);
}
```

and I fixed the problem in check_array() -> return checked (not checked = 1)
Ιt works as I expected.(without repeating random numbers)

I really appreciate it...
Patrice T 22-Jul-20 13:50pm

It looks like you solved the problem.
You can accept your solution, and any other useful solution. It will close the question, and reward helpers.