Soluzione 5.4

Ecco una possibile soluzione. In questo caso abbiamo scelto di scrivere entrambe le classi, Student e StudentManager, nello stesso file. Ricordiamoci che per compilare questo codice dobbiamo salvarlo in un file chiamato StudentManager.java (ovvero un file omonimo all'unica classe public tra quelle scritte nel file stesso).
import java.util.Scanner;
import java.util.NoSuchElementException;

class Student
{  
    public Student(String name, double wMark, double oMark)
    {   this.name = name;
        this.wMark = wMark;
        this.oMark = oMark;
    }

    public String getName()
    {  return name; }

    public double getWMark()
    {  return wMark; }
   
    public double getOMark()
    {  return oMark; }

    private String name;
    private double wMark;
    private double oMark;
}

//-----------------------------------------------------------------------------

public class StudentManager
{
    public static void main(String[] args)
    {   Scanner in = new Scanner(System.in);
        Student[] students = new Student[1];

        //fase 1: riempimento di un array di studenti
        int count = 0;
        boolean done = false;
        while (!done)
        {   System.out.println("Inserire studente (cognome v.scritto v.orale)");
            try
            {   Student s = readStudent(in); //metodo statico ausiliario
                if (s != null) // sono stati inseriti i dati di uno studente
                {   if (count == students.length) 
                        students = resize(students, 2 * count);
                    students[count] = s;
                    count++;
                }
                else // e` stata inserita una riga vuota (fine inserimento)
                {   System.out.println("Inserimento terminato"); 
                    System.out.println("Hai inserito " + count + " studenti"); 
                    System.out.println("Lunghezza array: " + students.length); 
                    done = true;
                }
            }
            catch(IllegalArgumentException e) //lanciata da readStudent
            { System.out.println("Non hai inserito voti in formato double"); }
            catch(NoSuchElementException e) //lanciata da readStudent
            { System.out.println("Non hai inserito abbastanza token");
            }
        }
        
        //fase 2: gestione dell'archivio di studenti
        done = false;
        while (!done)
        {  
            System.out.println("***\nComando\n-Q per uscire");
            System.out.println("-S per stampare media voti studente\n***");
            String cmd;
            if (!in.hasNextLine() || (cmd =in.nextLine()).equalsIgnoreCase("Q"))
                done = true;
            else if (cmd.equalsIgnoreCase("S"))
            {   System.out.println("Cognome?");
                String name = in.nextLine();
                try{ printAvg(students, name, count); }
                catch(IllegalArgumentException e){ 
                    System.out.println("Nome non trovato!"); }
            }
            else
                System.out.println("Comando errato");
        }
    }

    //----------------- metodi statici ausiliari --------------------

    private static Student readStudent(Scanner in)
    {   // questo metodo non poteva essere scritto usando array paralleli
        String line = in.nextLine();
        if (line.length() == 0)
            return null;  //segnala fine inserimento
        Scanner t = new Scanner(line);
        //gli enunciati seguenti possono lanciare eccezioni...
        String name = t.next(); 
        double wMark = Double.parseDouble(t.next());
        double oMark = Double.parseDouble(t.next());
        return new Student(name, wMark, oMark);
    }

    private static void printAvg(Student[] students, String name, int count)
    {   //stampa la media dei voti dello studente name, se e` nell'elenco
        int i = findName(students, name, count);
        if (i == -1)
            throw new IllegalArgumentException();
        double avg = (students[i].getWMark() + students[i].getOMark()) / 2;
            System.out.println(name + " " + avg);
    }

    private static int findName(Student[] students, String name, int count)
    {   //algoritmo di ricerca lineare sull'array di studenti
        for (int i = 0; i < count; i++)
            if (students[i].getName().equals(name))
                return i;
        return -1;
    }

    private static Student[] resize(Student[] oldv, int newLength)
    {   //ridimensiona l'array di studenti nel solito modo
        if (newLength < 0 || oldv == null)  //controllo delle precondizioni
            throw new IllegalArgumentException();
        Student[] newv = new Student[newLength];
        int count = oldv.length;
        if (newLength < count) 
            count = newLength;
        for (int i = 0; i < count; i++)
            newv[i] = oldv[i];
        return newv;
    }

}