#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.