Fondamenti di Informatica Le classi FileInputStream e RandomAccessFile Semplici Algoritmi di Ordinamento Fondamenti di Informatica - D. Talia - UNICAL 1
Classe FileInputStream La classe FileInputStream definisce oggetti file e metodi per effettuare operazioni di lettura su file. Creazione/Apertura FileInputStream fl ; F = new FileInputStream(String pathname); oppure fl = new FileInputStream(File f); 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. Fondamenti di Informatica - D. Talia - UNICAL 2
Classe FileInputStream 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. 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 3
Classe FileOutputStream 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); oppure fs = new FileOutputStream(File f, boolean append); 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); Fondamenti di Informatica - D. Talia - UNICAL 4
Classe FileOutputStream 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
FileInputStream : Esempio import java.io.*; public class LeggiFile { Il programma legge e visualizza i caratteri presenti in un file e il numero totale di 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
Classe RandomAccessFile 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. 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 ); Fondamenti di Informatica - D. Talia - UNICAL 7
Classe RandomAccessFile Metodi principali write(int b) 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) scrive due byte corrispondenti a (char) v. writelong(long v) scrive otto byte corrispondenti a v. writefloat(float v) scrive quattro byte corrispondenti a v. writechars(string s) scrive i caratteri della stringa s. Fondamenti di Informatica - D. Talia - UNICAL 8
Classe RandomAccessFile Metodi principali 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. Fondamenti di Informatica - D. Talia - UNICAL 9
Ordinamento di una sequenza di elementi Esistono molti algoritmi di ordinamento. Tutti ricevono in input una sequenza non ordinata di elementi e restituiscono la sequenza ordinata. Algoritmi di ordinamento: 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. Fondamenti di Informatica - D. Talia - UNICAL 10
Selection sort 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-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 Fondamenti di Informatica - D. Talia - UNICAL 11
Selection sort 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 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 12
Selection Sort in Java 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 } Fondamenti di Informatica - D. Talia - UNICAL 13
Selection Sort in Java 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. Fondamenti di Informatica - D. Talia - UNICAL 14
Bubble sort 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. 1 a scansione 85 37-3 10 9 37 85-3 10 9 37-3 85 10 9 37-3 10 85 9 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 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 2 a scansione -3 10 37 9 85 3 a scansione -3 10 9 37 85-3 9 10 37 85 Se dopo una scansione (in questo caso la 4 a scanzione) non sono stati effettuati scambi, gli elementi sono già ordinati e l ordinamento è completato. Fondamenti di Informatica - D. Talia - UNICAL 16
Bubble Sort in Java 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 17
Bubble Sort e Selection Sort in Java 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 : insertion sort heap sort shaker Sort.... Fondamenti di Informatica - D. Talia - UNICAL 18