Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <cstdlib>
- #include <vector>
- using namespace std;
- int identyfikatory = 1; /// zmienna ktora po kazdym dodaniu obiektu jest przypisywana jako jego ID (przymuje za wartosci wielkokrotnosci 1nki)
- struct data_urodzenia{
- public:
- int dzien, miesiac, rok;
- };
- struct lista_dwukierunkowa{
- public:
- lista_dwukierunkowa *nastepny;
- lista_dwukierunkowa *poprzedni;
- int ID;
- string imie;
- string nazwisko;
- data_urodzenia urodziny;
- string adresZamieszkania;
- string miasto;
- string innedane;
- /*lista_dwukierunkowa(){
- ID = identyfikatory;
- identyfikatory++;
- }*/
- void wyswietlOsobe(){
- cout<<"ID osoby: "<<ID<<endl;
- cout<<"Imie: "<<imie<<endl;
- cout<<"Nazwisko: "<<nazwisko<<endl;
- cout<<"Data urodzenia: "<<urodziny.dzien<<"/"<<urodziny.miesiac<<"/"<<urodziny.rok<<endl;
- cout<<"Adres zamieszkania: "<<adresZamieszkania<<endl;
- cout<<"Miasto :"<<miasto<<endl;
- cout<<"Inne dane :"<<innedane<<endl;
- }
- void modyfikujOsobe(){
- cout<<"Podaj imie: "<<endl;
- string pomocnicza="";
- int pomocniczaLiczba=0;
- cin>>pomocnicza;
- imie=pomocnicza;
- cout<<"Podaj nazwisko: "<<endl;
- cin>>pomocnicza;
- nazwisko=pomocnicza;
- A:cout<<"Podaj dzien urodzenia:"<<endl;
- cin>>pomocniczaLiczba;
- if(pomocniczaLiczba<=0||pomocniczaLiczba>31){
- cout<<"Podano nieprawidlowy dzien urodzenia: "<<endl;
- goto A;
- }
- urodziny.dzien = pomocniczaLiczba;
- B:cout<<"Podaj miesiac urodzenia:"<<endl;
- cin>>pomocniczaLiczba;
- if(pomocniczaLiczba<=0||pomocniczaLiczba>31){
- cout<<"Podano nieprawidlowy dzien urodzenia: "<<endl;
- goto B;
- }
- urodziny.miesiac = pomocniczaLiczba;
- cout<<"Podaj rok urodzenia:"<<endl;
- cin>>pomocniczaLiczba;
- urodziny.rok = pomocniczaLiczba;
- cout<<"Podaj adres zamieszkania: "<<endl;
- cin>>pomocnicza;
- adresZamieszkania=pomocnicza;
- cout<<"Podaj miasto: "<<endl;
- cin>>pomocnicza;
- miasto=pomocnicza;
- cout<<"Podaj inne dane: "<<endl;
- cin>>pomocnicza;
- innedane=pomocnicza;
- }
- };
- lista_dwukierunkowa *poczatekListy = NULL; /// wskaznik pokazujacy zawsze na pierwszy element listy (na poczatku zawsze jest NULL)
- lista_dwukierunkowa *koniecListy = NULL; /// wskaznik pokazujacy zawsze na ostatni element listy, czyli ostatnio dodany element
- ///(na poczatku zawsze jest NULL)
- void dodajOsobe(){
- cout<<endl<<endl;
- lista_dwukierunkowa* obiektListy = new lista_dwukierunkowa(); /// tworzenie obiektu stuktury typu wskaznikowego
- obiektListy->ID=identyfikatory;
- identyfikatory++; /// globalna zmienna na samej gorze programu przypisujemy oryginalny ID dla kazdego obiektu
- /// oraz zwiekszamy go (++) zeby byl unikalny rowniez dla kolejnego obiektu
- cout<<"Podaj imie: "<<endl;
- string pomocnicza="";
- int pomocniczaLiczba=0;
- cin>>pomocnicza; /// powtarzajace sie pobieranie danych z klawiatury w tym przypadku ciagu znakow (typ string)
- obiektListy->imie=pomocnicza;
- cout<<"Podaj nazwisko: "<<endl;
- cin>>pomocnicza;
- obiektListy->nazwisko=pomocnicza;
- cout<<"Podaj dzien urodzenia:"<<endl;
- cin>>pomocniczaLiczba;
- obiektListy->urodziny.dzien = pomocniczaLiczba;
- cout<<"Podaj miesiac urodzenia:"<<endl;
- cin>>pomocniczaLiczba;
- obiektListy->urodziny.miesiac = pomocniczaLiczba;
- cout<<"Podaj rok urodzenia:"<<endl;
- cin>>pomocniczaLiczba;
- obiektListy->urodziny.rok = pomocniczaLiczba;
- cout<<"Podaj adres zamieszkania: "<<endl;
- cin>>pomocnicza;
- obiektListy->adresZamieszkania=pomocnicza;
- cout<<"Podaj miasto: "<<endl;
- cin>>pomocnicza;
- obiektListy->miasto=pomocnicza;
- cout<<"Podaj inne dane: "<<endl;
- cin>>pomocnicza;
- obiektListy->innedane=pomocnicza;
- cout<<endl<<endl;
- lista_dwukierunkowa *doSzukania = poczatekListy; /// dodatkowy wskaznik do iterowania po liscie
- ///ustawiany jest na poczatek listy
- if(doSzukania==NULL){
- obiektListy->nastepny=NULL; /// wskaznik na nastepce jest zerowany
- obiektListy->poprzedni=NULL; /// wskaznik na poprzednika jest zerowany
- poczatekListy=obiektListy; /// obiekt staje poczatkiem listy
- koniecListy=obiektListy; /// i zarazem jej koncem, bo jest jedyny na liscie
- cout<<endl;
- return;
- }
- /// niepusta lista
- else{
- koniecListy->nastepny=obiektListy; /// jeszcze ostatni przed dodaniem nowego elementu obiekt, jako nastepce ustawia nowy obiekt
- obiektListy->poprzedni=koniecListy; /// poprzednikiem nowopowstalego obiektu, jest poprzedni ostatni element
- obiektListy->nastepny=NULL; /// nastepca nowego obiektu jest zerowany, bo poki co on jest ostatni
- koniecListy=obiektListy; /// nowpowstaly element staje sie koncem listy
- cout<<endl;
- return;
- }
- }
- void wyszukajOsobe(){
- cout<<"Wpisz nazwisko osoby ktora chcesz znalezc: "<<endl;
- string szukane_nazwisko = "";
- cin>>szukane_nazwisko; /// tu wpisujemy nazwisko osoby ktore chcemy znalezc
- cout<<endl<<endl;
- lista_dwukierunkowa *doSzukania = poczatekListy;
- if (doSzukania == NULL)
- {
- cout<<"Lista jest pusta, nie ma sensu niczego usuwac"<<endl<<endl;
- return;
- }
- while(doSzukania->nastepny!=NULL) /// ta petla przechodzi cala liste
- {
- /// petla dziala dopoki obecnie przegladany element ma nastepnika (jesli nie ma lista sie konczy czyli w przypadku
- /// doSzukania->nastepny==NULL
- if(doSzukania->nazwisko==szukane_nazwisko) /// jesli wpisane przez nas nazwisko, posiada ktoras z osob w liscie
- {
- cout<<"Znaleziono osobe o podanym nazwisku, oto jego dane: "<<endl;
- doSzukania->wyswietlOsobe(); /// to wyswietlamy o nim dane poprzez wywolanie funkcji wewnatrz struktury
- cout<<endl<<endl;
- return;
- }
- doSzukania=doSzukania->nastepny; /// tutaj obecny element w liscie staje sie swoim nastepnikiem ( i tak dziala ten caly while )
- }
- /// ten if jest potrzebny, poniewaz to zachodzi zawsze dla ostatniego elementu
- if(doSzukania->nazwisko==szukane_nazwisko)
- {
- cout<<"Znaleziono osobe o podanym nazwisku, oto jego dane: "<<endl;
- doSzukania->wyswietlOsobe();
- cout<<endl<<endl;
- return;
- }
- cout<<"Nie znaleziono osoby o takim nazwisku, jesli chcesz kontynuowac szukanie po ID wcisnij 1, jesli wrocic do menu 0"<<endl;
- int corobic = 0;
- cin>>corobic;
- if(corobic==1){
- cout<<endl<<endl;
- wyszukajOsobe();
- }else{
- cout<<endl<<endl;
- return;
- }
- }
- void modyfikacja(){
- cout<<"Wpisz ID osoby ktora chcesz zmodyfikowac"<<endl;
- int szukane_ID = 0;
- cin>>szukane_ID; /// tu wpisujemy ID osoby ktora chcemy znlezc
- lista_dwukierunkowa *doSzukania = poczatekListy;
- if (doSzukania == NULL)
- {
- cout<<"Lista jest pusta, nie ma sensu niczego modyfikowac"<<endl;
- return;
- }
- while(doSzukania->nastepny!=NULL)
- {
- if(doSzukania->ID==szukane_ID)
- {
- cout<<"Znaleziono osobe o podanym ID, wprowadz nowe dane osoby: "<<endl;
- doSzukania->modyfikujOsobe();
- return;
- }
- doSzukania=doSzukania->nastepny;
- }
- /// w razie gdyby
- if(doSzukania->ID==szukane_ID)
- {
- cout<<"Znaleziono osobe o podanym ID, wprowadz nowe dane osoby: "<<endl;
- doSzukania->modyfikujOsobe();
- cout<<endl<<endl;
- return;
- }
- /// to zadziala jak nie znajdzie zadnej osoby o podanym przez uzytkownika ID
- cout<<"Nie znaleziono osoby o takim ID, jesli chcesz kontynuowac szukanie po ID wcisnij 1, jesli wrocic do menu 0"<<endl;
- int corobic = 0;
- cin>>corobic;
- if(corobic==1){
- modyfikacja();
- cout<<endl<<endl;
- }else{
- cout<<endl<<endl;
- return;
- }
- }
- void usun_osobe(){
- cout<<"Wpisz nazwisko osoby ktora chcesz usunac"<<endl;
- string szukane_nazwisko = "";
- cin>>szukane_nazwisko;
- cout<<endl<<endl;
- lista_dwukierunkowa *doSzukania = poczatekListy;
- lista_dwukierunkowa *tymczasowy;
- if (doSzukania == NULL)
- {
- cout<<"Lista jest pusta, nie ma sensu niczego usuwac"<<endl<<endl;
- return;
- }
- /// usuwanie jesli osoba jest na 1 miesjcu listy
- if(poczatekListy->nazwisko==szukane_nazwisko){
- tymczasowy = poczatekListy;
- poczatekListy = poczatekListy->nastepny;
- poczatekListy->poprzedni = NULL;
- cout<<"Usunieto osobe o podanym nazwisku"<<endl<<endl;
- free(tymczasowy);
- return;
- }
- /// usuwanie srodkowego elementu
- while (doSzukania->nastepny->nastepny != NULL)
- {
- if (doSzukania->nastepny->nazwisko == szukane_nazwisko)
- {
- tymczasowy = doSzukania->nastepny;
- doSzukania->nastepny = tymczasowy->nastepny;
- tymczasowy->nastepny->poprzedni = doSzukania;
- cout<<"Usunieto osobe o podanym nazwisku"<<endl<<endl;
- free(tymczasowy);
- return;
- }
- doSzukania = doSzukania->nastepny;
- }
- /// usuwanie jesli jest na koncu listy
- if (doSzukania->nastepny->nazwisko == szukane_nazwisko)
- {
- tymczasowy = doSzukania->nastepny;
- free(tymczasowy);
- doSzukania->nastepny = NULL;
- cout<<"Usunieto osobe o podanym nazwisku"<<endl<<endl;
- return;
- }
- cout<<"Nie usnunieto osoby o podanym nazwisku, poniewaz takowa nie istnieje na liscie"<<endl;
- cout<<endl<<endl;
- }
- void zapis(){
- ofstream plikZapisowy; /// tworzymy zmienna ktora, tworzy polaczenie z plikiem
- plikZapisowy.open("zapisaneobiekty.txt"); /// otwieramy plik o danej nazwie
- lista_dwukierunkowa *doSzukania = poczatekListy; /// ustawiamy dodatkowy wskaznik na pocatek listy
- while(doSzukania->nastepny!=NULL) ///petla przechodzi przez cala liste dwukiernkowa zapisujac po kolei obiekty
- {
- plikZapisowy<<doSzukania->ID<<"\n"; /// czyli po kolei kazda zmienna utworzonych obiektow struktury
- plikZapisowy<<doSzukania->imie<<"\n";
- plikZapisowy<<doSzukania->nazwisko<<"\n";
- plikZapisowy<<doSzukania->urodziny.dzien<<"\n";
- plikZapisowy<<doSzukania->urodziny.miesiac<<"\n";
- plikZapisowy<<doSzukania->urodziny.rok<<"\n";
- plikZapisowy<<doSzukania->adresZamieszkania<<"\n";
- plikZapisowy<<doSzukania->miasto<<"\n";
- plikZapisowy<<doSzukania->innedane<<"\n";
- doSzukania=doSzukania->nastepny;
- }
- /// ostatni obiekt
- plikZapisowy<<doSzukania->ID<<"\n";
- plikZapisowy<<doSzukania->imie<<"\n";
- plikZapisowy<<doSzukania->nazwisko<<"\n";
- plikZapisowy<<doSzukania->urodziny.dzien<<"\n";
- plikZapisowy<<doSzukania->urodziny.miesiac<<"\n";
- plikZapisowy<<doSzukania->urodziny.rok<<"\n";
- plikZapisowy<<doSzukania->adresZamieszkania<<"\n";
- plikZapisowy<<doSzukania->miasto<<"\n";
- plikZapisowy<<doSzukania->innedane<<"\n.";/// na koncu pliku wpisywana jest kropka, jesli program przy wczytywaniu natrafi na kropke
- /// oznacza to ze dotarl do konca pliku, znak jest umowny moze byc np przecinek
- plikZapisowy.close(); /// zamkniecie pliku
- cout<<endl<<endl;
- }
- void odczyt(){
- /** dziala ale wczytuje jakby 1 obiekt za duzo**/
- ifstream plikOdczytowy;
- plikOdczytowy.open("zapisaneobiekty.txt");/// otwieramy plik z ktorego chcemy czytac dane
- string pobierane_ciagiznakow;
- while(plikOdczytowy.is_open())/// while dopoki plik jest otwarty
- {
- /// tworzymy nowy obiekt struktury typu wskaznikowego
- getline(plikOdczytowy,pobierane_ciagiznakow); /// getline pobiera z pliku (1 argument funkcji), do zmiennej string (2gi argument funkcji getline)
- /// czyli pobierane_ciagiznakow staje sie linijka textu z pliku
- if(pobierane_ciagiznakow=="."){ /// jesli natrafi na kropke (umowny znak zakonczenia pliku) konczy wczytywac plik
- plikOdczytowy.close();
- return;
- }
- lista_dwukierunkowa* obiektListy = new lista_dwukierunkowa();
- /*** trzeba poprawic ID, w razie wczytywania z pliku nie pobieramy ich z pliku, a robimy to wedle zmiennej globalnej ***/
- obiektListy->ID=identyfikatory;
- identyfikatory++;
- obiektListy->imie=pobierane_ciagiznakow;
- getline(plikOdczytowy,pobierane_ciagiznakow);
- obiektListy->nazwisko=pobierane_ciagiznakow;
- getline(plikOdczytowy,pobierane_ciagiznakow);
- obiektListy->urodziny.dzien=atoi(pobierane_ciagiznakow.c_str());
- getline(plikOdczytowy,pobierane_ciagiznakow);
- obiektListy->urodziny.miesiac=atoi(pobierane_ciagiznakow.c_str());
- getline(plikOdczytowy,pobierane_ciagiznakow);
- obiektListy->urodziny.rok=atoi(pobierane_ciagiznakow.c_str());
- getline(plikOdczytowy,pobierane_ciagiznakow);
- obiektListy->adresZamieszkania=pobierane_ciagiznakow;
- getline(plikOdczytowy,pobierane_ciagiznakow);
- obiektListy->miasto=pobierane_ciagiznakow;
- getline(plikOdczytowy,pobierane_ciagiznakow);
- obiektListy->innedane=pobierane_ciagiznakow;
- obiektListy->wyswietlOsobe();
- /// a pozniej po wczytaniu, kazdy z obiektow dokladany jest do naszej listy
- if(poczatekListy==NULL){
- obiektListy->nastepny=NULL; /// wskaznik na nastepce jest zerowany
- obiektListy->poprzedni=NULL; /// wskaznik na poprzednika jest zerowany
- poczatekListy=obiektListy; /// obiekt staje poczatkiem listy
- koniecListy=obiektListy; /// i zarazem jej koncem, bo jest jedyny na liscie
- }
- /// niepusta lista
- else{
- koniecListy->nastepny=obiektListy; /// jeszcze ostatni przed dodaniem nowego elementu obiekt, jako nastepce ustawia nowy obiekt
- obiektListy->poprzedni=koniecListy; /// poprzednikiem nowopowstalego obiektu, jest poprzedni ostatni element
- obiektListy->nastepny=NULL; /// nastepca nowego obiektu jest zerowany, bo poki co on jest ostatni
- koniecListy=obiektListy; /// nowpowstaly element staje sie koncem listy
- }
- }
- cout<<endl<<endl;
- }
- void wyswietl(){
- lista_dwukierunkowa *pnt = poczatekListy; /// wskaznik dodatkowy ktory bd pokazywac na poczatek listy
- cout<<"Wyswietlanie osob z calej listy: "<<endl;
- cout<<"Nazwisko\tImie\tID\tMiasto"<<endl;
- while(pnt->nastepny!=NULL){ /// a tu po prostu przechodzimy cala liste i wyswietlamy dla kazdego Nz,Im,ID,Mst jak chcial ten koles
- cout<<pnt->nazwisko<<"\t";
- cout<<pnt->imie<<"\t";
- cout<<pnt->ID<<"\t";
- cout<<pnt->miasto<<"\t";
- pnt=pnt->nastepny;
- cout<<endl;
- } /// a tu ostatni obiekt jak zawsze
- cout<<pnt->nazwisko<<"\t";
- cout<<pnt->imie<<"\t";
- cout<<pnt->ID<<"\t";
- cout<<pnt->miasto<<"\t";
- cout<<endl<<endl;
- }
- void menu(){
- cout<<"Menu listy dwukierunkowej:"<<endl;
- cout<<"1.Dodaj nowa osobe do listy"<<endl;
- cout<<"2.Usun osobe z listy"<<endl;
- cout<<"3.Wyszukaj osobe w liscie"<<endl;
- cout<<"4.Wyswietl osoby z listy alfabetycznie"<<endl;
- cout<<"5.Modyfikuj osobe"<<endl;
- cout<<"6.Zapis listy do pliku"<<endl;
- cout<<"7.Odczyt listy z pliku"<<endl;
- cout<<"8.Zakonczenie pracy programu"<<endl<<endl;
- cout<<"Podaj numer polecenie ktore ma byc wykonane"<<endl;
- }
- int main(){
- int wybor = 0;
- while(1){
- menu();
- cin>>wybor;
- switch(wybor)
- {
- case 1:
- cout<<"Dodawnie nowej osoby..."<<endl;
- dodajOsobe();
- break;
- case 2:
- cout<<"Usuwanie osoby..."<<endl;
- usun_osobe();
- break;
- case 3:
- cout<<"Szukanie osoby..."<<endl;
- wyszukajOsobe();
- break;
- case 4:
- cout<<"Wyswietlenie osob alfabetycznie..."<<endl;
- wyswietl();
- break;
- case 5:
- cout<<"Modyfikuje osobe.."<<endl;
- modyfikacja();
- break;
- case 6:
- cout<<"Zapisywanie do pliku..."<<endl;
- zapis();
- break;
- case 7:
- cout<<"Odczytywanie z pliku..."<<endl;
- odczyt();
- break;
- case 8:
- cout<<"Zakonczono prace programu"<<endl;
- return 0;
- default: ///domyslne, jak wpiszesz cokolwiek innego liczbowego niz 1-8 (bo jak literke, to sama zobacz;)) to wyswietla znowu menu i pyta o wybor
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement