Agenda. Premessa (2/2) Premessa (1/2) Fondamenti di Informatica T2 Modulo 2. Ing. Elena Nardini Università di Bologna A.A.

Documenti analoghi
Fondamenti di Informatica T2 Modulo 2. Corso di Laurea in Ingegneria Informatica Anno accademico 2008/2009. Agenda

ESERCIZIO: CODICE FISCALE

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

Esercizio 1 - Componente Matrice (1/3) Esercizio 1 - Componente Matrice (3/3) Esercizio 1 - Componente Matrice (2/3)

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

Passaggio di parametri

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

ARRAY RESTITUITI DA FUNZIONI

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Esercitazione n 2. Obiettivi

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Corso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Questionario di autovalutazione 4

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Algoritmi di Ricerca. Esempi di programmi Java

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Programmazione con Java

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

Gestione dei compiti

Per gli esercizi sulla algebra booleana, si consiglia di verificare tramite tabelle di verità le equivalenze logiche proposte sulle dispense.

Java Le stringhe. Stringhe

DEFINIZIONE. L unità frazionaria 1n (con n 0) rappresenta una sola delle n parti uguali in cui è stato diviso l intero.

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Esercizi sui metodi. Carla Limongelli. Maggio Esercizi 1

Laboratorio di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Metodi statici. Dichiarazione e chiamata di metodi statici

LICEO STATALE G.P. VIEUSSEUX. Classico, Scientifico e. Scientifico opzione scienze applicate

Laboratorio di programmazione

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Il linguaggio C. Puntatori e dintorni

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

623 = , 413 = , 210 = , 203 =

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

10 STRUTTURE DI CONTROLLO REPEAT E WHILE. Strutture di controllo e variabili strutturate

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Algoritmi di Ricerca. Esempi di programmi Java

0ROWLSOLFD]LRQHH'LYLVLRQH WUDQXPHULUHODWLYL

Scaletta. Cenni di computabilità. Cosa fa un programma? Definizioni (1/2) Definizioni (2/2) Problemi e domande. Stefano Mizzaro 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

La codifica digitale

Corso sul linguaggio Java

Lezione 6 programmazione in Java

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

14 - Metodi e Costruttori

A1. Calcolo in Q. A1.1 Tabelline e potenze. A1.2 Scomposizione in fattori di numeri interi MCD e mcm

18 - Classi parzialmente definite: Classi Astratte e Interfacce

Le basi del linguaggio Java

ESERCIZIARIO DI MATEMATICA

Corso di Laurea Ingegneria Elementi di Informatica. Iterazione. C. Limongelli. Iterazione

Calcolare x n = x x x (n volte)

Corso di Laurea Ingegneria Civile Elementi di Informatica. Esercizi. Carla Limongelli. Esercizi 1

Richiami di Fondamenti di Informatica - 1

C: panoramica. Violetta Lonati

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Informazioni generali

Programmazione a oggetti

Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

Fondamenti di Informatica T-1

Liceo scientifico Pascal Manerbio Esercizi di matematica per le vacanze estive

Introduzione al C++ (continua)

Indice. Prefazione. 3 Oggetti e Java 53

Gestione dinamica della memoria

Definizione di classi

Rappresentazione degli algoritmi

Esonero di Informatica I. Ingegneria Medica

Parte Seconda. Prova di selezione culturale

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Laboratorio di Python

Problemi e algoritmi. Il che cosa ed il come. Il che cosa ed il come. Il che cosa e il come

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Allocazione dinamica

Java: Definire Classi e Creare Oggetti

Lezione 6 Introduzione al C++ Mauro Piccolo

Iterazione. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa E07. C. Limongelli Novembre 2007

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Laboratorio di Programmazione 1 [Java]

Fondamenti di informatica T-1 (A K) Esercitazione 2: Linguaggio Java, basi e controllo del flusso

5 - Istruzioni condizionali

Testing. Esempio. Esempio. Soluzione 1. Fondamenti di Informatica T2 Modulo 2. Università di Bologna A.A. 2008/2009. Come fare???

Frazioni algebriche. Osserviamo che un espressione di questo tipo si ottiene talvolta quando ci si propone di ottenere il quoziente di due monomi.

= < < < < < Matematica 1

Le operazioni fondamentali in R

Convenzioni di chiamata a procedure

Moltiplicazione e Divisione tra numeri relativi

Problemi, algoritmi e oggetti

CORSO ZERO DI MATEMATICA

La classe Object. Ce li ha anche HelloWorld!!!

Array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 11. A. Miola Dicembre 2007

Problemi e algoritmi. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05 (da U. de' Liguoro - Alg. & Spe. 03/04)

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Rappresentazione dei numeri interi in un calcolatore

Compito di Programmazione, 22 marzo 2007 INFORMATICI E MULTIMEDIALI

Transcript:

Università degli Studi di Bologna Facoltà di Ingegneria Fondamenti di Informatica T2 Modulo 2 Agenda 1. Creazione e test di un componente Frazione 2. Calcolo del codice fiscale Corso di Laurea in Ingegneria Informatica Anno accademico 2008/2009 2 Componente Frazione (1/2) Realizzare un componente Frazione come tipo di dato astratto (ADT) progettato come tipo valore (una volta nata il suo valore è costante) dotato di una opportuna interfaccia che consenta di: Interfaccia di base Costruire una nuova frazione partendo da numeratore e denominatore Ottenere numeratore e denominatore della frazione Stabilire se la frazione è uguale ad una data Ottenere una rappresentazione stringa della frazione Ottenere una nuova frazione che rappresenti lo stesso valore in forma ridotta ai minimi termini Componente Frazione (2/2) Interfaccia estesa Somma la frazione con un altra e restituisce una nuova frazione che rappresenta il risultato Moltiplicare la frazione con un altra e restituisce una nuova frazione che rappresenta il risultato Somma di un insieme di frazioni e restituisce una nuova frazione che rappresenta il risultato Moltiplicazione di un insieme di frazioni e restituisce una nuova frazione che rappresenta il risultato e di cui sia opportunamente verificato il funzionamento (il testing non è mai opzionale!!!) Verificare il corretto funzionamento di ogni singolo aspetto del componente. 3 4 Premessa (1/2) Due generiche frazioni n / m e p / q sono equivalenti se vale la seguente uguaglianza: n * q = m * p. ESEMPIO: 1/2 è equivalente a 3/6 e a 9/18 È possibile determinare la forma minima equivalente di una frazione data; cioè è possibile trasformare una frazione in un altra equivalente ed irriducibile. La riduzione ai minimi termini di una frazione si effettua dividendo il numeratore e il denominatore per il loro massimo comun divisore (M.C.D.) ESEMPIO: il M.C.D del numeratore e denominatore della frazione 14/8 è 2 la frazione ridotta ai minimi termini è 7/4 5 Premessa (2/2) Il M.C.D. di due numeri è il più grande numero positivo intero che li divide senza resto È possibile calcolare in modo efficiente il M.C.D. di due numeri utilizzando l algoritmo di Euclide L algoritmo funziona nel seguente modo: 1. Supponiamo che a e b siano i valori di cui calcolare il M.C.D. 2. Se il resto della divisione fra a e b è uguale a zero, b rappresenta il M.C.D. fra a e b 3. Se invece il resto è diverso da 0, si pone a = b e b = resto e si riparte dal punto 2 IMPORTANTE: in Java, il resto della divisione fra due numeri a e b si calcola attraverso l operatore % resto = a%b 6

ADT si possono avere tante entità dello stesso tipo quante ne servono In C occorre definire una struct, un po di funzioni e occorre gestire l allocazione esplicita della memoria tramite malloc/free (funzioni di libreria) per creare nuove entità. In Java occorre definire una classe, un po di metodi e per creare nuove entità è sufficiente usare new (keyword di linguaggio); una volta terminato di usare il componente (nessun riferimento punta più ad esso), il garbage collector si occuperà della deallocazione. 7 Stato del componente: è caratterizzato dai valori di numeratore e denominatore Interi Per costruire ci vuole un costruttore Prende in ingresso sufficienti valori e li imposta nello stato interno per far sì che, una volta costruita, la frazione sia in uno stato consistente almeno numeratore e denominatore altre situazioni? Se la frazione è negativa? È negativo il numeratore o il denominatore? E se sono negativi entrambi? Comunque siano i parametri in ingresso al costruttore, normalizziamo il tutto in modo che il segno sia conservato dal solo numeratore; il denominatore è sempre positivo. 8 Per costruire ci vuole un costruttore Prende in ingresso sufficienti parametri per far si che una volta costruita la frazione sia in uno stato consistente almeno numeratore e denominatore altre situazioni? Una volta che tali valori sono dentro l entità, occorre poterli vedere da fuori Due accessor pubblici (getx) che consentano di ottenere numeratore e denominatore 9 Per cambiare numeratore e denominatore GIAMMAI, sarebbe un suicidio informatico! Sarebbe come dire che il numero 3 vale cinque e non più tre Piuttosto si può fare in modo che un riferimento ad una frazione punti non più alla frazione che vale 1/3 ma ad un altra che vale 1/5 Poi, come si può avere la certezza che la frazione non sia condivisa? Sarebbe un dramma 10 Rappresentazione in stringa (metodo tostring) Un metodo che non ha in ingresso alcun parametro poiché fornisce una rappresentazione dello stato interno dell entità nel caso specifico il suo valore Test di uguaglianza/equivalenza (metodo equals) Un metodo che prende in ingresso un altra frazione ed indica se la frazione presa in ingresso uguale a quella su cui è stato invocato il metodo In questo modo, il concetto di uguaglianza è definito dal programmatore Nel caso specifico uguale significa equivalente 3/12 equivale a ¼ Riduzione ai minimi termini (metodo riduzioneminimitermini) Restituisce una nuova frazione senza alterare quella su cui è stato invocato il metodo Si tratta di valori costanti! Test del componente Verificare il funzionamento di ogni parte Costruire la frazione Verificare che i metodi accesso restituiscano i valori attesi Verificare che il metodo tostring restituisca la rappresentazione attesa Verificare che il metodo riduzioneminimitermini restituisca la frazione attesa Costruire altre frazioni e verificare che il metodo equals si comporti nel modo atteso 11 12

Domanda La funzione relativa al calcolo dell MCD è un metodo della classe Frazione? Si consideri che: Il calcolo dell MCD non serve solo per l ADT Frazione ma anche in altri contesti Il calcolo dell MCD non ha necessità di uno stato Il calcolo dell MCD è un metodo statico e pubblico di una classe di servizio (MyMath) 13 MyMath public final class MyMath public static int mcd(int a, int b) int resto; if (b > a) int tmp = a; a = b; b = tmp; do resto = a % b; a = b; b = resto; while (resto!= 0); return a; 14 Frazione: stato e costruttori public class Frazione private int num, den; public Frazione(int num, int den) boolean negativo = num * den < 0; this.num = negativo? -Math.abs(num) : Math.abs(num); this.den = Math.abs(den); public Frazione(int num) this(num, 1); 15 Frazione: accessors e minterms public int getnum() return this.num; public int getden() return den; public Frazione minterm() int mcd = MyMath.mcd(Math.abs(getNum()), getden()); int n = getnum() / mcd; int d = getden() / mcd; return new Frazione(n, d); 16 Frazione: equals e tostring public boolean equals(frazione f) return f.getnum() * getden() == f.getden() * getnum(); public String tostring() String frazione = ""; int num = getnum(); int den = getden(); if (getden() == 1) frazione += num; else frazione += num + "/" + den; return frazione; 17 public class MyMain MyMain public static void main(string[] args) Frazione frazione1 = new Frazione(3, 12); // 3/12 System.out.println("Creata la frazione " + frazione1); Frazione frazione2 = new Frazione(1, 4); // 1/4 System.out.println("Creata la frazione " + frazione2); Frazione frazione3 = new Frazione(4, 1); // 4 System.out.println("Creata la frazione " + frazione3); Frazione frazioneridotta = frazione1.minterm(); // 1/4 System.out.println("La frazione " + frazione1 + " ridotta ai minimi termini diventa " + frazioneridotta + "\n"); 18

MyMain if (frazione1.equals(frazione2)) // true else frazione2 + " sono equivalenti"); frazione2 + " non sono equivalenti" + "\n"); if (frazione1.equals(frazione3)) // false else frazione3 + " sono equivalenti"); frazione3 + " non sono equivalenti" + "\n"); 19 MyMain (valori negativi) Frazione frazione4 = new Frazione(-1, 8); // -1/8 System.out.println("Creata la frazione " + frazione4); Frazione frazione5 = new Frazione(2, -3); // -2/3 System.out.println("Creata la frazione " + frazione5); Frazione frazione6 = new Frazione(-5, -7); // 5/7 System.out.println("Creata la frazione " +frazione6+"\n"); frazioneridotta = frazione5.minterm(); // -2/3 System.out.println("La frazione " + frazione5 + " ridotta ai minimi termini diventa " +frazioneridotta+ "\n"); 20 Estensione del componente Estendere la classe Frazione con le seguenti funzionalità: Somma di due frazioni Prodotto di due frazioni Somma di un insieme di frazioni Prodotto di un insieme di frazioni Estensione del componente Come sono i metodi che realizzano le estensioni? Somma/Prodotto: vengono invocati su una frazione prendono in ingresso la frazione da sommare/moltiplicare restituiscono una nuova frazione risultato dell operazione Somma/Prodotto di un insieme di frazioni Non ha senso, sebbene sia possibile, che possano essere invocati su una frazione: Per realizzare entrambi i metodi si sfruttino Quale di quelle dell insieme? i metodi somma e prodotto È sensato che siano metodi statici! prendono in ingresso un array di frazioni Restituiscono una nuova frazione risultato dell operazione 21 22 Codice: somma e prodotto Codice: somma e prodotto su array di frazioni public class Frazione public static Frazione sum(frazione[] fs) private int num, den; Frazione tmp = new Frazione(0, 1); // Elemento neutro public Frazione sum(frazione f) for (Frazione f : fs) tmp = tmp.sum(f); int n = this.num * f.den + this.den * f.num; return tmp; int d = this.den * f.den; return new Frazione(n, d); public static Frazione mul(frazione[] fs) public Frazione mul(frazione f) Frazione tmp = new Frazione(1, 1); // Elemento neutro for (Frazione f : fs) int n = this.num * f.num; tmp = tmp.mul(f); int d = this.den * f.den; return tmp; return new Frazione(n, d); 23 24

Trattamento degli errori L attuale contratto di utilizzo prevede che colui che crea la Frazione è responsabile del risultato Calcolo del Codice Fiscale L algoritmo è semplice Creare una frazione con zero al denominatore è possibile ma prima o poi scoppia tutto Non è il massimo poiché il bug, in questo caso, è evidentemente a MONTE della costruzione mentre se ne subiscono le conseguenze a VALLE della stessa quando si usa la frazione Non avendo (ancora) un modo di interrompere brutalmente l esecuzione e di notificare al chiamante il problema, quali soluzioni si possono trovare? Ci vorrebbe qualcosa che verificasse i parametri PRIMA della costruzione Qualcosa cosa? Fatevi venire in mente Qualcosa e anche come Basta conoscere bene gli strumenti Oggi verrà progettata la soluzione In laboratorio la implementerete 25 26 Codice Fiscale: Regole Riprendiamo le regole per il calcolo Cognome: le prime tre consonanti; se non bastano, le vocali; se non bastano ancora, una (o più) X ROSSI RSS SUN SNU WU WUX Nome: la prima, la terza e la quarta consonante; se non ci sono quattro consonanti, si usano le prime tre; se non bastano, si usano le vocali; se non bastano ancora, una (o più) X MARIO MRA GASTONE GTN Codice Fiscale: Regole Anno: le ultime due cifre Mese: A, B, C, D, E, H, L, M, P, R, S, T dove A è Gennaio, T è Dicembre Giorno: Uomini: il numero del giorno Donne: il numero del giorno aumentato di 40 01/02/1978 (maschio) 78B01 25/12/1969 (femmina) 69T65 27 28 Codice Fiscale: Regole Comune di nascita: sigla che si trova su apposite tabelle: Bologna = A944 Reggio E. = H223 Alfonsine (RA) = A191 Jesi (AN) = E388 Ecc Carattere di controllo: Le cifre da 0 a 9 vengono sostituite dalle corrispondenti lettere da A a J si ottiene un codice composto di sole lettere Alle lettere di posto pari viene assegnato un valore da 0 a 25, pari alla loro posizione nell alfabeto (A = 0) Alle lettere di posto dispari viene assegnato un valore in base alla mappa: B A K P L C Q D R E V O S F T 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 G U H M I N J W Z Y X 15 16 17 18 19 20 21 22 23 24 25 Si sommano tutti i valori di cui sopra e si prende il risultato modulo 26 Calcolo del Codice Fiscale: Progetto Per ognuna delle regole di cui sopra è bene predisporre un metodo diverso in modo da suddividere quindi semplificare il problema Tutti questi metodi faranno parte di una classe (è obbligatorio ) Per funzionare hanno bisogno di uno stato? NO! SONO METODI STATICI! Un metodo principale avrà il compito di coordinare il lavoro di tutti gli altri e dovrà essere visibile dall esterno (gli altri possono essere privati) Façade 29 30

Progetto: le mappe Nelle regole relative al mese e al carattere di controllo, viene utilizzata una mappa che consente di recuperare una lettera partendo da un numero Due possibilità: Array: char[] mappa = new char[] B, A, ; Stringa: String mappa = BAK ; In entrambi i casi la posizione di un carattere è il numero con cui si entra nella mappa Array: char c = mappa[numero]; Stringa: char c = mappa.charat(numero); Perché è meglio la stringa dell array? Progetto: le mappe Una mappa speciale deve associare il nome del comune al relativo codice Metodo più stupido: creare una serie di if else per il confronto della stringa in ingresso coi nomi dei comuni gestiti; quando si trova il match, output del codice relativo Metodo meno stupido: creare un array di oggetti che rappresentino delle coppie Comune, Codice 31 32 Progetto: vocali e consonanti Come riconoscere vocali e consonanti? Ipotesi: nome e cognome sono di sole lettere (no altri caratteri) Si può creare un insieme (nel senso dato precedentemente) che contenga le sole vocali (sono di meno!) e supporre che ciò che non è vocale non può che essere consonante Ad esempio: String VOCALI = "AEIOU ; char[] vocali = new char[] A, E, I, O, U ; omocodia? Se c è un problema di omocodia occorre applicare al codice già creato la regola corrispondente sostituendo le cifre numeriche, a partire da destra, con le lettere della mappa che segue: 0 L 1 M 2 N 3 P 4 Q 5 R 6 S 7 T 8 U 9 V Sostituire una cifra alla volta al bisogno Un metodo statico pubblico che prende in ingresso un codice fiscale e ne produce un altro dopo aver sostituito UNA cifra. 33 34 Interfaccia del componente Un metodo statico pubblico calcolacodicefiscale Input: cognome, nome, giorno mese e anno di nascita, comune di nascita, sesso Output: il codice fiscale Un metodo statico pubblico risolviomocodia Input: un codice fiscale Output: un codice fiscale Metodi privati Metodi di utilità isconsonante: prende in ingresso un carattere e restituisce un booleano che indica se si tratta di una consonante Altro?? Metodi di trasformazione calcolacognome: prende in ingresso il cognome e restituisce tre lettere secondo la regola già espressa calcolanome: prende in ingresso il nome e restituisce tre lettere secondo la regola già espressa calcolaanno: prende in ingresso l anno e restituisce le ultime due cifre calcolamese: prende in ingresso il mese e restituisce un carattere calcolagiornosesso: prende in ingresso il giorno e il sesso e restituisce due cifre calcolacomune: prende in ingresso il comune e restituisce i relativo codice calcolacarcontrollo: prende in ingresso TUTTO il codice finora calcolato e restituisce il carattere di controllo corrispondente 35 36

Altri metodi L implementazione è: una regola = un metodo Alcune regole sarebbe bene spezzarle in metodi diversi per fattorizzare e semplificare ulteriormente Esempio: metodo che si occupa di aggiungere vocali o X nella codifica di nome/cognome (è uguale per entrambe le regole) 37