Advertisement
BlueBear

xseman.c

Nov 28th, 2014
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. #define PATH "auta.txt"
  7. #define EVER ;;
  8. #define pravda 1
  9. #define loz 0
  10.  
  11. typedef struct auta
  12. {
  13.     char kategoria[50];
  14.     char spz[8];
  15.     char znacka[50];
  16.     char predajca[100];
  17.     double cena;
  18.     int rok_vyroby;
  19.     char stav_vozidla[200];
  20.     struct auta *next;                      //ukazatel na dalsi prvok
  21. }AUTA;
  22.  
  23. AUTA *secureMalloc()                        //funkcia na alokovanie jedneho prvku
  24. {                                           //struktury
  25.     AUTA *auta;
  26.     auta = (AUTA *)malloc(sizeof(AUTA));
  27.     if (auta == NULL)
  28.     {
  29.         printf("Nepodarilo sa alokovat.\n");
  30.         return;
  31.     }
  32.     return auta;
  33. }
  34.  
  35. void garbageCollector(AUTA *auta)           //samostatna funkcia na vymaz
  36. {                                           //vsetkych zaznamov ulozenych v
  37.      AUTA *a;                               //pamati
  38.      if(auta==NULL)
  39.      {
  40.          return;                            //ak tam neni nic, nerobi nic
  41.      }
  42.      do
  43.      {
  44.          a = auta;
  45.          auta = auta->next;
  46.          free(a);
  47.      }
  48.      while(auta!=NULL);
  49. }
  50.  
  51. char *tolow(char *a )                       //funkcia na prehodenie pismen
  52. {                                           //aby to bolo case insensitive
  53.     int index,dlzka;                        //vo funkcii z
  54.     dlzka=strlen(a);
  55.  
  56.     for (index = 0; index < dlzka; index++)
  57.     {
  58.         a[index] = tolower(a[index]);
  59.     }
  60.     return a;
  61. }
  62.  
  63. void nacitaj(AUTA **auta)
  64. {
  65.     FILE *fp = NULL;
  66.     AUTA *p_akt, *p_new, *p_first;
  67.     int intBuf;
  68.     double doubleBuf;
  69.     char charBuf[200], dolar = '\0';
  70.     char c;
  71.     int zaznamy = 0;
  72.  
  73.     garbageCollector(*auta);                //vymaze vsetky struktury, AK su nejake
  74.  
  75.     if ((fp = fopen(PATH, "r")) == NULL)
  76.     {
  77.         printf("Zaznamy neboli nacitane\n");
  78.         return;
  79.     }
  80.  
  81.     while((c=getc(fp))!= EOF)               //cyklus spocita pocet zaznamov v subore
  82.     {
  83.         ungetc(c,fp);
  84.         if (c=getc(fp)=='*')                //dolarom sa zacne zaznam, cize kolko
  85.         {                                   //dolarov, tolko zaznamov
  86.             zaznamy++;
  87.         }
  88.     }
  89.  
  90.     p_first = secureMalloc();               //alokujeme prvy prvok
  91.     p_akt = p_first;
  92.  
  93.     rewind(fp);
  94.  
  95.     for(intBuf = 0; intBuf < zaznamy; intBuf++)
  96.     {
  97.         if (intBuf>0)
  98.         {
  99.             p_new = secureMalloc();         //alokujeme novy prvok, samozrejme, prvy prvok sa
  100.             p_akt->next = p_new;            //nam alokoval pred forom
  101.             p_akt=p_new;
  102.         }
  103.         fscanf(fp, "%c\n", &dolar);          //toten dolar nacitam
  104.         fgets(p_akt->kategoria, 50, fp);
  105.         fscanf(fp, "%s\n", &p_akt->spz);
  106.         fgets(p_akt->znacka, 50, fp);
  107.         fgets(p_akt->predajca, 50, fp);
  108.         fscanf(fp, "%lf\n", &p_akt->cena);
  109.         fscanf(fp, "%d\n", &p_akt->rok_vyroby);
  110.         fgets(p_akt->stav_vozidla, 200, fp);
  111.     }
  112.  
  113.     p_akt -> next = NULL;                   //nastavenie poslednej struktury na NULL
  114.  
  115.     printf("Nacitalo sa %d zaznamov\n", zaznamy);
  116.  
  117.     if (fclose(fp) == EOF)
  118.     {
  119.         //printf("Subor sa neuzavrel\n");
  120.     }
  121.     *auta = p_first;                        //vratime toten ukazovatel na prvu strukturu, odkial
  122. }                                           //vieme, ze kde sa zoznam zacina
  123.  
  124. void vypis(AUTA *auta)
  125. {
  126.     AUTA *p_akt;                            //no comment, obycajny vypis
  127.     int index = 1;
  128.     p_akt = auta;
  129.  
  130.  
  131.     if (p_akt == NULL)
  132.     {
  133.         return;                             //ak je zoznam prazdny, nic sa nestane
  134.     }
  135.  
  136.     while (p_akt != NULL)                   //postupuje, dokym nenarazi na koniec, cize NULL
  137.     {
  138.         printf("%d.\n",index++);
  139.         printf("kategoria: %s",p_akt->kategoria);
  140.         printf("spz: %s\n",p_akt->spz);
  141.         printf("znacka: %s",p_akt->znacka);
  142.         printf("predajca: %s",p_akt->predajca);
  143.         printf("cena: %.2lf\n",p_akt->cena);
  144.         printf("rok_vyroby: %d\n",p_akt->rok_vyroby);
  145.         printf("stav_vozidla: %s",p_akt->stav_vozidla);
  146.         p_akt = p_akt->next;
  147.     }
  148.     printf("\n");
  149. }
  150.  
  151. AUTA *pridaj(AUTA *auta)
  152. {
  153.     int pos, iter, count = 2;
  154.     AUTA *p_load = NULL, *p_akt, *p_temp;
  155.  
  156.     p_akt = auta;
  157.     p_load = secureMalloc();                //naalokujeme si tu struct ktory nacitam
  158.  
  159.     scanf("%d",&pos);
  160.     getchar();
  161.  
  162.     fgets(p_load->kategoria, 50, stdin);    //stdinom presmerujem vstup
  163.     fgets(p_load->spz, 25, stdin);  
  164.     p_load->spz[7] = '\0';
  165.  
  166.     fgets(p_load->znacka, 50, stdin);       //z konzoly, cize toto je
  167.     fgets(p_load->predajca, 100, stdin);    //ako key obyc gets
  168.     scanf("%lf",&p_load->cena);
  169.     scanf("%d",&p_load->rok_vyroby);
  170.     getchar();                              //getchar kvoli scanfom
  171.     fgets(p_load->stav_vozidla, 200, stdin);//aby to neskakalo cez fgets
  172.  
  173.     p_load->next = NULL;
  174.  
  175.     if (auta == NULL)
  176.     {
  177.         p_load->next = NULL;                //ked neexistoval ziadny prvok, tak sa to ulozi na prve miesto, logicky
  178.         auta = p_load;
  179.     }
  180.     else
  181.     {
  182.         if(pos==1)
  183.         {                                   //pridavanie na prve miesto, ak zoznam uz existuje
  184.             p_load->next=auta;              //auta je prvy clen tak do load
  185.             auta = p_load;                  //nacitame ten prvy
  186.         }                                   //a potom prehodime load ako novy prvy prvok
  187.         else
  188.         {
  189.             while (--pos > 1 && p_akt->next != NULL)
  190.             {
  191.                 p_akt = p_akt->next;        //krokujeme do daneho prvku
  192.             }
  193.             p_temp = p_akt->next;           //vopchatie prvku na dane miesto a nasledne zretazenie
  194.             p_akt->next = p_load;
  195.             p_load->next = p_temp;
  196.         }
  197.     }
  198.  
  199.  
  200.  
  201.     return auta;
  202. }
  203.  
  204. void vyhladaj(AUTA *auta)
  205. {
  206.     char spz[3];
  207.     int cena, jeTam = 0;
  208.     AUTA *p_akt = auta;
  209.     scanf("%d %s", &cena, spz);
  210.    
  211.     while (p_akt != NULL)                   //postupuje, dokym nenarazi na koniec, cize NULL
  212.     {
  213.         if(spz[0] == p_akt->spz[0] && spz[1] == p_akt->spz[1] && cena >= p_akt->cena)
  214.         {
  215.             jeTam = 1;
  216.             printf("kategoria: %s",p_akt->kategoria);
  217.             printf("spz: %s\n",p_akt->spz);
  218.             printf("znacka: %s",p_akt->znacka);
  219.             printf("predajca: %s",p_akt->predajca);
  220.             printf("cena: %.2lf\n",p_akt->cena);
  221.             printf("rok_vyroby: %d\n",p_akt->rok_vyroby);
  222.             printf("stav_vozidla: %s\n",p_akt->stav_vozidla);
  223.         }
  224.         p_akt = p_akt->next;
  225.     }
  226.  
  227.     if(jeTam == 0)
  228.     {
  229.         printf("V ponuke nie su hladane auta\n");
  230.     }
  231.  
  232. }
  233.  
  234. void odstran_prvok(AUTA **zoznam, AUTA *prvok)
  235. {
  236.     AUTA *pom;
  237.  
  238.     if (*zoznam == prvok)
  239.     {
  240.       *zoznam = (*zoznam)->next; // odstranenie prvého
  241.     }
  242.     else
  243.     {
  244.         // nájdenie predchodcu odoberaného prvku
  245.         pom = *zoznam;
  246.         while (pom->next != prvok) pom = pom->next;
  247.  
  248.         // spojenie predchodcu s nasledovníkom odoberaneho prvku
  249.         pom->next = prvok->next;
  250.     }
  251.  
  252.     free(prvok);
  253. }
  254.  
  255. void zmaz(AUTA *auta)
  256. {
  257.     AUTA *p_akt, *p_temp, *p_prev = NULL;
  258.     char string[99];
  259.     int index = 0;
  260.     int zaznamy = 0;
  261.  
  262.     p_akt = auta;
  263.  
  264.     scanf("%s",&string);                    //tutaj je string, ktora nam predstavuje ihlu v kope sena
  265.  
  266.     p_prev = auta;                          //ono toto je sranda, totiz tu cyklujes tak, ze si uchovavas predosly aj aktualny pointer
  267.                                             //cize ak musis mazat daco, tak sa ti vie zretazit spat, na miesto toho co vypadlo
  268.     if(strstr(tolow(p_akt->kategoria), tolow(string)))    //tuto pomocou case sensitive funkcie strstr spravime case
  269.     {                                                       //insensitive funkciu, co nam hlada spendlik v kope hnoja
  270.         p_temp = p_prev->next;
  271.        
  272.         p_prev->next = p_temp->next;
  273.         p_prev = p_akt = p_akt->next;
  274.         free(p_temp);
  275.         zaznamy++;                  //pocet vymazanych zaznamov
  276.        
  277.     }
  278.     while (p_akt != NULL)
  279.     {
  280.        p_prev = p_akt;
  281.        while (p_prev->next != NULL)
  282.        {
  283.            if(strstr(tolow(p_akt->kategoria), tolow(string)))    //tuto pomocou case sensitive funkcie strstr spravime case
  284.            {                                                       //insensitive funkciu, co nam hlada spendlik v kope hnoja
  285.                p_temp = p_prev->next;
  286.                p_prev->next = p_temp->next;
  287.                free(p_temp);
  288.                zaznamy++;                  //pocet vymazanych zaznamov
  289.                if(p_prev->next == NULL)
  290.                {
  291.                    break;
  292.                }
  293.            }
  294.            p_prev = p_prev->next;
  295.        }
  296.        p_akt = p_akt->next;
  297.     }
  298.     printf ("Vymazalo sa %d zaznamov\n", zaznamy);
  299. }
  300.  
  301. void aktualizuj(AUTA *auta)
  302. {
  303.     AUTA *p_akt = auta;
  304.     char spz[3];
  305.     scanf("%s", spz);
  306.     while(p_akt != NULL)
  307.     {
  308.         if(spz[0] == p_akt->spz[0] && spz[1] == p_akt->spz[1])
  309.         {
  310.             fgets(p_akt->kategoria, 50, stdin);    //stdinom presmerujem vstup
  311.             fgets(p_akt->spz, 25, stdin);  
  312.             p_akt->spz[7] = '\0';
  313.  
  314.             fgets(p_akt->znacka, 50, stdin);       //z konzoly, cize toto je
  315.             fgets(p_akt->predajca, 100, stdin);    //ako key obyc gets
  316.             scanf("%lf",&p_akt->cena);
  317.             scanf("%d",&p_akt->rok_vyroby);
  318.             getchar();                              //getchar kvoli scanfom
  319.             fgets(p_akt->stav_vozidla, 200, stdin);//aby to neskakalo cez fgets
  320.             printf("Zaznam sa aktualizoval\n");
  321.             return;
  322.         }
  323.         p_akt = p_akt->next;
  324.     }
  325.     printf("Zaznam sa neaktualizoval\n");
  326. }
  327.  
  328. int main(void)
  329. {
  330.     AUTA *auta = NULL;
  331.  
  332.     for (EVER)
  333.     {
  334.         char c = getchar();
  335.         switch (c)
  336.         {
  337.             case 'c':
  338.                 nacitaj(&auta);
  339.                 break;
  340.             case 'v':
  341.                 vypis(auta);
  342.                 break;
  343.             case 'p':
  344.                 auta = pridaj(auta);
  345.                 break;
  346.             case 'z':
  347.                 zmaz(auta);
  348.                 break;
  349.             case 'a':
  350.                 aktualizuj(auta);
  351.                 break;
  352.             case 'h':
  353.                 vyhladaj(auta);
  354.                 break;
  355.             case 'k':
  356.                 garbageCollector(auta);         //ku koncu, v lepsich rodinach sa slusi po sebe odpad odpratat
  357.                 exit(0);
  358.                 break;
  359.         }
  360.     }
  361.     return 0;
  362. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement