Zápočet 14. 1. 2008

Pokročilé vlastnosti jazyka C++, jejich použití pro objektové programování. Dědičnost, virtuální metody, Dynamická alokace. Šablony, generické programování, kompilační polymorfismus. Výjimky. Objektové knihovny, uživatelské kontejnery a iterátory, návrhové vzory. Nízkoúrovňové implementační techniky a konstrukce.

Zápočet 14. 1. 2008

Příspěvekod Chjoodge » 14. 1. 2008 14:57

Tak dneska takhle: Na vstupu je popsána scéna, kterou máme vykreslit na výstup. Scéna je mřížka ASCII znaků a je tvořena obdélníky (rovnoběžnými s osami), na kterých navíc může být potřeba provést tyto operace:

  • Intersect (r1, r2, r3, ...) - výsledkem jsou ty body, které leží ve všech daných obdélnících

  • Union (r1, r2, r3, ...) - výsledkem je sjednocení

  • Difference (r1, r2, r3, ...) - výsledkem jsou ty body, které leží v právě jednom zadaném obdélníku


Obdélníky jsou zadávány takto: RECTANGLE('%', x, y, šířka, výška, z-výška), kde první argument říká, jakým znakem se má obdélník vyplnit, a ty další jsou celé kladné souřadnice. Z-výška určuje pořadí vykreslování, tzn. co má být vidět, když se dva obdélníky překrývají (mohli jsme si určit sami, jestli má být vidět ten s menší nebo ten s větší).

Operace se zadávají jako jméno operace velkými písmeny a pak ve složených závorkách argumenty. Argument může být buď obdélník, nebo další operace a její argumenty.

První řádek má tvar SCENE('%', šířka scény, výška scény), kde ten znak v prvním argumentu je pozadí.

Takže celý vstup může být třeba takto:

Kód: Vybrat vše
SCENE('.', 15, 10)
{
  RECTANGLE('x', 1, 1, 3, 3, 20)
  RECTANGLE('@', 2, 3, 5, 2, 10)

  INTERSECT{
    RECTANGLE('=', 0, 6, 10, 2, 30)
    RECTANGLE('V', 1, 5, 8, 4, 40)
  }

  DIFFERENCE {
    RECTANGLE(...)
    UNION
    {
       INTERSECT
       {
          RECTANGLE(...)
          RECTANGLE(...)
          DIFFERENCE
          {
            RECTANGLE(...) 
            RECTANGLE(...)
          }
       }
    }
  }
}


...a výstup by pak měl vypadat takhle:

Kód: Vybrat vše

...............
.xxx...........
.xxx...........
.x@@@@@........
..@@@@@........
...............
.========......
.========......
...............
...............


Žádný motivační vstup s hezkým ascii obrázkem jsme nedostali :) Takže co si kdo napsal, to předváděl.

To zanořování operací muselo fungovat logicky úplně správně, takže třeba Difference ( Union ( A, B ), C ) muselo dát body buď (v C a ne v A a ne v B) nebo (ne v C a (v A nebo v B)) a tak podobně.

Scéna se vešla do paměti celá, STL povoleno, vstup jsme původně měli kontrolovat, ale když ani po dvou hodinách nikdo neodevzdal, tak jsme se mohli na korektnost vstupu spolehnout. Celkově se mi to zdálo jako jeden z těžších příkladů a ve spolek lidem nejspíš taky - já jsem odcházel po třech hodinách a jestli jsem nebyl první úspěšný, tak nanejvýš druhý nebo třetí. Tou dobou už pár lidí raději odešlo s nepořízenou, ostatní ještě seděli a chlapík už se poptával, kdo to tak do čtvrt hodiny dodělá. Jak to nakonec dopadlo, nevím.
Uživatelský avatar
Chjoodge
Matfyz(ák|ačka) level I
 
Příspěvky: 11
Registrován: 30. 5. 2007 09:05

Re: Zápočet 14. 1. 2008

Příspěvekod Osiris » 14. 1. 2008 15:11

Já jsem odcházel ve 13:50 a taky jsem to nedal... fungovalo mi všechno včetně ošetřování správného vstupu kromě difference.

Tohle zadání bylo opravdu těžké.
Osiris
Osiris
Supermatfyz(ák|ačka)
 
Příspěvky: 403
Registrován: 11. 11. 2006 14:10
Bydliště: Praha
Typ studia: Informatika Mgr.

Re: Zápočet 14. 1. 2008

Příspěvekod Návštěvník » 18. 1. 2008 18:51

Jaky fce/metody jsou nejvhodnejsi pri nacitani vstupu? napr preparace hodnot z "RECTANGLE('=', 0, 6, 10, 2, 30)". nemam moc praxe s STL, diky.
Návštěvník
 

Re: Zápočet 14. 1. 2008

Příspěvekod Chjoodge » 19. 1. 2008 13:28

Pokud jde o to, jak číst řádky ze souboru, tak se podívej na ifstream a globální funkci getline, a pokud jde o to, jak pak rozkrájet jeden řetězec na konkrétní hodnoty, tak se podívej na string a stringstream.
Uživatelský avatar
Chjoodge
Matfyz(ák|ačka) level I
 
Příspěvky: 11
Registrován: 30. 5. 2007 09:05


Zpět na PRG032 Objektově orientované programování

Kdo je online

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

cron