I have a homework problem here I've been working on; here is the description:
Write a program that reads a file consisting of students' test scores in the range 0–200. It should then determine the number of students having scores in each of the following ranges: 0–24, 25–49, 50–74, 75–99, 100–124, 125–149, 150–174, and 175–200. Output the score ranges and the number of students. (Run your program with the following input data: 76, 89, 150, 135, 200, 76, 12, 100, 150, 28, 178, 189, 167, 200, 175, 150, 87, 99, 129, 149, 176, 200, 87, 35, 157, 189.)
The following is the program I have made:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
//declaring variables
ifstream myfile("data.txt");
double grades[26];
int i, studentNumber=0;
int score0_24=0, score25_49=0, score50_74=0,
score75_99=0, score100_124=0, score125_149=0,
score150_174=0, score175_200=0;
cout << score150_174 << endl;
//initializing grades array
for(i=0; i<26; i++)
{
grades[i] = 0;
cout << grades[i] << " ";
}
//getting data from text file
for(i=0; i<26; i++)
{
myfile >> grades[i];
cin.ignore(2);
studentNumber++;
}
myfile.close();
//finding number of people for each score range
for(i=0; i<26; i++)
{
if(grades[i] <= 24)
score0_24++;
if(grades[i] >= 25 && grades[i] <= 49)
score25_49++;
if(grades[i] >= 50 && grades[i] <= 74)
score50_74++;
if(grades[i] >= 75 && grades[i] <= 99)
score75_99++;
if(grades[i] >= 100 && grades[i] <= 124)
score100_124++;
if(grades[i] >= 125 && grades[i] <= 149)
score125_149++;
if(grades[i] >= 150 && grades[i] <= 174)
score150_174++;
if(grades[i] >= 175 && grades[i] <= 200)
score175_200++;
}
//outputing results
cout << "Number of students: " << studentNumber << endl;
cout << "0-24: " << score0_24 << endl;
cout << "25-49: " << score25_49 << endl;
cout << "50-74: " << score50_74 << endl;
cout << "75-99: " << score75_99 << endl;
cout << "100-124: " << score100_124 << endl;
cout << "125-149: " << score125_149 << endl;
cout << "150-174: " << score150_174 << endl;
cout << "175-200: " << score175_200 << endl;
return 0;
}
And the file I have, which is in the same folder as this project, is called:
data.txt
And contains the following:
76, 89, 150, 135, 200, 76, 12, 100, 150, 28, 178, 189, 167, 200, 175, 150, 87, 99, 129, 149, 176, 200, 87, 35, 157, 189
When I run the program, it suspends during the for loop where I read data from the file. I've tried doing some cout statements right before and after, and it seems that is the problem.
Help would be appreciated.
I have a few recommendations for you, though you didn't ask :)...
1) Instead of collecting the grades first and then processing them, combine your loops into 1 so as soon as you read the value you do something with it. This removes the need to have your grades
array and about half your code.
2) Instead of hard-coding 26 grades, read from the file until you're at the end:
for(int grade = 0; myFile >> grade; )
{
if(myFile.peek() == ',')
myFile.ignore(); // <--- this is why your version wasn't working (you were calling cin.ignore instead)
// do something with grade here
}
3) Instead of creating 8 counters for 0-24, 25-49, etc, create an array of 8 and use integer math to figure out what index to access.
With those changes you should be able to get this down to 15-20 lines of clean readable code.
**File to read in named test.txt located @ c:\\users\\desktop\\test.txt**
76 89 150 135 200 76 12 100 150 28 178 189 167
200 175 150 87 99 129 149 176
200 87 35 157 189
----------------------------------------------------------
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream infile;
int scores[26] = { 0 };
int scoreCount[8] = { 0 };
infile.open("c:\\users\\desktop\\test.txt");
if (infile)
for (int i= 0; i < 26; i++) { //read file txt into scores array
infile >> scores[i];
if (!infile)
break; }
for (int i = 0; i <= scores[i]; i++) { //index score count into scoreCount array
int index = scores[i] / 25;
if (index >= 0 && index < 8)
scoreCount[index]++;
else if (scores[i] == 200)
scoreCount[7]++; }
int min = 0;
int max = 24;
for (int i = 0; i < 8; i++) { //print ranges & score count
cout << min << " - " << max << " ";
cout << scoreCount[i];
cout << endl;
min += 25;
max += 25;
if (max == 199) max = 200; }
infile.close();
return 0;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.