Question

we have this given problem to work on which is..

Create a program that would compute for the grade equivalent of two students who just took an exam in Math, Science and English. Your program should consist of two structures: first, struct Subjects that has as its members Math, Science and English in which the grade equivalent of the two students is stored; second, struct Student with members Name, Course, and StudentSub whose type is Subjects.

Use a pointer to store the information for the two different students. After entering the name and course of a student, the user must have a choice of which subject she wants to input a grade first. After the user chooses which subject she wants to put a grade, the user should input the student’s score and the total points of the exam. A separate function should compute for the grade of the student given the score and the total points of the exam.

After entering all information the program must display both the student’s name, course and grades in the different subjects.

Ex:          Name: Sarah

                Course: CS

                Math: 2.5

                English: 2.5

                Science: 2.5  

 

                Name: Mark

                Course: IT

                Math: 2.5

                English: 3

                Science: 2

 

To compute for the grade we must compute for the percent correct first.

 

                Percent Correct = (Score / Highest Possible Score)* 100



And what I did was:

#include <iostream>
#include <string>
using namespace std;


struct Subjects
{
    int math;
    int science;
    int english;

};
struct Student
{
    string name;
    string course;
    string StudentSub;
};

int percent(int a, int b)

    {
        int r;
        r=(a/b)*100;
        return r;
    }

void main()
{    
    int c;
    int score,total;
    char choice;
    Student astud;
    Student *pstud;

    pstud = &astud;

    cout<<"Name :";
    getline(cin,pstud->name);
    cout<<"Course :";
    getline(cin,pstud->course);

    
        cout<<"Choose a subject:"<<endl;
        cout<<"1.Math"<<endl;
        cout<<"2.Science"<<endl;
        cout<<"3.English"<<endl;
        cin>>choice;

        switch(choice)
        {

        case '1' :
        
            cout<<"Math"<<endl;
            cout<<"Score: ";
            cin>>score;
            cout<<"Total Score: ";
            cin>>total;
            c = percent(score,total);
            cout<<"Grade: "<<c<<endl;
            break;
        
        case '2':
        
            cout<<"Science:"<<endl;
            cout<<"Score: ";
            cin>>score;
            cout<<"Total Score: ";
            cin>>total;
            break;
        
        case '3':
        
            cout<<"English:"<<endl;
            cout<<"Score: ";
            cin>>score;
            cout<<"Total Score: ";
            cin>>total;
            break;
        default: 
            cout<<"Try again"<<endl;
        }
}

I got stuck. Specially with the calling of the functions. Can I please get some help? Thank you.

Link to comment
https://www.neowin.net/forum/topic/1267580-i-need-help/
Share on other sites

2 answers to this question

Recommended Posts

  • 0

There are a few problems that I can see. First of all StudentSub should be a Subjects struct, not a string.  Secondly, I would break the program down into logical units such as input and printing. By encapsulating the functionality into distinct functions, you're able to easily process multiple students without code repetition. A student class would be better, but your assignment dictates structs.

This is an example of how you might put it together:

#include <stdlib.h>
#include <string>
#include <iostream>
#include <map>
#include <sstream>
using namespace std;

// Singleton pattern wrapping an id -> enumeration
class SubjectList {
	public:
		typedef enum {MATH, ENGLISH, SCIENCE} Subject;
		static SubjectList* getInstance() {
			if (NULL == singleton)
				singleton = new SubjectList();
			return singleton;
		}
		bool isValidSubject(int id) {
			return list.end() != list.find(id);
		}
		Subject getSubject(int id) {
			return list.at(id).enumeration; 
		}
		int count() {return list.size();}
		void print() {
			map<unsigned int, SubjectType>::iterator iter;
			for (iter = list.begin(); list.end() != iter; iter++)
				cout << iter->first << "." << iter->second.description << endl;
		}			
	private:
		typedef struct {
			Subject enumeration;
			string  description;
		} SubjectType;
		SubjectType makeType(Subject enumeration, string description) {
			SubjectType type = {enumeration, description};
			return type;
		}
		SubjectList() {
			list[1] = makeType(MATH, "Math");
			list[2] = makeType(ENGLISH, "English");
			list[3] = makeType(SCIENCE, "Science");
		}
		static SubjectList* singleton;
		map<unsigned int, SubjectType> list;
};
SubjectList* SubjectList::singleton = NULL;

typedef struct {
	float math;
	float english;
	float science;
} Subjects;

typedef struct {
	string name;
	string course;
	Subjects grades;
} Student;

bool
isValidStudentName(string name) {
	// do student name validation
	return !name.empty();
}
bool
isValidStudentCourse(string course) {
	// validate against list of approved courses
	return !course.empty();
}
float 
calcGrade(int score, int totalPoints) {
	return ((float)score / totalPoints) * 100;
}	
bool 
inputStudent(Student *student) {
	string input;

	cout << "Enter student's name: ";
	getline(cin, input);
	if (!isValidStudentName(input)) {
		cout << "Invalid student name" << endl;
		return false;
	}		
	
	student->name = input;
	cout << "Enter student " << student->name << "'s course: ";
	getline(cin, input);
	if (!isValidStudentCourse(input)) {
		cout << "Invalid course" << endl;
		return false;
	}		

	student->course = input;

	SubjectList* subjects = SubjectList::getInstance();
	for (int i = 0; i < subjects->count(); i++) {
		cout << "Which subject would you like to grade?" << endl;
		subjects->print();	

		int id; 
		getline(cin, input);
		istringstream(input) >> id;
		if (!subjects->isValidSubject(id)) {
			cout << "Invalid subject" << endl;
			return false;
		}
		
		int score, totalPoints;
		cout << "Enter score: ";
		getline(cin, input);
		istringstream(input) >> score;
		cout << "Enter total points of the exam: ";
		getline(cin, input);
		istringstream(input) >> totalPoints;

		float grade = calcGrade(score, totalPoints);
		switch (subjects->getSubject(id)) {
			case SubjectList::MATH:
				student->grades.math = grade;
				break;	
			case SubjectList::ENGLISH:
				student->grades.english = grade;
				break;	
			case SubjectList::SCIENCE:
				student->grades.science = grade;
				break;	
		}			
	}
	
	return true;
}

void
printStudent(Student *student) {
	cout << student->name << endl;
	cout << student->course << endl;
	cout << "Maths: " << student->grades.math << endl;
	cout << "English: " << student->grades.english << endl;
	cout << "Science: " << student->grades.science << endl;
}

int
main (void) {

	Student unus;
	Student duo;
	
	if (!inputStudent(&unus)) {
		cout << "Invalid input for first student!" << endl;
		return EXIT_FAILURE;
	}
	if (!inputStudent(&duo)) {
		cout << "Invalid input for second student!" << endl;
		return EXIT_FAILURE;
	}

	printStudent(&unus);
	printStudent(&duo);
	
	return EXIT_SUCCESS;
}

 

Link to comment
https://www.neowin.net/forum/topic/1267580-i-need-help/#findComment-596961754
Share on other sites

This topic is now closed to further replies.