[C++] Program ewidencji studentów

W tym wpisie stworzymy prosty program ewidencji studentów. Program ma mieć następujące możliwości:

  • Wyświetlenie listy studentów;
  • Dodawanie nowego studenta;
  • Usunięcie z listy danego studenta;

Jako bazę danych dla listy studentów wykorzystamy plik tekstowy z rozszerzeniem csv.

Program ma zapisywać i wyświetlać następujące informacje o studentach: ID, imię i nazwisko, rok urodzenia oraz kierunek studiów.

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <sstream>

class Student {

public:
    int id;                // Numer porządkowy studenta
    std::string name;     // Imię
    std::string surname;  // Nazwisko
    std::string birthDate; // Data urodzenia w formacie d/m/RRRR
    std::string major;    // Kierunek studiów

    // Konstruktor studenta
    Student(int id, std::string n, std::string s, std::string bDate, std::string m)
        : id(id), name(n), surname(s), birthDate(bDate), major(m) {}

    // Metoda do zapisu studenta w formacie CSV z separatorem ;
    std::string toCSV() const {
    
        return std::to_string(id) + ";" + name + ";" + surname + ";" + birthDate + ";" + major;
        
    }

    // Metoda do wczytywania studenta z formatu CSV
    static Student fromCSV(const std::string &csvLine) {
    
        std::stringstream ss(csvLine);
        std::string idStr, n, s, bDate, m;
        std::getline(ss, idStr, ';');
        std::getline(ss, n, ';');
        std::getline(ss, s, ';');
        std::getline(ss, bDate, ';');
        std::getline(ss, m, ';');

        return Student(std::stoi(idStr), n, s, bDate, m);
        
    }
    
};

class StudentDatabase {

private:
    std::vector<Student> students;
    const std::string filename = "students.csv";

    // Metoda do wczytywania studentów z pliku CSV
    void loadStudents() {
    
        std::ifstream file(filename);
        
        if(file) {
        
            std::string line;
            
            while (std::getline(file, line)) {
            
                students.push_back(Student::fromCSV(line));
                
            }
            
            file.close();
            
        }
        
        else {
        
            std::cout << "Plik nie został znaleziony, rozpoczynamy z pustą bazą.\n";
            
        }
        
    }

    // Metoda do zapisywania studentów do pliku CSV
    void saveStudents() const {
    
        std::ofstream file(filename);
        
        for(const auto& student : students) {
        
            file << student.toCSV() << "\n";
            
        }
        
        file.close();
        
    }

public:
    StudentDatabase() {
    
        loadStudents(); // Ładowanie studentów przy inicjalizacji bazy
        
    }

    ~StudentDatabase() {
    
        saveStudents(); // Zapis do pliku przy zamykaniu bazy
        
    }

    void addStudent(const Student& student) {
    
        students.push_back(student);
        
    }

    void displayStudents() const {
    
        for(const auto& student : students) {
        
            std::cout << "ID: " << student.id 
                      << ", Imię: " << student.name 
                      << ", Nazwisko: " << student.surname 
                      << ", Data urodzenia: " << student.birthDate 
                      << ", Kierunek: " << student.major << std::endl;
                      
        }
        
    }

    // Funkcja do dodawania nowego studenta
    void inputNewStudent() {
    
        int id = students.size() + 1; // Generowanie ID na podstawie liczby studentów
        std::string name, surname, birthDate, major;
        std::cout << "Wprowadź imię: ";
        std::getline(std::cin, name);
        std::cout << "Wprowadź nazwisko: ";
        std::getline(std::cin, surname);
        std::cout << "Wprowadź datę urodzenia (d/m/RRRR): ";
        std::getline(std::cin, birthDate);
        std::cout << "Wprowadź kierunek studiów: ";
        std::getline(std::cin, major);
        
        Student newStudent(id, name, surname, birthDate, major);
        addStudent(newStudent);
        std::cout << "Student dodany\n";
        
    }

    // Funkcja do usuwania studenta po ID
    void removeStudentById(int id) {
    
        auto it = std::remove_if(students.begin(), students.end(), [id](const Student& amp;student) {
        
            return student.id == id;
            
        });

        if(it != students.end()) {
        
            students.erase(it, students.end());
            std::cout << "Student o ID " << id << " został usunięty.\n";
            
        }
        
        else {
        
            std::cout << "Nie znaleziono studenta o ID " << id << ".\n";
            
        }
        
    }
    
};

int main() {

    StudentDatabase db;

    int choice;
    
    do {
        std::cout << "\nMenu:\n";
        std::cout << "1. Dodaj studenta\n";
        std::cout << "2. Wyświetl studentów\n";
        std::cout << "3. Usuń studenta według ID\n";
        std::cout << "0. Wyjdź\n";
        std::cout << "Wybierz opcję: ";
        std::cin >> choice;
        std::cin.ignore(); // Ignorowanie znaku nowej linii po wprowadzeniu liczby

        switch(choice) {
        
            case 1:
            
                db.inputNewStudent();
                
            break;
                
            case 2:
            
                std::cout << "Lista studentów:\n";
                db.displayStudents();
                
            break;
            
            case 3: {
            
                int idToRemove;
                std::cout << "Podaj ID studenta do usunięcia: ";
                std::cin >> idToRemove;
                db.removeStudentById(idToRemove);
                
            break;
                
            }
            
            case 0:
            
                std::cout << "Program zakończony.\n";
                
            break;
            
            default:
            
                std::cout << "Nieprawidłowy wybór, spróbuj ponownie.\n";
                
            break;
            
        }
        
    }
    
    while(choice != 0);

    return 0;
    
}

Komentarze

Popular

[C++] Jak obliczyć pole i obwód trapezu?

[HTML] Jak wyśrodkować tekst?

[PHP|HTML] Odświeżenie strony