Search
Uvažujte jednoduchý programovací jazyk, ve kterém je každý příkaz přiřazení a jehož výrazy se skládají z čísel, proměnných a operace sčítání. Program v takovém jazyce může vypadat např. takto
a = 3 b = a
nebo třeba takto
a = 3 b = a + c
Oba programy můžeme v Javě reprezentovat pomocí následujících stromových struktur:
Program p = new Program( new Assignment[]{ new Assignment("a", new Num(3)), new Assignment("b", new Var("a")) });
a
Program p2 = new Program( new Assignment[]{ new Assignment("a", new Num(3)), new Assignment("b", new Addition(new Var("a"), new Var("c"))) });
Výše uvedeným stromovým strukturám odpovídají následující třídy:
interface Expression { String[] getUtilizedVarNames(); } class Var implements Expression { final String name; Var(String n) { name = n; } public String[] getUtilizedVarNames() { /* kod */ } } class Num implements Expression { final int value; Num(int v) { value = v; } public String[] getUtilizedVarNames() { /* kod */ } } class Addition implements Expression { final Expression expr1, expr2; Addition(Expression e1, Expression e2) { expr1 = e1; expr2 = e2; } public String[] getUtilizedVarNames() { /* kod */ } } class Assignment { final String varName; final Expression expr; Assignment(String v, Expression e) { varName = v; expr = e; } } class Program { final Assignment[] assignments; Program(Assignment[] as) { assignments = as; } boolean usesUninitializedVariables() { /* kod */ } }
Vaším úkolem je dopsat kód metody Program.usesUninitializedVariables, která vrátí true právě tehdy, pokud se v daném programu nějaká proměnná objeví na pravé straně přiřazení dříve než na levé (tzn. v případě prvního programu by vrátila false, u druhého programu by vrátila true). Pokud by se nějaká proměnná poprvé objevila na obou stranách současně, je to také špatně, protože se nejprve vyhodnocuje pravá strana a výsledek vyhodnocení se teprve pak přiřazuje do proměnné na levé straně. Tip: nejprve si do rozhraní Expression dopište metodu getUtilizedVarNames, která vrátí pole se seznamem jmen proměnných použitých v daném výrazu (např. a + c vrátí pole obsahující a a c, 3 vrátí prázdné pole).
Program.usesUninitializedVariables
true
false
Expression
getUtilizedVarNames
a + c
c
3
Do repozitáře odevzdávejte všechny výše uvedené třídy a rozhraní (tzn. Expression, Var, Num, Addition, Assignment a Program), vše umístěte do souboru homeworks/Homework2.java. Pokud chcete, můžete si vytvořit nové třídy a metody, hlavičky existujících metod a konstruktorů měnit nesmíte.
Var
Num
Addition
Assignment
Program
homeworks/Homework2.java
Termín odevzdání 14. 3. 1:59 ráno (čas podle serveru s repozitáři).
~~DISCUSSION:closed~~