Function error

I am writing a section of code to display the median score, I am receiving a warning that reads. warning C4715: 'findMedian' : not all control paths return a value. And the output for the median is really messed up. I have been at this for a while now and any help would be great. Thanks!

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <vector>
#include <cstdio>
#include <iomanip>
#include <algorithm>

using namespace std;

//Declaring Constants
const int ZERO = 0;
const int ONE_HUNDRED = 100;
double median = 0.00;
double totalPoints;
vector<int> scores;
int size;

double findMedian(vector<int> &scores)
{
	size_t mid = scores.size() / 2;

	if (scores.size() == 0) return 0.0;   // change this to whatever it should be

	// Make scores[mid] the mid'th element
	nth_element(scores.begin(), scores.begin() + mid, scores.end());
	if (size % 2 == 0)
	{
		// size is even.  Need to average of scores[mid] and scores[mid-1]
		nth_element(scores.begin(), scores.begin() + mid - 1, scores.end());
		median = (scores[mid] + scores[mid - 1]) / 2;
	}
	else
	{
		median = scores[mid];
	}
}

int main()
{
	int firstExam, secondExam, thirdExam;
	int error;

	cout << "Dr. DoLittle's Grading Program ..... (by Kirk Kelley)" << endl;
	do
	{
		error = 0;
		cout << "Please enter in the score for the first exam: ";
		cin >> firstExam;
		if (firstExam < 0 || firstExam > 100)
		{
			cout << "Please enter a valid score between 0 and 100" << endl;
			cin >> firstExam;
			cin.clear();
		}
	} while (error);
	do
	{
		error = 0;
		cout << "Please enter in the score for the second exam: ";
		cin >> secondExam;
		if (secondExam < 0 || secondExam > 100)
		{
			cout << "Please enter a valid score between 0 and 100" << endl;
			cin >> secondExam;
			cin.clear();
		}
	} while (error);
	do
	{
		error = 0;
		cout << "Please enter in the score for the third exam: ";
		cin >> thirdExam;
		if (thirdExam < 0 || thirdExam > 100)
		{
			cout << "Please enter a valid score between 0 and 100" << endl;
			cin >> thirdExam;
			cin.clear();
		}
	} while (error);

	//declaring variable
	int homework;

	//initiating loop
	while (!cin.eof())
	{

		homework = EOF;

		cout << "\nEnter score for homework assignment (press Ctrl+Z to quit): ";

		cin >> homework;

		if (!cin.good())
			if (homework == EOF)
				break;
			else
			{
				cout << "\nInvalid Input. Entry must be an integer." << endl;
				cin.clear();
				cin.ignore(std::numeric_limits<streamsize> ::max(), '\n');
			}
		else
		{
			if (homework >= ZERO && homework <= ONE_HUNDRED)
			{
				scores.push_back(homework);
			}
			else
			{
				cout << "\nInvalid Input. Grade must be between 0-100." << endl;
				cin.clear();
				cin.ignore(std::numeric_limits<streamsize> ::max(), '\n');
			}
		}
	}

	median = findMedian(scores);
	
	totalPoints =  median + firstExam + secondExam + thirdExam;

	cout << "The total points earned was " << totalPoints << endl;
	cout << "The median homework score was " << median << endl;
	cout << "The letter calculated letter grade is ";
	system("Pause");
	return 0;
}
 warning C4715: 'findMedian' : not all control paths return a value.


You only return a value from the median function at line 12. In the if/else structure over lines 25 to 34, you calculate a median, but don't return it back to the function call at line 117.
That makes so much sense! thanks for you help. I cannot get it to make a correct median though! I can get it to work with the even numbers but when it is an odd number it still calculates and average. here is my code thus far.

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <vector>
#include <cstdio>
#include <iomanip>
#include <algorithm>

using namespace std;

//Declaring Constants
const int ZERO = 0;
const int ONE_HUNDRED = 100;
double median = 0.00;
double totalPoints;
vector<int> scores;
int size;

double findMedian(vector<int> &scores)
{
	size_t mid = scores.size() / 2;

	if (scores.size() == 0) return 0.0;   // change this to whatever it should be

	// Make scores[mid] the mid'th element
	nth_element(scores.begin(), scores.begin() + mid, scores.end());
	if (size % 2 == 0)
	{
		// size is even.  Need to average of scores[mid] and scores[mid-1]
		nth_element(scores.begin(), scores.begin() + mid - 1, scores.end());
		median = (scores[mid] + scores[mid - 1]) / 2;
	}
	else
	{
		median = scores[mid];
	}
	return median;
}

int main()
{
	int firstExam, secondExam, thirdExam;
	int error;

	cout << "Dr. DoLittle's Grading Program ..... (by Kirk Kelley)" << endl;
	do
	{
		error = 0;
		cout << "Please enter in the score for the first exam: ";
		cin >> firstExam;
		if (firstExam < 0 || firstExam > 100)
		{
			cout << "Please enter a valid score between 0 and 100" << endl;
			cin >> firstExam;
			cin.clear();
		}
	} while (error);
	do
	{
		error = 0;
		cout << "Please enter in the score for the second exam: ";
		cin >> secondExam;
		if (secondExam < 0 || secondExam > 100)
		{
			cout << "Please enter a valid score between 0 and 100" << endl;
			cin >> secondExam;
			cin.clear();
		}
	} while (error);
	do
	{
		error = 0;
		cout << "Please enter in the score for the third exam: ";
		cin >> thirdExam;
		if (thirdExam < 0 || thirdExam > 100)
		{
			cout << "Please enter a valid score between 0 and 100" << endl;
			cin >> thirdExam;
			cin.clear();
		}
	} while (error);

	//declaring variable
	int homework;

	//initiating loop
	while (!cin.eof())
	{

		homework = EOF;

		cout << "\nEnter score for homework assignment (press Ctrl+Z to quit): ";

		cin >> homework;

		if (!cin.good())
			if (homework == EOF)
				break;
			else
			{
				cout << "\nInvalid Input. Entry must be an integer." << endl;
				cin.clear();
				cin.ignore(std::numeric_limits<streamsize> ::max(), '\n');
			}
		else
		{
			if (homework >= ZERO && homework <= ONE_HUNDRED)
			{
				scores.push_back(homework);
			}
			else
			{
				cout << "\nInvalid Input. Grade must be between 0-100." << endl;
				cin.clear();
				cin.ignore(std::numeric_limits<streamsize> ::max(), '\n');
			}
		}
	}

	median = findMedian(scores);
	
	totalPoints =  median + firstExam + secondExam + thirdExam;

	cout << "The total points earned was " << totalPoints << endl;
	cout << "The median homework score was " << median << endl;
	cout << "The letter calculated letter grade is ";
	system("Pause");
	return 0;
}
line 25 - is that supposed to be scores.size() ?
Size doesn't seem to be initialized anywhere.
Size is initialized on line 15.

 
int size;
No. That's a definition. As wildblue stated it is uninitialized. It contains garbage. Therefore the behavior of line 25 is undefined.
Last edited on
Your suggestion answered my problem, I was reading in the wrong variable for size. Thank you wildblue!
Topic archived. No new replies allowed.