corso di informatica medica

56
Corso di Informatica Medica Esercitazione VIII 19 giugno 2014 Alessandro A. Nacci [email protected] - alessandronacci.com 1

Upload: duongthu

Post on 04-Jan-2017

234 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Corso di Informatica Medica

Corso di Informatica Medica Esercitazione VIII

!19 giugno 2014

!Alessandro A. Nacci

[email protected] - alessandronacci.com

1

Page 2: Corso di Informatica Medica

2

Page 3: Corso di Informatica Medica

L’albero genealogico

• Scrivere un programma C che sia in grado di rappresentare e gestire un albero genealogico

3

• In particolare, vogliamo poter fare:

- Creare una persona

- Rappresentare di una popolazione

- Aggiungere figli ad una persona

- Elencare i figli e i nipoti dato un antenato

LEZIONE PRECEDENTE

Page 4: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

LEZIONE PRECEDENTE

Page 5: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

ogni  cerchio  si  chiama  “nodo”

LEZIONE PRECEDENTE

Page 6: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

ogni  cerchio  si  chiama  “nodo”

PADRE

FIGLIO

LEZIONE PRECEDENTE

Page 7: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

ogni  cerchio  si  chiama  “nodo”

PADRE

FIGLIO

PADRE

FIGLI

LEZIONE PRECEDENTE

Page 8: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

ogni  cerchio  si  chiama  “nodo”

PADRE

FIGLIO

PADRE

FIGLI

PADRE

FIGLIO

LEZIONE PRECEDENTE

Page 9: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

ogni  cerchio  si  chiama  “nodo”

PADRE

FIGLIO

PADRE

FIGLI

PADRE

FIGLIO

PADRE

FIGLIO

LEZIONE PRECEDENTE

Page 10: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

ogni  cerchio  si  chiama  “nodo”

PADRE

FIGLIO

PADRE

FIGLI

PADRE

FIGLIO

PADRE

FIGLIO

PADRE

FIGLIO

LEZIONE PRECEDENTE

Page 11: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

RADICE

FOGLIAFOGLIA

FOGLIA FOGLIA

ogni  cerchio  si  chiama  “nodo”

PADRE

FIGLIO

PADRE

FIGLI

PADRE

FIGLIO

PADRE

FIGLIO

PADRE

FIGLIO

LEZIONE PRECEDENTE

Page 12: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

Può  essere  utile  per  rappresentare  un  albero  genealogico?

RADICE

FOGLIAFOGLIA

FOGLIA FOGLIA

ogni  cerchio  si  chiama  “nodo”

PADRE

FIGLIO

PADRE

FIGLI

PADRE

FIGLIO

PADRE

FIGLIO

PADRE

FIGLIO

LEZIONE PRECEDENTE

Page 13: Corso di Informatica Medica

Una famosa struttura dati: l’albero

4

P0

P1 P2 P3

P4 P5

Può  essere  utile  per  rappresentare  un  albero  genealogico?

RADICE

FOGLIAFOGLIA

FOGLIA FOGLIA

ogni  cerchio  si  chiama  “nodo”

PADRE

FIGLIO

PADRE

FIGLI

PADRE

FIGLIO

PADRE

FIGLIO

PADRE

FIGLIO

OVVIAMENTE SI

LEZIONE PRECEDENTE

Page 14: Corso di Informatica Medica

• OGNI NODO DELL’ALBERO SARA’ PER NOI UNA PERSONA

5

P==

LEZIONE PRECEDENTE

Page 15: Corso di Informatica Medica

Una Persona

• SESSO

• NOME

• ETA?

• CHI SONO I GENITORI?

• CHI SONO I FIGLI?

• QUANTI FIGLI?

6

LEZIONE PRECEDENTE

Page 16: Corso di Informatica Medica

Una Popolazione

• Una popolazione è rappresentata da un insieme di persone

• Ogni persona ha un suo indice (numero univoco di identificazione)

• Esiste un numero di persone della

7cardinalità

1 2 73 4 5 6

LEZIONE PRECEDENTE

Page 17: Corso di Informatica Medica

Una Persona nella popolazione

• SESSO

• NOME

• ETA?

• CHI SONO I GENITORI?

• CHI SONO I FIGLI?

• QUANTI FIGLI?

8cardinalità

1 2 73 4 5 6

Li  rappresentiamo  con  l’indice  della  persona  nella  popolazione

LEZIONE PRECEDENTE

Page 18: Corso di Informatica Medica

Persona e Popolazione (codice C)

9

LEZIONE PRECEDENTE

Page 19: Corso di Informatica Medica

Persona e Popolazione (codice C)

9

LEZIONE PRECEDENTE

Page 20: Corso di Informatica Medica

Persona e Popolazione (codice C)

9

LEZIONE PRECEDENTE

Page 21: Corso di Informatica Medica

Creazione di una persona

10

LEZIONE PRECEDENTE

Page 22: Corso di Informatica Medica

Creazione di una persona

10

LEZIONE PRECEDENTE

Page 23: Corso di Informatica Medica

Aggiunta persona alla popolazione

11

LEZIONE PRECEDENTE

Page 24: Corso di Informatica Medica

Aggiunta persona alla popolazione

11

LEZIONE PRECEDENTE

Page 25: Corso di Informatica Medica

Aggiunta di un figlio

12

LEZIONE PRECEDENTE

Page 26: Corso di Informatica Medica

Aggiunta di un figlio

12

LEZIONE PRECEDENTE

Page 27: Corso di Informatica Medica

Funzioni di stampa a schermo

13

LEZIONE PRECEDENTE

Page 28: Corso di Informatica Medica

Funzioni di stampa a schermo

13

LEZIONE PRECEDENTE

Page 29: Corso di Informatica Medica

Funzioni di stampa a schermo

13

LEZIONE PRECEDENTE

Page 30: Corso di Informatica Medica

Elenco dei figli e dei nipoti

14

Page 31: Corso di Informatica Medica

Elenco dei figli e dei nipoti

14

Page 32: Corso di Informatica Medica

La nostra popolazione

15

MARCO PIPPOLUCASTEFANIA ARIANNALUCIA STEFANORINALDO

P0 P1 P2 P3 P4 P5 P6 P7

Page 33: Corso di Informatica Medica

La nostra popolazione

15

MARCO PIPPOLUCASTEFANIA ARIANNALUCIA STEFANORINALDO

P0 P1 P2 P3 P4 P5 P6 P7

Marco e' padre di LUCA e di PIPPO Stefania e' madre di LUCA e di PIPPO Arianna e' figlia di Marco e Lucia Stefano e' figlio di Arianna e Rinaldo

Page 34: Corso di Informatica Medica

La nostra popolazione

15

MARCO PIPPOLUCASTEFANIA ARIANNALUCIA STEFANORINALDO

P0 P1 P2 P3 P4 P5 P6 P7

P4 P0 P1

P5 P2 P3

P7P6

Marco e' padre di LUCA e di PIPPO Stefania e' madre di LUCA e di PIPPO Arianna e' figlia di Marco e Lucia Stefano e' figlio di Arianna e Rinaldo

Page 35: Corso di Informatica Medica

La nostra popolazione (codice C)

16

Page 36: Corso di Informatica Medica

Aggiungiamo le parentele

17

P4 P0 P1

P5 P2 P3

P7P6

Page 37: Corso di Informatica Medica

Aggiungiamo le parentele

17

P4 P0 P1

P5 P2 P3

P7P6

Page 38: Corso di Informatica Medica

Il main()

18

Page 39: Corso di Informatica Medica

RICORSIONE

19

Page 40: Corso di Informatica Medica

Divide et impera

• Metodo di approccio ai problemi che consiste nel dividere il problema dato in problemi più semplici

• I risultati ottenuti risolvendo i problemi più semplici vengono combinati insieme per costituire la soluzione del problema originale

• Generalmente, quando la semplificazione del problema consiste essenzialmente nella semplificazione dei DATI da elaborare (ad es. la riduzione della dimensione del vettore

20

Page 41: Corso di Informatica Medica

La ricorsione (1)

• Una funzione è detta ricorsiva se chiama se stessa

• Se due funzioni si chiamano l’un l’altra, sono dette mutuamente ricorsive

• La funzione ricorsiva sa risolvere direttamente solo casi particolari di un problema detti casi di base: se viene invocata passandole dei dati che costituiscono uno dei casi di base, allora restituisce un risultato

• Se invece viene chiamata passandole dei dati che NON costituiscono uno dei casi di base, allora chiama se stessa (passo ricorsivo) passando dei DATI semplificati/ridotti

21

Page 42: Corso di Informatica Medica

La ricorsione (II)

• Ad ogni chiamata si semplificano/riducono i dati, così ad un certo punto si arriva ad uno dei casi di base

• Quando la funzione chiama se stessa, sospende la sua esecuzione per eseguire la nuova chiamata

• L’esecuzione riprende quando la chiamata interna a se stessa termina

• La sequenza di chiamate ricorsive termina quando quella più interna (annidata) incontra uno dei casi di base

• Ogni chiamata alloca sullo stack (in stack frame diversi) nuove istanze dei parametri e delle variabili locali (non static)

22

Page 43: Corso di Informatica Medica

Esempio: il fattoriale

23

Page 44: Corso di Informatica Medica

Esempio: il fattoriale - passo per passo

24

Page 45: Corso di Informatica Medica

Ricorsione - Esercizio 1

• Scrivere una funziona ricorsiva che calcoli ricorsivamente la somma di tutti i numeri compresi tra 0 ed x

• Il prototipo della funzione è: int ric(int x)

25

Page 46: Corso di Informatica Medica

Ricorsione - Esercizio 1

• Scrivere una funziona ricorsiva che calcoli ricorsivamente la somma di tutti i numeri compresi tra 0 ed x

• Il prototipo della funzione è: int ric(int x)

25

Page 47: Corso di Informatica Medica

Ricorsione - Esercizio 1I

• Scrivere le versioni ricorsiva ed iterativa di una funziona che calcoli il seguente valore

26

Page 48: Corso di Informatica Medica

Ricorsione - Esercizio 1I

• Scrivere le versioni ricorsiva ed iterativa di una funziona che calcoli il seguente valore

26

Page 49: Corso di Informatica Medica

Ricorsione - Esercizio 1I

• Scrivere le versioni ricorsiva ed iterativa di una funziona che calcoli il seguente valore

26

Page 50: Corso di Informatica Medica

Ricorsione - Esercizio 1I

• Scrivere le versioni ricorsiva ed iterativa di una funziona che calcoli il seguente valore

26

Page 51: Corso di Informatica Medica

Qualche considerazione

• L’apertura delle chiamate ricorsive semplifica il problema, ma non calcola ancora nulla

• Il valore restituito dalle funzioni viene utilizzato per calcolare il valore finale man mano che si chiudono le chiamate ricorsive: ogni chiamata genera valori intermedi a partire dalla fine

• Nella ricorsione vera e propria non c’è un mero passaggio di un risultato calcolato nella chiamata più interna a quelle più esterne, ossia le return non si limitano a passare indietro invariato un valore, ma c’è un’elaborazione intermedia

27

Page 52: Corso di Informatica Medica

Quando utilizzare la ricorsione

28

Page 53: Corso di Informatica Medica

Quando utilizzare la ricorsione

29

Page 54: Corso di Informatica Medica

Ricorsione - Esercizio III

• Analizzare il comportamento della seguente funzione ricorsiva mostrando l’andamento delle variabili, considerando i seguenti input:

• funzione(231,0) • Dire quale funzione espleta

30

#include <stdio.h>#define DIMENSIONE 10

int mia_funzione(int num, int part) {if (num == 0)

return part;else {

return mia_funzione(num/10, part*10 + num%10);}

}

int main(){

int a = reverse2(21,0);printf("%d\n",a);

}

Page 55: Corso di Informatica Medica

31

Page 56: Corso di Informatica Medica

Tutte il materiale sarà disponibile sul mio sito internet:

alessandronacci.com

32

Potete lasciare il vostro giudizio qui:

http://tinyurl.com/IEIMExe2014

CREDITS ————————————— Parte del materiale di questa lezione è stato preso da http://staff.polito.it/claudio.fornaro/CorsoC/24-Ricorsione.pdf http://lia.deis.unibo.it/Courses/InfoChim1112/lucidi/es03-FunzRic.pdf