Answer to Question #296915 in C++ for Yaku

Question #296915

Write a menu driven program that achieves the following:

  1. Takes student’s information from the user and adds such a student into Mark Sheet.
  2. Takes a student number from the user and update such a student’s information.
  3. Takes a student number from the user and delete such a student from Mark Sheet.
  4. Generate or re-generate individual student report files.
  5. Write a short report on the approach you used to solve the problem in hand.
1
Expert's answer
2022-02-16T08:10:33-0500
#include <iostream>
#include <vector>
#include <fstream>
int next_id = 0;




class Student
{
public:
	Student();
	~Student();
	std::string name;
	std::string surname;
	int id;
};




Student::Student()
{
	this->id = next_id;
	next_id++;
}
Student::~Student()
{
}




//[subject_i ][student_i]




class MarkSheet
{
private:
	std::vector<int> ids;
	std::vector<std::string> subjects;
	std::vector<std::vector<int>> marks;
public:
	MarkSheet();
	~MarkSheet();




	std::vector<std::string> get_subjects()
	{
		return subjects;
	}




	void save_students_to_files(std::vector<Student> students)
	{
		std::ofstream file;




		for (int i = 0; i < students.size(); i++)
		{
			std::string filename = students[i].name;
			filename += "_";
			filename += students[i].surname;
			filename += ".txt";
			file.open(filename);
			file << students[i].name << " " << students[i].surname << "  , ID : " << students[i].id << "\n"
				<< "Marks : \n";
			for (int i1 = 0; i1 < subjects.size(); i1++)
			{
				file << subjects[i1] << '\t';
			}
			file << '\n';
			for (int j = 0; j < subjects.size(); j++)
			{
				file << marks[j][i] << '\t';
			}
			file << '\n';
			file.close();




		}
	}






	void add_subject(std::string subj)
	{
		subjects.push_back(subj);
		for (int i = 0; i < ids.size(); i++)
		{
			marks[subjects.size() - 1][i] = 0;
		}
	}
	void add_student(int id)
	{
		ids.push_back(id);
		for (int i = 0; i < subjects.size(); i++)
		{
			marks[i][ids.size() - 1] = 0;
		}
	}




	void add_mark(int student_id, std::string subject_name, int mark)
	{




		std::vector<std::vector<int>> tmp;
		int student_i = -1;
		int subject_i = -1;
		bool new_st = 0, new_sb = 0;
		for (int i = 0; i < ids.size(); i++)
		{
			if (ids[i] == student_id)
			{
				student_i = i;
				break;
			}
		}
		if (student_i == -1)
		{
			ids.push_back(student_id);
			student_i = ids.size() - 1;
			new_st = 1;




		}




		//




		for (int i = 0; i < subjects.size(); i++)
		{
			if (subjects[i] == subject_name)
			{
				subject_i = i;
				break;
			}
		}
		if (subject_i == -1)
		{
			subjects.push_back(subject_name);
			subject_i = subjects.size() - 1;
			new_sb = 1;




		}
		tmp.resize(subjects.size());
		for (int i = 0; i < tmp.size(); i++)
		{
			tmp[i].resize(ids.size());
		}




		for (int i = 0; i < ids.size() && new_sb; i++)
		{
			tmp[subject_i][i] = 0;
		}
		for (int i = 0; i < subjects.size() && new_st; i++)
		{
			tmp[i][student_i] = 0;
		}








		for (int i = 0; i < marks.size(); i++)
		{
			for (int j = 0; j < marks[0].size(); j++)
			{
				tmp[i][j] = marks[i][j];
			}
		}
		tmp[subject_i][student_i] = mark;
		marks = tmp;










	}




	void delete_student(int id)
	{
		int student_i = -1;
		for (int j = 0; j < ids.size(); j++)
		{
			if (id == ids[j])
			{
				student_i = ids[j];
			}
		}
		if (student_i == -1)
		{
			return;
		}
		for (auto&& it = ids.begin(); it < ids.end(); it++)
		{
			if (*it == id)
			{
				ids.erase(it);
				break;
			}
		}
		for (auto&& it = marks.begin(); it < marks.end(); it++)
		{
			it->erase(it->begin() + student_i);
		}
	}




	void print_matrix()
	{


		std::cout << " \t";
		for (int i = 0; i < subjects.size(); i++)
		{
			std::cout << subjects[i] << '\t';
		}
		std::cout << '\n';
		for (int i = 0; i < ids.size(); i++)
		{
			std::cout << ids[i] << '\t';
			for (int j = 0; j < subjects.size(); j++)
			{
				std::cout << (marks)[j][i] << '\t';
			}
			std::cout << '\n';
		}
	}








};
MarkSheet::MarkSheet()
{
}
MarkSheet::~MarkSheet()
{
}




int main()
{
	MarkSheet marks;




	int subj_number = 0;
	std::cout << "Enter number of subjects : ";
	std::cin >> subj_number;
	for (int i = 0; i < subj_number; i++)
	{
		std::string str;
		std::cout << "Enter name of subject " << i + 1 << " : ";
		std::cin >> str;
		marks.add_subject(str);
	}




	int students_numb = 0;
	std::cout << "Enter number of students : ";
	std::cin >> students_numb;




	std::vector<Student> students;
	students.resize(students_numb);








	


	while (1)
	{
		int answer = 0;
		std::cout << "1.Add student\n2.Update student info\n3.Delete student\n4.Generate report\n5.Exit\nEnter value : ";
		std::cin >> answer;
		if (answer == 1)
		{
			Student st;


				std::string name;
				std::cout << "Enter name of student " << " : ";
				std::cin >> st.name;
				std::cout << "Enter surname of student "<< " : ";
				std::cin >> st.surname;
				std::cout << "Student name : " << st.name << " " << st.surname << " , ID : " << st.id << std::endl;
				for (int j = 0; j < marks.get_subjects().size(); j++)
				{
					std::cout << "Enter " << st.name << " " << st.surname << " , " << marks.get_subjects()[j] << " mark : ";
					int mark = 0;
					std::cin >> mark;
					marks.add_mark(st.id, marks.get_subjects()[j], mark);
				}
				students.push_back(st);
			
		}
		else if(answer == 2)
		{
			int ID = -1;
			std::cout << "Enter student id : ";
			std::cin >> ID;
			int student_i = -1;
			for (int i = 0; i < students.size(); i++)
			{
				if (students[i].id == ID)
				{
					student_i = i;
					break;
				}
			}
			if (student_i == -1)
			{
				std::cout << "There is no such student\n";
				continue;
			}
			std::string name;
			std::cout << "Enter name of student " << " : ";
			std::cin >> students[student_i].name;
			std::cout << "Enter surname of student " << " : ";
			std::cin >> students[student_i].surname;
			std::cout << "Student name : " << students[student_i].name << " " << students[student_i].surname << " , ID : " << students[student_i].id << std::endl;
			for (int j = 0; j < marks.get_subjects().size(); j++)
			{
				std::cout << "Enter " << students[student_i].name << " " << students[student_i].surname << " , " << marks.get_subjects()[j] << " mark : ";
				int mark = 0;
				std::cin >> mark;
				marks.add_mark(students[student_i].id, marks.get_subjects()[j], mark);
			}
			
		}
		else if(answer==3)
		{
			std::cout << "Do you want to delete some student (Y/N)";
			std::string answer = "";
			std::cin >> answer;
			if (answer == "Y")
			{
				int id = 0;
				std::cout << "Enter student ID : ";
				std::cin >> id;
				marks.delete_student(id);
				for (auto&& it = students.begin(); it < students.end(); it++)
				{
					if (it->id == id)
					{
						students.erase(it);
						break;
					}
				}
			}
		}
		else if (answer == 4)
		{
			marks.save_students_to_files(students);
			std::cout << "Files Saved\n";
		}
		else if (answer == 5)
		{
			exit(0);
		}
	}






	marks.save_students_to_files(students);
	system("pause");
	return 0;
}

Need a fast expert's response?

Submit order

and get a quick answer at the best price

for any assignment or question with DETAILED EXPLANATIONS!

Comments

No comments. Be the first!

Leave a comment

LATEST TUTORIALS
New on Blog