Esercizio: minimo elemento di un file

Esercizio: scrivere un programma che legge degli interi da file (uno per riga) e stampa il minimo valore fra loro.













Soluzione: si usa il metodo del risultato parziale, che estende quello dell'accumulatore.

Nel nostro caso: dovendo trovare il minimo di un insieme di interi, si fa in modo di mantenere in una variabile il minimo fra gli interi letti fino a questo momento

All'inizio, quando nessun intero è stato ancora letto, il minimo non è definito.

Quando però viene letto il primo intero, il minimo parziale è questo valore. Infatti, il minimo parziale è il minimo fra i valori letti fino a questo momento. Ovviamente, se si è letto un solo valore il minimo è questo.

Ogni volta che viene letto un nuovo intero il minimo parziale va aggiornato. Ci basiamo sul fatto che l'attuale minimo parziale contiene il mimino fra tutti i valori letti tranne l'ultimo.

Supponiamo per esempio di aver letto i valori a, b, c e d, che m sia il minimo fra loro, e che venga poi letto e. Come calcolare il minimo fra a...e? Sappiamo che fra m e e può valere:

  1. m≤e; oppure
  2. m>e.

Nel primo caso, il minimo fra a, b, c e d è minore di e, quindi e non è il minimo fra tutti e cinque. Quindi, il minimo è ancora il valore più basso fra i primi quattro, ossia m.

Nel secondo caso, e è minore del minimo fra i primi quattro. Quindi, il minimo fra tutti è cinque è e.

In termini di codice, il valore del minimo fra i primi cinque è m se m≤e ed è invece e se m>e.

Questo vale in generale, a prescindere da quanti valori sono stati letti finora. Dal momento che il minimo parziale va messo in m, possiamo scrivere:

  x=valore letto da file;

  if(m<=e)
    m=m;
  else
    m=x;

Ovviamente, non c'è bisogno di scrivere m=m, per cui semplifichiamo:

  x=valore letto da file;

  if(m>e)
    m=x;

Il programma finale si ottiene semplicemente assegnando a m il valore del primo intero letto da file (minimo parziale quando è stato letto un solo valore) e poi eseguendo il frammento di codice qui sopra ogni volta che si legge un nuovo intero.

Il programma Minimo.java contiene la soluzione del problema. Notare come sia stata fatta una lettura a parte per il primo elemento, e come questa lettura abbia comunque richiesto un controllo: il file poteva essere vuoto, e in questo caso il minimo non è definito dato che non esiste il minimo di un insieme vuoto di elementi.

import java.io.*;

class Minimo {
  public static void main(String args[])
  throws IOException {
    FileReader f;
    f=new FileReader("numeri.txt");

    BufferedReader b;
    b=new BufferedReader(f);

    String s;
    int x;

    s=b.readLine();
    if(s==null)
      return;
    x=Integer.parseInt(s);
    
    int minimo=x;

    while(true) {
      s=b.readLine();
      if(s==null)
        break;

      x=Integer.parseInt(s);
      if(x

L'istruzione return, in questo caso termina l'esecuzione del programma.