Advertisement
Guest User

Untitled

a guest
Jan 24th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. int identyfikatory = 1; /// zmienna ktora po kazdym dodaniu obiektu jest przypisywana jako jego ID (przymuje za wartosci wielkokrotnosci 1nki)
  9.  
  10. struct data_urodzenia{
  11. public:
  12. int dzien, miesiac, rok;
  13. };
  14.  
  15. struct lista_dwukierunkowa{
  16. public:
  17. lista_dwukierunkowa *nastepny;
  18. lista_dwukierunkowa *poprzedni;
  19. int ID;
  20. string imie;
  21. string nazwisko;
  22. data_urodzenia urodziny;
  23. string adresZamieszkania;
  24. string miasto;
  25. string innedane;
  26. /*lista_dwukierunkowa(){
  27. ID = identyfikatory;
  28. identyfikatory++;
  29. }*/
  30. void wyswietlOsobe(){
  31. cout<<"ID osoby: "<<ID<<endl;
  32. cout<<"Imie: "<<imie<<endl;
  33. cout<<"Nazwisko: "<<nazwisko<<endl;
  34. cout<<"Data urodzenia: "<<urodziny.dzien<<"/"<<urodziny.miesiac<<"/"<<urodziny.rok<<endl;
  35. cout<<"Adres zamieszkania: "<<adresZamieszkania<<endl;
  36. cout<<"Miasto :"<<miasto<<endl;
  37. cout<<"Inne dane :"<<innedane<<endl;
  38. }
  39. void modyfikujOsobe(){
  40. cout<<"Podaj imie: "<<endl;
  41. string pomocnicza="";
  42. int pomocniczaLiczba=0;
  43. cin>>pomocnicza;
  44. imie=pomocnicza;
  45. cout<<"Podaj nazwisko: "<<endl;
  46. cin>>pomocnicza;
  47. nazwisko=pomocnicza;
  48. A:cout<<"Podaj dzien urodzenia:"<<endl;
  49. cin>>pomocniczaLiczba;
  50. if(pomocniczaLiczba<=0||pomocniczaLiczba>31){
  51. cout<<"Podano nieprawidlowy dzien urodzenia: "<<endl;
  52. goto A;
  53. }
  54. urodziny.dzien = pomocniczaLiczba;
  55. B:cout<<"Podaj miesiac urodzenia:"<<endl;
  56. cin>>pomocniczaLiczba;
  57. if(pomocniczaLiczba<=0||pomocniczaLiczba>31){
  58. cout<<"Podano nieprawidlowy dzien urodzenia: "<<endl;
  59. goto B;
  60. }
  61. urodziny.miesiac = pomocniczaLiczba;
  62. cout<<"Podaj rok urodzenia:"<<endl;
  63. cin>>pomocniczaLiczba;
  64. urodziny.rok = pomocniczaLiczba;
  65. cout<<"Podaj adres zamieszkania: "<<endl;
  66. cin>>pomocnicza;
  67. adresZamieszkania=pomocnicza;
  68. cout<<"Podaj miasto: "<<endl;
  69. cin>>pomocnicza;
  70. miasto=pomocnicza;
  71. cout<<"Podaj inne dane: "<<endl;
  72. cin>>pomocnicza;
  73. innedane=pomocnicza;
  74. }
  75. };
  76.  
  77. lista_dwukierunkowa *poczatekListy = NULL; /// wskaznik pokazujacy zawsze na pierwszy element listy (na poczatku zawsze jest NULL)
  78. lista_dwukierunkowa *koniecListy = NULL; /// wskaznik pokazujacy zawsze na ostatni element listy, czyli ostatnio dodany element
  79. ///(na poczatku zawsze jest NULL)
  80.  
  81. void dodajOsobe(){
  82.  
  83. cout<<endl<<endl;
  84. lista_dwukierunkowa* obiektListy = new lista_dwukierunkowa(); /// tworzenie obiektu stuktury typu wskaznikowego
  85. obiektListy->ID=identyfikatory;
  86. identyfikatory++; /// globalna zmienna na samej gorze programu przypisujemy oryginalny ID dla kazdego obiektu
  87. /// oraz zwiekszamy go (++) zeby byl unikalny rowniez dla kolejnego obiektu
  88. cout<<"Podaj imie: "<<endl;
  89. string pomocnicza="";
  90. int pomocniczaLiczba=0;
  91. cin>>pomocnicza; /// powtarzajace sie pobieranie danych z klawiatury w tym przypadku ciagu znakow (typ string)
  92. obiektListy->imie=pomocnicza;
  93. cout<<"Podaj nazwisko: "<<endl;
  94. cin>>pomocnicza;
  95. obiektListy->nazwisko=pomocnicza;
  96. cout<<"Podaj dzien urodzenia:"<<endl;
  97. cin>>pomocniczaLiczba;
  98. obiektListy->urodziny.dzien = pomocniczaLiczba;
  99. cout<<"Podaj miesiac urodzenia:"<<endl;
  100. cin>>pomocniczaLiczba;
  101. obiektListy->urodziny.miesiac = pomocniczaLiczba;
  102. cout<<"Podaj rok urodzenia:"<<endl;
  103. cin>>pomocniczaLiczba;
  104. obiektListy->urodziny.rok = pomocniczaLiczba;
  105. cout<<"Podaj adres zamieszkania: "<<endl;
  106. cin>>pomocnicza;
  107. obiektListy->adresZamieszkania=pomocnicza;
  108. cout<<"Podaj miasto: "<<endl;
  109. cin>>pomocnicza;
  110. obiektListy->miasto=pomocnicza;
  111. cout<<"Podaj inne dane: "<<endl;
  112. cin>>pomocnicza;
  113. obiektListy->innedane=pomocnicza;
  114. cout<<endl<<endl;
  115.  
  116. lista_dwukierunkowa *doSzukania = poczatekListy; /// dodatkowy wskaznik do iterowania po liscie
  117. ///ustawiany jest na poczatek listy
  118. if(doSzukania==NULL){
  119. obiektListy->nastepny=NULL; /// wskaznik na nastepce jest zerowany
  120. obiektListy->poprzedni=NULL; /// wskaznik na poprzednika jest zerowany
  121. poczatekListy=obiektListy; /// obiekt staje poczatkiem listy
  122. koniecListy=obiektListy; /// i zarazem jej koncem, bo jest jedyny na liscie
  123. cout<<endl;
  124. return;
  125. }
  126. /// niepusta lista
  127. else{
  128. koniecListy->nastepny=obiektListy; /// jeszcze ostatni przed dodaniem nowego elementu obiekt, jako nastepce ustawia nowy obiekt
  129. obiektListy->poprzedni=koniecListy; /// poprzednikiem nowopowstalego obiektu, jest poprzedni ostatni element
  130. obiektListy->nastepny=NULL; /// nastepca nowego obiektu jest zerowany, bo poki co on jest ostatni
  131. koniecListy=obiektListy; /// nowpowstaly element staje sie koncem listy
  132. cout<<endl;
  133. return;
  134. }
  135. }
  136.  
  137. void wyszukajOsobe(){
  138. cout<<"Wpisz nazwisko osoby ktora chcesz znalezc: "<<endl;
  139. string szukane_nazwisko = "";
  140. cin>>szukane_nazwisko; /// tu wpisujemy nazwisko osoby ktore chcemy znalezc
  141. cout<<endl<<endl;
  142. lista_dwukierunkowa *doSzukania = poczatekListy;
  143. if (doSzukania == NULL)
  144. {
  145. cout<<"Lista jest pusta, nie ma sensu niczego usuwac"<<endl<<endl;
  146. return;
  147. }
  148. while(doSzukania->nastepny!=NULL) /// ta petla przechodzi cala liste
  149. {
  150. /// petla dziala dopoki obecnie przegladany element ma nastepnika (jesli nie ma lista sie konczy czyli w przypadku
  151. /// doSzukania->nastepny==NULL
  152. if(doSzukania->nazwisko==szukane_nazwisko) /// jesli wpisane przez nas nazwisko, posiada ktoras z osob w liscie
  153. {
  154. cout<<"Znaleziono osobe o podanym nazwisku, oto jego dane: "<<endl;
  155. doSzukania->wyswietlOsobe(); /// to wyswietlamy o nim dane poprzez wywolanie funkcji wewnatrz struktury
  156. cout<<endl<<endl;
  157. return;
  158. }
  159. doSzukania=doSzukania->nastepny; /// tutaj obecny element w liscie staje sie swoim nastepnikiem ( i tak dziala ten caly while )
  160. }
  161. /// ten if jest potrzebny, poniewaz to zachodzi zawsze dla ostatniego elementu
  162. if(doSzukania->nazwisko==szukane_nazwisko)
  163. {
  164. cout<<"Znaleziono osobe o podanym nazwisku, oto jego dane: "<<endl;
  165. doSzukania->wyswietlOsobe();
  166. cout<<endl<<endl;
  167. return;
  168. }
  169. cout<<"Nie znaleziono osoby o takim nazwisku, jesli chcesz kontynuowac szukanie po ID wcisnij 1, jesli wrocic do menu 0"<<endl;
  170. int corobic = 0;
  171. cin>>corobic;
  172. if(corobic==1){
  173. cout<<endl<<endl;
  174. wyszukajOsobe();
  175. }else{
  176. cout<<endl<<endl;
  177. return;
  178. }
  179. }
  180.  
  181. void modyfikacja(){
  182.  
  183. cout<<"Wpisz ID osoby ktora chcesz zmodyfikowac"<<endl;
  184. int szukane_ID = 0;
  185. cin>>szukane_ID; /// tu wpisujemy ID osoby ktora chcemy znlezc
  186. lista_dwukierunkowa *doSzukania = poczatekListy;
  187. if (doSzukania == NULL)
  188. {
  189. cout<<"Lista jest pusta, nie ma sensu niczego modyfikowac"<<endl;
  190. return;
  191. }
  192. while(doSzukania->nastepny!=NULL)
  193. {
  194. if(doSzukania->ID==szukane_ID)
  195. {
  196. cout<<"Znaleziono osobe o podanym ID, wprowadz nowe dane osoby: "<<endl;
  197. doSzukania->modyfikujOsobe();
  198. return;
  199. }
  200. doSzukania=doSzukania->nastepny;
  201. }
  202. /// w razie gdyby
  203. if(doSzukania->ID==szukane_ID)
  204. {
  205. cout<<"Znaleziono osobe o podanym ID, wprowadz nowe dane osoby: "<<endl;
  206. doSzukania->modyfikujOsobe();
  207. cout<<endl<<endl;
  208. return;
  209. }
  210. /// to zadziala jak nie znajdzie zadnej osoby o podanym przez uzytkownika ID
  211. cout<<"Nie znaleziono osoby o takim ID, jesli chcesz kontynuowac szukanie po ID wcisnij 1, jesli wrocic do menu 0"<<endl;
  212. int corobic = 0;
  213. cin>>corobic;
  214. if(corobic==1){
  215. modyfikacja();
  216. cout<<endl<<endl;
  217. }else{
  218. cout<<endl<<endl;
  219. return;
  220. }
  221. }
  222.  
  223. void usun_osobe(){
  224. cout<<"Wpisz nazwisko osoby ktora chcesz usunac"<<endl;
  225. string szukane_nazwisko = "";
  226. cin>>szukane_nazwisko;
  227. cout<<endl<<endl;
  228. lista_dwukierunkowa *doSzukania = poczatekListy;
  229. lista_dwukierunkowa *tymczasowy;
  230. if (doSzukania == NULL)
  231. {
  232. cout<<"Lista jest pusta, nie ma sensu niczego usuwac"<<endl<<endl;
  233. return;
  234. }
  235. /// usuwanie jesli osoba jest na 1 miesjcu listy
  236. if(poczatekListy->nazwisko==szukane_nazwisko){
  237. tymczasowy = poczatekListy;
  238. poczatekListy = poczatekListy->nastepny;
  239. poczatekListy->poprzedni = NULL;
  240. cout<<"Usunieto osobe o podanym nazwisku"<<endl<<endl;
  241. free(tymczasowy);
  242. return;
  243. }
  244. /// usuwanie srodkowego elementu
  245. while (doSzukania->nastepny->nastepny != NULL)
  246. {
  247. if (doSzukania->nastepny->nazwisko == szukane_nazwisko)
  248. {
  249. tymczasowy = doSzukania->nastepny;
  250. doSzukania->nastepny = tymczasowy->nastepny;
  251. tymczasowy->nastepny->poprzedni = doSzukania;
  252. cout<<"Usunieto osobe o podanym nazwisku"<<endl<<endl;
  253. free(tymczasowy);
  254. return;
  255. }
  256. doSzukania = doSzukania->nastepny;
  257. }
  258. /// usuwanie jesli jest na koncu listy
  259. if (doSzukania->nastepny->nazwisko == szukane_nazwisko)
  260. {
  261. tymczasowy = doSzukania->nastepny;
  262. free(tymczasowy);
  263. doSzukania->nastepny = NULL;
  264. cout<<"Usunieto osobe o podanym nazwisku"<<endl<<endl;
  265. return;
  266. }
  267. cout<<"Nie usnunieto osoby o podanym nazwisku, poniewaz takowa nie istnieje na liscie"<<endl;
  268. cout<<endl<<endl;
  269. }
  270.  
  271. void zapis(){
  272. ofstream plikZapisowy; /// tworzymy zmienna ktora, tworzy polaczenie z plikiem
  273. plikZapisowy.open("zapisaneobiekty.txt"); /// otwieramy plik o danej nazwie
  274. lista_dwukierunkowa *doSzukania = poczatekListy; /// ustawiamy dodatkowy wskaznik na pocatek listy
  275. while(doSzukania->nastepny!=NULL) ///petla przechodzi przez cala liste dwukiernkowa zapisujac po kolei obiekty
  276. {
  277. plikZapisowy<<doSzukania->ID<<"\n"; /// czyli po kolei kazda zmienna utworzonych obiektow struktury
  278. plikZapisowy<<doSzukania->imie<<"\n";
  279. plikZapisowy<<doSzukania->nazwisko<<"\n";
  280. plikZapisowy<<doSzukania->urodziny.dzien<<"\n";
  281. plikZapisowy<<doSzukania->urodziny.miesiac<<"\n";
  282. plikZapisowy<<doSzukania->urodziny.rok<<"\n";
  283. plikZapisowy<<doSzukania->adresZamieszkania<<"\n";
  284. plikZapisowy<<doSzukania->miasto<<"\n";
  285. plikZapisowy<<doSzukania->innedane<<"\n";
  286. doSzukania=doSzukania->nastepny;
  287. }
  288. /// ostatni obiekt
  289. plikZapisowy<<doSzukania->ID<<"\n";
  290. plikZapisowy<<doSzukania->imie<<"\n";
  291. plikZapisowy<<doSzukania->nazwisko<<"\n";
  292. plikZapisowy<<doSzukania->urodziny.dzien<<"\n";
  293. plikZapisowy<<doSzukania->urodziny.miesiac<<"\n";
  294. plikZapisowy<<doSzukania->urodziny.rok<<"\n";
  295. plikZapisowy<<doSzukania->adresZamieszkania<<"\n";
  296. plikZapisowy<<doSzukania->miasto<<"\n";
  297. plikZapisowy<<doSzukania->innedane<<"\n.";/// na koncu pliku wpisywana jest kropka, jesli program przy wczytywaniu natrafi na kropke
  298. /// oznacza to ze dotarl do konca pliku, znak jest umowny moze byc np przecinek
  299. plikZapisowy.close(); /// zamkniecie pliku
  300. cout<<endl<<endl;
  301. }
  302.  
  303. void odczyt(){
  304. /** dziala ale wczytuje jakby 1 obiekt za duzo**/
  305. ifstream plikOdczytowy;
  306. plikOdczytowy.open("zapisaneobiekty.txt");/// otwieramy plik z ktorego chcemy czytac dane
  307. string pobierane_ciagiznakow;
  308. while(plikOdczytowy.is_open())/// while dopoki plik jest otwarty
  309. {
  310. /// tworzymy nowy obiekt struktury typu wskaznikowego
  311. getline(plikOdczytowy,pobierane_ciagiznakow); /// getline pobiera z pliku (1 argument funkcji), do zmiennej string (2gi argument funkcji getline)
  312. /// czyli pobierane_ciagiznakow staje sie linijka textu z pliku
  313. if(pobierane_ciagiznakow=="."){ /// jesli natrafi na kropke (umowny znak zakonczenia pliku) konczy wczytywac plik
  314. plikOdczytowy.close();
  315. return;
  316. }
  317. lista_dwukierunkowa* obiektListy = new lista_dwukierunkowa();
  318. /*** trzeba poprawic ID, w razie wczytywania z pliku nie pobieramy ich z pliku, a robimy to wedle zmiennej globalnej ***/
  319. obiektListy->ID=identyfikatory;
  320. identyfikatory++;
  321. obiektListy->imie=pobierane_ciagiznakow;
  322. getline(plikOdczytowy,pobierane_ciagiznakow);
  323. obiektListy->nazwisko=pobierane_ciagiznakow;
  324. getline(plikOdczytowy,pobierane_ciagiznakow);
  325. obiektListy->urodziny.dzien=atoi(pobierane_ciagiznakow.c_str());
  326. getline(plikOdczytowy,pobierane_ciagiznakow);
  327. obiektListy->urodziny.miesiac=atoi(pobierane_ciagiznakow.c_str());
  328. getline(plikOdczytowy,pobierane_ciagiznakow);
  329. obiektListy->urodziny.rok=atoi(pobierane_ciagiznakow.c_str());
  330. getline(plikOdczytowy,pobierane_ciagiznakow);
  331. obiektListy->adresZamieszkania=pobierane_ciagiznakow;
  332. getline(plikOdczytowy,pobierane_ciagiznakow);
  333. obiektListy->miasto=pobierane_ciagiznakow;
  334. getline(plikOdczytowy,pobierane_ciagiznakow);
  335. obiektListy->innedane=pobierane_ciagiznakow;
  336. obiektListy->wyswietlOsobe();
  337. /// a pozniej po wczytaniu, kazdy z obiektow dokladany jest do naszej listy
  338. if(poczatekListy==NULL){
  339. obiektListy->nastepny=NULL; /// wskaznik na nastepce jest zerowany
  340. obiektListy->poprzedni=NULL; /// wskaznik na poprzednika jest zerowany
  341. poczatekListy=obiektListy; /// obiekt staje poczatkiem listy
  342. koniecListy=obiektListy; /// i zarazem jej koncem, bo jest jedyny na liscie
  343. }
  344. /// niepusta lista
  345. else{
  346. koniecListy->nastepny=obiektListy; /// jeszcze ostatni przed dodaniem nowego elementu obiekt, jako nastepce ustawia nowy obiekt
  347. obiektListy->poprzedni=koniecListy; /// poprzednikiem nowopowstalego obiektu, jest poprzedni ostatni element
  348. obiektListy->nastepny=NULL; /// nastepca nowego obiektu jest zerowany, bo poki co on jest ostatni
  349. koniecListy=obiektListy; /// nowpowstaly element staje sie koncem listy
  350. }
  351. }
  352. cout<<endl<<endl;
  353. }
  354.  
  355. void wyswietl(){
  356. lista_dwukierunkowa *pnt = poczatekListy; /// wskaznik dodatkowy ktory bd pokazywac na poczatek listy
  357. cout<<"Wyswietlanie osob z calej listy: "<<endl;
  358. cout<<"Nazwisko\tImie\tID\tMiasto"<<endl;
  359. while(pnt->nastepny!=NULL){ /// a tu po prostu przechodzimy cala liste i wyswietlamy dla kazdego Nz,Im,ID,Mst jak chcial ten koles
  360. cout<<pnt->nazwisko<<"\t";
  361. cout<<pnt->imie<<"\t";
  362. cout<<pnt->ID<<"\t";
  363. cout<<pnt->miasto<<"\t";
  364. pnt=pnt->nastepny;
  365. cout<<endl;
  366. } /// a tu ostatni obiekt jak zawsze
  367. cout<<pnt->nazwisko<<"\t";
  368. cout<<pnt->imie<<"\t";
  369. cout<<pnt->ID<<"\t";
  370. cout<<pnt->miasto<<"\t";
  371. cout<<endl<<endl;
  372. }
  373.  
  374. void menu(){
  375. cout<<"Menu listy dwukierunkowej:"<<endl;
  376. cout<<"1.Dodaj nowa osobe do listy"<<endl;
  377. cout<<"2.Usun osobe z listy"<<endl;
  378. cout<<"3.Wyszukaj osobe w liscie"<<endl;
  379. cout<<"4.Wyswietl osoby z listy alfabetycznie"<<endl;
  380. cout<<"5.Modyfikuj osobe"<<endl;
  381. cout<<"6.Zapis listy do pliku"<<endl;
  382. cout<<"7.Odczyt listy z pliku"<<endl;
  383. cout<<"8.Zakonczenie pracy programu"<<endl<<endl;
  384. cout<<"Podaj numer polecenie ktore ma byc wykonane"<<endl;
  385. }
  386.  
  387. int main(){
  388. int wybor = 0;
  389. while(1){
  390. menu();
  391. cin>>wybor;
  392. switch(wybor)
  393. {
  394. case 1:
  395. cout<<"Dodawnie nowej osoby..."<<endl;
  396. dodajOsobe();
  397. break;
  398. case 2:
  399. cout<<"Usuwanie osoby..."<<endl;
  400. usun_osobe();
  401. break;
  402. case 3:
  403. cout<<"Szukanie osoby..."<<endl;
  404. wyszukajOsobe();
  405. break;
  406. case 4:
  407. cout<<"Wyswietlenie osob alfabetycznie..."<<endl;
  408. wyswietl();
  409. break;
  410. case 5:
  411. cout<<"Modyfikuje osobe.."<<endl;
  412. modyfikacja();
  413. break;
  414. case 6:
  415. cout<<"Zapisywanie do pliku..."<<endl;
  416. zapis();
  417. break;
  418. case 7:
  419. cout<<"Odczytywanie z pliku..."<<endl;
  420. odczyt();
  421. break;
  422. case 8:
  423. cout<<"Zakonczono prace programu"<<endl;
  424. return 0;
  425. default: ///domyslne, jak wpiszesz cokolwiek innego liczbowego niz 1-8 (bo jak literke, to sama zobacz;)) to wyswietla znowu menu i pyta o wybor
  426. break;
  427. }
  428. }
  429. return 0;
  430. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement