Answer DC25

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

/* Puzzle D25 -- find the element in an
|                array closest to a particular value
|
|  Return the index of the closest element
|
*/
int linearSearchClosest( int size, int arr[], int target )
{
  int j;
  
  /* Closest difference, so far, and index of that elemetn */
  int closeDiff, closeInx;
  int diff;
  
  /* Closest element so far is element zero */ 
  closeDiff = arr[0] - target;
  if ( closeDiff < 0 ) closeDiff = -closeDiff;
  closeInx = 0;

  /* Search for a smaller difference amoung the remaining elts */
  for ( j=1; j < size; j++ )
  {
    /* Difference between the target and element j */
    diff = arr[j] - target;
    if ( diff < 0 ) diff = -diff;

    if ( diff < closeDiff )
    {
      closeDiff = diff;
      closeInx = j;
    }
  }
  
  return closeInx;
}

void printArray( int size, int arr[] )
{
  const int N = 10;
  int j;
  
  for ( j=0; j < size; j++ )
  {
    if ( j%N == N-1 )
      printf("%4d\n", arr[j] );
    else
      printf("%4d ", arr[j] );    
  }
}

int main()
{
  const int SIZE = 10;
  int x[] = { -5, -3, 0, 6, 4, 16, -3, 0, 7, 9 };
  int loc, target;
  char input[32];
   
  printArray( SIZE, x );
  
  printf("target:");
  scanf("%s", input );
  while ( strcmp( input, "q" ) != 0 )
  {
    target = atoi( input );
    loc = linearSearchClosest( SIZE, x, target );
    printf("Closest element to  %d found at index %d\n", target, loc );
    printf("target:");
    scanf("%s", input );
  }
   	
  return 0;
}

Comments: The user interaction in the testing program could be improved. As it is, if the user enters a non-numeric string other than exactly "q", the program continues, the function atoi() returns a zero, and zero is used as a target.

Try to improve the testing program, if you want.



Back to Puzzle Home