5. Les Structures
1 Exercice 5.6.1
2 Exercice 5.6.2
3 Exercice 5.6.3
4 Exercice 5.6.4
5 Exercice 5.6.5
6 Exercice 5.6.6
6.0.1.11

5. Les Structures

1 Exercice 5.6.1

(define-struct voiture (marque modele prix couleur date))

> (define JB007
    (make-voiture "Aston-Martin" "DB-5" 270000 "gris" 1963))
> (> (voiture-prix JB007) 200000)

#t

2 Exercice 5.6.2

Attention, le symbole rectangle est une primitive dans les images !

(define-struct cercle (centre rayon))
(define-struct rect (coin largeur hauteur))
(define (aire F)
  (cond ((cercle? F) (* pi (sqr (cercle-rayon F))))
        ((rect? F)   (* (rect-largeur F) (rect-hauteur F)))
        (else (error 'aire F " n'est ni un cercle ni un rect !"))))

3 Exercice 5.6.3

Je vous le laisse...

4 Exercice 5.6.4

Cet exercice est intéressant car l’une des composantes de la structure est une image. Ceci viole un tant soit peu le modèle MVC en mélangeant le modèle et la vue mais enfin...

Je trouve l’équation y=f(x) de la parabole en écrivant les contraintes de passage par A, B et S. Il vient y=4x-x2/50

(define (paraballe)
  (local [(define-struct monde (img x))
          (define FOND (rectangle 200 200 'solid "black"))
          (define BALLE (circle 15 'solid "yellow"))
          (define (suivant m)
            (local [(define img (monde-img m)) (define x (monde-x m))]
              (make-monde (add-line img x (f x) (+ x 5) (f (+ x 5)) "yellow")
                          (+ x 5))))
          (define (f x)
            (* x (- 4 (/ x 50))))
          (define (dessiner m)
            (place-image BALLE (monde-x m) (f (monde-x m)) (monde-img m)))
          (define (final? m)
            (>= (monde-x m) 200))]
    (big-bang (make-monde FOND 0)
              (on-tick suivant)
              (on-draw dessiner)
              (stop-when final?))))

paraballe

5 Exercice 5.6.5

C’est une variante de l’exercice précédent. Une fois que l’on a mis le doigt là-dessus, on ne s’arrête pas de trouver des variantes...

(define (cours-de-bourse)
  (local [(define (alea)
            (if (= (random 2) 0) 5 -5))
          (define SIZE 200)
          (define BALLE (circle 10 'solid "red"))
          (define-struct monde (img x y))
          (define INIT (make-monde (rectangle SIZE SIZE 'solid "yellow") 0 (quotient SIZE 2)))
          (define (suivant m)
            (local [(define x (monde-x m))
                    (define y (monde-y m))
                    (define dy (alea))
                    (define xs (+ x 1))
                    (define ys (min SIZE (max 0 (+ y dy))))]
              (make-monde (place-image (line 1 dy "black") x y (monde-img m)) xs ys)))
          (define (dessiner m)
            (place-image BALLE (monde-x m) (monde-y m) (monde-img m)))
          (define (final? m)
            (> (monde-x m) SIZE))]
    (big-bang INIT
              (on-tick suivant)
              (on-draw dessiner)
              (stop-when final?))))

bourse

6 Exercice 5.6.6

(define (dessin-a-main-levee)
  (local [(define SIZE 200)
          (define-struct monde (img px py))
          (define INIT
            (make-monde (rectangle SIZE SIZE 'solid "white") 0 0))
          (define (dessiner m)
            (monde-img m))
          (define (souris m x y evt)
            (if (mouse=? evt "drag")
                (make-monde (add-line (monde-img m)
                                      (monde-px m) (monde-py m) x y
                                      "black")
                            x y)
                (make-monde (monde-img m) x y)))]
    (big-bang INIT
              (on-draw dessiner SIZE SIZE)
              (on-mouse souris))))

souris