#include #include #include using namespace std; struct Data { //dekralacja struktury int dzien; int miesiac; int rok; Data(int dzien1, int miesiac1, int rok1) :dzien(dzien1), miesiac(miesiac1), rok(rok1) {}; }; struct utwor //dekralacja struktury { string nazwa_utworu; utwor *nastepny; utwor(string nazwa) : nazwa_utworu(nazwa), nastepny(NULL) {}; }; struct album //dekralacja struktury { string nazwa; float cena; album * nastepny; utwor *wskaznik_utwory; Data data; album(string nazwa1, int cena1, int dzien1, int miesiac1, int rok1) :wskaznik_utwory(NULL),nastepny(NULL), nazwa(nazwa1), cena(cena1), data(Data(dzien1, miesiac1, rok1)) {}; }; struct wykonawca { //dekralacja struktury string imie; string nazwisko; album * wydane_albumy; wykonawca * nastepny; wykonawca(string imie1, string nazwisko1) : imie(imie1),wydane_albumy(NULL),nastepny(NULL), nazwisko(nazwisko1) {}; }; void dodanie_albumu(album * &wskaznik, string nazwa,int cena,int dzien,int miesiac,int rok) //dodanie albumu { if (wskaznik == NULL) // dodanie dla przypadku gdy nie ma zadnego albumu { wskaznik = new album(nazwa,cena,dzien,miesiac,rok); cout << "dodano album : " << nazwa << endl; return; } album* wskaznik1 = wskaznik; while (wskaznik1->nastepny != NULL) //dodanie do inncyh albumow { wskaznik1 = wskaznik1->nastepny; } wskaznik1->nastepny = new album(nazwa, cena, dzien, miesiac, rok); cout << "dodano album : " << nazwa << endl; } void dodanie_utworu(utwor *& wskaznik, string nazwa) //dodanie utworu { if (wskaznik == NULL) //opcja gdyby nie bylo autworow wczesniej { wskaznik = new utwor(nazwa); cout << "dodano utwor : " << nazwa << endl; return; } utwor * wskaznik1 = wskaznik; while (wskaznik1->nastepny != NULL) //opcja dodania utworu do istniejacych { wskaznik1 = wskaznik1->nastepny; } wskaznik1->nastepny = new utwor(nazwa); cout << "dodano utwor : " << nazwa << endl; } void nazwa_pliku(string &nazwa_pliku) { cout << "Podaj nazwe pliku " << endl; cin >> nazwa_pliku; } bool otwarcie_pliku(const string nazwa, ifstream &plik1) { plik1.open(nazwa); if (plik1.good() == true && plik1.is_open()) { cout << "Udalo sie otworzyc plik" << endl; return true; } else { cout << "Otwieranie pliku sie nie powiodlo, podaj inna nazwe." << endl; return false; } } void dodaj_wykonawce(wykonawca * & lista, string imie, string nazwisko) { if (lista == NULL) { //opcja gdyby nie bylo wykonawcow cout << "dodano wykonawce : "<< imie <<" "<< nazwisko << endl; lista = new wykonawca(imie, nazwisko); return; } wykonawca* lista1 = lista; while (lista1->nastepny != NULL) //dodanie wykonawcow do istniejacych { lista1 = lista1->nastepny; } lista1->nastepny = new wykonawca(imie, nazwisko); cout << "dodano wykonawce : " << imie <<" "<< nazwisko << endl; } void dodaj_album_do_wykonawcy(wykonawca *&wskaznik, string imie, string nazwisko, string nazwa1, int cena, int dzien, int miesiac, int rok) { if (wskaznik == NULL) // jesli nie ma wykonawcy to nie ma komu przypisac albumu wiec wracamy { return; } if (wskaznik->imie == imie && wskaznik->nazwisko == nazwisko) //jesli odnajudjemy odpowiedniego wykonawce dodajemy do niego album { dodanie_albumu(wskaznik->wydane_albumy, nazwa1, cena, dzien, miesiac, rok); //wykorzystanie funkcji ktora umozliwi dodanie albumu return; } wykonawca *wskaznik1 = wskaznik; while (wskaznik1->nastepny != NULL) //szukanie posrod wykonawcow wlasciwego { if (wskaznik1->nastepny->imie == imie && wskaznik1->nastepny->nazwisko == nazwisko) { dodanie_albumu(wskaznik1->nastepny->wydane_albumy, nazwa1, cena, dzien, miesiac, rok); return; } else wskaznik1 = wskaznik1->nastepny; } } void dodaj_utwor_do_albumu(string nazwa_utworu, wykonawca *wskaznik_wykonawca,string imie, string nazwisko, string nazwa1) { if (wskaznik_wykonawca == NULL) //dodawanie do pierwszego wykonawcy //jesli nie ma wykonawcy to i nie ma albumu wiec wracamy { return; } if (wskaznik_wykonawca->imie == imie && wskaznik_wykonawca->nazwisko == nazwisko) { if (wskaznik_wykonawca->wydane_albumy == NULL) //jesli odnajdziemy wykonawce ale nie ma albumu to wracamy { return; } if (wskaznik_wykonawca->wydane_albumy->nazwa == nazwa1) //dodanie albumu jesli pierwszy album jest zgodny { dodanie_utworu(wskaznik_wykonawca->wydane_albumy->wskaznik_utwory, nazwa_utworu); return; } while (wskaznik_wykonawca->wydane_albumy->nastepny != NULL) //szukanie albumu wykonawcy ktory podal uzytkownik { if (wskaznik_wykonawca->wydane_albumy->nastepny->nazwa == nazwa1) { dodanie_utworu(wskaznik_wykonawca->wydane_albumy->nastepny->wskaznik_utwory, nazwa_utworu); return; } else wskaznik_wykonawca->wydane_albumy = wskaznik_wykonawca->wydane_albumy->nastepny; } return; } wykonawca *wskaznik1 = wskaznik_wykonawca; while (wskaznik1->nastepny != NULL) //szukanie odpowiedniego wykonawcy w pozostalych mozliwosciach i albumu wykonawcy { if (wskaznik1->nastepny->imie == imie && wskaznik1->nastepny->nazwisko == nazwisko) { if (wskaznik1->wydane_albumy == NULL) { return; } if (wskaznik1->nastepny->wydane_albumy->nazwa == nazwa1) { dodanie_utworu(wskaznik1->nastepny->wydane_albumy->wskaznik_utwory, nazwa_utworu); return; } while (wskaznik1->nastepny->wydane_albumy->nastepny != NULL) { if (wskaznik1->nastepny->wydane_albumy->nastepny->nazwa == nazwa1) { dodanie_utworu(wskaznik1->nastepny->wydane_albumy->nastepny->wskaznik_utwory, nazwa_utworu); return; } else wskaznik1->nastepny->wydane_albumy = wskaznik1->nastepny->wydane_albumy->nastepny; } } else wskaznik1 = wskaznik1->nastepny; } } void czytaj_z_pliku(wykonawca * & wykonawca1, ifstream & plik) //wczytanie z pliku { wykonawca *wskaznik1 = wykonawca1; string słowo, nazwa1, nazwisko, imie, utwor1; int cena, dzien, miesiac, rok; while (plik) { słowo = " "; plik >> słowo; // pobieramy slowo ktore oznajmia co jest dalej w lini w pliku odczytu if (słowo == "Koniec") { return; } else if (słowo == "Wykonawca") { plik >> imie; plik >> nazwisko; dodaj_wykonawce(wykonawca1, imie, nazwisko); } else if (słowo == "Album") { plik >> nazwa1; plik >> cena; plik >> dzien; plik >> miesiac; plik >> rok; dodaj_album_do_wykonawcy(wykonawca1, imie, nazwisko, nazwa1, cena, dzien, miesiac, rok); } else if (słowo == "Utwor") { plik >> utwor1; dodaj_utwor_do_albumu(utwor1,wykonawca1,imie,nazwisko,nazwa1); } } } void wyswietl_utwory(wykonawca *& wskaznik) { wykonawca * wskaznik1 = wskaznik; while (wskaznik1 != NULL) //sprawdzanie czy istnieje wykonawca { album *wskaznik2 = wskaznik1->wydane_albumy; while (wskaznik2!= NULL) //sprawdzanie czy istnieje album { utwor *wskaznik3 = wskaznik2->wskaznik_utwory; while (wskaznik3!= NULL) //sprawdzanie czy istnieje utwor { cout << wskaznik3->nazwa_utworu << endl; wskaznik3 = wskaznik3->nastepny; //przejscie po utworach w albumie } wskaznik2= wskaznik2->nastepny; //przejscie po albumach wykonawcy } wskaznik1 = wskaznik1->nastepny; //przejscie po wykonawcach } } void wyswietl_albumy(wykonawca *& wskaznik) { wykonawca * wskaznik1 = wskaznik; while (wskaznik1 != NULL) //sprawdzanie czy istnieje wykonawca { album *wskaznik2 = wskaznik1->wydane_albumy; while (wskaznik2 != NULL) //sprawdzanie czy istnieje album { cout << wskaznik2->nazwa << endl; wskaznik2 = wskaznik2->nastepny; //przejscie po albumach wykonawcy } wskaznik1 = wskaznik1->nastepny; //przejscie po wykonawcach } } void wyswietl_wykonawcy(wykonawca *& wskaznik) { wykonawca * wskaznik1 = wskaznik; while (wskaznik1 != NULL) //sprawdzanie czy istnieje wykonawca { cout << wskaznik1->imie << " " << wskaznik1->nazwisko << endl; wskaznik1 = wskaznik1->nastepny; //przejscie po wykonawcach } } void wyswietl_date_podanego_albumu(wykonawca *& wskaznik, string nazwa_albumu) { wykonawca * wskaznik1 = wskaznik; while (wskaznik1 != NULL) //sprawdzanie czy istnieje wykonawca { album * wskaznik2 = wskaznik1->wydane_albumy; while (wskaznik2 != NULL) //sprawdzanie czy istnieje album { if (wskaznik2->nazwa == nazwa_albumu) { cout << "Data wydania " << wskaznik2->nazwa << " to " << wskaznik2->data.dzien << "-" << wskaznik2->data.miesiac << "-" << wskaznik2->data.rok << endl; return; } wskaznik2 = wskaznik2->nastepny; //przejscie po albumach wykonawcy } wskaznik1 = wskaznik1->nastepny; //przejscie po wykonawcach } cout << "Nie ma takiego albumu." << endl; } void wyswietl_cene_podanego_albumu(wykonawca*&wskaznik,string nazwa_albumu) { wykonawca * wskaznik1 = wskaznik; while (wskaznik1 != NULL) //sprawdzanie czy istnieje wykonawca { album * wskaznik2 = wskaznik1->wydane_albumy; while (wskaznik2 != NULL) //sprawdzenie czy istnieje album { if (wskaznik2->nazwa == nazwa_albumu) { cout << "Cena albumu " << wskaznik2->nazwa << " wynosi " << wskaznik2->cena<< endl; return; } wskaznik2 = wskaznik2->nastepny; //przejscie po albumach wykonawcy } wskaznik1 = wskaznik1->nastepny; //przejscie po wykonawcach } cout << "Nie ma takiego albumu." << endl; } bool szukanie1(wykonawca*&wskaznik, string nazwa_albumu) //funkcja ta pomaga w odnalezienu albumu przy wpisyawniu przez uzytkownika gdy chce dodac utwor do albumu { wykonawca* wskaznik1 = wskaznik; while (wskaznik1 != NULL) { while (wskaznik1->wydane_albumy != NULL) { if (wskaznik1->wydane_albumy->nazwa == nazwa_albumu) { return true; } else { wskaznik1->wydane_albumy = wskaznik1->wydane_albumy->nastepny; } } wskaznik1 = wskaznik1->nastepny; } return false; } string szukanie_imienia(wykonawca*&wskaznik, string nazwa_albumu) //funkcja wykorzystana w odnalezieniu imieina wykonawcy (czy ten wykonawca istnieje) gdy uzytkowni chce dodac utwor do albumu { string imie1; wykonawca* wskaznik1 = wskaznik; while (wskaznik1 != NULL) { while (wskaznik1->wydane_albumy != NULL) { if (wskaznik1->wydane_albumy->nazwa == nazwa_albumu) { imie1 = wskaznik1->imie; return imie1; } else { wskaznik1->wydane_albumy = wskaznik1->wydane_albumy->nastepny; } } wskaznik1 = wskaznik1->nastepny; } return "nie ma takiego imienia"; } string szukanie_nazwiska(wykonawca*&wskaznik, string nazwa_albumu) //funkcja wykorzystana w odnalezieniu nazwiska wykonawcy (czy ten wykonawca istnieje) gdy uzytkowni chce dodac utwor do albumu { string nazwisko1; wykonawca* wskaznik1 = wskaznik; while (wskaznik1 != NULL) { while (wskaznik1->wydane_albumy != NULL) { if (wskaznik1->wydane_albumy->nazwa == nazwa_albumu) { nazwisko1 = wskaznik1->nazwisko; return nazwisko1; } else { wskaznik1->wydane_albumy = wskaznik1->wydane_albumy->nastepny; } } wskaznik1 = wskaznik1->nastepny; } return "nie ma takiego nazwiska"; } bool szukanie3(wykonawca*&wskaznik, string nazwisko1,string imie1) //sprawdza czy podany album mozna przypisac wykonnawcy wpiasnemu przez uzytkowanika (czy istnieje wykonawca) { string nazwisko, imie; wykonawca*wskaznik1 = wskaznik; while (wskaznik1 != NULL) { if (wskaznik1->nazwisko == nazwisko1 && wskaznik1->imie == imie1 ) { return true; } else { wskaznik1 = wskaznik1->nastepny; } } return false; } void usuwanie_wykonawcy(wykonawca *& wskaznik, string imie1,string nazwisko1) { wykonawca * wskaznik1 = wskaznik; if (wskaznik1 != NULL) //sprawdzenie czy wykonawcy wogole sa w bazie dancyh { if (wskaznik1->imie == imie1 && wskaznik1->nazwisko == nazwisko1) { wskaznik = wskaznik1->nastepny; delete wskaznik1; cout << "usunieto wykonawce o imieniu " << imie1 <<"i nazwisku "<nastepny; while (wskaznik1 != NULL) //przejscie po kolejnych wykonawcach { if (wskaznik2->nazwisko == nazwisko1 && wskaznik2->imie == imie1) { wskaznik2 = wskaznik2->nastepny; delete wskaznik1->nastepny; wskaznik1->nastepny = wskaznik2; cout << "usunieto wykonawce o imieniu"<nastepny; wskaznik1 = wskaznik1->nastepny; } } cout << "nie ma takiego wykonawcy" << endl; } void wyswietl_wykonawce_podanego_utworu(wykonawca *& wskaznik, string nazwa_utworu) { wykonawca * wskaznik1 = wskaznik; while (wskaznik1 != NULL) //sprawdzenie czy wykonawca istnieje { album*wskaznik2 = wskaznik1->wydane_albumy; while (wskaznik2 != NULL) //program musi sprawdzic tez album { utwor*wskaznik3 = wskaznik2->wskaznik_utwory; while (wskaznik3 != NULL) //przejscie po kolejnych utworach albumu { if (wskaznik3->nazwa_utworu == nazwa_utworu) { cout << "Wykonawca tego utworu jest " << wskaznik1->imie << " " << wskaznik1->nazwisko << endl; return; } wskaznik3 = wskaznik3->nastepny; } wskaznik2 = wskaznik2->nastepny; } wskaznik1 = wskaznik1->nastepny; } cout << "Nie ma takiego utworu." << endl; } void zapis_do_pliku(wykonawca *& wskaznik, ofstream &plik) { wykonawca * wskaznik1=wskaznik; while (wskaznik1 != NULL) { plik << "Wykonawca " << wskaznik1->imie << " " << wskaznik1->nazwisko << endl; while (wskaznik1->wydane_albumy != NULL) { plik << "Album " << wskaznik1->wydane_albumy->nazwa << " " << wskaznik1->wydane_albumy->cena << " " << wskaznik1->wydane_albumy->data.dzien << " " << wskaznik1->wydane_albumy->data.miesiac << " " << wskaznik1->wydane_albumy->data.rok << endl; while (wskaznik1->wydane_albumy->wskaznik_utwory != NULL) { plik << "Utwor " << wskaznik1->wydane_albumy->wskaznik_utwory->nazwa_utworu << endl; wskaznik1->wydane_albumy->wskaznik_utwory = wskaznik1->wydane_albumy->wskaznik_utwory->nastepny; //przejscie po kolejnych utworach } wskaznik1->wydane_albumy = wskaznik1->wydane_albumy->nastepny; //przejscie po albumach } wskaznik1 = wskaznik1->nastepny; //przejscie po wykonawcach } } void zapis_do_pliku2(wykonawca *wskaznik) //tworzenie pliku do zapisu { string nazwa_pliku; cout << "podaj nazwe pliku do ktorego chcesz zapisac dane po ukonczeniu pracy" << endl; cin >> nazwa_pliku; ofstream plik_do_zapisu(nazwa_pliku, ios::out); if (plik_do_zapisu.is_open()) { cout << "Udalo sie utworzyc plik!" << endl; zapis_do_pliku(wskaznik, plik_do_zapisu); //wykonanie zapisu } else { cout << "Nie udalo sie utworzyc pliku, sprobuj jeszcze raz!" << endl; } } char menu() { char znak; cout << "Podaj cyfre:" << endl; cout << "1.Wyswietl wykonawcow." << endl; cout << "2.Wyswietl albumy." << endl; cout << "3.Wyswietl utwory." << endl; cout << "4.Dodaj utwor do albumu." << endl; cout << "5.Dodaj album do wykonawcy." << endl; cout << "6.Dodaj wykonawce."<> znak; return znak; } int main() { ifstream plik_do_odczytu; ofstream nazwa_pliku_do_zapisu; string cos, nazwa_utworu, nazwa_albumu, imie, nazwisko; //dane ktore wpisuje uzytkownik char znak1; int cena, dzien, miesiac, rok; wykonawca * wykonawca1 = NULL; nazwa_pliku(cos); bool otwarcie_pliku1; otwarcie_pliku1 = otwarcie_pliku(cos, plik_do_odczytu); //sprawdznie czy plik z danymi istnieje i sie otworzyl if (otwarcie_pliku1) { czytaj_z_pliku(wykonawca1, plik_do_odczytu); } else { system("pause"); return 0; } char znak = menu(); while (znak != 'k') { switch (znak) //realizacja wybranej opcji { case'1': cout << "Wykonawcy: " << endl; wyswietl_wykonawcy(wykonawca1); break; case'2': cout << "Albumy:" << endl; wyswietl_albumy(wykonawca1); break; case'3': { cout << "Utwory" << endl; wyswietl_utwory(wykonawca1); break; } case'4': cout << "Podaj nazwe utworu" << endl; cin >> nazwa_utworu; cout << "Podaj nazwe albumu" << endl; cin >> nazwa_albumu; imie = szukanie_imienia(wykonawca1, nazwa_albumu); nazwisko = szukanie_nazwiska(wykonawca1, nazwa_albumu); if (imie == "nie ma takeigo imienia" || nazwisko == "nie ma takiego nazwiska") { cout << "Nie ma takiego albumu!" << endl; break; } if (szukanie1(wykonawca1, nazwa_albumu) == false) { cout << "W spisie nie ma takeigo albumu!" << endl; break; } else dodaj_utwor_do_albumu(nazwa_utworu, wykonawca1, imie, nazwisko, nazwa_albumu); break; case'5': cout << "Podaj nazwe albumu." << endl; cin >> nazwa_albumu; cout << "Podaj imie wykonawcy ktoremu chcesz dodac album." << endl; cin >> imie; cout << "Podaj nazwisko wykonawcy." << endl; cin >> nazwisko; cout << "Podaj cene dodanego albumu" << endl; cin >> cena; while (!cin && cena > 0) { cin.clear(); cin.ignore(100, 'n'); cout << "Podaj jescze raz" << endl; cin >> cena; } cout << "Podaj dzien wydania dodanego albumu" << endl; cin >> dzien; while (!cin && cena > 0 && cena < 32) { cin.clear(); cin.ignore(100, 'n'); cout << "Podaj jescze raz" << endl; cin >> dzien; } cout << "Podaj miesiac wydania dodanego albumu" << endl; cin >> miesiac; while (!cin && miesiac > 0 && miesiac < 13) { cin.clear(); cin.ignore(100, 'n'); cout << "Podaj jescze raz" << endl; cin >> miesiac; } cout << "Podaj rok wydania dodanego albumu" << endl; cin >> rok; while (!cin && rok > 0) { cin.clear(); cin.ignore(100, 'n'); cout << "Podaj jescze raz" << endl; cin >> rok; } if (szukanie3(wykonawca1, nazwisko, imie) == false) cout << "W spisie nie ma takeigo wykonawcy!" << endl; else dodaj_album_do_wykonawcy(wykonawca1, imie, nazwisko, nazwa_albumu, cena, dzien, miesiac, rok); break; case'6': cout << "Podaj imie wykonawcy" << endl; cin >> imie; cout << "Podaj nazwisko wykonawcy" << endl; cin >> nazwisko; dodaj_wykonawce(wykonawca1, imie, nazwisko); break; case'7': cout << "Podaj imie wykonawcy ktorego chcesz usunac" << endl; cin >> imie; cout << "Podaj nazwisko wykonawcy ktorego chcesz usunac" << endl; cin >> nazwisko; usuwanie_wykonawcy(wykonawca1, imie, nazwisko); break; case '8': cout << "Podaj album ktorego date chcesz sprwadzic" << endl; cin >> nazwa_albumu; wyswietl_date_podanego_albumu(wykonawca1, nazwa_albumu); break; case '9': cout << "Podaj album którego cene chcesz sprawdzic" << endl; cin >> nazwa_albumu; wyswietl_cene_podanego_albumu(wykonawca1, nazwa_albumu); break; case 'a': cout << "Podaj utwor ktorego wykonawce chcesz sprwadzic" << endl; cin >> nazwa_utworu; wyswietl_wykonawce_podanego_utworu(wykonawca1, nazwa_utworu); break; default: cout << "zly znak" << endl; break; } char znaczek; cout << "Twoj wybor zostal zrealizowany. Chcesz cos jesscze wykonac ('T') ?" << endl; cin >> znaczek; if (znaczek == 'T') znak = menu(); else { zapis_do_pliku2(wykonawca1); //zapsianie do pliku system("pause"); return 0; } } }