środa, 4 czerwca 2014

Tydzień 15: egzamin & strumienie

Ćwiczenia

Egzamin z PO  (egzamin z roku 2009/2010).

Laboratorium

  1. Napisz program, który wypisuje na ekran zawartosc pliku tekstowego. Nazwę pliku do wypisania wczytaj ze standardowego wejścia za pomocą odpowiednich strumieni.
  2. Napisz program, który dla podanego pliku wypisze, z ilu bajtów składa się ten plik.
  3. Napisz program, który dla danego pliku tekstowego wypisze liczbę znaków oraz liczbę białych znaków w tym pliku.
  4. (a) Napisz program, który kopiuje znak po znaku pliki tekstowe.
    (b) Zmień program z poprzedniego punktu tak, aby czas kopiowania był mierzony i wypisywany na konsole. Sprawdź, jaki wpływ na efektywność ma użycie buforowania.
  5. Napisz program, który odwróci zawartość pliku tekstowego w nastepujący sposób:
    (a) Odwróci kolejność wierszy.
    (b) W każdym wierszu odwróci kolejność słów.
    (c) W nazwie pliku odwróci kolejność liter, pomijając ewentualne rozszerzenie .txt.
  6. Napisz Iterator<String>, w którym metoda next() zwraca kolejne linie wczytane z Readera. Konstruktor ma dostawać obiekt Readera. Po wczytaniu wszystkiego Reader ma zostać zamknięty. Zauważ, że Iterator nie może rzucać wyjątków IOException. Niech przechwyci taki wyjątek i pozwoli normalnie iterować po wszystkich poprawnie wczytanych liniach.
    Wskazówka: BufferedReader ma metodę readLine(); zwraca ona null, gdy napotka koniec pliku.
    Wskazówka 2: aby hasNext() działał poprawnie, trzeba zawsze mieć wczytana i spamiętaną jedną linie w przód.
Nie ma pracy domowej. Jeśli ktoś chce, to może do poniedziałku przysłać zadanie 4 lub zadanie 6.

środa, 28 maja 2014

Tydzień 14: egzamin, drugie zadanie zaliczeniowe

Ćwiczenia

Platforma eTam (egzamin z roku 2012/2013).

Laboratorium

    Wskazówki do drugiego zadania zaliczeniowego

    1.  Przykład, jak można parsować XML: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/
    2. Ćwiczenie: skopiować i uruchomić powyższy przykład. Następnie zmodyfikować go tak, by był bardziej obiektowy. Napisz interfejs ObsłużDane i 5 klas implementujących (4 odpowiadają rodzajom danych, jedna odpowiada czemuś co nie jest daną - w przykładzie to np. Staff). W obsłudze startElement ustawia się w switchu odpowiedni obiekt, w characters wywołuje metodę tego interfejsu, która stosownie wypisuje dane. Metoda endElement może (nie musi) ustawiać obsługę na obiekt nieobsługujący danych.
    3. Zmodyfikuj przykład, aby parsował plik ze zrzutem danych z wikipedii. (Plik jest podlinkowany w treści zadania zaliczeniowego.) Dla każdej strony w zrzucie (znacznik page) chcemy wypisać jej tytuł (znacznik title) i treść (znacznik text).

    wtorek, 20 maja 2014

    Oferta pracy

    e-point SA, firma, w której pracuję, szuka osoby do pomocy w promowaniu Vertabelo, naszego narzędzia do modelowania baz danych.

    Co trzeba robić: Zadaniem zatrudnionej osoby będzie wyszukiwanie blogów związanych z bazami danych i nawiązywanie kontaktów z autorami tych blogów, wyszukiwanie forów i społeczności związanych z bazami danych i promowanie Vertabelo w tych społecznościach, tworzenie prostych artykułów technicznych na naszym blogu, itp.  
    W skrócie: pracujesz przeglądając internet i siedząc na Facebooku ;-)
     
    Co trzeba umieć: Trzeba znać język SQL, diagramy ERD, dobrze pisać po angielsku i umieć używać Google'a, Facebooka, Twittera, itp.

    Teoretycznie SQL i ERD to zagadnienia omawiane na zajęciach z baz danych na drugim roku, ale podstawy są do opanowania w kilka tygodni.

    Więcej szczegółów w ogłoszeniu

    W razie pytań można do mnie napisać.


    wtorek, 13 maja 2014

    Tydzień 13: kolekcje cd.


    Ćwiczenia

    Na ćwiczenia proszę rozproszyć się po innych grupach. Ćwiczenia z PO o godzinie 12:
    • sala 3130, Kazimierz Grygiel
    • sala 3140, Jacek Sroka 
    • sala 3150, Marcin Dziubiński
    • sala 3160, Krzysztof Szafran
    • sala 3220, Tomasz Kazana

    Laboratorium

    1. Anagramy to słowa, które składają się z tych samych liter, ale w różnej kolejności. Napisz program, który dla danej listy słów wypisze wszystkie grupy anagramów pojawiające się na tej liście.
    2. Napisz własną implementację listy wraz z iteratorem. Twoja lista powinna mieć nastepujące operacje:
      • dodawanie nowego elementu,
      • rozmiar,
      • test niepustości,
      • iterowanie przy pomocy pętli foreach.
      Wskazówki:
      • Pętlą foreach można iterować po obiektach implementujących interfejs Iterable.
      • Do implementacji iteratora trzeba użyć klas wewnętrznych (ang. inner classes). Klasa wewnętrzna ma dostęp do prywatnych składowych otaczającego obiektu.
      • Warto przeczytać rozdział o klasach wewnętrznych z tutorialu na stronie Oracle.
      • Ściągawkę, jak napisać własny iterator można znaleźć w klasie java.util.AbstractList. W Eclipse trzeba mieć podpięte źródła Javy.  
    3. Dlaczego metody equals() i hashCode() są ważne: uruchom programy Zagadka.java, Zagadka2.java. Wyjaśnij, dlaczego programy tak się zachowują. Co trzeba zmienić, żeby programy zachowywały się zgodnie z oczekiwaniami autora?

    Praca domowa nr 10

    Do wyboru: zadanie 1 lub zadanie 2. Zadanie 1 jest dość standardowe. Zadanie 2 jest odrobinę ciekawsze, bo pokazuje wykorzystanie bardziej zaawansowanych konstrukcji Javy takich, jak pętla foreach i klasy wewnętrzne.

    Termin oddania: 28 maja 2014 r. Za tydzień nie ma zajęć w powodu Wykładów o wykładach.

    środa, 7 maja 2014

    Tydzień 12: kolekcje

    Ćwiczenia

    Zaimplementuj prostą książkę telefoniczną w telefonie komórkowym. Książka powinna zawierać następujące operacje:
    • wyszukiwanie numeru telefonu podanej osoby,
    • zwracanie uporządkowanej alfabetycznie listy osób, których numery telefonu mamy,
    • rozpoznawanie numeru telefonu (identyfikacja, kto do nas dzwoni),
    • dodawanie osoby razem z numerem telefonu,
    • usuwanie osoby.
    Dla uproszczenia można założyć, że każda osoba ma tylko jeden numer telefonu.

    Laboratorium

    1. Napisz program, który dla danego pliku tekstowego wypisze nastepujące informacje:
      • z ilu słów składa się plik,
      • słowo na pozycji 45,
      • z ilu różnych słów składa się plik,
      • wszystkie słowa pliku w kolejności alfabetycznej (każde słowo na liście pojawia się tylko raz),
      • dla każdego słowa, ile razy to słowo występuje w pliku,
      • wszystkie słowa, które mają więcej niż 6 liter, w kolejności alfabetycznej, bez powtórzeń.
      Do rozwiązania zadania należy uzyć odpowiednich kolekcji.
    2. Anagramy to słowa, które składają się z tych samych liter, ale w różnej kolejności. Napisz program, który dla danej listy słów wypisze wszystkie grupy anagramów pojawiające się na tej liście.

    Praca domowa nr 9

    Zadanie nr 1. Termin oddania:  14 maja 2014 r.

    środa, 30 kwietnia 2014

    Tydzień 11: typy uogólnione

    Ćwiczenia

    1. Zaimplementuj stos parametryzowany typem elementów przechowywanych na stosie.
    2. Napisz własne drzewo BST, parametryzowane typem elementów przechowywanych w drzewie. Porządek powinien być zadany jako java.util.Comparator lub java.util.Comparable.
    3. Napisz procedurę sortującą tablicę dowolnego typu. Porządek definiujemy jak w zadaniu 2.

    Laboratorium

    1. Zaimplementuj własną reprezentację drzewa (może być binarne), które w każdym węźle przechowuje obiekty tego samego typu. Twoje drzewo powinno udostępniać następujące operacje:
      • tworzenie pustego drzewa,
      • dodawanie elementu w określonym miejscu drzewa,
      • wypisanie wszystkich elementów drzewa,
      • wyliczenie rozmiaru drzewa,
      • wyliczenie wysokości drzewa,
      • sprawdzenie, czy drzewo zawiera wskazany element.
    2. Zaimplementuj drzewo BST przechowujące wartości tego samego typu. Algorytm porównujący może być dostarczany w postaci (do wyboru) Comparatora lub interfejsu Comparable. Twoje drzewo powinno udostępniać nastepujące operacje:
      • tworzenie pustego drzewa,
      • dodawanie elementu do drzewa,
      • sprawdzenie, czy drzewo zawiera wskazany element,
      • wypisanie wszystkich elementów drzewa w kolejności rosnącej.

    Praca domowa nr 8

    Zadanie nr 2 (drzewo BST). Termin oddania:  7 maja 2014 r.

    Polecane linki

    Generics in the Java Programming Language - tutorial
    Java Generics FAQ 

    wtorek, 22 kwietnia 2014

    Tydzień 10: wyjątki, JUnit

    W moodle'u jest dostępna treść pierwszego dużego zadania zaliczeniowego. Termin oddania: 30 kwietnia 2014 r.

    Ćwiczenia

    URI (ang. Uniform Resource Identifier) jest standardem internetowym umożliwiającym łatwą identyfikację zasobów w sieci. Poniżej fragment odpowiedniego dokumentu RFC, który określa jak wygląda URI.
    /**
    * An example URI and its component parts. [rfc3986]
    *
    * foo://example.com:8042/over/there?name=ferret#nose
    * \_/ \______________/\_________/ \_________/ \__/
    * | | | | |
    * scheme authority path query fragment
    *
    * The pattern is
    * <scheme> : <authority> / <path> ? <query> # <fragment>
    */ 
    
    oraz szkielet walidatora sprawdzającego poprawność URI.
    public class CustomURIValidator {
    String scheme, authority, path, query, fragment;
    public void validate(String uri) throws ... {
    ...
    validateScheme();
    validateAuthority();
    validatePath();
    }
    /** 
      * @return true if c is either ALPHA, DIGIT, ’-’, ’.’, ’_’ 
      * or ’~’ 
     **/
    public static boolean isUnreservedCharacter(char c) { ... }
    
    private void validateAuthority() throws EmptyComponentException,
       ComponentTooLongException {
       if (authority == null || authority.length() < 1)
            throw new EmptyComponentException("authority");
       if (authority.length() > 255)
            throw new ComponentTooLongException("authority",255);
    }
    
    private void validatePath() throws ComponentTooLongException,    
        IllegalCharacterException {
        //leave blank
    }
    
    private void validateScheme() throws ... { ... }
    }
    
    1. Uzupełnij metodę validate o kod dzielący URI na składowe i przypisujący składowe do odpowiednich pól walidatora.
    2. Uzupełnij metodę validateScheme() tak, aby spełnione były następujące wymagania:
      • schemat musi być niepusty.
      • schemat nie może być dłuższy niż 255 znaków.
      • schemat może zawierać jedynie litery, cyfry, myślnik, kropkę, znak podkreślenia lub tyldę (tzw. unreserved characters).
      Jeśli któreś z powyższych wymagań nie jest spełnione, powinien być rzucony odpowiedni wyjątek.
    3. public class IllegalCharacterException extends Exception {
          public IllegalCharacterException(String msg) {
              super(msg); 
          }
      }
      public class EmptyComponentException extends Exception {
          public EmptyComponentException(String msg) { 
              super(msg); 
          }
      }
      public class ComponentTooLongException extends Exception {
          public ComponentTooLongException(String component, int expected) {
               super("The " + component + " component can not be longer than"
                     + expected);
          }
      }
      
    4. Dodajmy nowy wyjątek InvalidCustomURIException:
      public class InvalidCustomURIException extends Exception {/*...*/}
      public class IllegalCharacterException 
             extends InvalidCustomURIException {/*...*/}
      public class EmptyComponentException 
             extends InvalidCustomURIException {/*...*/}
      public class ComponentTooLongException 
             extends InvalidCustomURIException {/*...*/}
      
      Zmień kod metody validate w ten sposób, aby rzucany był jeden wyjątek InvalidCustomURIException zawierający w sobie informacje o wszystkich błędach ze wszystkich składowych. Możesz zmienić kod wyjątków.

    Laboratorium

    1. Zaprojektuj interfejs Stos reprezentujący stos liczb całkowitych.
    2. Zaimplementuj interfejs Stos za pomocą tablicy liczb całkowitych. Rozmiar tablicy ma być podany w konstruktorze. Twoja implementacja powinna rzucać odpowiedni wyjątki (trzeba je zdefiniować) przy próbie zdjęcia elementu z pustego stosu i położenia elementu na przepełniony stos.
    3. Napisz klasę z testami JUnit dla Twojego stosu (albo dla implementacji kolegi z ławki obok).
    4. Napisz program, który wczytuje wyrażenie w odwrotnej notacji polskiej (+, −, *, /) i wylicza jego wartość używając stosu z poprzedniego zadania.
    W tym tygodniu z powodu pierwszego zadania zaliczeniowego nie ma pracy domowej. Ale za tydzień będzie :)