Voxito
Voxito

Reputation: 33

Checking array for identical numbers and their value

As part of a program that I have to make, one of the function that I need to program should check if the array has any identical numbers that are the same, and if one of them is bigger/equals to a given number.

The given number is also the amount of numbers in the array

This is what I have so far:

int checkarray(int *arr, int num)
{
    int check = num;
    int check2 = num;
    int *lor;
    int *poi;
    int *another;

    another = arr;
    lor = arr;
    poi = arr;
    int check3 = num;

    for ( ; num > 1; num--) {

        for ( ; check3 >= 0; check3--) {

            if (*arr == *poi)
                return 0;
            poi++;
        }
        arr++;
        poi = another;
    }

    for ( ; check2 > 0; check2--) {

        if (*lor >= check)
            return 0;
        lor++;
    }
    return 1;
}

I know that I made too many pointers/int for the function, but that's not the problem..

The part of checking for a given value works fine if I'm not mistaken so I think you can ignore that part (that's the last 'for' loop)

I know it should be easy but for some reason I just can't get it to work...

Edit:

I'll give an example: If the array is 0 1 2 3 1 the function will return 0, cause the second and the last number are identical. The function will also return 0 if the given number is 5, and one of the numbers is bigger or equals to 5, for example 0 1 2 5 4.

Otherwise, the function returns 1.

Upvotes: 1

Views: 66

Answers (3)

Heisenberg
Heisenberg

Reputation: 5668

Change your upper for loop to:

  for ( ; num > 0; num--) {
     if(arr[i]>=number){
         return 0;
      }
        int check3 = num;
        poi=arr+1;
        for ( ; check3 > 0; check3--) {
            if (*arr == *poi)
                return 0;
            poi++;
        }
        arr++;
    }

and remove the bottom one.

Upvotes: 1

ganchito55
ganchito55

Reputation: 3607

I create a new array where I'm going to save the numbers so I can check if you have a repeat number in the array. I also have one more argument in the function to know the size of the array.

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

int checkArray(int *arr, int size, int number){
    int i,j;
    int *countArray = calloc(size,sizeof(int));
    for(i=0;i<size;i++){
        if(arr[i]>=number){  //Check >= number
            free(countArray);
            return 0;
        }
        for(j=0;j<i;j++){ //Check repeat number
            if(countArray[j]==arr[i]){
                free(countArray);
                return 0;
            }
        }
        countArray[j]=arr[i]; //no repeat number so we save it.
    }

    free(countArray);
    return -1; //Error

}

int main(){
  int arr[6] = {0,8,2,3,4,1};
  printf("Result %d",checkArray(arr,6,5));

}

I hope this can help you.

Update without new array

int checkArray(int *arr, int size, int number){
    int i,j;
    for(i=0;i<size;i++){
        if(arr[i]>=number){
            return 0;
        }
        for(j=0;j<i;j++){
            if(arr[i]==arr[j]){
                return 0;
            }
        }
    }    
    return -1; //Error    
}

Upvotes: 2

Bishoy
Bishoy

Reputation: 725

The mistakes here are as following:

1- You need to change the lines:

int check3 = num;
for ( ; num > 1; num--) {

to be:

for ( ; num > 1; num --) { 
    int check3 = check; // Move to inside loop to reset each time for a fresh inner loop and use check instead of num to reset the value

2- You need to change the line:

for ( ; check3 >= 0; check3--) {

To be

for ( ; check3 > 0; check3--) { // Because `>=0` means attempting to read past the array

3- poi should be initialised every time in the loop as arr+1 to skip comparing the same member of the array to itself, and to skip re-comparing members more than one time.

I suggest re-writing the method with better code style to enable easier detection of such errors and typos

Upvotes: 0

Related Questions