Advertisement
Guest User

Untitled

a guest
Jan 24th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.75 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6.  
  7. //Tablica pomocnicza przy zapisie imion, nazwisk
  8. char znaki[52]="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
  9.  
  10. //Tablica pomocnicza przy zapisie daty, peselu, pensji oraz wyborze menu.
  11. int cyfry[10]={1,2,3,4,5,6,7,8,9,0};
  12.  
  13. //Zmienna pomocnicza przy zliczaniu ilosci pracownikow.
  14. int zlicz=0;
  15.  
  16.  
  17. //Zmienna przechowujaca wybor w menu podany przez uzytkownika. Jest sprawdzana w instrukcji switch.
  18. char opcja[0];
  19.  
  20. //Lista przechowujaca dane pracownika oraz wskaznik na kolejny element.
  21. typedef struct pracownik
  22. {
  23. char imie[50];
  24. char nazwisko[50];
  25. char pesel[11];
  26. int rok;
  27. int miesiac;
  28. int dzien;
  29. int pensja;
  30. struct pracownik* next;
  31. } pracownik ;
  32.  
  33. //Funkcja sortujaca i wypisujaca pracownikow wedlug nazwisk - alfabetycznie.
  34. void sortujNazwiska(pracownik* lista)
  35. {
  36. //Inicjacja poczatku listy (wskaznika na poczatek listy).
  37. pracownik* wsk=lista;
  38. //Przypisanie wartosci dla wskaznika na poprzedni element jako NULL.
  39. pracownik* poprzedni=NULL;
  40.  
  41. //Sprawdzenie, czy lista zawiera jakiekolwiek elementy.
  42. if(lista==NULL)
  43. {
  44. printf("Lista jest pusta");
  45. }
  46.  
  47. else
  48. {
  49.  
  50. //Wykonanie petli sortowania tyle razy, ile jest elementow w liscie.
  51. for(int r=0;r<zlicz;r++)
  52. {
  53. //Przydzielenie wartosci dla wskaznika.
  54. wsk=lista;
  55. //Zmienna pomocnicza i w petli while.
  56. int i=1;
  57. char imie[50];
  58. char nazwisko[50];
  59. char pesel[11];
  60. int rok;
  61. int miesiac;
  62. int dzien;
  63. int pensja;
  64.  
  65. //Inicjacja zmiennych pomocniczych przechowujacych zamieniane wartosci z listy.
  66. char imieP[50];
  67. char nazwiskoP[50];
  68. char peselP[11];
  69. int rokP;
  70. int miesiacP;
  71. int dzienP;
  72. float pensjaP;
  73.  
  74. //Sprawdzenie, czy wskazniki w liscie nie sa rowne NULL.
  75. while(wsk!=NULL)
  76. {
  77. //Jesli wskaznik na poprzednia wartosc jest rowny NULL oraz i=1
  78. //nastepuje przypisanie zawartosci wskaznikow na konkretne dane pracownikow.
  79. if(poprzedni==NULL && i==1) {
  80. strcpy(imie, wsk->imie);
  81. strcpy(nazwisko, wsk->nazwisko);
  82. strcpy(pesel, wsk->pesel);
  83. rok=wsk->rok;
  84. miesiac=wsk->miesiac;
  85. dzien=wsk->dzien;
  86. pensja=wsk->pensja;
  87. } else {
  88. if(strcmp(wsk->nazwisko, nazwisko)>0) {
  89.  
  90. // Jesli funkcja strcmp, ktora porownuje wartosci wyrazow zwroci wartosc wieksza od
  91. // zera wtedy zmienne pozostaja bez zmian. Jesli zwroci inna wartosc wtedy nastepuje
  92. // ponowne przypisanie wartosci wskaznikow dla ich zmienych.
  93.  
  94. } else {
  95.  
  96. strcpy(imie, wsk->imie);
  97. strcpy(nazwisko, wsk->nazwisko);
  98. strcpy(pesel, wsk->pesel);
  99. rok=wsk->rok;
  100. miesiac=wsk->miesiac;
  101. dzien=wsk->dzien;
  102. pensja=wsk->pensja;
  103.  
  104. //Zmienna pomocnicza do warunku if.
  105. int wyk =0;
  106.  
  107. //Przypisanie wartosci poczatku listy dla poprzedniego wskaznika.
  108. poprzedni=lista;
  109.  
  110. //Zmienna pomocnicza
  111. int k=0;
  112.  
  113. //Warunek petli, kiedy wartosc poprzedniego (poczatku listy) jest rozny od zera
  114. while(poprzedni!=NULL)
  115. {
  116. if(wyk!=0)
  117.  
  118. {break;}
  119.  
  120. //Jesli wartosc i jest rowna k+2 wykonywana jest operacja
  121. // zapisu do zmiennych pomocniczych z dopiskiem "P" zawartosci poprzednich wskaznikow,
  122. // a nastepnie przypisanie tym samym zmiennym wartosci aktualnych wskaznikow.
  123. if(i==(k+2))
  124. {
  125. strcpy(imieP, poprzedni->imie);
  126. strcpy(nazwiskoP, poprzedni->nazwisko);
  127. strcpy(peselP, poprzedni->pesel);
  128. rokP=wsk->rok;
  129. miesiacP=wsk->miesiac;
  130. dzienP=wsk->dzien;
  131. pensjaP=wsk->pensja;
  132. strcpy(poprzedni->imie, imie);
  133. strcpy(poprzedni->nazwisko, nazwisko);
  134. wsk->rok=rok;
  135. wsk->miesiac=miesiac;
  136. wsk->dzien=dzien;
  137. wsk->pensja=pensja;
  138. strcpy(wsk->imie, imieP);
  139. strcpy(wsk->nazwisko, nazwiskoP);
  140. strcpy(poprzedni->pesel, peselP);
  141. wsk->rok=rokP;
  142. wsk->miesiac=miesiacP;
  143. wsk->dzien=dzienP;
  144. wsk->pensja=pensjaP;
  145. wyk++;
  146. }
  147. k++;
  148. //przypisane wartosci poprzedniego wskaznika jako wskaznika na pierwszy element listy.
  149. poprzedni=poprzedni->next;
  150. }
  151. //Po zakonczeniu petli while, zapisujemy ponownie wskaznik na poprzedni element
  152. //jako NULL (aby mogla ponownie wykonac sie petla
  153. poprzedni=NULL;
  154. }
  155. //Przypisane wartosci podstawowym zmiennym wartosci wskaznikow na aktualny element.
  156. strcpy(imie, wsk->imie);
  157. strcpy(nazwisko, wsk->nazwisko);
  158. strcpy(pesel, wsk->pesel);
  159. rok=wsk->rok;
  160. miesiac=wsk->miesiac;
  161. dzien=wsk->dzien;
  162. pensja=wsk->pensja;
  163. }
  164.  
  165. i++;
  166.  
  167. //Przesuniecie wskaznika na kolejny element.
  168. wsk=wsk->next;
  169.  
  170. }
  171. }
  172.  
  173.  
  174. int i = 1;
  175.  
  176. //Przesuniecie wskaznika na poczatek listy.
  177. wsk=lista;
  178.  
  179. //Wypisanie posortowanych elementow listy wedlug nazwiska. Dopoki wskaznik jest rozny od NULL, czyli do konca listy.
  180. while(wsk!=NULL)
  181. {
  182. printf("\n\n%d. %s %s %s %d %d %d %d\n\n", i, wsk->imie, wsk->nazwisko, wsk->pesel, wsk->rok, wsk->miesiac, wsk->dzien, wsk->pensja);
  183. wsk=wsk->next;
  184. i++;
  185. }
  186.  
  187. }
  188.  
  189. }
  190.  
  191. //Funkcja dodajaca kolejne wskazniki na elementy w liscie.
  192. void dodaj(pracownik** lista, pracownik* nowa)
  193. {
  194. //Wskaznik nowej na nastepny element jest ustawiany na wartosc NULL.
  195. nowa->next=NULL;
  196.  
  197. //Jesli lista nie istnieje jest tworzona nowa.
  198. if((*lista)==NULL)
  199. {
  200. //
  201. *lista=nowa;
  202. }
  203.  
  204. else
  205. {
  206. //
  207. pracownik* wsk = *lista;
  208. while(wsk->next != NULL)
  209. {
  210. wsk = wsk->next;
  211.  
  212. }
  213. wsk->next = nowa;
  214. }
  215.  
  216. zlicz++;
  217. }
  218.  
  219. //Funkcja upiekszajaca menu.
  220. void wzor()
  221. {
  222. printf("#####################################\n\n");
  223. }
  224.  
  225. //Funkcja wypisujaca zawartosc menu wraz z pobieraniem opcji wyboru.
  226. void menu()
  227. {
  228. wzor();
  229.  
  230. puts("\tMenu: \n"); // menu mozna w tablicy rozpisac ewentualnie
  231.  
  232. wzor();
  233.  
  234. puts(" 1.Dodanie nowego pracownika.");
  235. puts(" 2.Edycja obecnego pracownika.");
  236. puts(" 3.Usuwanie pracownika.");
  237. puts(" 4.Wypisanie wszystkich pracownikow.");
  238. puts(" 5.Wyszukanie wskazanego pracownika.");
  239. puts(" 6.Utworz plik ze wskazana data.");
  240. puts(" 7.Utworz plik ze wskazana placa.");
  241. puts(" 8.Zakoncz program.\n");
  242.  
  243. wzor();
  244.  
  245. printf(" Wybierz czynnosc: ");
  246. scanf("%d",&opcja[0]);
  247.  
  248. }
  249.  
  250. //Funkcja dodajaca pracownika.
  251. void dodajPracownika(pracownik** lista)
  252. {
  253. //Dynamiczna alokacja pamieci pod nowy element listy. Oraz podanie jego zawartosci.
  254. pracownik* nowa = (pracownik*)malloc(sizeof(pracownik));
  255.  
  256. printf("Podaj imie: ");
  257. scanf("%s", nowa->imie);
  258.  
  259.  
  260. printf("Podaj nazwisko: ");
  261. scanf("%s", nowa->nazwisko);
  262.  
  263. printf("Podaj pesel: " );
  264. scanf("%s", nowa->pesel);
  265.  
  266. printf("Podaj rok: " );
  267. scanf("%d", &nowa->rok);
  268.  
  269. printf("Podaj miesiac (odpowiednio 1-styczen 2-luty i tak do grudnia: " );
  270. scanf("%d", &nowa->miesiac);
  271.  
  272. printf("Podaj dzien: " );
  273. scanf("%d", &nowa->dzien);
  274.  
  275. printf("Podaj pensje: " );
  276. scanf("%d", &nowa->pensja);
  277.  
  278.  
  279. dodaj(lista, nowa);
  280. }
  281.  
  282. //Funkcja edytujaca pracownika.
  283. void edytujPracownika(pracownik* lista)
  284. {
  285.  
  286. if(lista == NULL) {
  287. printf("\nLista jest pusta. Nie posiada elementow do edycji.\n\n");
  288. } else
  289. {
  290. //Funkcja czyszczaca ekran.
  291. system("@cls||clear");
  292.  
  293. int i=1,nr,n1;
  294.  
  295. //Ustawienie wskaznika na poczatek listy.
  296. pracownik*wsk=lista;
  297.  
  298. //Wyswietlenie aktualnej zawartosci imion i nazwisk pracownikow przy pomocy przesuwania wskaznika.
  299. while(wsk!=NULL)
  300. {
  301. printf("%d. ",i);
  302. printf("%s | %s\n",wsk->imie,wsk->nazwisko);
  303. i++;
  304. wsk=wsk->next;
  305. }
  306.  
  307. //Pobranie numeru elementu listy do edycji.
  308. printf("Podaj numer do edycji: ");
  309. scanf("%d",&nr);
  310.  
  311. //Ustawienie wskaznika na poczatek listy.
  312. wsk=lista;
  313.  
  314. //Sprawdzenie, czy podany numer jest zgodny z wyswietlonymi.
  315. for(i=1;i<nr;i++)
  316. {
  317. wsk=wsk->next;
  318. if(wsk==NULL){printf("Zly numer");}
  319. }
  320.  
  321. //Przedstawienie elementow listy.
  322. printf("Spis pracownikow: \n");
  323. printf("1.Imie | 2.Nazwisko | 3. Pesel | 4.Rok zatrudnienia | 5.Miesiac zatrudnienia. | 6.Dzien zatrudnienia | 7.Pensja.\n");
  324. printf("%s | %s | %s | %d | %d | %d | %d",wsk->imie,wsk->nazwisko,wsk->pesel,wsk->rok,wsk->miesiac,wsk->dzien,wsk->pensja);
  325.  
  326. //Wybor numeru zawartosci do edycji i przekazanie parametru do instrukcji sterujacej switch.
  327. printf("\nWybierz numer zawartosci do edycji: ");
  328. scanf("%d",&n1);
  329.  
  330. switch(n1)
  331. {
  332.  
  333. case 1:
  334. printf("Podaj imie: ");
  335. scanf("%s", wsk->imie);
  336. break;
  337. case 2:
  338. printf("Podaj nazwisko: ");
  339. scanf("%s", wsk->nazwisko);
  340. break;
  341. case 3:
  342. printf("Podaj pesel: " );
  343. scanf("%s", wsk->pesel);
  344. break;
  345. case 4:
  346. printf("Podaj rok: " );
  347. scanf("%d", &wsk->rok);
  348. break;
  349. case 5:
  350. printf("Podaj miesiac (odpowiednio 1-styczen 2-luty i tak do grudnia: " );
  351. scanf("%d", &wsk->miesiac);
  352. break;
  353. case 6:
  354. printf("Podaj dzien: " );
  355. scanf("%d", &wsk->dzien);
  356. break;
  357. case 7:
  358. printf("Podaj pensje: " );
  359. scanf("%d", &wsk->pensja);
  360. break;
  361. default:
  362. printf("Zla kolumna");
  363. break;
  364. }
  365. }
  366. }
  367.  
  368. //Funkcja pomocnicza przy usuwaniu wezlow (wskaznikow) listy.
  369. int usunPomocnicza(char* pesel,pracownik** lista)
  370. {
  371. //
  372. pracownik* poprzedni=NULL;
  373. pracownik* wsk=*lista;
  374.  
  375. //Dopoki wartosc wskaznika jest rozna od NULL oraz wartosc porownania
  376. //zawartosci wskaznika na aktualny PESEL oraz ten podany
  377. while((wsk!=NULL) && (strcmp(wsk->pesel, pesel)!=0))
  378. {
  379. poprzedni=wsk;
  380. wsk=wsk->next;
  381. }
  382. if(wsk==NULL)
  383. {
  384. return 0;
  385. }
  386. else
  387. {
  388. if(poprzedni==NULL)
  389. {
  390. (*lista)=(*lista)->next;
  391. free(wsk);
  392. }
  393. else
  394. {
  395. poprzedni->next=wsk->next;
  396. free(wsk);
  397. }
  398. return 1;
  399. }
  400. }
  401.  
  402. //Funkcja usuwajaca elementy listy w oparciu o funkcje pomocnicza usunPomocnicza.
  403. void usunPracownika(pracownik** lista)
  404. {
  405. //Jesli zawartosc listy jest rowna NULL oznacza to, ze nie posiada zadnych zapisanych elementow.
  406. if((*lista) == NULL) {
  407. printf("\nLista jest pusta. Nie posiada elementow do usuniecia.\n\n");
  408. } else
  409. {
  410.  
  411.  
  412. char pesel[11];
  413.  
  414.  
  415. printf("Podaj PESEL pracownika ktorego chcesz usunac: ");
  416. scanf("%s", pesel);
  417.  
  418. //Wywolanie funkcji pomocniczej usuwajacej wezly wraz z wartosciami poszczegolnych elementow.
  419. if(usunPomocnicza(pesel, lista))
  420.  
  421. printf("Pracownik zostal usuniet z bazy.\n");
  422. else
  423. printf("\nPracownik nie zostal usuniety z bazy lub nie ma takiej osoby.\n\n");
  424. }
  425. }
  426.  
  427. //Funkcja wyszukujaca pracownikow.
  428. void wyszukajPracownika(pracownik* lista)
  429. {
  430.  
  431. if(lista==NULL) {
  432. printf("\nLista jest pusta. Nie posiada zadnego elementu do wyszukania.\n\n");
  433. } else
  434. {
  435. char pomocnicza2[11];
  436.  
  437. printf("Podaj PESEL szukanego pracownika: " );
  438. scanf("%s", pomocnicza2);
  439. //Ustawienie wskaznika na poczatek listy.
  440. pracownik* wsk = lista;
  441.  
  442.  
  443. int i=0;
  444. while(wsk!=NULL)
  445.  
  446. //Porownanie funkcja strcmp poszczegolnych PESEL'ow, jesli funkcja strcmp zwroci 0 oznacza to, ze
  447. //PESEL'e sa rowne.
  448. { if(strcmp(wsk->pesel,pomocnicza2)==0)
  449. { //Wypisanie wyszukanego elementu listy.
  450. printf("\n\n %s %s %s %d %d %d %d\n\n", wsk->imie, wsk->nazwisko, wsk->pesel, wsk->rok, wsk->miesiac, wsk->dzien, wsk->pensja);
  451. i++;
  452. }
  453. //Przesuniecie wskaznika na kolejny element.
  454. wsk=wsk->next; //
  455.  
  456. }
  457.  
  458. //Jesli nie nastapila iteracja, oznacza to, ze nie wyszukano elementu.
  459. if(i==0)
  460. {
  461. printf("Pracownik o podanym PESEL'u nie istnieje!");
  462. }
  463.  
  464.  
  465. }
  466. }
  467.  
  468. //Funkcja zapisujaca elementy listy do pliku w zaleznosci od daty.
  469. void dataPracownika(pracownik* lista)
  470. {
  471.  
  472. if(lista== NULL) {
  473. printf("\nLista jest pusta. Nie posiada elementow do zapisu.\n\n");
  474. } else
  475. {
  476. //Ustawienie wskaznika na poczatek listy.
  477. pracownik* wsk = lista;
  478.  
  479. //Utworzenie pliku.
  480. FILE *data_pracownikow;
  481.  
  482. int i=1;
  483.  
  484. int dany_rok,dany_miesiac,dany_dzien;
  485.  
  486. //Wprowadzenie wartosci od ktorych zostana zapisane elementy listy do pliku.
  487. printf("Podaj rok, od ktorego chcesz utworzyc spis pracownikow: ");
  488. scanf("%d",&dany_rok);
  489. printf("Podaj miesiac, od ktorego chcesz utworzyc spis pracownikow: ");
  490. scanf("%d",&dany_miesiac);
  491. printf("Podaj dzien, od ktorego chcesz utworzyc spis pracownikow: ");
  492. scanf("%d",&dany_dzien);
  493.  
  494. //Otwarcie pliku.
  495. data_pracownikow=fopen("SpisDat.txt","w");
  496.  
  497. if(lista==NULL)
  498. {
  499. printf("Lista jest pusta");
  500. }
  501. else
  502. {
  503.  
  504. while( wsk!=NULL)
  505.  
  506. { //Jesli spelnione sa 3 warunki jednoczesnie nastepuje zapis do pliku.
  507. if(((wsk->rok)>=dany_rok)&&((wsk->miesiac)>=dany_miesiac)&&((wsk->dzien)>=dany_dzien))
  508. {
  509. //Zapis elementow do pliku.
  510. fprintf(data_pracownikow,"%d. %s %s %s %d %d %d %d\n", i, wsk->imie, wsk->nazwisko, wsk->pesel, wsk->rok, wsk->miesiac, wsk->dzien, wsk->pensja);
  511. i++;
  512. }
  513. wsk=wsk->next;
  514. }
  515.  
  516. }
  517. //Zamkniecie pliku
  518. fclose(data_pracownikow);
  519. }
  520. }
  521.  
  522. //Funkcja zapisujaca elementow listy od podanej wartosci pensji pracownikow.
  523. void kwotaPracownika(pracownik* lista)
  524. {
  525. if(lista== NULL) {
  526. printf("\nLista jest pusta. Nie posiada elementow do zapisu.\n\n");
  527. } else
  528. {
  529. //Ustawienie wskaznika na poczatek listy.
  530. pracownik* wsk = lista;
  531.  
  532. //Utworzenie pliku.
  533. FILE *kwota_pracownikow;
  534.  
  535. int i=1;
  536.  
  537. int dana_kwota;
  538.  
  539. printf("Podaj kwote, od jakiej chcesz utworzyc spis pracownikow: ");
  540. scanf("%d",&dana_kwota);
  541.  
  542. //Otwarcie pliku.
  543. kwota_pracownikow=fopen("SpisKwot.txt","w");
  544.  
  545. if(lista == NULL)
  546. {
  547. printf("Lista jest pusta");
  548. }
  549. else
  550. {
  551.  
  552. while( wsk != NULL)
  553. {
  554. if((wsk->pensja)>=dana_kwota)
  555. { //Zapis elementow do pliku.
  556. fprintf(kwota_pracownikow,"%d. %s %s %s %d %d %d %d\n", i, wsk->imie, wsk->nazwisko, wsk->pesel, wsk->rok, wsk->miesiac, wsk->dzien, wsk->pensja);
  557. i++;
  558. }
  559. //Przestawienie wskaznika na kolejny element.
  560. wsk=wsk->next;
  561.  
  562. }
  563.  
  564. }
  565. //Zamkniecie pliku.
  566. fclose(kwota_pracownikow);
  567. }
  568. }
  569.  
  570. void warunekZnak()
  571. {
  572.  
  573.  
  574.  
  575.  
  576. {
  577.  
  578. }
  579.  
  580. }
  581. int main()
  582. { //Ustawienie wartosci wskaznika poczatku listy na NULL.
  583. pracownik* lista=NULL;
  584.  
  585. //Wyswietlenie kompletnego menu.
  586. puts(" \nWitaj w bazie danych pracownikow.\n");
  587. menu();
  588.  
  589.  
  590. while(1)
  591. {
  592. if(strlen(opcja)==1)
  593. {
  594.  
  595. //Instrukcja sterujaca switch w zaleznosci od wartosci parametru podanego przez uzytkownika.
  596. switch(opcja[0])
  597. {
  598. case 1: dodajPracownika(&lista);
  599. break;
  600. case 2: edytujPracownika(lista);
  601. break;
  602. case 3: usunPracownika(&lista);
  603. break;
  604. case 4: sortujNazwiska(lista);
  605. break;
  606. case 5: wyszukajPracownika(lista);
  607. break;
  608. case 6: dataPracownika(lista);
  609. break;
  610. case 7: kwotaPracownika(lista);
  611. break;
  612. case 8: printf("Nastepuje zamkniecie programu, nacisnij dowolny przycisk, aby zamknac.\n"); exit(0);
  613. break;
  614. default:
  615. {
  616. puts("\nPodano niewlasciwe dane, prosze podac wlasciwe.\n\n");
  617.  
  618.  
  619. //Zmienna pomocnicza do uspania
  620. float time = 0;
  621. int i;
  622. //Petla uspania. Nastepuje moment przerwy w programie.
  623. for (i=1; i>=0;i--)
  624. {
  625. while (clock() - time < 1000) {}
  626. time = clock();
  627. }
  628. system("cls");
  629. break;
  630. }
  631. }
  632. //Ponowne wyswietlenie menu.
  633. menu();
  634. }
  635. else
  636. {
  637. printf("Nic");
  638. }
  639.  
  640. }
  641.  
  642.  
  643. return 0;
  644. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement