Veicolo.java
Created with JBuilder
class Veicolo {
  // Dimensionamento iniziale del numero dei messaggi
  public static final int NUMERO_INIZIALE_MESSAGGI = 1;

  // Tipologia di veicolo
  public static final int LOCOMOTORE = 0;
  public static final int PASSEGGERI = 1;
  public static final int MERCI = 2;

  // Gestione del numero progressivo
  private static int progressivo = 0;

  // Attributi variabili
  private int codice;
  private int tipo;
  private int oreServizio;
  private int numeroServizi;
  private Messaggio[] elencoMessaggi;
  private int numeroMessaggi;

  // Costruttore
  public Veicolo( int tipo ) {
    codice = progressivo++;
    this.tipo = tipo;
    oreServizio = numeroServizi = 0;
    elencoMessaggi = new Messaggio[NUMERO_INIZIALE_MESSAGGI];
    numeroMessaggi = 0;
  }

  // Metodi di interrogazione
  public int restituisciCodice() {
    return codice;
  }
  public int restituisciNumeroMessaggi() {
    return numeroMessaggi;
  }
  public Messaggio restituisciMessaggio( int i ) {
    return elencoMessaggi[i];
  }

  // Aggiunta di un messaggio
  public void aggiungi( Messaggio m ) {
    if (numeroMessaggi == elencoMessaggi.length) {
      Messaggio[] tmp = new Messaggio[numeroMessaggi * 2];
      for (int i = 0; i < numeroMessaggi; ++i) {
        tmp[i] = elencoMessaggi[i];
      }
      elencoMessaggi = tmp;
    }
    elencoMessaggi[numeroMessaggi++] = m;
  }

  // Cancellazione di tutti i messaggi
  public void eliminaMessaggi() {
    numeroMessaggi = 0;
  }

  // Calcolo del numero di messaggi generati da un certo dispositivo
  public int numeroMessaggiGeneratiDa( String dispositivo ) {
    int risultato = 0;
    for (int i = 0; i < numeroMessaggi; ++i) {
      String tmp = elencoMessaggi[i].restituisciDispositivo();
      if (tmp.equals(dispositivo)) {
        ++risultato;
      }
    }
    return risultato;
  }

  // Ricerca di tutti i messaggi generati da un certo dispositivo
  public Messaggio[] messaggiGeneratiDa( String dispositivo ) {
    int num = numeroMessaggiGeneratiDa(dispositivo);
    Messaggio[] risultato = new Messaggio[num];
    int j = 0;
    for (int i = 0; i < numeroMessaggi; ++i) {
      String tmp = elencoMessaggi[i].restituisciDispositivo();
      if (tmp.equals(dispositivo)) {
        risultato[j++] = elencoMessaggi[i];
      }
    }
    return risultato;
  }

  // Calcolo del numero di messaggi per tipologia e con un data severità
  public int[] messaggiConSeverità( int severità ) {
    int[] risultato = new int[Messaggio.NUMERO_TIPOLOGIE];
    for (int i = 0; i < numeroMessaggi; ++i) {
      if (elencoMessaggi[i].restituisciSeverità() == severità) {
        ++risultato[elencoMessaggi[i].restituisciTipo()];
      }
    }
    return risultato;
  }

  // Calcolo del numero di messaggi con severità superiore ad una data
  public int messaggiConSeveritàMaggioreDi( int severità ) {
    int risultato = 0;
    for (int i = 0; i < numeroMessaggi; ++i) {
      if (elencoMessaggi[i].restituisciSeverità() > severità) {
        ++risultato;
      }
    }
    return risultato;
  }


  // Calcolo del numero di dispositivi in condizioni critiche
  public int dispositiviInCondizioneCritica() {
    int risultato = 0;
    // Per evitare di contare più volte i dispositivi in condizione
    // critica, utilizzo un vettore temporaneo che contiene i dispositivi
    // già segnalati come tali.
    String tmp[] = new String[numeroMessaggi];
    int j = 0;
    for (int i = 0; i < numeroMessaggi; ++i) {
      String dispositivo = elencoMessaggi[i].restituisciDispositivo();
      if (!appartiene(dispositivo, tmp, j) && critico(dispositivo)) {
        ++risultato;
        // Registra il dispositivo come critico
        tmp[j++] = dispositivo;
      }
    }
    return risultato;
  }

  // Metodi privati per il calcolo dei dispositivi in cond. critica
  private boolean appartiene( String k, String[] v, int N ) {
    for (int i = 0; i < N; ++i ) {
      if (v[i].equals(k)) {
        return true;
      }
    }
    return false;
  }
  private boolean critico( String k ) {
    for (int i = 0; i < numeroMessaggi; ++i) {
      if (elencoMessaggi[i].restituisciTipo() == Messaggio.ERRORE) {
        // Il messaggio è di errore: posso concludere condizione critica
        return true;
      } else if (elencoMessaggi[i].restituisciTipo() == Messaggio.ALLARME) {
        // Se il messaggio è di allarme, allora...
        if (elencoMessaggi[i].restituisciSeverità() > 5) {
          // ... se la severità dell'allarme è >5 provo a cercare un altro
          // allarme con severità > 5 nel corso della stessa giornata
          int giorno = elencoMessaggi[i].restituisciGiorno();
          // Il ciclo parte da i+1 e termina quando l'elenco messaggi è
          // terminato oppure il giorno è cambiato
          for (int j=i+1;
               ((j < numeroMessaggi) &&
                (elencoMessaggi[j].restituisciGiorno()==giorno));
               j++) {
            if ((elencoMessaggi[j].restituisciTipo() == Messaggio.ALLARME) &&
                elencoMessaggi[j].restituisciSeverità() > 5) {
              return true;
            }
          }
        } else {
          // ... altrimenti provo a cercare un altro allarme nell'arco
          // dei prossimi 10 secondi
          int limite = elencoMessaggi[i].restituisciIstante() + 10;
          // Il ciclo parte da i+1 e termina quando l'elenco messaggi è
          // terminato oppure l'istante di generazione ha superato i 10
          // secondi a partire dal primo allarme
          for (int j=i+1;
               ((j < numeroMessaggi) &&
                (elencoMessaggi[j].restituisciIstante() <= limite));
               j++) {
            if (elencoMessaggi[j].restituisciTipo() == Messaggio.ALLARME) {
              return true;
            }
          }
        }
      }
    }
    return false;
  }


}

Veicolo.java
Created with JBuilder