/** * Examination * Classe per illustrare la progettazione orientata agli oggetti * La classe usa una struttura dati ad array paralleli * si sconsiglia l'uso di array paralleli * si veda la lezione relativa * * @author A.Luchetta * @version 7-Nov-2007 * @see Student.java * @see ExaminationOOP.java */ import java.util.Scanner; import java.util.Locale; import java.util.NoSuchElementException; public class Examination { public static void main(String[] args) { final String END_OF_DATA = ""; String line = END_OF_DATA; String[] names = new String[10]; // array paralleli double[] wMarks = new double[10]; double[] oMarks = new double[10]; int size = 0; // array riempiti solo in parte Scanner in = new Scanner(System.in); boolean done = false; while (!done) { if (in.hasNextLine()) line = in.nextLine(); if (line.equalsIgnoreCase(END_OF_DATA)) done = true; else { if (size >= names.length) { names = resize(names, size * 2); wMarks = resize(wMarks, size * 2); oMarks = resize(oMarks, size * 2); } Scanner st = new Scanner(line); st.useLocale(Locale.US); names[size] = st.next(); wMarks[size] = st.nextDouble(); oMarks[size] = st.nextDouble(); size++; } } done = false; while (!done) { System.out.print("Comando: \n- 0 termina il" + " programma \n- 1 calcola la media \ncomando? "); int command = in.nextInt(); if (command == 0) done = true; else if (command == 1) { System.out.print("nome?: "); String name = in.next(); printAverage(names, wMarks, oMarks, name, size); } else System.out.println("Comando errato"); } } private static void printAverage (String[] names, double[] wMarks, double[] oMarks, String name, int count) { int i = findName(names, name, count); if (i == -1) throw new NoSuchElementException("studente non trovato"); else { double avg = (wMarks[i] + oMarks[i]) / 2; System.out.println(name + " " + avg); } } private static int findName(String[] names, String name, int count) { for (int i = 0; i < count; i++) if (names[i].equals(name)) return i; return -1; } /* il solito metodo resize()… */ private static String[] resize(String[] oldArray, int newLength) { int n = oldArray.length < newLength ? oldArray.length : newLength; String[] newArray = new String[n]; for (int i = 0; i < n; i++) newArray[i] = oldArray[i]; return newArray; } /* un altro solito metodo resize()… */ private static double[] resize(double[] oldArray, int newLength) { int n = oldArray.length < newLength ? oldArray.length : newLength; double[] newArray = new double[n]; for (int i = 0; i < n; i++) newArray[i] = oldArray[i]; return newArray; } }