/* * questo programma risolve il problema posto al quarto punto della * esercitazione 9, svolta il 13/5/2008 */ import java.util.NoSuchElementException; import java.util.Scanner; import java.io.*; import javax.swing.JOptionPane; public class SoluzioneSequenze { /* il metodo analizzaSequenza esegue operazioni che possono generare IOException. Invece di inserire nel corpo del metodo un costrutto try ... catch ..., si puo' dichiarare che il metodo analizzaSequenza a sua volta puo' generare NoSuchElementException. Questo viene fatto aggiungendo "throws NoSuchElementException" dopo l'intestazione del metodo. In questo modo la responsabilita' di raccogliere l'eccezione viene scaricata sul metodo chiamante, in questo caso il metodo main. Quindi il metodo main, quando chiama analizzaSequenza, DEVE includere la chiamata in un blocco try ... catch ... */ public static boolean analizzaSequenza(Scanner fileIn, PrintWriter fileOut) throws NoSuchElementException { Sequenza seq = new Sequenza(); boolean continua=true; while(continua && fileIn.hasNextLine()) { String riga = fileIn.nextLine(); if(riga.charAt(0)=='=') { continua=false; } else { double val = Double.parseDouble(riga); seq.aggiungi(val); } } if(seq.getNumValori()>0) { fileOut.print(seq.getNumValori()); if(seq.getNumValori()==1) fileOut.println(" valore"); else fileOut.println(" valori"); fileOut.println("somma = " + seq.getSomma()); fileOut.println("media = " + seq.getMedia()); fileOut.println("==="); } if(fileIn.hasNextLine()) return false; else return true; } public static void main(String[] args) { /* il metodo main chiede all'utente il nome del file da analizzare (senza estensione: sara' aggiunta da programma l'estensione .txt) e crea i due oggetti attraverso i quali leggera' il file di input e scrivera' il file con il risultato dell'analisi. Il nome del file di output inizia con lo stesso nome del file di input, completato dalla stringa "Risultato.txt". Viene poi chiamato ripetutamente il metodo static analizzaSequenza. Il metodo analizzaSequenza riceve come parametri i due oggetti per leggere dal file di input e scrivere sul file di output, ed ha il compito di analizzare una sequenza di valori rappresentata nel file di input, scrivendo sul file di output il risultato della analisi. La sequenza termina con una riga che inizia con il carattere '='. Il metodo analizzaSequenza restituisce true se durante la lettura dei valori viene raggiunta la fine del file di input. Quando viene raggiunta la fine del file di input si chiude il file di output. */ String nomeFile=JOptionPane.showInputDialog("Il file di input deve avere estensione \".txt\"\n"+ "Digitare il nome del file di input senza estensione"); Scanner fileLettura; PrintWriter fileScrittura; try { fileLettura = new Scanner(new File(nomeFile+".txt")); } catch (FileNotFoundException e) { System.out.println("Il file "+nomeFile+".txt non esiste o non puo essere aperto"); fileLettura=null; } try { fileScrittura = new PrintWriter(nomeFile+"Risultato.txt"); } catch (FileNotFoundException e) { System.out.println("errore in apertura file "+e); fileScrittura=null; } try { boolean fine; do { fine = analizzaSequenza(fileLettura, fileScrittura); } while(fine==false); } catch (NoSuchElementException e) { System.out.println("errore in lettura o scrittura file"); } fileScrittura.close(); System.exit(0); } }