C25 Answer


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

/* Puzzle C25 -- find the element in an
|                array closest to a particular value
|
|  Return the index of the closest element
|
*/
int linearSearchClosest( int arr[], int size, 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 arr[], int size )
{
  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(int argc, char *argv[])
{
  const int SIZE = 10;
  int x[] = { -5, -3, 0, 6, 4, 16, -3, 0, 7, 9 };
  int loc, target;
  char input[32];
   
  printArray( x, SIZE );
  
  printf("target:");
  scanf("%s", input );
  while ( strcmp( input, "q" ) != 0 )
  {
    target = atoi( input );
    loc = linearSearchClosest( x, SIZE, target );
    printf("Closest element to  %d found at index %d\n",
      target, loc );
    printf("target:");
    scanf("%s", input );
  }
  
  system("pause");	
  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.