Scheme - TD n° 8
16 avril 2003
Objets d'interface
Récursions sur les listes (suite et fin)
(define w (make-object frame% "")) (define t1 (make-object text-field% "Message:" w void)) (define (action1 o e) (send t1 set-value "Bonjour Toto")) (define (action2 o e) (send t1 set-value "Bonjour Titi")) (make-object button% "Toto" w action1) (make-object button% "Titi" w action2) (send w show #t)Faire l'interface ci-après. Quand on rentre une lettre dans une fenêtre, elle s'affiche dans l'autre.
(define w (make-object frame% "")) (send w show #t) (define (action o e) (send (if (equal? o t1) t2 t1) set-value (send o get-value))) (define t1 (make-object text-field% "Texte1" w action)) (define t2 (make-object text-field% "Texte2" w action))Rajouter un bouton dans l'interface qui vide les fenêtres de texte quand on clique.
(define (vider o e) (send t1 set-value "") (send t2 set-value "")) (make-object button% "Bouton" w vider)Construire l'interface ci-après. L'action des zones texte est void. L'action du bouton consiste à afficher dans la zone texte inférieure "Pair" ou "Impair" selon la parité du nombre placé dans la zone texte supérieure. On utilisera la fonction string->number qui transforme en nombre une chaîne de caractères. Exemple : (string->number "3") --> 3 (Juin 2002).
(define w (make-object frame% ""))
(define t1 (make-object text-field% "Nombre:" w void))
(define (action o e)
(send t2 set-value
(if (even? (string->number (send t1 get-value))) "Pair" "Impair")))
(make-object button% "Click" w action)
(define t2 (make-object text-field% "Resultat:" w void))
(send w show #t)
Faire la fonction (met-a-zero l) qui remplace tous les éléments de l qui sont des nombres par des 0.
(define (met-a-zero l)
(cond ((null? l) ())
((number? (car l)) (cons 0 (met-a-zero (cdr l))))
(else (cons (car l) (met-a-zero (cdr l))))))
= (map (lambda (x) (if (number? x) 1 x)) l)
(define (met-a-zero l)
(cond ((null? l) ())
(else (cons (if (number? (car l)) 0 (car l))
(met-a-zero (cdr l))))))
Faire la fonction (mixage l1 l2) qui fabrique une nouvelle liste en alternant les éléments de l1 et l2:
> (mixage '(1 2 3 4 5) '(a b c))
(1 a 2 b 3 c 4 5)
> (mixage '(une voiture la ensoleillee) '(belle sur route))
(une belle voiture sur la route ensoleillee)
(define (mixage l1 l2)
(cond ((null? l1) l2)
(else (cons (car l1) (mixage l2 (cdr l1))))))
Faire la fonction (coupler l1 l2) qui fabrique la liste des couples d'éléments de l1 et l2 en même position.
(define (coupler l1 l2)
(cond ((or (null? l1) (null? l2)) ())
(else (cons (list (car l1) (car l2))
(coupler (cdr l1) (cdr l2))))))
Faire la fonction (double l) qui double tous les éléments de l:
> (double '(je be gaye))
(je je be be gaye gaye)
(define (double l)
(cond ((null? l) ())
(else (cons (car l)
(cons (car l) (double (cdr l)))))))
Faire une fonction (remplace-max l) qui remplace les deux premiers éléments de l par le plus grand des deux. En remarquant que la liste obtenue est strictement plus courte que l, en déduire une fonction (maximum l) qui calcule l'élément maximum d'une liste de nombres.
(define (maximum l)
(cond ((null? l) ())
((null? (cdr l)) (car l))
(else (maximum (remplace-max l)))))
(define (remplace-max l)
(cons (if (> (car l) (cadr l)) (car l) (cadr l))
(cddr l)))
Faire une action associée aux objets text-field% représentant les douze cases : quand on appuie la touche "return" dans une case, le nombre est mis à 0 et réparti 1 à 1 dans les cases suivantes dans l'ordre inverse des aiguilles d'une montre. On fera une fonction (succ objet) qui donne l'objet text-field% successeur d'un objet donné. Les valeurs des objets text-field% seront converties en nombres avec number->string et string->number.
Faire la fonction qui réalise les prises : si on s'arrête dans le camp adverse dans une case avec 2 ou 3 graines, on prend ces graines, ainsi que les cases précédemment rencontrées dans le camp adverse ayant également 2 ou 3 graines, et on les additionne au total de son camp (cases "Joueur 1" ou "Joueur 2"). On fera une fonction (camp objet) qui donne le camp d'un objet.