Fondamenti di Informatica 10110 Classe FileInputStream 10110 01100 01100 01011 01011 Le classi FileInputStream e RandomAccessFile F = new FileInputStream(String pathname); oppure fl = new FileInputStream(File f); Semplici Algoritmi di Ordinamento 1 Fondamenti di Informatica - D. Talia - UNICAL Classe FileInputStream 10110 Nel secondo caso l’argomento f è un oggetto della classe File dal quale si parte per creare l’oggetto fl sul quale si potranno eseguire operazioni di lettura tramite i metodi della classe FileInputStream. 2 Fondamenti di Informatica - D. Talia - UNICAL Classe FileOutputStream 10110 01100 01100 01011 01011 Metodi principali read() legge un byte e restituisce una valore compreso tra 0 e 255. read(byte[] b, off, len) legge un numero di byte non superiore a len a partire da off. skip(n) salta i successivi n byte. close() chiude il file. oppure fs = new FileOutputStream(File f, boolean append); Si noti che dopo la chiusura del file non si possono eseguire operazioni, finché non avviene una nuova creazione. Fondamenti di Informatica - D. Talia - UNICAL La classe FileoutputStream definisce oggetti file e metodi per effettuare operazioni di scrittura su file. Creazione/Apertura FileOutputStream fs ; fs = new FileOutputStream(String path, boolean append); FileInputStream : Esempio 01100 01011 01011 Metodi principali write(int b) scrive i primi 8 bit contenuti nell’intero b. write(byte[] b, off, len) scrive un numero di byte uguale a len a partire da off. skip(n) salta i successivi n byte. close() chiude il file. Fondamenti di Informatica - D. Talia - UNICAL 5 4 Fondamenti di Informatica - D. Talia - UNICAL 10110 01100 Il parametro append indica se occorre scrivere dalla fine del file (quando vale true) o dall’inizio (quando vale false). Esempio di creazione con scrittura dalla fine: f = new FileOutputStream("C:/doc/dati.doc", true); 3 Classe FileOutputStream 10110 La classe FileInputStream definisce oggetti file e metodi per effettuare operazioni di lettura su file. Creazione/Apertura FileInputStream fl ; Il programma legge e visualizza i caratteri import java.io.*; presenti in un file e il numero totale di public class LeggiFile caratteri nel file. { static public void main (String argv[]) { int input; boolean finefile= false; int cont = 0; FileInputStream f= new FileInputStream("dati.txt"); while(!finefile) // finchè non si è raggiunta la fine { // del file input = f.read(); if (input == -1) // si è alla fine del file finefile = true; else { System.out.print((char)input + " "); cont++;} // incrementa il contatore } // dei caratteri letti f.close(); System.out.println("Caratteri letti. " + cont); } // chiude il main } // chiude la classe Fondamenti di Informatica - D. Talia - UNICAL 6 1 Classe RandomAccessFile 10110 01011 Classe RandomAccessFile 10110 01100 01100 La classe RandomAccessFile comprende i metodi per la lettura e la scrittura di un file. Questa classe è la più completa per memorizzare dati su memoria secondaria. 01011 Creazione/Apertura RandomAccessFile f; f= new RandomAccessFile(String path, String modo); il modo può essere "r" o "rw" f= new RandomAccessFile(File file, String modo); Esempio di apertura in lettura e scrittura: f = new RandomAccessFile(“risultati.txt, “rw”); 7 Fondamenti di Informatica - D. Talia - UNICAL Classe RandomAccessFile 10110 scrive un byte corrispondente ai primi 8 bit di b. write(byte[] b, off, len) scrive un numero di byte di b uguale a len a partire da off. writeInt(int v) scrive quattro byte corrispondenti a v. writeChar(int v) writeLong(long v) scrive otto byte corrispondenti a v. writeFloat(float v) writeChars(String s) scrive i caratteri della stringa s. scrive due byte corrispondenti a (char) v. scrive quattro byte corrispondenti a v. 8 Ordinamento di una sequenza di elementi 01100 01011 01011 Metodi principali Esistono molti algoritmi di ordinamento. Tutti ricevono in input una sequenza non ordinata di elementi e restituiscono la sequenza ordinata. int readInt() legge un intero. char readChar() legge un carattere. long readLong() legge un long. float readFloat() legge un reale. String readLine() legge una stringa di caratteri fino al carattere di fine riga '\n'. length() restituisce il numero di byte del file. seek(pos) imposta il file pointer alla posizione pos. close() chiude il file. Algoritmi di ordinamento: 9 Fondamenti di Informatica - D. Talia - UNICAL Selection sort selection sort, quick sort, bubble sort, merge sort. Ognuno di questi algoritmi usa un metodo diverso per ordinare una sequenza di elementi. Tutti generano lo stesso risultato (sequenza ordinata), ma alcuni sono più efficienti di altri. 10 Fondamenti di Informatica - D. Talia - UNICAL Selection sort 10110 01100 01011 write(int b) Fondamenti di Informatica - D. Talia - UNICAL 10110 01100 10110 Metodi principali 01100 01011 Ordinamento per selezione (selection sort) Questo algoritmo ordina una sequenza di elementi andando a trovare l’elemento minore e portandolo nella posizione iniziale della sequenza, e l’elemento in posizione iniziale nella posizione occupata del valore minore. 85 | 37 | -3 | 10 | 9 L’algoritmo opera su una sequenza non ordinata come se fosse composta di due sotto-sequenze: la prima ordinata e la seconda non-ordinata, andando a cercare il valore minimo nella sequenza nonordinata e portandolo nella ultima posizione della sequenza ordinata. -3 | 37 | 85 | 10 | 9 Quindi sulla sotto-sequenza non ordinata effettua la stessa operazione fino a che rimane un solo elemento (che è ordinato). -3 | 37 | 85| 10 | 9 -3 | 9 | 85 | 10 | 37 -3 | 9 | 85| 10 | 37 -3 | 9 | 10 | 85 | 37 -3 | 9 | 10| 85 | 37 -3 | 9 | 10 | 37 |85 Quando la sotto-sequenza non ordinata è composta da un solo elemento l’ordinamento è terminato (l’ultimo elemento è il maggiore). Fondamenti di Informatica - D. Talia - UNICAL 11 Fondamenti di Informatica - D. Talia - UNICAL 12 2 Selection Sort in Java 10110 01100 01011 01011 public void ordinaSel(int[] vet) { for (int j = 0; j < vet.length-1; j++) { int temp; int pos_min = j; for (int i = j+1; i < vet.length; i++) if (vet[pos_min] > vet[i]) pos_min = i; if (pos_min != j) { temp = vet[j]; vet[j] = vet[pos_min]; vet[pos_min] = temp; } } // chiude il for } 13 Fondamenti di Informatica - D. Talia - UNICAL Bubble sort 10110 Si usano due indici i e j: j scorre su tutto l’array, mentre i scorre sulla parte dell’array non ordinata. All’inizio si assume che la posizione dell’elemento minore è 0 e dalla posizione 1 fino alla fine si cerca il valore minimo. Se questo è più piccolo dell’elemento nella posizione 0 viene scambiato. Quindi si incrementa l’indice j (che identifica la prima posizione della parte non ordinata) e si esegue nuovamente la ricerca del minimo nella sotto-sequenza rimanente. Alla fine l’elemento che rimarrà nell’ultima posizione dell’array (v[v.length-1]) è il valore maggiore. 14 Fondamenti di Informatica - D. Talia - UNICAL Bubble sort 10110 01100 01011 Selection Sort in Java 10110 01100 01100 01011 Ordinamento per scambio (bubble sort) Questo algoritmo ordina una sequenza di elementi andando a confrontare gli elementi a coppie e scambiandoli di posto se il secondo è minore del primo. Dopo la prima scanzione abbiamo effettuato 4 scambi ma non abbiamo ottenuto la sequenza ordinata. Quindi si riparte dall’inizio a scambiare gli elementi: 37 | -3 | 10 | 9| 85 -3 | 37 | 10| 9 | 85 2a scansione 85 | 37 | -3 | 10 | 9 37 | 85 | -3 | 10 | 9 37 | -3 | 85| 10 | 9 37 | -3 | 10 | 85 | 9 -3 | 10 | 37 | 9 | 85 1a scansione 3a scansione L’algoritmo termina quando dopo aver scandito tutta la sequenza senza che non sia stato effettuato alcuno scambio. In questo caso la sequenza risulta già ordinata. Fondamenti di Informatica - D. Talia - UNICAL 15 Bubble Sort in Java 10110 -3 | 9 | 10 |37 | 85 Se dopo una scansione (in questo caso la 4a scanzione) non sono stati effettuati scambi, gli elementi sono già ordinati e l’ordinamento è completato. Fondamenti di Informatica - D. Talia - UNICAL 16 Bubble Sort e Selection Sort in Java 10110 01100 01011 -3 |10 | 9 |37 | 85 01100 01011 public void ordinaBub(int[] v) { boolean scambio ; int j= v.length-1; do { scambio = false; for (int i=0; i < j ; i++) { int temp; if (v[i] > v[i+1]) { temp = v[i]; v[i] = v[i+1]; v[i+1] = temp; scambio = true; } } // chiude il for j = j-1; } while (scambio == true); } Fondamenti di Informatica - D. Talia - UNICAL Gli algoritmi di ordinamento selection sort e bubble sort sono algoritmi abbastanza semplici, ma non sono i più efficienti. Il quick sort ed il merge sort sono più complessi ma più efficienti perché effettuano un numero minore di scansioni degli elementi di una sequenza. Altri algoritmi di ordinamento : 17 insertion sort heap sort shaker Sort .... Fondamenti di Informatica - D. Talia - UNICAL 18 3