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; } }