Lo sviluppo software guidato dai test: una esperienza con JUnit

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Lo sviluppo software guidato dai test: una esperienza con JUnit"

Transcript

1 Lo sviluppo software guidato dai test: una esperienza con JUnit Versione del 13 Gennaio 2004 Vittorio Scarano Dipartimento di Informatica ed Applicazioni Università di Salerno, 84081, Baronissi (SA) Italy. 1 Introduzione Tra le metodologie per lo sviluppo di software, è stata proposta recentemente una disciplina dal nome di Extreme Programming (XP), basata sui valori di semplicità, comunicazione, feedback (testing) e coraggio. L obiettivo principale di XP è quello di organizzare lo sviluppo di software in maniera da escludere la realizzazione di prodotti semilavorati diversi da quelli strettament necessari. In un certo senso, la XP si propone di mantenere il processo di produzione all interno dei due binari di efficacia e della controllabilità. Evitare, quindi, di produrre ponderosa documentazione di analisi e di specifiche formali ed, allo stesso tempo, produrre software con un preciso ambiente di controllo e di feedback, sia dal prodotto software stesso (attraverso fasi di testing) che dal committente e utilizzatore del prodotto. Il dibattito all interno della comunitaà scientifica sulla applicabilità di questa metodologia in tutti i contesti è tuttora aperto; probabilmente l utilizzo di questa metodologia all interno di qualsiasi tipo di progetto ed in qualsiasi situazione rappresenta una esagerazione. La utilità diextreme Programming sembra, però, riconosciuta all interno di progetti di dimensione medio-piccole, con scadenze pressanti e necessità di adeguamento a situazioni estremamente dinamiche. All interno delle prassi consolidate(le cosiddette core practices) proposteda XP, particolarmente interessante è la enfasi sullo Sviluppo guidato dai test, il cosiddetto Test-Driven Development. Infatti, anche tra i commenti più criticia cui è soggetta la XP, si riscontra un convergente giudizio positivo sulla pratica di sottoporre il proprio software in maniera strutturata e continua a test di sviluppo 1. 1 Una altra prassi universalmente giudicata in maniera positiva è la cosiddetta pair programming, cioè la programmazione in coppie di programmatori, cosa che permette (da esperimenti effettuati) la produzione di software di maggiore qualità in tempo minore. 1

2 2 UN ESEMPIO DI APPLICAZIONE 1.1 JUnit Lo sviluppo guidato dai test consiste nella tecnica di sviluppare una nuova funzionalità di un programma attraverso la ripetizione continua di un ciclo di produzione molto breve che consiste di due sole fasi: (1) scrittura di un test che il programma, con la nuova funzionalità, deve poter passare, (2) se il test non viene superato con successo, si modifica il codice nella maniera più semplice possibile per far passare il test. Non si può passare ad un nuovo test se non si sono superati tutti i test precedenti. Basando tutto lo sviluppo di software su questi rapidissimi cicli di produzione, è necessario avere a disposizione uno strumento automatico per la realizzazione di questi test. JUnit, lo strumento che andiamo ora a presentare, ha questo scopo. 1.1 JUnit JUnit è un ambiente per scrivere test scritto da Erich Gamma (autore, con altri, dei Design Patterns) e Kent Beck (autore e guru di Extreme Programming). L ambiente è disponibile anche in altri linguaggi (quali C, C++, SmallTalk, etc.) e supporta il programmatore nella definizione di test, nella loro raccolta in suite di test e nella loro esecuzione. JUnit è Open Source Software, rilasciato sotto la licenza IBM Common Public License (versione 0.5). Ha vinto nel 2002 e nel 2003 il premio JavaWorld Editors Choice Awards (ECA) in qualità di migliore strumento per il Performance Monitoring e il Testing in Java. L obiettivo di JUnit è quello di fornire al programmatore un ambiente che permette di sapere in ogni momento e con poco sforzo se il proprio programma ha superato tutti i test oppure no. Questo permette lo sviluppo rapido del software e la possibilità di rilasciare il programma (release) in ogni momento: infatti ad ogni passo dello sviluppo il programma deve passare con successo il 100% dei test definiti. Questo permette di fondere la fase di testing all interno dello sviluppo, cosa particolarmente utile per progetti di dimensione medio-piccole, dove il codice deve essere pronto ad evolvere guidato dalla dinamicità dei requisiti. Le funzionalità di JUnit rappresentano un ambito familiare dove il programmatore riesce a integrare testing e sviluppo in maniera armonica, permettendo di costruire nuovi test basandosi sui vecchi, di integrare insiemi di test sviluppati da altri programmatori e di valutare con estrema semplicità il risultato dei test. 2 Un esempio di applicazione Presentiamo ora un esempio didattico per illustrare il procedimento di sviluppo guidato dai test. L esempio è scritto in Java ed usa JUnit. E stato sviluppato sotto Eclipse, ma altri ambienti (JBuilder ad esempio) offrono simili funzionalità. In ogni modo, la suite di JUnit permette di svincolarsi completamente da qualsiasi ambiente di sviluppo (non che questo sia necessariamente un bene, attenzione!) e di poter essere eseguita lanciando la JVM da linea di comando. Pag. 2

3 2 UN ESEMPIO DI APPLICAZIONE 2.1 Il nostro obiettivo 2.1 Il nostro obiettivo L obiettivo del nostro esempio è quello di scrivere un metodo media() di una classe Calcolatore che deve, semplicemente, calcolare la media dei valori interi passati come parametro in un vettore e restituirla. Il valore restituito èun intero e, come tale, quindi viene soggetto al troncamento della parte decimale. Insomma la media di 1 e 2 sarà 1. Si tratta, evidentemente, di un metodo che ha valenza esclusivamente esemplificativa eppure, anche attraverso l uso della tecnologia JUnit, riserverà qualche sorpresa anche a programmatori di una certa esperienza. 2.2 La tecnica di JUnit Ricordiamo la filosofia di uso di JUnit: non si deve scrivere una linea di codice senza che sia scritto un test che ne verifichi il corretto funzionamento. Questa posizione (estremista ma, come vedremo, utile) serve a prevenire una pratica sconveniente che viene utilizzata spesso: si sviluppa il software rimandando la fase di testing successivamente. Quando poi, sotto la pressione per la consegna del lavoro, si rende necessario affrettare (oppure eliminare del tutto) qualche fase del lavoro, la prima candidata risulta essere la fase di testing. Questa non è, chiaramente, una scelta intelligente 2 da fare. Forzando il programmatore a scrivere prima un test si ottiene, innanzitutto, a fare sì che il codice sviluppato sia necessariamente testato. Poi, si ottiene anche un effetto virtuoso : il programmatore impara a scrivere nuovo codice creando un test che fallisca sul suo vecchio codice e che, quindi, in un certo senso lo metta in crisi. In questa maniera, il software sviluppato risulta essere particolarmente robusto a malfunzionamenti, in quanto la attitudine (che qualcuno potrebbe definire masochista) del programmatore ha cercato di evidenziare tutte le possibili anomalie durante la fase di sviluppo. Quindi, ricordiamo, la produzione avviene per cicli brevissimi che si compongono delle due fasi seguenti: 1. sviluppo di un test che rappresenta una funzionalità che il nostro codice deve poter offrire; 2. se il codice non viene passato, si propone la più semplice soluzione che possa risolvere il problema. Un commento merita la enfasi sulla semplicità della soluzione da proporre. A volte, sembra che questo suggerimento non abbia molto senso: in un certo senso la soluzione può anche cercare di prevenire problemi futuri. Questo, però, rappresenta esattamente il contrario della filosofia dello sviluppo guidato dai test che richiede che ogni parte di codice sia testata. Quindi, scrivere soluzioni complesse significherebbe introdurre codice cui non corrisponde un test da superare e quindi, codice non affidabile. 2 E stato scritto che questo equivale a spegnere la luce proprio quando la notte si fa più buia. Pag. 3

4 2 UN ESEMPIO DI APPLICAZIONE 2.3 Il primo passo 2.3 Il primo passo Iniziamo, secondo il puro stile JUnit, con lo scrivere il nostro codice iniziando dal test. Quindi, dovendo scrivere un metodo che calcoli la media di un vettore di interi, si deve partire dal primo test. Creiamo, quindi una test unit (come classe JUnit) che faccia un test iniziale. La prima stesura del file (che chiameremo CalcolatoreTest.java) sarà seguente: 1 import junit.framework.testcase; 2 public class CalcolatoreTest extends TestCase { 3 Calcolatore c; 4 public void setup(){ 5 c = new Calcolatore(); 6 } 7 public void testiniziale(){ 8 int[] valori = new int[]{0}; 9 assertequals(0, c.media(valori)); 10 } 11 } Come si può notare alla linea 2, la classe CalcolatoreTest eredita dalla classe junit.framework.testcase.testcase. Dopo avere dichiarato come campo della classe una variabile c oggetto istanza della classe Calcolatore (linea 3), definiamo, innanzitutto, un metodo setup() (linee 4-6) che ha lo scopo di approntare gli oggetti che servono per ogni test. Ricordiamo che il metodo setup() viene chiamato prima della esecuzione di ognimetododiquestaclasseilcuinome inizia per test. In questo esempio non abbiamo la necessità di utilizzare il metodo teardown() che viene chiamato alla fine della esecuzione di ogni singolo test. Fedeli alla filosofia del Test-Driven Development, cerchiamo di scrivere il primo test quando ancora non abbiamo scritto neanche una riga della classe Calcolatore. Lacosapuò sembrare paradossale, ma una volta abituati e, specialmente, una volta osservato i vantaggi che questa tecnica porta, diventerà una maniera molto naturale di procedere. Per prima cosa vogliamo che il nostro metodo calcoli correttamente la media Test # 1. La media di 0 è 0. di 0. Quindi, il test che vogliamo scrivere, che chiamiamo, opportunamente, testiniziale() è contenuto alle linee La prima cosa che vogliamo controllare è che questo metodo calcoli correttamente la media di un solo valore, 0, che viene inserito in un vettore di interi chiamato valori dimensionato ad un solo elemento. Questo viene effettuato controllando (linea 9) con assertequals che il risultato restituito dal metodo media() passando valori come parametro sia uguale a 0. A questo punto possiamo passare ad effettuare il primo di una lunga se- rie di test a cui sottoporremo la nostra classe Calcolatore. In effetti, questo primo test risulta davvero estremamente sfortunato: non riusciamo neanche a Pag. 4

5 2 UN ESEMPIO DI APPLICAZIONE 2.3 Il primo passo compilare la classe CalcolatoreTest per il semplicissimo motivo che la classe Calcolatore (cioè laclassecheè da testare) non esiste ancora! Quindi, dobbiamo, come prima cosa creare questa classe con il metodo richiesto media(). Ecco il risultato: 1 public class Calcolatore { 2 public int media(int[] valori) { 3 return 0; 4 } 5 } In effetti, avere scritto questa versione (assolutamente minimalista) della classe Calcolatore, risponde alla precisa indicazione di semplicità che viene dettata dalle prassi della cosiddetta Extreme Programming. In sintesi,il principio richiede al programmatore di scrivere la soluzione più semplice per poter far passare il test. Non si richiede (anzi viene sconsigliato) il cercare di progettare ipotizzando i test futuri a cui il nostro oggetto verrà sottoposto. In effetti, dopo aver scritto queste poche righe di codice il nostro test testiniziale() viene passato: il nostro metodo media() calcola la media di 0. Quando abbiamo finito di festeggiare, possiamo passare al nostro prossimo test. Diciamo che vorremmo che il nostro metodo calcoli correttamente la Test # 2. La media di 1 è 1, media di 0 ma anche la media di 1, 2,..., diciamo almeno fino a 9. Quindi possiamo passare a scrivere il prossimo test che chiamiamo testognivalore(). Ricordiamo che ad ogni passo verranno rieseguiti tutti i test contenuti nel TestCase CalcolatoreTest, quindi alla prossima esecuzione verranno eseguiti sia testiniziale() che testognivalore(), e così via per ogni test che aggiungeremo. Ecco il codice di testognivalore(): quella di 2 è 2, etc. fino a 9. 1 public void testognivalore() { 2 int[] valori = new int[1]; 3 String message; 4 for (int i=0; i<10; i++) 5 { 6 valori[0]=i; 7 message = "Media di "+i; 8 assertequals(message,i, c.media(valori)); 9 } 10 } Come possiamo notare, il test controlla che il valore sia corretto alla linea 8. Lanciamo questo test e, non senza stupore, riscontriamo che il test fallisce quando proviamo a calcolare la media di 1. Pag. 5

6 2 UN ESEMPIO DI APPLICAZIONE 2.3 Il primo passo Bene. Proviamo a fare passare questo test. Ricordiamo l obbligo di mantenere la semplicità nelle modifiche. Quindi la nostra modifica consiste nello scrivere il metodo media() in modo che restituisca come media il primo valore del vettore così: 2 return valori[0]; 3 } Lanciamo il test e notiamo che viene superato. Proviamo a controllare se il nostro metodo calcola la media correttamente Test # 2. La media di -1 è - anche se passiamo un valore negativo. Quindi quello che vogliamo controllare è effettuato dal questo metodo che aggiungiamo a CalcolatoreTest. 1, quella di -2 è -2, etc. fino a public void testvalorenegativo() { 2 int[] valori = new int[1]; 3 String message; 4 for (int i=-9; i<0; i++) 5 { 6 valori[0]=i; 7 message = "Media di "+i; 8 assertequals(message,i, c.media(valori)); 9 } 10 } Eseguiamo il test ed otteniamo che va tutto bene. Questo in generale, non è un bene... Effettivamente, il test che abbiamo scritto sembra inutile (in questo momento) e dobbiamo passare ad un passo successivo, insomma abbiamo preso coraggio ed è ora di passare oltre. Adesso, coraggiosamente cerchiamo di controllare se il metodo media() Test # 3. La media di 1 e 1 è calcola la media correttamente quando passiamo due valori uguali. Questo controllo viene effettuato da questo test: 1, quella di 2 e 2 è 2, etc. fino a 9 e 9. 1 public void testognicoppiaconstessovalore() { 2 int[] valori = new int[2]; 3 String message; 4 for (int i=0; i<10; i++) 5 { 6 valori[0]=i; 7 valori[1]=i; 8 message = "Media di "+i+" e "+i; 9 assertequals(message,i, c.media(valori)); Pag. 6

7 2 UN ESEMPIO DI APPLICAZIONE 2.3 Il primo passo 10 } 11 } Effettuiamo il test e (ancora una volta!) otteniamo che il test funziona. Dobbiamo essere ancora più coraggiosi, proviamo a fare la media di coppie Test # 4. La media tra 7 e 9 è 8. di valori diversi! Quindi scriviamo in CalcolatoreTest il metodo seguente che controlla se media() calcola correttamente la media tra 7 e 9: 1 public void testduevalori(){ 2 int[] valori = new int[]{7,9}; 3 assertequals(8, c.media(valori)); 4 } Lanciamo il test e, finalmente, notiamo che il nostro test fallisce. Finalmente possiamo mettere mano al codice del nostro metodo. La soluzione sembra semplice, no? In effetti, basta restituire il valore della media calcolata sui due interi, semplice. E quello che facciamo: 2 return (valori[0]+ valori[1])/2; 3 } Fatto? Proviamo ad eseguire il test e, con sorpresa, notiamo che non va a buon fine! Infatti questa volta il test che fallisce è uno dei precedenti: la modifica che abbiamo fatto, mentre ha fatto superare l ultimo test, ha però resononpiùcor- retto il testiniziale lanciando la eccezione ArrayIndexOutOfBoundsException. Infatti, basta notare che, quando passiamo un vettore di un solo elemento il risultato dipende solo dal primo, mentre nel caso in cui passiamo due valori (diversi) il risultato dipende da entrambi. E quindi è importante utilizzare all interno del codice la lunghezza del vettore passato come parametro a media(). Unpoco di riflessione ci convince che dobbiamo necessariamente calcolare la media in funzione del numero di elementi passati nel vettore, scrivendo quindi il codice seguente: 2 int sommavalori=0; 3 for (int i=0; i< valori.length ; i++) { 4 sommavalori += valori[i]; 5 } 6 return sommavalori/valori.length; 7 } Ed adesso il nostro metodo funziona correttamente su ciascuno dei test che abbiamo sviluppato. Pag. 7

8 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice Giusto per essere sicuri, facciamo in modo di controllare che la media di Test # 5. La media di tutte le tutte le possibili combinazioni di valori tra 0 e 9 sia corretta. Scriviamo quindi questo metodo: coppie i e j, tra 0 e 9è corretta. 1 public void testognicoppia() { 2 int[] valori = new int[2]; 3 String message; 4 for (int i=0; i<10; i++) 5 for (int j=0; j<10; j++) { 6 valori[0]=i; 7 valori[1]=j; 8 message = "Media di "+i+" e "+j; 9 assertequals(message,(i+j)/2, c.media(valori)); 10 } 11 } Funziona! In effetti, adesso possiamo eseguire tutti i nostri test ed ottenere finalmente che tutti funzionano. Questa stesura del metodo della media rappresenta quella che probabilmente qualsiasi programmatore avrebbe realizzato in partenza. La cosa, adesso, si fa interessante. Come possiamo cercare di costruire un test che questo metodo non riesce a superare? 2.4 Miglioriamo il codice E venuto il momento di testare cosa succede se forniamo al metodo dei dati in maniera non corretta. Ad esempio, un primo controllo che si dovrebbe fare è Test # 6. Con vettore null, quello di controllare che il metodo media() quando viene passata una variabile con valore null restituisca una eccezione IllegalArgumentException. Come al solito, questo viene effettuato scrivendo prima il test, facendolo fallire e poi modificando il codice per far passare il test (e tutti i precedenti). quindi, questo metodo: Creiamo, lancia una eccezione. 1 public void testarraynull() { 2 int[] valori = null ; 3 try { 4 int media = c.media(valori); 5 fail ("Permette un array null!"); 6 } catch (IllegalArgumentException e) { 7 // non colta 8 } 9 } E da notare che alla linea 5 non si fa altro che chiedere al metodo di calcolare la media di un vettore null. Non si controlla il risultato: piuttosto, se la chiamata a media() non genera una eccezione IllegalArgumentException(che Pag. 8

9 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice viene colta dalla catch della linea 6) allora lanciamo una eccezione con il metodo fail(). Eseguiamo il test e vediamo che effettivamente questo fallisce. In effetti, fallisce perché viene generata una eccezione NullPointerException nella riga 3 della ultima stesura del metodo media(), quando si cerca di accedere al campo length di un riferimento null. Come possiamo modificare il codice di media()? Inserendo un controllo (a inizio metodo) che il parametro passato non sia nullo. Ecco fatto: 2 int sommavalori=0; 3 if (valori == null) 4 throw new IllegalArgumentException(); 5 for (int i=0; i< valori.length ; i++) { 6 sommavalori += valori[i]; 7 } 8 return sommavalori/valori.length; 9 } Tutto a posto! Adesso lanciamo i test e vanno a buon fine tutti. metodo media() un vettore di interi che ha lunghezza 0, questo potrebbe creare dei problemi. Vediamo: Continuiamo a cercare di mettere in crisi il metodo media(). Una situazione Test # 7. Con vettore di lun- abbastanza intricata non è stata ancora controllata. Infatti, se passiamo al ghezza 0, lancia una eccezione. 1 public void testarrayvuoto () { 2 int[] valori = new int[0]; 3 try { 4 int media = c.media(valori); 5 fail ("Permette un array di zero elementi!"); 6 } catch (IllegalArgumentException e) { 7 // non colta 8 } Effettivamente ci siamo riusciti! Adesso il nostro metodo media() dà un errore dovuto alla divisione per zero che si effettua alla fine nella linea 8, essendo valori.length pari a 0. Modifichiamo il codice di media() per risolvere questo problema. Supponiamo, ora, che il programmatore compia un errore dovuto alla distrazione cioè che inserisca nella funzione media un controllo che nella condizione dell if contenga l AND logico delle condizioni (valori == null) e (valori.length == 0) invece che l OR logico, come sarebbe corretto. Un errore banale, ma che può capitare. Quindi modifichiamo il codice come segue: Pag. 9

10 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice 2 int sommavalori=0; 3 if (valori == null && valori.length==0) 4 throw new IllegalArgumentException(); 5 for (int i=0; i< valori.length ; i++) { 6 sommavalori += valori[i]; 7 } 8 return sommavalori/valori.length; 9 } A questo punto, il programmatore (che ha compiuto l errore) potrebbe ritenere di aver risolto il problema e passare a fasi successive (magari anche ad altro codice). Invece, la metodologia dello sviluppo guidato dai test, obbliga a controllare che ogni linea di codice superi il 100% dei test elaborati. Quindi, viene lanciato il test che, contrariamente alle aspettative del programmatore, non viene passato. Quindi il programmatore può scoprire l errore e scrive correttamente il codice come segue: 2 int sommavalori=0; 3 if (valori == null valori.length==0) 4 throw new IllegalArgumentException(); 5 for (int i=0; i< valori.length ; i++) { 6 sommavalori += valori[i]; 7 } 8 return sommavalori/valori.length; 9 } Si può controllare il programma e verificare che ora tutti i test (compreso l ultimo) vengono passati con successo. Facciamo un attimo di pausa e commentiamo sulla attitudine di cercare di mettere in crisi il proprio codice per scoprirne debolezze e correggerle. L ultimo test rappresenta un classico esempio di come questa maniera di programmare produca codice più robusto ed affidabile. Un metodo media() come quello che abbiamo elaborato finora gestisce anche casi limite (come, ad esempio, il vettore non nullo ma di zero elementi) che normalmente non ci saremmo posti come problema (da programmatore) se il gioco che stiamo giocando non comportasse l obbligo di cercare di far fallire il nostro stesso programma per correggerne gli errori Non solo, proprio l ultimo esempio ha dimostrato come la abitudine a dover passare un test per ogni linea di codice scritta permette di far scoprire al programmatore distratto alcuni errori che magari sarebbero passati inosservati 3 come quello dell utilizzo di un AND logico al posto di un OR logico. 3 La legge di Murphy garantisce che gli errori si sarebbero evidenziati nella peggiore del- Pag. 10

11 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice Adesso, immaginiamo un altro tipo di casi limite, ad esempio, quando i valori Test # 8. passati all interno del vettore valori risultano essere molto grandi. Quindi, controlliamo che il metodo media() calcoli correttamente la media di un singolo valore che è pari al massimo valore memorizzabile in un intero, che è definito come una costante nella classe wrapper per gli interi: Integer.MAX VALUE. Scriviamo quindi il metodo seguente: 1 public void testmaxvalueintero() { 2 int[] valori = new int[1]; 3 String message; 4 valori[0]=integer.max_value; 5 message = "Media di "+valori[0]; 6 assertequals(message,integer.max_value, c.media(valori)); 7 } Proviamo ad eseguirlo... e funziona. Dobbiamo trovare qualche cosa di meglio. La media di MAX VALUE è MAX VALUE. generata un eccezione ArithmeticException: 1 public void testduemaxvalueintero() { 2 int[] valori = new int[2]; 3 String message; 4 try { 5 valori[0]=integer.max_value; 6 valori[1]=integer.max_value; 7 message = "Media di "+valori[0]+" e "+valori[1]; 8 assertequals(message,integer.max_value, c.media(valori)); 9 fail ("Non riconosce l overflow!"); 10 } catch (ArithmeticException e) { 11 // non colta 12 } 13 } Proviamo a scrivere un test simile ma questa volta che fallisca. Ovviamente, il problema si presenterà se andiamo a calcolare la media di due MAX VALUE. Scriviamo quindi il seguente metodo, prevedendo che in caso di overflow venga Test # 9. La media di 2 valori MAX VALUE è MAX VALUE. Evviva! Il test fallisce! In effetti, si deve trattare il problema dell overflow: stiamo sommando dei valori interi e potremmo oltrepassare la capacità dime- morizzazione di un intero in Java. Due sono i passi che dobbiamo fare: (1) Come si fa a controllare se abbiamo generato un overflow? (2) cosa dobbiamo fare in questo caso? La risposta alla seconda domanda è semplice: si deve lanciare una eccezione di tipo ArithmeticException. La risposta alla prima domanda invece si nasconde nei meandri dei ricordi degli studi effettuati al primo anno del corso di le situazioni in maniera, cioé, da recare simultaneamente il massimo danno al client, allo sviluppatore ed al manager del progetto. Pag. 11

12 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice Laurea in Informatica. Infatti, durante il corso di Architettura, si impara come controllare l overflow di operazioni in complemento a due: quando si sommano due positivi il risultato deve essere positivo, altrimenti vuol dire che abbiamo generato un overflow. A questo punto la maniera per modificare il metodo media() è il seguente: 2 int sommavalori=0; 3 int appoggiosomma; 4 if (valori == null valori.length == 0) 5 throw new IllegalArgumentException(); 6 for (int i=0; i< valori.length ; i++) { 7 appoggiosomma = sommavalori; 8 sommavalori += valori[i]; 9 if (appoggiosomma > 0 && valori[i]> 0 && sommavalori < 0) 10 throw new ArithmeticException(); 11 } 12 return sommavalori/valori.length; 13 } Quello che è stato fatto è semplicemente l inserimento di una nuova variabile intera appoggiosomma che mantiene (linea 7) il valore della variabile sommavalori prima che questa venga modificata (nella linea 8). A questo punto si può controllare se la somma del vecchio valore e del valore che stiamo sommando (valori[i]) ha generato un valore negativo (linea 9). In questo caso lanciamo una eccezione (linea 10). Controlliamo se funziona tutto. Lanciamo il test ed otteniamo che non ci sono errori. Ok, bene. Abbiamo capito in che direzione andare. Dovremmo testare cosa succede anche con MIN VALUE. In questo momento dobbiamo ricordarci di applicare (alla lettera) i dettami del Test-driven Development: si deve modificare il programma nella maniera più semplice per poter passare il test che aveva fallito in precedenza. Quindi, prima di fare qualsiasi modifica che permetta di gestire a vedere se riusciamo a calcolare correttamente la media di due valori negativi molto piccoli (MIN VALUE) con questo metodo: overflow negativi dobbiamo scrivere un test e farlo fallire. Quindi, proviamo Test # 10. La media di 2 valori MIN VALUE è MIN VALUE. 1 public void testdueminvalueintero() { 2 int[] valori = new int[2]; 3 String message; 4 try { 5 valori[0]=integer.min_value; 6 valori[1]=integer.min_value; 7 message = "Media di "+valori[0]+" e "+valori[1]; 8 assertequals(message,integer.min_value/2, c.media(valori)); Pag. 12

13 2 UN ESEMPIO DI APPLICAZIONE 2.4 Miglioriamo il codice 9 fail ("Non riconosce l overflow negativo!"); 10 } catch (ArithmeticException e) { 11 // non colta 12 } 13 } Evviva! Non funziona. Adesso possiamo modificare il programma. E la cosa sembra facile: abbiamo appena tratta il caso dell overflow positivo, basta invertire le condizioni e tratteremo l overflow negativo. Vediamo cosa otteniamo. 2 int sommavalori=0; 3 int appoggiosomma; 4 if (valori == null valori.length == 0) 5 throw new IllegalArgumentException(); 6 for (int i=0; i< valori.length ; i++) { 7 appoggiosomma = sommavalori; 8 sommavalori += valori[i]; 9 if (appoggiosomma > 0 && valori[i]> 0 && sommavalori < 0) 10 throw new ArithmeticException(); 11 if (appoggiosomma < 0 && valori[i]< 0 && sommavalori > 0) 12 throw new ArithmeticException(); 13 } 14 return sommavalori/valori.length; 15 } Bene, sembra fatta. Eseguiamo il test... e non funziona! Perché? Abbiamo semplicemente invertito le condizioni per l overflow positivo? Perché nonva? Un pochino di osservazione vi farà notare che le condizioni di overflow non sono speculari: mentre basta controllare che la somma di due positivi dia un negativo per controllare l overflow positivo, per controllare l overflow negativo si deve controllare anche che il risultato non sia zero! Infatti la somma di due valori MIN VALUE dà come risultato proprio zero! Quindi dobbiamo modificare la linea 11 in modo da controllare anche se il risultato della somma di due negativi dà zero, come segue: 2 int sommavalori=0; 3 int appoggiosomma; 4 if (valori == null valori.length == 0) 5 throw new IllegalArgumentException(); 6 for (int i=0; i< valori.length ; i++) { 7 appoggiosomma = sommavalori; 8 sommavalori += valori[i]; 9 if (appoggiosomma > 0 && valori[i]> 0 && sommavalori < 0) Pag. 13

14 3 CONCLUSIONI 10 throw new ArithmeticException(); 11 if (appoggiosomma < 0 && valori[i]< 0 && sommavalori >= 0) 12 throw new ArithmeticException(); 13 } 14 return sommavalori/valori.length; 15 } Bene, adesso funziona tutto. 3 Conclusioni 3.1 Alcuni commenti La tecnologia relativa a JUnit rappresenta uno strumento molto utile per il supporto al programmatore. Una volta abituatisi allo stile di programmazione (che richiede di partire, in maniera apparentemente irrazionale, dalla scrittura di test per arrivare (solo successivamente) alla scrittura del codice) l aiuto che viene fornito al programmatore risulta notevole. Con questo semplice esempio abbiamo voluto enfatizzare alcuni degli aspetti positivi della tecnica programmazione guidata dai test. In particolare, ritengo opportuno sottolineare come alcune situazioni potenzialmente pericolose sono state evitate proprio con la enfasi sulla attività di test che deve precedere quella di codifica. Ad esempio, possiamo citare il passo del Test n. 10 che verificava la corretta segnalazione di overflow in caso di somma di due valori MIN VALUE. La asimmetria nella condizione di test per l overflow positivo e quella per l overflow negativa sarebbe potuta probabilmente sfuggire anche a programmatori esperti. L obbligo di fornire prima un test specifico, che deve essere passato con successo, ha forzato il programmatore a scrivere un test apparentemente banale e inutile (vale a dire, che doveva sicuramente essere passato) che ha rivelato invece un problema nel codice la cui soluzione ha permesso di creare del codice di maggiore qualità (robusto ed affidabile). Una situazione di errore diversa, ma egualmente pericolosa, si è verificata nel il Test n. 7 che ha permesso di scoprire immediatamente una distrazione del programmatore. Riconoscere immediatamente un errore così banale ha dei notevoli vantaggi pratici ed economici: in quel momento, e trattando quei programmi, il programmatore ha immediatamente riconosciuto e potuto correggere l errore. Immaginate, invece, il tempo che avrebbe impiegato se, magari dopo due mesi, un tester (o peggio, il cliente!) avesse chiamato per dire che A uncertopunto viene generata una eccezione... e non funziona più nulla!. Il programmatore potrebbe impiegare giorni interi per trovare questo semplice errore. Un altro aspetto particolarmente interessante è il fatto che il nostro progetto software compie solamente passi avanti in quanto ad ogni fase di test effettuiamo tutti i test contenuti nella test unit. Questo ha permesso di evidenziare errori Pag. 14

15 RIFERIMENTI BIBLIOGRAFICI 3.2 Note bibliografiche che possono essere stati inseriti successivamente, modificando parti del codice apparentemente non correlate. Dopo aver terminato la descrizione delle meraviglie di questo framework, una parola deve essere spesa per avvertire di alcune limitazioni della tecnologia JUnit. Innanzitutto, si deve assolutamente evitare di considerare codice prodotto da questa tecnica come error free. Diciamo che la tecnologia JUnit facilita la vita di chi deve scrivere codice attraverso una attività ditestcontinuoma che non forza nessuno a scrivere dei test significativi. Insomma, JUnit è uno strumento efficace, ma semplicemente il fatto di usarlo non garantisce la qualità del nostro software: ci vuole anche molta inventiva, esperienza e capacità per usarlo al meglio. Poi, si dovrebbe tenere presente le limitazioni di uso di JUnit all interno di applicazioni. Ad esempio, mentre sembra immediato l uso per le parti della applicazione che compongono la business logic, èpiù difficile immaginarne l uso per la componente di visualizzazione. Anche se qualche sistema di testing automatico per interfacce su palmari esiste, un sistema così completo come JUnit per testare la qualità diunainterfacciasembracomplicatodaottenere. 3.2 Note bibliografiche Molte informazioni su Extreme Programming possono essere trovate su alcuni siti dedicati a questa metodologia di programmazione [1, 2]. Materiale ed informazioni su JUnit si trovano, invece, sul sito ufficiale dedicato a JUnit [3], e nella documentazione che si trova nel package che viene scaricato (nella directory doc). Infine, interessante è il materiale contenuto nella JUnit Frequently Asked Questions [4]. L esempio di uso della media è stato ispirato (almeno per la parte iniziale) da un (più semplice) esempio mostrato in Riferimenti bibliografici [1] [2] [3] JUnit Official Home Page [4] JUnit Frequently Asked Questions Pag. 15

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012 Fondamenti di informatica Oggetti e Java ottobre 2012 1 JUnit JUnit è uno strumento per assistere il programmatore Java nel testing JUnit consente di scrivere test di oggetti e classi Java i test sono

Dettagli

Esercizi su. Funzioni

Esercizi su. Funzioni Esercizi su Funzioni ๒ Varie Tracce extra Sul sito del corso ๓ Esercizi funz_max.cc funz_fattoriale.cc ๔ Documentazione Il codice va documentato (commentato) Leggibilità Riduzione degli errori Manutenibilità

Dettagli

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo. DALLE PESATE ALL ARITMETICA FINITA IN BASE 2 Si è trovato, partendo da un problema concreto, che con la base 2, utilizzando alcune potenze della base, operando con solo addizioni, posso ottenere tutti

Dettagli

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0 Rappresentazione dei numeri I numeri che siamo abituati ad utilizzare sono espressi utilizzando il sistema di numerazione decimale, che si chiama così perché utilizza 0 cifre (0,,2,3,4,5,6,7,8,9). Si dice

Dettagli

Corso di Informatica

Corso di Informatica Corso di Informatica Modulo T3 1-Sottoprogrammi 1 Prerequisiti Tecnica top-down Programmazione elementare 2 1 Introduzione Lo scopo di questa Unità è utilizzare la metodologia di progettazione top-down

Dettagli

Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno

Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno Rappresentazione di numeri Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno Un numero e un entità teorica,

Dettagli

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT.

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT. NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT. Con l utilizzo delle procedure di iscrizione on line la società organizzatrice ha a disposizione tutti

Dettagli

Guida Compilazione Piani di Studio on-line

Guida Compilazione Piani di Studio on-line Guida Compilazione Piani di Studio on-line SIA (Sistemi Informativi d Ateneo) Visualizzazione e presentazione piani di studio ordinamento 509 e 270 Università della Calabria (Unità organizzativa complessa-

Dettagli

f(x) = 1 x. Il dominio di questa funzione è il sottoinsieme proprio di R dato da

f(x) = 1 x. Il dominio di questa funzione è il sottoinsieme proprio di R dato da Data una funzione reale f di variabile reale x, definita su un sottoinsieme proprio D f di R (con questo voglio dire che il dominio di f è un sottoinsieme di R che non coincide con tutto R), ci si chiede

Dettagli

risulta (x) = 1 se x < 0.

risulta (x) = 1 se x < 0. Questo file si pone come obiettivo quello di mostrarvi come lo studio di una funzione reale di una variabile reale, nella cui espressione compare un qualche valore assoluto, possa essere svolto senza necessariamente

Dettagli

GHPPEditor è un software realizzato per produrre in modo rapido e guidato un part program per controlli numerici Heidenhain.

GHPPEditor è un software realizzato per produrre in modo rapido e guidato un part program per controlli numerici Heidenhain. *+33(GLWRU GHPPEditor è un software realizzato per produrre in modo rapido e guidato un part program per controlli numerici Heidenhain. Il programma si basa su un architettura di tasti funzionali presenti

Dettagli

Funzioni in C. Violetta Lonati

Funzioni in C. Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Funzioni - in breve: Funzioni Definizione di funzioni

Dettagli

ESEMPIO 1: eseguire il complemento a 10 di 765

ESEMPIO 1: eseguire il complemento a 10 di 765 COMPLEMENTO A 10 DI UN NUMERO DECIMALE Sia dato un numero N 10 in base 10 di n cifre. Il complemento a 10 di tale numero (N ) si ottiene sottraendo il numero stesso a 10 n. ESEMPIO 1: eseguire il complemento

Dettagli

MAGAZZINO FISCALE (agg. alla rel. 3.4.1)

MAGAZZINO FISCALE (agg. alla rel. 3.4.1) MAGAZZINO FISCALE (agg. alla rel. 3.4.1) Per ottenere valori corretti nell inventario al LIFO o FIFO è necessario andare in Magazzino Fiscale ed elaborare i dati dell anno che ci serve valorizzare. Bisogna

Dettagli

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo Logica Numerica Approfondimento E. Barbuto Minimo Comune Multiplo e Massimo Comun Divisore Il concetto di multiplo e di divisore Considerato un numero intero n, se esso viene moltiplicato per un numero

Dettagli

Test di unità con JUnit4

Test di unità con JUnit4 Test di unità con JUnit4 Richiamo sul test di unità Il test d unità è una metodologia che permette di verificare il corretto funzionamento di singole unità di codice in determinate condizioni. Nel caso

Dettagli

SOMMARIO... 3 INTRODUZIONE...

SOMMARIO... 3 INTRODUZIONE... Sommario SOMMARIO... 3 INTRODUZIONE... 4 INTRODUZIONE ALLE FUNZIONALITÀ DEL PROGRAMMA INTRAWEB... 4 STRUTTURA DEL MANUALE... 4 INSTALLAZIONE INRAWEB VER. 11.0.0.0... 5 1 GESTIONE INTRAWEB VER 11.0.0.0...

Dettagli

Dimensione di uno Spazio vettoriale

Dimensione di uno Spazio vettoriale Capitolo 4 Dimensione di uno Spazio vettoriale 4.1 Introduzione Dedichiamo questo capitolo ad un concetto fondamentale in algebra lineare: la dimensione di uno spazio vettoriale. Daremo una definizione

Dettagli

EXCEL FUNZIONI PRINCIPALI

EXCEL FUNZIONI PRINCIPALI EXCEL FUNZIONI PRINCIPALI Funzione SE() Sintassi: SE(VERIFICA, VALORE SE VERO, VALORE SE FALSO): verifica un valore e ritorna una risposta in base al risultato vero/falso Esempio: =SE(A2=15; "OK"; "NO")

Dettagli

2003.06.16 Il sistema C.R.M. / E.R.M.

2003.06.16 Il sistema C.R.M. / E.R.M. 2003.06.16 Il sistema C.R.M. / E.R.M. Customer / Enterprise : Resource Management of Informations I-SKIPPER è un sistema di CONOSCENZE che raccoglie ed integra INFORMAZIONI COMMERCIALI, dati su Clienti,

Dettagli

Analisi e diagramma di Pareto

Analisi e diagramma di Pareto Analisi e diagramma di Pareto L'analisi di Pareto è una metodologia statistica utilizzata per individuare i problemi più rilevanti nella situazione in esame e quindi le priorità di intervento. L'obiettivo

Dettagli

Capitolo 2. Operazione di limite

Capitolo 2. Operazione di limite Capitolo 2 Operazione di ite In questo capitolo vogliamo occuparci dell operazione di ite, strumento indispensabile per scoprire molte proprietà delle funzioni. D ora in avanti riguarderemo i domini A

Dettagli

MANUALE UTENTE Fiscali Free

MANUALE UTENTE Fiscali Free MANUALE UTENTE Fiscali Free Le informazioni contenute in questa pubblicazione sono soggette a modifiche da parte della ComputerNetRimini. Il software descritto in questa pubblicazione viene rilasciato

Dettagli

INTRODUZIONE I CICLI DI BORSA

INTRODUZIONE I CICLI DI BORSA www.previsioniborsa.net 1 lezione METODO CICLICO INTRODUZIONE Questo metodo e praticamente un riassunto in breve di anni di esperienza e di studi sull Analisi Tecnica di borsa con specializzazione in particolare

Dettagli

Calcolo del Valore Attuale Netto (VAN)

Calcolo del Valore Attuale Netto (VAN) Calcolo del Valore Attuale Netto (VAN) Il calcolo del valore attuale netto (VAN) serve per determinare la redditività di un investimento. Si tratta di utilizzare un procedimento che può consentirci di

Dettagli

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO. 2015 e PARAMETRI2015

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO. 2015 e PARAMETRI2015 COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO. 2015 e PARAMETRI2015 Vicenza, 3 giugno 2015 Gentile cliente, si ricorda che a partire dall aggiornamento PROFIS 2011.1 è stato automatizzato

Dettagli

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS CONTENUTI: CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS Creazione database vuoto Creazione tabella Inserimento dati A) Creazione di un database vuoto Avviamo il programma Microsoft Access. Dal menu

Dettagli

Convertitori numerici in Excel

Convertitori numerici in Excel ISTITUTO DI ISTRUZIONE SUPERIORE G. M. ANGIOY CARBONIA Convertitori numerici in Excel Prof. G. Ciaschetti Come attività di laboratorio, vogliamo realizzare dei convertitori numerici con Microsoft Excel

Dettagli

Dispense di Informatica per l ITG Valadier

Dispense di Informatica per l ITG Valadier La notazione binaria Dispense di Informatica per l ITG Valadier Le informazioni dentro il computer All interno di un calcolatore tutte le informazioni sono memorizzate sottoforma di lunghe sequenze di

Dettagli

Codifica: dal diagramma a blocchi al linguaggio C++

Codifica: dal diagramma a blocchi al linguaggio C++ Codifica: dal diagramma a blocchi al linguaggio C++ E necessario chiarire inizialmente alcuni concetti. La compilazione Il dispositivo del computer addetto all esecuzione dei programmi è la CPU La CPU

Dettagli

MOCA. Modulo Candidatura. http://www.federscacchi.it/moca. moca@federscacchi.it. [Manuale versione 1.0 marzo 2013]

MOCA. Modulo Candidatura. http://www.federscacchi.it/moca. moca@federscacchi.it. [Manuale versione 1.0 marzo 2013] MOCA Modulo Candidatura http://www.federscacchi.it/moca moca@federscacchi.it [Manuale versione 1.0 marzo 2013] 1/12 MOCA in breve MOCA è una funzionalità del sito web della FSI che permette di inserire

Dettagli

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI Indice 1 Le frazioni algebriche 1.1 Il minimo comune multiplo e il Massimo Comun Divisore fra polinomi........ 1. Le frazioni algebriche....................................

Dettagli

10 - Programmare con gli Array

10 - Programmare con gli Array 10 - Programmare con gli Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it

Dettagli

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 10 Correttezza A. Miola Novembre 2007 http://www.dia.uniroma3.it/~java/fondinf1/ Correttezza 1 Contenuti Introduzione alla correttezza

Dettagli

3. Installare Wamp Server

3. Installare Wamp Server E107 WEB SYSTEM Corso on line di progettazione siti dinamici: livello base R E A L I Z Z A Z I O N E D I 3. Installare Wamp Server By e107 Italian Team Sito web:http://www.e107italia.org Contatto: admin@e107italia.org

Dettagli

SISTEMA di GESTIONE QUALITÀ Non Conformità ed Efficacia delle Azioni Correttive Preventive

SISTEMA di GESTIONE QUALITÀ Non Conformità ed Efficacia delle Azioni Correttive Preventive SISTEMA di GESTIONE QUALITÀ Non Conformità ed Efficacia delle Azioni Correttive Preventive Il sistema di gestione della qualità a cui mi riferisco è quello relativo alla norma ISO-9001:2000. Prima di entrare

Dettagli

GUIDA AL CALCOLO DEI COSTI DELLE ATTIVITA DI RICERCA DOCUMENTALE

GUIDA AL CALCOLO DEI COSTI DELLE ATTIVITA DI RICERCA DOCUMENTALE GUIDA AL CALCOLO DEI COSTI DELLE ATTIVITA DI RICERCA DOCUMENTALE L applicazione elaborata da Nordest Informatica e disponibile all interno del sito è finalizzata a fornirvi un ipotesi dell impatto economico

Dettagli

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0)

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0) PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0) (Da effettuare non prima del 01/01/2011) Le istruzioni si basano su un azienda che ha circa 1000 articoli, che utilizza l ultimo

Dettagli

Matematica in laboratorio

Matematica in laboratorio Unità 1 Attività guidate Attività 1 Foglio elettronico Divisibilità tra numeri naturali Costruisci un foglio di lavoro per determinare se a è divisibile per b, essendo a e b due numeri naturali, con a

Dettagli

File, Modifica, Visualizza, Strumenti, Messaggio

File, Modifica, Visualizza, Strumenti, Messaggio Guida installare account in Outlook Express Introduzione Questa guida riguarda di sicuro uno dei programmi maggiormente usati oggi: il client di posta elettronica. Tutti, ormai, siamo abituati a ricevere

Dettagli

Lezioni di Matematica 1 - I modulo

Lezioni di Matematica 1 - I modulo Lezioni di Matematica 1 - I modulo Luciano Battaia 16 ottobre 2008 Luciano Battaia - http://www.batmath.it Matematica 1 - I modulo. Lezione del 16/10/2008 1 / 13 L introduzione dei numeri reali si può

Dettagli

Gestione Turni. Introduzione

Gestione Turni. Introduzione Gestione Turni Introduzione La gestione dei turni di lavoro si rende necessaria quando, per garantire la continuità del servizio di una determinata struttura, è necessario che tutto il personale afferente

Dettagli

IL MIO PRIMO SITO: NEWS

IL MIO PRIMO SITO: NEWS Pagina 1 IL MIO PRIMO SITO: NEWS Sommario IL MIO PRIMO SITO: NEWS...1 Introduzione...2 I Contenitori...2 Creo un Contenitore...3 I Tracciati...4 Creo le Notizie...6 Inserisco il Testo...6 Inserisco un

Dettagli

Soluzione dell esercizio del 2 Febbraio 2004

Soluzione dell esercizio del 2 Febbraio 2004 Soluzione dell esercizio del 2 Febbraio 2004 1. Casi d uso I casi d uso sono riportati in Figura 1. Figura 1: Diagramma dei casi d uso. E evidenziato un sotto caso di uso. 2. Modello concettuale Osserviamo

Dettagli

ISTRUZIONI PER LA GESTIONE BUDGET

ISTRUZIONI PER LA GESTIONE BUDGET ISTRUZIONI PER LA GESTIONE BUDGET 1) OPERAZIONI PRELIMINARI PER LA GESTIONE BUDGET...1 2) INSERIMENTO E GESTIONE BUDGET PER LA PREVISIONE...4 3) STAMPA DIFFERENZE CAPITOLI/BUDGET.10 4) ANNULLAMENTO BUDGET

Dettagli

GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL

GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA BOZZA 23/07/2008 INDICE 1. PERCHÉ UNA NUOVA VERSIONE DEI MODULI DI RACCOLTA DATI... 3 2. INDICAZIONI GENERALI... 4 2.1. Non modificare la struttura dei fogli di lavoro... 4 2.2. Cosa significano

Dettagli

liste di liste di controllo per il manager liste di controllo per il manager liste di controllo per i

liste di liste di controllo per il manager liste di controllo per il manager liste di controllo per i liste di controllo per il manager r il manager liste di controllo per il manager di contr liste di liste di controllo per il manager i controllo trollo per il man liste di il man liste di controllo per

Dettagli

I documenti di www.mistermanager.it. Gli ingredienti per l allenamento per la corsa LE RIPETUTE

I documenti di www.mistermanager.it. Gli ingredienti per l allenamento per la corsa LE RIPETUTE I documenti di www.mistermanager.it Gli ingredienti per l allenamento per la corsa LE RIPETUTE Le Ripetute sono una delle forme di allenamento che caratterizzano i corridori più evoluti, in quanto partono

Dettagli

Progettaz. e sviluppo Data Base

Progettaz. e sviluppo Data Base Progettaz. e sviluppo Data Base! Progettazione Basi Dati: Metodologie e modelli!modello Entita -Relazione Progettazione Base Dati Introduzione alla Progettazione: Il ciclo di vita di un Sist. Informativo

Dettagli

Sistema operativo: Gestione della memoria

Sistema operativo: Gestione della memoria Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Sistema operativo: Gestione della memoria La presente dispensa e

Dettagli

ELENCO CLIENTI FORNITORI Patch1

ELENCO CLIENTI FORNITORI Patch1 ELENCO CLIENTI FORNITORI Patch1 Il pacchetto P15_200ElencoCF_Patch1.exe contiene una serie di aggiornamenti alla procedura di generazione del file contenente l. Download: 1) Assicurarsi di avere una versione

Dettagli

Uso di base delle funzioni in Microsoft Excel

Uso di base delle funzioni in Microsoft Excel Uso di base delle funzioni in Microsoft Excel Le funzioni Una funzione è un operatore che applicato a uno o più argomenti (valori, siano essi numeri con virgola, numeri interi, stringhe di caratteri) restituisce

Dettagli

Soluzione dell esercizio del 12 Febbraio 2004

Soluzione dell esercizio del 12 Febbraio 2004 Soluzione dell esercizio del 12/2/2004 1 Soluzione dell esercizio del 12 Febbraio 2004 1. Casi d uso I casi d uso sono riportati in Figura 1. Figura 1: Diagramma dei casi d uso. 2. Modello concettuale

Dettagli

RAPPRESENTAZIONE GRAFICA E ANALISI DEI DATI SPERIMENTALI CON EXCEL

RAPPRESENTAZIONE GRAFICA E ANALISI DEI DATI SPERIMENTALI CON EXCEL RAPPRESENTAZIONE GRAFICA E ANALISI DEI DATI SPERIMENTALI CON EXCEL 1 RAPPRESENTAZIONE GRAFICA Per l analisi dati con Excel si fa riferimento alla versione 2007 di Office, le versioni successive non differiscono

Dettagli

Portale tirocini. Manuale utente Per la gestione del Progetto Formativo

Portale tirocini. Manuale utente Per la gestione del Progetto Formativo GESTIONE PROGETTO FORMATIVO Pag. 1 di 38 Portale tirocini Manuale utente Per la gestione del Progetto Formativo GESTIONE PROGETTO FORMATIVO Pag. 2 di 38 INDICE 1. INTRODUZIONE... 3 2. ACCESSO AL SISTEMA...

Dettagli

4. Operazioni aritmetiche con i numeri binari

4. Operazioni aritmetiche con i numeri binari I Numeri Binari 4. Operazioni aritmetiche con i numeri binari Contare con i numeri binari Prima di vedere quali operazioni possiamo effettuare con i numeri binari, iniziamo ad imparare a contare in binario:

Dettagli

Il calendario di Windows Vista

Il calendario di Windows Vista Il calendario di Windows Vista Una delle novità introdotte in Windows Vista è il Calendario di Windows, un programma utilissimo per la gestione degli appuntamenti, delle ricorrenze e delle attività lavorative

Dettagli

La manutenzione come elemento di garanzia della sicurezza di macchine e impianti

La manutenzione come elemento di garanzia della sicurezza di macchine e impianti La manutenzione come elemento di garanzia della sicurezza di macchine e impianti Alessandro Mazzeranghi, Rossano Rossetti MECQ S.r.l. Quanto è importante la manutenzione negli ambienti di lavoro? E cosa

Dettagli

Esempi di algoritmi. Lezione III

Esempi di algoritmi. Lezione III Esempi di algoritmi Lezione III Scopo della lezione Implementare da zero algoritmi di media complessità. Verificare la correttezza di un algoritmo eseguendolo a mano. Imparare a valutare le prestazioni

Dettagli

RISOLUTORE AUTOMATICO PER SUDOKU

RISOLUTORE AUTOMATICO PER SUDOKU RISOLUTORE AUTOMATICO PER SUDOKU Progetto Prolog - Pierluigi Tresoldi 609618 INDICE 1.STORIA DEL SUDOKU 2.REGOLE DEL GIOCO 3.PROGRAMMAZIONE CON VINCOLI 4.COMANDI DEL PROGRAMMA 5.ESEMPI 1. STORIA DEL SUDOKU

Dettagli

Corso Eclipse. Prerequisiti. 1 Introduzione

Corso Eclipse. Prerequisiti. 1 Introduzione Corso Eclipse 1 Introduzione 1 Prerequisiti Uso elementare del pc Esecuzione ricerche su Internet Esecuzione download Conoscenza elementare della programmazione 2 1 Cos è Eclipse Eclipse è un IDE (Integrated

Dettagli

Ricerca Operativa Esercizi sul metodo del simplesso. Luigi De Giovanni, Laura Brentegani

Ricerca Operativa Esercizi sul metodo del simplesso. Luigi De Giovanni, Laura Brentegani Ricerca Operativa Esercizi sul metodo del simplesso Luigi De Giovanni, Laura Brentegani 1 1) Risolvere il seguente problema di programmazione lineare. ma + + 3 s.t. 2 + + 2 + 2 + 3 5 2 + 2 + 6,, 0 Soluzione.

Dettagli

Rappresentazione delle informazioni

Rappresentazione delle informazioni Rappresentazione delle informazioni Abbiamo informazioni (numeri, caratteri, immagini, suoni, video... ) che vogliamo rappresentare (e poter elaborare) in un calcolatore. Per motivi tecnologici un calcolatore

Dettagli

Paghe. 131.1.1 Scaglioni. Fascia di reddito. Fascia di reddito

Paghe. 131.1.1 Scaglioni. Fascia di reddito. Fascia di reddito 339 Paghe Capitolo 131 131.1 Suddivisione del reddito in scaglioni....................................... 339 131.1.1 Scaglioni......................................................... 339 131.1.2 Suddivisione

Dettagli

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi. Algoritmi 1 Sommario Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi. 2 Informatica Nome Informatica=informazione+automatica. Definizione Scienza che si occupa dell

Dettagli

Guida alla compilazione on-line delle domande di Dote Scuola A.S. 2013-2014 - per le Famiglie INDICE

Guida alla compilazione on-line delle domande di Dote Scuola A.S. 2013-2014 - per le Famiglie INDICE Guida alla compilazione on-line delle domande di Dote Scuola A.S. 2013-2014 - per le Famiglie INDICE Introduzione... 2 Riconoscimento del soggetto richiedente da parte del sistema... 2 Elenco dei servizi

Dettagli

I TUTORI. I tutori vanno creati la prima volta seguendo esclusivamente le procedure sotto descritte.

I TUTORI. I tutori vanno creati la prima volta seguendo esclusivamente le procedure sotto descritte. I TUTORI Indice Del Manuale 1 - Introduzione al Manuale Operativo 2 - Area Tutore o Area Studente? 3 - Come creare tutti insieme i Tutori per ogni alunno? 3.1 - Come creare il secondo tutore per ogni alunno?

Dettagli

2. Leggi finanziarie di capitalizzazione

2. Leggi finanziarie di capitalizzazione 2. Leggi finanziarie di capitalizzazione Si chiama legge finanziaria di capitalizzazione una funzione atta a definire il montante M(t accumulato al tempo generico t da un capitale C: M(t = F(C, t C t M

Dettagli

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO...

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO... Modulo A Programmiamo in Pascal Unità didattiche 1. Installiamo il Dev-Pascal 2. Il programma e le variabili 3. Input dei dati 4. Utilizziamo gli operatori matematici e commentiamo il codice COSA IMPAREREMO...

Dettagli

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto: Tipi primitivi Il linguaggio Java offre alcuni tipi di dato primitivi Una variabile di tipo primitivo può essere utilizzata direttamente. Non è un riferimento e non ha senso tentare di istanziarla mediante

Dettagli

Database 1 biblioteca universitaria. Testo del quesito

Database 1 biblioteca universitaria. Testo del quesito Database 1 biblioteca universitaria Testo del quesito Una biblioteca universitaria acquista testi didattici su indicazione dei professori e cura il prestito dei testi agli studenti. La biblioteca vuole

Dettagli

GRUPPO MY- social media solutions / Via G.Dottori 94, Perugia / PI 03078860545

GRUPPO MY- social media solutions / Via G.Dottori 94, Perugia / PI 03078860545 Capitolo 3 - Dalla strategia al piano editoriale GRUPPO MY- social media solutions / Via G.Dottori 94, Perugia / PI 03078860545 Social Toolbox ed i contenuti presenti nel seguente documento (incluso a

Dettagli

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante Esercizio 0 Scambio lettere Scrivere la funzione void scambiolettere(char *dest, char *lettere, int p_o_d) che modifichi la stringa destinazione (dest), sostituendone i caratteri pari o dispari (a seconda

Dettagli

Guida alla configurazione della posta elettronica dell Ateneo di Ferrara sui più comuni programmi di posta

Guida alla configurazione della posta elettronica dell Ateneo di Ferrara sui più comuni programmi di posta Guida alla configurazione della posta elettronica dell Ateneo di Ferrara sui più comuni programmi di posta. Configurazione Account di posta dell Università di Ferrara con il Eudora email Eudora email può

Dettagli

S-TRAINER v.1.00 Esempio d uso

S-TRAINER v.1.00 Esempio d uso S-TRAINER v.1.00 Esempio d uso S-TRAINER v.1.00, ovvero il software per la pianificazione e la gestione dell allenamento sportivo. Andiamo a scoprire le potenzialità di questo nuovo software ideato da

Dettagli

INSTALLAZIONE NUOVO CLIENT TUTTOTEL (04 Novembre 2014)

INSTALLAZIONE NUOVO CLIENT TUTTOTEL (04 Novembre 2014) INSTALLAZIONE NUOVO CLIENT TUTTOTEL (04 Novembre 2014) Se la Suite risulta già stata installata e quindi sono già presenti le configurazioni di seguito indicate, si prega di andare direttamente alla fine

Dettagli

II.f. Altre attività sull euro

II.f. Altre attività sull euro Altre attività sull euro II.f È consigliabile costruire modelli in carta o cartoncino di monete e banconote, e farli usare ai bambini in varie attività di classe fin dal primo o al più dal secondo anno.

Dettagli

Progettazione : Design Pattern Creazionali

Progettazione : Design Pattern Creazionali Progettazione : Design Pattern Creazionali Alessandro Martinelli alessandro.martinelli@unipv.it 30 Novembre 2010 Progettazione : Design Pattern Creazionali Aspetti generali dei Design Pattern Creazionali

Dettagli

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12}; ESERCIZI 2 LABORATORIO Problema 1 Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12}; Chiede all'utente un numero e, tramite ricerca

Dettagli

Generazione Automatica di Asserzioni da Modelli di Specifica

Generazione Automatica di Asserzioni da Modelli di Specifica UNIVERSITÀ DEGLI STUDI DI MILANO BICOCCA FACOLTÀ DI SCIENZE MATEMATICHE FISICHE E NATURALI Corso di Laurea Magistrale in Informatica Generazione Automatica di Asserzioni da Modelli di Specifica Relatore:

Dettagli

Appunti di informatica. Lezione 2 anno accademico 2015-2016 Mario Verdicchio

Appunti di informatica. Lezione 2 anno accademico 2015-2016 Mario Verdicchio Appunti di informatica Lezione 2 anno accademico 2015-2016 Mario Verdicchio Sistema binario e logica C è un legame tra i numeri binari (0,1) e la logica, ossia la disciplina che si occupa del ragionamento

Dettagli

Mac Application Manager 1.3 (SOLO PER TIGER)

Mac Application Manager 1.3 (SOLO PER TIGER) Mac Application Manager 1.3 (SOLO PER TIGER) MacApplicationManager ha lo scopo di raccogliere in maniera centralizzata le informazioni piu salienti dei nostri Mac in rete e di associare a ciascun Mac i

Dettagli

Come valutare le caratteristiche aerobiche di ogni singolo atleta sul campo

Come valutare le caratteristiche aerobiche di ogni singolo atleta sul campo Come valutare le caratteristiche aerobiche di ogni singolo atleta sul campo Prima di organizzare un programma di allenamento al fine di elevare il livello di prestazione, è necessario valutare le capacità

Dettagli

LE CIRCOLARI DELL INPS/INPDAP SULLE PENSIONI PIETRO PERZIANI. (Marzo 2012)

LE CIRCOLARI DELL INPS/INPDAP SULLE PENSIONI PIETRO PERZIANI. (Marzo 2012) LE CIRCOLARI DELL INPS/INPDAP SULLE PENSIONI DI PIETRO PERZIANI (Marzo 2012) Dopo le Circolari della F.P. e del MIUR, sono uscite quelle dell Inps/Inpdap, la n. 35 e la n. 37 del 2012; la prima è diretta

Dettagli

WORD 97 SCRIVERE UNA TESI DI LAUREA

WORD 97 SCRIVERE UNA TESI DI LAUREA WORD 97 SCRIVERE UNA TESI DI LAUREA PASSO 1 Per prima cosa pensiamo al formato generale della pagina: i margini richiesti da una tesi sono quasi sempre più ampi di quelli di un testo normale. Apriamo ora

Dettagli

Alessandro Pellegrini

Alessandro Pellegrini Esercitazione sulle Rappresentazioni Numeriche Esistono 1 tipi di persone al mondo: quelli che conoscono il codice binario e quelli che non lo conoscono Alessandro Pellegrini Cosa studiare prima Conversione

Dettagli

Aggiornamento v. 1.14.02 Integrazione al manuale d uso

Aggiornamento v. 1.14.02 Integrazione al manuale d uso 1) Listini: nuovo campo Non aggiornare Questa nuova funzionalità a cosa serve? E utile nel caso vengano pattuiti, con clienti o fornitori, degli accordi fuori dallo standard su determinati articoli. Sostanzialmente

Dettagli

Da dove nasce l idea dei video

Da dove nasce l idea dei video Da dove nasce l idea dei video Per anni abbiamo incontrato i potenziali clienti presso le loro sedi, come la tradizione commerciale vuole. L incontro nasce con una telefonata che il consulente fa a chi

Dettagli

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti) (Esercizi Tratti da Temi d esame degli ordinamenti precedenti) Esercizio 1 L'agenzia viaggi GV - Grandi Viaggi vi commissiona l'implementazione della funzione AssegnaVolo. Tale funzione riceve due liste

Dettagli

Informatica. Rappresentazione dei numeri Numerazione binaria

Informatica. Rappresentazione dei numeri Numerazione binaria Informatica Rappresentazione dei numeri Numerazione binaria Sistemi di numerazione Non posizionali: numerazione romana Posizionali: viene associato un peso a ciascuna posizione all interno della rappresentazione

Dettagli

Tale attività non è descritta in questa dispensa

Tale attività non è descritta in questa dispensa Fondamenti di informatica Oggetti e Java ottobre 2014 1 Nota preliminare L installazione e l uso di Eclipse richiede di aver preliminarmente installato Java SE SDK Tale attività non è descritta in questa

Dettagli

Modulo 4: Ereditarietà, interfacce e clonazione

Modulo 4: Ereditarietà, interfacce e clonazione Modulo 4: Ereditarietà, interfacce e clonazione Argomenti Trattati: Classi, Superclassi e Sottoclassi Ereditarietà Ereditarietà ed Attributi Privati Override super Ereditarietà e Costruttori Polimorfismo

Dettagli

2 Fortino Lugi. Figura Errore. Nel documento non esiste testo dello stile specificato.-3 -- Finestra attiva o nuovo documento

2 Fortino Lugi. Figura Errore. Nel documento non esiste testo dello stile specificato.-3 -- Finestra attiva o nuovo documento 1 Fortino Lugi STAMPA UNIONE OFFICE 2000 Vi sarà capitato sicuramente di ricevere lettere pubblicitarie indirizzate personalmente a voi; ovviamente quelle missive non sono state scritte a mano, ma utilizzando

Dettagli

VALUTATE!VALUTATE!VALUTATE!

VALUTATE!VALUTATE!VALUTATE! VALUTATE! - ATENEO E VALUTAZIONI Un piccolo aggiornamento sullo stato delle Valutazioni della Didattica. VALUTATE!VALUTATE!VALUTATE! Al momento attuale, allo Studente dell Università di Padova, e quindi

Dettagli

Questa guida è realizzata per spiegarvi e semplificarvi l utilizzo del nostro nuovo sito E Commerce dedicato ad Alternatori e Motorini di avviamento.

Questa guida è realizzata per spiegarvi e semplificarvi l utilizzo del nostro nuovo sito E Commerce dedicato ad Alternatori e Motorini di avviamento. Guida all uso del sito E Commerce Axial Questa guida è realizzata per spiegarvi e semplificarvi l utilizzo del nostro nuovo sito E Commerce dedicato ad Alternatori e Motorini di avviamento. Innanzitutto,

Dettagli

Guida alla redazione del Fascicolo XBRL

Guida alla redazione del Fascicolo XBRL o Europeo 2015 22.2.3 BILANCIO EUROPEO 2015 Guida alla redazione del Fascicolo XBRL Versione 22.2.3 Data Marzo 2015 Sommario GUIDA ALLA REDAZIONE DEL FASCICOLO XBRL parte 1 Premessa o Europeo e la gestione

Dettagli

Teoria dei Giochi. Dr. Giuseppe Rose Università degli Studi della Calabria Corso di Laurea Magistrale in Economia Applicata a.a 2011/2012 Handout 2

Teoria dei Giochi. Dr. Giuseppe Rose Università degli Studi della Calabria Corso di Laurea Magistrale in Economia Applicata a.a 2011/2012 Handout 2 Teoria dei Giochi Dr. Giuseppe Rose Università degli Studi della Calabria Corso di Laurea Magistrale in Economia Applicata a.a 2011/2012 Handout 2 1 Concetti risolutivi per i giochi in forma normale I

Dettagli

Obiettivo Principale: Aiutare gli studenti a capire cos è la programmazione

Obiettivo Principale: Aiutare gli studenti a capire cos è la programmazione 4 LEZIONE: Programmazione su Carta a Quadretti Tempo della lezione: 45-60 Minuti. Tempo di preparazione: 10 Minuti Obiettivo Principale: Aiutare gli studenti a capire cos è la programmazione SOMMARIO:

Dettagli

ISO 9001:2015 e ISO 14001:2015

ISO 9001:2015 e ISO 14001:2015 TÜV NORD CERT FAQ ISO 9001:2015 e ISO 14001:2015 Risposte alle principali domande sulle nuove revisioni degli standard ISO 9001 e ISO 14001 Da quando sarà possibile 1 certificarsi in accordo ai nuovi standard?

Dettagli

LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1

LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1 LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1 I CODICI 1 IL CODICE BCD 1 Somma in BCD 2 Sottrazione BCD 5 IL CODICE ECCESSO 3 20 La trasmissione delle informazioni Quarta Parte I codici Il codice BCD

Dettagli