Seeking help with Sequential Search Algorithm

Dec 13, 2014 at 7:43pm
The details of the assignment is within the code. Basically its a simulated radio station holding a number guessing contest. 20 numbers were "randomly selected" and stored in a text file. The sequential search algorithm is to find the number (obviously), but I am stuck at this point... could someone give me a nudge to get me rolling again please?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<iostream>
#include<fstream>

using namespace std;

int sequenSrch(int&, int&);
int guess();

int main()
{
	cout << "This program simulates a radio station that asks the caller to guess a number.\n";
	cout << "The number is compared against a list of 20 numbers between 1 and 500 inclusive.\n";
	cout << "The contest is held until a number has been matched or a value of - 1 is entered.\n";
	cout << "A message is displayed containing the winning number, the location in the list of numbers,";
	cout << " the number of calls made, and the amount of the prize.";

	int num = 20;
	int size = 0;
	int first, x;
	int* prizeArray = new int[num];
	int location;
	
	location = sequenSrch(); // Not sure what to pass here...?

	ifstream prizeList;
	
	prizeList.open("prizeList.txt");
	while (prizeList >> x)
	{
		if (size == num)
		{
			int* newPrizeArray = new int[2 * num];

			for (first = 0; first < size; first++)
			{
				newPrizeArray[first] = prizeArray[first];
			}
			delete[] prizeArray;
			prizeArray = newPrizeArray;
			num *= 2;
		}
		prizeArray[size] = x;
		size++;
	}
	prizeList.close();

	guess();
	;

	return 0;
}

int sequenSrch(int newPrizeArray[20], int value)
{
	int i = 1, results = 0;
	bool found = false;
	
	while (!found && i < newPrizeArray[20])
	{
		if (newPrizeArray[i] == value)
		{
			found = true;
			results = i;
		}
		cout << guess() << " is not in the list. Call again.\n";
		i++;
	}
	return results;
}

int guess()
{
	int guess;

	cout << "Hello caller. What number between 1 and 500 are you guessing?\n";
	cin >> guess;

	return guess;
}
Dec 14, 2014 at 8:22am
* Remove all occurrences of newPrizeArray from your code.

* Change prizeArray from a regular plain C style array to a std::vector<int>.

* Pass the prizeArray by const reference to sequenSrch().

* Remove the while loop in main() and replace it with std::copy(std::istream_iterator<int>{prizeList}, std::istream_iterator<int>{}, std::back_inserter(prizeArray). You will have to #include <iterator> and #include <algorithm> .

This will reduce the size of your code substantially making it easier to read and understand.
Last edited on Dec 14, 2014 at 8:31am
Dec 14, 2014 at 3:39pm
I haven't learned about vector< > just yet. I re-coded most of main and re-coded sequenSrch() here is what I came up with.... still not complete but closer (I think)...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
	const int x = 20;
	int y;
	int prizeArray[x];
	
	ifstream prizeList;
	
	prizeList.open("prizeList.txt");
	for (y = 0; y < x && prizeList >> prizeArray[y]; y++);
	prizeList.close();

	guess();
	sequenSrch(); //"+3 overloads"... not sure what to pass (still)

	return 0;
}

int sequenSrch(const int prizeArray[], int arrayLength, int searchedItem)
{
	int location;
	bool found = false;
	location = 0;
	
	while (location < arrayLength && !found)
	if (prizeArray[location] == searchedItem)
		found = true;
	else
		cout << guess() << " is not in the list. Call Again.\n";
		location++;

	if (found)
		return location;
	else
		return -1;
}
Dec 14, 2014 at 10:33pm
Here is what I have now:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<iostream>
#include<fstream>

using namespace std;

int sequenSrch(const int prizeArray[], int arrayLength, int searchedItem);
int guess();

int main()
{
	cout << "This program simulates a radio station that asks the caller to guess a number.\n";
	cout << "The number is compared against a list of 20 numbers between 1 and 500 inclusive.\n";
	cout << "The contest is held until a number has been matched or a value of - 1 is entered.\n";
	cout << "A message is displayed containing the winning number, the location in the list of numbers,";
	cout << " the number of calls made, and the amount of the prize.";

	const int x = 20;
	int fillArray;
	int prizeArray[x];
	int callerNum = 1;

	ifstream prizeList;
	
	prizeList.open("prizeList.txt");
	for (fillArray = 0; fillArray < x && prizeList >> prizeArray[fillArray]; fillArray++);
	prizeList.close();

	int guessNum = guess();
	int loc = sequenSrch(prizeArray, fillArray, guessNum);
	
	
	while (guessNum != loc)
	{
		guess();
		callerNum++;
	}
		cout << "Congratulations. Your number " << guessNum << " was found at location " << loc;
		cout << " of the list.\n";
		cout << "Counting you, there were " << callerNum << " callers.You win $10, 000!\n";

	return 0;
}

int sequenSrch(const int prizeArray[], int arrayLength, int searchedItem)
{
	int location;
	bool found = false;
	location = 0;
	
	while (location < arrayLength && !found)
	if (prizeArray[location] == searchedItem)
		found = true;
	else
		location++;

	if (found)
		return location;
	else
		return -1;
}

int guess()
{
	int guess;

	cout << "\nHello caller. What number between 1 and 500 are you guessing?\n";
	cin >> guess;

	return guess;
}


I keep getting an infinite loop that keeps asking for the guess or an infinite scrolls the console until I exit. My head is about to explode from looking at this simple program that I just cannot seem to figure out.
Dec 15, 2014 at 12:36pm
After you assign the return value of sequenSrch(prizeArray, fillArray, guessNum) to loc print out the value of loc to see what it is.

You are getting an infinite loop because the each time you call guess() the return value is never equals to loc.

The bug might be somewhere in sequenSrch(), those if and else statements look suspicious to me.
Last edited on Dec 15, 2014 at 12:39pm
Dec 15, 2014 at 2:51pm
That block of code works just fine. I did output it before I started writing the loop to see if it was working correctly and it was. But I'll look harder at the loop within main.
Dec 15, 2014 at 3:06pm
The infinite loop problem is from line 34 of your code. This is because you did not capture the value returned by guess, so as soon as execution enters that while loop, it stays there forever because your condition will never change.

The condition you are using is also wrong because say one of the numbers in the list was 100 and your list happens to contain 100, the sequenSrch function will return the location of 100 but since your list only contains 20 numbers, the program will still say that the user guessed wrong. A better condition will be:

while (loc == -1) {...}

Also your search loop could be condensed to just:
1
2
3
4
5
for (int v = 0; v < arrayLength; v++) {
    if (prizeArray[v] == searchedItem)
	return v;
}
return -1
Last edited on Dec 15, 2014 at 3:06pm
Dec 15, 2014 at 3:46pm
Things that make me go "hmmm..." The search loop was a mirror image of that in my book, that is why it is the way it is. But I like your suggestion better because it is condensed. I have since figured this whole thing out by changing the while loop to display if the guessed number is incorrect. Then I used if the number guessed is in the list.... display winner message, else the number entered was -1 so terminate. I really appreciate all the input. You guys have helped me out a bunch!
Topic archived. No new replies allowed.