Thread: Computing Numerical Grade and Letter Grade by reading e textfile and using structures

  1. #1
    Registered User
    Join Date
    Jan 2011
    Posts
    1

    Computing Numerical Grade and Letter Grade by reading e textfile and using structures

    We are tasked to calculate the CFRS (computed final raw score) and letter grade of a student or students by reading a text file and producing the output through another text file.

    The formula for getting the CFRS is
    CFRS = ((classStanding * .40) + CFRS = ((classStanding*.40) + (prelimExam*.10) + (midtermExam*.20) + (prefinalExam*.10) + (finalExam*.20));

    A sample input could be like this:

    Pedro H. Washington
    201010198
    Programming 1
    65 78 33 46 35

    Zeike D. Conan
    201010198
    Web Programming
    34 56 -45 78 100

    Ellen Q. Doley
    201024567
    Data Structures
    76 77 80 35 100

    James Y. Lamar
    201045671
    Philosophy 1
    98 100 89 99 97


    and a sample output is like this:

    Pedro H. Washington
    201010198
    Programming 1
    CFRS: 52
    Letter Grade: F

    Zeike D. Conan
    201010198
    Web Programming
    Alert: No grades lower than 0 or greater than 100.

    Ellen Q. Doley
    201024567
    Data Structures
    CFRS: 86
    Letter Grade: B

    James Y. Lamar
    201045671
    Philosophy 1
    CFRS: 98
    Letter Grade: A



    Now here's my code for this:

    Code:
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    
    double CFRS;
    string letterGrade;
    
    struct student{
           string fullName;
           string idNumber;
           string subjectName;
           double classStanding;
           double prelimExam;
           double midtermExam;
           double prefinalExam;
           double finalExam;
    
    };
    
    double getCFRS(double a, double b, double c, double d, double e){
           CFRS = ((a*.40) + (b*.10) + (c*.20) + (d*.10) + (e*.20)); 
           
           return CFRS;
    }
    
    string getLetterGrade (double CFRS){
                if((CFRS>95)&&(CFRS<=100))
                     letterGrade= "A";
                else if((CFRS>90)&&(CFRS<=95))
                     letterGrade= "B+";
                else if((CFRS>80)&&(CFRS<=90))
                     letterGrade= "B";
                else if((CFRS>70)&&(CFRS<=80))
                     letterGrade= "C";
                else if((CFRS>60)&&(CFRS<=70))
                     letterGrade= "D";
                else
                    letterGrade= "F";     
    }
    
    int main(){
        
        student data;
        int ctr = 0, i, k;
        string grade;
        string blank;
        vector <student> record;
        ifstream gin;
        ofstream gout;
        
        gin.open("students.in.cpp");
        gout.open("students.out.cpp");
        
        if ((gin.is_open())&&(gout.is_open())){
                                               
            while (!gin.eof()){
                  getline (gin, data.fullName);
                  getline (gin, data.idNumber);
                  getline (gin, data.subjectName);
                  getline (gin, grade);
                  
                  istringstream chop(grade);
                  while (chop >> data.classStanding >> data.prelimExam >> data.midtermExam >> data.prefinalExam >> data.finalExam)
                        getline (gin, blank);
                        record.push_back(data);
            }
            for (i = 0; i < record.size(); i++){
                gout << record[i].fullName << endl;
                gout << record[i].idNumber << endl;
                gout << record[i].subjectName << endl;
                
                for (k = i + 1; k < record.size(); k++){
                    if (record[i].idNumber == record[k].idNumber){
                        ctr++;
                        k = record.size();
                    }
                }
                if ((record[i].classStanding<0)||(record[i].classStanding>100)||(record[i].prelimExam<0)||(record[i].prelimExam>100)||
                    (record[i].midtermExam<0)||(record[i].midtermExam>100)||(record[i].prefinalExam<0)||(record[i].prefinalExam>100)||
                    (record[i].finalExam<0)||(record[i].finalExam>100)){
                     gout << "ALERT: There is an invalid grade for this particular student. NOTE: Grades must be 0 to 100 only." << endl << endl;
                }
                else{
                     
                     gout << "CFRS: " << getCFRS(record[i].classStanding,record[i].prelimExam,record[i].midtermExam,
                                                            record[i].prefinalExam,record[i].finalExam) << endl;
                     gout << "Letter Grade: " << getLetterGrade(CFRS) << endl << endl;    
                }
            }
            gout << "Number of Students on this List: " << record.size() - ctr << endl;
        }
        else
            cout << "Error opening file(s). Please check the filename of the textfile." << endl;
        
        gin.close();
        gout.close();
        
        system("PAUSE");
        return 0;
    }

    My problem is, when it comes to the negative integers. It does prints the alert message but the succeeding students who doesn't have any negative grades also post an alert message. It looks like this:

    Pedro H. Washington
    201010198
    Programming 1
    CFRS: 52
    Letter Grade: F

    Zeike D. Conan
    201010198
    Web Programming
    Alert: No grades lower than 0 or greater than 100.

    Ellen Q. Doley
    201024567
    Data Structures
    Alert: No grades lower than 0 or greater than 100.

    James Y. Lamar
    201045671
    Philosophy 1
    Alert: No grades lower than 0 or greater than 100.


    NOTE: we can't use classes, only structures.

    How can I solve this problem guys? I would appreciate any help. Thanks!

  2. #2
    Banned
    Join Date
    Aug 2010
    Location
    Ontario Canada
    Posts
    9,547
    Life++ ... you should do some forum searches, you will find half a dozen student grade threads already posted and I'm sure there's information there that will help...

  3. #3
    -bleh-
    Join Date
    Aug 2010
    Location
    somewhere in this universe
    Posts
    463
    The problem with that code is that getLetterGrade (double CFRS) doesn't return anything.
    Code:
    string getLetterGrade (double CFRS){
      return letterGrade;
    }
    EDIT: structure is a class with public members by default. I guess the assignment just needs C-style struct.
    Last edited by nimitzhunter; 01-29-2011 at 01:18 PM.
    "All that we see or seem
    Is but a dream within a dream." - Poe

Popular pages Recent additions subscribe to a feed