Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- //Tablica pomocnicza przy zapisie imion, nazwisk
- char znaki[52]="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
- //Tablica pomocnicza przy zapisie daty, peselu, pensji oraz wyborze menu.
- int cyfry[10]={1,2,3,4,5,6,7,8,9,0};
- //Zmienna pomocnicza przy zliczaniu ilosci pracownikow.
- int zlicz=0;
- //Zmienna przechowujaca wybor w menu podany przez uzytkownika. Jest sprawdzana w instrukcji switch.
- char opcja[0];
- //Lista przechowujaca dane pracownika oraz wskaznik na kolejny element.
- typedef struct pracownik
- {
- char imie[50];
- char nazwisko[50];
- char pesel[11];
- int rok;
- int miesiac;
- int dzien;
- int pensja;
- struct pracownik* next;
- } pracownik ;
- //Funkcja sortujaca i wypisujaca pracownikow wedlug nazwisk - alfabetycznie.
- void sortujNazwiska(pracownik* lista)
- {
- //Inicjacja poczatku listy (wskaznika na poczatek listy).
- pracownik* wsk=lista;
- //Przypisanie wartosci dla wskaznika na poprzedni element jako NULL.
- pracownik* poprzedni=NULL;
- //Sprawdzenie, czy lista zawiera jakiekolwiek elementy.
- if(lista==NULL)
- {
- printf("Lista jest pusta");
- }
- else
- {
- //Wykonanie petli sortowania tyle razy, ile jest elementow w liscie.
- for(int r=0;r<zlicz;r++)
- {
- //Przydzielenie wartosci dla wskaznika.
- wsk=lista;
- //Zmienna pomocnicza i w petli while.
- int i=1;
- char imie[50];
- char nazwisko[50];
- char pesel[11];
- int rok;
- int miesiac;
- int dzien;
- int pensja;
- //Inicjacja zmiennych pomocniczych przechowujacych zamieniane wartosci z listy.
- char imieP[50];
- char nazwiskoP[50];
- char peselP[11];
- int rokP;
- int miesiacP;
- int dzienP;
- float pensjaP;
- //Sprawdzenie, czy wskazniki w liscie nie sa rowne NULL.
- while(wsk!=NULL)
- {
- //Jesli wskaznik na poprzednia wartosc jest rowny NULL oraz i=1
- //nastepuje przypisanie zawartosci wskaznikow na konkretne dane pracownikow.
- if(poprzedni==NULL && i==1) {
- strcpy(imie, wsk->imie);
- strcpy(nazwisko, wsk->nazwisko);
- strcpy(pesel, wsk->pesel);
- rok=wsk->rok;
- miesiac=wsk->miesiac;
- dzien=wsk->dzien;
- pensja=wsk->pensja;
- } else {
- if(strcmp(wsk->nazwisko, nazwisko)>0) {
- // Jesli funkcja strcmp, ktora porownuje wartosci wyrazow zwroci wartosc wieksza od
- // zera wtedy zmienne pozostaja bez zmian. Jesli zwroci inna wartosc wtedy nastepuje
- // ponowne przypisanie wartosci wskaznikow dla ich zmienych.
- } else {
- strcpy(imie, wsk->imie);
- strcpy(nazwisko, wsk->nazwisko);
- strcpy(pesel, wsk->pesel);
- rok=wsk->rok;
- miesiac=wsk->miesiac;
- dzien=wsk->dzien;
- pensja=wsk->pensja;
- //Zmienna pomocnicza do warunku if.
- int wyk =0;
- //Przypisanie wartosci poczatku listy dla poprzedniego wskaznika.
- poprzedni=lista;
- //Zmienna pomocnicza
- int k=0;
- //Warunek petli, kiedy wartosc poprzedniego (poczatku listy) jest rozny od zera
- while(poprzedni!=NULL)
- {
- if(wyk!=0)
- {break;}
- //Jesli wartosc i jest rowna k+2 wykonywana jest operacja
- // zapisu do zmiennych pomocniczych z dopiskiem "P" zawartosci poprzednich wskaznikow,
- // a nastepnie przypisanie tym samym zmiennym wartosci aktualnych wskaznikow.
- if(i==(k+2))
- {
- strcpy(imieP, poprzedni->imie);
- strcpy(nazwiskoP, poprzedni->nazwisko);
- strcpy(peselP, poprzedni->pesel);
- rokP=wsk->rok;
- miesiacP=wsk->miesiac;
- dzienP=wsk->dzien;
- pensjaP=wsk->pensja;
- strcpy(poprzedni->imie, imie);
- strcpy(poprzedni->nazwisko, nazwisko);
- wsk->rok=rok;
- wsk->miesiac=miesiac;
- wsk->dzien=dzien;
- wsk->pensja=pensja;
- strcpy(wsk->imie, imieP);
- strcpy(wsk->nazwisko, nazwiskoP);
- strcpy(poprzedni->pesel, peselP);
- wsk->rok=rokP;
- wsk->miesiac=miesiacP;
- wsk->dzien=dzienP;
- wsk->pensja=pensjaP;
- wyk++;
- }
- k++;
- //przypisane wartosci poprzedniego wskaznika jako wskaznika na pierwszy element listy.
- poprzedni=poprzedni->next;
- }
- //Po zakonczeniu petli while, zapisujemy ponownie wskaznik na poprzedni element
- //jako NULL (aby mogla ponownie wykonac sie petla
- poprzedni=NULL;
- }
- //Przypisane wartosci podstawowym zmiennym wartosci wskaznikow na aktualny element.
- strcpy(imie, wsk->imie);
- strcpy(nazwisko, wsk->nazwisko);
- strcpy(pesel, wsk->pesel);
- rok=wsk->rok;
- miesiac=wsk->miesiac;
- dzien=wsk->dzien;
- pensja=wsk->pensja;
- }
- i++;
- //Przesuniecie wskaznika na kolejny element.
- wsk=wsk->next;
- }
- }
- int i = 1;
- //Przesuniecie wskaznika na poczatek listy.
- wsk=lista;
- //Wypisanie posortowanych elementow listy wedlug nazwiska. Dopoki wskaznik jest rozny od NULL, czyli do konca listy.
- while(wsk!=NULL)
- {
- 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);
- wsk=wsk->next;
- i++;
- }
- }
- }
- //Funkcja dodajaca kolejne wskazniki na elementy w liscie.
- void dodaj(pracownik** lista, pracownik* nowa)
- {
- //Wskaznik nowej na nastepny element jest ustawiany na wartosc NULL.
- nowa->next=NULL;
- //Jesli lista nie istnieje jest tworzona nowa.
- if((*lista)==NULL)
- {
- //
- *lista=nowa;
- }
- else
- {
- //
- pracownik* wsk = *lista;
- while(wsk->next != NULL)
- {
- wsk = wsk->next;
- }
- wsk->next = nowa;
- }
- zlicz++;
- }
- //Funkcja upiekszajaca menu.
- void wzor()
- {
- printf("#####################################\n\n");
- }
- //Funkcja wypisujaca zawartosc menu wraz z pobieraniem opcji wyboru.
- void menu()
- {
- wzor();
- puts("\tMenu: \n"); // menu mozna w tablicy rozpisac ewentualnie
- wzor();
- puts(" 1.Dodanie nowego pracownika.");
- puts(" 2.Edycja obecnego pracownika.");
- puts(" 3.Usuwanie pracownika.");
- puts(" 4.Wypisanie wszystkich pracownikow.");
- puts(" 5.Wyszukanie wskazanego pracownika.");
- puts(" 6.Utworz plik ze wskazana data.");
- puts(" 7.Utworz plik ze wskazana placa.");
- puts(" 8.Zakoncz program.\n");
- wzor();
- printf(" Wybierz czynnosc: ");
- scanf("%d",&opcja[0]);
- }
- //Funkcja dodajaca pracownika.
- void dodajPracownika(pracownik** lista)
- {
- //Dynamiczna alokacja pamieci pod nowy element listy. Oraz podanie jego zawartosci.
- pracownik* nowa = (pracownik*)malloc(sizeof(pracownik));
- printf("Podaj imie: ");
- scanf("%s", nowa->imie);
- printf("Podaj nazwisko: ");
- scanf("%s", nowa->nazwisko);
- printf("Podaj pesel: " );
- scanf("%s", nowa->pesel);
- printf("Podaj rok: " );
- scanf("%d", &nowa->rok);
- printf("Podaj miesiac (odpowiednio 1-styczen 2-luty i tak do grudnia: " );
- scanf("%d", &nowa->miesiac);
- printf("Podaj dzien: " );
- scanf("%d", &nowa->dzien);
- printf("Podaj pensje: " );
- scanf("%d", &nowa->pensja);
- dodaj(lista, nowa);
- }
- //Funkcja edytujaca pracownika.
- void edytujPracownika(pracownik* lista)
- {
- if(lista == NULL) {
- printf("\nLista jest pusta. Nie posiada elementow do edycji.\n\n");
- } else
- {
- //Funkcja czyszczaca ekran.
- system("@cls||clear");
- int i=1,nr,n1;
- //Ustawienie wskaznika na poczatek listy.
- pracownik*wsk=lista;
- //Wyswietlenie aktualnej zawartosci imion i nazwisk pracownikow przy pomocy przesuwania wskaznika.
- while(wsk!=NULL)
- {
- printf("%d. ",i);
- printf("%s | %s\n",wsk->imie,wsk->nazwisko);
- i++;
- wsk=wsk->next;
- }
- //Pobranie numeru elementu listy do edycji.
- printf("Podaj numer do edycji: ");
- scanf("%d",&nr);
- //Ustawienie wskaznika na poczatek listy.
- wsk=lista;
- //Sprawdzenie, czy podany numer jest zgodny z wyswietlonymi.
- for(i=1;i<nr;i++)
- {
- wsk=wsk->next;
- if(wsk==NULL){printf("Zly numer");}
- }
- //Przedstawienie elementow listy.
- printf("Spis pracownikow: \n");
- printf("1.Imie | 2.Nazwisko | 3. Pesel | 4.Rok zatrudnienia | 5.Miesiac zatrudnienia. | 6.Dzien zatrudnienia | 7.Pensja.\n");
- printf("%s | %s | %s | %d | %d | %d | %d",wsk->imie,wsk->nazwisko,wsk->pesel,wsk->rok,wsk->miesiac,wsk->dzien,wsk->pensja);
- //Wybor numeru zawartosci do edycji i przekazanie parametru do instrukcji sterujacej switch.
- printf("\nWybierz numer zawartosci do edycji: ");
- scanf("%d",&n1);
- switch(n1)
- {
- case 1:
- printf("Podaj imie: ");
- scanf("%s", wsk->imie);
- break;
- case 2:
- printf("Podaj nazwisko: ");
- scanf("%s", wsk->nazwisko);
- break;
- case 3:
- printf("Podaj pesel: " );
- scanf("%s", wsk->pesel);
- break;
- case 4:
- printf("Podaj rok: " );
- scanf("%d", &wsk->rok);
- break;
- case 5:
- printf("Podaj miesiac (odpowiednio 1-styczen 2-luty i tak do grudnia: " );
- scanf("%d", &wsk->miesiac);
- break;
- case 6:
- printf("Podaj dzien: " );
- scanf("%d", &wsk->dzien);
- break;
- case 7:
- printf("Podaj pensje: " );
- scanf("%d", &wsk->pensja);
- break;
- default:
- printf("Zla kolumna");
- break;
- }
- }
- }
- //Funkcja pomocnicza przy usuwaniu wezlow (wskaznikow) listy.
- int usunPomocnicza(char* pesel,pracownik** lista)
- {
- //
- pracownik* poprzedni=NULL;
- pracownik* wsk=*lista;
- //Dopoki wartosc wskaznika jest rozna od NULL oraz wartosc porownania
- //zawartosci wskaznika na aktualny PESEL oraz ten podany
- while((wsk!=NULL) && (strcmp(wsk->pesel, pesel)!=0))
- {
- poprzedni=wsk;
- wsk=wsk->next;
- }
- if(wsk==NULL)
- {
- return 0;
- }
- else
- {
- if(poprzedni==NULL)
- {
- (*lista)=(*lista)->next;
- free(wsk);
- }
- else
- {
- poprzedni->next=wsk->next;
- free(wsk);
- }
- return 1;
- }
- }
- //Funkcja usuwajaca elementy listy w oparciu o funkcje pomocnicza usunPomocnicza.
- void usunPracownika(pracownik** lista)
- {
- //Jesli zawartosc listy jest rowna NULL oznacza to, ze nie posiada zadnych zapisanych elementow.
- if((*lista) == NULL) {
- printf("\nLista jest pusta. Nie posiada elementow do usuniecia.\n\n");
- } else
- {
- char pesel[11];
- printf("Podaj PESEL pracownika ktorego chcesz usunac: ");
- scanf("%s", pesel);
- //Wywolanie funkcji pomocniczej usuwajacej wezly wraz z wartosciami poszczegolnych elementow.
- if(usunPomocnicza(pesel, lista))
- printf("Pracownik zostal usuniet z bazy.\n");
- else
- printf("\nPracownik nie zostal usuniety z bazy lub nie ma takiej osoby.\n\n");
- }
- }
- //Funkcja wyszukujaca pracownikow.
- void wyszukajPracownika(pracownik* lista)
- {
- if(lista==NULL) {
- printf("\nLista jest pusta. Nie posiada zadnego elementu do wyszukania.\n\n");
- } else
- {
- char pomocnicza2[11];
- printf("Podaj PESEL szukanego pracownika: " );
- scanf("%s", pomocnicza2);
- //Ustawienie wskaznika na poczatek listy.
- pracownik* wsk = lista;
- int i=0;
- while(wsk!=NULL)
- //Porownanie funkcja strcmp poszczegolnych PESEL'ow, jesli funkcja strcmp zwroci 0 oznacza to, ze
- //PESEL'e sa rowne.
- { if(strcmp(wsk->pesel,pomocnicza2)==0)
- { //Wypisanie wyszukanego elementu listy.
- 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);
- i++;
- }
- //Przesuniecie wskaznika na kolejny element.
- wsk=wsk->next; //
- }
- //Jesli nie nastapila iteracja, oznacza to, ze nie wyszukano elementu.
- if(i==0)
- {
- printf("Pracownik o podanym PESEL'u nie istnieje!");
- }
- }
- }
- //Funkcja zapisujaca elementy listy do pliku w zaleznosci od daty.
- void dataPracownika(pracownik* lista)
- {
- if(lista== NULL) {
- printf("\nLista jest pusta. Nie posiada elementow do zapisu.\n\n");
- } else
- {
- //Ustawienie wskaznika na poczatek listy.
- pracownik* wsk = lista;
- //Utworzenie pliku.
- FILE *data_pracownikow;
- int i=1;
- int dany_rok,dany_miesiac,dany_dzien;
- //Wprowadzenie wartosci od ktorych zostana zapisane elementy listy do pliku.
- printf("Podaj rok, od ktorego chcesz utworzyc spis pracownikow: ");
- scanf("%d",&dany_rok);
- printf("Podaj miesiac, od ktorego chcesz utworzyc spis pracownikow: ");
- scanf("%d",&dany_miesiac);
- printf("Podaj dzien, od ktorego chcesz utworzyc spis pracownikow: ");
- scanf("%d",&dany_dzien);
- //Otwarcie pliku.
- data_pracownikow=fopen("SpisDat.txt","w");
- if(lista==NULL)
- {
- printf("Lista jest pusta");
- }
- else
- {
- while( wsk!=NULL)
- { //Jesli spelnione sa 3 warunki jednoczesnie nastepuje zapis do pliku.
- if(((wsk->rok)>=dany_rok)&&((wsk->miesiac)>=dany_miesiac)&&((wsk->dzien)>=dany_dzien))
- {
- //Zapis elementow do pliku.
- 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);
- i++;
- }
- wsk=wsk->next;
- }
- }
- //Zamkniecie pliku
- fclose(data_pracownikow);
- }
- }
- //Funkcja zapisujaca elementow listy od podanej wartosci pensji pracownikow.
- void kwotaPracownika(pracownik* lista)
- {
- if(lista== NULL) {
- printf("\nLista jest pusta. Nie posiada elementow do zapisu.\n\n");
- } else
- {
- //Ustawienie wskaznika na poczatek listy.
- pracownik* wsk = lista;
- //Utworzenie pliku.
- FILE *kwota_pracownikow;
- int i=1;
- int dana_kwota;
- printf("Podaj kwote, od jakiej chcesz utworzyc spis pracownikow: ");
- scanf("%d",&dana_kwota);
- //Otwarcie pliku.
- kwota_pracownikow=fopen("SpisKwot.txt","w");
- if(lista == NULL)
- {
- printf("Lista jest pusta");
- }
- else
- {
- while( wsk != NULL)
- {
- if((wsk->pensja)>=dana_kwota)
- { //Zapis elementow do pliku.
- 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);
- i++;
- }
- //Przestawienie wskaznika na kolejny element.
- wsk=wsk->next;
- }
- }
- //Zamkniecie pliku.
- fclose(kwota_pracownikow);
- }
- }
- void warunekZnak()
- {
- {
- }
- }
- int main()
- { //Ustawienie wartosci wskaznika poczatku listy na NULL.
- pracownik* lista=NULL;
- //Wyswietlenie kompletnego menu.
- puts(" \nWitaj w bazie danych pracownikow.\n");
- menu();
- while(1)
- {
- if(strlen(opcja)==1)
- {
- //Instrukcja sterujaca switch w zaleznosci od wartosci parametru podanego przez uzytkownika.
- switch(opcja[0])
- {
- case 1: dodajPracownika(&lista);
- break;
- case 2: edytujPracownika(lista);
- break;
- case 3: usunPracownika(&lista);
- break;
- case 4: sortujNazwiska(lista);
- break;
- case 5: wyszukajPracownika(lista);
- break;
- case 6: dataPracownika(lista);
- break;
- case 7: kwotaPracownika(lista);
- break;
- case 8: printf("Nastepuje zamkniecie programu, nacisnij dowolny przycisk, aby zamknac.\n"); exit(0);
- break;
- default:
- {
- puts("\nPodano niewlasciwe dane, prosze podac wlasciwe.\n\n");
- //Zmienna pomocnicza do uspania
- float time = 0;
- int i;
- //Petla uspania. Nastepuje moment przerwy w programie.
- for (i=1; i>=0;i--)
- {
- while (clock() - time < 1000) {}
- time = clock();
- }
- system("cls");
- break;
- }
- }
- //Ponowne wyswietlenie menu.
- menu();
- }
- else
- {
- printf("Nic");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement