While Loop Issue

My program needs to:
(A) Read 2 names from a file (For each name, there are 5 scores)
(B) Omit the lowest/highest scores
(C) Find the average of the 3 scores
(D) Write the name and average score to a new file

Note: The first line is simply the number of people.

Here is what it needs to read:
2
Jennifer 10 9 8 9.5 10
Michael 10 9 10 9 10

Here is what it needs to write:
Jennifer 9.50
Michael 9.67

My issues are:
(A) The loop keeps outputting the last line (10) instead of continuing to the Michael line
(B) Variables will not write to file


Note: My main concern right now is the A, but if you could help me out with B, then I will pronounce you as a Jedi master!
Note: I cannot use arrays, so please do not comment on how this program could be made more simple..

Here is my code (Run it first to see what I mean by A):
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
//*****************************************************
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#include <iostream>
#include <fstream>
#include <string>
using namespace std;                               
//----------------------------------------------------
// FUNCTION PROTOTYPE(S)
void getJudgeData(double &, ifstream &);
void calcScore(double,double,double,double,double,ifstream &,string);
int findLowest(double,double,double,double,double);
int findHighest(double,double,double,double,double);
string contestantName(ifstream &);
//----------------------------------------------------
int main()
{
	int i=0;
	int i2=0;
	double score,score1,score2,score3,score4,score5;
	int contestantCount;
	string name;
	ifstream iFile("starsearch.dat");
	if (iFile)
	{
		iFile>>contestantCount;
		// For each contestant
		while(i<contestantCount)
		{
			i2=0;
			// For each contestants line (Name-5th score)
			while(i2<6)
			{
				if(i2==0)
				{
					name=contestantName(iFile);
				}
				getJudgeData(score,iFile);
				if(i2==1)
				{
					score1=score;
				}
				if(i2==2)
				{
					score2=score;
				}
				if(i2==3)
				{
					score3=score;
				}
				if(i2==4)
				{
					score4=score;
				}
				if(i2==5)
				{
					score5=score;
				}
				i2++;
			}
			calcScore(score1,score2,score3,score4,score5,iFile,name);
			i++;
		}
	} 
	else
	{
		cout<<"Error: Error: File Could Not Be Opened.";
	}
	cout<<"\n";
	// Pause for Ms. Thomas
	system("Pause");
	return 0;
}
//----------------------------------------------------
string contestantName(ifstream &fObject)
{
	string name;
	fObject>>name;
	cout<<name<<"\n";
	return name;
}
//----------------------------------------------------
void getJudgeData(double &score,ifstream &fObject)
{
	fObject>>score;
	cout<<score<<"\n";
}
//----------------------------------------------------
void calcScore(double score1,double score2,double score3,double score4,double score5,ifstream &,string name)
{
	double average=0;
	int lowest, highest;
	ofstream oFile("results.dat");
	if (oFile)
	{
		lowest=findLowest(score1,score2,score3,score4,score5);
		highest=findHighest(score1,score2,score3,score4,score5);
		if(lowest==1)
		{
			if(highest==2)
			{
				average=(score3+score4+score5)/3;
			}
			if(highest==3)
			{
				average=(score2+score4+score5)/3;
			}
			if(highest==4)
			{
				average=(score2+score3+score5)/3;
			}
			if(highest==5)
			{
				average=(score2+score3+score4)/3;
			}
		}
		if(lowest==2)
		{
			if(highest==1)
			{
				average=(score3+score4+score5)/3;
			}
			if(highest==3)
			{
				average=(score1+score4+score5)/3;
			}
			if(highest==4)
			{
				average=(score1+score3+score5)/3;
			}
			if(highest==5)
			{
				average=(score1+score3+score4)/3;
			}
		}
		if(lowest==3)
		{
			if(highest==1)
			{
				average=(score2+score4+score5)/3;
			}
			if(highest==2)
			{
				average=(score1+score4+score5)/3;
			}
			if(highest==4)
			{
				average=(score1+score2+score5)/3;
			}
			if(highest==5)
			{
				average=(score1+score2+score4)/3;
			}
		}
		if(lowest==4)
		{
			if(highest==1)
			{
				average=(score1+score2+score5)/3;
			}
			if(highest==2)
			{
				average=(score1+score3+score5)/3;
			}
			if(highest==3)
			{
				average=(score1+score2+score5)/3;
			}
			if(highest==5)
			{
				average=(score1+score2+score3)/3;
			}
		}
		if(lowest==5)
		{
			if(highest==1)
			{
				average=(score2+score3+score4)/3;
			}
			if(highest==2)
			{
				average=(score1+score3+score4)/3;
			}
			if(highest==3)
			{
				average=(score1+score2+score4)/3;
			}
			if(highest==4)
			{
				average=(score1+score2+score3)/3;
			}
		}
		oFile<<name<<"="<<average<<"\n";
	}
	else
	{
		cout<<"Error: Error: File Could Not Be Opened.";
	}
	oFile.close();
}
//----------------------------------------------------
int findLowest(double score1,double score2,double score3,double score4,double score5)
{
	double lowest=score1;
	int indicator=1;
	if(score2<lowest)
	{
		lowest=score2;
		indicator=2;
	}
	if(score3<lowest)
	{
		lowest=score3;
		indicator=3;
	}
	if(score4<lowest)
	{
		lowest=score4;
		indicator=4;
	}
	if(score5<lowest)
	{
		lowest=score5;
		indicator=5;
	}
	return indicator;
}
//----------------------------------------------------
int findHighest(double score1,double score2,double score3,double score4,double score5)
{
	double highest=score1;
	int indicator=1;
	if(score2>highest)
	{
		highest=score2;
		indicator=2;
	}
	if(score3>highest)
	{
		highest=score3;
		indicator=3;
	}
	if(score4<highest)
	{
		highest=score4;
		indicator=4;
	}
	if(score5<highest)
	{
		highest=score5;
		indicator=5;
	}
	return indicator;
}
//***************************************************** 
The problem is that you call both contestantName and getJudgeData when i=0 (notice how getJudgeData is called outside an if statement on line 37), so you throw off the positioning, and when i = 6, it's trying to store "Michael" in a double. You could add another if-statement to resolve this problem:

1
2
3
4
if ( i2 > 0)
{
    getJudgeData( iFile );
}


As far as storing in a separate file, you're going to have to open your results file with the option of appending, otherwise your Jennifer data will be overwritten with your Michael data.
Check it out here: http://www.cplusplus.com/reference/fstream/ofstream/open/

And if I may add some advice to coding this project, you have a lot of redundant code with your if-statements. You'd get the same done in a much fewer lines in the calcScore function if:
(1) You summed all the scores together first.
(2) Had find highest/lowest return the actual high/low number.
(3) Subtract those returned values from your sum.
(4) Then divided by three.
Something like this:
1
2
3
//inside calcScore
int sum = score1 + score2 + score3 + score4 + score5 - findHighest() - findLowest();
double average = sum / 3.0;


You wouldn't need nested if-statements then.
it can be done much smaller way, such as,
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
#include <iostream>
#include <fstream>
using namespace std;

double average3 (double a, double b, double c, double d, double e);

int main()
{
	ifstream infile ("inf.txt");
	ofstream outfile ("outf.txt");
	
	if( !infile.is_open() || !outfile.is_open() )
		{
			cout << "cant open files";
			exit(-1);
		}
	else cout << "processing file" << endl;
		
	string name;
	double a, b, c, d, e, avg;
	int n;
	infile >> n;
	for (int i=1;i<=n; i++)
	{
		infile >> name;
		infile >> a >> b >> c >> d >> e;
		avg = average3 (a,b,c,d,e);
		outfile << name << " " << avg << endl;
		cout << name << " " << avg << endl;
	}
	   
    infile.close();
    outfile.close();
    cout <<"\nsucessfully done!\n";
    
    return 0;
}

double average3 (double a, double b, double c, double d, double e)
{
	int min;
   min = a;
   min = min<=b ? min:b;
   min = min<=c ? min:c;
   min = min<=d ? min:d;
   min = min<=e ? min:e;   
   
    int max;
   max = a;
   max = max>=b ? max:b;
   max = max>=c ? max:c;
   max = max>=d ? max:d;
   max = max>=e ? max:e;
   
   return (a+b+c+d+e-min-max)/3;
}
Thanks guys, I figured it out. I figured out that the positioning of line 37 is the problem to A. I copied that function call, removed it, then pasted it in each if statement in that loop. For example, on the line "if (i2==1)" following the curly brace I would put the function call before the line "score1=score". This outputted exactly what I wanted to see.

For B, after I got the last issue to work, the file only read the last person with accompanying score to be outputted. I found that this was caused by each function call to "calcScore" being a fresh file write. I fixed this by simple doing the open/close in the main function (outside of the loop's scope) and passing it as an referenced variable to the function so it would stay open until I was done with it.
Topic archived. No new replies allowed.