Druhý domácí úkol

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).

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.

Termín odevzdání 14. 3. 1:59 ráno (čas podle serveru s repozitáři).

~~DISCUSSION:closed~~

courses/b6b36omo/hw/02/start.txt · Last modified: 2018/10/03 11:13 (external edit)