„Biblioteka Sobczak Natalia
Etap 2. Alokacja pamięci i zarządzanie nią w czasie wykonania
Download 69.33 Kb.
|
Projekt Sobczak 10B
Etap 2. Alokacja pamięci i zarządzanie nią w czasie wykonania
Zdefiniowanie funkcji globalnej z typem zwracanym void Ksiazka * wygeneruj_ksiazke(std::string nazwa, std::string isbn, std::string autor, unsigned int wydanie) { auto *nowa_ksiazka = new Ksiazka(nazwa, isbn, wydanie, autor, TYP_DZIALU[(nazwa.size() + isbn.size() + autor.size() + wydanie) % 6]); return nowa_ksiazka; } Inicjalizacja tablic void nowy_zbior_ksiazek(Ksiazka ***ksiazki, Ksiazka *nowa_ksiazka, std::size_t stara_ilosc_ksiazek) { // musimy wziac wskaznik do wskaznika do tablicy z ksiazkami if (*ksiazki == nullptr) { *ksiazki = new Ksiazka* [1]; (*ksiazki)[0] = nowa_ksiazka; } else { Ksiazka **nowy_zbior_ksiazek = new Ksiazka* [stara_ilosc_ksiazek + 1]; for (std::size_t i = 0; i < stara_ilosc_ksiazek; ++i) { nowy_zbior_ksiazek[i] = (*ksiazki)[i]; // kopiujemy ksiazki } nowy_zbior_ksiazek[stara_ilosc_ksiazek] = nowa_ksiazka; // dodajemy ksiazke w ogole delete[] *ksiazki; // usun to, co kryje sie pod wskaznikiem, czyli wskaznik na zbior wskaznikow do ksiazek *ksiazki = nowy_zbior_ksiazek; // nadpisujemy wskaznik tak, jak nizej } } Wyświetlanie zawartości tablic void Biblioteka::pokaz_ksiazki() { if (ilosc_ksiazek == 0) { std::cout << "W bibliotece nie ma ksiazek." << std::endl; } else { std::cout << std::setw(4) << "Lp" << std::setw(20) << "Tytul" << std::setw(20) << "ISBN" << std::endl; for (unsigned int i = 0; i < ilosc_ksiazek; ++i) { std::cout << std::setw(4) << i << std::setw(20) << ksiazki[i]->nazwa << std::setw(20) << ksiazki[i]->isbn << std::endl; } } } Zwalnianie pamięci przydzielonej do tablic delete bool Biblioteka::usun_czytelnika(Czytelnik *czytelnik); bool Biblioteka::usun_wypozyczenie(Wypozyczenie *wypozyczenie); bool Biblioteka::usun_ksiazke(Ksiazka *ksiazka); void nowy_zbior_czytelnikow(Czytelnik ***czytelnicy, std::string pesel_do_usuniecia, std::size_t stara_ilosc_czytelnikow) { // musimy wziac wskaznik do wskaznika do tablicy z ksiazkami if (*czytelnicy == nullptr || stara_ilosc_czytelnikow == 0) { return; // nie ma zadnych w ogole ksiazek, wiec powrot } else if (stara_ilosc_czytelnikow == 1) { // jest jedyna ksiazka, jak ja usuniemy, to musimy wyzerowac wskaznik po usunieciu pamieci, na ktora on pokazuje if ((*czytelnicy)[0]->pesel == pesel_do_usuniecia) { delete (*czytelnicy)[0]; // usun ksiazke delete[] *czytelnicy; // usun w ogole tablice z ksiazkami *czytelnicy = nullptr; // tutaj przydaje sie ta trzecia gwiazdka, inaczej, jakbysmy zrobili Ksiazka **ksiazki i potem ksiazki = nullptr, to wtedy by KOPIA tego wskaznika sie wyzerowala, bo do funkcji bylaby przekazana kopia, a, jak przekazujemy wskaznik do oryginalnego zbioru, to jestesmy w stanie go modyfikowac } } else { Czytelnik **nowy_zbior_czytelnikow = new Czytelnik *[stara_ilosc_czytelnikow - 1]; bool czytelnik_usuniety = false; for (std::size_t i = 0; i < stara_ilosc_czytelnikow; ++i) { if ((*czytelnicy)[i]->pesel == pesel_do_usuniecia) { // jak w starym zbiorze natrafimy na isbn... delete (*czytelnicy)[i]; // usun ja czytelnik_usuniety = true; continue; } else { nowy_zbior_czytelnikow[i - czytelnik_usuniety] = (*czytelnicy)[i]; // jezeli ksiazka_usunieta to true, to i = ksiazka_usunieta == i - 1, czyli cofamy się o 1, zeby nie zostala dziura w nowy_zbior_ksiazek } } delete[] *czytelnicy; // usun to, co kryje sie pod wskaznikiem, czyli wskaznik na zbior wskaznikow do ksiazek *czytelnicy = nowy_zbior_czytelnikow; // nadpisz wskaznik } } Zadeklarowanie, zaimplementowanie i użycie konstruktorów, w tym z listą inicjalizacyjną Ksiazka::Ksiazka(const std::string &nazwa, const std::string &isbn, unsigned int wydanie, const std::string &autor, const std::string &typDzialu) : nazwa(nazwa), isbn(isbn), wydanie(wydanie), autor(autor), typ_dzialu(typDzialu) {} Zidentyfikowanie i oznaczenie w klasie funkcji, które nie mogą zmieniać wartości atrybutów klasy void pokaz_ksiazki() const; Zadeklarowanie, zaimplementowanie i użycie funkcji typu void, zmieniające rozmiar tablic w czasie wykonania (przykłady) void nowy_zbior_czytelnikow(Czytelnik ***czytelnicy, Czytelnik *nowy_czytelnik, std::size_t stara_ilosc_czytelnikow) { // musimy wziac wskaznik do wskaznika do tablicy z ksiazkami if (*czytelnicy == nullptr) { *czytelnicy = new Czytelnik *[1]; (*czytelnicy)[0] = nowy_czytelnik; } else { Czytelnik **nowy_zbior_czytelnikow = new Czytelnik *[stara_ilosc_czytelnikow + 1]; for (std::size_t i = 0; i < stara_ilosc_czytelnikow; ++i) { nowy_zbior_czytelnikow[i] = (*czytelnicy)[i]; // kopiujemy ksiazki } nowy_zbior_czytelnikow[stara_ilosc_czytelnikow] = nowy_czytelnik; // dodajemy ksiazke w ogole delete[] *czytelnicy; // usun to, co kryje sie pod wskaznikiem, czyli wskaznik na zbior wskaznikow do ksiazek *czytelnicy = nowy_zbior_czytelnikow; // nadpisujemy wskaznik tak, jak nizej } } void nowy_zbior_czytelnikow(Czytelnik ***czytelnicy, std::string pesel_do_usuniecia, std::size_t stara_ilosc_czytelnikow) { // musimy wziac wskaznik do wskaznika do tablicy z ksiazkami if (*czytelnicy == nullptr || stara_ilosc_czytelnikow == 0) { return; // nie ma zadnych w ogole ksiazek, wiec powrot } else if (stara_ilosc_czytelnikow == 1) { // jest jedyna ksiazka, jak ja usuniemy, to musimy wyzerowac wskaznik po usunieciu pamieci, na ktora on pokazuje if ((*czytelnicy)[0]->pesel == pesel_do_usuniecia) { delete (*czytelnicy)[0]; // usun ksiazke delete[] *czytelnicy; // usun w ogole tablice z ksiazkami *czytelnicy = nullptr; // tutaj przydaje sie ta trzecia gwiazdka, inaczej, jakbysmy zrobili Ksiazka **ksiazki i potem ksiazki = nullptr, to wtedy by KOPIA tego wskaznika sie wyzerowala, bo do funkcji bylaby przekazana kopia, a, jak przekazujemy wskaznik do oryginalnego zbioru, to jestesmy w stanie go modyfikowac } } else { Czytelnik **nowy_zbior_czytelnikow = new Czytelnik *[stara_ilosc_czytelnikow - 1]; bool czytelnik_usuniety = false; for (std::size_t i = 0; i < stara_ilosc_czytelnikow; ++i) { if ((*czytelnicy)[i]->pesel == pesel_do_usuniecia) { // jak w starym zbiorze natrafimy na isbn... delete (*czytelnicy)[i]; // usun ja czytelnik_usuniety = true; continue; } else { nowy_zbior_czytelnikow[i - czytelnik_usuniety] = (*czytelnicy)[i]; // jezeli ksiazka_usunieta to true, to i = ksiazka_usunieta == i - 1, czyli cofamy się o 1, zeby nie zostala dziura w nowy_zbior_ksiazek } } delete[] *czytelnicy; // usun to, co kryje sie pod wskaznikiem, czyli wskaznik na zbior wskaznikow do ksiazek *czytelnicy = nowy_zbior_czytelnikow; // nadpisz wskaznik } } Download 69.33 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling