Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAntonello Fortunato Modificato 11 anni fa
1
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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) void se la funzione non restituisce nulla
10
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 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 -- Fondamenti di programmazione, a.a. 2009/2010 Vediamo cosa succede in memoria dal main invochiamo printf (%d, quadrato(x)); La variabile x vale 2 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 2 5200 y parametro attuale
20
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Vediamo cosa succede in memoria Viene quindi eseguito il corpo della funzione Si calcola y 2 e si restituisce questo valore al chiamante … Memoria 2 5200 y int quadrato (int y) { return y*y; } restituisce 4 al chiamante (il main) La memoria allocata per il parametro y viene rilasciata
21
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Vediamo cosa succede in memoria printf (%d, quadrato(x)); … Memoria 2 5200 y int quadrato (int y) { return y*y; } restituisce 4 al chiamante (il main) restituisce 4 Il valore 4 viene stampato ATTENZIONE:importante che restituisca un intero altrimenti errore
22
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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; }
23
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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 sintattico 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
24
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Headers 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
25
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
26
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Esempio #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 delle modifiche fatte. Rimane solo il valore di ritorno restituito al chiamante
27
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
28
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Esercizio 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
29
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
30
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
31
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
32
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Esercizio 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é?
33
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Soluzione #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)!=0) 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;}
34
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Esercizio 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.
35
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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; }
36
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010
37
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.
38
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Emulazione del lancio dei dadi int rollDice ( ) { int d1,d2; 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
39
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
40
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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…
41
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Vettori 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)
42
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
43
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Esempio Definizione di un array Inizializzazione di un array Uso di un array
44
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
45
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
46
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Esercizio Si scriva un programma che prenda da input gli elementi di un array di interi, calcoli e stampi la somma degli elementi dellarray.
47
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Soluzione #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, &a[i]); } for (i=0; i< DIM_ARRAY; i++) { somma +=a[i]; } printf (somma degli elementi dellarray: %d\n, somma); }
48
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Esercizio Si scriva un programma che calcoli listogramma dei voti degli studenti in un appello di esame
49
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
50
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
51
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
52
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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[30] = 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}
53
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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)
54
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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);
55
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
56
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010
57
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
58
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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())
59
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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 Inizializzata nella funzione chiamante (che in questo caso è il main()) i 2500 Allocata memoria allentrata nella funzione
60
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
61
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
62
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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 *
63
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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 *
64
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
65
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010
66
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; }
67
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Un altro esempio void modifyArray (int b[ ], int size) { int j; for (j=0;j<size; j++){ b[j]*=2;}return;}
68
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Un altro esempio void modifyElement (int e) {e*=2; printf(valore elemento modificato: %d,e); return;}
69
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
70
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Qualificatore const Consente di imporre che un array non possa essere modificato dalla funzione che lavora su di esso Un esempio… Un esempio…
71
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
72
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
73
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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.
74
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
75
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
76
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
77
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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.
78
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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ù grande di lui finisce nella penultima posizione del vettore
79
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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.
80
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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*/ ……}
81
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
82
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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.
83
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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.
84
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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)…
85
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
86
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
87
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
88
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
89
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
90
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
91
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
92
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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?
93
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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 !
94
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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 */
95
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
96
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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)
97
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Lemma 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)
98
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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.
99
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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.
100
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
101
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
102
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
103
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
104
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
105
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 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
106
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Calcolo della media, mediana in un vettore Si scriva una funzione che dati 100 dati forniti da input e memorizzati in un vettore calcoli la media e la mediana di tali valori Si scriva una funzione 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
107
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Soluzione void median (int answer[ ], int n) { bubblesort (answer,n); printf (il valore della mediana e %d \n, answer[n/2]);}
108
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Soluzione #include #include #define SIZE 100 void mean (const int answer [ ], int n); void median (int answer [ ], int n); void bubblesort (int answer [ ], int n);
109
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Soluzione int main () { int dati [SIZE]; int i; for (i=0; i<SIZE; i++) { printf (inserisci valore \n); scanf(%d, &dati[i]); } mean (dati,SIZE); median (dati, SIZE); }
110
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010Soluzione void mean (const 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); }
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.