Jak dodać CRUD studentów do grupy studenckiej?

0
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Przedmiot{
private:
    string nazwa;
    int ocena;
public:
    Przedmiot(string nazwa1, int ocena1)
    {
        nazwa=nazwa1;
        ocena=ocena1;
    }
    void Wyswietl()
    {
        cout<< "Przedmiot:"<< nazwa<<endl;
        cout<<"Ocena:"<<ocena<<endl;
    }
    int getOcena(){
        return ocena;
    }
};
int randomInt(int start, int range)
{
    // A function to generate random numbers
    return (start + rand() % range);
}

string randomString(int len)
{
    // A function to generate random strings of length -->
    // "len"
    string str;
    for (int i = 0; i < len; i++) {
        char ch = 'A' + rand() % 26;
        str.push_back(ch);
    }
    return str;
}

class Student {
private:
    vector<Przedmiot> przedmioty;
public:
    vector<Przedmiot> getPrzedmioty()
    {
        return przedmioty;
    }
    void addPrzedmiot(Przedmiot przedmiot)
    {
        przedmioty.push_back(przedmiot);
    }
    string imie;
    string nazwisko;
    int nr_indeksu;
    int pesel;
    static int licznik;


   /* int oceny;

    int getOcena(){

        return nazwa;
    }
*/

    void getter()
    {
        imie = randomString( 8);
        nazwisko = randomString(10);
        nr_indeksu = randomInt(10, 10);
        pesel = rand() % 1054632 + 1000000000;

        nr_indeksu=licznik++;
        licznik=licznik;
    }
    void disp()
    {
        cout <<"Imie:"<< imie <<"   Nazwisko:" << nazwisko << "   Nr_indeksu:" << nr_indeksu << "   Pesel:"
             << pesel <<"\n";
    }
   
};

class Grupa{
private:
    vector<Student> studenci;
public:
    vector<Student> getStudent();
};

int Student::licznik=1;
int main()
{
    Student student;
    string nazwy[6]={"Matematyka","Historia","Angielski","W-F","Wos","Niemiecki"};
    int oceny[6]={1,3,3,4,5, 6};
    // Vector of class objects
    vector<Student> v;
    vector<Przedmiot> przedmioty = student.getPrzedmioty();

    for (int i = 0; i < 10; i++) {
        // getting the random values from
        // functions
        student.getter();
        // inserting objects to vector
        v.push_back(student)

    }

    for (int i = 0; i < 10; i++) {
        // displaying object data
        v[i].disp();
        for (int i = randomInt(1,5); i < 6; i++) {

                Przedmiot przedmiot(nazwy[i], oceny[i]);
                student.addPrzedmiot(przedmiot);
                przedmiot.Wyswietl();
        }

    return 0;
}
1

Dałeś cały kod - bardzo dobrze.
Ale jakie jest pytanie?

0

pomieszanie z poplątaniem.
zakładam że pytanie brzmi jak dodać studentów do grupy. Rzuca mi się sporo rzeczy w oczy ale część pominę.
Ale zacznijmy po kolei

  1. W c++ generowanie randomowych wartości https://en.cppreference.com/w/cpp/numeric/random
  2. getter nie powinno być częścią student. Zbuduj sobie fabrykę w skrócie: student to prosta struktura(nawet nie klasa) -> funkcja fabryczna najpierw generuje potrzebne dane, wypełnia nimi strukturę student i zwraca.
  3. Przedmiot ta sama historia.
  4. Obiekt Grupa na obecnym etapie jest bez sensu bo to zwykły vector. użyj go wprost i nazwij grupa.
  5. Odpowiedź na twoje pytanie jest trywialna do vectora dodaj stworzonego studenta.

I klasyk proszę się zapoznać z clang-format(albo formatorem z twojego ide), gdb, clangtidy,cppcheck.

0

@revcorey:

W kontekście nie ma to znaczenia, trudno pogorszyć ten program, ale:
Dodawanie do kolekcji przez wartość (C++ jest w mniejszości języków, które na to pozwalają). W konsekwencji student dodany do grupy A jest kopią "głownego" studenta, dodany do przedmiotu jest kolejną itd... ilość bliźniaków jest ogromna
Tego pewnie nie widac w pierwszym studenckim uruchomieniu (drukuje się jakby sensownie), ale potem już nic nie jest normalnie, np porównanie na tożsamość to kaplica

W normalnych czystych językach dodaje sie referencję (tylko etykietę studenta, a nie jego bliźniaka). W C++ też by się dało, ale jak nie upilnowac, idziemy w wycieki pamieci.

0

@ZrobieDobrze:
tutaj nawet nie chciałem kombinować z jakimiś poprawkami wydajności i chciałem jak najprościej. Ale załóżmy inne podejście

Student factory1() {
    return Student(0,1);
}

void factory2(std::vector<Student> & vec) {
    vec.emplace_back(1,0);
}

Zdaje się że factory2 będzie trochę szybsze(do factory1 będzie push_back) przynajmniej jak spojrzałem tak jednym okiem na asm w prostym przykładzie.
Ale w przypadku kolegi nawet bym tu nie dywagował o push_back, emplac back i ogólnie move semantic(chociaż pewnie clang-tidy może coś rzucić w tym temacie).

0
MarekR22 napisał(a):

Dałeś cały kod - bardzo dobrze.
Ale jakie jest pytanie?

Pytanie polega na tym jak dodać studentów do grupy za pomocą vectora i tam ich edytować

0

pomyślmy nad twoim problemem inaczej. Jak się identyfikuje studentów na studiach? za pomocą jakiegoś nr. indeksu.
czyli grupa nie powinna mieć w sobie całych obiektów a same indeksy. Wtedy możesz mieć jeden vector Student. Jak np. weźmiesz grupę i chcesz wy listować co drugiego studenta to bierzesz id, szukasz w vector studentów i tyle.
BTW. zapoznaj się z operatorem >> nie trzeba ci osobnej funkcji wypisz dane. Ewentualnie zrób funkcję toString i niech zwróci string odpowiednio sformatowany a nie sama coutami wyświetla.

0

jak masz wyzej w dyskusji będzie gupa A, bedzie grupa B i spójrz co napisał ZrobieDobrze. Oczywiście zawsze można zrobić vector wskaźników na obiekt student wtedy takie coś wskazuje na pewno na jeden obiekt, ale czy to dobra konstrukcja? Nie żebym nie widział takiego kodu. — revcorey 2023-03-29 21:30

Jak bym użył jakiś inteligentnych wskaźników (smart pointers), ale ... znów komplikacja zadania rośnie.

ALBO silna konwencja, gdzie jest oryginał danej (gdzie zachodzi new / delete - pierwotny wektor studentów, jakby dziekanat), a gdzie wskaźniki są bierne (grupa, przedmiot itd) i tam NIE NALEŻY deletować.
Jakby nie było, i wtedy głowny vector (dziekanat) przez wartośc po wielokroć będzie kopał w d....

Przykład pokazuje, jakim d/d językiem do dydaktyki jest C++, wszystkiego jest tam za dużo, modeli pamięci, sposobów przekazywania, wszystkiego.
W Javie, Pythonie, C# by pstryknął projekt, i nawet by nie poczuł, jakie problemy go minęły.

revcorey napisał(a):

pomyślmy nad twoim problemem inaczej. Jak się identyfikuje studentów na studiach? za pomocą jakiegoś nr. indeksu.
czyli grupa nie powinna mieć w sobie całych obiektów a same indeksy. Wtedy możesz mieć jeden vector Student. Jak np. weźmiesz grupę i chcesz wy listować co drugiego studenta to bierzesz id, szukasz w vector studentów i tyle.

Tyle, że już nie vector tych studentów, a do takiego pomysłu to map

aragorn280 napisał(a):
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Przedmiot{
private:
    string nazwa;
    int ocena;
public:
    Przedmiot(string nazwa1, int ocena1)
    {
        nazwa=nazwa1;
        ocena=ocena1;
    }
    void Wyswietl()
    {
        cout<< "Przedmiot:"<< nazwa<<endl;
        cout<<"Ocena:"<<ocena<<endl;
    }
    int getOcena(){
        return ocena;
    }
};

Tak czytam, czytam, czytam ... Cięzko coś pozytywnego zrobić, jak od samych nazw sam siebie okłamujesz. Prawdziwa nazwa tej klasy, to nie Przedmiot a Ocena z przedmiotu. Słowo za słowem, projekt idzie w złe słowa, to i idzie w złe koncepcje. Nie dasz radę "zapisac studenta na przedmiot"

JEŚLI funckja Wyświetl (koledzy piszą co i jak), to uniwersalna void Wyswietl(std::stream & out) a nie z hardkodowanym cout

1 użytkowników online, w tym zalogowanych: 0, gości: 1