Aktuálne rozcvičky (2009/2010)

Rozcvičky z Programovania 3, ZS (2008/2009)

Rozcvička 16.12.2008:

Majme nasledovný interface, ktory reprezentuje konecnu grupu:
interface Grupa {
	public ArrayList<Object> vsetkyPrvky(); //vrati zoznam vsetkych prvkov v grupe
	public Object f(Object a, Object b); //grupova operacia na prvkoch a, b
}
Vasou ulohou je dokoncit nasledovnu abstraktnu triedu (dopisat metodu jeCyklicka()) implementujucu interface Grupa:
abstract class AbstraktnaGrupa implements Grupa {
	abstract public ArrayList<Object> vsetkyPrvky(); //vrati zoznam vsetkych prvkov v grupe
	abstract public  Object f(Object a, Object b); //grupova operacia na prvkoch a, b
	
	public static boolean jeCyklicka(Grupa g) {
		//todo
		//vrati true prave vtedy ked je grupa g cyklicka
	}
}
Dalej vytvorte triedu GrupaZ_7, ktora je potomkom triedy AbstraktnaGrupa a implementuje grupu (Z_7,+), t.j. grupu celych cisel s operaciou scitania modulo 7.

Rozcvička 9.12.2008:

Vasou ulohou je upravit nasledujuci kus kodu takto:
  1. Prerobte triedu MojaMnozina tak, aby sa dala pouzit nielen pre typ Integer, ale pre lubovolny typ T, ktory implementuje interface Comparable (<T extends Comparable<T>>). (4 body)
  2. Vytvorte zmysluplny interface Mnozina<T extends Comparable<T>> obsahujuci vsetky metody z triedy MojaMnozina. Upravte triedu MojaMnozina tak, aby implementovala tento interface. (1 bod)
  3. Dorobte metody contains(), union(), intersection() a equals(). (1+1+1+2 body, metoda equals bude bodovana 2 bodmi za optimalnu zlozitost a max 1 bodom za horsiu ako optimalnu zlozitost)
Vysledok vasej prace odovzdajte v subore Rozcvicka.java.

Hodnoty v mnozine porovnavajte podla toho, co vrati metoda equals() resp. compareTo(), nie na zaklade porovnavania referencii.

import java.util.*;

class MojaMnozina {

    ArrayList<Integer> list;

    public MojaMnozina() {
        list = new ArrayList<Integer>();
    }

    public void add(Integer e) {
    	if (!contains(e)) 
    		list.add(e);
    }

    public int count() {
        return list.size();
    }

    public boolean contains(Integer e) {
        // todo
        // vrati true, ak sa e nachadza v mnozine, inak false
    }
    
    public static MojaMnozina union(MojaMnozina r, MojaMnozina s) {
        // todo
        // vrati mnozinu, ktora vznikne zjednotenim mnozin r a s (bez opakujucich sa prvkov)
    }
    
    public static MojaMnozina intersection(MojaMnozina r, MojaMnozina s) {
        // todo
        // vrati mnozinu, ktora vznikne ako prienik mnozin r a s (bez opakujucich sa prvkov)
    }
    
    public boolean equals(MojaMnozina m) {
    	//todo
    	//vrati true, ak mnozina m obsahuje presne tie prvky ako mnozina na ktorej je tato metoda volana
    }

}



Rozcvička 2.12.2008:

Ucitelka dejepisu si povedala, ze si ulahci koncorocne hodnotenie. Vsetkym ziakom chce dat rovnaku znamku, a tuto znamku zisti takto: predstavi si, ze vsetky znamky vsetkych ziakov su usporiadane podla velkosti do jednej postupnosti, a vezme prostrednu znamku. V pripade, ze pocet znamok je parny, jednu nahodnu znamku najprv skrtne. Vasou ulohou je napisat program, ktory pomoze ucitelke zistit, akou znamkou hodnotit ziakov.

Vytvorte v subore Rozcvicka.java triedu Rozcvicka s metodou

    public static int hodnotenie(int[][] znamky).
Tato metoda dostane ako argument dvojrozmerne pole celych cisel; znamky[i][j] je j-ta znamka i-teho ziaka. Pouzite znamky su cele cisla od 1 do 5, mozete predpokladat, ze vstup je korektny a ze ucitelka udelila dokopy aspon jednu znamku (je mozne, ze niektory ziak nedostal ziadnu znamku)

Navratovou hodnotou metody hodnotenie() je median (prostredna hodnota) postupnosti vsetkych znamok.


Spravne riesenia budu ohodnotene podla casovej zlozitosti pouziteho algoritmu:

Riesenia nesplnajuce poziadavky zadania (chybny nazov triedy, neda sa skompilovat bez chyb atd.) dostanu nanajvys 5 bodov.


Testovacia funkcia (bez zaruky):

public static void main(String[] args) {
    znamky = {  {1,2,3,1,4},
                {2,2,4},
                {5,2,3,2}};
    System.out.println(hodnotenie(znamky));
    // spravna odpoved je 2 bez ohladu na to, co ucitelka skrtla
}


Rozcvička 25.11.2008:

Vytvorte v subore Rozcvicka.java triedu Rozcvicka s metodou

    public static ArrayList<String> grepFile(String fileName, String word).
Tato metoda zo suboru s nazvom fileName vyberie tie riadky, ktore obsahuju slovo zadane parametrom word a ulozi ich do zoznamu reprezentovaneho ArrayListom v tom poradi, v akom sa nachadzaju vo vstupnom subore.

Spravne riesenia budu ohodnotene podla casovej zlozitosti pouziteho algoritmu:

Riesenia, ktore sa nedaju skompilovat, budu ocenene 0 bodmi.


Rozcvička 18.11.2008:

Vo vstupnom subore je telefonny zoznam (cislo meno) utriedeny podla telefonneho cisla. Vasou ulohou je ho lexikograficky utriedit podla mena a vypisat do vystupneho suboru. Pre tento ucel vytvorte triedu Rozcvicka so statickou metodou utriedZoznam(String inputFileName, String outputFileName), ktora usporiada data vo vstupnom subore a vypise ich do vystupneho suboru.

Formát vstupného súboru: Súbor obsahuje niekoľko riadkov tvaru:
cislo meno priezvisko
pricom cislo, meno a priezvisko su bez medzier.

Formát výstupného súboru: rovnaký, ako formát vstupného súboru, ale riadky sú utridené podľa priezviska a mena (v tomto poradí).


Rozcvička 11.11.2008:

Uloha: Zistite, ci je dany graf bipartitny.
(Graf je bipartitny, ak sa jeho vrcholy daju rozdelit na dve mnoziny tak, ze kazde dva susedne vrcholy patria do roznych mnozin, cize medzi vrcholmi z jednej mnoziny nemame hrany. Pod grafom myslime neorientovany graf bez nasobnych hran a sluciek.)

Vytvorte triedu Rozcvicka, ktora ma metodu static boolean isBipartite(int[][] susedia). Parameter susedia reprezentuje dany graf: jeho vrcholy su ocislovane od 0 po N-1 a susedia[i] je zoznam susedov vrchola s cislom i.

Svoju metodu mozete vyskusat napriklad takto:

public static void main(String[] args) {
	int[][] susedia = {
		{1, 7},
		{0, 5},
		{3, 4},
		{2, 5},
		{2, 6},
		{1, 3},
		{4, 7},
		{0, 6}};
	System.out.println(Rozcvicka.isBipartite(susedia)); // spravna odpoved je true
}

(1) M-217: Riesenie rozcvicky (subor Rozcvicka.java) posielajte emailom na adresu lenkatroj (zavinac) gmail.com, predmet spravy nech je Programovanie3 - rozcvicka.
(2) M-218: Riesenie rozcvicky (subor Rozcvicka.java) posielajte emailom na adresu rjasko (zavinac) dcs.fmph.uniba.sk, predmet spravy nech je Programovanie3 - rozcvicka.


Rozcvička 10.11.2008 (zastupovanie):

Uloha: Zistite, ci je dany graf eulerovsky.
(Graf je eulerovsky, ak v nom existuje uzavrety tah prechadzajuci kazdou hranou prave raz. Pod grafom myslime neorientovany graf bez nasobnych hran a sluciek.)

Vytvorte triedu Rozcvicka, ktora ma metodu static boolean isEulerian(int[][] susedia). Parameter susedia reprezentuje dany graf: jeho vrcholy su ocislovane od 0 po N-1 a susedia[i] je zoznam susedov vrchola s cislom i.

Svoju metodu mozete vyskusat napriklad takto:

public static void main(String[] args) {
	int[][] susedia = {
		{1, 7},
		{0, 5},
		{3, 4},
		{2, 5},
		{2, 6},
		{1, 3},
		{4, 7},
		{0, 6}};
	System.out.println(Rozcvicka.isEulerian(susedia)); // spravna odpoved je true
}

Riesenie rozcvicky (subor Rozcvicka.java) posielajte emailom na adresu rjasko (zavinac) dcs.fmph.uniba.sk, predmet spravy nech je Programovanie3 - rozcvicka.


Rozcvička 4.11.2008:

Vytvorte verejnu triedu Rozcvicka s metodou utriedMaticu(String inputFile, String outputFile), ktora nacita zo vstupneho suboru maticu MxN pozostavajucu z 0 a 1, utriedi riadky matice podla poctu jednotiek (od najmensieho po najvacsi) a takuto usporiadanu maticu vypise do vystupneho suboru. V pripade, ze vstupny subor nesplna format popisany nizsie, metoda vyhodi vynimku InvalidInputFileException. V pripade inej chyby (neda sa citat zo suboru, neda sa zavriet subor a pod.) vyhodi vynimku CannotSortException. Vynimky InvalidInputException a CannotSortException vytvorte ako priamych potomkov triedy Exception. Vsetko odovzdajte v jednom subore Rozcvicka.java.

Formát vstupného súboru: V prvom riadku je jedine cele cislo M - pocet riadkov matice
V druhom riadku je jedine cele cislo N - pocet stlpcov matice
Nasleduje M riadkov v kazdom je N znakov 0 alebo 1.

Príklad vstupného súboru:
4
5
10000
01100
10010
10100


Format vystupneho suboru:
Rovnaky ako format vstupneho suboru - t.j. v prvych dvoch riadkoch su cele cisla M a N -- pocet riadkov a stlpcov matice a za nimi nasleduje M riadkov obsahujuci prave N znakov 0 alebo 1.

Rozcvička 28.10.2008:

Vytvorte interfejs Porovnatelne obsahujuci metodu int compareTo(Porovnatelne o) a celociselne konstanty MENEJ, VIAC, ROVNAKO s hodnotami -1, 0, 1 (v tomto poradi).

Vytvorte triedu Cislo tak, aby objekty typu Cislo boli zaroven typu Porovnatelne. Instancie tejto triedy by mali reprezentovat cele cisla, hodnota cisla bude zadana v konstruktore ako parameter typu int. Trieda Cislo by mala mat verejnu metodu int value(), ktora vrati hodnotu cisla, a zmysluplne definovanu metodu int compareTo(Porovnatelne o), navratovou hodnotou tejto metody je jedna z konstant definovanych v interfejse Porovnatelne. V pripade, ze zadany argument pre metodu compareTo() nie je typu Cislo, metoda nemusi robit nic zmysluplne. Okrem metody value() by pre metody nepatriace do triedy Cislo nemal existovat ziaden sposob pristupu k hodnote reprezentovaneho cisla.

Vytvorte triedu UsporiadanePole, ktora bude spravovat pole objektov typu Porovnatelne. Na vnutornu reprezentaciu tohto pola pouzite ArrayList. Tato trieda by mala mat okrem zmysluplneho konstruktora taketo metody:

Rozcvička 21.10.2008:

Vytvorte triedu Krajina reprezentujucu obdlznikovu mapu krajiny. Vnutornu reprezentaciu mapy si mozete zvolit sami, jednotlive policka mapy su bud zem 'z', alebo voda 'v'. Dve policka su susedne, ak maju spolocnu stranu. Pouzivane suradnice zacinaju od 0.

Trieda Krajina by mala mat tieto metody:

Mozete sa spolahnut, ze metoda zmeny() dostane korektne instrukcie s pripustnymi suradnicami zodpovedajucimi korektnej mape zadanej v konstruktore.

Za konstruktor a metody teren() a vysus() je po 1 bode, metoda zaplav() je za 4 body a zmeny() je za 3 body.

Mozete si svoj program vyskusat s takouto metodou main():
	public static void main(String[] args) {
		String[] m = {
			"vzzz",
			"vzzv",
			"vvzz",
			"zzvz",
			"zzzz"
		};
		char[][] mapa = new char[m.length][];
		for (int i = 0; i < m.length; i++) {
			mapa[i] = m[i].toCharArray();
		}
		String[] instrukcie = {"Z", "V(3,2)", "V(4,2)",
			"V(3,1)", "V(0,2)", "V(3,0)", "Z", "V(2,1)"};

		Krajina krajina = new Krajina(mapa);
		krajina.zmeny(instrukcie);
		for (int i = 0; i < mapa.length; i++) {
			for (int j = 0; j < mapa[0].length; i++) {
				System.out.print(krajina.teren(i, j));
			}
			System.out.println();
		}
	}
Vystup by mal byt
	vvvv
	vvvv
	vzvv
	vvvv
	zzzv



Rozcvička 14.10.2008:

Vytvorte triedu Rozcvicka2 s metódou char[] commonCharacters(String[]). Táto metóda dostane ako argument slovník (pole reťazcov). Mala by nájsť všetky znaky, ktoré sa vyskytujú v každom reťazci zo slovníka, a skonštruovať pole, ktoré obsahuje každý z týchto znakov práve raz (na poradi nezáleží). Návratovou hodnotou má byť referencia na skonštruované pole.

Príklad: Pri slovníku {"trubadur", "vydriduch", "cumizgumydovody", "dub"} by malo byt skonštruované pole {'d', 'u'}.
Dávajte pozor, aby vytvorené pole malo dostatočnú dĺžku a aby neobsahovalo nič naviac. Nespoliehajte sa na to, že v slovníku budú len slová zo znakov anglickej abecedy (t.j. môže sa tam vyskytovať ľubovoľný znak).

Zdrojový kód uvedenej triedy pošlite ako prílohu emailom na rjasko (zavinac) dcs.fmph.uniba.sk, v ktorom bude jednoznačne uvedené Vaše meno a priezvisko. Predmet emailu bude "Programovanie 3 - rozcvicka 2".


Rozcvička 7.10.2008:

Vytvorte triedu Rozcvicka1 a v nej napíšte funkciu neparneDelitele, ktorá dostane na vstup celé číslo n a vypíše všetkých jeho nepárnych deliteľov. Funkciu neparneDelitele zavolajte v hlavnom programe pre n=1001.


Zdrojový kód uvedenej triedy pošlite ako prílohu emailom na rjasko (zavinac) dcs.fmph.uniba.sk, v ktorom bude jednoznačne uvedené Vaše meno a priezvisko. Predmet emailu bude "Programovanie 3 - rozcvicka 1".