Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX1 30
- #define MAX2 40
- #define MAX3 20
- // STRUKTURA Z INFORMACJAMI O KSIAZCE Z BIBLIOTEKI
- typedef struct
- {
- char AutorB[MAX1];
- char TytulB[MAX2];
- int Rok;
- char Wydawnictwo[50];
- char Typ[50];
- char Wypozyczona[4];//TAK LUB NIE, jesli tak komu zostala wypozyczona
- char Komu[MAX3];
- }Biblioteka;
- //STRUKTURA Z LISTA DO BIBLIOTEKI
- struct ListaB
- {
- Biblioteka data;
- struct ListaB *next;
- };
- typedef struct ListaB LISTAB;
- typedef LISTAB *ADRESB;
- //STRUKTURA Z INFORMACJAMI O KSIAZCE KTORA CHCEMY KUPIC
- typedef struct
- {
- char AutorDK[MAX1];
- char TytulDK[MAX2];
- }DoKupienia;
- //STRUKTURA Z LISTA DO DOKUPIENIA
- struct ListaDK
- {
- DoKupienia dane;
- struct ListaDK *nast;
- };
- typedef struct ListaDK LISTADK;
- typedef LISTADK *ADRESDK;
- //_____________ prototypy _________________
- void UsunB(ADRESB first, char Usuwany[MAX2]);
- void UsunDK(ADRESDK pierwszy, char Usuwany[MAX2]);
- //_______________________________________
- void DodajKsiazkeB(ADRESB first, ADRESDK pierwszy)
- {
- int usunzDK;
- //DODANIE KSIAZKI DO BILBIOTEKI
- ADRESB tmp;
- tmp = first;
- while(tmp->next)
- {
- tmp = tmp->next;
- }
- tmp->next = (ADRESB)malloc(sizeof(LISTAB));
- tmp = tmp->next;
- tmp->next = NULL;
- printf("Podaj nazwisko autora: ");
- fflush(stdin);
- gets(tmp->data.AutorB);
- printf("Podaj tytul ksiazki: ");
- fflush(stdin);
- gets(tmp->data.TytulB);
- printf("Podaj rok wydania ksiazki: ");
- fflush(stdin);
- scanf("%d", &tmp->data.Rok);
- printf("Podaj wydawnictwo: ");
- fflush(stdin);
- gets(tmp->data.Wydawnictwo);
- printf("Podaj typ ksiazki (np.: kryminal, dramat, poradnik, itd.: ");
- fflush(stdin);
- gets(tmp->data.Typ);
- system("cls");
- printf("Ksiazka zostala dodana do listy Biblioteka.\n\n");
- printf("Czy chcesz, aby dodana przez Ciebie ksiazka zostala jednoczesnie usunieta z listy 'Do kupienia'?\n\n");
- printf("1. TAK \n2. NIE \n\n");
- scanf("%d", &usunzDK);
- switch(usunzDK)
- {
- case 1: //ksiazka zostanie usunieta z listy DoKupienia
- {
- if(pierwszy == NULL)
- {
- printf("Nie mozesz usunac ksiazki, gdyz lista 'Do kupienia' jest pusta.");
- puts("Nacisnij dowolny klawisz, aby powrocic do menu.");
- fflush(stdin);
- getch();
- }
- else
- {
- UsunDK(pierwszy, tmp->data.TytulB);
- puts("Ksiazka zostala usunieta z listy DoKupienia.\n\n");
- puts("Nacisnij dowolny klawisz, aby powrocic do menu.");
- fflush(stdin);
- getch();
- }
- }break;
- case 2: //ksiazka pozostanie w liscie DoKupienia
- {
- puts("Ksiazka pozostala w liscie 'Do kupienia'.\n\n");
- puts("Nacisnij dowolny klawisz, aby powrocic do menu.");
- fflush(stdin);
- getch();
- break;
- }
- case 3: //POWRÓT DO MENU
- {
- return;
- }
- }
- }
- //____________________________________________
- void DodajKsiazkeDK(ADRESDK pierwszy)
- {
- // DODANIE KSIAZKI DO LISTY DOKUPIENIA
- ADRESDK pom;
- pom = pierwszy;
- while(pom->nast)
- {
- pom->nast = pom;
- }
- pom->nast = (LISTADK*) malloc(sizeof(LISTADK));
- pom = pom->nast;
- pom->nast = NULL;
- printf("Podaj nazwisko autora: ");
- fflush(stdin);
- gets(pom->dane.AutorDK);
- printf("Podaj tytul: ");
- fflush(stdin);
- gets(pom->dane.TytulDK);
- puts("Ksiazka zostala dodana do listy 'Do kupienia'.\n\n");
- puts("Nacisnij dowolny klawisz, aby powrocic do menu.");
- fflush(stdin);
- getch();
- system("cls");
- }
- //____________________________________________
- void UsunB(ADRESB first, char Usuwany[MAX2])
- {
- if(first)
- first = first->next;
- while(first->next) //Sprawdzamy dla ka¿dego elementu
- {
- if(stricmp(first->next->data.TytulB,Usuwany)==0) //Czy ten element to ten sam o którym mówmy
- {
- ADRESB Us = first->next; //Zapamiêtujemy drania
- first->next = first->next->next; //Usuwamy go z spisów
- free(Us); //Wysy³amy zabójcê by go sprz¹tn¹æ
- return; //I zmywamy siê z miejsca zbrodni
- }
- first = first->next;
- }
- //Je¿eli nie ma go w liœcie to te¿ koñczymy funkcjê xD
- }
- //______________________________________________
- void UsunDK(ADRESDK pierwszy, char Usuwany[MAX2])
- {
- if(pierwszy)
- pierwszy = pierwszy->nast;
- while(pierwszy->nast) //Sprawdzamy dla ka¿dego elementu
- {
- if(stricmp(pierwszy->nast->dane.TytulDK,Usuwany) == 0) //Czy ten element to ten sam o którym mówmy
- {
- ADRESDK Us = pierwszy->nast; //Zapamiêtujemy drania
- pierwszy->nast = pierwszy->nast->nast; //Usuwamy go z spisów
- free(Us); //Wysy³amy zabójcê by go sprz¹tn¹æ
- return; //I zmywamy siê z miejsca zbrodni
- }
- pierwszy = pierwszy->nast;
- }
- //Je¿eli nie ma go w liœcie to te¿ koñczymy funkcjê xD
- }
- //______________________________________
- void Wypozyczone(ADRESB first)
- {
- if(first)
- first = first->next;
- ADRESB tmp;
- tmp = first;
- int licznik = 1;
- if(tmp == NULL)
- {
- printf("Niestety na liscie nie znajduje sie zadna ksiazka.\n\n");
- return;
- }
- else
- {
- puts("Oto ksiazki, ktore znajduja sie na liscie:\n");
- while(tmp)
- {
- printf("Ksiazka nr %d\n", licznik);
- printf("Autor: %s\n", tmp->data.AutorB);
- printf("Tytul: %s\n", tmp->data.TytulB);
- printf("Rok wydania: %d\n", tmp->data.Rok);
- printf("Wydawnictwo: %s\n", tmp->data.Wydawnictwo);
- printf("Typ ksiazki: %s\n", tmp->data.Typ);
- printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
- tmp = tmp->next;
- licznik++;
- }
- }
- return;
- }
- //____________________________________________________________
- void Chce(ADRESDK pierwszy)
- {
- if(pierwszy)
- pierwszy = pierwszy->nast;
- ADRESDK pom;
- pom = pierwszy;
- int licznik = 1;
- if(pom == NULL)
- {
- printf("Niestety na liscie nie znajduje sie zadna ksiazka.\n\n");
- return;
- }
- else
- {
- puts("Oto ksiazki, ktore znajduja sie na liscie:\n");
- while(pom)
- {
- printf("Ksiazka nr %d\n", licznik);
- printf("Autor: %s\n", pom->dane.AutorDK);
- printf("Tytul: %s\n", pom->dane.TytulDK);
- printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
- pom = pom->nast;
- licznik++;
- }
- }
- return;
- }
- //____________________________________________________________________
- void SortujAutorzyB(ADRESB first)
- {
- ADRESB Nowy = 0; //Bedziemy tu dodawac elementy od "najwiekszego". Umieszczamy na pocz¹tku listy, wiêc ostatecznie kolejka bêdzie jakby odwrócona ;)
- while(first->next) // Póki zosta³y jakieœ elementy na liœcie first
- {
- ADRESB Tmp = first; // Bedziemy tym siê przemieszczaæ po liœcie
- ADRESB Max = first; // A tu mamy poprzedni element maksymalnego
- while(Tmp->next)//Póki tmp nie jest przedostatnim elementem (bo pobieramy wskaŸnik na poprzedni przed porównywanym)
- {
- if(strcmp(Max->next->data.AutorB,Tmp->next->data.AutorB)>0) //Je¿eli "obecny" jest "wiêkszy" od minimalnego
- Max= Tmp;
- Tmp = Tmp->next;
- }
- //W tym miejscu Min wskazuje na "najwiekszy" element w liœcie A;
- ADRESB Buf = Max->next; //Zapamietujemy Min
- Max->next = Max->next->next; //Usuwamy je z pierwszej listy
- Buf->next = Nowy; //Te dwie linie
- Nowy = Buf; //Dodajemy Maxa do nowej listy
- }
- first->next = Nowy; //No i tylko przypisujemy spowrotem "now¹" listê na miejsce starej;
- return; //Gotowe
- }
- //____________________________________________________________________
- void SortujTytulyB(ADRESB first)
- {
- ADRESB Nowy = 0;
- while(first->next)
- {
- ADRESB Tmp = first;
- ADRESB Max = first;
- while(Tmp->next)
- {
- if(strcmp(Max->next->data.TytulB, Tmp->next->data.TytulB) > 0)
- Max= Tmp;
- Tmp = Tmp->next;
- }
- ADRESB Buf = Max->next;
- Max->next = Max->next->next;
- Buf->next = Nowy;
- Nowy = Buf;
- }
- first->next = Nowy;
- return;
- }
- //____________________________________________________________________
- void Zwolnij(ADRESB first, ADRESDK pierwszy)
- {
- if(first)
- first = first->next;
- if(pierwszy)
- pierwszy = pierwszy->nast;
- ADRESB Popf = first; //W Popf zapamiêtujemy poprzedni element
- while(first->next) //Póki jest nastêpny element
- {
- first = first->next; //Przechodzimy na niego
- free(Popf); //Zwalniamy poprzedni
- Popf = first; //I zapamiêtujemy obecny
- }
- free(Popf); //Zwalniamy jeszcze ostatni element
- ADRESDK Popp = pierwszy; //Analogincznie
- while(pierwszy->nast)
- {
- pierwszy = pierwszy->nast;
- free(Popp);
- Popp = pierwszy;
- }
- free(Popf);
- return;
- }
- void Zapisz(ADRESB first, ADRESDK pierwszy, char Sciezka1[], char Sciezka2[])
- {
- if(first)
- first = first->next;
- if(pierwszy)
- pierwszy = pierwszy->nast;
- ADRESB tmp;
- tmp = first;
- Biblioteka b;
- ADRESDK pom;
- pom = pierwszy;
- DoKupienia d;
- FILE *moon = fopen(Sciezka1,"wb");
- //ZAPISYWANIE DANYCH 'BIBLIOTEKA'
- while(tmp)
- {
- strcpy(b.AutorB, tmp->data.AutorB);
- strcpy(b.TytulB, tmp->data.TytulB);
- b.Rok = tmp->data.Rok;
- strcpy(b.Wydawnictwo, tmp->data.Wydawnictwo);
- strcpy(b.Wypozyczona, tmp->data.Wypozyczona);
- strcpy(b.Komu, tmp->data.Komu);
- strcpy(b.Typ, tmp->data.Typ);
- fwrite(&b, sizeof(Biblioteka), 1, moon);
- tmp = tmp->next;
- }
- fclose(moon);
- moon = fopen(Sciezka2,"wb");
- //ZAPISYWANIE DANYCH 'DOKUPIENIA'
- while(pom)
- {
- strcpy(d.AutorDK, pom->dane.AutorDK);
- strcpy(d.TytulDK, pom->dane.TytulDK);
- fwrite(&d, sizeof(DoKupienia), 1, moon);
- pom = pom->nast;
- }
- fclose(moon);
- }
- //_________________________________________________
- void Wczytaj(ADRESB first, ADRESDK pierwszy, char Sciezka1[],char Sciezka2[])
- {
- Zwolnij(first);
- Zwolnij(pierwszy);
- ADRESB tmp, help;
- Biblioteka b;
- ADRESDK pom, rat;
- DoKupienia d;
- char nowyplik[50];
- FILE *food = fopen(Sciezka1,"rb");
- if(food == 0)
- {
- printf("Pirat nie zyje! Pliku nie ma!\n\n");
- getch();
- return;
- }
- while(fread(&b, sizeof(Biblioteka), 1, food) == 1)
- {
- tmp=(LISTAB*)malloc(sizeof(LISTAB));
- strcpy(tmp->data.AutorB, b.AutorB);
- strcpy(tmp->data.TytulB, b.TytulB);
- tmp->data.Rok = b.Rok;
- strcpy(tmp->data.Wydawnictwo, b.Wydawnictwo);
- strcpy(tmp->data.Wypozyczona, b.Wypozyczona);
- strcpy(tmp->data.Komu, b.Komu);
- strcpy(tmp->data.Typ, b.Typ);
- tmp->next = NULL;
- first->next = tmp;
- first = tmp;
- }
- food = fopen(Sciezka2,"wb");
- fclose(food);
- if(food == 0)
- {
- printf("Pirat nie zyje! Pliku nie ma!\n\n");
- getch();
- return;
- }
- while(fread(&d, sizeof(DoKupienia), 1, food) == 1)
- {
- strcpy(pom->dane.AutorDK, d.AutorDK);
- strcpy(pom->dane.TytulDK, d.TytulDK);
- pom->nast = NULL;
- pierwszy->nast = pom;
- pierwszy = pom;
- }
- printf("\n\nUdalo sie otworzyc plik\n\nWcisnij dowolny klawisz aby kontynuowac.\n");
- getch();
- system("cls");
- fclose(food); //Zamykamy plik
- return;
- }
- //___________________________________________________________________
- //____________________________________________________________________
- int main()
- {
- FILE *moon;
- char nazwa1[50]; //nazwa pierwszego pliku uzytkownik nada dla pliku
- char nazwa2[50]; //nazwa drugiego
- ADRESB first, tmp;
- first = (LISTAB*) malloc(sizeof(LISTAB));
- first->next = NULL;
- ADRESDK pierwszy, pom;
- pierwszy = (LISTADK*) malloc(sizeof(LISTADK));
- pierwszy->nast = NULL;
- int numer;
- int zapis;
- int sort;
- int wybierz;
- int usuwanie;
- int wybor;
- int gdzieDodac;
- tmp = first;
- printf("1. Stworz nowy plik \n2. Wczytaj plik\n\n");
- scanf("%d", &wybierz);
- switch(wybierz)
- {
- case 1:
- printf("\nPodaj nazwe nowego pliku: \n");
- fflush(stdin);
- gets(nazwa);
- moon = fopen(nazwa,"wrab");
- //fclose(moon);
- //moon = fopen(nazwa,"rb");
- break;
- case 2:
- printf("\nPodaj nazwe pliku DK do wczytania: \n");
- fflush(stdin);
- gets(nazwa1);
- printf("\nPodaj nazwe pliku S do wczytania: \n");
- fflush(stdin);
- gets(nazwa2);
- Wczytaj(first, pierwszy, nazwa, nazwa2);
- system("cls");
- break;
- }
- Wczytaj(first, pierwszy, nazwa); //Wczytujemy na wstepie dane
- do{
- printf("1. Wypozyczone\n2. Ksiazki, ktore chcesz kupic\n3. Dodaj ksiazke\n4. Usun ksiazke \n5. Sortowanie\n6. Autorzy - ilosc ksiazek\n7. Najpopularniejsza kategoria\n8. Wczytaj nowy plik\n9. Zapisz i zakoncz\n\n");
- {
- do{
- scanf("%d", &numer);
- if(numer<1 || numer>9)
- {
- printf("Zly numer. Wybierz prawidlowa kategorie\n");
- }
- }while(numer<1 || numer>9);
- }
- system("cls");
- switch(numer)
- {
- case 1: //KSIAZKI KTORE MAM (lista Biblioteka)
- Wypozyczone(first);
- printf("\nWcisnij dowolny klawisz aby wrocic do menu.\n");
- getch();
- system("cls");
- break;
- case 2: //KSIAZKI KTORE CHCE KUPIC (lista DoKupienia)
- Chce(pierwszy);
- printf("\nWcisnij dowolny klawisz aby wrocic do menu.\n");
- getch();
- system("cls");
- break;
- case 3: //DODANIE KSIAZKI
- puts("Gdzie chcesz dodac nowa ksiazke?\n1. Biblioteka \n2. Do kupienia \n3. Powrot do menu");
- int nazwa;
- do{
- scanf("%d", &gdzieDodac);
- if(gdzieDodac<1 || gdzieDodac>3)
- {
- printf("Zly numer. Podaj prawidlowa kategorie.");
- }
- } while(gdzieDodac<1 || gdzieDodac>3);
- system("cls");
- switch(gdzieDodac)
- {
- case 1:
- DodajKsiazkeB(first, pierwszy);
- break;
- case 2:
- DodajKsiazkeDK(pierwszy);
- break;
- //system("cls");
- }
- printf("\nWcisnij dowolny klawisz aby wrocic do menu.\n");
- getch();
- system("cls");
- break;
- case 4: //USUNIECIE KSIAZKI
- printf("Skad chcesz usunac ksiazke?\n1.Biblioteka\n2.Do kupienia\n\n");
- scanf("%d", &usuwanie);
- char Tytul[MAX2];
- switch(usuwanie)
- {
- case 1:
- printf("Podaj tytul ksiazki, ktora chcesz usunac: \n");
- fflush(stdin);
- gets(Tytul);
- UsunB(first, Tytul);
- printf("Ksiazka zostala usunieta z listy.\n\n");
- printf("\nWcisnij dowolny klawisz aby wrocic do menu.\n");
- getch();
- system("cls");
- break;
- case 2:
- printf("Podaj tytul ksiazki ktora chcesz usunac: \n\n");
- fflush(stdin);
- //char Tytul[MAX2];
- gets(Tytul);
- UsunDK(pierwszy, Tytul);
- printf("Ksiazka zostala usunieta z listy.\n\n");
- int dodajdoB;
- printf("Czy chcesz, aby ksiazka zostala jednoczesnie dodana do listy 'Biblioteka'? \n1. TAK \n2. NIE\n\n");
- scanf("%d", &dodajdoB);
- switch(dodajdoB)
- {
- case 1:
- while(tmp->next)
- {
- tmp = tmp->next;
- }
- tmp->next = (ADRESB)malloc(sizeof(LISTAB));
- tmp = tmp->next;
- tmp->next = NULL;
- printf("Uzupelnij brakujace informacje o ksiazce:\n");
- printf("Podaj rok wydania ksiazki: ");
- fflush(stdin);
- scanf("%d", &tmp->data.Rok);
- printf("Podaj wydawnictwo: ");
- fflush(stdin);
- gets(tmp->data.Wydawnictwo);
- printf("Podaj typ ksiazki (np.: kryminal, dramat, poradnik, itd.: ");
- fflush(stdin);
- gets(tmp->data.Typ);
- system("cls");
- printf("Ksiazka zostala dodana do listy Biblioteka.\n\n");
- break;
- case 2:
- printf("Ksiazka pozostala w liscie 'Biblioteka'");
- break;
- }break;
- }break;
- case 5: //SORTOWANIE
- printf("Wedlug jakiej kategorii chcesz posortowac? \n1. Autorzy \n2. Tytuly\n");
- fflush(stdin);
- scanf("%d", &sort);
- switch(sort)
- {
- case 1:
- SortujAutorzyB(first);
- printf("\n\nWcisnij dowolny klawisz, aby powrocic do menu.\n\n");
- getch();
- system("cls");
- break;
- case 2:
- SortujTytulyB(first);
- printf("\n\nWcisnij dowolny klawisz, aby powrocic do menu.\n\n");
- getch();
- system("cls");
- break;
- }break;
- case 8: //WCZYTANIE I OPEROWANIE NA NOWYM PLIKU
- system("cls");
- printf("Czy zapisac dotychczasowy? \n1. TAK \n2. NIE\n");
- scanf("%d", &zapis);
- switch(zapis)
- {
- case 1:
- printf("gdzie zapisac? 1 Plik:");
- fflush(stdin);
- gets(nazwa1);
- printf("gdzie zapisac? 2 Plik:");
- fflush(stdin);
- gets(nazwa2);
- Zapisz(first, pierwszy, nazwa1,nazwa2);
- puts("Plik zostal zapisany.\n");
- printf("gdzie wczytac? 1 Plik:");
- fflush(stdin);
- gets(nazwa1);
- printf("gdzie wczytac? 2 Plik:");
- fflush(stdin);
- gets(nazwa2);
- getch();
- Wczytaj(first, pierwszy, nazwa1, nazwa2);
- printf("\nWcisnij dowolny klawisz aby wrocic do menu.\n");
- getch();
- system("cls");
- break;
- case 2: // Nie rozumiem co tu robisz
- printf("\nNazwa nowego pliku:");
- fflush(stdin);
- gets(Tytul);
- printf("\nWcisnij dowolny klawisz aby wrocic do menu.\n");
- getch();
- system("cls");
- break;
- } break;
- case 9: //ZAPIS DANYCH I KONIEC PROGRAMU
- printf("gdzie zapisac? 1 Plik:");
- fflush(stdin);
- gets(nazwa1);
- printf("gdzie zapisac? 2 Plik:");
- Zapisz(first, pierwszy, nazwa1, nazwa2);
- printf("Wszystkie dane zostaly zapisane.\nDo zobaczenia w drugim semestrze :)\n\n");
- break;
- }
- }while(numer>0 && numer<9);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement