Fonksiyonel bir programlama dili olan Lisp ile yazılmış basit bir açık arttırma programı. Lisp dilinde bir problemin çözümünü gerçekleştirirken sonuca değilde çözümü yaparken kullanılan yönteme önem verilir bu sebepten Lisp'te her şey bir fonksiyon olarak tanımlanır.
(defun Basla()
(setq kullanicininParasi 5000)
(setq bilgisayarinParasi 5000)
(setq turDegeri 1) ; Açık arttırmadaki tur değerini tutmak için kullanılan değişken.
(setq enYuksekTeklif 0) ; Açık arttırmadaki her ürün için verilen en yüksek teklifi tutan değişken.
;(yorumun devamı) Başlangıçta değeri 0 dır.
(setq kullaniciTeklifi 0) ; Kullanicininteklifini tutacak değişken.
(setq bilgisayarTeklifi 0) ; Bilgisayarın teklifini tutacak değişken.
(setq cekilmeDurumu 0) ; Kullanıcının yada bilgisayarın açık arttırmadan çekilme durumunu kontrol
;(yorumun devamı) etmek için kullanılmıştır.
(setq kCekilmeDurumu 0) ; Kullanıcının çekilme durumunu tutar.
(setq bCekilmeDurumu 0) ; Bilgisayarın çekilme durumunu tutar.
(setq kullaniciTeklifiKontrolu 0 ) ; Kullaıcının vereceği teklifin istenen kriterlere uygunluğunu sınamak
;(yorumun devamı) için kullanılacak değişken.
(setq kullaniciTeklifiKontroluE 0) ; Kullanıcı enyüksek tekliften az teklif verirse teklifini değiştirme şansı
;(yorumun devamı) vermek için kullanılan değişken.
; Her bir ürün için ayrı olarak kullanıcının yada bilgisayarın paraları bitene kadar dönecek döngü
;(yorumun devamı) tanımıdır.
(loop while (and (> kullanicininParasi 0) (> bilgisayarinParasi 0)) do
; Kuulanıcı ve bilgisayarın ceplerindeki paralar yazdırılıyor. Her tur başında.
(print '_)
(princ "===========================================")
(print '_)
(princ " Kullanicinin cebinde kalan para: ")
(princ kullanicininParasi)
(princ " TL")
(print '_)
(princ " Bilgisayarin cebinde kalan para: ")
(princ bilgisayarinParasi)
(princ " TL")
(print '_)
(princ "===========================================")
; Açık arttırmaya sokabilmek için rasgele bir ürün seçimi yapılmaktadır.
(setq urunKatSayisi (urunler))
; Her ürün için dönülecek tur sayısını gösteren döngü, en çok 4 tur dönülebilir.
(loop while (and (<= turDegeri 4) (/= cekilmeDurumu 1)) do
; Tur değeri yazdırılıyor.
(print '_ )
(princ turDegeri)
(princ ". Tur: ")
(print '_)
; Kullanıcı teklifi kısmı.
; Burada kullanıcıya elindeki paraya göre yada son tekliften düşük değer verdiyse değiştirme ;(yorumun devamı) şensı tanı.
(loop while (= kullaniciTeklifiKontrolu 0) do
(print '_)
(princ " Kullanici teklifi(TL): ")
(setq kullaniciTeklifi (read))
(setq kullaniciTeklifiKontrolu 1) ; Kullanıcının girdiği ilk değer doğru bir değer gibi
;(yorumun devamı) düşünülerek kontrol değişkeni set ediliyor.
; Kullanıcı en yüksek tekliften daha az teklif verirse kullanıcıya teklifini değiştirmek için
;(yorumun devamı) uyarı veriliyor.
(when (< kullaniciTeklifi enYuksekTeklif)
(progn
(print '_#########################################################)
(print '_)
(princ " Girdiginiz teklif degeri en yuksek degeri gecmiyor.")
(print '_)
(princ " Teklifiniz boyle kalirsa arttirmadan cekilmis sayilirsiniz !")
(print '_)
(princ " Teklifi degistirmek istiyorsaniz 0(sifir) gir: ")
(setq kullaniciTeklifiKontroluE (read))
(if (= kullaniciTeklifiKontroluE 0)
(setq kullaniciTeklifiKontrolu 0) ; Kullanıcının yeni bir teklif vermek
;(yorumun devamı) istediği anlamına geliyor.
(setq kullaniciTeklifiKontrolu 1) ; Kulanıcının arttırmadan çekilmek
;(yorumun devamı) istedili anlamına geliyor.
)
(print '_#########################################################)
)
)
; Kullanıcının verebileceği teklif parasından daha fazla olamıyacağı için işletilecek kontrol ;(yorumun devamı) bloğu.
(when (> kullaniciTeklifi kullanicininParasi)
(progn
(print '_#########################################################)
(setq kullaniciTeklifiKontrolu 0) ; istenilmeyen durum kullanıcı bir daha teklif ;(yorumun devamı) değerini girmesi için değişken 0 yapıldı.
(print '_)
(princ " Kullanicinin cebinde kalan para: ")
(princ kullanicininParasi)
(print '_)
(princ " Cebinizdeki paradan daha fazla harcayamazsiniz!")
(print '_#########################################################)
)
)
)
;;; Kullanıcı teklifi kontrol bloğu sonu.
; 'enYuksekTeklif' değerini güncellemek için yazılan kontrol bloğu.
; Bu blok içerisinde, eğer kullanıcı istenilen şartlarda teklif vermez ise arttırmadan çekildi
;(yorumun devamı) kabuledilir.
(if (> kullaniciTeklifi enYuksekTeklif)
; 'kullaniciTeklifi' değişkeni değeri 'enYuksekTeklif' değerinden büyükse işletilir.
(progn
;(print "Kulanici kismina ait if bloğu. Dogru ise") ; Sil burayı.. kontrol için yazıldı.
(print '_)
(setq enYuksekTeklif kullaniciTeklifi); 'enYuksekTeklif' değeri güncelleniyor.
)
; 'kullaniciTeklifi' değişkeni değeri 'enYuksekTeklif' değerinden büyük değilse işletilir.
(progn
(setq cekilmeDurumu 1) ; Çekilme verisini tutan değişken set ediliyor.
(setq kCekilmeDurumu 1) ; Kullanıcının çekilme durumu set ediliyor.
(print '_)
(princ " En yuksek tekliften daha yuksek teklif vermediniz!")
(print '_)
(princ " Kullanici teklifi(TL): ")
(princ " Cekildi !")
(print '_)
(print '_)
(princ " Bilgisayar Kazandi !")
(setq bilgisayarinParasi (- bilgisayarinParasi enYuksekTeklif)); Bilgisayar
;(yorumun devamı) kazandığı için parası kırpılıyor.
)
)
; Bilgisayar teklifi en yüksek teklife eşitse yada daha az ise kullanıcı kazanır ve açık arttırım
;(yorumun devamı) sonlandırılır.
(if (and (>= enYuksekTeklif bilgisayarinParasi) (= kCekilmeDurumu 0))
(progn
(princ " Bilgisayarin teklifi(TL): ")
(princ " Cekildi !")
(setq turDegeri 5) ; TurDegeri, 5 yapılıyor.
(setq kCekilmeDurumu 1) ; Bilgisyarın teklif verme durumuna girmemesi için
;(yorumun devamı) degeri 1 yapıldı.
)
)
; Eğer kullanıcı çekilir ise bu bloğun işletilmesi gereksiz olur.
(when (= kCekilmeDurumu 0)
; Kullanıcı arttırmadan çekilmezse işletilecek blok.
(progn
; Bilgisayarın teklifinin alındığı kısım.
(setq bilgisayarTeklifi (bSTeklifi enYuksekTeklif urunKatSayisi bilgisayarinParasi))
; bilgisayarın teklifini belirleyen program
; Bilgisayar sadece 2. 3. ve 4. turlarda oturundan çekilme kararı alcak.
(if (> turDegeri 1)
(setq bCekilmeDurumu (bilgisayarCekilsinMi)) ; Bilgisayarın arttırmadan
;(yorumun devamı) çekilme durumu fonksiyondan alınıyor.
)
; Eğerki bilgisayarın vereceği teklif cebindeki paradan daha fazla ise bilgisyar bu
;(yorumun devamı) teklifi veremez ve çekilir.
(when (> bilgisayarTeklifi bilgisayarinParasi)
(setq bCekilmeDurumu 1) ; Bilgisayar cebinde yeteri kadar para olmadığını ;(yorumun devamı) görüp arttırmadan çekilme kararı alıyor.
)
(if (= bCekilmeDurumu 0)
; Bilgisayar arttırmadan çekilmeyecek ise işletilecek blok.
(progn
(print '_)
(princ " Bilgisayarin teklifi(TL): ")
(princ bilgisayarTeklifi)
; Bilgisayarın teklifi en yüksek tekliften daha yüksek ise en yüksek teklif ;(yorumun devamı) bilgisayarın teklifi olsun, aksi taktirde aynı kalsın.
(if (> bilgisayarTeklifi enYuksekTeklif)
(setq enYuksekTeklif bilgisayarTeklifi) ;'enYuksekTeklif' değeri
;(yorumun devamı) güncelleniyor.
)
)
; Bilgisayar arttırmadan çekilecek ise işletilecek blok.
(progn
(setq cekilmeDurumu 1) ; Çekilme verisini tutan değişken set ediliyor.
(print '_)
(princ " Bilgisayarin teklifi(TL): ")
(princ " Cekildi !")
(print '_)
(print '_)
(princ " Kullanici Kazandi !")
(setq kullanicininParasi (- kullanicininParasi enYuksekTeklif)); Kullanıcı
;(yorumun devamı) kazandığı için parası kırpılıyor.
)
;(print '_____________________________________________)
)
)
)
; 4. tur ve iki taraftanda çekilen olmamışsa bu şart işletiliyor.
(when (and (>= turDegeri 4) (= cekilmeDurumu 0))
(if (> bilgisayarTeklifi kullaniciTeklifi)
(progn
(print '_)
(princ " Bilgisayar Kazandi !")
(setq bilgisayarinParasi (- bilgisayarinParasi enYuksekTeklif)); Bilgisay
;(yorumun devamı) kazandığı için parası kırpılıyor.
)
(progn
(print '_)
(princ " Kullanici Kazandi !")
(setq kullanicininParasi (- kullanicininParasi enYuksekTeklif)); Kullanıcı ;(yorumun devamı) kazandığı için parası kırpılıyor.
)
)
)
(print '_____________________________________________)
; Bu blok'ta silinebilir.
; Açık arttırma 4 turdan daha fazla devam etmesin diye yapılan kontrol.
(when (and (>= turDegeri 5) (= cekilmeDurumu 0))
(setq cekilmeDurumu 1)
)
; Bu iki kontrol değişkenni bu döngünün her dönüş değerinde kullanıldığı için başlangıç
;(yorumun devamı) değerlerine getiriliyorlar.
(setq kullaniciTeklifiKontrolu 0 ) ;
(setq kullaniciTeklifiKontroluE 0) ;
; turDegeri 1 arttırılıyor. Bueayı sil..
(incf turDegeri)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Tekliflerle ilgili değişkenler ilk durumlarına getiriliyor.
(setq turDegeri 1) ; 'turDegeri' değişkeni her ürün için turların doğru bir şekilde dönebilmesi için ;(yorumun devamı) başlangıç değerine alınıyor.
(setq enYuksekTeklif 0) ; Her ayrı arttırma için 'enYuksekTeklif' değişkeni değeri sıfırlanıyor.
(setq kullaniciTeklifi 0) ; 'kullaniciTeklifi' değeri 0 lanıyor.
(setq bilgisayarTeklifi 0) ; 'bilgisayarTeklifi' değeri 0 lanıyor.
; Çekilme değişkenleri ilk değerlerine getiiriliyor.
(setq cekilmeDurumu 0) ; 'cekilmeDurumu' değeri 0 lanıyor.
(setq kCekilmeDurumu 0) ; 'kcekilmeDurumu' değeri 0 lanıyor.
(setq bCekilmeDurumu 0) ; 'bcekilmeDurumu' değeri 0 lanıyor.
; Kullanıcının girdiği teklif verilerinin konrolü için kullanılar değişkenler. Sİl bunları
(setq kullaniciTeklifiKontrolu 0 )
(setq kullaniciTeklifiKontroluE 0)
(print '*********************************************)
)
'*********************************************
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Bu fonksiyon kullanicinin verdiği ürün teklifine karşılık verilicek ürün teklifine karar vermektedir.
; Bu fonksiyona ek özellikler ekle...
; eYTeklif = enYuksekTeklif.
; 'bSParasi' parametresinin kullanılma nedeni: Eğer bilgisayarın kalan parası kullanıcı teklifinden daha düşükse,
; bilgisayarın verreceği teklifi cebindeki paraya göre belirlemesi içindir.
(defun bSTeklifi(eYTeklif urunKSayisi bSParasi) ; 'bilgisayarinParasi' = 'bSParasi' olarak kısaltılmıştır.
(setq gecici (random 5))
(incf gecici) ; gecici değişkeni 1 arttırılıyor.
;(setq eklenecek (MOD gecici urunKSayisi))
(setq eklenecek (* gecici urunKSayisi))
(setq geriyeDonecekDeger (+ eYTeklif eklenecek))
; bilgisayarın verreceği teklifin cebindeki paradan daha az olması garanti edilmiş oldu.
(if (> geriyeDonecekDeger bSParasi)
(setq geriyeDonecekDeger bSParasi)
)
geriyeDonecekDeger ; Bu değer bilgisayarın ürüne vereceği tekliftir.
)
; Bu fonksiyon bilgisayarın bu arttırmadan çekilip çekilmemesini rasgele belirlemektedir.
; Bu fonksiyon 17 olasılıktan belirli olan 4 olasılık(bunlar 3,7,13,16 değerleridir)
; değeri gelirse bilgisayarın arttırmadan çekilme kararını vermesi için kullanılacak.
(defun bilgisayarCekilsinMi()
(setq cekilsinMi (random 16))
(if (or (or (= cekilsinMi 3) (= cekilsinMi 7)) (or (= cekilsinMi 13) (= cekilsinMi 16)))
(setq fonksiyonCevabi 1) ; Doğru ise işletilir. Çekil mesajı.
(setq fonksiyonCevabi 0) ; Yanlış ise işletilir. Çekilme(oturuma devamet) mesajı.
)
fonksiyonCevabi ; Bu değer bilgisayarın arttırmadan çekilme yada çekilmeme bilgisini tutar.
)
; Bu fonksiyon her hangi bir ürünü seçmeye yarar.
(defun urunler()
; Urun kategorisi seçmek için kullanılıyor.
(setq rasgeleUrun (random 10))
(setq urunKatSayisi (random 10))
(incf urunKatSayisi); urunKatSayisi değeri 1 artar.
; Urun türünü seçmek için kullanılıyor.
(setq urunTuru (random 10))
(incf urunTuru); urunTuru değeri 1 artar.
;seçim yapısını lisp'te kullanımı.
(case rasgeleUrun
;Durum 0:
(0 (progn
(print '_____________________________________________)
(print '_)
(princ "A")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
; Durum 1:
(1 (progn
(print '_____________________________________________)
(print '_)
(princ "B")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
; Durum 2:
(2 (progn
(print '_____________________________________________)
(print '_)
(princ "C")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
;Durum 3:
(3 (progn
(print '_____________________________________________)
(print '_)
(princ "D")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
; Durum 4:
(4 (progn
(print '_____________________________________________)
(print '_)
(princ "E")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
; Durum 5:
(5 (progn
(print '_____________________________________________)
(print '_)
(princ "F")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
;Durum 6:
(6 (progn
(print '_____________________________________________)
(print '_)
(princ "Q")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
; Durum 7:
(7 (progn
(print '_____________________________________________)
(print '_)
(princ "X")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
; Durum 8:
(8 (progn
(print '_____________________________________________)
(print '_)
(princ "Y")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
; Durum 9:
(9 (progn
(print '_____________________________________________)
(print '_)
(princ "Z")
(princ urunTuru)
(princ " Urunu Teklifi: 0 TL, Deger Katsayisi: ")
(princ urunKatSayisi)
(print '_)
)
)
(otherwise "Diger"); '0 ... 9' sonuçlarından biri gelmezse işletilecek adım.
)
urunKatSayisi ; Bu, fonksiyonun geriye döndürdüğü değerdir. Urunun katsayı değerini tutar.
)
;;;_________________Lisp Notları_________________;;;
;;; 1_) 'print' komutu alt satıra geçip yazmaya başlar aldığını ayyen yazar.
;;; 2_) 'princ' alt satıra geçiş yapmadan kalınan yerden kendine verilen ifadenin sadece yazdırılacak kısmını yazar.
Kaydol:
Kayıt Yorumları (Atom)
0 yorum