Programovanie (2) v Jave
1-INF-166, LS 2017/18

Úvod · Pravidlá · Prednášky · Netbeans · Testovač · Test a skúška
· Vyučujúcich môžete kontaktovať pomocou e-mailovej adresy E-prg.png (bude odpovedať ten z nás, kto má príslušnú otázku na starosti alebo kto má práve čas).
· DÚ10 je zverejnená, odovzdávajte do stredy 16.5. 22:00.
· Bonusový projekt odovzdávajte do pondelka 21.5. 22:00 na testovači. Predvádzanie projektov bude po prvom termíne skúšky v stredu 23.5. (t.j. začneme medzi 11:45 a 12:00 v H6). Ak vtedy nemôžete prísť, kontaktujte vyučujúce, dohodneme iný termín.
· Opravný/náhradný test bude v pondelok 28.5. o 10:00 v F1-108. V prípade záujmu sa prihláste v AISe.
· Na termíny skúšok sa zapisujte v AIS. Termíny: streda 23.5. (riadny), štvrtok 7.6. (riadny alebo 1. opravný), streda 20.6. (1. alebo 2. opravný) plus v prípade potreby ešte jeden termín v poslednom týždni skúškového. Prípadné konflikty nám dajte vedieť čím skôr. Ďalšie informácie na stránke Test a skúška.


Letný semester, test a skúška

Z Programovanie
Prejsť na: navigácia, hľadanie

Na túto stránku budeme postupne pridávať informácie týkajúce sa záverečného písomného testu a praktickej skúšky pri počítači v letnom semestri. Odporúčame tiež si preštudovať pravidlá predmetu.

Termíny, zapisovanie

Termíny skúšok

  • Streda 23.5. 9:00 v H6 (riadny)
  • Štvrtok 7.6. 9:00 v H6 (riadny alebo 1. opravný)
  • Utorok 20.6. 9:00 v H6 (1. alebo 2. opravný)
  • Koncom júna bude ešte 2. opravný termín, dátum upresníme neskôr

Termíny testu

  • Piatok 18.5. o 13:00 v posluchárni B riadny termín
  • Počas skúškového bude opravný termín, dohodneme po teste (nebude v prvom týždni skúškového)

Prípadné konflikty s dátumami písomky alebo skúšok nám dajte vedieť čím skôr

K zapisovaniu na skúšky

  • Na termín skúšky sa zapisujte v systéme AIS.
    • Prihlasovanie/odhlasovanie na skúšku do 14:00 deň pred skúškou.
  • Na skúšku môžete ísť, aj keď ešte nemáte úspešne absolvovaný test (ale kým nespravíte test, nezapíšeme vám známku).
  • Ak na prvom riadnom termíne skúšku nespravíte, môžete použiť druhý riadny termín ako váš prvý opravný atď. Okrem týchto štyroch už však neplánujeme ďalšie termíny a každý sa môže zúčastniť na najviac troch termínoch.
  • Po skúške poobede alebo na ďalší deň budú určené časy na osobné stretnutie, diskusiu k vašim riešeniam, reklamácie bodov, zapisovanie známok do indexov.
    • Ak máte ku skúške akékoľvek otázky (čo som mal zle, ako sa to dalo robiť lepšie atď), príďte na osobné stretnutie.
    • Príďte na stretnutie, aj ak ste skúšku nespravili. Môžeme vám poradiť, čo robiť inak na opravnom termíne.
    • Ak spravíte skúšku v riadnom termíne, stretnutie je nepovinné. Známku do indexu si môžete zapísať aj na inom termíne skúšky alebo poslať index po spolužiakovi (zapisovať známky ale budeme len v určené časy, nie keď zrovna idete okolo...).
    • Prípadné otázky k bodovaniu riešte na osobnom stretnutí po skúške, alebo emailom najneskôr deň po skúške, nie neskôr.
    • Ak ste písali opravný termín, osobné stretnutie je povinné.

Skúška pri počítači

  • Doneste si ťahák 1 list A4, ISIC, index, písacie potreby
  • Príďte pár minút pred začiatkom termínu pred príslušnú učebňu, kde sa dozviete pokyny a rozsadenie do miestností
  • Skúška 2 a 3/4 hodiny práca pri počítačoch.
  • Prostredie ako minulý semester (Linux v učebniach, skúškové konto, nebude internet)
  • Aby ste mali šancu úspešne ukončiť predmet, musíte získať aspoň polovicu bodov.
  • Hodnotíme správnosť myšlienky, správnosť implementácie, v menšej miere štýl
  • Nezáleží na rýchlosti programu, pokiaľ v rozumnom čase zbehne aspoň na malých vstupoch
  • Testovač nebude testovať správnosť, dostatočne si program otestujte sami.

Na skúške pri počítači dostanete k dispozícii program GraphGUI

  • Pozrite si ho vopred pred skúškou
  • Do programu budete pridávať riešenia dvoch úloh
  • Tieto úlohy bude možné riešiť nezávisle na sebe a budú mať rovnakú váhu, nemusia však byť pre vás rovnako ťažké
  • V úlohe A bude treba doprogramovať niečo do grafického prostredia v JavaFX
  • V úlohe B bude treba naprogramovať nejaký grafový algoritmus metódou prehľadávania s návratom
  • Odovzdávate iba súbory Editor.java (úloha A) a GraphAlgorithm.java (úloha B), celé vaše riešenie by teda malo byť v týchto súboroch.
  • Ak kvôli ladeniu meníte iné časti programu, ubezpečte sa, že odovzdané súbory pracujú aj s pôvodnou verziou programu GraphGUI.
  • Ak sa bude verzia GraphGUI na skúške líšiť od tej vopred zverejnenej, zmeny budú popísané v zadaní a nebudú veľmi rozsiahle (napr. pridanie zopár užitočných metód)

Na skúške budete mať prístup aj k dokumentácii k Jave, ktorá je stiahnuteľná tu, resp. prezerateľná tu a tu.

  • Nebude možné v dokumentácii vyhľadávať, naučte sa v nej preto pred skúškou orientovať navigáciou z farebnej tabuľky na úvodnej stránke.
  • Táto dokomentácia tiež neobsahuje tutoriály, len popisy jednotlivých tried a ich metód

Ukážkový príklad, úloha A

Do súboru Editor.java doprogramujte, aby sa po stlačení tlačidla Run Editor otvorilo editovacie okienko, v ktorom je pre každý vrchol jeden ovládací prvok s číslom vrcholu a používateľ môže pre každý vrchol nastaviť, aby sa jeho farba zmenila na zelenú. Ovládacie prvky majú byť umiestnené pod sebou a na spodku bude ovládací prvok Button s nápisom OK, ktorý po stlačení označené vrcholy prefarbí. Ak bude okno zavreté bez stlačenia OK, zmeny sa nevykonajú. Pomôcky:

  • Na zmenu farby použite metódu setColorName("green") rozhrania Vertex.
  • Ako vhodný Layout aplikácie odporúčame GridPane
  • Odporúčané ovládacie prvky sú RadioButton (zaujímavé metódy setSelected, isSelected), pripadne ListView (vhodný SelectionModel je SelectionMode.MULTIPLE a jeho metódy getSelectedIndices() resp. getSelectedItems()).

Ukážkový príklad, úloha B

Do súboru GraphAlgorithm.java naprogramujte hľadanie najmenšej dominujúcej množiny v grafe pomocou prehľadávania s návratom.

  • Dominujúca množina je taká množina vrcholov X, že každý vrchol grafu je buď v X, alebo susedí s nejakým vrcholom v X.
  • Napríklad hrany sú rovné chodby a vrcholy križovatky. Strážnik stojaci vo vrchole má pod kontrolou túto križovatku aj všetky s ňou susedné. Chceme s použitím čo najmenšieho počtu strážnikov mať pod kontrolou všetky vrcholy grafu.
  • Vrcholy patriace do nájdenej dominujúcej množiny prefarbite na zeleno, ostatné vrcholy prefarbite na bielo. Ako výsledok metódy performAlgorithm vráťte počet vrcholov najmenšej dominujúcej množiny prevedený na reťazec bez ďalšieho sprievodného textu.

Písomný test

  • Trvanie 90 minút
  • Dobre si rozvrhnite čas, niektoré úlohy sú ťažšie, iné ľahšie.
  • Aby ste mali šancu úspešne ukončiť predmet, musíte získať aspoň polovicu bodov.
  • Doneste si ISIC, písacie potreby, ťahák 1 list A4
  • Zakázané sú ďalšie materiály, elektronické pomôcky, opisovanie

Na písomnom teste budú príklady na nasledujúce témy:

  • Základné črty jazyka Java
  • Objektovo-orientované programovanie (triedy, konštruktory, dedenie a polymorfizmus, rozhranie, ...)
  • Výnimky
  • Základy generického programovania, základy Collections (ArrayList, LinkedList, HashMap, Iterator)
  • Testovacie vstupy (netreba JUnit, len tvorba vstupov ako takých)
  • Grafy (reprezentácia, prehľadávanie grafu do hĺbky a šírky, topologické triedenie orientovaného grafu, úlohy na prehľadávanie s návratom)
  • Všeobecné programátorské zručnosti, práca s poliami, zoznamami, stromami, rekurzia

Na písomnom teste nebudú príklady na JavaFX

Ukážkové príklady na písomný test

V texte nižšie je niekoľko príkladov, ktoré sa svojim charakterom a obtiažnosťou podobajú na príklady, aké budú na záverečnej písomke. Tieto ukážkové príklady sú prevažne vybrané z cvičení a prednášok, na skutočnej písomke však budú nové, zatiaľ nepoužité príklady.

  • Tu je ukážkový test, ktorý bol tento rok použitý pre pokročilých.
  • Príklad 1: Navrhnite triedu Polynomial, ktorá bude reprezentovať polynómy jednej premennej s celočíselnými koeficientami, ktorá bude mať nasledujúce metódy (napíšte kód celej triedy, vrátane premenných):
    • Konštruktor bez parametrov, ktorý vytvorí nulový polynóm
    • Konštruktor s dvoma celočíselnými parametrami a a i, ktorý vytvorí polynóm ax^{i}
    • Konštruktor, ktorý dostane pole a vytvorí polynóm, ktorého koeficienty budú prvky tohto poľa
    • Metódu getCoefficient(int i), ktorá vráti koeficient pri člene x^{i}.
    • Metódu add(Polynomial p), ktorá vráti nový polynóm, ktorý bude súčtom tohto polynómu a polynómu p.
    • Metódu evaluate(int value), ktorá vráti hodnotu polynómu, keď premenná bude mať hodnotu value.
  • Príklad 2: Naprogramujte generickú triedu Matrix, ktorá reprezentuje obdĺžnikovú maticu prvkov nejakého neznámeho typu E.
    • Napíšte konštruktor, ktorý vytvorí maticu zadaných rozmerov a vyplní ju zadaným prvkom typu E.
    • Napíšte metódu get, ktorá vráti prvok matice nachádzajúci sa na zadanom mieste
    • Napíšte metódu set, ktorá na zadané miesto v matici zapíše zadaný prvok typu E
    • Ak metódam get alebo set užívateľ zadá súradnice mimo matice, hodia výnimku vašej vlastnej triedy MatrixIndexOutOfBoundsException (ktorú tiež naprogramujte)
    • Výnimka tejto triedy by v metóde getMessage mala vrátiť reťazec obsahujúci obidve súradnice, ako aj obidva rozmery matice.
  • Príklad 3: Napíšte generickú statickú metódu kazdyDruhy, ktorá dostane LinkedList a vyhodí z neho každý druhý prvok. K LinkedListu pristupujte iba cez iterátor a jeho metódu remove.
CV22-graf.png
  • Príklad 4: Uvažujme prehľadávanie grafu do hĺbky, ktoré do poľa whenVisited čísluje vrcholy v poradí, v akom boli navštívené. Odsimulujte algoritmus na grafe vpravo a zistite, v akom poradí budú vrcholy navštívené, ak začneme prehľadávať vo vrchole 0. Predpokladajte, že adjVertices vracia susedov v poradí podľa čísla vrcholu.
  • Príklad 5: Odsimulujte prácu prehľadávania do šírky na grafe vyššie, ak začneme prehľadávať vo vrchole 0. Predpokladajte, že adjVertices vracia susedov v poradí podľa čísla vrcholu. Uveďte, v akom poradí boli vrcholy vložené do queue a vypíšte výsledné polia dist a prev.
PROG-C24-graf.png
  • Príklad 6: Nájdite všetky topologické usporiadania orientovaného grafu na obrázku vpravo.
  • Príklad 7: Napíšte funkciu static int countIsolated(Graph g), ktorá v grafe g spočíta počet izolovaných vrcholov, teda takých, ktoré nemajú žiadnych susedov. Graph je interface z prednášok s metódami getNumberOfVertices, getNumberOfEdges, addEdge, existsEdge, adjVertices.
  • Príklad 8: Navrhnite 5 testov pre metódu s hlavičkou a špecifikáciou uvedenou nižšie. Pre každý test uveďte obsah vstupných parametrov a a x, ako aj aký výstup by metóda mala vrátiť a stručne slovne popíšte význam testu. Pokryte obvyklé aj okrajové prípady.
    /** Z pola a vyhodi prvy vyskyt objektu rovneho x
     * pricom rovnost sa testuje metodou equals.
     * Vsetky dalsie prvky posunie o jedno dolava a na koniec
     * pola da null.
     * Vrati true, ak bolo pole modifikovane, inak false.
     * Ak a je null alebo x je null, vyhodi java.lang.NullPointerException
     */
    public static boolean remove(Object[] a, Object x) {
  • Príklad 9: Uveďte, čo vypíše nasledujúci program:
class E0 extends Exception {}

public class Prog {
   static void f(int x) throws E0 {
       try {
           if(x==0)  throw new E0();
           System.out.print('A');
       } catch (E0 e) {
           System.out.print('B');
           throw new E0();
       }
   }

   public static void main(String[] args) {
       for(int x=0; x<=1; x++) {
           try {
               System.out.print(x);
               f(x);
               System.out.print(x);
           } catch (E0 e) {
               System.out.print('C');
           }
      }
   }
}
  • Príklad 10: Uveďte, čo vypíše nasledujúci program:
class A {
  private int x;
  public A() { x = 0; }
  public void print() { System.out.println(x); }
  public void inc() { x++; }
  public void work() { inc(); print(); }
}
class B extends A {
  private int y;
  public B() { super(); y=0; }
  @Override public void inc() { y++; }
  public static void main(String[] args) {
     A a = new B(); a.work(); a.work();
     a = new A(); a.work(); a.work();
  }
}
  • Príklad 11: Uveďte, čo vypíše nasledujúci program:
public class Prog {
    static void vypis(int[][] a) {
        if (a != null) {
            for (int i = 0; i < a.length; i++) {
                for (int j = 0; j < a[i].length; j++) {
                    System.out.print(" " + a[i][j]);
                }
                System.out.println();
            }
        } else {
            System.out.println("null");
        }
    }

    static void vytvorMaticu(int[][] a) {
        if (a == null) {
            a = new int[2][];
        }
        a[0] = new int[2];
        a[1] = a[0];
        a[0][0] = 1;  // (*)
    }

    public static void main(String[] args) {
        int[][] a = new int[2][];
        vytvorMaticu(a);
        int[][] b = null;
        vytvorMaticu(b);
        vypis(a);
        vypis(b);
    }
}