Portafoglio.java
Created with JBuilder
class Portafoglio {
  // Dimensione iniziale del portafoglio
  public static final int DIMENSIONE_INIZIALE_PORTAFOGLIO = 1;

  // Attributi
  private String   nome;
  private double   sommaInvestita;
  private Titolo[] elencoTitoli;
  private int      numeroTitoli;

  // Costruttore: inizialmente, la somma investita è 0 e l'elenco
  // dei titoli in portafoglio è vuoto
  public Portafoglio( String nome ) {
    this.nome = nome;
    sommaInvestita = 0;
    elencoTitoli = new Titolo[DIMENSIONE_INIZIALE_PORTAFOGLIO];
    numeroTitoli = 0;
  }

  // Interrogazione del nome
  public String restituisciNome() {
    return nome;
  }

  // Acquisto di un titolo
  public void acquista( Titolo t ) {
    // Il titolo è già in portafoglio?
    int pos = ricercaPosizione(t);
    if (pos < 0) {
      // Il titolo non è in portafoglio, bisogna aggiungerlo
      if (numeroTitoli == elencoTitoli.length) {
        espandiElenco();
      }
      elencoTitoli[numeroTitoli] = t;
      ++numeroTitoli;
    } else { // (pos >= 0)
      // Il titolo è già in portafoglio: incremento la quantità
      // e la somma investita, l'elenco titoli rimane invariato
      int q = elencoTitoli[pos].restituisciQuantità();
      elencoTitoli[pos].impostaQuantità(q + t.restituisciQuantità());
    }
    // Aumenta la somma investita
    sommaInvestita += t.restituisciQuantità() * t.restituisciValore();
  }

  // Vendo un titolo
  public boolean vendita( Titolo t ) {
    // Il titolo è in portafoglio?
    int pos = ricercaPosizione(t);
    if (pos < 0) {
      // Non posso vendere un titolo che non possiedo
      return false;
    } else {
      int qPosseduta = elencoTitoli[pos].restituisciQuantità();
      if (qPosseduta < t.restituisciQuantità()) {
        // Non posso vendere più titoli di quelli che possiedo
        return false;
      }
      elencoTitoli[pos].impostaQuantità(qPosseduta - t.restituisciQuantità());
      // Diminuisci la somma investita
      sommaInvestita -= t.restituisciQuantità() * t.restituisciValore();
      return true;
    }
  }

  // Aggiornamento della quotazione
  public void aggiornaQuotazione( Titolo t ) {
    int pos = ricercaPosizione(t);
    if (pos >= 0) {
      elencoTitoli[pos].impostaValore(t.restituisciValore());
    }
  }

  // Calcolo del numero di titoli presenti in portafoglio per tipo
  public int[] calcolaNumeroPerTipologia() {
    int[] risultato = new int[Titolo.NUMERO_TIPOLOGIE];
    for (int i = 0; i < numeroTitoli; ++i) {
      int tipo = elencoTitoli[i].restituisciTipo();
      risultato[tipo] += elencoTitoli[i].restituisciQuantità();
    }
    return risultato;
  }

  // Calcolo del rendimento del portafoglio
  public double calcolaRendimento() {
    double valoreAttuale = 0.0;
    for (int i = 0; i < numeroTitoli; ++i) {
      valoreAttuale +=
                 elencoTitoli[i].restituisciQuantità() *
                 elencoTitoli[i].restituisciValore();

    }
    return (sommaInvestita - valoreAttuale);
  }

  // Metodi privati (utilizzabili solo dagli altri metodi)
  private void espandiElenco() {
    Titolo[] tmp = new Titolo[numeroTitoli * 2];
    for (int i = 0; i < numeroTitoli; ++i) {
      tmp[i] = elencoTitoli[i];
    }
    elencoTitoli = tmp;
  }
  private int ricercaPosizione( Titolo t ) {
    for( int i = 0; i < numeroTitoli; ++i) {
      String d = elencoTitoli[i].restituisciDenominazione();
      if (d.equals(t.restituisciDenominazione())) {
        return i;
      }
    }
    return -1;
  }

}

Portafoglio.java
Created with JBuilder