atama haritası yardım lütfen

Başlatan spooner, 25 Aralık 2008, 23:56:28

spooner

arkadaşlar öncelikle merhaba sizden bir konuda yardım almak istiyorum türkiye illerine öğretmen atama devresi yapacağım fakat bi konuda takıldım, devre kısaca butona basıldıkca 1den-81 e kadar sayı üretecek ve lcdye verecek çıkan sayı bir daha çıkmayacak şekilde olacak ve sistem  her açıldığında sürekli random sayılar üretecek yani bir önceki sıralamadan gitmeyecek, picbasic de bu sayıları bir torba içine koyup sonrada içinden butona bastıkca sayıları tek tek çekebilirmiyiz  bu konuda yardım edebilecek arkadaşlar kısa bir program yada mantık verek yardım ederlerse çok memnun olurum şimdiden çok teşekkür ederim herkese kolay gelsin

peko

Eğer yapılırsa Öğretmen ataması gerçekten bu devre ile mi yapılacak ??
" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "

spooner

yok hocam bu devre bir arkadaşımın bitirme tezi ama cıkamadık içinden :) ama belki olur neden olmasın :)

tyildizak

@spooner, İncelediyseniz, pic basic'te RANDOM komutu var fakat bu komut, pbp manuelinde de belirtildiği gibi "pseudo-random", yani sözde random sayılar üretiyor. Denediğimde gördüğüm, sürekli ardarda aynı sayıları üretiyor. Kısacası işinizi görmez.

Bu durumda ne yapılabilir? İlk aklıma gelen, bir seçme butonu kullanmak ve butona basılma aralıklarında beklenecek zamanın belirsizliğinden yararlanmak oldu, örneğin:

     SYMBOL    BUTON = PORTA.0  ;  BİR SEÇME BUTONU (LOW AKTİF)
      SONUC  VAR  BYTE   ; SONUÇ İÇİN BYTE CİNSİNDEN DEĞİŞKEN



      WHILE BUTON = 1

         SONUC = SONUC + 1
         PAUSEUS 20                                 
         IF SONUC > 81 THEN SONUC = 1

      WEND  


Yukarıdaki kodla, butona basıldığında SONUC değişkenindeki değer 1-81 arasında rastgele bir sayıdır.

spooner

tyildizak ustam çok sağolasın ama bunda aynı sayı tekrar karşımıza çıkacaktır diye düşünüyorum  bu çıkan sayının bir daha çıkmaması lazm ki 81 adet doldurup işlem bitti desin

tyildizak

Bunun için de dahili eeprom'dan yararlanabilirsiniz, şöyle ki:

eeprom'un 1. adresine 1. ilin, takibeden adreslerine de sonraki illerin durumlarını kaydederiz .  


SONUC  değerini ilk elde ettiğimizde buna karşılık gelen eeprom adresine WRITE komutu ile, örneğin "1" değerini yazarız

Sonraki seçimlerde, SONUÇ'taki değere karşılık gelen eeprom adresinde yazılı değerin 0 olup olmadığını kontrol ederiz, eğer 0 ise tekrarlama yoktur, 1 ise SONUC'un değerini 1 arttırıp tekrar deneriz. 81. adrese de yerleşemiyorsa, tekrar 1'den başlarız.Bu şekilde aynı sayı tekrarlanmamış olur.

Bu arada bir taraftan da,  her seçim gerçekleştiğinde, başka bir değişkenle işlem sayısını tutabilir ve bu sayı 81'e ulaştığında  programı sonlandırabiliriz.

Aklıma gelen en pratik çözüm bunlar

tyildizak

Eeprom'u kullanırsanız ilk seferi sonrası her program çalıştığında program başında 81 eeprom adresini temizlemek gerekecektir
eeprom yerine 81 elemanlı bir array de kullanılabilir ama bu kadar kalabalık bir diziyi hiç kullanmadım, gerçi elemanlar bit cinsinden olacak, denemek lazım..

Analyzer

Selam,

Picbasicten anlamam ancak size fikir vermesi için pseudo kod verebilirim, siz kodu basic e çevirebilirsiniz.

Başla
81 karakterlik dizi oluştur ismini "kura" olarak adlandır
81 karakterlik dizi oluştur ismini "iller" olarak adlandır
m ve n isimli değişken tanımla ve değerlerini 1 yap.
lcd ye "öğretmen ataması" vs.. gibi giriş cümlesi yazdır
timer1 başlat
lcd ye "devam için butona basın"yazdır
timer1 durdur ve geçen süreyi "rnd" isimli değişkene yaz.
timer 1 sıfırla.
timer1 başlat.
döngü:
rnd değişkenini mod 81 ile işleme sok ve değerini "n" değişkeninde sakla.
kura dizisinin n'nici değeri 0 mı kontrol et 0 değilse:
kura dizisinin n'nci değişkenini iller dizisinin m'ninci değişkenine yaz.
m yi bir arttır.
kura dizisinin n'nci değişkenini 0 yap.
rnd ile timer1 topla rnd ye yaz.
rnd değişkeni 65535 dan büyükse rnd den 65535 çıkart.
döngü sonu.
iller dizisini sırayla lcd de göster.
Bilimum yeşillikler
.
.
.
Program sonu.




Başla
81 karakterlik dizi oluştur ismini "kura" olarak adlandır
lcd ye "öğretmen ataması" vs.. gibi giriş cümlesi yazdır
timer1 başlat
lcd ye "devam için butona basın"yazdır
timer1 durdur ve geçen süreyi "rnd" isimli değişkene yaz.
timer 1 sıfırla.
timer1 başlat.
döngü:
timer1 e rnd ekle değeri "dn" olarak sakla.
dn verisi 65535 den büyükse dn den 65535 çıkart.
dn değerini mod 81 ile işleme sok ve değeri kuracek olarak kaydet
kuracek değeri kura dizisinde var mı kontrol et
kuracek dizi içindeyse:
kuracek değerinin içindeki veriyi kura dizisinden sil.
kuracek değerini lcd ye yazdır
döngü sonu:
bilimum yeşillikler
.
.
.
program sonu.

Her ikisi de aynı kapıya çıkar. Hızlı hızlı yazıp derlemediğim için kodda hatalar olabilir ancak genel yapısı böyledir. Windows derleyicileri de aslında random komutunu sistem saatinden alır. Timer'ı başlatıp kullanıcının butona dokunuşu arası süreyi ölçmeniz aslında rastgele bir zaman üretmenizi sağlıyor.

Analyzer
Üşeniyorum, öyleyse yarın!

kadirbas

Bu arada, hiç bir sistem size tam olarak rastgele bir değer vermeyecektir zaten. Ama bunun sizin için çok önemli olacağını sanmıyorum. Sonuç olarak "sözde ratgele" olarak adlandırılan sayıların ratgelelik durumu genel olarak size yetecektir.

Sözde ratgele sayı üretme kodunu kendiniz de yaabilirsiniz. Bu konuyla ilgili internette çeşitli algoritmalar bulabilirsiniz.

Bu arada, daha önce seçilmiş bir şehrin bir daha gelmemesi için bir algoritma örneği de benden olsun :)

* 1 * RAM'de 81 elemanlık bir dizi yarat (dizi ismi : iller)

 * 2 * iller'in her bir elemanına 0-80 (1-81 de olabilir tabi..) arası değerler yerleştir.

 * 3 * dizinin eleman sayısını bir değişkende sakla (değişken ismi : diziUzunluk = 81)

 * 4 * sözde rastgele sayı üretici fonksiyondan bir değer al.

 * 5 * Bu değeri diziUzunluk değeri ile sınırlandır (seçilenİl = rastgeleDeğer Mod diziUzunluk)
 * 6 * iller dizisinin seçilenİl değeri ile gösterilen elemanında rastgele seçilen il tutuluyor. Bu elemanın içindeki sayıyı al, istenilen işlemi gerçekleştir...

 * 7 * iller dizisinin seçilenİl değerindeki elemanını yine iller dizisinin diziUzunluk değerindeki elemanıyla değiştir. (Yani seçilen ili o an görülen son il ile değiştir. Seçilen ili dizi sonuna at..)

 * 8 * diziUzunluk değerini bir azalt.

 * 9 * diziUzunluk değeri 0 ise işlem bitmiştir. Değilse 4 numaralı işlemden devam et.


Bu algoritmada, rastgele sayı üretecin hiç bir zaman daha önce seçtiğin ili seçemez. Çünkü her bir seçimin sonrasında, seçilen ili dizinin sonuna atıp, seçimi daha önce yaptığımız listenin bir eksik elemanlısından yapıyoruz. Bu sayede seçilen ili liste dışı bırakmış oluyoruz...

Ayrıca algoritma sonunda, dizimiz sondan başa doğru, rastgele seçilen illeri sırasıyla tutmuş oluyor. Bu da ikinci bir dizi açmamıza ihtiyaç bırakmıyor.. :)