Filiale.java
Created with JBuilder
class Filiale {
  // Attributo per la dimensione iniziale dell'elenco conti
  public static final int NUMERO_CONTI_INIZIALE = 100;

  // Attributi della filiale
  private String indirizzo;
  private ContoCorrente[] elencoConti;
  private int numeroConti;

  // Costruttore
  public Filiale(String indirizzo) {
    this.indirizzo = indirizzo;
    elencoConti = new ContoCorrente[NUMERO_CONTI_INIZIALE];
    numeroConti = 0;
  }

  // Metodi di restituzione (necessari in GestioneFiliali)
  public String restituisciIndirizzo() {
    return indirizzo;
  }
  public int restituisciNumeroConti() {
    return numeroConti;
  }

  // Apertura di un conto, ossia creazione di un oggetto ContoCorrente
  // e aggiunta dello stesso nell'elenco dei conti
  public ContoCorrente apriConto(String intestatario, 
                                 double commissione, double fido) {
    ContoCorrente conto = new ContoCorrente(intestatario);
    conto.impostaCommissione(commissione);
    conto.impostaFido(fido);
    if (numeroConti == elencoConti.length) {
      espandiElencoConti();
    }
    elencoConti[numeroConti++] = conto;
    return conto;
  }

  // Il conto viene eliminato dall'elenco e restituito, se esiste;
  // altrimenti viene restituito null
  public ContoCorrente chiudiConto(int numero) {
    int posizione = cercaContoPerNumero(numero);
    if (posizione > 0) {
      ContoCorrente conto = elencoConti[posizione];
      elencoConti[posizione] = elencoConti[numeroConti - 1];
      --numeroConti;
      return conto;
    } else {
      return null;
    }
  }

  // Il deposito è possibile solo se il conto è aperto presso la filiale
  public boolean deposita(int numero, double somma) {
    int posizione = cercaContoPerNumero(numero);
    if (posizione > 0) {
      elencoConti[posizione].deposita(somma);
      return true;
    } else {
      return false;
    }
  }

  // Il prelievo è possibile solo se il conto è aperto presso la filiale
  // e l'importo del prelievo non eccede il fido
  public boolean preleva(int numero, double somma) {
    int posizione = cercaContoPerNumero(numero);
    if ((posizione > 0) && elencoConti[posizione].preleva(somma)) {;
      return true;
    } else {
      return false;
    }
  }

  public double calcolaRaccolta() {
    double raccolta = 0.0;
    for (int i = 0; i < numeroConti; ++i) {
      if (elencoConti[i].restituisciSaldo() > 0) {
        raccolta += elencoConti[i].restituisciSaldo();
      }
    }
    return raccolta;
  }

  public double calcolaEsposizione() {
    double esposizione = 0.0;
    for (int i = 0; i < numeroConti; ++i) {
      if (elencoConti[i].restituisciSaldo() < 0) {
        // L'esposizione viene comunque calcolata come un numero positivo
        esposizione += -1 * elencoConti[i].restituisciSaldo();
      }
    }
    return esposizione;
  }

  public double calcolaGiacenzaMedia() {
    double giacenza = 0.0;
    int contiInAttivo = 0;
    for (int i = 0; i < numeroConti; ++i) {
      if (elencoConti[i].restituisciSaldo() > 0) {
        ++contiInAttivo;
        giacenza += elencoConti[i].restituisciSaldo();
      }
    }
    if (contiInAttivo > 0) {
      giacenza = giacenza / contiInAttivo;
    }
    return giacenza;
  }

  // Sono i conti per cui lo scoperto supera il 90% del fido concesso
  public int numeroContiProblematici() {
    int n = 0;
    for (int i = 0; i < numeroConti; ++i) {
      if (elencoConti[i].restituisciSaldo() < 0) {
        double passivo = -1 * elencoConti[i].restituisciSaldo();
        double fido = elencoConti[i].restituisciFido();
        if (passivo > (fido * 90 / 100)) {
          ++n;
        }
      }
    }
    return n;
  }

  private int cercaContoPerNumero(int numero) {
    for (int i = 0; i < numeroConti; ++i) {
      if (elencoConti[i].restituisciNumero() == numero) {
        return i;
      }
    }
    return -1;
  }

  private void espandiElencoConti() {
    ContoCorrente[] nuovoElenco = new ContoCorrente[elencoConti.length * 2];
    for (int i = 0; i < elencoConti.length; ++i) {
      nuovoElenco[i] = elencoConti[i];
    }
    elencoConti = nuovoElenco;
  }
}

Filiale.java
Created with JBuilder