Úvod do programování (Java)

Hodnocení úloh

Podmínkou pro udělení zápočtu je včasné odevzdání 6-ti úloh a jejich obhájení. Obhájení spočívá v předvedení zdrojových kódů a funkčnosti programu cvičícímu. Minimální počet bodů, které je třeba za úlohy získat je 21. Jednotlivé úlohy budou posuzovány podle následujících kritérií:

Způsob odevzdáni

Úlohy budou odevzdány osobně cvičícímu na cvičení v týdnu uvedeném u každé z úloh.

Seznam úloh

  1. Kombinace

    Hodnocení5 bodů
    Termín odevzdání8. - 12. 3. 2004

    Implementujte funkci comb(char input[], int n), která vytiskne všechny n-prvkové kombinace znaků obsažených v poli input. Například, obsahuje-li pole znaky 'a', 'b' a 'c', a má-li n hodnotu 2, objeví se na obrazovce posloupnost
    ab
    ac
    bc
    
    přípustný je i následující výpis
    ab
    ac
    ba
    bc
    ca
    cb
    
    Poznámka: pořadí jednotlivých kombinací není podstatné.
  2. Operátory

    Hodnocení6 bodů
    Termín odevzdání22. - 26. 3. 2004

    Předpokládejte, že potřebujete získávat údaje ze soustavy teplotních čidel. Každé z čidel vrací informace o jednotlivých měřeních ve formě posloupnosti 5-ti bytů. Jednotlivé bity mají následující význam.
     0 -  3 ... číslo čidla
     4 -  4 ... znaménko teploty
     5 - 15 ... teplota (v desetinách °C)
    16 - 32 ... počet sekund po půlnoci
    33 - 38 ... nepoužito
    39 - 39 ... paritní bit
    
    • Vytvořte metodu Measurement toMeasurement(byte[] data), která vytvoří instanci třídy odvozené z třídy Measurement a nainicializuje ji podle údajů daných proměnnou data.
    • byte[] toByteArray(Measurement measurement), která převede instanci třídy Measurement na pole bajtů. Jedná se o inverzní metodu k metodě toMeasurement.
    Abstraktní třída Measurement je definována následujícím způsobem.
    public abstract class Measurement {
       /**
        * Returns logical sensor identifier. The identifier ranges from
        * 0 to 15.
        *
        * @return the identifier.
        */
       public abstract int getSensor();
    
       /**
        * Returns taken temperature. The temperature ragnes from -204.7 °C 
        * to +204.7 °C.
        *
        * @return the temperature.
        */
       public abstract float getTemperature();
    
       /**
        * Returns time of measurement as a number of seconds after midnight.
        * The number ranges from 0 to 86399.
        *
        * @return the time.
        */
       public abstract int getTime();
    
       /**
        * Returns hour of measurement. The hour ranges from 0 to 23.
        *
        * @return the hour.
        */
       public abstract int getHours();
    
       /**
        * Returns minute of measurement. The minute ranges from 0 to 59.
        *
        * @return the minute.
        */
       public abstract int getMinutes();
    
       /**
        * Returns second of measurement. The second ranges from 0 to 59.
        *
        * @return the second.
        */
       public abstract int getSeconds();
    }
    
    Poznámka: modifikace třídy Measurement je nepřípustná.
  3. Klávesnice mobilního telefonu

    Hodnocení6 bodů
    Termín odevzdání5. - 9. 4. 2004

    Navrhněte a implementujte třídu implementující rozhraní DialPad. Toto rozhraní definuje způsob komunikace klávesnice s programem následujícím způsobem.
    public interface DialPad {
       public void pressed(int keyNumber);
       public void timeout();
       public String getMessage();
    }

    Implementace rozhraní DialPad se bude chovat, tak jako klávesnice běžných mobilních telefonů, to znamená, že výpisu některých písmen je dosaženo několikanásobným stiskem téhož tlačítka. Chování tlačítek je cyklické, to znamená, že k+1-násobný stisk tlačítka způsobí výpis 1. písmene určeného pro dané tlačítko. Například, následující posloupnost volání metody pressed() způsobí, že metoda getMessage() vrátí hodnotu java.

       DialPad x = new ...
    
       x.pressed(5);
       x.pressed(2);
       x.pressed(8);
       x.pressed(8);
       x.pressed(8);
       x.pressed(2);
       x.pressed(2);
       x.pressed(2);
       x.pressed(2);
    

    Metoda timeout() indikuje, že uživatel po určitou dobu nezmáčknul žádné tlačítko klávesnice. Tato metoda je nezbytná pro napsání několika po sobě následujících písmen reprezentovaných tímž tlačítkem. Například,

       DialPad x = new ...
    
       x.pressed(3);
       x.timeout();
       x.pressed(3);
       x.pressed(3);
       x.timeout();
       x.pressed(3);
       x.pressed(3);
       x.pressed(3);
       x.pressed(4);
       x.pressed(4);
       x.pressed(4);
       x.pressed(6);
       x.pressed(6);
       x.pressed(3);
       x.pressed(3);
    
    vede k zadání zprávy "define".

    Pro jednoduchost nerozlišujte zadávání velkých a malých písmen, a nezabývejte se ani zadáváním číslic.

    Napište krátký program, který chování Vaší implementace demonstruje.

  4. Bankovní konto
    Hodnocení7 bodů
    Termín odevzdání19. - 23. 4. 2004

    Navrhněte třídu Account implementující funkcionalitu vkládání a výběru peněžních částek na a z bankovního konta. Vkládání a výběr bude implementován pomocí metod deposit() a withdraw().
    • Obě metody musí být schopny vyvolat výjimku InvalidAmountException, je-li hodnota argumentu předaného metodě menší než nula.
    • Metoda withdraw() musí vyvolat výjimku AccountStateTooLowException v případě, že vybíraná částka je větší než aktuální stav konta.
    Soustřeďte se na navržení odpovídající hierarchie tříd výjimek a precizní dokumentaci. Součástí řešení bude i krátký demonstrační program.
  5. Vyhledávání řetězců

    Hodnocení8 bodů
    Termín odevzdání3. - 7. 5. 2004
    Vytvořte jednoduchý program pro vyhledávání slov a podřetězců. Program vyhledá všechny výskyty daného slova nebo podřetězce ve vstupních datech a na výstup vypíše čísla řádků s počet výskytů hledaného řetězce, plus celkový počet výskytů.
       java Grep [-i][-w] string file
    
    kde string je hledaný podřetězec a file soubor obsahující vstupní data. Parametr -i způsobí, že hledání bude probíhat bez ohledu na velká a malá písmena (case insensitive). Parametr -w zajistí vyhledávání celých slov (words). Slovo je řetězec tvořený pouze písmeny a číslicemi, kterému předchází buď začátek řádku nebo znak, který není ani písmenem ani číslicí, a za kterým následuje buď konec řádku nebo znak, který není ani písmenem ani číslicí.

  6. Iterátor

    Hodnocení8 bodů
    Termín odevzdání17. - 21. 5. 2004

    Vytvořte třídu DeepIterator implementující funkcionalitu iterátoru více-rozměrné kolekce, tedy kolekce kolekcí (kolekcí ...). Iterátor bude pomocí své metody next() vracet postupně jednotlivé prvky kolekcí, včetně jednotlivých prvků vnořených kolekcí. Hloubka zanoření kolekcí není omezená.

    Poznámka: kolekcí se rozumí jakýkoliv objekt implementující rozhraní Collection.

    Třída DeepIterator musí implementovat rozhraní java.util.Iterator, přičemž implementace metody remove() není vyžadována.

    Například výsledkem následující kódu

       public class Room {
          private String name;
          
          public Room(String name) {
             this.name = name;
          }
       
          public String toString() {
             return name;
          }
       }
       
       public class Main {
          public static void main(String[] arguments) {
             Collection floor0 = new ArrayList();
             floor0.add(new Room("gym"));
             floor0.add(new Room("sauna"));
    
    
             Collection flat11 = new ArrayList();
             flat11.add(new Room("hall"));
             flat11.add(new Room("kitchen"));
             flat11.add(new Room("living-room"));
             flat11.add(new Room("bathroom"));
             flat11.add(new Room("bedroom"));
             flat11.add(new Room("nursery"));
    
             Collection flat12 = new HashSet();
             flat12.add(new Room("dormitory"));
             flat12.add(new Room("bathroom"));
    
             // Create the first floor.
             Collection floor1 = new ArrayList();
             floor1.add(flat11);
             floor1.add(flat12);
    
    
             Collection flat21 = new LinkedHashSet();
             flat21.add(new Room("hall"));
             flat21.add(new Room("kitchen"));
             flat21.add(new Room("living-room-1"));
             flat21.add(new Room("living-room-2"));
             flat21.add(new Room("bedroom"));
             flat21.add(new Room("bathroom"));
    
             Collection flat22 = new LinkedList();
             flat22.add(new Room("hall"));
             flat22.add(new Room("kitchen"));
             flat22.add(new Room("dormitory"));
             flat22.add(new Room("bathroom"));
    
             Collection flat23 = new ArrayList();
             flat23.add(new Room("hall"));
             flat23.add(new Room("kitchen"));
             flat23.add(new Room("living-room"));
             flat23.add(new Room("bedroom"));
             flat23.add(new Room("bathroom"));
    
    
             // Create the second floor.
             Collection floor2 = new ArrayList();
             floor2.add(flat21);
             floor2.add(flat22);
             floor2.add(flat23);
    
    
             // Create a building.
             Collection building = new ArrayList();
             building.add(floor0);
             building.add(floor1);
             building.add(floor2);
    
             // List rooms.
             Iterator iterator = new DeepIterator(building);
             while(true) {
                Room room = (Room)iterator.next();
                System.out.print(room);
                if (!iterator.hasNext())
                   break;
                System.out.print(", ");
             }
          }
       }
    je sekvence

    gym, sauna, hall, kitchen, living-room, bathroom, bedroom, nursery, dormitory, bathroom, hall, kitchen, living-room-1, living-room-2, bedroom, bathroom, hall, kitchen, dormitory, bathroom, hall, kitchen, living-room, bedroom, bathroom

    Poznámka: pořadí jednotlivých položek není podstatné.

  7. Geometrické objekty

    Hodnocení
    Termín odevzdání

    Vytvořte hierarchii následujících tříd reprezentující grafické obrazce:Point, Line, Rectangle Circle, Polygon. Tyto třídy budou implementovat metody move(int x, int y), rotate(Point point, float angle). Aktuální informace o umístění a další charakteristiky objektů bude možné získat pomocí metody toString().

    Poznámka: nezabývejte se grafickým zobrazováním jednotlivých objektů pomocí GUI.