Sanady

Untitled

Jun 5th, 2019
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.01 KB | None | 0 0
  1. //1:
  2. int prefix( const char * test, const char * str) {
  3.    int i, len = strlen(test);
  4.  
  5.    for ( i = 0; i < len; i++ )
  6.    {
  7.        //char toupper(char c)   - vstupom je kopia znaku, vystupom je znak skonvertovany na velke
  8.        //                          (znak c sa teda nemeni)
  9.        //    ked na oba znaky aplikujeme toupper, tak dostaneme case-insensitive porovnanie
  10.        if (toupper(test[i]) != toupper(str[i])
  11.            return 0;            //ak sa niekde lisia, tak uz to nie je prefix (predpona)
  12.    }
  13.    //kedze vnutri je return, mozeme strlen(str) ignorovat:
  14.    //  ak sa dojde na koniec, bude tam '\0', a v test-e bude nieco ine    
  15.    //ak by sa to riesilo inak, musi sa kontrolovat, ci sa neprekroci strlen(str)
  16.  
  17.    //vsade sa zhodli, cize je to predpona
  18.    return 1;
  19. }
  20. //2:
  21. typedef struct {
  22.  char nazov[31];   //30 znakov + ukoncovaci
  23.  int id;
  24.  double cena;
  25. } Tovar;
  26.  
  27. Tovar* najdi_najlacnejsi( Tovar sklad[], int pocet ) {
  28.    int i;
  29.  
  30.    //prvy tovar je potencialne najlacnejsi
  31.    Tovar * lacny = &sklad[0];          
  32.    
  33.    //syntax: * patri k typu: premenna s nazvom lacny ma typ Tovar*,
  34.    //                         uklada sa do nej adresa nejakeho tovaru
  35.    //          AKEHO: pouzijeme & na zistenie adresy prveho prvku pola
  36.  
  37.    for ( i = 1 ; i < pocet ; i++ )
  38.    {
  39.        //ak najdeme nieco lacnejsie:
  40.        if (lacny->cena > sklad[i].cena)
  41.            lacny = &sklad[i];  
  42.  
  43.        //zmenime ulozenu adresu
  44.    }
  45.    
  46.    return lacny;
  47. }
  48. //3:
  49. // keby nebol tovar smernik (vstup by bol Tovar tovar), tak by sme zmenili len lokalnu kopiu
  50. // ak je novy nazov dlhsi ako 30, hrozi pretecenie (prepiseme v pamati, co nemame), v tomto rieseni sa zahodia znaky navyse
  51. void zmen_nazov( Tovar *tovar, const char* novy_nazov) {
  52.    strncpy (tovar->nazov, novy_nazov, 30);
  53.    tovar->nazov[30] = '\0';    //strncpy neda ukoncovaci znak, ak urezal retazec, preto pridame '\0'
  54. }
  55. //4:
  56. Tovar* najdi_text( Tovar sklad[], int pocet, const char* dopyt) {
  57.    int i, j, len;
  58.    
  59.    //pre kazdy tovar na sklade
  60.    for ( i = 0 ; i < pocet ; i++ )
  61.    {
  62.        //priklad: dopyt = "retaz", nazov = "podretazec"
  63.        //hladame v ramci textu "podretazec", "odretazec", "dretazec", "retazec" --- toto zacina "retaz", mame ho
  64.  
  65.        len = strlen(sklad[i].nazov) - strlen(dopyt);   //nema zmysel testovat viac j-cok
  66.  
  67.        for (j = 0 ; j <= len ; j++)                    // <= lebo aj cely retazec nech testuje
  68.        {
  69.            //ak je dopyt prefixom nejakej casti, tak sme to nasli
  70.            if (prefix(dopyt, sklad[i].nazov + j))
  71.                return &sklad[i];                  //vratime adresu, prvy mozny  
  72.  
  73.            // + j   : vyuzivam smernikovu aritmetiku, mohol som dat aj &sklad[i].nazov[j]
  74.            // &sklad[i]   : operator &, pouzivany uz od prvej prednasky bol nejaky nepopularny na skuske
  75.            //               ked neviete napisat &, dalo sa aj: sklad + i
  76.        }
  77.    }
  78.    //nic sa nenaslo:
  79.    return NULL;
  80. }
  81. //5:
  82. void vypis( FILE * f, Tovar sklad[], int pocet, const char* dopyt) {
  83.    //f je vyssie otvoreny subor, cize ziadne fopen/fclose nerobit
  84.  
  85.    Tovar * tovar;
  86.  
  87.    //najdieme prvy tovar cez najdi text:
  88.    tovar = najdi_text(sklad, pocet, dopyt);
  89.    
  90.    while ( tovar != NULL )
  91.    {
  92.        //ak je najdeny nejaky tovar, vypiseme ho
  93.        fprintf( f, "%i, %s, %.2lf\n",
  94.             tovar->id, tovar->nazov, tovar->cena);
  95.  
  96.        //skusime najst dalsi z nich
  97.          // zaciname hned za najdenym tovarom: tovar+1
  98.          // pocet musime tiez zmenit, kolko sa ma este prehladat?
  99.          //                  koniec = sklad + pocet
  100.          // teraz sme na     tovar + 1
  101.          // ma sa prehladat: koniec - (tovar + 1)
  102.          // po uprave, druhy argument
  103.        tovar = najdi_text(tovar+1, sklad + pocet - tovar - 1, dopyt);
  104.    }
  105.    
  106. }
  107. //6:
  108. int nacitaj_subor( char * subor, Tovar sklad[], int max) {
  109.    int pocet;
  110.  
  111.    //subor je zadany menom, cize si musime pripravit smernik na FILE strukturu, subor otvorit
  112.    FILE * f;
  113.  
  114.    f = fopen(subor, "r");
  115.    if (f == NULL)    //ak sa nepodari otvorit, koncime
  116.        return -1;
  117.    
  118.    //citame maximalne max poloziek
  119.    for ( pocet = 0; pocet < max; pocet++ )
  120.    {
  121.        //a ak nieco nevieme precitat skor, tak skoncime skor
  122.        if (!nacitaj(f, &sklad[pocet]))
  123.            break;  
  124.    }
  125.    //caste chyby: ak zlyhala nacitaj, tak sa pokracovalo v nacitavani
  126.    //    ale to vytvaralo "diery" v poli
  127.  
  128.    fclose(f);
  129.    return pocet;    
  130. }
  131. //7:
  132. typedef struct {
  133.     Tovar * tovar;
  134.     int mnozstvo;    //standardny kosik: kolko kusov tovaru (vid dalsia uloha)
  135. }  Objednavka;
  136.  
  137. double suma( Objednavka objednavky[], int pocet) {
  138.    int i;
  139.    double sum;  //cena je double, tak aj suma musi byt
  140.    
  141.    //trivialny cyklus
  142.    for ( i = 0 ; i < pocet ; i++ )
  143.    {
  144.        sum += objednavky[i].tovar->cena * objednavky[i].mnozstvo;
  145.        
  146.        // bodka a sipka sa vzdy tyka toho, co je vlavo
  147.        //  rozhodujeme sa podla typu:
  148.        //  objednavky[i]       ma typ Objednavka, co je struktura, teda je za tym .
  149.        //  objednavky[i].tovar ma typ Tovar*, co je smernik na strukturu, teda je za tym ->
  150.  
  151.  
  152.    }
  153.        
  154.  
  155.    return sum;
  156. }
  157. //8:
  158. Objednavka* pridaj( Objednavka* pole, int *dlzka, Tovar *tovar) {
  159.    int i, len = *dlzka;
  160.    for ( i = 0; i < len; i++ )
  161.    {
  162.        //najprv sa pozrieme, ci uz sme taky tovar objednavali
  163.        if (pole[i].tovar->id == tovar->id) {
  164.  
  165.            //ak ano, len priratame pocet kusov
  166.            pole[i].mnozstvo++;
  167.  
  168.            //tu treba hned skoncit, vsetko je vybavene
  169.            return pole;
  170.        }
  171.    }
  172.  
  173.    //taky tovar sme este nemali, predlzme pole objednavok a pridajme tam 1 kus:
  174.    len++;
  175.    pole = (Objednavka*) realloc(pole, sizeof(Objednavka)*len);
  176.    pole[len-1].tovar = tovar;     //premenna tovar je uz smernik, cize obsahuje adresu, tu len prekopirujeme do objednavky
  177.    pole[len-1].mnozstvo = 1;      //doplnime pocet
  178.  
  179.    //zaktualizujeme dlzku a vratime novu adresu pola objednavok
  180.    *dlzka = len;
  181.    return pole;    
  182. }
Advertisement
Add Comment
Please, Sign In to add comment