Write a menu driven program that achieves the following:
#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;
}
Comments
Leave a comment