;; ESEMPI DEL COSTRUTTO COND ;; funzione valore assoluto ;; vabs: dato x, restituisce x se x>=0, -x altrimenti ;; vabs: number -> number (define (vabs x) ( cond [(< x 0) (- x)] [(>= x 0) x])) ;; l'ultimo test e' evitabile (else x))), ;; il test ha un costo ;; Implementazione alternativa (define (vabs1 x) ( cond ([< x 0] (- x)) (else x ))) ;; esercizio dato a lezione ;; funzione segno, restituisce 1 se x>0, 0 se x=0 ;; e -1 se x<0 (define (segno x) (cond ([> x 0] 1) ([= x 0] 0) (else -1))) ; test con Step di (segno -1) (segno 0) ;; Come ottimizzare i test? ;; Esempio: valutare a quali sottointervallo ;; appartiene un dato numero ;; supporre l'intervallo dei numeri sia suddiviso in: ;; compreso fra -5 e 5 (estremi esclusi), minori o ;; uguali a 5, maggiori o uguali a 5 (define (intervallo x) (cond ([<= x -5] 1) ([< x 5] 2) (else 3))) ;; attenzione all'ordine di valutazione! ;; invertendo le condizioni sopra si cambia il comportamento del programma ;; Esercizi da risolvere: ;; Esercizio 1 ;; implementare la funzione f(x,y): ;; f(x,y)= |x| se x^2 - y -3 < 10 ;; f(x,y)= sin x se x=y=10 ;; f(x,y)= 0 altrimenti (define (f x y) (cond [(< (- (* x x) y 3) 10) (vabs x)] [(= x y 10) (sin x)] [else 0])) ;; Esercizio 2 ;; implementare una funzione che, dati due numeri, esegue una funzione su di essi dipendente da un ulteriore parametro codice operativo ;; in particolare, se questo vale 1 l'operazione deve essere quella di somma, se 2 quella differenza, 3 somma dei valori assoluti, 4 calcola il resto della divizione intera (remainder num num) (define (alu x y codop) (cond [(= codop 1)(+ x y)] [(= codop 2)(- x y)] [(= codop 3)(+ (abs x) (abs y))] [(= codop 4)(remainder x y)] [(= codop 5)(/ x y)] [else 'errore]))