Suma si media

Enunt

interface Expresie{

double calculeazaValoare();

}

class Constanta implements Expresie{

private double valoare;

public Constanta(double valoare){

this.valoare=valoare;

}

public double calculeazaValoare() {

return this.valoare;

}

public String toString() {

return this.valoare+"";

}

public void schimbaValoare(double valoareNoua) {

this.valoare = valoareNoua;

}

}

class Suma implements Expresie{

private Expresie e1,e2;

public Suma(Expresie e1, Expresie e2){

this.e1=e1;

this.e2=e2;

}

public double calculeazaValoare() {

double tmp1=e1.calculeazaValoare();

double tmp2=e2.calculeazaValoare();

return tmp1+tmp2;

}

public String toString(){

return e1.toString()+ " + " +e2.toString();

}

}

class Medie implements Expresie{

private Expresie[] expresii;

private static final int nrMaxExpresii=15;

private int nrExpresii=0;

public Medie(){

expresii=new Expresie[nrMaxExpresii];

}

public void adaugaExpresie(Expresie e1){

if(nrExpresii==nrMaxExpresii)

System.out.println("Limita maxima de stocare a expresiilor a fost atinsa");

else{

if(e1!=null){

expresii[nrExpresii]=e1;

nrExpresii++;

}

}

}

public double calculeazaValoare() {

if(nrExpresii==0)

return 0;

else{

double tmp=0;

for(int i=0;i<nrExpresii;i++)

tmp=tmp+expresii[i].calculeazaValoare();

return (double)tmp/nrExpresii;

}

}

public String toString() {

String result="MED("+expresii[0].toString();

for(int i=1;i<nrExpresii;i++)

result=result+", "+expresii[i].toString();

result=result+")";

return result;

}

}

public class Main {

public static void main(String[] args) {

Expresie c1=new Constanta(5.0);

Expresie c2=new Constanta(0.0);

Expresie s1=new Suma(new Constanta(6.0),new Constanta(7.0));

Expresie m1=new Medie();

Expresie f=new Medie();

((Medie)m1).adaugaExpresie(c1);

((Medie)m1).adaugaExpresie(c2);

((Medie)f).adaugaExpresie(m1);

((Medie)f).adaugaExpresie(s1);

System.out.println(f);

System.out.println("Valoare expresiei este: "+f.calculeazaValoare());

}

}