+ All Categories
Home > Documents > Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio:...

Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio:...

Date post: 24-Jul-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
13
1 Carlo Strapparava - Informatica Esercizio: punti e segmenti ! Punti e segmenti nel piano, con data abstraction Carlo Strapparava - Informatica Esercizio: punti e segmenti ! Punti e segmenti nel piano, con data abstraction ! Lunghezza di un segmento ! Data abstraction: ! Segmento " Costruttore make-seg pt1 pt2 " Selettori start-point seg end-point seg ! Punto " Costruttore make-point x y " Selettori x-coor point y-coor point x 1 x 2 y 1 y 2 l = ( x 2 " x 1 ) 2 + ( y 2 " y 1 ) 2
Transcript
Page 1: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

1

Carlo Strapparava - Informatica

Esercizio: punti e segmenti

! Punti e segmenti nel piano,con data abstraction

Carlo Strapparava - Informatica

Esercizio: punti e segmenti! Punti e segmenti nel piano,

con data abstraction! Lunghezza di un segmento

! Data abstraction:

! Segmento" Costruttore

make-seg pt1 pt2

" Selettoristart-point segend-point seg

! Punto" Costruttore

make-point x y

" Selettorix-coor pointy-coor point

x1 x2

y1

y2

!

l = (x2" x

1)2

+ (y2" y

1)2

Page 2: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

2

Carlo Strapparava - Informatica

Esercizio: punti e segmenti(define (segment-length segment)

(let ((dx (- (x-coord (end-point segment))

(x-coord (start-point segment))))

(dy (- (y-coord (end-point segment))

(y-coord (start-point segment)))))

(sqrt (+ (square dx) (square dy)))))

(define (make-seg pt1 pt2)

(cons pt1 pt2))

(define (start-point seg)

(car seg))

(define (end-point seg)

(cdr seg))

Implementazione segmento

(define (make-point x y)

(cons x y))

(define (x-coor point)

(car point))

(define (y-coor point)

(cdr point))

Implementazione punto (coordinate rettangolari)

Carlo Strapparava - Informatica

Esercizio: punti e segmenti! Cambiamo la rappresentazione dei punti e usiamo la

rappresentazione polare p=(r,!)! I programmi di alto livello (es. segment-length) non

cambiano: usano costruttori e selettori con gli stessi nomi

r

!

!

x = r cos"

y = r sin"

(define (make-point r ang)

(cons r ang))

(define (x-coor p)

(* (car p) (cos (cdr p))))

(define (y-coor p)

(* (car p) (sin (cdr p))))

Page 3: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

3

Carlo Strapparava - Informatica

Che cosa intendiamo per “dati” ?

! I dati sono definiti da una collezione dicostruttori e selettori, insieme a specifichecondizioni che queste procedure devonosoddisfare

! Data abstraction interviene a tutti i livelli! Es. Non abbiamo mai detto cosa sia una

coppia, ma soltanto che avevamo leprocedure cons, car e cdr per operare sullecoppie

Carlo Strapparava - Informatica

Che cosa intendiamo per “dati” ?

! Riguardo le coppie, l’unica cosa che ciinteressa sapere è che

! cons, car, e cdr sono primitive nelloScheme

! Tuttavia qualunque tripla di procedure chesoddisfa le precedenti condizioni, può essereusata per implementare le coppie

(car (cons x y)) => x

(cdr (cons x y)) => y

Page 4: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

4

Carlo Strapparava - Informatica

Che cosa intendiamo per “dati” ?

! Per esempio, possiamo implementare lecoppie, senza usare nessuna struttura dati,ma soltanto le procedure

(define (cons x y)

(lambda (pick)

(cond ((= pick 1) x)

((= pick 2) y)

(else (error "L'argomento non e' ne' 1 ne' 2”))))

)

(define (car z) (z 1))

(define (cdr z) (z 2))

Carlo Strapparava - Informatica

Che cosa intendiamo per “dati” ?(define (cons x y)

(lambda (pick)

(cond ((= pick 1) x)

((= pick 2) y)

(else (error "L'argomento non e' ne' 1 ne' 2”))))

)

(define (car z) (z 1))

(define (cdr z) (z 2))

(cons 6 9) => (lambda (pick)

(cond ((= pick 1) 6)

((= pick 2) 9)

(else (error "L'argomento non e' ne' 1 ne' 2”))))

Page 5: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

5

Carlo Strapparava - Informatica

Cons, car, cdr in versione procedurale

! Esiste una versione ancora più elegante diimplementare le coppie “proceduralmente”

(define (cons x y)

(lambda (m) (m x y)))

(define (car z)

(z (lambda (p q) p)))

(define (cdr z)

(z (lambda (p q) q)))

Esercizio: verificare che funzionano con ilmodello di sostituzione

Carlo Strapparava - Informatica

Che cosa intendiamo per “dati” ?

! L’uso di queste procedure appena viste è quanto dipiù lontano ci sia dalla nostra intuizione di dato

! Tuttavia possiamo verificare che soddisfano lecondizioni date per cons, car e cdr

! Se usiamo queste procedure, esse sono indistinguibilida quelle che usano strutture dati “reali”

! La rappresentazione procedurale dei dati gioca unruolo fondamentale nelle techniche diprogrammazione avanzata, come l’object-oriented

! In particolare quanto visto prima, è un esempio diobject-oriented di stile message-passing

Page 6: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

6

Carlo Strapparava - Informatica

Visualizzare le coppie

! Abbiamo visto che le coppie (pairs)costituiscono una sorta di “colla” per costruireoggetti composti complessi

! La notazione “standard” per visualizzare lecoppie - ad es. (cons 1 2) - è chiamatanotazione box-and-pointer

1

2(cons 1 2)

(car (cons 1 2))

" 1

(cdr (cons 1 2))

" 2

Carlo Strapparava - Informatica

Dati gerarchici e proprietà di chiusura

! Abbiamo visto che cons può essere usato percombinare coppie

! Le coppie costituiscono una sorta di mattoneuniversale per costruire ogni sorta di strutturedati

(cons (cons 1 2)

(cons 3 4)) 3 4

1 2

Page 7: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

7

Carlo Strapparava - Informatica

Dati gerarchici e proprietà di chiusura

! La capacità di creare coppie i cui elementi sono altrecoppie è l’essenza dell’importanza della struttura alista

! Questa capacità si chiama proprietà di chiusura delcons

! cons può prendere coppie in input e produce coppiein output

(cons (cons 1 (cons 2 3))

4))

2 31

4

Carlo Strapparava - Informatica

Proprietà di chiusura

! La parola “chiusura” viene dall’algebraastratta

! Un insieme di elementi si dice chiuso secondouna certa operazione, se applicandol’operazione agli elementi dell’insieme, siottengono elementi che appartengono ancoraall’insieme

Page 8: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

8

Carlo Strapparava - Informatica

Proprietà di chiusura

! La proprietà di chiusura ci permette di crearestrutture gerarchiche

! Strutture gerarchiche: strutture composte diparti che a loro volta sono composte di partiecc…

! Le procedure composte sono ancora procedure! I dati composti sono ancora dati! Vedremo alcune tecniche standard per

rappresentare sequenze (liste) e alberi, usandole coppie

Carlo Strapparava - Informatica

Rappresentare le sequenze (liste)! Una sequenza è una collezione ordinata di

oggetti

! Un modo semplice di rappresentare lesequenze in termini di coppie è usando unacatena di coppie

(cons 1

(cons 2

(cons 3

(cons 4 nil))))

1 2 3 4

Page 9: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

9

Carlo Strapparava - Informatica

Rappresentare le sequenze (liste)

! Il car di ciascuna coppia corrisponde ad unelemento della catena

! Il cdr di una coppia è la coppia successivanella catena

! Il cdr della coppia finale segnala la fine dellacatena:" nella rappresentazione box-and-pointer è indicato

come un barra /" nei programmi con la variabile nil" nil può essere pensato come la sequanza di

nessun elemento (cioè la lista vuota)

Carlo Strapparava - Informatica

Liste! Lo Scheme fornisce una procedura primitiva list che è

il costruttore delle liste! La lista vista prima può essere costruita con(list 1 2 3 4)

! In generale(list <el1> <el2> … <eln>)

! È equivalente a(cons <el1> (cons <el2> (cons … (cons <eln> nil)…)))

! (list) ritorna la lista vuota: (define nil (list))! I sistemi Scheme stampano le liste come sequenze di

elementi

(list 1 2 3 4)

" (1 2 3 4)

Page 10: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

10

Carlo Strapparava - Informatica

Operazioni sulle liste

! Tramite car e cdr possiamo scrivereprocedure che manipolano le liste

! Per esempio, scriviamo una proceduralist-ref che prende due argomenti:

1. una lista2. un numero n

! e ritorna l’ n-esimo elemento della lista! Il primo elemento è in posizione 0

Carlo Strapparava - Informatica

Operazioni sulle liste

(define (list-ref items n)

(if (= n 0)

(car items) ;per n=0 torna il car della lista

(list-ref (cdr items) (- n 1))))

;altrimenti torna l’ (n-1) esimo elemento del cdr della lista

(define lista-quadrati (list 1 4 9 16 25))

(list-ref lista-quadrati 3)

"16

3 2 1 0

Page 11: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

11

Carlo Strapparava - Informatica

Operazioni sulle liste

! Spesso dobbiamo scandire la lista tramite ilcdr

! Lo Scheme fornisce una procedura primitivanull? che testa se il suo argomento è la listavuota

(null? nil)

" #t

(null? (list 1 2))

" #f

Carlo Strapparava - Informatica

Esempio: lunghezza di una lista

(define (length items)

(if (null? items)

0 ;la lunghezza della lista vuota è 0

(+ 1 (length (cdr items))))) ;altrimenti la lunghezza è 1 più la lunghezza del cdr

(define dispari (list 1 3 5 7))

(length dispari)

" 4

Page 12: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

12

Carlo Strapparava - Informatica

Esempio: lunghezza di una lista

! Riconosciamo nella definizione di length ilclassico piano dell’induzione" la lunghezza della lista vuota è 0" la lunghezza di una lista è 1 più la lunghezza del cdr

della lista

! Possiamo anche definire length in stile iterativo

(define (length items)

(define (length-iter a count)

(if (null? a)

count

(length-iter (cdr a) (+ 1 count))))

(length-iter items 0))

Carlo Strapparava - Informatica

Esempio: append

! Un’altra tecnica comune è quello di costruirenuove liste con una successione di cons

! Es. La procedura append prende due listecome argomenti, e da queste forma unanuova lista

(append lista-quadrati dispari)

" (1 4 9 16 25 1 3 5 7)

(append dispari lista-quadrati)

" (1 3 5 7 1 4 9 16 25)

Page 13: Esercizio: punti e segmenti - Carlo Strapparava · 1 Carlo Strapparava - Informatica Esercizio: punti e segmenti!Pu nt iesgm lpao, con data abstraction Carlo Strapparava - Informatica

13

Carlo Strapparava - Informatica

Esempio: append

! Per implementare append usiamo ancora unpiano ricorsivo:

! Fai append di list1 list2" se list1 è la lista vuota, allora il risultato è list2" altrimenti, fai append del cdr di list1 con list2,

e fai cons del car di list1 con questo risultato

(define (append list1 list2)

(if (null? list1)

list2

(cons (car list1) (append (cdr list1) list2))))

Carlo Strapparava - Informatica

Esercizi:last-pair e reverse(define (last-pair list) ;restituisce l’ultimo pair di una lista

(if (null? (cdr list))

list

(last-pair (cdr list))))

(define (reverse items)

(if (null? items)

nil

(append (reverse (cdr items)) (list (car items)))))

(define (reverse items) ;reverse in versione iterativa

(define (rev-iter items acc)

(if (null? items)

acc

(rev-iter (cdr items) (cons (car items) acc))))

(rev-iter items nil))

Carlo Strapparava
Carlo Strapparava
Carlo Strapparava

Recommended