Zápočtová písemka 28.04.2017

Základní kurs objektově orientovaného programování v C++. Třídy a objekty, zapouzdření, metody, plymorfismus. Abstraktní datové typy, přetěžování. Kontejnery, iterátory, algoritmy. Šablony, generické programování, kompilační polymorfismus. Výjimky. Bezpečné a přenositelné programování, vazby na OS.

Zápočtová písemka 28.04.2017

Příspěvekod Stepo » 28. 4. 2017 19:35

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:
Kód: Vybrat vše
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 :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
Stepo
Matfyz(ák|ačka) level I
 
Příspěvky: 1
Registrován: 14. 9. 2016 16:52
Typ studia: Informatika Bc.

Zpět na NPRG041 Programování v C++

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník