<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
abstract class Wyrazenie {
    public Wyrazenie dodaj(Wyrazenie w) { return w.dodajOdwrotnie(this); }
    public Wyrazenie odejmij(Wyrazenie w) { return w.odejmijOdwrotnie(this); }
    public Wyrazenie pomnĂłĹź(Wyrazenie w) { return w.pomnĂłĹźOdwrotnie(this); }
    public Wyrazenie podziel(Wyrazenie w) { return w.podzielOdwrotnie(this); }

    Wyrazenie dodajOdwrotnie(Wyrazenie w) { return new Plus(w, this); }
    Wyrazenie odejmijOdwrotnie(Wyrazenie w) { return new Minus(w, this); }
    Wyrazenie pomnĂłĹźOdwrotnie(Wyrazenie w) { return new Razy(w, this); }
    Wyrazenie podzielOdwrotnie(Wyrazenie w) { return new Dzielenie(w, this); }
    /* to niestety jest potrzebne aby dziaĹo upraszczanie staĹych */
    Wyrazenie dodajOdwrotnie(StaĹa w) { return dodajOdwrotnie((Wyrazenie) w); }
    Wyrazenie odejmijOdwrotnie(StaĹa w) { return odejmijOdwrotnie((Wyrazenie) w); }
    Wyrazenie pomnĂłĹźOdwrotnie(StaĹa w) { return pomnĂłĹźOdwrotnie((Wyrazenie) w); }
    Wyrazenie podzielOdwrotnie(StaĹa w) { return podzielOdwrotnie((Wyrazenie) w); }


    public abstract double wartoĹÄ(double x);
    public abstract Wyrazenie pochodna();

    public double caĹka(double l, double r, int n) {
        double delta=(r-l)/n;
        double res=0;
        for(int i=0;i&lt;n;i++) {
            double x0=l+delta*i;
            double x1=l+delta*(i+1);
            res += (wartoĹÄ(x0)+wartoĹÄ(x1))*delta/2;
        }
        return res;
    }
    int priorytet() { return 100000; }
}

class StaĹa extends Wyrazenie {
    protected final double wart;

    protected StaĹa(double wart) {
        this.wart = wart;
    }

    public static StaĹa twĂłrz(double x) {
        if (x==0.0) return Zero.twĂłrz();
        else if (x==1.0) return Jeden.twĂłrz();
        else return new StaĹa(x);
    }

    public String toString() { return ""+this.wart; }

    public double wartoĹÄ(double x) { return this.wart; }

    public Wyrazenie dodaj(StaĹa w) { return twĂłrz(this.wart+w.wart); }
    public Wyrazenie dodaj(Wyrazenie w) { return w.dodajOdwrotnie(this); }
    Wyrazenie dodajOdwrotnie(StaĹa w) { return twĂłrz(w.wart+this.wart); }
    public Wyrazenie odejmij(StaĹa w) { return twĂłrz(this.wart-w.wart); }
    public Wyrazenie odejmij(Wyrazenie w) { return w.odejmijOdwrotnie(this); }
    Wyrazenie odejmijOdwrotnie(StaĹa w) { return twĂłrz(w.wart-this.wart); }
    public Wyrazenie pomnĂłĹź(StaĹa w) { return twĂłrz(this.wart*w.wart); }
    public Wyrazenie pomnĂłĹź(Wyrazenie w) { return w.pomnĂłĹźOdwrotnie(this); }
    Wyrazenie pomnĂłĹźOdwrotnie(StaĹa w) { return twĂłrz(w.wart*this.wart); }
    public Wyrazenie podziel(StaĹa w) { return twĂłrz(this.wart/w.wart); }
    public Wyrazenie podziel(Wyrazenie w) { return w.podzielOdwrotnie(this); }
    Wyrazenie podzielOdwrotnie(StaĹa w) { return twĂłrz(w.wart/this.wart); }

    public Wyrazenie pochodna() { return Zero.twĂłrz(); }
}

class Zero extends StaĹa {
    private static final Zero ZERO=new Zero();
    private Zero() { super(0.0); }
    public static Zero twĂłrz() { return ZERO; }

    public Wyrazenie dodaj(Wyrazenie w) { return w; }
    Wyrazenie dodajOdwrotnie(Wyrazenie w) { return w; }
    Wyrazenie odejmijOdwrotnie(Wyrazenie w) { return w; }
    public Wyrazenie pomnĂłĹź(Wyrazenie w) { return this; }
    Wyrazenie pomnĂłĹźOdwrotnie(Wyrazenie w) { return this; }
    public Wyrazenie podziel(Wyrazenie w) { return this; }
}

class Jeden extends StaĹa {
    private static final Jeden JEDEN=new Jeden();
    private Jeden() { super(1.0); }
    public static Jeden twĂłrz() { return JEDEN; }
    public Wyrazenie pomnĂłĹź(Wyrazenie w) { return w; }
    Wyrazenie pomnĂłĹźOdwrotnie(Wyrazenie w) { return w; }
    Wyrazenie podzielOdwrotnie(Wyrazenie w) { return w; }
}

class Zmienna extends Wyrazenie {
    private static final Zmienna X=new Zmienna();
    private Zmienna() { }
    public static Zmienna twĂłrz() { return X; }
    public String toString() { return "x"; }
    public double wartoĹÄ(double x) { return x; }

    public Wyrazenie pochodna() { return Jeden.twĂłrz(); }
}

abstract class Wyr2Arg extends Wyrazenie {
    protected final Wyrazenie arg1;
    protected final Wyrazenie arg2;

    Wyr2Arg(Wyrazenie arg1, Wyrazenie arg2) {
        this.arg1 = arg1;
        this.arg2 = arg2;
    }
    abstract String znakOp();
    public String toString() {
        String res = "";
        if (this.priorytet() &gt; arg1.priorytet())
            res +="("+this.arg1+")";
        else
            res += this.arg1;

        res += znakOp();

        if (this.priorytet() &gt;= arg2.priorytet())
            res +="("+this.arg2+")";
        else
            res += this.arg2;
        return res;
    }
}

abstract class Wyr1Arg extends Wyrazenie {
    protected final Wyrazenie arg;

    Wyr1Arg(Wyrazenie arg) {
        this.arg = arg;
    }
    abstract String znakOp();
    public String toString() { return znakOp()+"("+this.arg+")"; }
}

class Plus extends Wyr2Arg {
    Plus(Wyrazenie arg1, Wyrazenie arg2) { super(arg1, arg2); }
    String znakOp() { return "+"; }
    public double wartoĹÄ(double x) { return arg1.wartoĹÄ(x)+arg2.wartoĹÄ(x); }
    int priorytet() { return 100; }

    public Wyrazenie pochodna() { return arg1.pochodna().dodaj(arg2.pochodna()); }
}

class Minus extends Wyr2Arg {
    Minus(Wyrazenie arg1, Wyrazenie arg2) { super(arg1, arg2); }
    String znakOp() { return "-"; }
    public double wartoĹÄ(double x) { return arg1.wartoĹÄ(x)-arg2.wartoĹÄ(x); }
    int priorytet() { return 100; }

    public Wyrazenie pochodna() { return arg1.pochodna().odejmij(arg2.pochodna()); }
}

class Razy extends Wyr2Arg {
    Razy(Wyrazenie arg1, Wyrazenie arg2) { super(arg1, arg2); }
    String znakOp() { return "*"; }
    public double wartoĹÄ(double x) { return arg1.wartoĹÄ(x)*arg2.wartoĹÄ(x); }
    int priorytet() { return 1000; }

    public Wyrazenie pochodna() {
        return arg1.pochodna().pomnĂłĹź(arg2)
            .dodaj(arg1.pomnĂłĹź(arg2.pochodna()));
    }
}

class Dzielenie extends Wyr2Arg {
    Dzielenie(Wyrazenie arg1, Wyrazenie arg2) { super(arg1, arg2); }
    String znakOp() { return "/"; }
    public double wartoĹÄ(double x) { return arg1.wartoĹÄ(x)/arg2.wartoĹÄ(x); }
    int priorytet() { return 1000; }

    public Wyrazenie pochodna() {
        return arg1.pochodna().pomnĂłĹź(arg2)
            .odejmij(arg1.pomnĂłĹź(arg2.pochodna()))
            .podziel(arg1.pomnĂłĹź(arg1));
    }
}

class MinusUnarny extends Wyr1Arg {
    public MinusUnarny(Wyrazenie arg) { super(arg); }
    String znakOp() { return "-"; }
    public double wartoĹÄ(double x) { return -(arg.wartoĹÄ(x)); }
    public Wyrazenie pochodna() { return new MinusUnarny(arg.pochodna()); }
}


class Cos extends Wyr1Arg {
    public Cos(Wyrazenie arg) { super(arg); }
    String znakOp() { return "cos"; }
    public double wartoĹÄ(double x) { return Math.cos(arg.wartoĹÄ(x)); }
    public Wyrazenie pochodna() { return new MinusUnarny(new Sin(arg)); }
}

class Sin extends Wyr1Arg {
    public Sin(Wyrazenie arg) { super(arg); }
    String znakOp() { return "sin"; }
    public double wartoĹÄ(double x) { return Math.sin(arg.wartoĹÄ(x)); }
    public Wyrazenie pochodna() { return new Cos(arg); }
}</pre></body></html>