Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAldo Olivieri Modificato 10 anni fa
1
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea in Informatica Università degli Studi La Sapienza (lezioni 6 e 7) funzioni e vettori
2
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Come vengono gestiti progetti complessi Approccio top-down: data la descrizione del progetto si devono individuare dei task che devono essere eseguiti (ed in che ordine) per portare a compimento il progetto Ciascun task avrà bisogno di informazioni iniziali (input) consisterà nelleseguire a sua volta delle azioni per produrre il risultato voluto (output o valore di ritorno del task) Ciascun task avrà bisogno di informazioni iniziali (input) consisterà nelleseguire a sua volta delle azioni per produrre il risultato voluto (output o valore di ritorno del task)
3
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Come vengono gestiti progetti complessi Esempio: a Bob, manager di Telecom viene dato il compito di fare un progetto di reti che consenta a tutte le 400 filiali ? della ditta NastroRosa di essere interconnesse in una rete aziendale. Il compito di Bob è quello di presentare un progetto al cliente (ditta NastroRosa) che soddisfi le specifiche del cliente stesso.
4
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Come vengono gestiti progetti complessi Esempio: Bob riceve in input, dialogando con il cliente, delle informazioni Quanto deve costare il progetto Le caratteristiche delle varie sedi (numero di computer da interconnettere,quantità di dati che devono essere scambiate, quindi capacità che devono avere i link..) etc... etc...
5
Come vengono gestiti progetti complessi Esempio: Sulla base di queste informazioni Bob identifica una serie di passi che devono essere effettuati per svolgere il progetto essere effettuati per svolgere il progetto Prepara un documento che descrivere la caratteristiche tecniche del progetto Chiede quindi a Alan, che è un Technical Manager, dato il documento con le caratteristiche tecniche del progetto, di produrre la soluzione tecnica dettagliata per il progetto Ricevuto da Alan tale soluzione chiederà, in base alla soluzione, al suo collaboratore Kevin di stimare i costi dettagliati del progetto, applicando gli sconti quando possibile. Se i requisiti tecnici ed economici del cliente sono soddisfatti presenterà la soluzione finale al cliente, altrimenti rivedrà il documento di caratteristiche tecniche del progetto (ad esempio cercando di abbassare i costi) e ripeterà literazione
6
Come vengono gestiti progetti complessi Esempio: Sulla base di queste informazioni Bob identifica una serie di passi che devono essere effettuati per svolgere il progetto essere effettuati per svolgere il progetto Prepara un documento che descrivere la caratteristiche tecniche del progetto Chiede quindi a Alan, che è un Technical Manager, dato il documento con le caratteristiche tecniche del progetto, di produrre la soluzione tecnica dettagliata per il progetto Ricevuto da Alan tale soluzione chiederà, in base alla soluzione, al suo collaboratore Kevin di stimare i costi dettagliati del progetto, applicando gli sconti quando possibile. Se i requisiti tecnici ed economici del cliente sono soddisfatti presenterà la soluzione finale al cliente, altrimenti rivedrà il documento di caratteristiche tecniche del progetto (ad esempio cercando di abbassare i costi) e ripeterà literazione Ciascuno di questi task è un compito complesso. Quello che Bob fa è Chiarire il compito che deve essere effettuato (e quindi il tipo di output atteso dallesecuzione del task) Fornire le informazioni (input) necessarie per svolgere il task TASK1 TASK2 Ciascuno di questi task è un compito complesso. Per portarlo a compimento dovrà essere a sua volta strutturato in azioni più elementari. Bob non conosce (e non gli interessa) come verrà svolto in dettaglio tale compito; gli interessa che gli venga fornito loutput richiesto.
7
Come vengono gestiti progetti complessi Esempio: Kevin per stimare i costi dettagliati del progetto Inserisce i dati sulle specifiche del progetto nel sistema aziendale Invoca un tool che calcola il calcolo dei costi Per alcune voci di costo eccessivamente elevate chiede sconti particolari – contatta John, che si occupa di approvare sconti maggiori dello standard con richieste in tal senso. John seguirà le procedure aziendali per decidere se tali sconti possono essere accettati e fornirà i valori rivisti dei costi come output. Bob Gestione gerarchica Approccio top-down per successivi raffinamenti il problema viene scomposto in passi elementari Approccio modulare Ogni task un modulo La scomposizione in passi elementari del task è del tutto trasparente a chi invoca il modulo (chiede che il task venga portato a completamento) KevinAlan tool John Sarà ulteriormente strutturato Ad esempio: se cambia la procedura interna per stimare i prezzi o per concedere sconti questo sarà del tutto trasparente a Kevin e a Bob
8
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Progettazione del SW Partiamo dalle specifiche del problema da risolvere Determiniamo lalgoritmo – Si procede in modo top-down per raffinamenti successivi –Vengono individuati task che devono essere eseguiti Successivamente raffinati in sotto-task Successivamente raffinati in sotto-task Ciascun task prende in input degli argomenti, ha un determinato compito da svolgere, fornisce un valore di ritorno Ciascun task prende in input degli argomenti, ha un determinato compito da svolgere, fornisce un valore di ritorno Concetto di funzione
9
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Funzione Il programmatore può organizzare il codice in funzioni Il programmatore può organizzare il codice in funzioni Ciascuna funzione svolge un task specifico (ad esempio calcolare a b ) Ciascuna funzione svolge un task specifico (ad esempio calcolare a b ) – il task deve essere chiaramente indicato nel nome della funzione (ad esempio potenza) –la funzione prenderà in input una serie di parametri (ad esempio a e b) –eseguirà il codice necessario per portare a compimento il task (as esempio calcolare a b ) – restituirà un valore di ritorno a chi ha invocato la funzione (a b ) tipo_del_valore_di_ritorno nome_funzione (tipo parametro1, …, tipo parametron)
10
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Funzione Le funzioni sono invocate tramite una chiamata a funzione Le funzioni sono invocate tramite una chiamata a funzione Linvocazione della funzione fa sì che la funzione esegua il suo compito (con i valori dei parametri specificati nella invocazione della funzione) e restituisca al chiamante il valore di ritorno. Linvocazione della funzione fa sì che la funzione esegua il suo compito (con i valori dei parametri specificati nella invocazione della funzione) e restituisca al chiamante il valore di ritorno. nome_funzione (argomento1, …,argomenton)
11
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vantaggio delluso delle funzioni Una organizzazione in funzioni rende più facile strutturare un programma complesso Lo stesso task può essere invocato più volte (magari con diversi valori dei parametri) durante lesecuzione del programma Usando le funzioni dovremo scrivere il codice della funzione una volta sola, e semplicemente invocare la funzione tutte le volte che serve Riuso del codice Molte operazioni/task sono di interesse generale (ad esempio lelevazione a potenza). Esistono quindi librerie standard che realizzano tali funzioni. In tal caso basta includere tali librerie (contenenti il codice della funzione) ed invocarla appropriatamente nel programma non occorre sempre reinventare la ruota
12
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vantaggio delluso delle funzioni Modularità Se vogliamo modificare il modo in cui un task viene eseguito basta cambiare il codice della funzione relativa. La modifica è trasparente al resto del programma. Facilità di debugging Strutturare il programma in funzioni, ciascuna con un compito chiaro, semplifica il debugging e permette di isolare le funzioni in cui si verificano errori.
13
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Funzioni di libreria Un esempio: la libreria matematica #include #include FunzioneDescrizioneEsempio sqrt(x) radice quadrata di x sqrt(900.0) restituisce 30.0 sqrt(900.0) 30.0 exp(x) exexexex exp(1.0) 2.71 log(x) logaritmo di x in base e log(2.71) 1 log10(x) logaritmo di x in base 10 log10(100.0) 2 fabs(x) valore assoluto di x fabs(-5.0) 5.0 ceil(x) parte intera superiore ceil (9.2) 10
14
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Funzioni di libreria Un esempio: la libreria matematica #include #include FunzioneDescrizioneEsempio floor(x) parte intera inferiore floor(9.2) 9.0 pow(x,y) xyxyxyxy pow(2,7) 128 fmod(x,y) resto della divisione di x per y (con x e y reali) fmod(13.657,2.333) 1.992 sin(x) seno di x sin(0.0) 0.0 cos(x) coseno di x cos(0.0) 1.0 tan(x) tangente di x (x in radianti) tan(0.0) 0.0
15
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Uso di funzioni #include #include int quadrato (int); int main() { int x; /*stampa i quadrati dei primi 10 interi*/ for (x=1; x<=10; x++) { printf (%d, quadrato(x)); }printf(\n); return 0; } int quadrato (int y) { return y*y; } Invocazione della funzione prototipo della funzione la funzione riceve un valore intero e restituisce un valore intero definizione di funzione return restituisce il controllo al chiamante fornendo un valore di ritorno corpo della funzione Allinizio del corpo della funzione possono essere definite variabili locali (viene loro allocata memoria allentrata nella funzione. Tale memoria viene rilasciata quando si restituisce il controllo al chiamante). I parametri possono essere viste come variabili locali alla funzione in cui viene copiato allentrata nella funzione il valore con cui la funzione viene invocata. parametro formale
16
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vediamo cosa succede in memoria dal main invochiamo printf (%d, quadrato(x)); La variabile x vale 1 Si invoca la funzione quadrato Viene associata una locazione di memoria al parametro y della funzione. In questa locazione viene copiato il valore del parametro attuale (si parla di passaggio per valore dei parametri) … Memoria 1 4357 y parametro attuale
17
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vediamo cosa succede in memoria Viene quindi eseguito il corpo della funzione Si calcola y 2 e si restituisce questo valore al chiamante … Memoria 1 4357 y int quadrato (int y) { return y*y; } restituisce 1 al chiamante (il main) La memoria allocata per il parametro y viene rilasciata
18
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vediamo cosa succede in memoria printf (%d, quadrato(x)); … Memoria 1 4357 y int quadrato (int y) { return y*y; } restituisce 1 al chiamante (il main) restituisce 1 Il valore 1 viene stampato ATTENZIONE:importante che restituisca un intero altrimenti errore
19
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un esempio #include #include int maximum (int, int, int); int main() { int number 1, number2, number 3; printf (inserisci tre valori interi \n); scanf(%d%d%d, &number1,&number2,&number3); printf(il massimo è: %d \n, maximum (number1,number2,number3)); return 0; } int maximum (int x, int y, int z) { int max=x; if (y>max) max=y; if (z >max) max=z; return max; }
20
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Prototipo di una funzione Specifica i tipi ed il numero dei parametri, lordine in cui tali parametri devono essere forniti, il tipo del valore di ritorno Aiuta il compilatore ad individuare errori Una invocazione di funzione che non rispetta quanto indicato dal prototipo di funzione causa un errore sintatico in fase di compilazione tipo_valore_di_ritorno nome_funzione (tipo parametro1,…,tipo parametron); Se void significa che la funzione non restituisce valore int maximum(int,int,int); dice che la funzione maximum prende tre argomenti interi e restituisce un valore di tipo intero Se una chiamata a funzione non riflette il prototipo della funzione (es. meno o piu argomenti, restituisce un tipo diverso, …) si ha un errore sintattico in fase di compilazione a volte potete vedere il nome dei parametri-non solo il tipo- indicato nel prototipo non serve, è una informazione ignorata dal compilatore Cosa succede se un valore di un parametro attuale con cui è invocata una funzione è di tipo diverso da quanto specificato ? (ad esempio double sqrt(double); cosa succede se si invoca su una variabile intera?) coercizione degli argomenti si forza al tipo opportuno Il valore intero viene convertito (promosso) nel corrispettivo valore reale prima di passarne il valore a sqrt
21
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Headers Ciascuna libreria standard ha un header che contiene i prototipi di tutte le funzioni della libreria l header contiene i prototipi delle funzioni, le definizioni di costanti e tipi di dato usati da tali funzioni l header contiene i prototipi delle funzioni, le definizioni di costanti e tipi di dato usati da tali funzioni #include include questi header (proprocessore) Esempi di librerie standard stdio.hlibreria standard di I/O ctype.hfunzioni sui caratteri string.hfunzioni di manipolazione di stringhe math.hfunzioni matematiche Il codice delle funzioni di libreria viene quindi incluso nelleseguibile dal linker Il programmatore può creare delle sue librerie in modo da riusare il codice di funzioni che ha scritto
22
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Chiamata per valore e per riferimento Nei linguaggi di programmazione esistono due modi di invocare una funzione Chiamata per valore Chiamata per valore – quando gli argomenti sono passati per valore si fa una copia del valore dei parametri attuali con cui la funzione viene invocata –Tale copia viene memorizzata nelle locazioni di memoria assegnate ai parametri formali in seguito alla chiamata della funzione –Modifiche effettuate sui valori memorizzati in tali locazioni non hanno impatto sulle variabili della funzione invocante
23
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esempio #include #include int quadrato (int); int main() { int x; /*stampa i quadrati dei primi 10 interi*/ for (x=1; x<=10; x++) { printf (%d, quadrato(x)); }printf(\n); return 0; } int quadrato (int y) {y=y*y; return y; } Una copia del valore di x (che vale 1) viene memorizzata nella locazione di memoria associata al parametro y Viene modificato il valore di y NON subisce alcuna modifica il valore di x Alluscita dalla funzione la memoria allocata a y viene rilasciata.Non rimane traccia sulle modifiche fatte. Rimane solo il valore di ritorno restituito al chiamante
24
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Chiamata per valore e per riferimento Nei linguaggi di programmazione esistono due modi di invocare una funzione Chiamata per riferimento Chiamata per riferimento – consente di modificare il valore della variabile con cui viene invocata la funzione printf (%d, quadrato(x)); Se fosse una chiamata per riferimento Si lavorerebbe direttamente su x Il C consente solo la chiamata di funzioni per valore
25
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio Si scriva un programma che calcoli il minimo di tre interi #include #include int minimo (int,int,int); int main() { int x1,x2,x3; printf (inserisci tre interi \n); scanf (%d %d %d, &x1,&x2,&x3); printf(il minimo dei tre valori e %d \n, minimo(x1,x2,x3)); return 0; } int minimo (int y1, int y2, int y3) { int temp=y1; if (y2 < temp) temp=y2; if (y3 < temp) temp=y3; return temp; } Inserisci tre interi 4 6 3 Il minimo dei tre valori è 3
26
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vediamo cosa succede in memoria Dal main invochiamo: printf(il minimo dei tre valori e %d \n, minimo(x1,x2,x3)); La variabile x1 vale 4, la variabile x2 vale 6, la variabile x3 vale 3 Si invoca la funzione minimo Viene associata una locazione di memoria a ciascuno dei parametri y1, y2, y3 della funzione. In queste locazioni vengono copiati i valori dei parametri attuali. Viene anche allocata una locazione di memoria per la variabile locale temp; … Memoria 4 y1 6 3 y2 y3 temp
27
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vediamo cosa succede in memoria Viene quindi eseguito il corpo della funzione. La variabile temp contiene il minimo dei tre valori y1, y2, y3, ovvero il valore 3 Viene eseguito return temp che ritorna il controllo al main, con valore di ritorno pari a 3 int minimo (int y1, int y2, int y3) { int temp=y1; if (y2 < temp) temp=y2; if (y3 < temp) temp=y3; return temp; } restituisce 3 al chiamante (il main) … Memoria 4 y1 6 3 y2 y3 temp 3 La memoria allocata per i parametri y1,y2, y3 e per temp viene rilasciata
28
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vediamo cosa succede in memoria printf(il minimo dei tre valori e %d \n, minimo(x1,x2,x3)); y restituisce 3 al chiamante (il main) restituisce 3 Il valore 3 viene stampato … Memoria 4 y1 6 3 y2 y3 temp int minimo (int y1, int y2, int y3) { int temp=y1; if (y2 < temp) temp=y2; if (y3 < temp) temp=y3; return temp; } 3
29
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio Un intero è primo se è divisibile solo per 1 e se stesso Si scriva una funzione che determini se un numero è primo Si scriva una funzione che determini se un numero è primo Si usi questa funzione in un programma che determini e stampi tutti i numeri primi tra 1 e 10.000 OSSERVAZIONE: sufficiente testare se lintero x è divisibile o meno per i numeri da 1 a sqrt(x). Perché?
30
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione #include #include int primo (int); int main() { int i; /*stampa i numeri primi tra 1 e 10.000*/ for (i=1; i<=10000; i++) { if (primo (i)==1) printf (%d \n, i); printf (%d \n, i);} return 0; } int primo (int y) { int x; for (x=2; x<=sqrt(y); x++) { if (y % x == 0) return 0; return 0;} return 1; return 1;}
31
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio Un numero intero si dice perfetto se i suoi fattori (incluso 1 ma non il numero stesso) sommano al numero. Ad esempio 6 è un numero perfetto. I suoi fattori sono 1, 2 e 3: 1+2+3=6. Si scriva una funzione perfect che, dato un numero intero, determini se tale numero è perfetto. Si usi questa funzione per determinare e stampare tutti i numeri perfetti tra 1 e 1000.
32
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include #include // Restituisce 1 se linput eun numero perfetto int perfect (int); int main() { int i; /*stampa i numeri perfetti tra 1 e 1.000*/ for (i=1; i<=1000; i++) { if (perfect (i)==1) printf (%d \n, i); printf (%d \n, i);} return 0; } int perfect (int n) { int tmp = n; int tot = 0; int d; for (d = 1; d < n; d++ ) if ( n % d == 0 ) tot += d; if ( tot == n ) return 1; else return 0; }
33
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Gioco dei dadi Il giocatore tira due dadi. Si calcola la somma x dei valori della facce superiori dei due dadi. Se tale somma è 7 o 11 il giocatore vince. Se è 2, 3 o 12 il giocatore perde. Altrimenti x è il punto del giocatore che deve continuare a giocare fino a quando non si ottiene un valore uguale al proprio punto. Se i dadi danno 7 il giocatore perde.
34
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Emulazione del lancio dei dadi int rollDice ( ) { int d1,d2,somma; d1=1+(rand() % 6); d2=1+(rand() % 6); return (d1+d2); } Numero pseudocasuale tra 0 e 5 (scaling) Non ha argomenti Produce in output il risultato di un tiro di dadi Funzione della stdlib.h che produce un numero pseudocasuale tra 0 e RAND_MAX, con RAND_MAX almeno 32767
35
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include #include enum STATO { CONTINUA, VINTO, PERSO}; int rollDice (); int main() { int somma, mio_punto; enum STATO stato_del_gioco; /*stato_del_gioco è una variabile che può assumere valore CONTINUA, VINTO o PERSO*/ srand (time (NULL)); somma=rollDice();switch(somma) …….. ……..} funzione rand, srand Inizializza il seme del generatore pseudocasuale Ritorna il tempo corrente in secondi da un istante dato (funzione della libreria time.h) tipo enumerato: insieme di costanti intere rappresentate da identificatori CONTINUA ha associato il valore 0 VINTO il valore 1 PERSO il valore 2
36
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzioneswitch(somma){ case 7: case 11: stato_del_gioco=VINTO;break; case 2: case 3: case 12: stato_del_gioco=PERSO;break;default:stato_del_gioco=CONTINUA;mio_punto=somma;break;} while (stato_del_gioco == CONTINUA) {somma=rollDice(); if (somma ==mio_punto) stato_del_gioco=VINTO; else if (somma == 7) stato_del_gioco=PERSO;} if (stato_del_gioco == VINTO) printf(VINTO \n); } Se il gioco non si decide al primo tiro di dadi…
37
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007
38
Vettori Un vettore è una struttura dati contiene n elementi dello stesso tipo memorizzati in celle successive di memoria e possibile accedere in tempo costante ad un elemento specificando il suo indice – se vett è il nome del vettore di interi – vett[0] è il valore del primo elemento del vettore – vett[i] è il valore dell i+1 –esimo elemento del vettore indice del vettore Lindice dellelemento dellarray può anche essere specificato da una espressione Ad esempio, se a=5 e b=6 c[a+b] +=2; fa sì che si aggiunga due allelemento con indice 11 (il 12esimo elemento del vettore c)
39
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Definizione di un array Specifica il nome del vettore, il tipo dei suoi elementi ed il numero dei suoi elementi int c[12]; int c[12]; alloca memoria (12 celle consecutive) per un vettore di nome c costituito da 12 interi. memoria c[0]c[1]c[11] 1058 c[1] è uguale a -1 c[11] uguale a 10 x=c[11]/2; assegna a x il valore 5
40
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio Definizione di un array Inizializzazione di un array Uso di un array
41
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio #include #include int main() { int a[10]; /* definisce un array di 10 interi, di nome a*/ int i,x; for (i=0; i<10; i++) { printf (inserisci valore \n); scanf(%d,&x);a[i]=x;} for (i=0; i<10; i++) { printf (%d %d \n, i, a[i]); }} a[0]a[1]a[9] 1058643-326 0 5 1 -1 2 8 … 9 10
42
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio #include #include int main() { int a[10]= {5,-1,8,3,4,6,2,-3,6,10}; int i; for (i=0; i<10; i++) { printf (%d %d \n, i, a[i]); }} Definizione e inizializzazione Se non sono specificati tutti gli elementi quelli restanti sono messi a 0
43
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che prenda da input gli elementi di un array di interi, calcoli e stampi la somma degli elementi dellarray.
44
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione #include #include #define DIM_ARRAY 10 int main() { int a[DIM_ARRAY]; int i, somma; somma = 0; for (i=0; i< DIM_ARRAY; i++) { printf (inserisci elemento array \n); scanf (%d, &x[i]); } for (i=0; i< DIM_ARRAY; i++) { somma +=x[i]; } printf (somma degli elementi dellarray: %d\n, somma); }
45
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che calcoli listogramma dei voti degli studenti in un appello di esame
46
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include #include #define INTERVALLO_VOTI 30 #define NUM_VALORI 100 int main() { int i,j,n; int frequenza [INTERVALLO_VOTI]= {0}; int voti[NUM_VALORI]; printf (inserisci numero di voti delle persone che hanno sostenuto lappello (al massimo 100)\n); scanf (%d, &n); /*in n la dimensione effettiva dellarray voti, deve essere <= NUM_VALORI*/ for (i=0; i<n; i++) { printf (inserisci elemento array \n); scanf (%d, &voti[i]); ++frequenza[voti[i]];} printf (Istogramma \d); for (i=0; i<INTERVALLO_VOTI; i++) { printf (%d, i+1); for (j=0; i<frequenza[j]; j++) printf( * ); printf( * );printf(\n);}} Definizione delle variabili Inizializzazione del vettore
47
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include #include #define INTERVALLO_VOTI 30 #define NUM_VALORI 100 int main() { int i,j,n; int frequenza [INTERVALLO_VOTI]= {0}; int voti[NUM_VALORI]; printf (inserisci numero di voti delle persone che hanno sostenuto lappello (al massimo 100)\n); scanf (%d, &n); /*in n la dimensione effettiva dellarray voti, deve essere <= NUM_VALORI*/ for (i=0; i<n; i++) { printf (inserisci elemento array \n); scanf (%d, &voti[i]); ++frequenza[voti[i]];} printf (Istogramma \d); for (i=0; i<INTERVALLO_VOTI; i++) { printf (%d, i+1); for (j=0; i<frequenza[j]; j++) printf( * ); printf( * );printf(\n);}} Definizione delle variabili Inizializzazione del vettore Inserisci il numero di voti delle persone che hanno sostenuto lappello (al massimo 100) 10 28 18 25 22 18 30 21 22 25 … VOTI INSERITI
48
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include #include #define INTERVALLO_VOTI 30 #define NUM_VALORI 100 int main() { int i,j,n; int frequenza [INTERVALLO_VOTI]= {0}; int voti[NUM_VALORI]; printf (inserisci numero di voti delle persone che hanno sostenuto lappello (al massimo 100)\n); scanf (%d, &n); /*in n la dimensione effettiva dellarray voti, deve essere <= NUM_VALORI*/ for (i=0; i<n; i++) { printf (inserisci elemento array \n); scanf (%d, &voti[i]); ++frequenza[voti[i]];} printf (Istogramma \d); for (i=0; i<INTERVALLO_VOTI; i++) { printf (%d, i+1); for (j=0; i<frequenza[j]; j++) printf( * ); printf( * );printf(\n);}} Definizione delle variabili Inizializzazione del vettore Istogramma 1 2 … 18 * * 19 20 21 * 22 * * 23 24 25 * * * 26 27 28 * 29 30 * Specifica il numero di studenti che hanno conseguito un determinato voto
49
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Stringhe Una stringa è una sequenza di caratteri che termina con \0. Una stringa può quindi essere vista come un vettore di caratteri che termina con un carattere predefinito di fine stringa. Inizializzazione char string1[ ] = alunni; \0alunni Il numero di celle da allocare al vettore viene decisa in base alla dimensione della stringa con cui si inizializza il vettore ALTERNATIVA PER LINIZIALIZZAZIONE {a,l,u,n,n,i,\0} char string1[ ]= {a,l,u,n,n,i,\0}
50
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Stringhe Definizione char string2 [20]; e inizializzazione: scanf(%s, string2); Stampa di una stringa printf (%s \n, string2); \0alunni Legge caratteri da input fino al primo spazio e li inserisce in string2 aggiungendo uno \0 Il vettore deve essere sufficientemente lungo da contenere la stringa inserita Stampa ciò che è contenuto in string2 fino a \0 (escluso)
51
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Come si passa un vettore ad una funzione int v[50]; int somma_vett(int vett[ ],int n) { int i; int somma=0; for (i=0; i<n; i++) somma +=vett[i]; return somma; } nome del vettore Numero di elementi validi che si vogliono considerare Restituisce la somma degli elementi di un vettore Chiamata alla funzione x=somma_vett(v,num);
52
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Come si passa un vettore ad una funzione I vettori di fatto vengono passati per riferimento Il nome del vettore è di fatto lindirizzo della prima locazione di memoria allocata al vettore Nel parametro attuale si copia tale indirizzo. Nella funzione si lavora quindi sulle celle allocate al vettore nella funzione chiamante. Modifiche fatte ai valori degli elementi del vettore permangono alluscita dalla funzione vett &vett[0] sono equivalenti
53
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un esempio… Si scriva una funzione che data una stringa sostituisca tutte le cifre che compaiono nella stringa con il carattere *. char str2[DIM_STRINGA]; inizializzazione stringa void modifica_stringa(int str[ ]); { int i=0; while (str [i] != \0) { if (str[ i] >= 0 && str[i] = 0 && str[i] <= 9) str[ i] = *; i=i+1;}} nella funzione chiamante Allinizio del file prototipo di questa funzione La funzione non restituisce valori str indica la locazione di memoria del primo elemento del vettore I vettori sono passati per riferimento Copiare interi vettori (che potrebbe significare Molti dati) ad ogni chiamata a funzione può essere molto inefficiente Importante sempre mettere il controllo sul carattere di fine stringa I caratteri sono rappresentati con interi – codice ASCII Verifica se str[i] è una cifra I singoli elementi del vettore vengono invece passati per valore
54
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Chiamata a funzione modifica_stringa(str2); al1a\0 1415 str2 str2 è lindirizzo di memoria in cui si memorizza str2[0] 1415 1415 str2 è stata definita ed Inzializzata nella funzione chiamante (che in questo caso è il main())
55
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Si entra nella funzione Viene allocata memoria per la variabile locale intera i Viene copiato lindirizzo di memoria in cui è memorizzato il primo elemento del vettore al1a\0 1415 str2 str2 è stata definita ed Inzializzata nella funzione chiamante (che in questo caso è il main()) i 2500 Allocata memoria allentrata nella funzione
56
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Si comincia ad eseguire il corpo della funzione al1a\0 1415 str2 str2 è stata definita ed Inzializzata nella funzione chiamante (che in questo caso è il main()) i 2500 void modifica_stringa(int str[ ]); { int i=0; while (str [i] != \0) { if (str[ i] >= 0 && str[i] = 0 && str[i] <= 9) str[ i] = *; i=i+1;}} str[0] è il primo elemento del vettore str2; vale a È quindi diverso da \0 str str[0] non è una cifra. Quindi Si incrementa il valore di i e si ritorna allinizio del Ciclo. 01
57
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Si comincia ad eseguire il corpo della funzione al1a\0 1415 str2 str2 è stata definita ed Inzializzata nella funzione chiamante (che in questo caso è il main()) i 2500 void modifica_stringa(int str[ ]); { int i=0; while (str [i] != \0) { if (str[ i] >= 0 && str[i] = 0 && str[i] <= 9) str[ i] = *; i=i+1;}} str[1] è il secondo elemento del vettore str2; vale l È quindi diverso da \0 str str[1] non è una cifra. Quindi Si incrementa il valore di i e si ritorna allinizio del Ciclo. 12
58
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Si comincia ad eseguire il corpo della funzione al1a\0 1415 str2 str2 è stata definita ed Inzializzata nella funzione chiamante (che in questo caso è il main()) i 2500 void modifica_stringa(int str[ ]); { int i=0; while (str [i] != \0) { if (str[ i] >= 0 && str[i] = 0 && str[i] <= 9) str[ i] = *; i=i+1;}} str[2] è il terzo elemento del vettore str2; vale 1 È quindi diverso da \0 str str[2] è una cifra. str[2]=* Si incrementa il valore di i e si ritorna allinizio del Ciclo. 23 *
59
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Si comincia ad eseguire il corpo della funzione al1a\0 1415 str2 str2 è stata definita ed Inzializzata nella funzione chiamante (che in questo caso è il main()) i 2500 void modifica_stringa(int str[ ]); { int i=0; while (str [i] != \0) { if (str[ i] >= 0 && str[i] = 0 && str[i] <= 9) str[ i] = *; i=i+1;}} str[3] è il quarto elemento del vettore str2; vale a È quindi diverso da \0 str str[3] non è una cifra. Si incrementa il valore di i e si ritorna allinizio del Ciclo. 34 *
60
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Si comincia ad eseguire il corpo della funzione al1a\0 1415 str2 str2 è stata definita ed Inzializzata nella funzione chiamante (che in questo caso è il main()) i 2500 void modifica_stringa(int str[ ]); { int i=0; while (str [i] != \0) { if (str[ i] >= 0 && str[i] = 0 && str[i] <= 9) str[ i] = *; i=i+1;}} str[4] è il quinto elemento del vettore str2; vale \0 Condizione di treminazione del ciclo si esce dal ciclo e dalla funzione str 34 * La memoria allocata per la variabili locali alla funzione e per i parametri viene rilasciata Rimangono le modifiche Effettuate su str2
61
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un altro esempio #include #include #define SIZE 5 void modifyArray (int b[], int size); void modifyElement (int e); int main() { int a[SIZE]={0,1,2,3,4}; int i; printf(effetti del passaggio per riferimento degli array \n. Valori del vettore originale \n\n); for (i=0;i<SIZE;i++) { printf(%d, a[i]); }modifyArray(a,SIZE); printf(\n Nuovi valori degli elementi dellarray: \n\n); for (i=0;i<SIZE;i++) { printf(%d, a[i]); } printf(\n\n effetto del passaggio di un elemento del vettore per valore. il valore di a[3] è: %d, a[3]); modifyElement(a[3]); printf(il valore di a[3] ora è: %d,a[3]); return 0; }
62
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un altro esempio void modifyArray (int b[], int size) { int j; for (j=0;j<size; j++){ b[j]*=2;}return;}
63
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un altro esempio void modifyElement (int e) {e*=2; printf(valore elemento modificato: %d,e); return;}
64
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un altro esempio #include #include #define SIZE 5 void modifyArray (int b[], int size); void modifyElement (int e); int main() { int a[SIZE]={0,1,2,3,4}; int i; printf(effetti del passaggio per riferimento degli array \n. Valori del vettore originale \n\n); for (i=0;i<SIZE;i++) { printf(%d, a[i]); }modifyArray(a,SIZE); printf(\n Nuovi valori degli elementi dellarray: \n\n); for (i=0;i<SIZE;i++) { printf(%d, a[i]); } printf(\n\n effetto del passaggio di un elemento del vettore per valore. il valore di a[3] è: %d, a[3]); modifyElement(a[3]); printf(il valore di a[3] ora è: %d,a[3]); return 0; } Valori del vettore originale… 0 1 2 3 4 Nuovi valori… 0 2 4 6 8 Effetto del passaggio degli elementi del vettore per valore. Il valore di a[3] è: 6 Valore elemento modificato: 12 Il valore di a[3] ora è: 6 Siamo allinterno della funzione modifyElement
65
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007
66
Qualificatore const Consente di imporre che un array non possa essere modificato dalla funzione che lavora su di esso Un esempio… Un esempio…
67
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio di utilizzo del qualificatore const #include #include void tryToModifyArray(const int b[]); int main() { int a[]={10,20,30}; tryToModifyArray(a);printf(%d%d%d\n,a[0],a[1],a[2]); return 0; } void tryToModifyArray(const int b[]) {b[0]/=2;b[1]/=2;b[2]/=2;} Se si prova a modificare il contenuto di un elemento dellarray avviene un errore in fase di compilazione Compiling… Error: l-value specifies const object
68
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Alcune operazioni su vettori Ricerca di un elemento (in vettori non ordinati e ordinati) Ricerca di un elemento (in vettori non ordinati e ordinati) Ordinamento di un vettore Calcolo della media, mediana degli elementi di un vettore
69
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento di vettori Dato un vettore di n interi vett riorganizzare i valori memorizzati nei suoi elementi in modo che Dato un vettore di n interi vett riorganizzare i valori memorizzati nei suoi elementi in modo che se i <j, vetti[i]<= vetti[j] …ovvero in modo tale che gli elementi del vettore siano ordinati in modo crescente.
70
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Pseudocodice Inizializza il vettore di interi con i valori dati; inizializza una variabile contatore i a 0. Esegui n-1 iterazioni (n num. elementi del vettore). Per ogni iterazione: Considera la posizione j del vettore (j=1,…,n-1) –Se lelemento in posizione j è maggiore dellelemento in posizione j+1 scambia i due elementi Vedremo che ogni iterazione è in grado di assicurare che almeno un ulteriore elemento sarà inserito nellordine corretto, progressivamente aumentando il numero di elementi ordinati e portando in n-1 iterazioni al pieno ordinamento del vettore
71
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Un esempio Prima iterazione 3 4 1 8 5 6 i i 1 4 5 8 i i i 6 8 Il vettore NON è ordinato alla fine della prima iterazione
72
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Idea: Dopo la prima iterazione il valore più grande si trova in fondo al vettore. Perché? Se il valore più grande era in posizione j, allora il confronto tra j e j+1 lo sposta in posizione j+1. Il confronto tra il valore della posizione j+1 e della posizione j+2 lo sposta in posizione j+2, e così via finisce nella prima iterazione in fondo al vettore
73
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Un esempio Seconda iterazione 3 1 4 5 6 8 i i 1 3 i i Il vettore NON è ordinato alla fine della seconda iterazione MA il secondo elemento più grande È in penultima posizione. Lelemento più grande in ultima posizione.
74
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Perché? Se il secondo valore più grande era in posizione j, allora il confronto tra j e j+1 lo sposta in posizione j+1 (lunico valore più Grande è in fondo al vettore). Il confronto tra il valore della posizione j+1 e della posizione j+2 lo sposta in posizione j+2, e così via. Non può essere messo nellultima posizione dove cè un valore più grabnde di lui finisce nella penultima posizione del vettore
75
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Un esempio Terza iterazione 1 3 4 5 6 8 i i i IN QUESTO caso il vettore è ordinato alla fine della seconda iterazione Il terzo elemento più grande È in terzultima posizione. Si procede comunque con altre due iterazioni in cui non si cambia nulla nel vettore.
76
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Dimostrazione formale di correttezza (per induzione) Vogliamo dimostrare che il BubbleSort Termina sempre Produce un vettore ordinato Produce un vettore ordinato Terminazione banale. Numero di iterazioni eseguite dal for annidato finite. SOLO una cattiva implementazione può portare a esecuzioni infinite, NON lALGORITMO SOLO una cattiva implementazione può portare a esecuzioni infinite, NON lALGORITMO Vogliamo quindi dimostrare che dopo k iterazioni le ultime k posizioni del vettore contengono i k elementi più grandi, ordinati in ordine crescente Dopo le n iterazioni eseguite dallalgoritmo il vettore contiene gli n elementi ordinati in ordine crescente SE VERO
77
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Dimostrazione formale di correttezza (per induzione) Passo base Affermazione vera per k=1 Dimostrato 5 slide fa Dimostrato 5 slide fa Passo induttivo Se vero per ogni k<=h, k<n, dimostriamo che sia vero per k <=h+1 Claim: Dopo h+1 iterazioni le ultime h+1 posizioni del vettore contengono gli h+1 elementi più grandi, ordinati in ordine crescente Per ipotesi induttiva quando si comincia ad eseguire la h+1 iterazione le ultime h posizioni contengono gli h elementi più grandi ordinati in ordine crescente. Tali elementi non verranno spostati. Lapplicazione delle regole dellalgoritmo non consente che elementi piu piccoli possano essere spostati in posizioni di indice maggiore in cui sono memorizzati elementi più grandi. Nella h+1 esima iterazione lordinamento relativo degli h elementi più grandi (già ordinati in ordine crescente) non subisce modifiche.
78
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Dimostrazione formale di correttezza (per induzione) Passo induttivo –Quello che succede è che lh+1 esimo elemento più grande viene spostato in posizione n-1-h Le posizioni n-1, n-h contengono gli h elementi più grandi Se lh+1 esimo elemento più grande si trova in posizione j, j <= n-1-h, e tutte le posizioni j,…,n-1-h conterranno elementi più piccoli quindi avverranno switch tra la posizione j e j+1, j+2 e j+3, etc. fino a portare lh+1 esimo elemento più grande in posizione n-1-h.
79
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Codice del BubbleSort #include #include #define SIZE 10 int main() { int a[SIZE]={2,6,4,8,10,12,89,68,45,37}; int i,j,hold; printf(Ordinamento originale del vettore \n); for (i=0; i<SIZE;i++) { printf(%d, a[i]); } for (i=0;i<SIZE-1;i++) { for (j=0;j<SIZE-1;j++) { if (a[j])>a[j+1]) {hold=a[j];a[j]=a[j+1];a[j+1]=hold;}}} printf (\n vettore ordinato \n); /*stampa, come sopra del vettore*/ ……} Se gli elementi dalla posizione 1 alla n-1 contengono gli n-1 elementi piu grandi e sono ordinati in ordine crescente ALLORA tutti gli elementi del vettore sono ordinati Si lavora su j e j+1. Questa condizione impone che si considerino solo elementi validi del vettore (non si eccede mai la sua dimensione) Si potrebbe ottimizzare considerando ogni volta solo i primi n-i elementi del vettore (quelli che seguono sono già ordinati)…
80
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Caso peggiore Vediamo quale è il caso in cui ordinare il vettore comporta lesecuzione di un numero maggiore di istruzioni un tempo di calcolo maggiore (complessità dellalgoritmo BubbleSort) Il caso in cui gli elementi sono ordinati in ordine decrescente..vediamo cosa succede in questo caso
81
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Un esempio Prima iterazione 6 5 4 3 2 1 i i 5 6 i i i Il vettore NON è ordinato alla fine della prima iterazione 4 6 3 6 2 6 1 6
82
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Un esempio Seconda iterazione 5 4 3 2 1 6 i i 4 5 i i Il vettore NON è ordinato alla fine della seconda iterazione 3 5 2 5 1 5
83
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Un esempio Terza iterazione 4 3 2 1 5 6 i i 3 4 i Il vettore NON è ordinato alla fine della terza iterazione 2 4 1 4
84
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Un esempio Quarta iterazione 3 2 1 4 5 6 i i 2 3 Il vettore NON è ordinato alla fine della quarta iterazione 1 3
85
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort Un esempio Quinta iterazione 2 1 3 4 5 6 i Il vettore NON è ordinato alla fine della quinta iterazione 1 2
86
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ordinamento dei vettori BubbleSort n-1 iterazioni per ordinare i nodi In ciascuna iterazione vengono esaminati gli elementi del vettore e se un elemento e il successivo non sono in ordine crescente viene effettuato uno scambio c*n*n istruzioni nel caso peggiore Algoritmo di complessità O(n 2 ) 1 2 3 4 5 6 Data una funzione g(n) appartengono allinsieme O(g(n)) quelle funzioni f(n) tali che esistano due costanti intere positive c e n0 tali che 0 =n0
87
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Verifica e validazione di un programma VerificaValidazione Processi di test che assicurano che il SW sviluppato segua le specifiche e le necessità dellutente Boehm 1979 Validazione: Stiamo realizzando il prodotto giusto? Verifica Stiamo realizzando il prodotto nel modo giusto? Verifica che il programma implementato risponda alle aspettative dellutente finale Controlla che il programma segua le specifiche
88
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 V &V-Verifica e Validazione Esistono varie tecniche di verifica e analisi del sistema Tecniche statiche (solo verifica): analisi del documento di requisiti, dei diagrammi usati per la progettazione del SW; del codice sorgente del programma Tecniche dinamiche (verifica o validazione): mettono sotto stress una implementazione testando i risultati dellesecuzione di un programma su dati di test
89
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Tecniche dinamiche (testing) Si stressa il programma con dati di test Lesistenza di un difetto nel SW o di una inadeguatezza si inferisce dal fatto che vengono prodotti in output valori diversi da quelli attesi Statistical testing testa efficienza e affidabilità del sistema. Analizza le frequenze degli input in un sistema reale e esegue test su un campione rappresentativo dei dati di input. Statistical testing testa efficienza e affidabilità del sistema. Analizza le frequenze degli input in un sistema reale e esegue test su un campione rappresentativo dei dati di input. Defect testing lo vedremo tra poco. Mira a individuare dove il programma non rispetta le specifiche. Defect testing lo vedremo tra poco. Mira a individuare dove il programma non rispetta le specifiche. Una volta trovato un difetto nel comportamento del programma ne va compresa la causa (debugging)e il problema va rimosso. Localizzare Lerrore Progettare come Risolvere lerrore Ritestare il programma
90
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Testing Unit testing :usato per testare individualmente il comportamento di una componente del programma. Module testing : un modulo è un insieme di componenti dipendenti come un insieme di procedure e funzioni correlate. Può essere testato in isolamento dagli altri moduli del sistema. Sub-system testing : controlla il funzionamento di un insieme di moduli integrati in un sottosistema (per determinare ad esempio errori di interfacciamento tra i moduli).
91
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Testing System testing :più sottosistemi sono integrati nellintero sistema. Questa fase di test verifica errori nellinterfacciamento tra i sottosistemi e verifica che il sistema verifichi i requisiti funzionali. Acceptance testing : fase finale del processo di testing prima che il sistema sia accessibile per uso operativo. Il test è effettuato con dati reali. Alfa testing si eseguono varie iterazioni con il cliente fino a quando il sistema implementato non soddisfa completamente i requisiti del sistema
92
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Tipi di testing Top down testing – si comincia a testare la componente più astratta, poi le sottocomponenti ecc Bottom up testing Bottom up testing – il testing parte dalle componenti fondamentali, poi sottosistemi, sistemi,.. Thread testing Thread testing –Si cercano di individuare e testare sequenze di istruzioni che in fase di esecuzione verrebbero eseguite dal programma e si testano Stress testing – si cerca di individuare la capacità del sistema di lavorare ad un certo livello di carico (ad esempio 200 transazioni al secondo) che è il carico atteso per il sistema. Si supera tale carico, stressando il sistema fino a quando non avvengono problemi per verificare che i malfunzionamenti ad alto carico producano danni limitati per verificare che i malfunzionamenti ad alto carico producano danni limitati per riuscire ad individuare difetti che non verrebbero individuati a carichi normali per riuscire ad individuare difetti che non verrebbero individuati a carichi normali Back-to-back testing –Quando una nuova versione del sistema (v2.0) è sviluppata a partire da una versione precedente (v1.0) Si scelgono dei casi di test per testare le funzionalità comuni Se eseguono le due versioni in tali scenari Si verifica che diano gli stessi risultati o che le differenze siano quelle attese
93
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Defect testing Test che rivela la presenza di difetti prima che il SW sia consegnato al cliente – Il defect testing non può in generale essere esaustivo (dovrebbe testare ogni istruzione del programma ed ogni sequenza di esecuzione delle istruzioni) – Devono essere scelti accuratamente alcuni casi di test rappresentativi dei vari scenari in cui verrà eseguito il programma
94
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Testing Cosa importante testare: –Funzionalità precedentemente offerte devono continuare a funzionare nella nuova versione del SW – tipici input o situazioni tipiche durante lesecuzione del sistema devono essere testati –la capacità del sistema di offrire le funzionalità previste deve essere verificata
95
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un tipo di defect testing Black box testing (o testing funzionale) – i test vengono selezionati sulla base delle specifiche del programma – Il sistema è visto come una scatola nera Dati input Output Il comportamento del sistema può essere determinato studiando gli input e i corrispettivi output
96
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Black box testing Dati di input Di test Dati di input Che causano Comportamenti anomali Output anomali
97
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Black box testing Come scegliere gli input in modo che ci sia una elevata probabilita che siano in I e ? I dati di input tipicamente di dividono in classi Il programma si comporta in modo simile per input della stessa classe I dati di test sono rappresentativi delle diverse classi Per ciascuna classe i casi limite ed un caso tipico devono essere testati INPUT
98
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Black box testing Importante specificare per ogni funzione – Precondizione eventuali assunzioni fatte nella scrittura della funzione (ad es. la funzione lavora su vettori di almeno un elemento) –Postcondizione (descrive cosa fa la funzione, ad es. dato un vettore calcola la somma dei suoi elementi Servono per determinare gli scenari di test
99
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio di black box testing /* pre: array di almeno un elemento post: verifica se lelemento key è contenuto nellarray*/ int search (int key, int v[ ], int n) { int i; for (i=0; i<n; i++) if (v[i]==key) return 1; return 0; } – Testare il programma nel caso di array con un unico elemento – Testare il programma anche per diverse dimensioni di array (questo riduce la probabilità che un output corretto sia prodotto da un programma sbagliato accidentalmente perché è capitato di testare un caso particolare in cui il programma non dà errore) – Eseguire test in modo da testare posizioni estreme dellarray e intermedie… Dati di test Array di 1 elementokey nellarray Array di 1 elementokey NON nellarray Array con più di 1 elementokey 1° elemento dellarray Array con più di 1 elementokey ultimo elem. dellarray Array con più di 1 elementokey pos. Intermedia dellarray Array con più di 1 elementokey NON nellarray
100
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un esempio Si scriva una funzione che data una stringa calcoli la prima occorrenza di un carattere c nella stringa. Restituisce lindice del vettore stringa in cui il carattere c compare se c è uno dei caratteri della stringa; -1 altrimenti. /* pre: post: restituisce lindice del vettore stringa in cui il carattere c compare se c è uno dei caratteri della stringa; -1 altrimenti.*/
101
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un esempio /* pre: post: restituisce lindice del vettore stringa in cui il carattere c compare se c è uno dei caratteri della stringa; -1 altrimenti.*/ int prima_occorrenza_str (char str[ ], char c) { int i; for (i=0; str[i]!=\0; i++) if (str[i]==c) return i; return -1; } Test a scatola nera stringa vuota stringa di un elemento =c !=c stringa con più elementi c in prima posizione c in ultima posizione c in posizione interemedia c NON nella stringa
102
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ricerca di un elemento in un vettore Abbiamo già visto il caso in cui il vettore non è ordinato Abbiamo già visto il caso in cui il vettore non è ordinato – può essere necessario scandire lintero vettore per sapere se lelemento è presente o meno nel vettore Complessità O(n) Complessità O(n) – si può ricercare più efficacemente un elemento nel vettore se tale vettore è ordinato?
103
Ricerca di un elemento in un vettore ordinato (ricerca binaria) A ogni passo elimina la metà degli elementi dellarray dallinsieme di elementi da scandagliare Si confronta la chiave con llemento intermedio dellarray – se la chiave è più grande bisognerà esaminare solo la metà destra dellarray –se la chiave è più piccola bisognerà esaminare solo la metà sinistra dellarray – se la chiave è uguale allelemento cercato allora abbiamo trovato lelemento! Si procede fino a quando o si è trovato lelemento oppure non ci sono più elementi da scandagliare 1210986531 Key = 4 La chiave NON è presente nel vettore !
104
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ricerca binaria int ricerca_binaria (const int b[ ], int key, int low, int high) { int middle; int found = 0; while ((low <= high) && (found==0)) { middle = (low+ high)/2; if (key == b[middle]) found=1; else if (key < b[middle]) high=middle-1;else low=middle +1; } return found; } /*pre: low e high indici tra 0 e n-1; vettore ordinato post: dato un vettore ordinato di interi ed un intero key verifica se key è contenuto nel vettore */
105
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Complessità della ricerca binaria Se il numero di elementi del vettore è n Prima iterazione: – n posizioni da scandagliare Seconda iterazione – <=n/2 posizioni da scandagliare Terza iterazione – <= n/4 posizioni da scandagliare In log (n) iterazioni lalgoritmo termina complessità O(log n) Se il vettore è di 1048576 elementi -se il vettore non è ordinato possiamo dover eseguire c* 1048576 istruzioni per trovare lelemento -se il vettore è ordinato si riducono a c 1 *20 istruzioni
106
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza dellalgoritmo di ricerca binaria Vediamo un secondo approccio di dimostrazione – Dimostrazione per assurdo Scriviamo la tesi che vogliamo dimostrare Scriviamo la tesi che vogliamo dimostrare Es. lalgoritmo di ricerca binaria, applicato ad un vettore ordinato, con low =0, high= dimensione del vettore -1, termina sempre restituendo un valore che è 0 se la chiave non è presente nel vettore e 1 se la chiave è presente nel vettore. Supponiamo per assurdo che esista un caso in cui la tesi non è verificata Supponiamo per assurdo che esista un caso in cui la tesi non è verificata Es. in cui lalgoritmo restituisce un valore non corretto. Facciamo vedere che questo porta ad una contraddizione con le ipotesi di lavoro Facciamo vedere che questo porta ad una contraddizione con le ipotesi di lavoro Es. non è possibile che lalgoritmo restituisca un valore non corretto A MENO che il vettore non sia ordinato (che è una ipotesi invece del nostro claim) Per vettori ordinati è vero che lalgoritmo restituisce valore corretto (CVD)
107
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Lemma Lalgoritmo di ricerca binaria termina sempre restituendo un valore booleano Numero limitato di iterazioni del ciclo Ogni volta che si entra nel ciclo o found viene messo a 1 while ((low <= high) && (found==0)) { middle = (low+ high)/2; if (key == b[middle]) found=1; else if (key < b[middle]) high=middle-1;else low=middle +1; } (in questo caso found non può essere successivamente rimesso a 0 si esce dal ciclo) oppure lintervallo da scandagliare viene ridotto (nel qual caso in al massimo log(n) iterazioni avremo che high<low non avendo più elementi da scandagliare e quindi si uscirà dal ciclo) while ((low <= high) && (found==0)) { middle = (low+ high)/2; if (key == b[middle]) found=1; else if (key < b[middle]) high=middle-1;else low=middle +1; } Quando si esce dal ciclo si esegue return found; Ritornando il controllo al chiamante e Restituendo un valore booleano (1 per VERO, 0 per FALSO)
108
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza della ricerca binaria Dato un vettore ordinato, low==0, high==n-1 (con dimensione del vettore) e dato un intero key ricerca_binaria verifica se key è presente o meno nel vettore – restituisce 0 se key non è presente –1 altrimenti Terminazione già dimostrata Inoltre osserviamo che lalgoritmo opera sempre su indici validi del vettore. Si parte con low=0, high=n-1 (indici validi).high viene solo diminuito, low solo aumentato. Non appena low > high la funzione termina.
109
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza della ricerca binaria Dato un vettore ordinato, low==0, high==n-1 (con dimensione del vettore) e dato un intero key ricerca_binaria verifica se key è presente o meno nel vettore – restituisce 0 se key non è presente –1 altrimenti Supponiamo PER ASSURDO che esista un vettore ordinato vett, ed una chiave k, tale che ricerca_binaria produca un risultato non corretto – caso A) k compare in vett ma lalgoritmo di ricerca binaria restituisce 0 (FALSO) –Caso B) k non compare in vett ma lalgoritmo di ricerca binaria restituisce 1 (VERO) Vedremo che entrambi questi due casi NON possono verificarsi. Infatti il loro verificarsi porta a delle CONTRADDIZIONI.
110
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza della ricerca binaria Supponiamo per assurdo che –Caso B) k non compare in vett ma lalgoritmo di ricerca binaria restituisce 1 (VERO) Osserviamo che lalgoritmo restituisce il valore della variabile found. found viene messo a 1 soltanto se si esegue if (k == vett[middle]) found=1; k compare tra gli elementi del vettore k compare tra gli elementi del vettore CONTRADDIZIONE
111
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza della ricerca binaria Supponiamo per assurdo che caso A) k compare in vett ma lalgoritmo di ricerca binaria restituisce 0 (FALSO). Se found viene messa a 1 (VERO) non può essere rimessa a 0 (FALSO) se i è lindice in cui compare il valore k tale posizione non è mai esaminata altrimenti avremmo eseguito if (k == vett[middle]) found=1; e restituito 1
112
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza della ricerca binaria Questo significa che usciamo dal ciclo (low > high) senza mai aver esaminato lelemento in posizione i Originariamente tutti gli elementi del vettore erano da esaminare Losservazione precedente significa che ad una determinata iterazione abbiamo tolto dallinsieme degli elementi da scandagliare lelemento in posizione i…sia h tale iterazione
113
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza della ricerca binaria Nellh-esima iterazione possono succedere tre cose (in base al codice dellalgoritmo) Può essere che k == vett[middle] found=1; found=1; CONTRADDIZIONE
114
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza della ricerca binaria Nellh-esima iterazione possono succedere tre cose (in base al codice dellalgoritmo) Può essere che k < vett[middle] high =middle-1; high =middle-1; Per lipotesi che durante questa iterazione lelemento in posizione i venga escluso da quelli da scandagliare i > middle. Ma allora k<vett[middle] è in posizione precedente ad un elemento con valore k Il vettore non è ordinato in ordine crescente Il vettore non è ordinato in ordine crescente CONTRADDIZIONE
115
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Correttezza della ricerca binaria Nellh-esima iterazione possono succedere tre cose (in base al codice dellalgoritmo) Può essere che k > vett[middle] low =middle+1; low =middle+1; Per lipotesi che durante questa iterazione lelemento in posizione i venga escluso da quelli da scandagliare i < middle. Ma allora k>vett[middle] è in posizione successiva ad un elemento con valore k Il vettore non è ordinato in ordine crescente Il vettore non è ordinato in ordine crescente CONTRADDIZIONE Lipotesi che il claim non sia vero porta a contraddizioni con le Ipotesi di lavoro Il claim è corretto
116
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Ancora sul testing Testing strutturale (white box o glass box) – Si analizza il codice e si usa la conoscenza della struttura del programma per stabilire i dati di test Si vuole cercare di esercitare ogni percorso di esecuzione (path testing) Si vuole cercare di esercitare ogni percorso di esecuzione (path testing) Ogni istruzione condizionale deve essere testata sia quando la condizione è vera che quando è falsa – Si parte dai diagrammi di flusso..
117
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un esempio: ricerca binaria low<=high !found key == b[middle] key < b[middle] return found T F F T T F T F Vogliamo testare i vari percorsi di esecuzione Attraversando tutti i rami del grafo di flusso si è sicuri che -tutte le istruzioni siano eseguite almeno una volta -ciascun costrutto if sia eseguito sia nel caso in cui la condizione sia vera sia nel caso in cui sia falsa -ciascun while, for, ecc, sia eseguito sia nel caso in cui la condizione di entra nel ciclo sia vera sia nel caso in cui sia falsa
118
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Calcolo della media, mediana in un vettore Si scriva un computer che dati 100 dati forniti da input e memorizzati in un vettore calcoli la media e la mediana di tali valori Si scriva un computer che dati 100 dati forniti da input e memorizzati in un vettore calcoli la media e la mediana di tali valori – Media: somma dei valori del vettore / numero degli elementi del vettore – Mediana: valore intermedio una volta ordinato il vettore Se il vettore ha 8 elementi con valori crescenti s1,s2,s3,…, s8 la mediana è il valore s4 Se il vettore ha 8 elementi con valori crescenti s1,s2,s3,…, s8 la mediana è il valore s4
119
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione #include #include #define SIZE 100 void mean (const int answer [ ], int n); void median (int answer [ ], int n); void bubblesort (int answer [ ], int n);
120
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione int main () { int dati [SIZE]; int i; for (i=0; i<SIZE; i++) { printf (insersci valore \n); scanf(%d, &dati[i]); } mean (dati,SIZE); median (dati, SIZE); }
121
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione void mean (int answer[ ], int n) { int total, j; total=0; for (j=0; j<n; j++) total += answer[j]; printf (il valore della media e %f \n, (float) total/n); }
122
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione void median (int answer[ ], int n) { bubblesort (answer,n); printf (il valore della mediana e %d \n, answer[n/2]);}
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.