Soru: Sırasıyla, ekrana üç adet kırmızı, sarı, yeşilden oluşan trafik ışıklarını çiziniz, ışıklardan birini söndüren fonksiyonu, ışıklardan birini yakan fonksiyonu, ışık değiştiren fonksiyonu ve sıradaki ışığı yakan fonksiyonu yazınız.
Çözen : Şadi Evren ŞEKER
Çözüm fonksiyonları:
Öncelikle çizim yapacağımız için dr. Scheme üzerinde draw.ss teachpack’ini yüklememiz gerekiyor:
Ardından poligonu çizim için değişkenlerimizi tanımlayalım:
;;6.2.1
(define WIDTH 50)
(define HEIGHT 160)
(define BULB-RADIUS 20)
(define BULB-DISTANCE 10)
;; the positions of the bulbs
(define X-BULBS (quotient WIDTH 2))
(define Y-RED (+ BULB-DISTANCE BULB-RADIUS))
(define Y-YELLOW (+ Y-RED BULB-DISTANCE (* 2 BULB-RADIUS)))
(define Y-GREEN (+ Y-YELLOW BULB-DISTANCE (* 2 BULB-RADIUS)))
Yukarıdaki tanımlamada öncelikle trafik ışıklarının boyutları (width , height) yarı çapları ve birbirine mesafeleri tanımlanmıştır. Ardından aynı x değerine sahip farklı y değerlerindeki 3 adet x,y ikilisi hesaplanmıştır. Işıklar alt alta duracağı için tek x değeri bütün 3 ışık içinde yeterlidir.
Işıkları draw.ss kullanarak çizmek için aşağıdaki kod gerekmektedir:
(start WIDTH HEIGHT)
(draw-solid-disk (make-posn X-BULBS Y-RED) BULB-RADIUS ‘red)
(draw-circle (make-posn X-BULBS Y-YELLOW) BULB-RADIUS ‘yellow)
(draw-circle (make-posn X-BULBS Y-GREEN) BULB-RADIUS ‘green)
Ardından sorunun ilk fonksiyonu olan ve bir trafik ışığını temizleyen koda geçebiliriz:
(define (clear-bulb color) ( cond [ (eq? color ‘red) (draw-solid-disk (make-posn X-BULBS Y-RED) (- BULB-RADIUS 2) ‘white)]
[ (eq? color ‘yellow) (draw-solid-disk (make-posn X-BULBS Y-YELLOW) (- BULB-RADIUS 2) ‘white)]
[ (eq? color ‘green) (draw-solid-disk (make-posn X-BULBS Y-GREEN) (- BULB-RADIUS 2) ‘white)]
))
Yukarıdaki kodda verilen renk 3 ihtimalden birisi ile kontrol edilmektedir. Hangi ihtimal ise ilgili rengin bulunduğu koordinata yarı çapı 2 küçük yeni ve beyaz bir daire çizilmektedir. Bu sayede trafik ışığının içi boş izlenimi verilmektedir.
Sorudaki ikinci fonksiyon olan ve trafik ışığını yakan fonksiyonu yazacak olursak:
(define (draw-bulb color) ( cond [ (eq? color ‘red) (draw-solid-disk (make-posn X-BULBS Y-RED) BULB-RADIUS ‘red)]
[ (eq? color ‘yellow) (draw-solid-disk (make-posn X-BULBS Y-YELLOW) BULB-RADIUS ‘yellow)]
[ (eq? color ‘green) (draw-solid-disk (make-posn X-BULBS Y-GREEN) BULB-RADIUS ‘green)]
))
Yukarıdaki fonksiyonda bir öncekine benzer şekilde verilen renk 3 ihtimal ile kontrol edilmekte hangisine eşitse o ışık koordinatına ilgili renkte bir daire yerleştirilmektedir. Bu sayede ilgili renkteki ışık yanmış izlenimi verilmektedir.
Işık değiştirmek için, bir ışığın sönüp diğerinin yanması gerekir. Bunun için öncelikle renk söndürülür ve sonra istenen diğer renk yakılır.
(define (switch color1 color2)( and (clear-bulb color1)(draw-bulb color2)))
Son olarak sorudaki son fonksiyon olan sıradaki rengin yakılması yani kırımızı->sarı->yeşil->kırmızı döngüsünü yapan fonksiyon için mevcut rengi alan ve bu rengi söndürüp döngüdeki bir sonraki rengi yakan fonksiyon aşağıdaki şekilde yazılabilir
(define (next color) (cond [ (eq? color ‘red) (switch ‘red ‘yellow)]
[ (eq? color ‘yellow) (switch ‘yellow ‘green)]
[ (eq? color ‘green) (switch ‘green ‘red)]))
Çözüm çalıştırması:
İlk fonksiyon olan ışığı söndürme:
(clear-bulb ‘red)
İkinci fonksiyon ışığı yakma
(draw-bulb ‘green)
Üçüncü fonksiyon ışığı değiştirme
(switch ‘green ‘yellow)
Son fonksiyon sıradaki ışığı yakma
(next ‘yellow)
(next ‘green)
Açıklama:
Çalışmanın sonucunda görülen ekran aşağıda verilmiştir: