hello someone out there...help me with algorithm to determine range of marks!!

here is my code so far

#include <iostream>                            
#include <fstream>                             
#include <string>                              
#include <iomanip>  

struct stumarks
{
    int studentid;                             
    int progassn;                              
    int lab;
    int test;
    int exam;                                  
    char seperator;
    double finalmark;
   
       
 }
stumarks[9];                                   

using namespace std;                           

int main()                                     
{                                              
      

    
    ifstream inFile;                                   
    ofstream outFile;                                  

        
    inFile.open("datafile.txt");               

    if (!inFile)                               
    {                                          
        cout << "Cannot open input file. "
             << "Program terminates!" << endl; 
        return 1;                               
    }                                          
       
           outFile.open("datafile.out");              

    int i;
    
    

    inFile >>stumarks[i].studentid >>stumarks[i].seperator>>stumarks[i].progassn
           >>stumarks[i].seperator>>stumarks[i].lab
           >>stumarks[i].seperator
           >>stumarks[i].test>>stumarks[i].seperator
           >>stumarks[i].exam;  
  
  /* while (inFile)                                     
    {             
        cout <<stumarks[i].studentid<<' '
             <<stumarks[i].progassn<<' '
             <<stumarks[i].lab<<' '
             <<stumarks[i].test<<' '
             <<stumarks[i].exam<<endl;
        

        inFile >>stumarks[i].studentid >>stumarks[i].seperator>>stumarks[i].progassn
           >>stumarks[i].seperator>>stumarks[i].lab
           >>stumarks[i].seperator
           >>stumarks[i].test>>stumarks[i].seperator
           >>stumarks[i].exam;    
    } */                                 
cout<<endl;
cout<<"\n\n\n\n";
    outFile << endl; 
    
  
            
            cout<<"\t"<<setw(10)<<"ProgaAssn"<<"\t"<<"Lab"<<setw(3)<<"\t"<<"Test"<<"\t"<<"Exam"<<endl;
            const int arraysize=11;
            int grade[arraysize]={stumarks[i].studentid,stumarks[i].progassn,stumarks[i].lab,stumarks[i].exam};
            for (int j=0; j<arraysize; j++)
            {
                inFile >>stumarks[i].studentid >>stumarks[i].seperator>>stumarks[i].progassn
           >>stumarks[i].seperator>>stumarks[i].lab
           >>stumarks[i].seperator
           >>stumarks[i].test>>stumarks[i].seperator
           >>stumarks[i].exam;    
           
                if(j>0||j<19){
                cout<<"0-19";
                
                break;}
                
                if (j>19||j<39){
                cout<<"20-39";
                
                break;}
                
                if (j>39 || j<59){
                cout<<"40-59";
                break;}
                
                if (j>59 || j<79){
                cout<<"60-79";
                break;}
                
                if (j>79 || j<=100){
                cout<<"80-100";
                break;}
           
                }
                   
    cout<<endl;
    cout<<"\n\n\n"; 
                          
               cout<<setw(4)<<"ID"
                   <<"   "<<"ProgAssn"
                   <<"   "<<"LabExer"
                   <<"   "<<"Test"
                   <<"   "<<"Exam"
                   <<"   "<<"Final Mark"<<endl;                          
 while(inFile)  
      {  stumarks[i].finalmark=(stumarks[i].progassn*0.1+stumarks[i].lab*0.1+stumarks[i].test*0.2+stumarks[i].exam*0.6);
             
        cout <<stumarks[i].studentid<<' '
             <<"   "<<stumarks[i].progassn
             <<"         "<<stumarks[i].lab
             <<"      "<<stumarks[i].test
             <<"     "<<stumarks[i].exam
             <<"      "<<setprecision(2)<<stumarks[i].finalmark<<endl; 
        

        inFile >>stumarks[i].studentid >>stumarks[i].seperator>>stumarks[i].progassn
           >>stumarks[i].seperator>>stumarks[i].lab
           >>stumarks[i].seperator
           >>stumarks[i].test>>stumarks[i].seperator
           >>stumarks[i].exam;    
    
    }       
                 

    inFile.close();                                    
    outFile.close();                                   

system("pause");
    return 0;                                          
}

my problem is to ouput the range of marks between 0-19,20-39, xtra...

i can't figure out the algorithm... it bother me since yesterday...i can't help it...teach me...range of marks algotrithm....

oh yeah. the data file is as follows:

123451,66,75,70,80
123452,39,22,35,55
123453,5,5,20,30
123454,45,33,48,70
123455,77,85,60,40
123461,90,86,88,96
123462,80,90,80,85
123463,55,63,58,65

should be 50 students but i just minimize it to 8 so that i could see the way this program works....all explaination and help are welcome...and don't give me da direct code....

something like that but...what i meant was

something that would look like this:

Assng     Lab   Test    Exam
0-19   1        1      0       0
20-39  0        1      1       0

and so on...(i want the output to be like this)

notice that only 1 student got marks between 0-19 for the assngment, lab and the test and exam is above that range....

123451,66,75,70,80
123452,39,22,35,55
123453,5,5,20,30 <<----this particular student here....
123454,45,33,48,70
123455,77,85,60,40
123461,90,86,88,96
123462,80,90,80,85
123463,55,63,58,65

so u get what i'm trying to find?? it's confusing me...it's the number of student that i need to be in a particular range..

Edited 6 Years Ago by mrar85: n/a

I will be decisive and assume that you need the number of A's, B's, C's, D's, and F's for the assignment, lab, test, and exam. A's will be 100% to 90%, B's, will be 89% to 80%, C's will be 79% to 70%, D's will be 69% to 60%. F's will be below 60%:

int get_grade(studmarks& s, char& test)
{
     //test: A = assignment, L = lab, T = test, E = exam

     int grade = 0;

     switch(test)
     {
          case 'A':  grade = s.progassn / 10;  break;
          case 'L':  grade = s.lab  / 10;      break;
          case 'T':  grade = s.test / 10;      break;
          case 'E':  grade = s.exam / 10;      break;
     }

     switch(grade)
     {
          case 10:
          case  9:  return 0;     break;
          case  8:  return 1;     break;
          case  7:  return 2;     break;
          case  6:  return 3;     break;
          default:  return 4;     break;
     }
}

int grades[5];  // A's = [0], B's = [1], C's = [2], D's = [3], F's = [4]

 inFile    >>stumarks[i].studentid >>stumarks[i].seperator>>stumarks[i].progassn
           >>stumarks[i].seperator>>stumarks[i].lab
           >>stumarks[i].seperator
           >>stumarks[i].test>>stumarks[i].seperator
           >>stumarks[i].exam;

//Populate grade statistics
grades[get_grade(stumarks[i].progassn, A)]++;
grades[get_grade(stumarks[i].lab,  L)]++;
grades[get_grade(stumarks[i].test, T)]++;
grades[get_grade(stumarks[i].exam, E)]++;

Edited 6 Years Ago by Clinton Portis: n/a

Administrator locked out my edit:

I will be decisive and assume that you need the number of A's, B's, C's, D's, and F's for the assignment, lab, test, and exam. A's will be 100% to 90%, B's, will be 89% to 80%, C's will be 79% to 70%, D's will be 69% to 60%. F's will be below 60%:

int get_grade(int& grade, char& test)
{    
     //test: A = assignment, L = lab, T = test, E = exam

     grade /= 10;

     switch(grade)
     {
          case 10:
          case  9:  return 0;     break;
          case  8:  return 1;     break;
          case  7:  return 2;     break;
          case  6:  return 3;     break;
          default:  return 4;     break;
     }
}

int grades[5];  // A's = [0], B's = [1], C's = [2], D's = [3], F's = [4]

 inFile    >>stumarks[i].studentid >>stumarks[i].seperator>>stumarks[i].progassn
           >>stumarks[i].seperator>>stumarks[i].lab
           >>stumarks[i].seperator
           >>stumarks[i].test>>stumarks[i].seperator
           >>stumarks[i].exam;

//Populate grade statistics
grades[get_grade(stumarks[i].progassn, A)]++;
grades[get_grade(stumarks[i].lab,  L)]++;
grades[get_grade(stumarks[i].test, T)]++;
grades[get_grade(stumarks[i].exam, E)]++;

Edited 6 Years Ago by Clinton Portis: n/a

thanx, but i don't want to categorize the students in range of A or B or C just a in range of 0-19, 20-39 ...and so on..but i don't really understand your method in categorize the students in range A , B or c...can you explain the algorithm...?

and oh yeah...what is the ouput? i can't seem to figure out your function...

This is your program... i'm just trying to figure out your algorithm
......

#include <iostream>                            
#include <fstream>                             
#include <string>                              
#include <iomanip>  

struct stumarks
{
    int studentid;                             
    int progassn;                              
    int lab;
    int test;
    int exam;                                  
    char seperator;
    double finalmark;
   
       
 }
stumarks[9];
int get_grade(int&, char&);                                   

using namespace std;                           

int main()                                     
{                                              
    
    ifstream inFile;                                   
    ofstream outFile;     
    int i;    
    char A,L,T,E;                         

        
    inFile.open("datafile.txt");               

    if (!inFile)                               
    {                                          
        cout << "Cannot open input file. "
             << "Program terminates!" << endl; 
        return 1;                               
    }                                          
       
           outFile.open("datafile.out");  
       

int grades[5];  // A's = [0], B's = [1], C's = [2], D's = [3], F's = [4]

 inFile    >>stumarks[i].studentid >>stumarks[i].seperator>>stumarks[i].progassn
           >>stumarks[i].seperator>>stumarks[i].lab
           >>stumarks[i].seperator
           >>stumarks[i].test>>stumarks[i].seperator
           >>stumarks[i].exam;

//Populate grade statistics
cout<<grades[get_grade(stumarks[i].progassn, A)]++<<endl;
cout<<grades[get_grade(stumarks[i].lab,  L)]++<<endl;
cout<<grades[get_grade(stumarks[i].test, T)]++<<endl;
cout<<grades[get_grade(stumarks[i].exam, E)]++<<endl; 

system("pause");
return 0;
}
int get_grade(int& grade, char& test)
{    
     //test: A = assignment, L = lab, T = test, E = exam

     grade /= 10;

     switch(grade)
     {
          case 10:
          case  9:  return 0;     break;
          case  8:  return 1;     break;
          case  7:  return 2;     break;
          case  6:  return 3;     break;
          default:  return 4;     break;
     }
}

it just give me weird numbers...

I just threw some code your way to get you started.. maybe jog some of them brain cells. I purposely did not finish your assignment.

This was my thought process (although somewhat impaired after just comming back from a fresh concert last night featuring Axe Murder Boyz opening up for ABK):

1. create a counter that will hold student's test performance based on 5 test ranges: 0-29, 30-49, 50-69, 70-89, and 90-100. Each second-dimension element will serve as a 'counter' of how many test results qualified for each range:

//First  Dimension: [0] is the assignment, [1] is lab, [2] is test, and [3] is exam
//Second Dimension: [0] is 0-29, [1] is 30-49, [2] is 50-69, [3] is 70-89 and [4] is 90 to 100

int ranges[4][5];  

//to make our array easier to read, i'll also do the following quick little trick:
//assign = 0, lab = 1, test = 2, and exam = 3

enum{assign, lab, test, exam};

2. Now that I got a counter, I needed a function that I could plug in test information and will return which element of ranges[][] to populate:

int get_range(int& grade)
{
     if(grade < 30)
     {
          //increment ranges[][0]
          return 0;    
     }
     else if(grade >= 30 && grade <= 49)
     {
          //increment ranges[][1]
          return 1;
     }
     else if(grade >= 50 && grade <= 69)
     {
          //increment ranges[][2]
          return 2;
     }
     else if(grade >= 70 && grade <= 89)
     {
          //increment ranges[][3]
          return 3;
     }
     else
     {
           //Anything else must be in the 90-100 range
           //increment the ranges[][4] counter
           return 4;
     }
}

3. Now that we have some useful tools at our disposal, we can keep a counter of ranges (you'd probably do this in the same loop when you read in your file):

//The get_range() function returns the proper element of the ranges[][] counter to increment:
ranges[assign][get_range(stumarks[i].progassn)]++;
ranges[lab][get_range(stumarks[i].lab)]++;
ranges[test][get_range(stumarks[i].test)]++;
ranges[exam][get_grade(stumarks[i].exam)]++;

4. Now you can display ye' data with great ease:

cout << "assignment" << "    lab" << "    test" << "    exam";
cout << "0-29      " << rages[assign][0] << ranges[lab][0] << ranges[test][0] << ranges[exam][0];
cout << "30-49     " << rages[assign][1] << ranges[lab][1] << ranges[test][1] << ranges[exam][1];
cout << "50-69     " << rages[assign][2] << ranges[lab][2] << ranges[test][2] << ranges[exam][2];
cout << "70-89     " << rages[assign][3] << ranges[lab][3] << ranges[test][3] << ranges[exam][3];
cout << "90-100    " << rages[assign][4] << ranges[lab][4] << ranges[test][4] << ranges[exam][4];

In summary, this is probably one of many many ways to get your assignment done. I usually like to throw code your way until you can pick up and run with it instead of someone spoon feeding you the answer. One bad thing I forgot to do is to initialize the ranges[][] array to ensure every element is zero.

Edited 6 Years Ago by Clinton Portis: n/a

while(inFile)
{
  inFile >>stumarks[i].studentid >>stumarks[i].seperator>>stumarks[i].progassn
           >>stumarks[i].seperator>>stumarks[i].lab
           >>stumarks[i].seperator
           >>stumarks[i].test>>stumarks[i].seperator
           >>stumarks[i].exam; 
   
//The get_range() function returns the proper element of the ranges[][] counter to increment:
ranges[assign][get_range(stumarks[i].progassn)]++;
ranges[lab][get_range(stumarks[i].lab)]++;
ranges[test][get_range(stumarks[i].test)]++;
ranges[exam][get_range(stumarks[i].exam)]++;
}

thx..appreciate it...by the way...can u give me some website or references so that i can tackle questions like this...i need to do a lot more programming bout this kind of thing . i need to practice lots more...i don't want to be spoon feed...:(

The Complete Code :

#include <iostream>                            
#include <fstream>                             
#include <iomanip> 

using namespace std;      

class marks
{
public:

       void read_data();//function to check if datafile is available or not       
       void sort_range();//function to sort the marks into a certain range
       void range_display();//function to ouput the range of marks      
       void display_result();//function to display result for the final marks  
       
private:
         
        enum {student_assignment, student_labexercise, student_test, student_exam};
        //The use of enumerator where sets student_assignment=0, student_labexercise=1,
        //student_test=2, and student_exam=3
        //This is to make the array easier to read 
        int range_marks(int);//function to calculate range of marks
        double calculate_finalmark(double&);//function to calculate the final marks
        
};
//global variable            
int student_id[50],assignment_marks[50],lab_marks[50],test_marks[50],exam_marks[50]; //arrays of 50 student                                
char seperator[50];//This is to read the comma that is a character in the data file

int student_count;       //A global variable to count a number of students in an array
             
const int first_dim=4;       //First  Dimension: [0] is the Assignment, [1] is Lab, [2] is Test, and [3] is Exam
const int second_dim=5;      //Second Dimension: [0] is 0-19, [1] is 20-39, [2] is 40-59, [3] is 60-79 and [4] is 80 to 100
int ranges[first_dim][second_dim]={0};           //initialize array to 0


int main()                                     
{                                              
      marks student;//instantiate object "student" of class marks
                   
             student.read_data();        //to check if the datafile is available for the compiler to read or not.
             student.sort_range();       //read from data file and sort the range of marks  
             student.range_display();    //ouput the range of marks for a calculated number of student        
             student.display_result();   //display final marks result
                
    system("pause");
    return 0;                                          
}

//function to check if datafile is available or not
void marks::read_data()
{
         
    ifstream inFile;                                   
    ofstream outFile; 
   
        
    inFile.open("datafile.txt");               

    if (!inFile)                               
    {                                          
        cout << "Cannot open input file. "
             << "Program terminates!" << endl; 
        return ;                               
    }                                          
       
           outFile.open("datafile.out");  
   
   inFile.close();                                    
   outFile.close(); 
    return;
}                                              

//function to calculate the range of marks
int marks::range_marks(int student_marks)
{
    if(student_marks < 19)
     {     
           //increment ranges[][0]                    
          return 0;             
     }
     else if(student_marks  >= 20 && student_marks  <= 39)
     {    
          //increment ranges[][1]                           
          return 1;          
     }
     else if(student_marks  >= 40 && student_marks  <= 59)
     {     
           //increment ranges[][2]                   
          return 2;          
     }
     else if(student_marks  >= 60 && student_marks  <= 79)
     {    
          //increment ranges[][3]                        
          return 3;         
     }
     else
     {
           //Anything else must be in the 90-100 range
           //increment the ranges[][4] counter
           return 4;
     }
}

//function to sort the marks into a certain range
void marks::sort_range()
{
     
    ifstream infile;
         
        infile.open("datafile.txt");                                    
       
     infile>>student_id[student_count]>>seperator[student_count]
           >>assignment_marks[student_count]>>seperator[student_count]
           >>lab_marks[student_count]>>seperator[student_count]
           >>test_marks[student_count]>>seperator[student_count]
           >>exam_marks[student_count];     
           
do
     {       //The get_range() function returns the proper element of the ranges[][] counter to increment:           
             ranges[student_assignment][range_marks(assignment_marks[student_count])]++;
             ranges[student_labexercise][range_marks(lab_marks[student_count])]++;
             ranges[student_test][range_marks(test_marks[student_count])]++;
             ranges[student_exam][range_marks(exam_marks[student_count])]++;      
           
     infile>>student_id[student_count]>>seperator[student_count]
           >>assignment_marks[student_count]>>seperator[student_count]
           >>lab_marks[student_count]>>seperator[student_count]
           >>test_marks[student_count]>>seperator[student_count]
           >>exam_marks[student_count];     
           
           
}while(!infile.eof());

return;
}

//function to ouput the range of marks
void marks::range_display()
{
  
cout<<"\n\n"<<"\t"<<setw(10)<<"Assignment"<<setw(9)<<"Lab"<<setw(1)<<"\t"<<"Test"<<"\t"<<"Exam"<<endl; 

cout << "\n0-19" <<setw(10)<<ranges[student_assignment][0]
                 <<setw(12)<<ranges[student_labexercise][0]
                 <<setw(8)<<ranges[student_test][0]
                 <<setw(9)<<ranges[student_exam][0];
                 
cout << "\n20-39"<<setw(9)<<ranges[student_assignment][1]
                 <<setw(12)<<ranges[student_labexercise][1]
                 <<setw(8)<<ranges[student_test][1]
                 <<setw(9)<<ranges[student_exam][1];
                 
cout << "\n40-59"<<setw(9)<<ranges[student_assignment][2]
                 <<setw(12)<<ranges[student_labexercise][2]
                 <<setw(8)<<ranges[student_test][2]
                 <<setw(9)<<ranges[student_exam][2];
                 
cout << "\n60-79"<<setw(9)<<ranges[student_assignment][3]
                 <<setw(12)<<ranges[student_labexercise][3]
                 <<setw(8)<<ranges[student_test][3]
                 <<setw(9)<<ranges[student_exam][3];
                 
cout << "\n80-100"<<setw(8)<<ranges[student_assignment][4]
                  <<setw(12)<<ranges[student_labexercise][4]
                  <<setw(8)<<ranges[student_test][4]
                  <<setw(9)<<ranges[student_exam][4];
                  
cout<<"\n\n\n\n"; 
    
return;
}

//function to calculate the final marks
double marks::calculate_finalmark(double& finalmark)
{     
      finalmark=(assignment_marks[student_count]*0.1+lab_marks[student_count]*0.1+test_marks[student_count]*0.2+exam_marks[student_count]*0.6);
                 
 return finalmark;
}

//function to display result for the final marks      
void marks::display_result()
{   
     ifstream inresult;
     inresult.open("datafile.txt");  

     double finalresult;

     cout<<setw(4)<<"Student ID"
         <<setw(13)<<"Assignment"
         <<setw(7)<<"Lab"
         <<setw(9)<<"Test"
         <<setw(7)<<"Exam"
         <<setw(13)<<"Final Mark"<<"\n"<<endl;
             
   inresult>>student_id[student_count]>>seperator[student_count]
           >>assignment_marks[student_count]>>seperator[student_count]
           >>lab_marks[student_count]>>seperator[student_count]
           >>test_marks[student_count]>>seperator[student_count]
           >>exam_marks[student_count];               

//output the result   
do{
         cout<<setw(8)<<student_id[student_count]
             <<setw(11)<<assignment_marks[student_count]
             <<setw(10)<<lab_marks[student_count]
             <<setw(8)<<test_marks[student_count]
             <<setw(7)<<exam_marks[student_count]
             <<setw(11)<<fixed<<setprecision(2)<<calculate_finalmark(finalresult)<<endl;
             
   inresult>>student_id[student_count]>>seperator[student_count]
           >>assignment_marks[student_count]>>seperator[student_count]
           >>lab_marks[student_count]>>seperator[student_count]
           >>test_marks[student_count]>>seperator[student_count]
           >>exam_marks[student_count];  
                
}while(!inresult.eof());

cout<<"\n\n\n\n";

return;
}

good program..

i'll throw in my 2 cents for improvement... take it or leave it:

this will only initialize the [0][0] element:

int ranges[first_dim][second_dim]={0};

instead ye' should try this:
(otherwise you'll have mystery stuff in your array.. and you won't know why it's there)

for(int i=0; i<4; i++)
{
     for(int j=0, j<5; j++)
     {
          ranges[i][j] = 0;
     }
}

Delete lines #126 through 130; move line #119 to line #112.
Delete lines #212 through 216; move line #204 to line #196.

Otherwise, good job on ye' program.

Edited 6 Years Ago by Clinton Portis: n/a

Oh yeah of course, a two dimensional array, to initialize it to 0 must use a loop,thanx man, you helped me a lots... :)

This question has already been answered. Start a new discussion instead.