Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1...

122
Prof.ssa Chiara Petrioli -- Prof.ssa Chiara Petrioli -- corso di programmazione 1, corso di programmazione 1, a.a. 2006/2007 a.a. 2006/2007 Corso di Corso di Programmazione 1 Programmazione 1 a.a.2006/2007 a.a.2006/2007 Prof.ssa Chiara Petrioli Prof.ssa Chiara Petrioli Corso di Laurea in Corso di Laurea in Informatica Informatica Università degli Studi “La Università degli Studi “La Sapienza” Sapienza” (lezioni 6 e 7) (lezioni 6 e 7) funzioni e vettori

Transcript of Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1...

Page 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Corso di Programmazione 1Corso di Programmazione 1a.a.2006/2007a.a.2006/2007Prof.ssa Chiara PetrioliProf.ssa Chiara Petrioli

Corso di Laurea in InformaticaCorso di Laurea in InformaticaUniversità degli Studi “La Sapienza”Università degli Studi “La Sapienza”

(lezioni 6 e 7)(lezioni 6 e 7)funzioni e vettori

Page 2: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Come vengono gestiti progetti Come vengono gestiti progetti complessicomplessi

Approccio top-down: data la descrizione del Approccio top-down: data la descrizione del progetto si devono individuare dei task che progetto si devono individuare dei task che devono essere eseguiti (ed in che ordine) per devono essere eseguiti (ed in che ordine) per portare a compimento il progettoportare a compimento il progetto

Ciascun task avrà bisogno di informazioni iniziali (input) Ciascun task avrà bisogno di informazioni iniziali (input) consisterà nell’eseguire a sua volta delle azioni per consisterà nell’eseguire a sua volta delle azioni per produrre il risultato voluto (output o valore di ritorno del produrre il risultato voluto (output o valore di ritorno del task)task)

Page 3: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Come vengono gestiti progetti Come vengono gestiti progetti complessicomplessi

Esempio: a Bob, manager di Esempio: a Bob, manager di Telecom viene dato il compito di Telecom viene dato il compito di fare un progetto di reti che fare un progetto di reti che consenta a tutte le 400 filialiconsenta a tutte le 400 filiali

?della ditta NastroRosa di essere interconnesse della ditta NastroRosa di essere interconnesse in una rete aziendale. Il compito di Bob è in una rete aziendale. Il compito di Bob è quello di presentare un progetto al cliente (ditta quello di presentare un progetto al cliente (ditta

NastroRosa) che soddisfi le specifiche del NastroRosa) che soddisfi le specifiche del cliente stesso.cliente stesso.

Page 4: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Come vengono gestiti progetti Come vengono gestiti progetti complessicomplessi

Esempio: Bob riceve in input, dialogando con il Esempio: Bob riceve in input, dialogando con il cliente, delle informazioni cliente, delle informazioni

Quanto deve costare il progettoQuanto deve costare il progetto

Le caratteristiche delle varie sedi (numero di computer da Le caratteristiche delle varie sedi (numero di computer da interconnettere,quantità di dati che devono essere interconnettere,quantità di dati che devono essere scambiate, quindi capacità che devono avere i link..)scambiate, quindi capacità che devono avere i link..)

etc...etc...

Page 5: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Come vengono gestiti progetti complessiCome vengono gestiti progetti complessi

Esempio: Sulla base di queste informazioni Esempio: Sulla base di queste informazioni

Bob identifica una serie di passi che devonoBob identifica una serie di passi che devono

essere effettuati per svolgere il progettoessere effettuati per svolgere il progetto Prepara un documento che descrivere la caratteristiche tecniche del progettoPrepara un documento che descrivere la caratteristiche tecniche del progetto

Chiede quindi a Alan, che è un Technical Manager, dato il documento con le Chiede quindi a Alan, che è un Technical Manager, dato il documento con le caratteristiche tecniche del progetto, di produrre la soluzione tecnica caratteristiche tecniche del progetto, di produrre la soluzione tecnica dettagliata per il progettodettagliata per il progetto

Ricevuto da Alan tale soluzione chiederà, in base alla soluzione, al suo Ricevuto da Alan tale soluzione chiederà, in base alla soluzione, al suo collaboratore Kevin di stimare i costi dettagliati del progetto, applicando gli collaboratore Kevin di stimare i costi dettagliati del progetto, applicando gli sconti quando possibile.sconti quando possibile.

Se i requisiti tecnici ed economici del cliente sono soddisfatti Se i requisiti tecnici ed economici del cliente sono soddisfatti presenterà la presenterà la soluzionesoluzione finale al cliente, finale al cliente, altrimentialtrimenti rivedrà il documento di caratteristiche rivedrà il documento di caratteristiche tecniche del progetto (ad esempio cercando di abbassare i costi) e ripeterà tecniche del progetto (ad esempio cercando di abbassare i costi) e ripeterà l’iterazionel’iterazione

Page 6: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Come vengono gestiti progetti complessiCome vengono gestiti progetti complessi

Esempio: Sulla base di queste informazioni Esempio: Sulla base di queste informazioni

Bob identifica una serie di passi che devonoBob identifica una serie di passi che devono

essere effettuati per svolgere il progettoessere effettuati per svolgere il progetto Prepara un documento che descrivere la caratteristiche tecniche del progettoPrepara un documento che descrivere la caratteristiche tecniche del progetto

Chiede quindi a Alan, che è un Technical Manager, dato il documento con le Chiede quindi a Alan, che è un Technical Manager, dato il documento con le caratteristiche tecniche del progetto, di produrre la soluzione tecnica caratteristiche tecniche del progetto, di produrre la soluzione tecnica dettagliata per il progettodettagliata per il progetto

Ricevuto da Alan tale soluzione chiederà, in base alla soluzione, al suo Ricevuto da Alan tale soluzione chiederà, in base alla soluzione, al suo collaboratore Kevin di stimare i costi dettagliati del progetto, applicando gli collaboratore Kevin di stimare i costi dettagliati del progetto, applicando gli sconti quando possibile.sconti quando possibile.

Se i requisiti tecnici ed economici del cliente sono soddisfatti Se i requisiti tecnici ed economici del cliente sono soddisfatti presenterà la presenterà la soluzionesoluzione finale al cliente, finale al cliente, altrimentialtrimenti rivedrà il documento di caratteristiche rivedrà il documento di caratteristiche tecniche del progetto (ad esempio cercando di abbassare i costi) e ripeterà tecniche del progetto (ad esempio cercando di abbassare i costi) e ripeterà l’iterazionel’iterazioneCiascuno di questi task è un compito complesso.

Quello che Bob fa èChiarire il compito che deve essere effettuato (e quindi il tipo

di output atteso dall’esecuzione 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 gliinteressa) come verrà svolto in dettaglio tale compito; gli

interessa che gli venga fornito l’output richiesto.

Page 7: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Come vengono gestiti progetti complessiCome vengono gestiti progetti complessi

Esempio: Kevin per stimare i costi dettagliati del Esempio: Kevin per stimare i costi dettagliati del progettoprogetto

Inserisce i dati sulle specifiche del progetto nel sistema aziendaleInserisce i dati sulle specifiche del progetto nel sistema aziendale

Invoca un tool che calcola il calcolo dei costiInvoca un tool che calcola il calcolo dei costi

Per alcune voci di costo eccessivamente elevate chiede sconti Per alcune voci di costo eccessivamente elevate chiede sconti particolariparticolari

– contatta John, che si occupa di approvare sconti maggiori dello contatta John, che si occupa di approvare sconti maggiori dello standard con richieste in tal senso. John seguirà le procedure aziendali standard con richieste in tal senso. John seguirà le procedure aziendali per decidere se tali sconti possono essere accettati e fornirà i valori per decidere se tali sconti possono essere accettati e fornirà i valori rivisti dei costi come output.rivisti dei costi come output.

BobGestione gerarchicaApproccio top-downper successivi raffinamentiil problema viene scompostoin passi elementari

Approccio modulareOgni task un moduloLa scomposizione in passielementari del task è del tuttotrasparente a chi invoca ilmodulo (chiede che il task vengaportato a completamento)

KevinAlan

tool John

Sarà ulteriormentestrutturato

Ad esempio: se cambia laprocedura interna per stimare i prezzi o per concedere sconti questosarà del tutto trasparente a Kevin e a Bob

Page 8: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Progettazione del SWProgettazione del SWPartiamo dalle specifiche del problema da Partiamo dalle specifiche del problema da risolvererisolvereDeterminiamo l’algoritmoDeterminiamo l’algoritmo– Si procede in modo top-down per raffinamenti Si procede in modo top-down per raffinamenti

successivisuccessivi– Vengono individuati task che devono essere Vengono individuati task che devono essere

eseguitieseguiti Successivamente raffinati in sotto-task Successivamente raffinati in sotto-task Ciascun task prende in input degli argomenti, ha Ciascun task prende in input degli argomenti, ha un determinato compito da svolgere, fornisce un un determinato compito da svolgere, fornisce un valore di ritornovalore di ritorno

Concetto di funzione

Page 9: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

FunzioneFunzione Il programmatore può organizzare il codice in Il programmatore può organizzare il codice in funzionifunzioni

Ciascuna funzione svolge un task specifico (ad Ciascuna funzione svolge un task specifico (ad esempio calcolare aesempio calcolare abb))

– il task deve essere chiaramente indicato nel nome della il task deve essere chiaramente indicato nel nome della funzione (ad esempio funzione (ad esempio potenzapotenza))

– la funzione prenderà in input una serie di parametri (ad la funzione prenderà in input una serie di parametri (ad esempio esempio aa e e bb))

– eseguirà il codice necessario per portare a compimento il task eseguirà il codice necessario per portare a compimento il task (as esempio calcolare a(as esempio calcolare abb))

– restituirà un valore di ritorno a chi ha invocato la funzione (arestituirà un valore di ritorno a chi ha invocato la funzione (abb))

tipo_del_valore_di_ritorno nome_funzione (tipo parametro1, …, tipo parametron)

Page 10: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

FunzioneFunzione Le funzioni sono invocate tramite una Le funzioni sono invocate tramite una chiamata a funzionechiamata a funzione

L’invocazione della funzione fa sì che la L’invocazione della funzione fa sì che la funzione esegua il suo compito (con i valori funzione esegua il suo compito (con i valori dei parametri specificati nella invocazione dei parametri specificati nella invocazione della funzione) e restituisca al chiamante il della funzione) e restituisca al chiamante il valore di ritorno.valore di ritorno.

nome_funzione (argomento1, …,argomenton)

Page 11: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Vantaggio dell’uso delle funzioniVantaggio dell’uso delle funzioni

Una organizzazione in funzioni rende più facile Una organizzazione in funzioni rende più facile strutturare un programma complessostrutturare un programma complessoLo stesso task può essere invocato più volte (magari con Lo stesso task può essere invocato più volte (magari con diversi valori dei parametri) durante l’esecuzione del diversi valori dei parametri) durante l’esecuzione del programmaprogramma

Usando le funzioni dovremo scrivere il codice della funzione una Usando le funzioni dovremo scrivere il codice della funzione una volta sola, e semplicemente invocare la funzione tutte le volte che volta sola, e semplicemente invocare la funzione tutte le volte che serveserve

Riuso del codiceRiuso del codiceMolte operazioni/task sono di interesse generale (ad esempio Molte operazioni/task sono di interesse generale (ad esempio l’elevazione a potenza). Esistono quindi librerie standard che l’elevazione a potenza). Esistono quindi librerie standard che realizzano tali funzioni. In tal caso basta includere tali librerie realizzano tali funzioni. In tal caso basta includere tali librerie (contenenti il codice della funzione) ed invocarla appropriatamente (contenenti il codice della funzione) ed invocarla appropriatamente nel programma nel programma non occorre sempre reinventare la ruota non occorre sempre reinventare la ruota

Page 12: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Vantaggio dell’uso delle funzioniVantaggio dell’uso delle funzioni

ModularitàModularitàSe vogliamo modificare il modo in cui un task Se vogliamo modificare il modo in cui un task viene eseguito basta cambiare il codice della viene eseguito basta cambiare il codice della funzione relativa. La modifica è trasparente al funzione relativa. La modifica è trasparente al resto del programma.resto del programma.

Facilità di debuggingFacilità di debuggingStrutturare il programma in funzioni, ciascuna con Strutturare il programma in funzioni, ciascuna con un compito chiaro, semplifica il debugging e un compito chiaro, semplifica il debugging e permette di isolare le funzioni in cui si verificano permette di isolare le funzioni in cui si verificano errori.errori.

Page 13: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Funzioni di libreriaFunzioni di libreriaUn esempio: la libreria matematicaUn esempio: la libreria matematica

#include <math.h>#include <math.h>

FunzioneFunzione DescrizioneDescrizione EsempioEsempio

sqrt(x)sqrt(x) radice quadrata di xradice quadrata di x sqrt(900.0) restituisce sqrt(900.0) restituisce 30.030.0

sqrt(900.0)sqrt(900.0)30.030.0

exp(x)exp(x) eexx exp(1.0) exp(1.0) 2.712.71

log(x)log(x) logaritmo di x in base elogaritmo di x in base e log(2.71)log(2.71)11

log10(x)log10(x) logaritmo di x in base 10logaritmo di x in base 10 log10(100.0)log10(100.0)22

fabs(x)fabs(x) valore assoluto di xvalore assoluto di x fabs(-5.0)fabs(-5.0)5.05.0

ceil(x)ceil(x) parte intera superioreparte intera superiore ceil (9.2)ceil (9.2)1010

Page 14: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Funzioni di libreriaFunzioni di libreriaUn esempio: la libreria matematicaUn esempio: la libreria matematica

#include <math.h>#include <math.h>

FunzioneFunzione DescrizioneDescrizione EsempioEsempio

floor(x)floor(x) parte intera inferioreparte intera inferiore floor(9.2)floor(9.2)9.09.0

pow(x,y)pow(x,y) xxyy pow(2,7) pow(2,7) 128128

fmod(x,y)fmod(x,y) resto della divisione di x resto della divisione di x per y (con x e y reali)per y (con x e y reali)

fmod(13.657,2.333)fmod(13.657,2.333)1.9921.992

sin(x)sin(x) seno di xseno di x sin(0.0)sin(0.0)0.00.0

cos(x)cos(x) coseno di xcoseno di x cos(0.0)cos(0.0)1.01.0

tan(x)tan(x) tangente di x (x in tangente di x (x in radianti)radianti)

tan(0.0)tan(0.0)0.00.0

Page 15: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Uso di funzioniUso di funzioni#include <stdio.h>#include <stdio.h>int quadrato (int);int quadrato (int);int main()int main(){ {

int x;int x; /*stampa i quadrati dei primi 10 interi*//*stampa i quadrati dei primi 10 interi*/for (x=1; x<=10; x++)for (x=1; x<=10; x++){{

printf (“%d ”, quadrato(x));printf (“%d ”, quadrato(x));}} printf(“\n”);printf(“\n”);return 0;return 0;

}}

int quadrato (int y)int quadrato (int y){{

return y*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 ilcontrollo al chiamantefornendo un valore diritorno

corpo della funzione

All’inizio del corpo della funzione possono esseredefinite variabili locali(viene loro allocata memoriaall’entrata nella funzione. Talememoria viene rilasciata quandosi restituisce il controllo alchiamante). I parametri possonoessere viste come variabili localialla funzione in cui viene copiatoall’entrata nella funzione ilvalore con cui la funzioneviene invocata.

parametro formale

Page 16: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Vediamo cosa succede in memoriaVediamo cosa succede in memoria

dal main invochiamodal main invochiamo printf (“%d ”, quadrato(x));printf (“%d ”, quadrato(x));

La variabile x vale 1La variabile x vale 1

Si invoca la funzione quadratoSi invoca la funzione quadrato

Viene associata una locazione di memoria al parametro y della Viene associata una locazione di memoria al parametro y della funzione. In questa locazione viene funzione. In questa locazione viene copiatocopiato il valore del parametro il valore del parametro attuale (si parla di passaggio attuale (si parla di passaggio per valoreper valore dei parametri) dei parametri)

Memoria

1

4357

y

parametro attuale

Page 17: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Vediamo cosa succede in memoriaVediamo cosa succede in memoria

Viene quindi eseguito il corpo della funzioneViene quindi eseguito il corpo della funzione

Si calcola ySi calcola y22 e si restituisce questo valore al chiamante e si restituisce questo valore al chiamante

Memoria

1

4357

yint quadrato (int y)int quadrato (int y){{

return y*y;return y*y;}}

restituisce 1 alchiamante (ilmain)

La memoria allocataper il parametro y viene

rilasciata

Page 18: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Vediamo cosa succede in memoriaVediamo cosa succede in memoria

printf (“%d ”, quadrato(x));printf (“%d ”, quadrato(x));

Memoria

1

4357

yint quadrato (int y)int quadrato (int y){{

return y*y;return y*y;}}

restituisce 1 alchiamante (ilmain)

restituisce 1

Il valore 1 viene stampato

ATTENZIONE:importanteche restituisca un interoaltrimenti errore

Page 19: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un esempioUn esempio#include <stdio.h>#include <stdio.h>int maximum (int, int, int);int maximum (int, int, int);int main()int main(){{

int number 1, number2, number 3;int number 1, number2, number 3;printf (“inserisci tre valori interi \n”);printf (“inserisci tre valori interi \n”);scanf(“%d%d%d”, &number1,&number2,&number3);scanf(“%d%d%d”, &number1,&number2,&number3);printf(“il massimo è: %d \n”, maximum (number1,number2,number3));printf(“il massimo è: %d \n”, maximum (number1,number2,number3));return 0;return 0;

}}int maximum (int x, int y, int z)int maximum (int x, int y, int z){{

int max=x;int max=x;if (y>max)if (y>max)

max=y;max=y;if (z >max)if (z >max)

max=z;max=z;return max;return max;

}}

Page 20: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Prototipo di una funzionePrototipo di una funzione

Specifica i tipi ed il numero dei parametri, Specifica i tipi ed il numero dei parametri, l’ordine in cui tali parametri devono essere l’ordine in cui tali parametri devono essere forniti, il tipo del valore di ritornoforniti, il tipo del valore di ritorno

Aiuta il compilatore ad individuare erroriAiuta il compilatore ad individuare erroriUna invocazione di funzione che non rispetta Una invocazione di funzione che non rispetta quanto indicato dal prototipo di funzione causa un quanto indicato dal prototipo di funzione causa un errore sintatico in fase di compilazioneerrore 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 interie restituisce un valore di tipo intero

Se una chiamata a funzione non riflette il prototipo dellafunzione (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 informazioneignorata 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

Page 21: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

HeadersHeadersCiascuna libreria standard ha un header che contiene i Ciascuna libreria standard ha un header che contiene i prototipi di tutte le funzioni della libreriaprototipi di tutte le funzioni della libreria

l’ header contiene i prototipi delle funzioni, le definizioni di l’ header contiene i prototipi delle funzioni, le definizioni di costanti e tipi di dato usati da tali funzioni costanti e tipi di dato usati da tali funzioni #include <xxx.h> include questi header (proprocessore)#include <xxx.h> include questi header (proprocessore)Esempi di librerie standardEsempi di librerie standard

stdio.hstdio.h libreria standard di I/Olibreria standard di I/Octype.hctype.h funzioni sui caratteri funzioni sui caratteri string.hstring.h funzioni di manipolazione di stringhefunzioni di manipolazione di stringhemath.hmath.h funzioni matematichefunzioni matematiche

Il codice delle funzioni di libreria viene quindi incluso Il codice delle funzioni di libreria viene quindi incluso nell’eseguibile dal linkernell’eseguibile dal linkerIl programmatore può creare delle sue librerie in modo da Il programmatore può creare delle sue librerie in modo da riusare il codice di funzioni che ha scrittoriusare il codice di funzioni che ha scritto

Page 22: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Chiamata per valore e per Chiamata per valore e per riferimentoriferimento

Nei linguaggi di programmazione esistono Nei linguaggi di programmazione esistono due modi di invocare una funzionedue modi di invocare una funzione

Chiamata per valoreChiamata per valore– quando gli argomenti sono passati per valore si fa una quando gli argomenti sono passati per valore si fa una

copia del valore dei parametri attuali con cui la funzione copia del valore dei parametri attuali con cui la funzione viene invocataviene invocata

– Tale copia viene memorizzata nelle locazioni di Tale copia viene memorizzata nelle locazioni di memoria assegnate ai parametri formali in seguito alla memoria assegnate ai parametri formali in seguito alla chiamata della funzionechiamata della funzione

– Modifiche effettuate sui valori memorizzati in tali Modifiche effettuate sui valori memorizzati in tali locazioni non hanno impatto sulle variabili della funzione locazioni non hanno impatto sulle variabili della funzione invocante invocante

Page 23: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsempioEsempio#include <stdio.h>#include <stdio.h>int quadrato (int);int quadrato (int);int main()int main(){ {

int x; int x; /*stampa i quadrati dei primi 10 interi*//*stampa i quadrati dei primi 10 interi*/for (x=1; x<=10; x++)for (x=1; x<=10; x++){{

printf (“%d ”, printf (“%d ”, quadrato(x));quadrato(x));} } printf(“\n”);printf(“\n”);return 0;return 0;

} }

int quadrato (int y)int quadrato (int y){{

y=y*y;y=y*y;return y;return y;

} }

Una copia del valore di x (che vale 1)viene memorizzata nella locazionedi memoria associata al parametro y

Viene modificato il valore di yNON subisce alcuna modifica ilvalore di xAll’uscita dalla funzione la memoria allocata a y viene rilasciata.Non rimane traccia sulle modifiche fatte. Rimane solo il valore di ritorno restituito al chiamante

Page 24: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Chiamata per valore e per Chiamata per valore e per riferimentoriferimento

Nei linguaggi di programmazione esistono Nei linguaggi di programmazione esistono due modi di invocare una funzionedue modi di invocare una funzione

Chiamata per riferimentoChiamata per riferimento– consente di modificare il valore della variabile con cui consente di modificare il valore della variabile con cui

viene invocata la funzioneviene invocata la funzione

printf (“%d ”, printf (“%d ”, quadrato(x));quadrato(x));

Se fosse una chiamata per riferimentoSi lavorerebbe direttamente su x

Il C consente solo la chiamata di funzioni per valore

Page 25: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsercizioEsercizioSi scriva un programma che calcoli il minimo di tre interiSi scriva un programma che calcoli il minimo di tre interi

#include <stdio.h>#include <stdio.h>int minimo (int,int,int);int minimo (int,int,int);int main()int main(){ {

int x1,x2,x3;int x1,x2,x3; printf (“inserisci tre interi \n”);printf (“inserisci tre interi \n”);scanf (“%d %d %d”, &x1,&x2,&x3);scanf (“%d %d %d”, &x1,&x2,&x3);printf(“il minimo dei tre valori e’ %d \n”, minimo(x1,x2,x3));printf(“il minimo dei tre valori e’ %d \n”, minimo(x1,x2,x3));return 0;return 0;

}} int minimo (int y1, int y2, int y3)int minimo (int y1, int y2, int y3){{

int temp=y1;int temp=y1;if (y2 < temp)if (y2 < temp)

temp=y2;temp=y2;if (y3 < temp)if (y3 < temp)

temp=y3;temp=y3;return temp;return temp;

}}

Inserisci tre interi463

Il minimo dei tre valori è 3

Page 26: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Vediamo cosa succede in memoriaVediamo cosa succede in memoria

Dal main invochiamo:Dal main invochiamo: printf(“il minimo dei tre valori e’ %d \n”, minimo(x1,x2,x3)); 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 3La variabile x1 vale 4, la variabile x2 vale 6, la variabile x3 vale 3

Si invoca la funzione minimoSi invoca la funzione minimo

Viene associata una locazione di memoria a ciascuno dei parametri y1, Viene associata una locazione di memoria a ciascuno dei parametri y1, y2, y3 della funzione. In queste locazioni vengono copiati i valori dei y2, y3 della funzione. In queste locazioni vengono copiati i valori dei parametri attuali. Viene anche allocata una locazione di memoria parametri attuali. Viene anche allocata una locazione di memoria per la variabile locale temp;per la variabile locale temp;

Memoria

4 y1

6

3

y2

y3

temp

Page 27: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Vediamo cosa succede in memoriaVediamo cosa succede in memoria

Viene quindi eseguito il corpo della funzione. La variabile temp Viene quindi eseguito il corpo della funzione. La variabile temp contiene il minimo dei tre valori y1, y2, y3, ovvero il valore 3contiene il minimo dei tre valori y1, y2, y3, ovvero il valore 3

Viene eseguito return temp che ritorna il controllo al main, con Viene eseguito return temp che ritorna il controllo al main, con valore di ritorno pari a 3valore di ritorno pari a 3

int minimo (int y1, int y2, int y3)int minimo (int y1, int y2, int y3){{

int temp=y1;int temp=y1;if (y2 < temp)if (y2 < temp)

temp=y2;temp=y2;if (y3 < temp)if (y3 < temp)

temp=y3;temp=y3;return temp;return temp;

}}

restituisce 3 alchiamante (ilmain)

Memoria

4 y1

6

3

y2

y3

temp3

La memoria allocataper i parametri y1,y2, y3

e per temp vienerilasciata

Page 28: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Vediamo cosa succede in memoriaVediamo cosa succede in memoria

printf(“il minimo dei tre valori e’ %d \n”, minimo(x1,x2,x3)); printf(“il minimo dei tre valori e’ %d \n”, minimo(x1,x2,x3));

y

restituisce 3 alchiamante (ilmain)

restituisce 3

Il valore 3 viene stampato

Memoria

4 y1

6

3

y2

y3

temp

int minimo (int y1, int y2, int y3)int minimo (int y1, int y2, int y3){{

int temp=y1;int temp=y1;if (y2 < temp)if (y2 < temp)

temp=y2;temp=y2;if (y3 < temp)if (y3 < temp)

temp=y3;temp=y3;return temp;return temp;

}}

3

Page 29: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsercizioEsercizioUn intero è primo se è divisibile solo per 1 Un intero è primo se è divisibile solo per 1 e se stessoe se stesso

Si scriva una funzione che determini se un Si scriva una funzione che determini se un numero è primo numero è primo

Si usi questa funzione in un programma che Si usi questa funzione in un programma che determini e stampi tutti i numeri primi tra 1 e determini e stampi tutti i numeri primi tra 1 e 10.00010.000

OSSERVAZIONE: sufficiente testare se OSSERVAZIONE: sufficiente testare se l’intero x è divisibile o meno per i numeri l’intero x è divisibile o meno per i numeri da 1 a sqrt(x). da 1 a sqrt(x). Perché?Perché?

Page 30: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>int primo (int);int primo (int);int main()int main(){ {

int i; int i; /*stampa i numeri primi tra 1 e 10.000*//*stampa i numeri primi tra 1 e 10.000*/for (i=1; i<=10000; i++)for (i=1; i<=10000; i++){{

if (primo (i)==1)if (primo (i)==1) printf (“%d \n”, i);printf (“%d \n”, i);

} } return 0;return 0;

} }

int primo (int y)int primo (int y){{

int x;int x;for (x=2; x<=sqrt(y); x++)for (x=2; x<=sqrt(y); x++){{

if (y % x == 0)if (y % x == 0) return 0;return 0;

} } return 1;return 1;} }

Page 31: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsercizioEsercizio

Un numero intero si dice Un numero intero si dice perfettoperfetto se i suoi se i suoi fattori (incluso 1 ma non il numero stesso) fattori (incluso 1 ma non il numero stesso) sommano al numero. Ad esempio 6 è un sommano al numero. Ad esempio 6 è un numero perfetto. I suoi fattori sono 1, 2 e numero perfetto. I suoi fattori sono 1, 2 e 3: 1+2+3=6. Si scriva una funzione perfect 3: 1+2+3=6. Si scriva una funzione perfect che, dato un numero intero, determini se che, dato un numero intero, determini se tale numero è perfetto. Si usi questa tale numero è perfetto. Si usi questa funzione per determinare e stampare tutti i funzione per determinare e stampare tutti i numeri perfetti tra 1 e 1000. numeri perfetti tra 1 e 1000.

Page 32: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione#include <stdio.h>#include <stdio.h>#include <math.h>#include <math.h>

// Restituisce 1 se l’input e’un numero perfetto// Restituisce 1 se l’input e’un numero perfettoint perfect (int);int perfect (int);

int main()int main(){ {

int i; int i; /*stampa i numeri perfetti tra 1 e 1.000*//*stampa i numeri perfetti tra 1 e 1.000*/for (i=1; i<=1000; i++)for (i=1; i<=1000; i++){{

if (perfect (i)==1)if (perfect (i)==1) printf (“%d \n”, i);printf (“%d \n”, i);

} } return 0;return 0;

} }

int perfect (int n)int perfect (int n){{

int tmp = n;int tmp = n;int tot = 0;int tot = 0;int d;int d;

for (d = 1; d < n; d++ )for (d = 1; d < n; d++ )if ( n % d == 0 )if ( n % d == 0 )

tot += d;tot += d;

if ( tot == n )if ( tot == n )return 1;return 1;

elseelsereturn 0;return 0;

}}

Page 33: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Gioco dei dadiGioco dei dadi

Il giocatore tira due dadi. Si calcola la Il giocatore tira due dadi. Si calcola la somma x dei valori della facce superiori somma x dei valori della facce superiori dei due dadi. Se tale somma è 7 o 11 il dei due dadi. Se tale somma è 7 o 11 il giocatore vince. Se è 2, 3 o 12 il giocatore giocatore vince. Se è 2, 3 o 12 il giocatore perde. Altrimenti x è il punto del giocatore perde. Altrimenti x è il punto del giocatore che deve continuare a giocare fino a che deve continuare a giocare fino a quando non si ottiene un valore uguale al quando non si ottiene un valore uguale al proprio punto. Se i dadi danno 7 il proprio punto. Se i dadi danno 7 il giocatore perde.giocatore perde.

Page 34: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Emulazione del lancio dei dadiEmulazione del lancio dei dadi

int rollDice ( )int rollDice ( ){{

int d1,d2,somma;int d1,d2,somma;d1=1+(rand() % 6);d1=1+(rand() % 6);d2=1+(rand() % 6);d2=1+(rand() % 6);return (d1+d2);return (d1+d2);

}} Numero pseudocasualetra 0 e 5(scaling)

Non ha argomentiProduce in outputil risultato di un tirodi dadi

Funzione della stdlib.hche produce un numeropseudocasuale tra 0 e RAND_MAX, con RAND_MAX almeno 32767

Page 35: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <time.h>#include <time.h>

enum STATO enum STATO { CONTINUA, VINTO, PERSO};{ CONTINUA, VINTO, PERSO};int rollDice ();int rollDice ();int main()int main(){{

int somma, mio_punto;int somma, mio_punto;enum STATO stato_del_gioco; enum STATO stato_del_gioco; /*stato_del_gioco è una variabile che /*stato_del_gioco è una variabile che può assumere valore CONTINUA, VINTO o PERSO*/può assumere valore CONTINUA, VINTO o PERSO*/srand (time (NULL));srand (time (NULL));somma=rollDice();somma=rollDice();switch(somma)switch(somma)

…… ……....} }

funzione rand, srand

Inizializza il semedel generatore pseudocasuale

Ritorna il tempo corrente in secondida un istante dato(funzione della libreria time.h)

tipo enumerato:insieme di costanti intere rappresentate da identificatoriCONTINUA ha associato il valore 0VINTO il valore 1PERSO il valore 2

Page 36: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzioneswitch(somma)switch(somma){{

case 7:case 7:case 11:case 11:stato_del_gioco=VINTO;stato_del_gioco=VINTO;break;break;

case 2:case 2:case 3:case 3:case 12:case 12:stato_del_gioco=PERSO;stato_del_gioco=PERSO;break;break;

default:default:stato_del_gioco=CONTINUA;stato_del_gioco=CONTINUA;mio_punto=somma;mio_punto=somma;break;break;

}}while (stato_del_gioco == CONTINUA) while (stato_del_gioco == CONTINUA) {{

somma=rollDice();somma=rollDice();if (somma ==mio_punto)if (somma ==mio_punto)

stato_del_gioco=VINTO;stato_del_gioco=VINTO;else if (somma == 7)else if (somma == 7)

stato_del_gioco=PERSO; stato_del_gioco=PERSO; }}

if (stato_del_gioco == VINTO)if (stato_del_gioco == VINTO)printf(“VINTO \n”);printf(“VINTO \n”);

}}

Se il gioco non si decideal primo tiro di dadi…

Page 37: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Page 38: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

VettoriVettori

Un vettore è una struttura dati Un vettore è una struttura dati contiene n elementi contiene n elementi dello stesso tipodello stesso tipo

memorizzati in celle successive di memoria memorizzati in celle successive di memoria

e’ possibile accedere in tempo costante ad un e’ possibile accedere in tempo costante ad un elemento specificando il suo indiceelemento specificando il suo indice

– se vett è il nome del vettore di interise vett è il nome del vettore di interi– vett[0] è il valore del primo elemento del vettorevett[0] è il valore del primo elemento del vettore– vett[i] è il valore dell’ i+1 –esimo elemento del vettore vett[i] è il valore dell’ i+1 –esimo elemento del vettore

indice del vettore

L’indice dell’elemento dell’array può anche essere specificatoda una espressioneAd esempio, se a=5 e b=6c[a+b] +=2;fa sì che si aggiunga due all’elemento con indice 11 (il 12esimoelemento del vettore c)

Page 39: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Definizione di un arrayDefinizione di un arraySpecifica il nome del vettore, il tipo dei Specifica il nome del vettore, il tipo dei suoi elementi ed il numero dei suoi suoi elementi ed il numero dei suoi elementielementi

int c[12];int c[12];

alloca memoria (12 celle consecutive) per alloca memoria (12 celle consecutive) per un vettore di nome c costituito da 12 interi.un vettore di nome c costituito da 12 interi.

memoria

c[0] c[1] c[11]

10-15 8 c[1] è uguale a -1c[11] uguale a 10

x=c[11]/2;assegna a x ilvalore 5

Page 40: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsempioEsempio

Definizione di un arrayDefinizione di un array

Inizializzazione di un arrayInizializzazione di un array

Uso di un arrayUso di un array

Page 41: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsempioEsempio#include <stdio.h>#include <stdio.h>int main()int main(){{

int a[10]; /* definisce un array di 10 interi, di nome a*/int a[10]; /* definisce un array di 10 interi, di nome a*/int i,x;int i,x;for (i=0; i<10; i++) for (i=0; i<10; i++) {{

printf (“inserisci valore \n”);printf (“inserisci valore \n”);scanf(“%d”,&x);scanf(“%d”,&x);a[i]=x; a[i]=x;

}}for (i=0; i<10; i++) for (i=0; i<10; i++) {{

printf (“%d %d \n”, i, a[i]); printf (“%d %d \n”, i, a[i]); }}

}}

a[0] a[1] a[9]

10-15 8 643 -326

0 51 -12 8…9 10

Page 42: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsempioEsempio#include <stdio.h>#include <stdio.h>

int main()int main()

{{

int a[10]= {5,-1,8,3,4,6,2,-3,6,10}; int a[10]= {5,-1,8,3,4,6,2,-3,6,10};

int i;int i;

for (i=0; i<10; i++) for (i=0; i<10; i++)

{{

printf (“%d %d \n”, i, a[i]); printf (“%d %d \n”, i, a[i]);

}}

}}

Definizione e inizializzazione

Se non sono specificati tutti glielementi quelli restanti sono messi a 0

Page 43: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsercizioEsercizio

Si scriva un programma che prenda da Si scriva un programma che prenda da input gli elementi di un array di interi, input gli elementi di un array di interi, calcoli e stampi la somma degli elementi calcoli e stampi la somma degli elementi dell’array.dell’array.

Page 44: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione#include <stdio.h>#include <stdio.h>#define DIM_ARRAY 10#define DIM_ARRAY 10int main()int main(){{

int a[int a[DIM_ARRAYDIM_ARRAY]; ]; int i, somma;int i, somma;somma = 0;somma = 0;for (i=0; i< for (i=0; i< DIM_ARRAYDIM_ARRAY; i++) ; i++) {{

printf (“inserisci elemento array \n”);printf (“inserisci elemento array \n”);scanf (“%d”, &x[i]); scanf (“%d”, &x[i]);

}}for (i=0; i< for (i=0; i< DIM_ARRAYDIM_ARRAY; i++) ; i++) {{

somma +=x[i];somma +=x[i];}}printf (“somma degli elementi dell’array: %d\n”, somma);printf (“somma degli elementi dell’array: %d\n”, somma);

}}

Page 45: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

EsercizioEsercizio

Si scriva un programma che calcoli Si scriva un programma che calcoli l’istogramma dei voti degli studenti in un l’istogramma dei voti degli studenti in un appello di esameappello di esame

Page 46: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione#include <stdio.h>#include <stdio.h>#define INTERVALLO_VOTI 30#define INTERVALLO_VOTI 30#define NUM_VALORI 100#define NUM_VALORI 100int main()int main(){{

int i,j,n;int i,j,n;int frequenza [INTERVALLO_VOTI]= {0};int frequenza [INTERVALLO_VOTI]= {0};int voti[NUM_VALORI];int voti[NUM_VALORI];

printf (“inserisci numero di voti delle persone che hanno sostenuto l’appello (al massimo 100)\n”);printf (“inserisci numero di voti delle persone che hanno sostenuto l’appello (al massimo 100)\n”);scanf (“%d”, &n); scanf (“%d”, &n); /*in n la dimensione effettiva dell’array voti, deve essere <= NUM_VALORI*//*in n la dimensione effettiva dell’array voti, deve essere <= NUM_VALORI*/

for (i=0; i<n; i++) for (i=0; i<n; i++) {{

printf (“inserisci elemento array \n”);printf (“inserisci elemento array \n”);scanf (“%d”, &voti[i]); scanf (“%d”, &voti[i]); ++frequenza[voti[i]];++frequenza[voti[i]];

}}printf (“Istogramma \d”);printf (“Istogramma \d”);for (i=0; i<INTERVALLO_VOTI; i++) for (i=0; i<INTERVALLO_VOTI; i++) {{

printf (“%d ”, i+1);printf (“%d ”, i+1);for (j=0; i<frequenza[j]; j++) for (j=0; i<frequenza[j]; j++) printf(“ * ”);printf(“ * ”);printf(“\n”);printf(“\n”);

}}}}

Definizione delle variabili

Inizializzazione del vettore

Page 47: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione#include <stdio.h>#include <stdio.h>#define INTERVALLO_VOTI 30#define INTERVALLO_VOTI 30#define NUM_VALORI 100#define NUM_VALORI 100int main()int main(){{

int i,j,n;int i,j,n;int frequenza [INTERVALLO_VOTI]= {0};int frequenza [INTERVALLO_VOTI]= {0};int voti[NUM_VALORI];int voti[NUM_VALORI];

printf (“inserisci numero di voti delle persone che hanno sostenuto l’appello (al massimo 100)\n”);printf (“inserisci numero di voti delle persone che hanno sostenuto l’appello (al massimo 100)\n”);scanf (“%d”, &n); scanf (“%d”, &n); /*in n la dimensione effettiva dell’array voti, deve essere <= NUM_VALORI*//*in n la dimensione effettiva dell’array voti, deve essere <= NUM_VALORI*/

for (i=0; i<n; i++) for (i=0; i<n; i++) {{

printf (“inserisci elemento array \n”);printf (“inserisci elemento array \n”);scanf (“%d”, &voti[i]);scanf (“%d”, &voti[i]); ++frequenza[voti[i]];++frequenza[voti[i]];

}}printf (“Istogramma \d”);printf (“Istogramma \d”);for (i=0; i<INTERVALLO_VOTI; i++) for (i=0; i<INTERVALLO_VOTI; i++) {{

printf (“%d ”, i+1);printf (“%d ”, i+1);for (j=0; i<frequenza[j]; j++) for (j=0; i<frequenza[j]; j++) printf(“ * ”);printf(“ * ”);printf(“\n”);printf(“\n”);

}}}}

Definizione delle variabili

Inizializzazione del vettore

Inserisci il numero di voti delle persone che hanno sostenuto l’appello (al massimo 100)1028182522183021222525…

VOTI INSERITI

Page 48: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione#include <stdio.h>#include <stdio.h>#define INTERVALLO_VOTI 30#define INTERVALLO_VOTI 30#define NUM_VALORI 100#define NUM_VALORI 100int main()int main(){{

int i,j,n;int i,j,n;int frequenza [INTERVALLO_VOTI]= {0};int frequenza [INTERVALLO_VOTI]= {0};int voti[NUM_VALORI];int voti[NUM_VALORI];

printf (“inserisci numero di voti delle persone che hanno sostenuto l’appello (al massimo 100)\n”);printf (“inserisci numero di voti delle persone che hanno sostenuto l’appello (al massimo 100)\n”);scanf (“%d”, &n); scanf (“%d”, &n); /*in n la dimensione effettiva dell’array voti, deve essere <= NUM_VALORI*//*in n la dimensione effettiva dell’array voti, deve essere <= NUM_VALORI*/

for (i=0; i<n; i++) for (i=0; i<n; i++) {{

printf (“inserisci elemento array \n”);printf (“inserisci elemento array \n”);scanf (“%d”, &voti[i]);scanf (“%d”, &voti[i]); ++frequenza[voti[i]];++frequenza[voti[i]];

}}printf (“Istogramma \d”);printf (“Istogramma \d”);for (i=0; i<INTERVALLO_VOTI; i++) for (i=0; i<INTERVALLO_VOTI; i++) {{

printf (“%d ”, i+1);printf (“%d ”, i+1);for (j=0; i<frequenza[j]; j++) for (j=0; i<frequenza[j]; j++) printf(“ * ”);printf(“ * ”);printf(“\n”);printf(“\n”);

}}}}

Definizione delle variabili

Inizializzazione del vettore

Istogramma12…18 * *192021 *22 * *232425 * * *262728 *2930 *

Specifica il numerodi studenti che hannoconseguito un determinatovoto

Page 49: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

StringheStringhe

Una stringa è una sequenza di caratteri Una stringa è una sequenza di caratteri che termina con ‘\0’.che termina con ‘\0’.

Una stringa può quindi essere vista come un Una stringa può quindi essere vista come un vettore di caratteri che termina con un carattere vettore di caratteri che termina con un carattere predefinito di fine stringa.predefinito di fine stringa.

InizializzazioneInizializzazionechar string1[ ] = “alunni”;char string1[ ] = “alunni”;

\0a l u n n i

Il numero di celleda allocare al vettoreviene decisa in base alla dimensione dellastringa con cui siinizializza il vettore

ALTERNATIVA PER L’INIZIALIZZAZIONEchar string1[ ]= {‘a’,’l’,’u’,’n’,’n’,’i’,’\0’}{‘a’,’l’,’u’,’n’,’n’,’i’,’\0’}

Page 50: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

StringheStringhe

DefinizioneDefinizionechar string2 [20];char string2 [20];

e inizializzazione:e inizializzazione:scanf(“%s”, string2);scanf(“%s”, string2);

Stampa di una stringaStampa di una stringaprintf (“%s \n”, string2);printf (“%s \n”, string2);

\0a l u n n i

Legge caratteri dainput fino al primo spazio e li inserisce in string2 aggiungendo uno \0

Il vettore deve esseresufficientemente lungoda contenere la stringainserita

Stampa ciò che è contenuto in string2 fino a \0 (escluso)

Page 51: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Come si passa un vettore ad una Come si passa un vettore ad una funzionefunzione

int v[50];int v[50];

int somma_vett(int vett[ ],int n)int somma_vett(int vett[ ],int n){{

int i;int i;int somma=0;int somma=0;for (i=0; i<n; i++) for (i=0; i<n; i++)

somma +=vett[i];somma +=vett[i];return somma;return somma;

}}

nome del vettore

Numero dielementi validiche si vogliono

considerare

Restituisce lasomma degli

elementi di unvettore

Chiamata alla funzionex=somma_vett(v,num);

Page 52: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Come si passa un vettore ad una Come si passa un vettore ad una funzionefunzione

I vettori di fatto vengono passati per I vettori di fatto vengono passati per riferimento riferimento

Il nome del vettore è di fatto l’indirizzo della prima Il nome del vettore è di fatto l’indirizzo della prima locazione di memoria allocata al vettorelocazione di memoria allocata al vettore

Nel parametro attuale si copia tale indirizzo. Nella Nel parametro attuale si copia tale indirizzo. Nella funzione si lavora quindi sulle celle allocate al funzione si lavora quindi sulle celle allocate al vettore nella funzione vettore nella funzione chiamantechiamante..

Modifiche fatte ai valori degli elementi del vettore Modifiche fatte ai valori degli elementi del vettore permangono all’uscita dalla funzionepermangono all’uscita dalla funzione

vett&vett[0]sono equivalenti

Page 53: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un esempio…Un esempio…Si scriva una funzione che data una stringa sostituisca Si scriva una funzione che data una stringa sostituisca tutte le cifre che compaiono nella stringa con il tutte le cifre che compaiono nella stringa con il carattere ‘*’.carattere ‘*’.

char str2[DIM_STRINGA];char str2[DIM_STRINGA];inizializzazione stringainizializzazione stringa

void modifica_stringa(int str[ ]);void modifica_stringa(int str[ ]);{{

int i=0;int i=0;while (str [i] != ‘\0’) while (str [i] != ‘\0’) {{if (str[ i] >= ‘0’ && str[i] <= ‘9’)if (str[ i] >= ‘0’ && str[i] <= ‘9’)

str[ i] = ‘*’;str[ i] = ‘*’;i=i+1;i=i+1;

}}}}

nella funzione chiamante

All’inizio del file prototipo diquesta funzione

La funzione non restituisce valori

str indica la locazione dimemoria del primo elementodel vettore

I vettori sono passatiper riferimentoCopiare interi vettori(che potrebbe significareMolti dati) ad ogni chiamataa funzione può essere molto inefficiente

Importante sempremettere il controllosul caratteredi fine stringaI caratteri sono

rappresentati coninteri – codice ASCII

Verifica se str[i] èuna cifra

I singoli elementidel vettore vengono invece passati pervalore

Page 54: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Cosa succede in memoria…Cosa succede in memoria…

Chiamata a funzioneChiamata a funzione

modifica_stringa(str2);modifica_stringa(str2);

a l 1 a \0

1415

str2

str2 è l’indirizzo di memoria in cui si memorizza str2[0]str2 è l’indirizzo di memoria in cui si memorizza str2[0]

14151415

str2 è stata definita edInzializzata nella funzionechiamante (che in questocaso è il main())

Page 55: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Cosa succede in memoria…Cosa succede in memoria…Si entra nella funzioneSi entra nella funzioneViene allocata memoria per la variabile locale Viene allocata memoria per la variabile locale intera iintera iViene copiato l’indirizzo di memoria in cui è Viene copiato l’indirizzo di memoria in cui è memorizzato il primo elemento del vettorememorizzato il primo elemento del vettore

a l 1 a \0

1415

str2

str2 è stata definita edInzializzata nella funzionechiamante (che in questocaso è il main())

i

2500

Allocata memoria all’entratanella funzione

Page 56: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Cosa succede in memoria…Cosa succede in memoria…Si comincia ad eseguire il corpo della Si comincia ad eseguire il corpo della funzionefunzione

a l 1 a \0

1415

str2

str2 è stata definita edInzializzata nella funzionechiamante (che in questocaso è il main())

i

2500

void modifica_stringa(int str[ ]);void modifica_stringa(int str[ ]);{{

int i=0;int i=0;while (str [i] != ‘\0’) while (str [i] != ‘\0’) {{if (str[ i] >= ‘0’ && str[i] <= ‘9’)if (str[ i] >= ‘0’ && str[i] <= ‘9’)

str[ i] = ‘*’;str[ i] = ‘*’;i=i+1;i=i+1;

}}}}

str[0] è il primo elementodel vettore str2; vale ‘a’È quindi diverso da ‘\0’

str

str[0] non è una cifra. QuindiSi incrementa il valore di ie si ritorna all’inizio del Ciclo.

01

Page 57: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Cosa succede in memoria…Cosa succede in memoria…Si comincia ad eseguire il corpo della Si comincia ad eseguire il corpo della funzionefunzione

a l 1 a \0

1415

str2

str2 è stata definita edInzializzata nella funzionechiamante (che in questocaso è il main())

i

2500

void modifica_stringa(int str[ ]);void modifica_stringa(int str[ ]);{{

int i=0;int i=0;while (str [i] != ‘\0’) while (str [i] != ‘\0’) {{if (str[ i] >= ‘0’ && str[i] <= ‘9’)if (str[ i] >= ‘0’ && str[i] <= ‘9’)

str[ i] = ‘*’;str[ i] = ‘*’;i=i+1;i=i+1;

}}}}

str[1] è il secondo elementodel vettore str2; vale ‘l’È quindi diverso da ‘\0’

str

str[1] non è una cifra. QuindiSi incrementa il valore di ie si ritorna all’inizio del Ciclo.

12

Page 58: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Cosa succede in memoria…Cosa succede in memoria…Si comincia ad eseguire il corpo della Si comincia ad eseguire il corpo della funzionefunzione

a l 1 a \0

1415

str2

str2 è stata definita edInzializzata nella funzionechiamante (che in questocaso è il main())

i

2500

void modifica_stringa(int str[ ]);void modifica_stringa(int str[ ]);{{

int i=0;int i=0;while (str [i] != ‘\0’) while (str [i] != ‘\0’) {{if (str[ i] >= ‘0’ && str[i] <= ‘9’)if (str[ i] >= ‘0’ && str[i] <= ‘9’)

str[ i] = ‘*’;str[ i] = ‘*’;i=i+1;i=i+1;

}}}}

str[2] è il terzo elementodel vettore str2; vale ‘1’È quindi diverso da ‘\0’

str

str[2] è una cifra. str[2]=‘*’Si incrementa il valore di ie si ritorna all’inizio del Ciclo.

23

*

Page 59: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Cosa succede in memoria…Cosa succede in memoria…Si comincia ad eseguire il corpo della Si comincia ad eseguire il corpo della funzionefunzione

a l 1 a \0

1415

str2

str2 è stata definita edInzializzata nella funzionechiamante (che in questocaso è il main())

i

2500

void modifica_stringa(int str[ ]);void modifica_stringa(int str[ ]);{{

int i=0;int i=0;while (str [i] != ‘\0’) while (str [i] != ‘\0’) {{if (str[ i] >= ‘0’ && str[i] <= ‘9’)if (str[ i] >= ‘0’ && str[i] <= ‘9’)

str[ i] = ‘*’;str[ i] = ‘*’;i=i+1;i=i+1;

}}}}

str[3] è il quarto elementodel vettore str2; vale ‘a’È quindi diverso da ‘\0’

str

str[3] non è una cifra. Si incrementa il valore di ie si ritorna all’inizio del Ciclo.

34

*

Page 60: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Cosa succede in memoria…Cosa succede in memoria…Si comincia ad eseguire il corpo della Si comincia ad eseguire il corpo della funzionefunzione

a l 1 a \0

1415

str2

str2 è stata definita edInzializzata nella funzionechiamante (che in questocaso è il main())

i

2500

void modifica_stringa(int str[ ]);void modifica_stringa(int str[ ]);{{

int i=0;int i=0;while (str [i] != ‘\0’) while (str [i] != ‘\0’) {{if (str[ i] >= ‘0’ && str[i] <= ‘9’)if (str[ i] >= ‘0’ && str[i] <= ‘9’)

str[ i] = ‘*’;str[ i] = ‘*’;i=i+1;i=i+1;

}}}}

str[4] è il quinto elementodel vettore str2; vale ‘\0’Condizione di treminazionedel ciclo si esce dal ciclo e dallafunzione

str34

*

La memoria allocata per la variabililocali alla funzione e per i parametri viene rilasciata

Rimangono le modifiche Effettuate su str2

Page 61: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un altro esempioUn altro esempio#include <stdio.h>#include <stdio.h>#define SIZE 5#define SIZE 5void modifyArray (int b[], int size);void modifyArray (int b[], int size);void modifyElement (int e);void modifyElement (int e);int main()int main(){{

int a[SIZE]={0,1,2,3,4};int a[SIZE]={0,1,2,3,4};int i;int i;printf(“effetti del passaggio ‘per riferimento’ degli array \n. printf(“effetti del passaggio ‘per riferimento’ degli array \n. Valori del vettore originale \n\n”);Valori del vettore originale \n\n”);for (i=0;i<SIZE;i++) {for (i=0;i<SIZE;i++) {

printf(“%d ”, a[i]);printf(“%d ”, a[i]);}}modifyArray(a,SIZE);modifyArray(a,SIZE);printf(“\n Nuovi valori degli elementi dell’array: \n\n”);printf(“\n Nuovi valori degli elementi dell’array: \n\n”);for (i=0;i<SIZE;i++) {for (i=0;i<SIZE;i++) {

printf(“%d ”, a[i]);printf(“%d ”, a[i]);}}printf(“\n\n effetto del passaggio di un elemento del vettore ‘per valore’. il valore di printf(“\n\n effetto del passaggio di un elemento del vettore ‘per valore’. il valore di a[3] è: %d”, a[3]);a[3] è: %d”, a[3]);modifyElement(a[3]);modifyElement(a[3]);printf(“il valore di a[3] ora è: %d”,a[3]);printf(“il valore di a[3] ora è: %d”,a[3]);return 0;return 0;

}}

Page 62: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un altro esempioUn altro esempio

void modifyArray (int b[], int size)void modifyArray (int b[], int size){{

int j;int j;for (j=0;j<size; j++){for (j=0;j<size; j++){

b[j]*=2;b[j]*=2;}}return;return;

}}

Page 63: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un altro esempioUn altro esempio

void modifyElement (int e)void modifyElement (int e)

{{

e*=2;e*=2;

printf(“valore elemento modificato: %d”,e);printf(“valore elemento modificato: %d”,e);

return;return;

}}

Page 64: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un altro esempioUn altro esempio#include <stdio.h>#include <stdio.h>#define SIZE 5#define SIZE 5void modifyArray (int b[], int size);void modifyArray (int b[], int size);void modifyElement (int e);void modifyElement (int e);int main()int main(){{

int a[SIZE]={0,1,2,3,4};int a[SIZE]={0,1,2,3,4};int i;int i;printf(“effetti del passaggio ‘per riferimento’ degli array \n. printf(“effetti del passaggio ‘per riferimento’ degli array \n. Valori del vettore originale \n\n”);Valori del vettore originale \n\n”);for (i=0;i<SIZE;i++) {for (i=0;i<SIZE;i++) {

printf(“%d”, a[i]);printf(“%d”, a[i]);}}modifyArray(a,SIZE);modifyArray(a,SIZE);printf(“\n Nuovi valori degli elementi dell’array: \n\n”);printf(“\n Nuovi valori degli elementi dell’array: \n\n”);for (i=0;i<SIZE;i++) {for (i=0;i<SIZE;i++) {

printf(“%d”, a[i]);printf(“%d”, a[i]);}}printf(“\n\n effetto del passaggio di un elemento del vettore ‘per valore’. il valore di printf(“\n\n effetto del passaggio di un elemento del vettore ‘per valore’. il valore di a[3] è: %d”, a[3]);a[3] è: %d”, a[3]);modifyElement(a[3]);modifyElement(a[3]);printf(“il valore di a[3] ora è: %d”,a[3]);printf(“il valore di a[3] ora è: %d”,a[3]);return 0;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: 12Il valore di a[3] ora è: 6

Siamo all’internodella funzione modifyElement

Page 65: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Page 66: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Qualificatore constQualificatore const

Consente di imporre che un array non Consente di imporre che un array non possa essere modificato dalla funzione possa essere modificato dalla funzione che lavora su di essoche lavora su di esso

Un esempio…Un esempio…

Page 67: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Esempio di utilizzo del qualificatore Esempio di utilizzo del qualificatore constconst

#include <stdio.h>#include <stdio.h>void tryToModifyArray(const int b[]);void tryToModifyArray(const int b[]);int main()int main(){{

int a[]={10,20,30};int a[]={10,20,30};tryToModifyArray(a);tryToModifyArray(a);printf(“%d%d%d\n”,a[0],a[1],a[2]);printf(“%d%d%d\n”,a[0],a[1],a[2]);return 0;return 0;

}}void tryToModifyArray(const int b[])void tryToModifyArray(const int b[]){{

b[0]/=2;b[0]/=2;b[1]/=2;b[1]/=2;b[2]/=2;b[2]/=2;

}}

Se si prova a modificareil contenuto di un elementodell’array avviene un errore in fase di compilazione

Compiling…Error: l-value specifies const object

Page 68: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Alcune operazioni su vettoriAlcune operazioni su vettori

Ricerca di un elemento (in vettori non Ricerca di un elemento (in vettori non ordinati e ordinati)ordinati e ordinati)

Ordinamento di un vettoreOrdinamento di un vettore

Calcolo della media, mediana degli Calcolo della media, mediana degli elementi di un vettoreelementi di un vettore

Page 69: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento di vettoriOrdinamento di vettori

Dato un vettore di n interi Dato un vettore di n interi vett vett riorganizzare i valori memorizzati nei suoi riorganizzare i valori memorizzati nei suoi elementi in modo che elementi in modo che

se i <j, vetti[i]<= vetti[j]se i <j, vetti[i]<= vetti[j]

……ovvero in modo tale che gli elementi del ovvero in modo tale che gli elementi del vettore siano ordinati in modo crescente.vettore siano ordinati in modo crescente.

Page 70: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

PseudocodicePseudocodice

Inizializza il vettore di interi con i valori dati; Inizializza il vettore di interi con i valori dati; inizializza una variabile contatore i a 0.inizializza una variabile contatore i a 0.

Esegui n-1 iterazioni (n num. elementi del Esegui n-1 iterazioni (n num. elementi del vettore). Per ogni iterazione: vettore). Per ogni iterazione:

Considera la posizione j del vettore (j=1,…,n-1)Considera la posizione j del vettore (j=1,…,n-1)– Se l’elemento in posizione j è maggiore dell’elemento in Se l’elemento in posizione j è maggiore dell’elemento in

posizione j+1 scambia i due elementiposizione j+1 scambia i due elementi

Vedremo che ogni iterazione è in grado di assicurare che almeno un ulteriore elemento sarà inserito nell’ordine corretto, progressivamente aumentando il numero di elementi ordinati e portando in n-1 iterazioni al pieno ordinamentodel vettore

Page 71: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Un esempioUn esempio

Prima iterazionePrima iterazione33

44

11

88

55

66

i

i 1

4

5

8

i

i

i 6

8

Il vettore NON è ordinato alla fine della prima iterazione

Page 72: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Idea: Idea: Dopo la prima iterazione il valore più grande si Dopo la prima iterazione il valore più grande si trova in fondo al vettore. trova in fondo al vettore.

Perché?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

Page 73: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Un esempioUn esempio

Seconda iterazioneSeconda iterazione33

11

44

55

66

88

i

i

1

3

i

i

Il vettore NON è ordinato alla fine della seconda iterazione

MA il secondo elemento più grandeÈ in penultima posizione. L’elementopiù grande in ultima posizione.

Page 74: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Perché?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 (l’unico 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 nell’ultima posizione dove c’è un valore più grabnde di lui finisce nella penultima posizione del vettore

Page 75: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Un esempioUn esempio

Terza iterazioneTerza iterazione11

33

44

55

66

88

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 conaltre due iterazioni in cui nonsi cambia nulla nel vettore.

Page 76: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Dimostrazione formale di correttezzaDimostrazione formale di correttezza(per induzione)(per induzione)

Vogliamo dimostrare che il BubbleSort Vogliamo dimostrare che il BubbleSort Termina sempreTermina sempre Produce un vettore ordinatoProduce un vettore ordinato

Terminazione banale. Numero di iterazioni Terminazione banale. Numero di iterazioni eseguite dal for annidato finite.eseguite dal for annidato finite.

SOLO una cattiva implementazione può portare a esecuzioni SOLO una cattiva implementazione può portare a esecuzioni infinite , NON l’ALGORITMO infinite , NON l’ALGORITMO

Vogliamo quindi dimostrare che dopo k iterazioni Vogliamo quindi dimostrare che dopo k iterazioni le ultime k posizioni del vettore contengono i k le ultime k posizioni del vettore contengono i k elementi più grandi, ordinati in ordine crescenteelementi più grandi, ordinati in ordine crescente

Dopo le n iterazioni eseguite dall’algoritmo il vettore contienegli n elementi ordinati in ordine crescente

SE VERO

Page 77: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Dimostrazione formale di correttezzaDimostrazione formale di correttezza(per induzione)(per induzione)

Passo base Passo base Affermazione vera per k=1Affermazione vera per k=1 Dimostrato 5 slide faDimostrato 5 slide fa

Passo induttivoPasso induttivoSe vero per ogni k<=h, k<n, dimostriamo che sia vero per k Se vero per ogni k<=h, k<n, dimostriamo che sia vero per k <=h+1<=h+1Claim: Dopo h+1 iterazioni le ultime h+1 posizioni del vettore Claim: Dopo h+1 iterazioni le ultime h+1 posizioni del vettore contengono gli h+1 elementi più grandi, ordinati in ordine contengono gli h+1 elementi più grandi, ordinati in ordine crescentecrescentePer ipotesi induttiva quando si comincia ad eseguire la h+1 Per ipotesi induttiva quando si comincia ad eseguire la h+1 iterazione le ultime h posizioni contengono gli h elementi più iterazione le ultime h posizioni contengono gli h elementi più grandi ordinati in ordine crescente. Tali elementi non grandi ordinati in ordine crescente. Tali elementi non verranno spostati. L’applicazione delle regole dell’algoritmo verranno spostati. L’applicazione delle regole dell’algoritmo non consente che elementi piu’ piccoli possano essere non consente che elementi piu’ piccoli possano essere spostati in posizioni di indice maggiore in cui sono spostati in posizioni di indice maggiore in cui sono memorizzati elementi più grandi.memorizzati elementi più grandi.Nella h+1 esima iterazione l’ordinamento relativo degli h Nella h+1 esima iterazione l’ordinamento relativo degli h elementi più grandi (già ordinati in ordine crescente) non elementi più grandi (già ordinati in ordine crescente) non subisce modifiche. subisce modifiche.

Page 78: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Dimostrazione formale di correttezzaDimostrazione formale di correttezza(per induzione)(per induzione)

Passo induttivoPasso induttivo– Quello che succede è che l’h+1 esimo Quello che succede è che l’h+1 esimo

elemento più grande viene spostato in elemento più grande viene spostato in posizione n-1-hposizione n-1-h

Le posizioni n-1, n-h contengono gli h elementi più Le posizioni n-1, n-h contengono gli h elementi più grandigrandi

Se l’h+1 esimo elemento più grande si trova in Se l’h+1 esimo elemento più grande si trova in posizione j, j <= n-1-h, e tutte le posizioni j,…,n-1-h posizione j, j <= n-1-h, e tutte le posizioni j,…,n-1-h conterranno elementi più piccoli conterranno elementi più piccoli quindi quindi avverranno switch tra la posizione j e j+1, j+2 e avverranno switch tra la posizione j e j+1, j+2 e j+3, etc. fino a portare l’h+1 esimo elemento più j+3, etc. fino a portare l’h+1 esimo elemento più grande in posizione n-1-h.grande in posizione n-1-h.

Page 79: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Codice del BubbleSortCodice del BubbleSort#include <stdio.h>#include <stdio.h>#define SIZE 10#define SIZE 10

int main()int main(){{

int a[SIZE]={2,6,4,8,10,12,89,68,45,37};int a[SIZE]={2,6,4,8,10,12,89,68,45,37};int i,j,hold;int i,j,hold;printf(“Ordinamento originale del vettore \n”);printf(“Ordinamento originale del vettore \n”);for (i=0; i<SIZE;i++)for (i=0; i<SIZE;i++){{

printf(“%d ”, a[i]);printf(“%d ”, a[i]);}}for (i=0;i<SIZE-1;i++)for (i=0;i<SIZE-1;i++){{

for (j=0;j<SIZE-1;j++)for (j=0;j<SIZE-1;j++){{

if (a[j])>a[j+1])if (a[j])>a[j+1]){{

hold=a[j];hold=a[j];a[j]=a[j+1];a[j]=a[j+1];a[j+1]=hold;a[j+1]=hold;

}}}}

}}printf (“\n vettore ordinato \n”); printf (“\n vettore ordinato \n”); /*stampa, come sopra del vettore*//*stampa, come sopra del vettore*/…………

}}

Se gli elementi dalla posizione1 alla n-1 contengono gli n-1 elementipiu’ grandi e sono ordinati in ordinecrescente ALLORA tutti gli elementidel vettore sono ordinati

Si lavora su j e j+1. Questa condizione impone che si considerinosolo elementi validi del vettore (non sieccede mai la sua dimensione)

Si potrebbe ottimizzare considerandoogni volta solo i primi n-i elementi del vettore

(quelli che seguono sono già ordinati)…

Page 80: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Caso peggioreCaso peggiore

Vediamo quale è il caso in cui ordinare il Vediamo quale è il caso in cui ordinare il vettore comporta l’esecuzione di un vettore comporta l’esecuzione di un numero maggiore di istruzioni numero maggiore di istruzioni un tempo un tempo di calcolo maggiore (complessità di calcolo maggiore (complessità dell’algoritmo BubbleSort)dell’algoritmo BubbleSort)

Il caso in cui gli elementi sono ordinati in ordine Il caso in cui gli elementi sono ordinati in ordine decrescente..vediamo cosa succede in questo decrescente..vediamo cosa succede in questo casocaso

Page 81: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Un esempioUn esempio

Prima iterazionePrima iterazione66

55

44

33

22

11

i

i

5

6

i

i

i

Il vettore NON è ordinato alla fine della prima iterazione

4

63

62

61

6

Page 82: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Un esempioUn esempio

Seconda iterazioneSeconda iterazione

55

44

33

22

11

66

i

i

4

5

i

i

Il vettore NON è ordinato alla fine della seconda iterazione

3

52

51

5

Page 83: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Un esempioUn esempio

Terza iterazioneTerza iterazione

44

33

22

11

55

66

i

i

3

4

i

Il vettore NON è ordinato alla fine della terza iterazione

2

41

4

Page 84: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Un esempioUn esempio

Quarta iterazioneQuarta iterazione33

22

11

44

55

66

i

i

2

3

Il vettore NON è ordinato alla fine della quarta iterazione

1

3

Page 85: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

Un esempioUn esempio

Quinta iterazioneQuinta iterazione22

11

33

44

55

66

i

Il vettore NON è ordinato alla fine della quinta iterazione

1

2

Page 86: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ordinamento dei vettoriOrdinamento dei vettoriBubbleSortBubbleSort

n-1 iterazioni per ordinare i nodin-1 iterazioni per ordinare i nodi

In ciascuna iterazione vengono In ciascuna iterazione vengono esaminati gli elementi del vettore e esaminati gli elementi del vettore e se un elemento e il successivo non se un elemento e il successivo non sono in ordine crescente viene sono in ordine crescente viene effettuato uno scambio effettuato uno scambio c*n*n c*n*n istruzioni nel caso peggioreistruzioni nel caso peggiore

Algoritmo di complessità O(nAlgoritmo di complessità O(n22))

11

22

33

44

55

66Data una funzione g(n) appartengono all’insiemeO(g(n)) quelle funzioni f(n) tali che esistano duecostanti intere positive c e n0 tali che 0<=f(n)<=c*g(n) per tutti gli n>=n0

Page 87: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Verifica e validazione di un Verifica e validazione di un programmaprogramma

VerificaVerifica

ValidazioneValidazione

Processi di test che assicuranoche il SW sviluppato seguale specifiche e le necessitàdell’utente

Boehm 1979Validazione: “Stiamo realizzando il prodotto giusto?”Verifica “Stiamo realizzando il prodotto nel modo giusto?”

Verifica che il programma implementatorisponda alle aspettative dell’utentefinale

Controlla che il programma segua lespecifiche

Page 88: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

V &V-Verifica e ValidazioneV &V-Verifica e Validazione

Esistono varie tecniche di verifica e analisi Esistono varie tecniche di verifica e analisi del sistemadel sistema

Tecniche statiche (solo verifica): analisi del Tecniche statiche (solo verifica): analisi del documento di requisiti, dei diagrammi usati per la documento di requisiti, dei diagrammi usati per la progettazione del SW; del codice sorgente del progettazione del SW; del codice sorgente del programmaprogramma

Tecniche dinamiche (verifica o validazione): Tecniche dinamiche (verifica o validazione): mettono sotto stress una implementazione mettono sotto stress una implementazione testando i risultati dell’esecuzione di un testando i risultati dell’esecuzione di un programma su dati di testprogramma su dati di test

Page 89: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Tecniche dinamiche (testing)Tecniche dinamiche (testing)Si stressa il programma con dati di testSi stressa il programma con dati di testL’esistenza di un difetto nel SW o di una L’esistenza di un difetto nel SW o di una inadeguatezza si inferisce dal fatto che vengono inadeguatezza si inferisce dal fatto che vengono prodotti in output valori diversi da quelli attesi prodotti in output valori diversi da quelli attesi

Statistical testing Statistical testing testa efficienza e affidabilità del testa efficienza e affidabilità del sistema. Analizza le frequenze degli input in un sistema reale sistema. Analizza le frequenze degli input in un sistema reale e esegue test su un campione rappresentativo dei dati di e esegue test su un campione rappresentativo dei dati di input.input. Defect testing Defect testing lo vedremo tra poco. Mira a individuare lo vedremo tra poco. Mira a individuare dove il programma non rispetta le specifiche.dove il programma non rispetta le specifiche.

Una volta trovato un difetto nel comportamento Una volta trovato un difetto nel comportamento del programma ne va compresa la causa del programma ne va compresa la causa ((debuggingdebugging)e il problema va rimosso.)e il problema va rimosso.

Localizzare L’errore

Progettare comeRisolvere l’errore Risolvere l’errore

Ritestare il programma

Page 90: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

TestingTesting

Unit testingUnit testing :usato per testare individualmente il :usato per testare individualmente il comportamento di una componente del comportamento di una componente del programma.programma.Module testingModule testing : un modulo è un insieme di : un modulo è un insieme di componenti dipendenti come un insieme di componenti dipendenti come un insieme di procedure e funzioni correlate. Può essere procedure e funzioni correlate. Può essere testato in isolamento dagli altri moduli del testato in isolamento dagli altri moduli del sistema.sistema.Sub-system testingSub-system testing : controlla il funzionamento : controlla il funzionamento di un insieme di moduli integrati in un di un insieme di moduli integrati in un sottosistema (per determinare ad esempio errori sottosistema (per determinare ad esempio errori di interfacciamento tra i moduli).di interfacciamento tra i moduli).

Page 91: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

TestingTesting

System testingSystem testing :più sottosistemi sono integrati nell’intero :più sottosistemi sono integrati nell’intero sistema. Questa fase di test verifica errori sistema. Questa fase di test verifica errori nell’interfacciamento tra i sottosistemi e verifica che il nell’interfacciamento tra i sottosistemi e verifica che il sistema verifichi i requisiti funzionali.sistema verifichi i requisiti funzionali.Acceptance testingAcceptance testing : fase finale del processo di testing : fase finale del processo di testing prima che il sistema sia accessibile per uso operativo. Il prima che il sistema sia accessibile per uso operativo. Il test è effettuato con dati reali. test è effettuato con dati reali.

Alfa testing si eseguono varie iterazioni con il cliente fino a Alfa testing si eseguono varie iterazioni con il cliente fino a quando il sistema implementato non soddisfa quando il sistema implementato non soddisfa completamente i requisiti del sistemacompletamente i requisiti del sistema

Page 92: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Tipi di testingTipi di testingTop down testingTop down testing– si comincia a testare la componente più astratta, poi le sottocomponenti si comincia a testare la componente più astratta, poi le sottocomponenti

eccecc Bottom up testingBottom up testing– il testing parte dalle componenti fondamentali, poi sottosistemi, sistemi,..il testing parte dalle componenti fondamentali, poi sottosistemi, sistemi,..

Thread testingThread testing– Si cercano di individuare e testare sequenze di istruzioni che in fase di Si cercano di individuare e testare sequenze di istruzioni che in fase di

esecuzione verrebbero eseguite dal programma e si testanoesecuzione verrebbero eseguite dal programma e si testanoStress testingStress testing– si cerca di individuare la capacità del sistema di lavorare ad un certo livello 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 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 il sistema. Si supera tale carico, stressando il sistema fino a quando non avvengono problemiavvengono problemi

per verificare che i malfunzionamenti ad alto carico producano danni limitatiper verificare che i malfunzionamenti ad alto carico producano danni limitati per riuscire ad individuare difetti che non verrebbero individuati a carichi per riuscire ad individuare difetti che non verrebbero individuati a carichi “normali”“normali”

Back-to-back testingBack-to-back testing– Quando una nuova versione del sistema (v2.0) è sviluppata a partire da Quando una nuova versione del sistema (v2.0) è sviluppata a partire da

una versione precedente (v1.0) una versione precedente (v1.0) Si scelgono dei casi di test per testare le funzionalità comuniSi scelgono dei casi di test per testare le funzionalità comuniSe eseguono le due versioni in tali scenariSe eseguono le due versioni in tali scenariSi verifica che diano gli stessi risultati o che le differenze siano quelle atteseSi verifica che diano gli stessi risultati o che le differenze siano quelle attese

Page 93: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Defect testingDefect testingTest che rivela la presenza di difetti prima Test che rivela la presenza di difetti prima che il SW sia consegnato al clienteche il SW sia consegnato al cliente– Il defect testing non può in generale essere Il defect testing non può in generale essere

esaustivo (dovrebbe testare ogni istruzione del esaustivo (dovrebbe testare ogni istruzione del programma ed ogni sequenza di esecuzione programma ed ogni sequenza di esecuzione delle istruzioni)delle istruzioni)

– Devono essere scelti accuratamente alcuni Devono essere scelti accuratamente alcuni casi di test rappresentativi dei vari scenari in casi di test rappresentativi dei vari scenari in cui verrà eseguito il programmacui verrà eseguito il programma

Page 94: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

TestingTesting

Cosa importante testare:Cosa importante testare:– Funzionalità precedentemente offerte devono Funzionalità precedentemente offerte devono

continuare a funzionare nella nuova versione continuare a funzionare nella nuova versione del SWdel SW

– tipici input o situazioni tipiche durante tipici input o situazioni tipiche durante l’esecuzione del sistema devono essere l’esecuzione del sistema devono essere testatitestati

– la capacità del sistema di offrire le funzionalità la capacità del sistema di offrire le funzionalità previste deve essere verificata previste deve essere verificata

Page 95: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un tipo di defect testingUn tipo di defect testing

Black box testing (o testing funzionale)Black box testing (o testing funzionale)– i test vengono selezionati sulla base delle i test vengono selezionati sulla base delle

specifiche del programmaspecifiche del programma– Il sistema è visto come una scatola neraIl sistema è visto come una scatola nera

Dati input Output

Il comportamento del sistema può essere determinato studiando gli input e i corrispettivi output

Page 96: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Black box testingBlack box testing

Dati di inputDi test

Dati di inputChe causano

Comportamentianomali

OutputOutputanomali

Page 97: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Black box testingBlack box testing

Come scegliere gli inputin modo che ci sia unaelevata probabilita’ chesiano in Ie ?

I dati di input tipicamente di dividono in classiIl programma si comporta in modosimile per input della stessa classe

I dati di test sono rappresentativi delle diverse classiPer ciascuna classe i casi limite ed un caso tipicodevono essere testati

INPUT

Page 98: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Black box testingBlack box testing

Importante specificare per ogni funzioneImportante specificare per ogni funzione– Precondizione Precondizione eventuali assunzioni fatte eventuali assunzioni fatte

nella scrittura della funzione (ad es. la nella scrittura della funzione (ad es. la funzione lavora su vettori di almeno un funzione lavora su vettori di almeno un elemento)elemento)

– Postcondizione (descrive cosa fa la funzione, Postcondizione (descrive cosa fa la funzione, ad es. ‘dato un vettore calcola la somma dei ad es. ‘dato un vettore calcola la somma dei suoi elementi’suoi elementi’

Servono per determinare gli scenari di test

Page 99: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Esempio di black box testingEsempio di black box testing

/* pre: array di almeno un elemento/* pre: array di almeno un elementopost: verifica se l’elemento key è contenuto post: verifica se l’elemento key è contenuto

nell’array*/nell’array*/int search (int key, int v[ ], int n)int search (int key, int v[ ], int n){{int i;int i;for (i=0; i<n; i++)for (i=0; i<n; i++)

if (v[i]==key)if (v[i]==key)return 1;return 1;

return 0;return 0;} }

– Testare il programma nel caso di array con Testare il programma nel caso di array con un unico elemento un unico elemento

– Testare il programma anche per diverse Testare il programma anche per diverse dimensioni di array (questo riduce la dimensioni di array (questo riduce la probabilità che un output corretto sia prodotto probabilità che un output corretto sia prodotto da un programma sbagliato accidentalmente da un programma sbagliato accidentalmente perché è capitato di testare un caso perché è capitato di testare un caso particolare in cui il programma non dà errore)particolare in cui il programma non dà errore)

– Eseguire test in modo da testare posizioni Eseguire test in modo da testare posizioni estreme dell’array e intermedie…estreme dell’array e intermedie…

Dati di testDati di testArray di 1 elementoArray di 1 elemento key nell’arraykey nell’array

Array di 1 elementoArray di 1 elemento key NON nell’arraykey NON nell’array

Array con più di 1 elementoArray con più di 1 elemento key 1° elemento dell’arraykey 1° elemento dell’array

Array con più di 1 elementoArray con più di 1 elemento key ultimo elem. dell’arraykey ultimo elem. dell’array

Array con più di 1 elementoArray con più di 1 elemento key pos. Intermedia dell’arraykey pos. Intermedia dell’array

Array con più di 1 elementoArray con più di 1 elemento key NON nell’arraykey NON nell’array

Page 100: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un esempioUn esempioSi scriva una funzione che data una stringa Si scriva una funzione che data una stringa calcoli la prima occorrenza di un carattere c calcoli la prima occorrenza di un carattere c nella stringa. nella stringa. Restituisce l’indice del vettore Restituisce l’indice del vettore stringa in cui il carattere c compare se c è uno stringa in cui il carattere c compare se c è uno dei caratteri della stringa; -1 altrimenti.dei caratteri della stringa; -1 altrimenti.

/* pre:/* pre:post: restituisce l’indice del vettore stringa in cui il post: restituisce l’indice del vettore stringa in cui il

carattere c compare se c è uno dei caratteri carattere c compare se c è uno dei caratteri della stringa; -1 altrimentidella stringa; -1 altrimenti.*/.*/

Page 101: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un esempioUn esempio/* pre:/* pre:post: restituisce l’indice del vettore stringa in cui il carattere post: restituisce l’indice del vettore stringa in cui il carattere

c compare se c è uno dei caratteri della stringa; -1 c compare se c è uno dei caratteri della stringa; -1 altrimenti.*/altrimenti.*/

int prima_occorrenza_str (char str[ ], char c)int prima_occorrenza_str (char str[ ], char c){{

int i;int i;for (i=0; str[i]!=‘\0’; i++)for (i=0; str[i]!=‘\0’; i++)

if (str[i]==c)if (str[i]==c)return i;return i;

return -1;return -1;}}

Test a scatola nerastringa vuotastringa di un elemento =c !=cstringa con più elementi c in prima posizione c in ultima posizione c in posizione interemedia c NON nella stringa

Page 102: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ricerca di un elemento in un vettoreRicerca di un elemento in un vettore

Abbiamo già visto il caso in cui il vettore Abbiamo già visto il caso in cui il vettore non è ordinatonon è ordinato– può essere necessario scandire l’intero può essere necessario scandire l’intero

vettore per sapere se l’elemento è presente o vettore per sapere se l’elemento è presente o meno nel vettoremeno nel vettore

Complessità O(n)Complessità O(n)

– si può ricercare più efficacemente un si può ricercare più efficacemente un elemento nel vettore se tale vettore è elemento nel vettore se tale vettore è ordinato?ordinato?

Page 103: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ricerca di un elemento in un Ricerca di un elemento in un vettore ordinato (ricerca binaria)vettore ordinato (ricerca binaria)A ogni passo elimina la metà degli elementi A ogni passo elimina la metà degli elementi dell’array dall’insieme di elementi da dell’array dall’insieme di elementi da scandagliarescandagliareSi confronta la chiave con l’lemento intermedio Si confronta la chiave con l’lemento intermedio dell’arraydell’array– se la chiave è più grande bisognerà esaminare solo se la chiave è più grande bisognerà esaminare solo

la metà destra dell’arrayla metà destra dell’array– se la chiave è più piccola bisognerà esaminare solo la se la chiave è più piccola bisognerà esaminare solo la

metà sinistra dell’arraymetà sinistra dell’array– se la chiave è uguale all’elemento cercato allora se la chiave è uguale all’elemento cercato allora

abbiamo trovato l’elemento!abbiamo trovato l’elemento!

Si procede fino a quando o si è trovato l’elemento Si procede fino a quando o si è trovato l’elemento oppure non ci sono più elementi da scandagliareoppure non ci sono più elementi da scandagliare

1210986531

Key = 4

La chiave NON è presente nel vettore !

Page 104: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ricerca binariaRicerca binariaint ricerca_binaria (const int b[ ], int key, int low, int high)int ricerca_binaria (const int b[ ], int key, int low, int high){{

int middle;int middle;int found = 0;int found = 0;while ((low <= high) && (found==0))while ((low <= high) && (found==0)){{

middle = (low+ high)/2;middle = (low+ high)/2;if (key == b[middle])if (key == b[middle])

found=1;found=1;else if (key < b[middle])else if (key < b[middle])

high=middle-1;high=middle-1;elseelse

low=middle +1;low=middle +1;}}return found;return found;

}}

/*pre: low e high indici tra 0 e n-1; vettore ordinatopost: dato un vettore ordinato di interi ed un interokey verifica se key è contenuto nel vettore */

Page 105: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Complessità della ricerca binariaComplessità della ricerca binaria

Se il numero di elementi del vettore è nSe il numero di elementi del vettore è n

Prima iterazione: Prima iterazione: – n posizioni da scandagliaren posizioni da scandagliare

Seconda iterazioneSeconda iterazione– <=n/2 posizioni da scandagliare<=n/2 posizioni da scandagliare

Terza iterazioneTerza iterazione– <= n/4 posizioni da scandagliare<= n/4 posizioni da scandagliare

In log (n) iterazioni l’algoritmo termina complessità O(log n)

Se il vettore è di1048576 elementi-se il vettore non èordinato possiamo dovereseguire c* 1048576 istruzioni per trovare l’elemento-se il vettore è ordinatosi riducono a c1*20istruzioni

Page 106: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza dell’algoritmo di Correttezza dell’algoritmo di ricerca binariaricerca binaria

Vediamo un secondo approccio di dimostrazioneVediamo un secondo approccio di dimostrazione– Dimostrazione per assurdo Dimostrazione per assurdo

Scriviamo la tesi che vogliamo dimostrareScriviamo la tesi che vogliamo dimostrareEs. l’algoritmo di ricerca binaria, applicato ad un vettore Es. l’algoritmo di ricerca binaria, applicato ad un vettore

ordinato, con low =0, high= dimensione del vettore -1, ordinato, con low =0, high= dimensione del vettore -1, termina sempre restituendo un valore che è 0 se la chiave termina sempre restituendo un valore che è 0 se la chiave non è presente nel vettore e 1 se la chiave è presente nel non è presente nel vettore e 1 se la chiave è presente nel vettore.vettore. Supponiamo per assurdo che esista un caso in cui la tesi Supponiamo per assurdo che esista un caso in cui la tesi non è verificatanon è verificata

Es. in cui l’algoritmo restituisce un valore non corretto.Es. in cui l’algoritmo restituisce un valore non corretto. Facciamo vedere che questo porta ad una contraddizione Facciamo vedere che questo porta ad una contraddizione con le ipotesi di lavorocon le ipotesi di lavoro

Es. non è possibile che l’algoritmo restituisca un valore non Es. non è possibile che l’algoritmo restituisca un valore non corretto A MENO che il vettore non sia ordinato (che è una corretto A MENO che il vettore non sia ordinato (che è una ipotesi invece del nostro claim)ipotesi invece del nostro claim)

Per vettori ordinati è vero che l’algoritmo restituisce valore corretto (CVD)

Page 107: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

LemmaLemmaL’algoritmo di ricerca binaria termina L’algoritmo di ricerca binaria termina sempre restituendo un valore booleanosempre restituendo un valore booleano

Numero limitato di iterazioni del cicloNumero limitato di iterazioni del ciclo

Ogni volta che si entra nel ciclo Ogni volta che si entra nel ciclo o found viene messo a 1 while ((low <= high) && (found==0))while ((low <= high) && (found==0))

{{middle = (low+ high)/2;middle = (low+ high)/2;if (key == b[middle])if (key == b[middle])

found=1;found=1;else if (key < b[middle])else if (key < b[middle])

high=middle-1;high=middle-1;elseelse

low=middle +1;low=middle +1;}}

(in questo caso found non puòessere successivamente rimessoa 0 si esce dal ciclo)

oppure l’intervallo 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))while ((low <= high) && (found==0)){{

middle = (low+ high)/2;middle = (low+ high)/2;if (key == b[middle])if (key == b[middle])

found=1;found=1;else if (key < b[middle])else if (key < b[middle])

high=middle-1;high=middle-1;elseelse

low=middle +1;low=middle +1;}}

Quando si esce dal ciclo si esegue return found;return found;Ritornando il controllo al chiamante e Ritornando il controllo al chiamante e Restituendo un valore booleano Restituendo un valore booleano (1 per VERO, 0 per FALSO)(1 per VERO, 0 per FALSO)

Page 108: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza della ricerca binariaCorrettezza della ricerca binaria

Dato un vettore ordinato, low==0, Dato un vettore ordinato, low==0, high==n-1 (con dimensione del vettore) e high==n-1 (con dimensione del vettore) e dato un intero key ricerca_binaria verifica dato un intero key ricerca_binaria verifica se key è presente o meno nel vettorese key è presente o meno nel vettore– restituisce 0 se key non è presenterestituisce 0 se key non è presente– 1 altrimenti1 altrimenti

Terminazione già dimostrata

Inoltre osserviamo che l’algoritmo opera sempre su indici validi delvettore. Si parte con low=0, high=n-1 (indici validi).high viene solo diminuito,low solo aumentato. Non appena low > high la funzione termina.

Page 109: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza della ricerca binariaCorrettezza della ricerca binariaDato un vettore ordinato, low==0, high==n-1 Dato un vettore ordinato, low==0, high==n-1 (con dimensione del vettore) e dato un intero (con dimensione del vettore) e dato un intero key ricerca_binaria verifica se key è presente o key ricerca_binaria verifica se key è presente o meno nel vettoremeno nel vettore– restituisce 0 se key non è presenterestituisce 0 se key non è presente– 1 altrimenti1 altrimenti

Supponiamo PER ASSURDO che esista un Supponiamo PER ASSURDO che esista un vettore ordinato vett, ed una chiave k, tale che vettore ordinato vett, ed una chiave k, tale che ricerca_binaria produca un risultato non correttoricerca_binaria produca un risultato non corretto– caso A) k compare in vett ma l’algoritmo di ricerca caso A) k compare in vett ma l’algoritmo di ricerca

binaria restituisce 0 (FALSO)binaria restituisce 0 (FALSO)– Caso B) k non compare in vett ma l’algoritmo di Caso B) k non compare in vett ma l’algoritmo di

ricerca binaria restituisce 1 (VERO)ricerca binaria restituisce 1 (VERO)

Vedremo che entrambi questi due casi NON possono verificarsi. Infatti illoro verificarsi porta a delle CONTRADDIZIONI.

Page 110: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza della ricerca binariaCorrettezza della ricerca binariaSupponiamo per assurdo cheSupponiamo per assurdo che– Caso B) k non compare in vett ma l’algoritmo di Caso B) k non compare in vett ma l’algoritmo di

ricerca binaria restituisce 1 (VERO)ricerca binaria restituisce 1 (VERO)

Osserviamo che l’algoritmo restituisce il valore Osserviamo che l’algoritmo restituisce il valore della variabile found. found viene messo a 1 della variabile found. found viene messo a 1 soltanto se si eseguesoltanto se si esegueif (k == vett[middle])if (k == vett[middle])

found=1;found=1; k compare tra gli elementi del vettorek compare tra gli elementi del vettore

CONTRADDIZIONECONTRADDIZIONE

Page 111: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza della ricerca binariaCorrettezza della ricerca binariaSupponiamo per assurdo cheSupponiamo per assurdo checaso A) k compare in vett ma l’algoritmo di caso A) k compare in vett ma l’algoritmo di ricerca binaria restituisce 0 (FALSO). ricerca binaria restituisce 0 (FALSO).

Se found viene messa a 1 (VERO) non può essere Se found viene messa a 1 (VERO) non può essere rimessa a 0 (FALSO) rimessa a 0 (FALSO) se i è l’indice in cui se i è l’indice in cui compare il valore k tale posizione non è mai compare il valore k tale posizione non è mai esaminata esaminata altrimenti avremmo eseguito altrimenti avremmo eseguito if (k == vett[middle])if (k == vett[middle])

found=1;found=1;e restituito 1e restituito 1

Page 112: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza della ricerca binariaCorrettezza della ricerca binariaQuesto significa che usciamo dal ciclo Questo significa che usciamo dal ciclo (low > high) senza mai aver esaminato (low > high) senza mai aver esaminato l’elemento in posizione il’elemento in posizione i

Originariamente tutti gli elementi del Originariamente tutti gli elementi del vettore erano da esaminarevettore erano da esaminare

L’osservazione precedente significa che L’osservazione precedente significa che ad una determinata iterazione abbiamo ad una determinata iterazione abbiamo tolto dall’insieme degli elementi da tolto dall’insieme degli elementi da scandagliare l’elemento in posizione i…sia scandagliare l’elemento in posizione i…sia h tale iterazioneh tale iterazione

Page 113: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza della ricerca binariaCorrettezza della ricerca binariaNell’h-esima iterazione possono Nell’h-esima iterazione possono succedere tre cose (in base al codice succedere tre cose (in base al codice dell’algoritmo)dell’algoritmo)

Può essere che Può essere che k == vett[middle]k == vett[middle]

found=1;found=1; CONTRADDIZIONE

Page 114: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza della ricerca binariaCorrettezza della ricerca binariaNell’h-esima iterazione possono succedere tre Nell’h-esima iterazione possono succedere tre cose (in base al codice dell’algoritmo)cose (in base al codice dell’algoritmo)

Può essere che Può essere che k < vett[middle]k < vett[middle]

high =middle-1;high =middle-1;

Per l’ipotesi che durante questa iterazione Per l’ipotesi che durante questa iterazione l’elemento in posizione i venga escluso da quelli l’elemento in posizione i venga escluso da quelli da scandagliare i > middle. Ma allora da scandagliare i > middle. Ma allora

k<vett[middle] è in posizione precedente ad un k<vett[middle] è in posizione precedente ad un elemento con valore kelemento con valore k

Il vettore non è ordinato in ordine crescenteIl vettore non è ordinato in ordine crescenteCONTRADDIZIONE

Page 115: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Correttezza della ricerca binariaCorrettezza della ricerca binariaNell’h-esima iterazione possono succedere tre Nell’h-esima iterazione possono succedere tre cose (in base al codice dell’algoritmo)cose (in base al codice dell’algoritmo)

Può essere che Può essere che k > vett[middle]k > vett[middle]

low =middle+1;low =middle+1;

Per l’ipotesi che durante questa iterazione Per l’ipotesi che durante questa iterazione l’elemento in posizione i venga escluso da quelli l’elemento in posizione i venga escluso da quelli da scandagliare i < middle. Ma allora da scandagliare i < middle. Ma allora

k>vett[middle] è in posizione successiva ad un k>vett[middle] è in posizione successiva ad un elemento con valore kelemento con valore k

Il vettore non è ordinato in ordine crescenteIl vettore non è ordinato in ordine crescenteCONTRADDIZIONE

L’ipotesi che il claim non sia vero porta a contraddizioni con le Ipotesi di lavoro Il claim è corretto

Page 116: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Ancora sul testingAncora sul testing

Testing strutturale (white box o glass box)Testing strutturale (white box o glass box)– Si analizza il codice e si usa la conoscenza Si analizza il codice e si usa la conoscenza

della struttura del programma per stabilire i della struttura del programma per stabilire i dati di testdati di test

Si vuole cercare di ‘esercitare’ ogni percorso di Si vuole cercare di ‘esercitare’ ogni percorso di esecuzione (path testing)esecuzione (path testing)

Ogni istruzione condizionale deve essere testata Ogni istruzione condizionale deve essere testata sia quando la condizione è vera che quando è sia quando la condizione è vera che quando è falsafalsa

– Si parte dai diagrammi di flusso..Si parte dai diagrammi di flusso..

Page 117: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Un esempio: ricerca binariaUn esempio: ricerca binarialow<=high

!foundkey==

b[middle]

key<

b[middle]

returnfound

T

F

F

T

T

F

T F

Vogliamo testare i varipercorsi 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 cuila condizione sia vera sia nel caso in cui sia falsa-ciascun while, for, ecc, sia eseguito sia nel caso in cuila condizione di entra nel ciclo sia vera sia nel caso in cuisia falsa

Page 118: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

Calcolo della media, mediana in un Calcolo della media, mediana in un vettorevettore

Si scriva un computer che dati 100 dati Si scriva un computer che dati 100 dati forniti da input e memorizzati in un vettore forniti da input e memorizzati in un vettore calcoli la media e la mediana di tali valoricalcoli la media e la mediana di tali valori– Media: somma dei valori del vettore / numero Media: somma dei valori del vettore / numero

degli elementi del vettoredegli elementi del vettore– Mediana: valore intermedio una volta Mediana: valore intermedio una volta

ordinato il vettoreordinato il vettore Se il vettore ha 8 elementi con valori crescenti Se il vettore ha 8 elementi con valori crescenti s1,s2,s3,…, s8 la mediana è il valore s4s1,s2,s3,…, s8 la mediana è il valore s4

Page 119: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione

#include <stdio.h>#include <stdio.h>

#define SIZE 100#define SIZE 100

void mean (const int answer [ ], int n);void mean (const int answer [ ], int n);

void median (int answer [ ], int n);void median (int answer [ ], int n);

void bubblesort (int answer [ ], int n);void bubblesort (int answer [ ], int n);

Page 120: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzioneint main ()int main (){ { int dati [SIZE]; int dati [SIZE]; int i;int i;for (i=0; i<SIZE; i++)for (i=0; i<SIZE; i++){{

printf (“insersci valore \n”);printf (“insersci valore \n”);scanf(“%d”, &dati[i]);scanf(“%d”, &dati[i]);

}}mean (dati,SIZE);mean (dati,SIZE);median (dati, SIZE);median (dati, SIZE);} }

Page 121: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione

void mean (int answer[ ], int n)void mean (int answer[ ], int n){ {

int total, j;int total, j;total=0;total=0;for (j=0; j<n; j++)for (j=0; j<n; j++)

total += answer[j];total += answer[j];printf (“il valore della media e’ %f \n”, printf (“il valore della media e’ %f \n”, (float) total/n);(float) total/n);

} }

Page 122: 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.

Prof.ssa Chiara Petrioli -- corso di progrProf.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007ammazione 1, a.a. 2006/2007

SoluzioneSoluzione

void median (int answer[ ], int n)void median (int answer[ ], int n)

{ {

bubblesort (answer,n);bubblesort (answer,n);

printf (“il valore della mediana e’ %d \n”, printf (“il valore della mediana e’ %d \n”,

answer[n/2]);answer[n/2]);

} }