Write a program to calculate students’ average test scores and their grades

My professor has me writing a program with the following instructions and I'm a little stuck mentally in getting the output to the screen and to a file. Any help is thankful.

Write a program to calculate students’ average test scores and their grades.You may assume the following input data is read from a text file.

Johnson 85 83 77 91 76
Aniston 80 90 95 93 48
Cooper 78 81 11 90 73
Gupta 92 83 30 69 87
Blair 23 45 96 38 59
Clark 60 85 45 39 67
Kennedy 77 31 52 74 83
Bronson 93 94 89 77 97
Sunny 79 85 28 93 82
Smith 85 72 49 75 63

Use three arrays: a one-dimensional array to store the students’ names, a (parallel) two-dimensional array to store the test scores, and a parallel one-dimensional array to store grades. Your program must contain at least the following functions: a function called GetData to read and store data into two arrays, a function called Average that is used to calculate the average test score and grade, and a function called PrintResults to output the results. The student names should be to the left with a width of 10 columns. The test scores should be to the right with a width of 8 columns. Have your program also output the class average on a line after the output. Name the file Grades.cpp


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
#include<iostream>
 #include<fstream>
 #include<string>
 #include<iomanip>
 using namespace std;


 const int MAX = 50;
 // a function called GetData to read and store data into two arrays,
 void GetData(ifstream& infile,string name[],int scores[][5],int& n)
 {
    n = 0;
    int i=0;
    int j=0;
    while(!infile.eof())
    {
    infile >> name[i];
    for(int j=0; j<5; j++)
    infile >> scores[i][j];
    i++;
    }
    n = i;
 }

 char determineGrade(double avg)
 {
 if(avg>=90 && avg<=100)
 return 'A';
 else if(avg>=80 && avg<=89)
 return 'B';
 if(avg>=70 && avg<=79)
 return 'C';
 if(avg>=60 && avg<=69)
 return 'D';
 if(avg>=50 && avg<=59)
 return 'F';
 }

 // a function called Average that is used to calculate the average test score and grade,
 void Average(int a[][5],char grade[],double avg[],int no_of_students)
 {
    for(int i=0; i<no_of_students; i++)
    {
    double sum =0;
        for(int j=0; j<5; j++)
        sum+= a[i][j];
    avg[i] = sum/static_cast<double> (5);
    grade[i] = determineGrade(avg[i]);
    }
 }

 // function called PrintResults to output the results.
 void PrintResults(string name[],double avg[],int scores[][5],char grade[],int n)
 {
 for(int i=0; i<n; i++){
 cout << left << setw(10)<< name[i];
    for(int k=0; k<5; k++)
        cout << right << setw(8) << scores[i][k];
    cout << endl;
 }
 cout << setw(8) <<"Average ";
 for(int i=0; i<n; i++)
     cout << setw(5) << avg[i];
     cout << endl;
 }

 int main()
 {
 // a one-dimensional array to store the students� names,
 string name[MAX];
 // a (parallel) two-dimensional array to store the test scores,
 int scores[MAX][5];
 // a parallel one-dimensional array to store grades.
 char grade[MAX];
 int no_of_students;
 double avg[MAX];

 ifstream infile("StudentData.txt");

 if(!infile)
 {
    cout <<"unable to open file.so exiting from program" << endl;
    return 0;
 }

 GetData(infile, name, scores, no_of_students);
 infile.close();
 Average(scores, grade, avg, no_of_students);
 PrintResults(name,avg,scores,grade,no_of_students);


 return 0;
 }
Last edited on
outfile << printMatrix;
since printmatrix returns nothings you are writing nothing.

you could create another printmatrix function.
pass outfile as a parameter and use it like what your doing with cout.

 
outfile << "Writing this to a file.\n";
You have the logic a little mixed up:
1: GetData() should read the data from the file and store it into the arrays. That's all that it should do.
2: You need to call GetData() from main()
3: average() should compute and store the average and the grade. It should use the arrays that you read in GetData(), rather than reading the data directly.

In good program design each function or method does one logical thing. So GetData() reads the data, period. Then average() computes the averages from the data.
ok I updated my code. Now I get no output that I can see. The screen comes up and goes away. I don't see any file output ether. I paused the program so I should see the CMD screen output.
Last edited on
Hi,

With the determineGrade function, avg is of type double, if it had any of these values for example (89.5, 79.5, 69.5, 59.5) then the grade would be an F. Can you see how there are gaps in the ranges you are testing against? The easiest thing to do, is to cast the avg to an int:

AverageInt = static_cast<int>(avg);

Hope all goes well :+)
It is supposed to be pulling the names and grade values from a file called StudentData.txt

That is the job of the GetData function. Is it formatted right?
Last edited on
When I run your program with the data given I get results, but there is one extra student. The problem is the check for eof in GetData. The tricky part with eof is that hte stream doesn't realize it's hit the end until it tries to read *past* the end. AN easy way to fix this is to change while loop to:
1
2
3
4
5
    while (infile >> name[i]) {
        for (int j = 0; j < 5; j++)
            infile >> scores[i][j];
        i++;
    }


If you aren't seeing the output then try running it from a cmd window.

You still have to display the average and grade. I didn't see anything in the assignment on how this should be done, but here is code to display them in a second table. You could add this to PrintResults:
1
2
3
4
5
6
7
8
9
10
    // Print the average and the grade
    cout << '\n';
    cout << left << setw(10) << "Name";
    cout << setw(8) << "Average";
    cout << setw(4) << "Grade\n";
    for (int i = 0; i < n; i++) {
        cout << left << setw(10) << name[i];
        cout << setw(8) << avg[i];
        cout << setw(4) << grade[i]<< '\n';
    }


The only thing left is the class average.
Topic archived. No new replies allowed.