Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Podobné dokumenty
Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Téma 12 - Textové soubory a výjimky

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Java - výjimky. private void vstup() throws IOException {... }

KTE / ZPE Informační technologie

Typický prvek kolekce pro české řazení

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Algoritmizace a programování

Programování v Javě I. Únor 2009

Jazyk C# (seminář 6)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Programování v Javě I. Leden 2008

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy: zásobník

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Úvod do programovacích jazyků (Java)

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Java a XML. 10/26/09 1/7 Java a XML

typová konverze typová inference

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Principy objektově orientovaného programování

5 Rekurze a zásobník. Rekurzivní volání metody

Z. Kotala, P. Toman: Java ( Obsah )

Generické programování

Vláknové programování část V

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Úvod do programovacích jazyků (Java)

Iterator & for cyklus

Java Výjimky Java, zimní semestr

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Algoritmizace a programování

20. Projekt Domácí mediotéka

Vlákna. První jednoduchý program s vlákny:

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Seminář Java IV p.1/38

PREPROCESOR POKRAČOVÁNÍ

PŘETĚŽOVÁNÍ OPERÁTORŮ

Dynamické struktury a Abstraktní Datový Typy (ADT)

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Vlákna. První jednoduchý program s vlákny:

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Seminář Java II p.1/43

RMI Remote Method Invocation

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Datové struktury. alg12 1

Část 1 Spojové struktury (stromy) Dynamické struktury a Abstraktní Datový Typy (ADT) Část 2 Abstraktní datový typ. Část 3 Příklad ADT Prioritní fronta

Abstraktní třída a rozhraní

Teoretické minimum z PJV

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

1. Programování proti rozhraní

8. přednáška: Soubory a proudy

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Úvod do programování - Java. Cvičení č.4

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

10 Generické implementace

IRAE 07/08 Přednáška č. 1

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Výčtový typ strana 67

Jazyk C# (seminář 3)

Regulární výrazy. Vzory

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Více o konstruktorech a destruktorech

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

7. Datové typy v Javě

PB161 Programování v jazyce C++ Přednáška 4

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Úvod do programovacích jazyků (Java)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Distribuované systémy a výpočty

Spojové struktury. Spojová struktura (linked structure):

Java Řetězce Java, zimní semestr

VIII. Seminář Java VIII p.1/36

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Objektově orientované programování

OOPR_05. Případové studie

Třídy a objekty -příklady

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

17. Projekt Trojúhelníky

Paměť počítače. alg2 1

JSR tutorial 2 Transformace v JSR-184

7. Dynamické datové struktury

PB161 Programování v jazyce C++ Přednáška 7

Transkript:

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat. 1. Odkrokujte následující program a s použitím notace z přednášky sledujte stav paměti v místech označených komentáři (stavy A, B a C). Napište pouze pro první návštěvu příslušného místa. Předpokládejte, že garbage collector odstraní z haldy alokované instance okamžitě poté, co přestanou být z programu dostupné. class Node { final int v; Node next; Node(int v, Node next) { this.v = v; this.next = next; boolean f(int t) { // stav B return v == t (next!= null && next.f(t)); public static void main(string[] args) { Node n = new Node(2, new Node(3, new Node(1, null))); new Node(1, n); // stav A if (n.f(1)) { n.next = null; // stav C Řešení: Následující seznam ukazuje stav paměti, na místech označených komentáři. stav A: #1 Node(v = 1, next = null) #2 Node(v = 3, next = #1) #3 Node(v = 2, next = #2) n = #3 stav B: (první) #1 Node(v = 1, next = null) this = #3, t = 1 #2 Node(v = 3, next = #1) #3 Node(v = 2, next = #2) n = #3 stav C: ( #3 Node(v = 2, next = null) n = #3 )

2. Napište, co vypíše následující kód. interface A { int v(); A f(a a); class B implements A { private final int v; public B(int v) { this.v = v; public int v() { return v; public A f(a a) { return new B(a.v() - v); class C extends B { public C(int v) { super(v); public A f(a a) { return new B(v() * a.v()); class D extends C { public D(int v) { super(v); public A f(a a) { if (a.v() <= 0) return new B(1); return a.f(new D(v()/10)); public class Ex2 { public static void main(string[] args) { B b = new B(6); C c = new C(6); D d = new D(5); System.out.println(d.f(b).v()); System.out.println(d.f(c).v()); Poznámka: oproti původnímu zadání jsou zde zkrácena jména rozhraní a tříd. Kód vypíše na samostatné řádky čísla -6 a 0. Číslo -6 získáme voláním d.f(b).v(), viz stavy paměti (vždy bezprostředně po volání příslušných metod): stav D.f(): #1 B(v = 6) this = #3, a = #1 #2 C(v = 6) #3 D(v = 5) b = #1, c = #2, d = #3

stav B.f(): #1 B(v = 6) this = #1, a = #4 #2 C(v = 6) #3 D(v = 5) this = #3, a = #1 #4 D(v = 0) b = #1, c = #2, d = #3 V případě čísla 0: stav D.f(): #1 B(v = 6) this = #3, a = #2 #2 C(v = 6) #3 D(v = 5) b = #1, c = #2, d = #3 stav C.f(): #1 B(v = 6) this = #2, a = #6 #2 C(v = 6) #3 D(v = 5) this = #3, a = #2 #6 D(v = 0) b = #1, c = #2, d = #3 V obou případech se uplatnilo celočíselné dělení 6/10 = 0.

3. Najděte a vysvětlete chybu při překladu. abstract class Animal { public double skill; public Animal() { skill = Math.random(); public abstract void catchanimal(animal animal); public void escapefrom(dog dog) { skill = (skill >= dog.skill)? skill + dog.skill : skill - dog.skill; public void escapefrom(cat cat) { class Dog extends Animal { public void catchanimal(animal animal){ animal.escapefrom(this); public void escapefrom(cat cat) { skill++; public static Animal compare(dog a, Dog b){ return (a.skill >= b.skill)? a : b; class Cat extends Animal { public void catchanimal(animal animal){ animal.escapefrom(this); class Combat{ public static void main(string [] args) { Animal c1 = new Cat(); Dog d1 = new Dog(); Animal d2 = new Dog(); d2.catchanimal(c1); d2 = (Dog) d1; d1.catchanimal(c1); d2 = Dog.compare(d2, d1); d2.catchanimal(d1); K problému při překladu dojde při porovnávání d2 = Dog.compare(d2, d1);. Protože metoda očekává oba vstupy typu Dog, zde je však d2 typu Animal.

4. Vyznačte řádek, na kterém dojde k chybě za běhu programu. K jakému typu chyby dojde (nemusíte psát přesný název výjimky, stačí popsat typ chyby, např. chybné přetypování, přetečení zásobníku apod.)? Jak by se musel kód upravit, aby k chybě nedošlo? Jak bude vypadat vytvořený strom? class Node{ int value; Node left, right; public Node(int i){ value = i; left = (i > 0)? new Node(i-1) : null; public boolean contains(int i){ if (value == i) return true; return right.contains(i) left.contains(i); public void insert(node node){ if(left == null left.value < node.value) { node.left = left; this.left = node; else{ node.right = right; this.right = node; class Main{ public static void main(string args[]){ Node n1 = new Node(2); Node n2 = new Node(3); n1.contains(2); n1.insert(n2); n1.contains(3); K chybě dojde při vyhodnocování volání n1.contains(3);, konkrétně v metodě contains při vyhodnocování right.contains(i), protože right je null. Výjimka tedy je NullPointerException. Návrh na opravu: public boolean contains(int i){ if (value == i) return true; if (right == null && left == null) return false; if (right == null && left!= null) return left.contains(i); if (right!= null && left == null) return right.contains(i); return right.contains(i) left.contains(i);

akceptované řešení bylo i méně odolné: public boolean contains(int i){ return left.contains(i) right.contains(i); nebo naznačení řešení pomocí vzoru NullObject. Nejdelší strom vypadá následovně: Node(2) Node(3) Node(1) N ode(0), kde reprezentuje ukazatel Node.left. Node.right vždy ukazuje na null. 5. V níže uvedeném kódu odstraňte aktivní čekání. Pokud budete potřebovat můžete si dodefinovat nové pomocné metody a třídy. Rozhraní tříd Worker a Machine musí zůstat zachováno. class Machine { boolean isready = true; public void dosomestuff() throws InterruptedException { isready = false; // A lot of work... // invoke asyncmethod Thread t = (new Thread() { @Override public void run() { // do stuff ); t.start(); t.join(); public void asyncmethod() { // do a lot of work // work is done isready = true; class Worker { Machine m; public Worker(Machine m) { this.m = m; public void dowork() { // watch isready

while (!m.isready) { Thread.sleep(100); m.dosomestuff(); public class Factory { public static void main(string[] args) { Machine m = new Machine(); Worker w; for(int i = 0; i<10; ++i) { w = new Worker(m); w.dowork(); Řešení: Zde se nabízelo použít Observer, kde třída Machine bude implementovat rozhraní Observable a třída worker rozhraní Observer.