;;; Programme oeufs.drs / 1er mai 1998 ;;; (adapte DrScheme version 101) ;;; Trois oeufs, dont 1 de poids different des 2 autres ;;; Comment determiner lequel avec 2 pesees ? (define oeuf% (class object% () ;;; superclasse vide (public (poids 0) (modif-poids (lambda (p) (set! poids p))) (marque "") (modif-marque (lambda (m) (if (or (equal? marque "") (equal? marque m)) (set! marque m) (set! marque "egal"))))) (sequence (super-init)))) (define oeuf1 (make-object oeuf% )) (define oeuf2 (make-object oeuf%)) (define oeuf3 (make-object oeuf%)) ;;; Pesee des oeufs x et y avec marquage des trois ;;; (pour z, "egal" si la balance penche, rien si equilibre) (define (pesee x y z) (let ((px (ivar x poids)) (py (ivar y poids))) (cond ((< px py) (send x modif-marque "moins") (send y modif-marque "plus") (send z modif-marque "egal")) ((> px py) (send x modif-marque "plus") (send y modif-marque "moins") (send z modif-marque "egal")) ((= px py) (send x modif-marque "egal") (send y modif-marque "egal")))) (raffraichir-fenetre)) (define (raffraichir-fenetre) (send texte-o1 set-value (ivar oeuf1 marque)) (send texte-o2 set-value (ivar oeuf2 marque)) (send texte-o3 set-value (ivar oeuf3 marque))) ;;; Interface: (define fenetre (make-object frame% "3 oeufs")) (define panneau (make-object vertical-panel% fenetre)) (send panneau spacing 50) ;;; en pixels (define texte-o1 (make-object text-field% "Oeuf 1" ;;; titre a gauche de la fenetre panneau void)) ;;; action nulle (define texte-o2 (make-object text-field% "Oeuf 2" panneau void)) (define texte-o3 (make-object text-field% "Oeuf 3" panneau void)) ;;; 1ere pesee : (define bouton-pesee1 (make-object button% "PREMIERE PESEE : Oeuf 1 + Oeuf2 " panneau (lambda (self event) (pesee oeuf1 oeuf2 oeuf3)))) ;;; 2eme pesee : (define bouton-pesee2 (make-object button% "DEUXIEME PESEE : Oeuf 1 + Oeuf3 " panneau (lambda (self event) (pesee oeuf1 oeuf3 oeuf2)))) ;;; ---------------------------------- ;;; Initialisation aleatoire des poids (100 grammes, 90 pour -, 110 pour +): (define n (+ 1 (random 3))) ;;; choix de l'oeuf (1, 2 ou 3) (define p (random 2)) ;;; + ou - lourd (define (valeur i n p) (if (= i n) (if (= p 0) 90 110) 100)) (define (relancer) (let ((n (+ 1 (random 3))) (p (random 2))) (set! oeuf1 (make-object oeuf%)) (set! oeuf2 (make-object oeuf%)) (set! oeuf3 (make-object oeuf%)) (send oeuf1 modif-poids (valeur 1 n p)) (send oeuf2 modif-poids (valeur 2 n p)) (send oeuf3 modif-poids (valeur 3 n p)) (send texte-o1 set-value (ivar oeuf1 marque)) (send texte-o2 set-value (ivar oeuf2 marque)) (send texte-o3 set-value (ivar oeuf3 marque)) (send fenetre show #t))) (define bouton-reinit ;;; pour relancer le tout (make-object button% "Relancer" panneau (lambda (self event) (relancer)))) (send oeuf1 modif-poids (valeur 1 n p)) (send oeuf2 modif-poids (valeur 2 n p)) (send oeuf3 modif-poids (valeur 3 n p)) (send texte-o1 set-value (ivar oeuf1 marque)) (send texte-o2 set-value (ivar oeuf2 marque)) (send texte-o3 set-value (ivar oeuf3 marque)) (send fenetre show #t)