csunnypl2
asked on
Search for the position of a name in the array using a recursive binary search
I have written a program that takes an array of twenty strings, sorts then in ascending ASCII order using selection sort and then searches for the position of the name in the array using a recursive binary search. Upon compiling I receive the following error message: warning: passing arg 3 of `search' from incompatible pointer type. Can you please help me determine the correct pointer type for the program to compile? The program is to read the strings from a file but I have initalized the array within main for the time being.
The program is as follows:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUMWORDS 20
#define LENWORDS 25
//Prototypes
void displayName (void);
int search (int start, int end, char *words [], const char s[]);
//Main controls the
int main (int argc, char *argv[])
{
FILE *infptr;
char words [NUMWORDS][LENWORDS] =
{"love","mary","had","a"," little","l amb","its" ,"fleece", "was","whi te","as"," snow","itt zy","bittz y","spider ","came"," down","the ","water", "spout"};
int i,j,k;
int currMin=0;
char temp[NUMWORDS];
int result;
char searchWord [LENWORDS];
if (argc <= 1)
{
printf("\nNot enough command line arguments.\n");
}
infptr = fopen (argv [1], "r");
if ((infptr)==NULL)
{
printf("\nERROR: Unable to open data for reading.\n\n");
}
if ((argc>=2) && ((infptr)!=NULL))
{
displayName ();
for (j=0; j < 19; j++)
{
currMin=j;
for (k=j+1; k < 20; k++)
if (strcmp(words[currMin], words[k])>0)
currMin=k;
strcpy(temp, words[currMin]);
strcpy(words[currMin], words [j]);
strcpy(words[j],temp);
}
for (i=0; i < NUMWORDS; i++)
printf ("\n%d: %s", i, words[i]);
printf ("\n\n");
printf("Please enter a word to search (or quit to stop): ");
scanf ("%s", searchWord);
result = search (0, NUMWORDS - 1, words, searchWord);
printf("The word \"%s\"", searchWord);
if (result == -1)
printf ("was not found.\n");
else
printf ("was found at position %d.\n", result);
}
//Format and finish.
printf ("\n");
return 0;
}
//The name of the programmer is displayed.
void displayName (void)
{
printf("\nName: Chandra Parr\n\n");
}
int search (int start, int end, char *words [], const char s[])
{
int middle, cmpRes;
if (start > end)
return (-1);
else if (start == end)
if (strcmp(words[start], s) == 0)
return start;
else
return (-1);
else
{
middle = (start + end) / 2;
cmpRes = strcmp(words[middle],s);
if (cmpRes == 0)
return middle;
else if (cmpRes > 0)
return search(start, middle - 1, words, s);
else
return search (middle + 1, end, words, s);
}
}
The program is as follows:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUMWORDS 20
#define LENWORDS 25
//Prototypes
void displayName (void);
int search (int start, int end, char *words [], const char s[]);
//Main controls the
int main (int argc, char *argv[])
{
FILE *infptr;
char words [NUMWORDS][LENWORDS] =
{"love","mary","had","a","
int i,j,k;
int currMin=0;
char temp[NUMWORDS];
int result;
char searchWord [LENWORDS];
if (argc <= 1)
{
printf("\nNot enough command line arguments.\n");
}
infptr = fopen (argv [1], "r");
if ((infptr)==NULL)
{
printf("\nERROR: Unable to open data for reading.\n\n");
}
if ((argc>=2) && ((infptr)!=NULL))
{
displayName ();
for (j=0; j < 19; j++)
{
currMin=j;
for (k=j+1; k < 20; k++)
if (strcmp(words[currMin], words[k])>0)
currMin=k;
strcpy(temp, words[currMin]);
strcpy(words[currMin], words [j]);
strcpy(words[j],temp);
}
for (i=0; i < NUMWORDS; i++)
printf ("\n%d: %s", i, words[i]);
printf ("\n\n");
printf("Please enter a word to search (or quit to stop): ");
scanf ("%s", searchWord);
result = search (0, NUMWORDS - 1, words, searchWord);
printf("The word \"%s\"", searchWord);
if (result == -1)
printf ("was not found.\n");
else
printf ("was found at position %d.\n", result);
}
//Format and finish.
printf ("\n");
return 0;
}
//The name of the programmer is displayed.
void displayName (void)
{
printf("\nName: Chandra Parr\n\n");
}
int search (int start, int end, char *words [], const char s[])
{
int middle, cmpRes;
if (start > end)
return (-1);
else if (start == end)
if (strcmp(words[start], s) == 0)
return start;
else
return (-1);
else
{
middle = (start + end) / 2;
cmpRes = strcmp(words[middle],s);
if (cmpRes == 0)
return middle;
else if (cmpRes > 0)
return search(start, middle - 1, words, s);
else
return search (middle + 1, end, words, s);
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.