Advertisement
marek03031

Untitled

Dec 1st, 2015
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.80 KB | None | 0 0
  1. #include <stdio.h>                                          //Pouzite kniznice
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. typedef struct pozicka {                                    //Struktura
  7.     char sign[15];
  8.     char isbn[17];
  9.     char kniha[105];
  10.     char autor[105];
  11.     int datum;
  12.     int cislo;
  13.     struct pozicka *dalsi;                                  //smernik na dalsi
  14. } POZICKA;
  15.  
  16. POZICKA * funkcia_n(POZICKA *p_prv, int *n) {               //Nacitanie zaznamov do zoznamu f vracia smernik na 1. zaznam
  17.     if (p_prv != NULL) {                                    //ak smerník niekde ukazuje uvolni pamet
  18.         free(p_prv);
  19.     }
  20.     FILE *fr;                                               //smernik typu file
  21.     char nic[70], c;                                        //Deklaracia ukazovatela na smernik
  22.     POZICKA *p_akt;                                         // deklarovany smernik na aktualny zaznam
  23.     int x, i;
  24.     *n = 0;                                                
  25.  
  26.     fr = fopen("kniznica.txt", "r");                        //Otvorenie suboru na citanie
  27.     if (fr == NULL) {                                       //Osetrenie neotvorenia suboru
  28.         printf("Zaznamy neboli nacitane\n");
  29.         return 0;
  30.     }
  31.     if ((c = fgetc(fr)) == '-') {
  32.         while ((fgets(nic, 70, fr)) != NULL) {              //Citanie po riadkoch po koniec suboru
  33.             fgets(nic, 70, fr);
  34.             fgets(nic, 70, fr);
  35.             fgets(nic, 70, fr);
  36.             fgets(nic, 70, fr);
  37.             fscanf(fr, "%d\n", &x);
  38.             fscanf(fr, "%d\n", &x);
  39.             (*n)++;                                         //Pocet zaznamov
  40.         }
  41.  
  42.         if ((p_prv = (POZICKA *)malloc(sizeof(POZICKA))) == NULL) {         //smernik ukazuje na prvy vytvoreny zaznam
  43.             printf("Malo pamate.\n");
  44.             return 0;
  45.         }
  46.  
  47.         rewind(fr);
  48.         fgets(nic, 20, fr);
  49.         fgets(p_prv->sign, 15, fr);                         // do prveho zaznamu sa ukladaju položky zo suboru
  50.         fgets(p_prv->isbn, 17, fr);
  51.         fgets(p_prv->kniha, 105, fr);
  52.         fgets(p_prv->autor, 105, fr);
  53.         fscanf(fr, "%d", &p_prv->datum);
  54.         fscanf(fr, "%d", &p_prv->cislo);
  55.            
  56.         p_akt = p_prv;                                      //smernik aktualny ukazuje tam kde prvy
  57.  
  58.         for (i = 2; i <= *n; i++) {
  59.             if ((p_akt->dalsi = (POZICKA *)malloc(sizeof(POZICKA))) == NULL) { //vytvorenie druheho zaznamu
  60.                 printf("Malo pamate.\n");
  61.                 return 0;
  62.             }
  63.             p_akt = p_akt->dalsi;                           // zabezpecuje prechadzanie zaznamom
  64.             fgets(nic, 20, fr);
  65.             fgets(nic, 20, fr);
  66.             fgets(p_akt->sign, 15, fr);                     //do druheho zaznamu sa ukladaju polozky   
  67.             fgets(p_akt->isbn, 17, fr);
  68.             fgets(p_akt->kniha, 105, fr);
  69.             fgets(p_akt->autor, 105, fr);
  70.             fscanf(fr, "%d", &p_akt->datum);
  71.             fscanf(fr, "%d", &p_akt->cislo);
  72.         }
  73.         printf("Nacitalo sa %d zaznamov\n", *n);
  74.  
  75.         p_akt->dalsi = NULL;                                //priradi koniec zoznamu
  76.  
  77.         return p_prv;                                       // vrateny smernik na zaciatok zoznamu
  78.     }
  79.     return 0;
  80. }
  81. POZICKA * funkcia_v(POZICKA *p_prv) {                       //funkcia na vypis vracia smernik na aktualny zaznam
  82.     if (p_prv != NULL) {
  83.        
  84.         POZICKA *p_akt;
  85.         p_akt = p_prv;                                      //aktualny smernik ukazuje na prvy
  86.  
  87.         int x = 0;
  88.  
  89.         while (p_akt != NULL) {                             // pokial aktualny nieje na konci zoznamu
  90.             printf("%d.\n", ++x);
  91.             printf("signatura: %s", p_akt->sign);
  92.             printf("isbn: %s", p_akt->isbn);
  93.             printf("nazov: %s", p_akt->kniha);
  94.             printf("autori: %s", p_akt->autor);
  95.             printf("datum: %d\n", p_akt->datum);
  96.             printf("preukaz: %d\n", p_akt->cislo);
  97.             p_akt = p_akt->dalsi;
  98.         }
  99.         return p_akt;                                       // vrateny smernik na aktualny zaznam
  100.     }
  101.     return 0;
  102. }
  103. void funkcia_p(POZICKA **p_prv, int n) {                    // funkcia na pridanie zaznamu do zoznamu
  104.     if (*p_prv != NULL) {
  105.         POZICKA *p_nov, *p_akt;
  106.         p_akt = *p_prv;
  107.  
  108.         int poz, i;
  109.  
  110.         scanf("%d ", &poz);
  111.         if (poz > n) {
  112.             poz = n + 1;
  113.  
  114.         }
  115.         if ((p_nov = (POZICKA *)malloc(sizeof(POZICKA))) == NULL) {
  116.             printf("Malo pamate.\n");
  117.             return;
  118.         }
  119.         fgets(p_nov->sign, 15, stdin);                      //nacitavanie hodnot do zaznamu
  120.         fgets(p_nov->isbn, 17, stdin);
  121.         fgets(p_nov->kniha, 105, stdin);
  122.         fgets(p_nov->autor, 105, stdin);
  123.         scanf("%d\n", &p_nov->datum);
  124.         scanf("%d\n", &p_nov->cislo);
  125.         if (poz > 1) {                                      //pridavanie na prvu poziciu
  126.             for (i = 1; i < poz - 1; i++) {
  127.                 p_akt = p_akt->dalsi;
  128.             }
  129.             p_nov->dalsi = p_akt->dalsi;
  130.             p_akt->dalsi = p_nov;
  131.         }
  132.         else {                                              //pridanie na poziciu
  133.             p_nov->dalsi = *p_prv;
  134.             *p_prv = p_nov;
  135.         }
  136.     }                                                                  
  137. }
  138.  
  139. void funkcia_z(POZICKA **p_prv) {                           //funkcia kt vymazuje zvolene zaznamy zo zoznamu podla autora
  140.     char pole[30];
  141.     scanf("%s", pole);
  142.     if (*p_prv == NULL) {
  143.         printf("Vymazalo sa 0 zaznamov\n");
  144.         return;
  145.     }                                                  
  146.     POZICKA *p_akt, *p_pre, *pom;                           //deklaracie
  147.     p_akt = *p_prv;                                         //p_akt ukazuje tam kde p_prv
  148.  
  149.     char kvk[150];                                 
  150.     int i = 0, poc = 0;                            
  151.  
  152.     while (pole[i] != '\0') {
  153.         pole[i] = tolower(pole[i]);                         //vsetky pismena podretazca male
  154.         i++;
  155.     }
  156.     i = 0;
  157.  
  158.     while (p_akt != NULL) {                                 //pokial nieje koniec zoznamu
  159.         strcpy(kvk, p_akt->autor);                          //do pola kvk skopiruj autora z aktualneho zaznamu
  160.         while (kvk[i] != '\0') {
  161.             kvk[i] = tolower(kvk[i]);                       //vsetky pismena podretazca male
  162.             i++;
  163.         }
  164.         i = 0;
  165.         if (strstr(kvk, pole) == NULL) {                    //ak sa podretazec nenachadza v kvk prejdi na dalsi zaznam
  166.             p_akt = p_akt->dalsi;                  
  167.             continue;
  168.         }
  169.         if (p_akt == *p_prv) {                              //ak odstanujem prvy zaznam
  170.             pom = *p_prv;                                   //smernik p_prv ulozeny do pomocnej
  171.             *p_prv = (*p_prv)->dalsi;                       //smernik prv ukazuje na dalsi zaznam
  172.             p_akt = *p_prv;                                 //aktualny ukazuje na prvy
  173.             free(pom);                                      //odstranenie prveho zaznamu
  174.             poc++;                         
  175.         }
  176.         else{                                              
  177.             p_pre = *p_prv;                                 //predchadzajuci ukazuje na prvy
  178.             while (p_pre->dalsi != p_akt) {                 //najdenie zaznamu na vymazanie
  179.                 p_pre = p_pre->dalsi;                       // prechadzanie na dalsi zaznam
  180.             }
  181.             p_pre->dalsi = p_akt->dalsi;
  182.  
  183.             pom = p_akt;
  184.             p_akt = p_akt->dalsi;
  185.             free(pom);                                      //odstranie zaznamu
  186.             poc++;                                 
  187.         }
  188.     }
  189.     printf("Vymazalo sa %d zaznamov\n", poc);                                              
  190. }
  191.  
  192. void funkcia_h(POZICKA *p_prv) {                            //funkcia hlada pozicky podla cisla preukazu a vypise ich          
  193.     int cis;
  194.     scanf("%d", &cis);
  195.     if (p_prv == NULL) {
  196.         printf("Pre dane cislo preukazu neevidujeme vypozicky\n");
  197.         return;
  198.     }                                                                              
  199.     int x = 0;
  200.  
  201.     POZICKA *p_akt;                                         //deklaracia smerniku typu pozicka
  202.     p_akt = p_prv;                                          //p_prv a p_akt ukazuju na rovnake miesto
  203.  
  204.     while (p_akt != NULL) {                    
  205.         if (p_akt->cislo == cis) {
  206.             printf("%d.\n", ++x);                           //vypis najdenych poli     
  207.             printf("signatura: %s", p_akt->sign);
  208.             printf("isbn: %s", p_akt->isbn);
  209.             printf("nazov: %s", p_akt->kniha);
  210.             printf("autori: %s", p_akt->autor);
  211.             printf("datum: %d\n", p_akt->datum);
  212.             printf("preukaz: %d\n", p_akt->cislo);
  213.  
  214.         }
  215.         p_akt = p_akt->dalsi;                               //prechadzanie na dalsi zaznam
  216.     }
  217. }
  218.  
  219. void funkcia_a(POZICKA *p_prv) {                            //aktualizacia podla datumu
  220.     int dat;
  221.     scanf("%d", &dat);
  222.     if (p_prv == NULL) {
  223.         printf("Aktualizovalo sa 0 zaznamov\n");
  224.         return;
  225.     }
  226.     int pom, help, poc = 0;
  227.  
  228.     POZICKA *p_akt;                                         //deklaracia smerniku typu pozicka
  229.     p_akt = p_prv;
  230.  
  231.     while (p_akt != NULL) {
  232.         if ((p_akt->datum) <= dat) {
  233.             poc++;
  234.             pom = p_akt->datum;
  235.             help = pom % 10000;
  236.             pom = pom / 10000;
  237.             pom = pom + 1;                                  //pripocitanie jednotky ku roku z datumu
  238.             pom = pom * 10000;
  239.             pom = pom + help;
  240.             p_akt->datum = pom;
  241.  
  242.         }
  243.         p_akt = p_akt->dalsi;                               //prechadzanie na dalsi zaznam
  244.     }
  245.     printf("Aktualizovalo sa %d zaznamov\n", poc);
  246. }
  247.  
  248. int main() {
  249.     int n;
  250.     char volba;
  251.     POZICKA *p_prv = NULL, *p_akt = NULL, *pom;             //deklaracie smernikov typu pozicka
  252.     do {
  253.         volba = getchar();
  254.         switch (volba) {
  255.         case 'n': p_prv = funkcia_n(p_prv, &n); break;      //Volanie funkcii
  256.         case 'v': p_akt = funkcia_v(p_prv); break;                     
  257.         case 'p': funkcia_p(&p_prv, n); break;
  258.         case 'z': funkcia_z(&p_prv); break;
  259.         case 'h': funkcia_h(p_prv); break;
  260.         case 'a': funkcia_a(p_prv); break;
  261.         }
  262.     } while (volba != 'k');
  263.     p_akt = p_prv;                                         
  264.     while (p_akt != NULL) {                                 //uvolnenie zaznamu
  265.         pom = p_akt;
  266.         p_akt = p_akt->dalsi;
  267.         free(pom);
  268.     }
  269.     return 0;
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement