BlueBear icon

xseman.c

BlueBear | PRO | 11/28/14 02:40:22 PM UTC | 0 ⭐ | 540 👁️ | Never ⏰ | []
C |

10.34 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
#define PATH "auta.txt"
#define EVER ;;
#define pravda 1
#define loz 0
 
typedef struct auta
{
    char kategoria[50];
    char spz[8];
    char znacka[50];
    char predajca[100];
    double cena;
    int rok_vyroby;
    char stav_vozidla[200];
    struct auta *next;                      //ukazatel na dalsi prvok
}AUTA;
 
AUTA *secureMalloc()                        //funkcia na alokovanie jedneho prvku
{                                           //struktury
    AUTA *auta;
    auta = (AUTA *)malloc(sizeof(AUTA));
    if (auta == NULL)
    {
        printf("Nepodarilo sa alokovat.\n");
        return;
    }
    return auta;
}
 
void garbageCollector(AUTA *auta)           //samostatna funkcia na vymaz
{                                           //vsetkych zaznamov ulozenych v
     AUTA *a;                               //pamati
     if(auta==NULL)
     {
         return;                            //ak tam neni nic, nerobi nic
     }
     do
     {
         a = auta;
         auta = auta->next;
         free(a);
     }
     while(auta!=NULL);
}
 
char *tolow(char *a )                       //funkcia na prehodenie pismen
{                                           //aby to bolo case insensitive
    int index,dlzka;                        //vo funkcii z
    dlzka=strlen(a);
 
    for (index = 0; index < dlzka; index++)
    {
        a[index] = tolower(a[index]);
    }
    return a;
}
 
void nacitaj(AUTA **auta)
{
    FILE *fp = NULL;
    AUTA *p_akt, *p_new, *p_first;
    int intBuf;
    double doubleBuf;
    char charBuf[200], dolar = '\0';
    char c;
    int zaznamy = 0;
 
    garbageCollector(*auta);                //vymaze vsetky struktury, AK su nejake
 
    if ((fp = fopen(PATH, "r")) == NULL)
    {
        printf("Zaznamy neboli nacitane\n");
        return;
    }
 
    while((c=getc(fp))!= EOF)               //cyklus spocita pocet zaznamov v subore
    {
        ungetc(c,fp);
        if (c=getc(fp)=='*')                //dolarom sa zacne zaznam, cize kolko
        {                                   //dolarov, tolko zaznamov
            zaznamy++;
        }
    }
 
    p_first = secureMalloc();               //alokujeme prvy prvok
    p_akt = p_first;
 
    rewind(fp);
 
    for(intBuf = 0; intBuf < zaznamy; intBuf++)
    {
        if (intBuf>0)
        {
            p_new = secureMalloc();         //alokujeme novy prvok, samozrejme, prvy prvok sa
            p_akt->next = p_new;            //nam alokoval pred forom
            p_akt=p_new;
        }
        fscanf(fp, "%c\n", &dolar);          //toten dolar nacitam
        fgets(p_akt->kategoria, 50, fp);
        fscanf(fp, "%s\n", &p_akt->spz);
        fgets(p_akt->znacka, 50, fp);
        fgets(p_akt->predajca, 50, fp);
        fscanf(fp, "%lf\n", &p_akt->cena);
        fscanf(fp, "%d\n", &p_akt->rok_vyroby);
        fgets(p_akt->stav_vozidla, 200, fp);
    }
 
    p_akt -> next = NULL;                   //nastavenie poslednej struktury na NULL
 
    printf("Nacitalo sa %d zaznamov\n", zaznamy);
 
    if (fclose(fp) == EOF)
    {
        //printf("Subor sa neuzavrel\n");
    }
    *auta = p_first;                        //vratime toten ukazovatel na prvu strukturu, odkial
}                                           //vieme, ze kde sa zoznam zacina
 
void vypis(AUTA *auta)
{
    AUTA *p_akt;                            //no comment, obycajny vypis
    int index = 1;
    p_akt = auta;
 
 
    if (p_akt == NULL)
    {
        return;                             //ak je zoznam prazdny, nic sa nestane
    }
 
    while (p_akt != NULL)                   //postupuje, dokym nenarazi na koniec, cize NULL
    {
        printf("%d.\n",index++);
        printf("kategoria: %s",p_akt->kategoria);
        printf("spz: %s\n",p_akt->spz);
        printf("znacka: %s",p_akt->znacka);
        printf("predajca: %s",p_akt->predajca);
        printf("cena: %.2lf\n",p_akt->cena);
        printf("rok_vyroby: %d\n",p_akt->rok_vyroby);
        printf("stav_vozidla: %s",p_akt->stav_vozidla);
        p_akt = p_akt->next;
    }
    printf("\n");
}
 
AUTA *pridaj(AUTA *auta)
{
    int pos, iter, count = 2;
    AUTA *p_load = NULL, *p_akt, *p_temp;
 
    p_akt = auta;
    p_load = secureMalloc();                //naalokujeme si tu struct ktory nacitam
 
    scanf("%d",&pos);
    getchar();
 
    fgets(p_load->kategoria, 50, stdin);    //stdinom presmerujem vstup
    fgets(p_load->spz, 25, stdin);   
    p_load->spz[7] = '\0';
 
    fgets(p_load->znacka, 50, stdin);       //z konzoly, cize toto je
    fgets(p_load->predajca, 100, stdin);    //ako key obyc gets
    scanf("%lf",&p_load->cena);
    scanf("%d",&p_load->rok_vyroby);
    getchar();                              //getchar kvoli scanfom
    fgets(p_load->stav_vozidla, 200, stdin);//aby to neskakalo cez fgets
 
    p_load->next = NULL;
 
    if (auta == NULL)
    {
        p_load->next = NULL;                //ked neexistoval ziadny prvok, tak sa to ulozi na prve miesto, logicky
        auta = p_load;
    }
    else
    {
        if(pos==1)
        {                                   //pridavanie na prve miesto, ak zoznam uz existuje
            p_load->next=auta;              //auta je prvy clen tak do load
            auta = p_load;                  //nacitame ten prvy
        }                                   //a potom prehodime load ako novy prvy prvok
        else
        {
            while (--pos > 1 && p_akt->next != NULL)
            {
                p_akt = p_akt->next;        //krokujeme do daneho prvku
            }
            p_temp = p_akt->next;           //vopchatie prvku na dane miesto a nasledne zretazenie
            p_akt->next = p_load;
            p_load->next = p_temp;
        }
    }
 
 
 
    return auta;
}
 
void vyhladaj(AUTA *auta)
{
    char spz[3];
    int cena, jeTam = 0;
    AUTA *p_akt = auta;
    scanf("%d %s", &cena, spz);
    
    while (p_akt != NULL)                   //postupuje, dokym nenarazi na koniec, cize NULL
    {
        if(spz[0] == p_akt->spz[0] && spz[1] == p_akt->spz[1] && cena >= p_akt->cena)
        {
            jeTam = 1;
            printf("kategoria: %s",p_akt->kategoria);
            printf("spz: %s\n",p_akt->spz);
            printf("znacka: %s",p_akt->znacka);
            printf("predajca: %s",p_akt->predajca);
            printf("cena: %.2lf\n",p_akt->cena);
            printf("rok_vyroby: %d\n",p_akt->rok_vyroby);
            printf("stav_vozidla: %s\n",p_akt->stav_vozidla);
        }
        p_akt = p_akt->next;
    }
 
    if(jeTam == 0)
    {
        printf("V ponuke nie su hladane auta\n");
    }
 
}
 
void odstran_prvok(AUTA **zoznam, AUTA *prvok)
{
    AUTA *pom;
 
    if (*zoznam == prvok)
    {
      *zoznam = (*zoznam)->next; // odstranenie prvého
    }
    else
    {
        // nájdenie predchodcu odoberaného prvku
        pom = *zoznam;
        while (pom->next != prvok) pom = pom->next;
 
        // spojenie predchodcu s nasledovníkom odoberaneho prvku
        pom->next = prvok->next;
    }
 
    free(prvok);
}
 
void zmaz(AUTA *auta)
{
    AUTA *p_akt, *p_temp, *p_prev = NULL;
    char string[99];
    int index = 0;
    int zaznamy = 0;
 
    p_akt = auta;
 
    scanf("%s",&string);                    //tutaj je string, ktora nam predstavuje ihlu v kope sena
 
    p_prev = auta;                          //ono toto je sranda, totiz tu cyklujes tak, ze si uchovavas predosly aj aktualny pointer
                                            //cize ak musis mazat daco, tak sa ti vie zretazit spat, na miesto toho co vypadlo
    if(strstr(tolow(p_akt->kategoria), tolow(string)))    //tuto pomocou case sensitive funkcie strstr spravime case
    {                                                       //insensitive funkciu, co nam hlada spendlik v kope hnoja
        p_temp = p_prev->next;
        
        p_prev->next = p_temp->next;
        p_prev = p_akt = p_akt->next;
        free(p_temp);
        zaznamy++;                  //pocet vymazanych zaznamov
        
    }
    while (p_akt != NULL)
    {
       p_prev = p_akt;
       while (p_prev->next != NULL)
       {
           if(strstr(tolow(p_akt->kategoria), tolow(string)))    //tuto pomocou case sensitive funkcie strstr spravime case
           {                                                       //insensitive funkciu, co nam hlada spendlik v kope hnoja
               p_temp = p_prev->next;
               p_prev->next = p_temp->next;
               free(p_temp);
               zaznamy++;                  //pocet vymazanych zaznamov
               if(p_prev->next == NULL)
               {
                   break;
               }
           }
           p_prev = p_prev->next;
       }
       p_akt = p_akt->next;
    }
    printf ("Vymazalo sa %d zaznamov\n", zaznamy);
}
 
void aktualizuj(AUTA *auta)
{
    AUTA *p_akt = auta;
    char spz[3];
    scanf("%s", spz);
    while(p_akt != NULL)
    {
        if(spz[0] == p_akt->spz[0] && spz[1] == p_akt->spz[1])
        {
            fgets(p_akt->kategoria, 50, stdin);    //stdinom presmerujem vstup
            fgets(p_akt->spz, 25, stdin);   
            p_akt->spz[7] = '\0';
 
            fgets(p_akt->znacka, 50, stdin);       //z konzoly, cize toto je
            fgets(p_akt->predajca, 100, stdin);    //ako key obyc gets
            scanf("%lf",&p_akt->cena);
            scanf("%d",&p_akt->rok_vyroby);
            getchar();                              //getchar kvoli scanfom
            fgets(p_akt->stav_vozidla, 200, stdin);//aby to neskakalo cez fgets
            printf("Zaznam sa aktualizoval\n");
            return;
        }
        p_akt = p_akt->next;
    }
    printf("Zaznam sa neaktualizoval\n");
}
 
int main(void)
{
    AUTA *auta = NULL;
 
    for (EVER)
    {
        char c = getchar();
        switch (c)
        {
            case 'c':
                nacitaj(&auta);
                break;
            case 'v':
                vypis(auta);
                break;
            case 'p':
                auta = pridaj(auta);
                break;
            case 'z':
                zmaz(auta);
                break;
            case 'a':
                aktualizuj(auta);
                break;
            case 'h':
                vyhladaj(auta);
                break;
            case 'k':
                garbageCollector(auta);         //ku koncu, v lepsich rodinach sa slusi po sebe odpad odpratat
                exit(0);
                break;
        }
    }
    return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  • Syutrsz icon
    03/31/26 10:19:00 PM UTC
    text |

    0 B

    |

    0 👍

    /

    0 👎

    Best t33n active cpx link daily updates!
     Copy and paste the link in a new browser tab and then hit enter!
     https://crazyporn.@xxx/members/157354/?asgtbndr=1&play=true&spon=adworld&zone=400
     Remove the @ 
  • Zyubi icon
    04/05/26 02:26:40 AM UTC
    text |

    0 B

    |

    0 👍

    /

    0 👎

    Best t33n active cpx link daily updates!
     Copy and paste the link in a new browser tab and then hit enter!
     https://crazyporn.xxx/members/157354/?asgtbndr=1&play=true&spon=adworld&zone=400