class Squadra { // Costante per il numero di operai e num. iniziale per le attrezzature public final static int NUMERO_MAX_OPERAI = 10; public final static int NUMERO_INIZIALE_ATTR = 10; // Attributo a livello di classe per la gestione del numero squadra private static int progressivoSquadre = 0; // Attributi private int numero; private Operaio capo; private Operaio[] elencoOperai; private int numeroOperai; private Attrezzatura[] elencoAttrezzature; private int numeroAttrezzature; // Costruttore public Squadra(Operaio capo) { this.numero = progressivoSquadre; ++progressivoSquadre; this.capo = capo; elencoOperai = new Operaio[NUMERO_MAX_OPERAI]; numeroOperai = 0; elencoAttrezzature = new Attrezzatura[NUMERO_INIZIALE_ATTR]; numeroAttrezzature = 0; aggiungi(capo); } // Metodi di restituizione public int restituisciNumero() { return numero; } public Operaio restituisciCapo() { return capo; } // Metodi per aggiunta e rimozione di operai e attrezzature public boolean aggiungi(Operaio o) { if (numeroOperai < elencoOperai.length) { elencoOperai[numeroOperai++] = o; return true; } else { return false; } } public void aggiungi(Attrezzatura a) { if (numeroAttrezzature == elencoAttrezzature.length) { Attrezzatura[] nuovo = new Attrezzatura[numeroAttrezzature * 2]; for (int i = 0; i < numeroAttrezzature; ++i) { nuovo[i] = elencoAttrezzature[i]; } elencoAttrezzature = nuovo; } elencoAttrezzature[numeroAttrezzature++] = a; } public boolean rimuovi(Operaio o) { int posizione = cercaInterno(o); if (posizione >= 0) { elencoOperai[posizione] = elencoOperai[numeroOperai - 1]; elencoOperai[numeroOperai - 1] = null; return true; } else { return false; } } public boolean rimuovi(Attrezzatura a) { int posizione = cercaInterno(a); if (posizione >= 0) { elencoAttrezzature[posizione] = elencoAttrezzature[numeroOperai - 1]; elencoAttrezzature[numeroOperai - 1] = null; return true; } else { return false; } } // Metodo per la verifica della corretta composizione della squadra public boolean verifica() { for (int i = 0; i < numeroAttrezzature; ++i) { int qualificaRichiesta = elencoAttrezzature[i].restituisciQualificaRichiesta(); int j = 0; while ((j < numeroOperai) && (elencoOperai[j].restituisciQualifica() != qualificaRichiesta)) { ++j; } // Se ho terminato la scansione degli operai, allora non esiste // un operaio nella squadra con la qualifica richiesta if (j == numeroOperai) { return false; } } // Per tutte le attrezzature è stato trovato almeno un operaio con // la qualifica necessaria ad utilizzarla return true; } // Calcolo dei costi orari (complessivo e per qualifica) public double calcolaCostoOrario() { double somma = 0.0; for (int i = 0; i < numeroOperai; i++) { somma += elencoOperai[i].restituisciPagaOraria(); } for (int i = 0; i < numeroAttrezzature; i++) { somma += elencoAttrezzature[i].restituisciCostoOrario(); } return somma; } public double calcolaCostoOrario(int qualifica) { double somma = 0.0; for (int i = 0; i < numeroOperai; i++) { if (elencoOperai[i].restituisciQualifica() == qualifica) { somma += elencoOperai[i].restituisciPagaOraria(); } } return somma; } // Metodo per la verifica di appartenenza di un operaio // (necessario per le verifiche di GestioneImpresa) public boolean appartiene(Operaio o) { for (int i = 0; i < numeroOperai; ++i) { if (elencoOperai[i].restituisciMatricola() == o.restituisciMatricola()) { return true; } } return false; } // Metodi interni per la ricerca di attrezzature e operai private int cercaInterno(Operaio o) { for (int i = 0; i < numeroOperai; i++) { if (elencoOperai[i].restituisciMatricola() == o.restituisciMatricola()) { return i; } } return -1; } private int cercaInterno(Attrezzatura a) { for (int i = 0; i < numeroAttrezzature; i++) { if (elencoAttrezzature[i].restituisciCodice() == a.restituisciCodice()) { return i; } } return -1; } }