# Zápočtová písemka 28.04.2017

<{ForumPost(poster="Stepo", timestamp=2017-04-28 20:35:24)}>
Dnešní zápočtová písemka měla jako téma převod INFIX notace na C++ notaci. Zadával David Bednárek.  
  
Zadání bylo následující. Měli jsme vstup v souboru, jehož jméno jsme dostali jako první argument na příkazové řádce. Vstup byl jeden řádek který bylo třeba naparsovat a zpracovat. Znaménka byla binární +, -, *, / a unární negace #. Mezery oddělovaly čísla(resp. písmena) ale taky mohly oddělovat znaménka (bacha test 5). Pan Bednárek psal na tabuli priority operací v té C++ notaci, bylo to myslím I. # II. * / III. + -. Upřímně řečeno jsem o C++ notaci nikdy předtím neslyšel, přesto že nám tam pořád tvrdil, jak to všichni máme znát :D   
  
INPUT BYL NÁSLEDUJÍCÍ:

* 1. --2 3 4                ||  OUT: 2-3-4  
2. -2-3#4                || OUT: 2-(3- -4)  
3. */*/1 2 3 4 5       || OUT: 1/2*3/4*5   
4. +-*/1 2 3 4 5       || OUT: 1/2*3-4+5  
5. / * - +1 2 3 4 5    || OUT: (1+2-3)*4/5  
6. -a-b c                 || OUT: a-(b-c)  
7. *a-b c                 || OUT: a*(b-c)  
8. -a*b c                 || OUT: a-b*c  
9. *#a b                  ||OUT: -a*b  
10. #*a b                || OUT: -(a*b)  
11. -a#b                 || OUT: a- -b  
12. #-a b                || OUT: -(a-b)  
Potom přidal dvě "hrůzy na závěr", co dělaly všem problém  
h1. /*a b c              || OUT: a*b/c  
h2. /a*b c               ||OUT: a/(b*c)

Řešení jsem udělal tak, že jsem si načetl vstup ze souboru a kód měl přibližně takovou strukturu:

    struct polozka{
    std::string typ; // používal jsem OP a VAL
    std::string value; //buď číslo/písmenu nebo znaménko
    }
    int main(int argc, char* argv[]){
    
    std::stack<polozka>zasobnik; <- zde jsem si nacetl soubor z argv[1]
    
    když jsem to měl, tak jsem zahájil převod
    std::stack<polozka> druhy_zasobnik; <- zde jsem si prehazoval veci abych provedl zpracovani infixu
    while (zasobnik.size()!=1){
            while(zasobnik.top().typ!=="OP"){
              polozka p = zasobnik.top();
              zasobnik.pop();
              druhy_zasobnik.push(p)
           }
           
          // tady jsme narazili na operátor binární + - * /, takže top pop top pop proved operaci a vrat na zasobnik jako typ="VAL"  value="A OP B" a prehazej pomocny zpet
          // nebo unarni # kdyz se to provede jenom na jedno ale prehazovani zasobniku je stejne
          // v prubehu bylo potreba zavorkovat a aplikovat pravidla (delal jsem pomoci ifu elsu a podobnych podle pana Bednárka prasáren) 
    }
    std::cout<<zasobnik.top().value<<std::endl;
    return 0;
    }
    

Co se týče řešení, tak zadávající to dokonce vyřešil nějakou rekurzivní funkcí na 150 řádků, ale nikdo to tak prý neměl.  
  
Ta C++ notace byla fakt divná, doteď pořádně nechápu jaká má pravidla a kde se vyskytuje. Přišlo mi to trošku jako taková Bednárkovina - nemyšleno hanlivě, ale v tom smyslu, že to nikdy nikdo neviděl jinde než na C++ku a panu Bednárkovi se to líbí, tak nám to zadal  :D   
  
Při předvádění kódu byl na nás hodný. Prošli skoro všichni (na rozdíl od Loydovy patnáctky pana Čecha [http://siret.ms.mff.cuni.cz/cech/cpp/LoydPuzzle.pdf](http://siret.ms.mff.cuni.cz/cech/cpp/LoydPuzzle.pdf)  :D ). Dokonce nám tam prodlužoval čas o ~30minut, protože to mělo málo lidí; a to i přesto, že tam za ním v půlce testu přišli nějací známí. Ke konci testu jsem si odskočil a oni na něj čekali u labu na židlích :D  
  
Za mě hodnocení spokojenosti testu 10 z 10 :D
<{/ForumPost}>

