Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.30 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<windows.h>
  5. #include<time.h>
  6. #include<conio.h>
  7. struct autor // struktura autora
  8. {
  9. char nazwisko[20];
  10. char imie[20];
  11. };
  12. struct data // struktura wszystkich informacji w ksiazce
  13. {
  14. char tytul[20];
  15. struct autor autor1; // autorzy zawieraja sie w strukturze ksiazki
  16. struct autor autor2;
  17. int ilosc_stron;
  18. char pozyczona_komu[30];
  19. char pozyczona_kiedy[11];
  20. };
  21. struct ksiazki //struktura ksiazek
  22. {
  23. struct data info;
  24. struct ksiazki*nast; //nastepny element
  25. };
  26. struct ksiazki*pocz=NULL;//pierwszy element
  27. struct ksiazki*kon=NULL;//ostatni element
  28.  
  29. void import() //import z pliku
  30. {
  31. int i;
  32. char pwej[50]; // jezeli chcesz podawac wlasna nazwe pliku do wczytania to usun ="lista.txt"; i 2 linie nizej odkomentuj scanf
  33. printf("Podaj nazwe pliku: ");
  34. scanf("%s",&pwej); //jezeli chcesz podawac wlasna nazwe to tu odkomentuj
  35. FILE*plikwej=fopen(pwej,"r");
  36. if(plikwej==NULL)printf("Plik jest pusty\n");
  37. else
  38. {
  39. pocz=NULL;//importowanie listy od nowa
  40. while(!feof(plikwej)) // eof
  41. {
  42. struct ksiazki*nowy=malloc(sizeof(struct ksiazki)); // stworzenie nowego elementu NOWY i alokacja pamieci
  43. fscanf(plikwej,"%s",nowy->info.tytul);
  44. fscanf(plikwej,"%s",nowy->info.autor1.nazwisko);
  45. fscanf(plikwej,"%s",nowy->info.autor1.imie);
  46. fscanf(plikwej,"%s",nowy->info.autor2.nazwisko);
  47. fscanf(plikwej,"%s",nowy->info.autor2.imie);
  48. fscanf(plikwej,"%d",&nowy->info.ilosc_stron);
  49. fscanf(plikwej,"%s",nowy->info.pozyczona_komu);
  50. fscanf(plikwej,"%s",&nowy->info.pozyczona_kiedy); //pobranie wszystkich wartosci z pliku i wrzucenie ich do nowego elementu, do struktury data o nazwie INFO
  51.  
  52. nowy->nast=NULL; // utworzenie ostatniego elementu NULL
  53. if(pocz==NULL)pocz=nowy; // wstawienie elementu do listy na pierwszym miejscu
  54. else
  55. {
  56. struct ksiazki*pom=pocz;//pomocniczy element = poczatkowy, zeby jechac po liscie od poczatku
  57. while(pom->nast!=NULL) //szukanie ostatniego miejsca w liscie
  58. {
  59. pom=pom->nast;
  60. }
  61. pom->nast=nowy; // wstawienie za ostatni element
  62. kon=pom->nast;
  63. }
  64. }
  65. printf("Udalo sie wczytac z pliku\n");
  66. }
  67. fclose(plikwej);
  68. }
  69.  
  70. void export()//export do pliku
  71. {
  72. int i;
  73. char pwy[50]="export.txt";//tak samo jak z importem, mozesz podac wlasny plik usuwajac ="export.txt"; i odkomentowac 2 linie nizej
  74. printf("Podaj nazwe pliku: ");
  75. //scanf("%s",&pwy);
  76. FILE*plikwy=fopen(pwy,"w");
  77. if(pocz==NULL)printf("Brak elementow na liscie!\n");
  78. else
  79. {
  80. struct ksiazki*pom=pocz;
  81. while(pom!=NULL)
  82. {
  83.  
  84. fprintf(plikwy,"%s ", pom->info.tytul); //wypisanie do pliku poszczegolnych wartosci z INFO
  85. fprintf(plikwy,"%s ", pom->info.autor1.nazwisko);
  86. fprintf(plikwy,"%s ", pom->info.autor1.imie);
  87. fprintf(plikwy,"%s ", pom->info.autor2.nazwisko);
  88. fprintf(plikwy,"%s ", pom->info.autor2.imie);
  89. fprintf(plikwy,"%d ", pom->info.ilosc_stron);
  90. fprintf(plikwy,"%s ", pom->info.pozyczona_komu);
  91. fprintf(plikwy,"%s ", pom->info.pozyczona_kiedy);
  92.  
  93. if(pom->nast!=NULL)fprintf(plikwy,"\n");
  94. pom=pom->nast;
  95. }
  96. printf("Udalo sie zapisac do pliku\n");
  97. }
  98. fclose(plikwy);
  99. }
  100.  
  101. int compare(const char *napis1,const char *napis2) // funkcja do porownywania 2 wyrazow, uzywana podczas funkcji sort()
  102. {
  103. int i;
  104. int length;
  105. if(strlen(napis1)>strlen(napis2))length=strlen(napis2);//ten if wybiera dlugosc krotszego wyrazu, zeby porownywac tylko tyle znakow ile ma krotszy
  106. else length=strlen(napis1);
  107. for(i = 0; i < length; i++)//tu jedziemy po kazdym znaku
  108. {
  109. if(napis1[i] > napis2[i])//jezeli litera w pierwszym wyrazie jest 'wieksza' od litery w drugim wyrazie, to return 0, else return 1 // dalsza czesc w funkcji sort()
  110. return 0;
  111. else if(napis1[i]<napis2[i])return 1;
  112. }
  113. return 1;
  114. }
  115.  
  116. int equalStrings(const char *napis1,const char *napis2) // sprawdza czy wyrazy sa takie same
  117. {
  118. int i;
  119. int length;
  120. if(strlen(napis1)>strlen(napis2))length=strlen(napis2);
  121. else length=strlen(napis1);
  122. for(i = 0; i < length; i++)
  123. {
  124. if(napis1[i] != napis2[i]) // jesli nie takie same znaki, konczy i return 0
  125. {
  126. return 0;
  127. }
  128. }
  129. return 1;
  130. }
  131.  
  132. int findStrings(const char *napis1,const char *napis2) // sprawdza czy wyrazy sa takie same
  133. {
  134. int i;
  135. int length;
  136. length=strlen(napis1);
  137. for(i = 0; i < length; i++)
  138. {
  139. if(napis1[i] != napis2[i]) // jesli nie takie same znaki, konczy i 0
  140. {
  141. return 0;
  142. }
  143. }
  144. return 1;
  145. }
  146.  
  147. void sort()//sortuje nasza liste wzgledem autora i nastepnie po tytule
  148. {
  149. int swapped=1; // =1 aby pierwszy raz wejsc do while
  150. while(swapped==1) //while do przesortowania po autorze
  151. {
  152. struct ksiazki*pom=pocz;
  153. swapped=0;//zmienna do sprawdzenia czy powtarzac zamienianie, =0 zeby nie wchodzilo do while jezeli nie zmieni sie na 1
  154. while(pom->nast!=NULL){
  155. if(compare(pom->info.autor1.nazwisko,pom->nast->info.autor1.nazwisko)==0)
  156. {
  157. swapped=1;//jezeli sie swapuje to zmienia swapped=1 i powtarza petle while
  158. struct data temp=pom->info;
  159. pom->info=pom->nast->info;
  160. pom->nast->info=temp;
  161. }
  162. pom=pom->nast;
  163. }
  164. }
  165. //najpierw sortuje liste po autorach, a nastepnie drugim whilem sortuje po tytule, ale sprawdzajac czy sortuje dla tego samego autora, if(equalStrings ...) w tym miejscu
  166. swapped=1;
  167. while(swapped==1) //while do przesortowania po tytule dla tych samych autorow
  168. {
  169. struct ksiazki*pom=pocz;
  170. swapped=0;
  171. while(pom->nast!=NULL)//
  172. {
  173. if(equalStrings(pom->info.autor1.nazwisko,pom->nast->info.autor1.nazwisko)==1)//sprawdza czy ten sam autor, aby sortowac tylko po tytule ale w obrebie tego samego autora
  174. {
  175. if(compare(pom->info.tytul,pom->nast->info.tytul)==0)//jesli tak to swap
  176. {
  177. swapped=1;
  178. struct data temp=pom->info;
  179. pom->info=pom->nast->info;
  180. pom->nast->info=temp;
  181. }
  182. }
  183. pom=pom->nast;
  184. }
  185. }
  186. }
  187.  
  188. void wypisz()//wypisywanie, przechodzenie po wszystkich elementach
  189. {
  190. sort();//uzycie funkcji sort() do posortowania elementow w liscie po autorze i tytule, opisana powyzej
  191. system("@cls||clear");//to sluzy do wyczyszczenia konsoli, powtarzane wielokrotnie podczas dzialania programu
  192. int i;
  193. if(pocz==NULL)printf("Brak elementow na liscie!\n");
  194. else
  195. {
  196. printf("Tytul | Autor1 | Autor2 | Strony | Wypozyczona | Kiedy\n\n");
  197. struct ksiazki*pom=pocz;
  198. while(pom!=NULL)
  199. {
  200. printf("%s", pom->info.tytul);
  201. if(strlen(pom->info.tytul)<8)printf("%c ",9);
  202. else printf(" ");
  203. printf("%s ", pom->info.autor1.nazwisko);
  204. printf("%s ", pom->info.autor1.imie);
  205. if(strlen(pom->info.autor1.nazwisko)+strlen(pom->info.autor1.imie)<9)printf("%c%c ",9);
  206. else printf(" "); // wyrownanie wyswietlania
  207. printf("%s ", pom->info.autor2.nazwisko);
  208. printf("%s ", pom->info.autor2.imie);
  209. if(strlen(pom->info.autor2.nazwisko)+strlen(pom->info.autor2.imie)<13)printf("%c ",9);
  210. else printf(" ");
  211. printf("%d\n", pom->info.ilosc_stron);
  212. printf("Wypozyczona: ");
  213. if(pom->info.pozyczona_komu[0]=='x')printf(" ");
  214. else printf("%s",pom->info.pozyczona_komu);
  215. if(strlen(pom->info.pozyczona_komu)<8)printf("%c%c ",9,9);
  216. else printf("%c",9);
  217. printf("%s", pom->info.pozyczona_kiedy);
  218. printf("\n================================================================================\n");
  219. printf("\n");
  220. pom=pom->nast;
  221. }
  222. printf("\n");
  223. }
  224. }
  225.  
  226. void dodaj()//dodawanie elementu
  227. {
  228. system("@cls||clear");
  229. int i;
  230.  
  231. struct ksiazki *nowy=malloc(sizeof(struct ksiazki));
  232. char *name=malloc(sizeof(char)+256);
  233. if (name == NULL) {
  234. printf("No memory\n");
  235.  
  236. }
  237. char *name2=malloc(sizeof(char)+256);
  238. if (name2 == NULL) {
  239. printf("No memory\n");
  240.  
  241. }
  242. //podanie wartosci
  243. printf("Podaj tytul: ");
  244. scanf("%s", nowy->info.tytul);
  245. printf("Podaj nazwisko1: ");
  246. scanf("%s", nowy->info.autor1.nazwisko);
  247. printf("Podaj imie1: ");
  248. scanf("%s", nowy->info.autor1.imie);
  249.  
  250. printf("Podaj nazwisko2: ");
  251. fgets(name, 256, stdin);
  252. scanf("%c",nowy->info.autor2.nazwisko);
  253. printf("Podaj imie2: ");
  254. fgets(name2, 256, stdin);
  255. scanf("%c", nowy->info.autor2.imie);
  256. printf("Podaj ilosc stron: ");
  257. //scanf("%d",&nowy->info.ilosc_stron);
  258.  
  259.  
  260. strcpy(nowy->info.autor2.nazwisko,"");
  261. strcpy(nowy->info.autor2.imie, "" );
  262. free(name);
  263. free(name2);
  264.  
  265. char s[20];//ilosc stron poczatkowo pobieramy jako string w celu sprawdzenia poprawnosci czy podane znaki sa tylko cyframi
  266. scanf("%s",s);
  267. boolean valid = TRUE;//ustawiona poczatkowa wartosc na TRUE
  268. for (i = 0; i < strlen(s); ++i)
  269. {
  270. if (!isdigit(s[i]))//sprawdzanie poszczegolnych znakow czy sa cyframi, jesli nie, ustawiamy valid na FALSE
  271. {
  272. valid = FALSE;
  273. break;
  274. }
  275. }
  276. if(valid==FALSE)//jezeli wystapily nie-cyfry, to uwalniamy nowy
  277. {
  278. printf("\nBledne podane wartosci\n");
  279. free(nowy);
  280. return;
  281. }
  282. else
  283. {
  284. i = atoi (s);//parsujemy string na int funkcja atoi
  285. nowy->info.ilosc_stron=i;//podstawienie wartosci
  286. }
  287.  
  288. //tworzenie
  289. strcpy(nowy->info.pozyczona_komu,"x");//domyslnie ustawianie wartosci komu na x // przy wyswietlanie jest jezeli komu=='x' to wypisuje spacje ' '
  290. strcpy(nowy->info.pozyczona_kiedy,"0000-00-00");//tak samo tlyko ze na 0000-00-00
  291. nowy->nast=NULL;//ustawienie next ostatniego elemenut na NULL
  292. if(pocz==NULL)
  293. {
  294. pocz=nowy;//jesli lista pusta
  295. kon=nowy;//poczatkowy i koncowy to jeden element
  296. }
  297. else
  298. {
  299. struct ksiazki*pom=pocz;
  300. while(pom->nast!=NULL)//szukanie ostatniego elementu gdzie ma wstawic nowy
  301. {
  302. pom=pom->nast;
  303. }
  304. pom->nast=nowy;
  305. kon=pom->nast;
  306. }
  307.  
  308. }
  309.  
  310. void usun()//usuwanie na podstawie indexu
  311. {
  312. system("@cls||clear");
  313. int i=1,nr;
  314. struct ksiazki*pom=pocz;
  315. printf("Tytul | Autor");
  316. printf("\n=================\n");
  317. while(pom!=NULL)//petla do wypisania wszystkich ksizek z inexem 'i'
  318. {
  319. printf("%d. ",i);
  320. printf("%s | %s%s\n",pom->info.tytul,pom->info.autor1.nazwisko,pom->info.autor1.imie);
  321. pom=pom->nast;
  322. i++;
  323. }
  324. printf("Podaj numer do usuniecia: ");
  325. scanf("%d",&nr);
  326. pom=pocz;
  327. for(i=1;i<nr;i++){//sprawdzanie czy numer jest dobry
  328. pom=pom->nast;
  329. if(pom==NULL){printf("Zly numer");return;}
  330. }
  331. if(pom->nast==NULL)//jezeli wybrany element jest ostatni
  332. {
  333. pom=pocz;
  334. for(i=1;i<nr-1;i++)pom=pom->nast;//przechodzi do elementu 'nr'
  335. pom->nast=NULL;//ustawia na przedostanim, wartosc nastepnego na NULL
  336. }
  337. else//jezeli nie ostatni
  338. {
  339. struct ksiazki *tmp=pom->nast;//tutaj odbywa sie usuwanie, najpierw wstawiam do zmiennej TMP nastepnika usuwanego elementu
  340. pom->info=tmp->info;//nastepnie pobieram info do 'pom' z 'tmp'
  341. pom->nast=tmp->nast;//ustawiam 'tmp' jako nastepnik 'pom'
  342. }
  343. }
  344.  
  345. void zwrot()//zwracanie ksiazki, ustawia date na 0000-00-00 i pozyczona_komu na 'x'
  346. {
  347. system("@cls||clear");
  348. int i=1,nr,max;
  349. struct ksiazki*pom=pocz;
  350. printf("Tytul | Komu wypozyczona | Kiedy wypozyczona");
  351. printf("\n=================\n");
  352. while(pom!=NULL)//wypisuje liste
  353. {
  354. printf("%d. ",i);
  355. printf("%s | %s\n",pom->info.tytul,pom->info.pozyczona_komu);
  356. i++;
  357. pom=pom->nast;
  358. }
  359. printf("Podaj numer do zwrotu: ");
  360. scanf("%d",&nr);
  361. pom=pocz;
  362. for(i=1;i<nr;i++)//sprawdzanie czy dobry numer
  363. {
  364. pom=pom->nast;
  365. if(pom==NULL){printf("Zly numer");return;}
  366. }
  367. if(pom->info.pozyczona_komu[0]=='x')printf("Ksiazka nie jest wypozyczona");//jezeli dany element nie jest wypozyczony, czyli ma pozyczona_komu=='x', to wyswietla error i konczy funkcje
  368. else//jezeli ksiazka jest wypozyczona, to ustawia kiedy i komu na wartosci zerowe jak ponizej
  369. {
  370. strcpy(pom->info.pozyczona_kiedy,"0000-00-00");
  371. strcpy(pom->info.pozyczona_komu,"x");
  372. }
  373. }
  374.  
  375. void edytuj()
  376. {
  377. system("@cls||clear");
  378. int i=1,nr;
  379. struct ksiazki*pom=pocz;
  380. while(pom!=NULL)//wyswietlanie listy
  381. {
  382. printf("%d. ",i);
  383. printf("%s | %s\n",pom->info.tytul,pom->info.pozyczona_komu);
  384. i++;
  385. pom=pom->nast;
  386. }
  387. printf("Podaj numer do edycji: ");//wybranie elementu po indexie do edycji
  388. scanf("%d",&nr);
  389. pom=pocz;
  390. for(i=1;i<nr;i++)//sprawdzenie czy dobry numer
  391. {
  392. pom=pom->nast;
  393. if(pom==NULL){printf("Zly numer");return;}
  394. }
  395. printf("1.Tytul | 2.Autor1 | 3.Autor2 | 4.Strony | 5.Wypozyczona | 6.Kiedy\n");
  396. printf("%s | %s %s | %s %s | %d | %s | %s",pom->info.tytul,pom->info.autor1.nazwisko,pom->info.autor1.imie,pom->info.autor2.nazwisko,pom->info.autor2.imie,pom->info.ilosc_stron,pom->info.pozyczona_komu,pom->info.pozyczona_kiedy);
  397. printf("\nWybierz numer kolumny do edycji: ");
  398. scanf("%d",&nr);//tutaj wybieramy jaka wartosc chce edytowac na podstawie nr kolumny, uzyty switch case
  399. switch(nr)
  400. {
  401. case 1:
  402. printf("Podaj nowy tytul: ");
  403. scanf("%s",pom->info.tytul);
  404. break;
  405. case 2:
  406. printf("Podaj nazwisko autora1: ");
  407. scanf("%s",pom->info.autor1.nazwisko);
  408. printf("Podaj imie autora1: ");
  409. scanf("%s",pom->info.autor1.imie);
  410. break;
  411. case 3:
  412. printf("Podaj nazwisko autora2: ");
  413. scanf("%s",pom->info.autor2.nazwisko);
  414. printf("Podaj imie autora2: ");
  415. scanf("%s",pom->info.autor2.imie);
  416. break;
  417. case 4:
  418. printf("Podaj liczbe stron: ");
  419. scanf("%d",&pom->info.ilosc_stron);
  420. break;
  421. case 5:
  422. printf("Podaj komu wypozyczona: ");
  423. scanf("%s",pom->info.pozyczona_komu);
  424. break;
  425. case 6:
  426. printf("Podaj kiedy wypozyczona: ");
  427. scanf("%s",pom->info.pozyczona_kiedy);
  428. break;
  429. default:
  430. printf("Zla kolumna");
  431. break;
  432. }
  433. }
  434.  
  435. void wyszukaj()
  436. {
  437. system("@cls||clear");
  438. printf("Wyszukaj\n");
  439. printf("1. Tytul, Autor1, Autor2, Ilosc stron\n");
  440. printf("2. Wypozyczone ksiazki\n");
  441. printf("3. Wypozyczone ksiazki dla danej osoby\n");
  442. int nr,nr2;
  443. struct ksiazki*pom=pocz;
  444. scanf("%d",&nr);
  445. switch(nr)
  446. {
  447. case 1://wyszukiwanie po wybranym z 4 parametrow do wyboru
  448. system("@cls||clear");
  449. printf("1.Tytul, 2.Autor1, 3.Autor2, 4.Ilosc stron\n");
  450. scanf("%d",&nr2);
  451. int i=1;
  452. int zm2;
  453. char zm[50];
  454. switch(nr2)
  455. {
  456. case 1://po tytule, uzyta funkcja findStrings
  457. system("@cls||clear");
  458. printf("Podaj Tytul: ");
  459. scanf("%s",zm);
  460.  
  461. while(pom!=NULL)
  462. {
  463. if(findStrings(zm,pom->info.tytul)==1){// do findStrings podajemy parametry dwóch porównywanych elementów, porownujemy podana zmienna i tytul elementu jadac po calej liscie
  464. printf("%d. ",i);
  465. printf("%s | %s\n",pom->info.tytul,pom->info.autor1.nazwisko);
  466. i++;
  467. }
  468. pom=pom->nast;
  469. }
  470.  
  471. break;
  472. case 2:
  473. system("@cls||clear");
  474. printf("Podaj nazwisko autor1: ");
  475. scanf("%s",zm);
  476. while(pom!=NULL)
  477. {
  478. if(findStrings(zm,pom->info.autor1.nazwisko)==1){//tutaj tak samo jak powyzszy przyklad, tylko ze porownujemy z nazwisko
  479. printf("%d. ",i);
  480. printf("%s | %s\n",pom->info.tytul,pom->info.autor1.nazwisko);
  481. i++;
  482. }
  483. pom=pom->nast;
  484. }
  485. break;
  486. case 3:
  487. system("@cls||clear");
  488. printf("Podaj nazwisko autor2: ");
  489. scanf("%s",zm);
  490. while(pom!=NULL)
  491. {
  492. if(findStrings(zm,pom->info.autor2.nazwisko)==1){
  493. printf("%d. ",i);
  494. printf("%s | %s\n",pom->info.tytul,pom->info.autor1.nazwisko);
  495. i++;
  496. }
  497. pom=pom->nast;
  498. }
  499. break;
  500. case 4:
  501. system("@cls||clear");
  502. printf("Podaj ilosc stron: ");
  503. scanf("%d",&zm2);
  504. while(pom!=NULL)
  505. {
  506.  
  507. if(zm2==pom->info.ilosc_stron){//uzyta inna zmienna, poniewaz zm jest stringiem, a zm2 jest intem
  508. printf("%d. ",i);
  509. printf("%s | %s | %d\n",pom->info.tytul,pom->info.autor1.nazwisko,pom->info.ilosc_stron);
  510. i++;
  511. }
  512. pom=pom->nast;
  513. }
  514. break;
  515. default:
  516. break;
  517. }
  518. break;
  519. case 2:
  520. system("@cls||clear");
  521. printf("Ksiazki ktore zostaly pozyczone\n");
  522. i=1;
  523. while(pom!=NULL)//wypisanie wszystkich wypozyczonych ksiazek
  524. {
  525.  
  526. //printf("komu %s\n",pom->info.pozyczona_komu);
  527. if(pom->info.pozyczona_komu[0]!='x'){//jezeli ksiazka jest wypozyczona, to pole pozyczona_komu jest uzupelnione inna wartoscia niz 'x'
  528. printf("%d. ",i);
  529. printf("%s | %s\n",pom->info.tytul,pom->info.autor1.nazwisko);
  530. i++;
  531. }
  532. pom=pom->nast;
  533. }
  534. break;
  535. case 3:
  536. system("@cls||clear");
  537. printf("Ksiazki ktore zostaly pozyczone konkretnej osobie\n");
  538. printf("Podaj nazwisko komu pozyczona: ");
  539. scanf("%s",zm);
  540. i=1;
  541. while(pom!=NULL)//wypisanie ksiazek pozyczonych dla konkretnej osoby
  542. {
  543. if(findStrings(zm,pom->info.pozyczona_komu)==1){//funkcja findStrings porownuje 2 wyrazy, jezeli sa takie same zwraca 1, jezeli inne zwraca 0
  544. printf("%d. ",i);
  545. printf("%s | %s | %s\n",pom->info.tytul,pom->info.autor1.nazwisko,pom->info.pozyczona_komu);//jezeli findStrings==1 to znaczy ze wypozyczona_komu == to co podalismy
  546. i++;
  547. }
  548. pom=pom->nast;
  549. }
  550. break;
  551. case 4:
  552. // wyszukiwanie po dacie
  553. system("@cls||clear");
  554. printf("Ksiazki nieoddane w terminie\n");
  555. printf("Podaj okres wypozyczenia: ");
  556. scanf("%d",&zm2);//podajemy jaki jest okres wypozyczenia, jezeli ktos sie spoznil z oddaniem o 'zm2' dni, to zostanie wyswietlone na liscie
  557. i=1;
  558.  
  559. //tutaj uzyte nowe structury, time_t
  560. int day,month,year;
  561. time_t nowTime = time(0);//te 4 linie wykorzystane do stworzenia structury tm, posiadajacy dzisiejsza date, tzn. rok miesiac dzien godzina minuta sekunda, nizej wytlumaczone
  562. struct tm timeNowStruct;
  563. timeNowStruct = *localtime(&nowTime);
  564. time_t x = mktime(&timeNowStruct);// tutaj tworzymy Daty ktora potrzebna jest do funkcji difftime(), nizej wytlumaczone
  565. printf("==========================================\n");
  566. printf("Tytul | Kto wypozyczyl | Data wypozyczenia\n");
  567. printf("==========================================\n");
  568. while(pom!=NULL)
  569. {
  570. if(pom->info.pozyczona_komu[0]!='x'){
  571. if(sscanf(pom->info.pozyczona_kiedy, "%d-%d-%d", &year, &month, &day) != EOF)//pobieranie pozyczona_kiedy do zmiennych year,month,day
  572. {
  573. struct tm currentDate = {0,0,0,day,month-1,year-1900};//currentDate jest w formacie sekundy:minuty:godziny:dzien:mieisac:rok
  574. //od miesiaca odejmujemy 1 i od roku 1900, poniewaz sa jakos dziwnie przeliczane wartosci w structurze tm na Date
  575.  
  576. time_t y = mktime(&currentDate);//stworzenie Daty funkcja mktime()
  577. int difference = difftime(x, y) / (60 * 60 * 24);//funkcja difftime() potrzebuje jako parametry dwie zmienne w formacie Date, ktora stworzylismy za pomoca mktime(),
  578. //difftime(x,y) podaje ilosc sekund pomiedzy dwoma datami, dzielimy j¹ przez (60*60*24), zeby wyszlo nam ile dni jest roznicy od daty dzisiejszej
  579.  
  580. if(difference>zm2)//jezeli wynik z difftime() jest wiekszy od zmiennej podanje na poczatku, to znaczy ze ktos nie oddal ksiazki w terminie
  581. {
  582. printf("%d. ",i);//taka ksiazka zostanie wypisana na liscie
  583. i++;
  584. printf("%s | %s | %s | ",pom->info.tytul,pom->info.pozyczona_komu,pom->info.pozyczona_kiedy);
  585. printf("Po terminie: %d dni\n", difference);//wypisuje takze ile dni jest wypozyczona,
  586. //tutaj wkradl sie blad, ten printf wyswietla ile dni ksiazka jest pozyczona, wiec albo zmien tekst na "Ksiazka wypozyczona przez : %d dni\n" , albo
  587. //zeby wyswietlic ile dni ksiazka jest po terminie po prostu w printf jako %d podaj zamiast difference, difference-zm2
  588. }
  589. }
  590. }
  591. pom=pom->nast;
  592. }
  593.  
  594. break;
  595. default:// jezeli poda zly numer, to wyswietli blad i nic nie zrobi
  596. printf("Zla kolumna");
  597. break;
  598. }
  599. }
  600.  
  601. sortWedlug(int x)// funkcja wykorzystana do sortowania wzgledem jakiejs wartosci: tytul, nazwisko autora lub ilosc stron, ify napisane zeby nie tworzyc 3 oddzielnych funkcji
  602. {
  603. //jej parametrem jest numer kolumny, ktory podajemy, wykorzystujac funkcjonalnosc z menu numer (7)Wypisz Liste Wedlug
  604. //funkcja ta wykorzystuje ta same liste ktora wyswietlana jest na poczatku programu, wiec na koniec musimy uzyc funkcji sort() do posortowania spowrotem do stanu pierwotnego
  605. int swapped=1;
  606. while(swapped==1) //while do przesortowania po autorze
  607. {
  608. struct ksiazki*pom=pocz;
  609. swapped=0;//zmienna do sprawdzenia czy powtarzac zamienianie
  610. while(pom->nast!=NULL){
  611. if(x==1)
  612. {
  613. if(compare(pom->info.tytul,pom->nast->info.tytul)==0)
  614. {
  615. swapped=1;//jezeli sie swapuje to zmienia swapped=1 i powtarza petle while
  616. struct data temp=pom->info;
  617. pom->info=pom->nast->info;
  618. pom->nast->info=temp;
  619. }
  620. }
  621. else if(x==2)
  622. {
  623. if(compare(pom->info.autor1.nazwisko,pom->nast->info.autor1.nazwisko)==0)
  624. {
  625. swapped=1;//jezeli sie swapuje to zmienia swapped=1 i powtarza petle while
  626. struct data temp=pom->info;
  627. pom->info=pom->nast->info;
  628. pom->nast->info=temp;
  629. }
  630. }
  631. else if(x==3)
  632. {
  633. if(pom->info.ilosc_stron>pom->nast->info.ilosc_stron)
  634. {
  635. swapped=1;//jezeli sie swapuje to zmienia swapped=1 i powtarza petle while
  636. struct data temp=pom->info;
  637. pom->info=pom->nast->info;
  638. pom->nast->info=temp;
  639. }
  640. }
  641. pom=pom->nast;
  642. }
  643. }
  644. }
  645.  
  646. wypiszWedlug()
  647. {
  648. system("@cls||clear");
  649. printf("Wedlug czego chcesz posortowac: 1.Tytul 2.Nazwisko autora 3.Ilosc stron:\n");
  650. int i=1, x;
  651. scanf("%d",&x);
  652. sortWedlug(x);//tutaj wykorzystana funkcja sortWedlug opisana powyzej
  653. system("@cls||clear");
  654. if(x==1)printf("\nSortowanie wedlug tytulu");
  655. else if(x==2)printf("\nSortowanie wedlug nazwiska autora");
  656. else if(x==3)printf("\nSortowanie wedlug ilosci stron");
  657. if(pocz==NULL)printf("Brak elementow na liscie!\n");
  658. else
  659. {
  660. printf("\nTytul | Autor1 | Autor2 | Strony | Wypozyczona | Kiedy\n\n");
  661. struct ksiazki*pom=pocz;
  662. while(pom!=NULL)//tutaj tylko wypisanie posortowanej listy
  663. {
  664. printf("%d. ",i);
  665. printf("%s | %s | %s | %d\n",pom->info.tytul,pom->info.autor1.nazwisko,pom->info.pozyczona_komu,pom->info.ilosc_stron);
  666. i++;
  667. pom=pom->nast;
  668. }
  669. printf("\n");
  670. }
  671. sort();//wracamy posortowanie do stanu poczatkowego, czyli tak jak w poleceniu, posortowane po autorze i tytule
  672. }
  673.  
  674. int main()
  675. {
  676. import();
  677. wypisz();
  678. int z;
  679. do//petla do wyswietlania menu
  680. {
  681. printf("\n------------------------------\n");
  682. printf("(1) - import z pliku\n");
  683. printf("(2) - export do pliku\n");
  684. printf("(3) - dodaj ksiazke\n");
  685. printf("(4) - usun ksiazke\n");
  686. printf("(5) - wyszukaj\n");
  687. printf("(6) - wypisz liste wzgledem tytulow + autorow\n");
  688. printf("(7) - wypisz liste wedlug:\n");
  689. printf("(8) - zwrot ksiazki\n");
  690. printf("(9) - edytuj\n");
  691. printf("(0) - wyjscie\n");
  692. printf("------------------------------\n");
  693. scanf("%d",&z);
  694. printf("\n");
  695. if(z==1)import();
  696. if(z==2)export();
  697. if(z==3)dodaj();
  698. if(z==4){usun();system("@cls||clear");wypisz();}//usuwamy element,czyscimy ekran, a nastepnie znowu wypisujemy liste
  699. if(z==5)wyszukaj();
  700. if(z==6)wypisz();
  701. if(z==7)wypiszWedlug();
  702. if(z==8)zwrot();
  703. if(z==9)edytuj();
  704. }while(z!=0);
  705. export();
  706. system("pause");
  707. return 0;
  708. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement