Yeabsira

Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

COLLEGE OF NATURAL AND COMPUTATIONAL

SCIENCE

Programming ll
Individual Assignment

Name: Abel Leul

ID: UGR/8394/12 Section: 1

Submitted to: Axumawit


Submission date: Jan/2023
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <limits>

struct Course {
int code;
int semester;
int results;
};

struct Student {
std::string name;
int id;
int yearOfAdmission;
std::string department;
std::vector<Course> courses;
};

void writeStudentToFile(const Student& student, std::ofstream&


file) {
file << "Name:" << student.name << ", ID:" << student.id
<< ", Year:" << student.yearOfAdmission << ", Department:"
<< student.department << ", Courses:{";

for (const Course& course : student.courses) {


file << "{Code:" << course.code << ", Semester:" <<
course.semester
<< ", Results:" << course.results << "}, ";
}

file << "}\n";


}

void readStudentsFromFile(std::vector<Student>& students) {


std::ifstream file("students.txt");

if (!file.is_open()) {
std::cout << "No existing data found. Creating a new file.\n";
return;
}

Student student;
while (file >> student.name >> student.id >>
student.yearOfAdmission >> student.department) {
int numCourses;
file >> numCourses;
student.courses.resize(numCourses);
1
for (int i = 0; i < numCourses; ++i) {
file >> student.courses[i].code >>
student.courses[i].semester >> student.courses[i].results;
}

students.push_back(student);
}

file.close();
}

void writeAllStudentsToFile(const std::vector<Student>&


students) {
std::ofstream file("students.txt");

if (!file.is_open()) {
std::cerr << "Error writing to file.\n";
return;
}

for (const Student& student : students) {


file << student.name << " " << student.id << " " <<
student.yearOfAdmission << " " << student.department << " "
<< student.courses.size();

for (const Course& course : student.courses) {


file << " " << course.code << " " << course.semester << " " <<
course.results;
}

file << "\n";


}

file.close();
}

void displayStudent(const Student& student) {


std::cout << std::setw(20) << student.name << std::setw(5) <<
student.id
<< std::setw(10) << student.yearOfAdmission <<
std::setw(15) << student.department << "\n";
}

2
void displayAllStudents(const std::vector<Student>& students) {
std::cout << std::left << std::setw(20) << "Name" << std::setw(5)
<< "ID"
<< std::setw(10) << "Year" << std::setw(15) <<
"Department\n";

for (const Student& student : students) {


displayStudent(student);
}
}

int findStudentIndexById(const std::vector<Student>& students,


int studentId) {
for (size_t i = 0; i < students.size(); ++i) {
if (students[i].id == studentId) {
return static_cast<int>(i);
}
}
return -1;
}

void displaySpecificStudent(const std::vector<Student>&


students, int studentId) {
int index = findStudentIndexById(students, studentId);

if (index != -1) {
displayStudent(students[index]);
} else {
std::cout << "Student with ID " << studentId << " not found.\n";
}
}

void showReportForSpecificStudent(const std::vector<Student>&


students, int studentId) {
int index = findStudentIndexById(students, studentId);

if (index != -1) {
const Student& student = students[index];

std::cout << "Report for Student ID " << studentId << ":\n";
std::cout << std::setw(20) << "Name: " << student.name <<
"\n";
std::cout << std::setw(20) << "ID: " << student.id << "\n";
std::cout << std::setw(20) << "Year: " <<
student.yearOfAdmission << "\n";
std::cout << std::setw(20) << "Department: " <<
student.department << "\n";

std::cout << "\nCourses:\n";


std::cout << std::setw(15) << "Code" << std::setw(15) <<
"Semester" << std::setw(15) << "Results\n";

3
double totalResults = 0;

for (const Course& course : student.courses) {


std::cout << std::setw(15) << course.code << std::setw(15)
<< course.semester
<< std::setw(15) << course.results << "\n";
totalResults += course.results;
}

if (!student.courses.empty()) {
double averageResults = totalResults /
student.courses.size();
std::cout << "\nAverage Results: " << std::fixed <<
std::setprecision(2) << averageResults << "\n";
}
} else {
std::cout << "Student with ID " << studentId << " not found.\n";
}
}

void viewSemesterResultsForSpecificStudent(const
std::vector<Student>& students, int studentId, int semester) {
int index = findStudentIndexById(students, studentId);

if (index != -1) {
const Student& student = students[index];

std::cout << "Semester Results for Student ID " << studentId


<< ", Semester " << semester << ":\n";
std::cout << std::setw(15) << "Code" << std::setw(15) <<
"Results\n";

double totalResults = 0;
int coursesInSemester = 0;

for (const Course& course : student.courses) {


if (course.semester == semester) {
std::cout << std::setw(15) << course.code <<
std::setw(15) << course.results << "\n";
totalResults += course.results;
++coursesInSemester;
}
}

4
if (coursesInSemester > 0) {
double averageResults = totalResults /
coursesInSemester;
std::cout << "\nAverage Results for Semester " <<
semester << ": " << std::fixed << std::setprecision(2) <<
averageResults << "\n";
} else {
std::cout << "No courses found for Semester " <<
semester << " for the given student.\n";
}
} else {
std::cout << "Student with ID " << studentId << " not found.\n";
}
}

void addStudent(std::vector<Student>& students) {


Student newStudent;

std::cout << "Enter student name: ";


std::cin >> newStudent.name;

std::cout << "Enter student ID: ";


std::cin >> newStudent.id;

std::cout << "Enter year of admission: ";


std::cin >> newStudent.yearOfAdmission;

std::cout << "Enter department: ";


std::cin >> newStudent.department;

int numCourses;
std::cout << "Enter the number of courses: ";
std::cin >> numCourses;

newStudent.courses.resize(numCourses);

for (int i = 0; i < numCourses; ++i) {


std::cout << "Enter course code for course " << i + 1 << ": ";
std::cin >> newStudent.courses[i].code;

std::cout << "Enter semester for course " << i + 1 << ": ";
std::cin >> newStudent.courses[i].semester;

std::cout << "Enter results for course " << i + 1 << ": ";
std::cin >> newStudent.courses[i].results;
}

5
students.push_back(newStudent);

std::cout << "Student added successfully.\n";


}

int getUserChoice() {
int choice;
std::cout << "Enter your choice: ";
std::cin >> choice;
return choice;
}

int main() {
std::vector<Student> students;
readStudentsFromFile(students);

while (true) {
std::cout << "\nMenu:\n"
<< "1. Display all students\n"
<< "2. Display specific student\n"
<< "3. Show report for specific student\n"
<< "4. View semester results for specific student\n"
<< "5. Add new student\n"
<< "6. Exit\n";

switch (getUserChoice()) {
case 1:
displayAllStudents(students);
break;
case 2: {
int studentId;
std::cout << "Enter student ID: ";
std::cin >> studentId;
displaySpecificStudent(students, studentId);
break;
}
case 3: {
int studentId;
std::cout << "Enter student ID: ";
std::cin >> studentId;
showReportForSpecificStudent(students, studentId);
break;
}

6
case 4: {
int studentId, semester;
std::cout << "Enter student ID: ";
std::cin >> studentId;
std::cout << "Enter semester: ";
std::cin >> semester;
viewSemesterResultsForSpecificStudent(students,
studentId, semester);
break;
}
case 5:
addStudent(students);
break;
case 6:
writeAllStudentsToFile(students);
std::cout << "Exiting program.\n";
return 0;
default:
std::cout << "Invalid choice. Try again.\n";
// Clear input buffer
std::cin.clear();

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}

return 0;
}

You might also like