// interf2.java - demonstrate interfaces

interface Dpolynom
{
  int Degree();
  double evaluate(double x);

  void Print();

} // Ipolynom


interface Ddouble_indexer
{

  void set_coeff(int i, double value);

} // Idouble_indexer


class double_polynom implements Dpolynom, Ddouble_indexer
{
  int size;
  double [] Coeffs;

  public double_polynom(double [] Coeffs)
  {
   int i;

   size = Coeffs.length;
   this.Coeffs = new double [Coeffs.length];
   for(i=0; i<size; i++)
      this.Coeffs[i] = Coeffs[i];
  }// double_polynom

  public int Degree()
  {
     return size-1;
  } // Degree

  public double evaluate(double x)
   {
   int i;
   double v;

   v = Coeffs[0];
   for(i = 1; i < size; i++)
     v = v*x + Coeffs[i];
   return v;

  } //  evaluate

  public void Print()
  {
   int i;
   for(i = 0; i < size; i++)
      System.out.print(" "+ Coeffs[i]);
   System.out.println("");
  } // Print

  public void set_coeff(int i, double value)
  {
   Coeffs[i] = value;
  } //  set_coeff

} // double_polynom



public class interf2 {
    public static void main(String[] args) 
    {
     double [] arr = new double []{1.0, 2.0, 3.0, 4.0};

      double_polynom dpoly = new double_polynom(arr);

      dpoly.Print();
      System.out.println("\nipoly degree = " + dpoly.Degree());
      System.out.println("\nipoly(2.0) value = " + dpoly.evaluate(2.0));
      dpoly.set_coeff(2, 5.0);
      dpoly.Print();
      System.out.println("\nipoly degree = " + dpoly.Degree());
      System.out.println("\nipoly(2.0) value = " + dpoly.evaluate(2.0));

    }// main
}// interf2


