„Biblioteka Sobczak Natalia


Etap 2. Alokacja pamięci i zarządzanie nią w czasie wykonania


Download 69.33 Kb.
bet2/5
Sana05.01.2022
Hajmi69.33 Kb.
#219984
1   2   3   4   5
Bog'liq
Projekt Sobczak 10B

Etap 2. Alokacja pamięci i zarządzanie nią w czasie wykonania

  1. 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;


}

  1. 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
}
}

  1. 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;
}
}
}

  1. 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
}
}

  1. 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) {}

  1. Zidentyfikowanie i oznaczenie w klasie funkcji, które nie mogą zmieniać wartości atrybutów klasy

void pokaz_ksiazki() const;

  1. 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:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling