// Avalie sua resposta considerando a solucao abaixo.
// Quanto mais longe desta solucao a sua classe estiver, maior
// deve ser seu tempo dedicado ao estudo da materia.

public class Acumulador {                 // nome da classe com significado
  private int acumInt;                  // atributos privados
  private double acumDouble;           
  private int contaInt, contaDouble;

  public Acumulador() {                 // construtores, todos os casos
    acumInt = 0; acumDouble = 0.0;
    contaInt = 0; contaDouble = 0;
  }

  public Acumulador( int vi ) {
    acumInt = vi; acumDouble = 0.0;
    contaInt = 1; contaDouble = 0;
  }

  public Acumulador( double vd ) {
    acumInt = 0; acumDouble = vd;
    contaInt = 0; contaDouble = 1;
  }

  public Acumulador( int vi, double vd ) {
    acumInt = vi; acumDouble = vd;
    contaInt = 1; contaDouble = 1;
  }

  public Acumulador( double vd, int vi ) {
    acumInt = vi; acumDouble = vd;
    contaInt = 1; contaDouble = 1;
  }

  public Acumulador( Acumulador a ) {  // construtor de copia
    this.acumInt = a.acumInt; this.acumDouble = a.acumDouble;
    this.contaInt = a.contaInt; this.contaDouble = a.contaDouble;
  }

  public void acumula( int v ) {  // acumula inteiro - sobrecarga de metodo
    contaInt++;
    acumInt += v;
  }
	
  public void acumula( double v ) { // acumula double - sobrecarga de metodo
    contaDouble++;
    acumDouble += v;
  }
	
  public double mediaInt() {  // metodo de acesso
    if( contaInt == 0 )     // testa para ver se nao tem divisao por 0
      return 0;
    else
      return (double) acumInt/contaInt;
  }
  
  public double mediaDouble() {
    if( contaDouble == 0 )
      return 0;
    else
      return acumDouble/contaDouble;
  }
}

