Programmes de calcul / programmes interactifs
https://htdp.org/2018-01-06/Book/part_one.html#(part._ch~3ahtdp)
Partir d'un problème et concevoir un programme pour le résoudre.
Spécification: - Quelles sont les entrées du programme ? - Quelles sont les sorties ? - Quel est le lien entre les entrées et les sorties ?
Implémentation: - comment structurer le programme en fonctions - quelles fonctions existent déjà dans des bibliothèques externes ? (quel type de bibliothèques chercher ?)
Un bon programme décrit sa spécification en commentaires. Plus lisible, plus facile à maintenir, permet le travail en équipe.
On va apprendre une "recette", ou "méthodologie" de conception des programmes. Utile pour devenir programmeur, mais aussi tous les métiers en interface avec la programmation, et les métiers où il faut savoir décrire précisément un processus : ingéniérie, médecine, journalisme...
https://htdp.org/2018-01-06/Book/part_one.html#(part._sec~3adesign-func)
Notion de "domaine applicatif", ou juste "domaine" : la partie du monde réel mis en jeu par le programme. (Exemple: base de donnée universitaire, programme de navigation GPS, jeu vidéo...).
Comment en représenter les concepts clés ?
Différencier informations et données: par données, on entend des informations mises en forme structurée, manipulable par nos programmes. Problème d'affichage, de lecture, de décomposition... (Reconnaissance vocale, etc.)
Utilisation de Racket: pas besoin de convertir informations<->données.
Exemples:
; We use numbers to represent euros and dollars
; euros->dollars : number -> number
; given 100, expect 115
(define (euros->dollars x) (* x 1.15))
; move : pos vel -> pos
; (move p v) computes next position from p, at speed v
; given:
; (make-pos 10 10) for p
; (make-vel 5 3) for v
; expect: (make-pos 15 13)
(define (move p v) ...)
https://htdp.org/2018-01-06/Book/part_one.html#(part._ch~3astructure)
Rappel précédent:
Maintenant: comment structurer des données.
; size : the size of the object to draw
; decr? : is the object shrinking (#true) or expanding (#false)?
(define-struct anim [size decr?])
On obtient automatiquement les fonctions suivantes
(make-anim s dir)
(anim-size anim)
(anim-decr? anim)
(anim? x)
Exemple de la dernière fois:
(require 2htdp/image)
(require 2htdp/universe)
(define (image n)
(circle
(if (>= n 0) n (- n))
"solid" "red"))
(define (next n)
(if (>= n 0)
(- n 1)
(if (= n -100) 99 (- n 1))))
(define start-state 100)
(define (key-handler n evt)
start-state)
(big-bang start-state
[to-draw image]
[on-tick next]
[on-key key-handler])
Nouvelle version
(define-struct anim [size decr?])
(define (image a)
(circle (anim-size a) "solid" "red"))
(define (incr a)
(if (= size-limit (anim-size a))
(make-anim size-limit #true)
(make-anim (+ (anim-size a) 1) #false)))
(define (decr a)
(if (= 0 (anim-size a))
(make-anim 0 #false)
(make-anim (- (anim-size a) 1) #true)))
(define (next a)
(if (anim-decr? a) (decr a) (incr a)))
(define start-state (make-anim size-limit #true))
(define (key-handler a evt)
(if (anim-decr? a) (make-anim 100 #true) (make-anim 0 #false)))
Composition de structure :
(define-struct pos [x y])
(define-struct vel [deltax deltay])
(define-struct obj [image pos vel])
(define (move p v)
(make-pos
(+ (pos-x p) (vel-x v))
(+ (pos-y p) (vel-y y))))
(define background (square 600 600 "solid" "white"))
(define draw-obj obj
(place-image
(obj-image obj)
(pos-x (obj-pos obj))
(pos-y (obj-pos obj))
background)