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.
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
}
}
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:
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
}
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:
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í).
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.
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.
4
5
10000
01100
10010
10100
int compareTo(Porovnatelne o)
a celociselne konstanty MENEJ, VIAC, ROVNAKO s hodnotami -1, 0, 1 (v tomto poradi).
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.
void pridaj(Porovnatelne o), prida dany objekt do pola,
Porovnatelne maximum(), vrati referenciu na objekt najvacsi z objektov v poli alebo null, ak je pole prazdne, vrateny objekt netreba z pola vymazat.
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:Krajina(char [][]), ktory dostane ako argument
obdlznikove pole s mapou velkosti aspon 1x1, treba si
spravit vlastnu kopiu zadanej mapy
char teren(int x, int y), vrati 'z', ak na policku so suradnicami (x,y) je zem, inak 'v'
int zaplav(), zmeni na vodu tie policka typu zem,
ktore susedia s aspon jednym polickom typu 'v' a vrati pocet zaplavenych policok
int vysus(int x, int y), spravi zem z policka so suradnicami (x,y)
void zmeny(String[] s), vykona instrukcie
zadane ako jednotlive retazce v danom poli.
Instrukcie su dvoch typov:
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