PBP Birden fazla değişken karşılaştırma.

Başlatan sayment, 15 Ağustos 2010, 19:25:53

sayment

S.a.
Merhaba arkadaşlar şifreli kilit devresinin programını yazmaya çalışıyorum.Sorunum kod kalabalığından kurtulmak ve arada yeni birşey öğrenmek.

SIFRE ve TUS isminde değişkenler oluşturdum.
Alıntı Yap
TUS VAR BYTE[3]
SIFRE VAR BYTE[3]
SIFRE[0]=1
SIFRE[1]=0
SIFRE[2]=7
SIFRE[3]=1
Sifreyi belirledekten sonra numaratorden gelen bilgileri sırası ile TUS ismindeki değişkenlere eşitliyorum.TUS değişkenindeki bilgiler ile SIFRE değişkenindeki bilgiler birbirine eşit ise şifre doğru değil ise yanlış. Benim sorunum tam bu arada. Bu 8 değişkeni birbiri ile karşılaştırmak için iki yöntem aklıma geldi .İkisini de yazayım.
Alıntı Yap
IF  _
        SIFRE[0]=TUS[0] AND _
        SIFRE[1]=TUS[1] AND _
        SIFRE[2]=TUS[2] AND _
        SIFRE[3]=TUS[3] THEN _
     
        LCDOUT $FE, $80, "SIFRE DOGRU"
ELSE
        LCDOUT $FE, $80, "SIFRE YANLIS" 
ENDIF

YADA ASAĞIDAKİ GİBİ

IF   SIFRE[0]=TUS[0]  THEN
         IF   SIFRE[1]=TUS[1]  THEN
                 IF   SIFRE[2]=TUS[2]  THEN
                         IF   SIFRE[3]=TUS[3]  THEN
                         LCDOUT $FE, $80, "SIFRE DOGRU"
                         ELSE
                         LCDOUT $FE, $80, "SIFRE YANLIS" 
                         ENDIF
                 ENDIF
         ENDIF
ENDIF

8 değişkeni karşılaştırmak için bu yöntemler geldi aklıma acaba bunları karşılaştırmanın daha kısa bi yöntemi varmıdır? Bu kadar kod kalabalığı ile uğraşmadan bir komutla falan bir yerlerde böyle bir komut görmüştüm galiba ama hatırlamıyorum.

Teşekkürler iyi çalışmalar...

subram

karşılaştırma yöntemleri için farklı yollar vardır ama en çok kullanılanı IF THEN deyimidir. bundan daha kısa bir yol olabileceğini sanmıyorum. aramaya devam et yinede farklı bir çözüm çıkar belki.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

yas

TUS VAR BYTE[3]
SIFRE VAR BYTE[3]
J VAR BYTE
SIFRE[0]=1
SIFRE[1]=0
SIFRE[2]=7
SIFRE[3]=1

FOR J=0 TO 3
       IF SIFRE[J]=TUS[J] THEN
            LCDOUT $FE, $80, "SIFRE DOGRU" 
       ELSE 
            LCDOUT $FE, $80, "SIFRE YANLIS" 
            CLEAR TUS
       ENDIF
NEXT


Böylede olabilir. Fakat bu örneklerin hiç birinde "TUS" değişkenine girdi yapacak hiç bir kod mevcut değil.
Kolay gelsin.

RcALTIN

for döngüsüyle yapmak daha mantıklı olur, for limitini de şifre hanesiyle(dizi boyutuyla) ilişkilendirirseniz değişken haneli şifreler için de kontrol desteği sağlayabilirsiniz. Ancak bir yukarıda verilen örnekte, şifrenin son karakterini yanlış girerseniz ekranda önce şifre doğru sonra şifre yanlış yazar, bu gözle görünemeyecek kadar hızlı olur belki ama iyi bir yaklaşım değil bence, önce kontrol sonra karar şeklinde boolean bir değişkenle işlem yaparsanız daha iyi olacaktır; hatta daha da ilerisinde şire_kontrol gibi bir fonksiyon yazıp gelen diziyi(girilen şifreyi) kontrol ettirirseniz daha da iyi... Farklı dille de olsa burada bende benzer bir çalışma yapmıştım, rom yetmediği için değiştirilebilir hane olayını ekleyememiştim ama altyapısını ona göre yazmıştım, oradan tecrübemi yaplaşıyorum... :)
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

orhanc

2 şifreyi ayrı birer diziye kopyala ve diziyi karşılaştır. Dizi değerlerini döngüyle karşılaştırabilirsin.

if (dizi1[i] == dizi2[i])


gibi birşey kullanabilirsin
i'm doing nothing... Giddy Up  http://www.drorhan.com

sayment

Alıntı yapılan: yas - 15 Ağustos 2010, 23:35:55
TUS VAR BYTE[3]
SIFRE VAR BYTE[3]
J VAR BYTE
SIFRE[0]=1
SIFRE[1]=0
SIFRE[2]=7
SIFRE[3]=1

FOR J=0 TO 3
       IF SIFRE[J]=TUS[J] THEN
            LCDOUT $FE, $80, "SIFRE DOGRU" 
       ELSE 
            LCDOUT $FE, $80, "SIFRE YANLIS" 
            CLEAR TUS
       ENDIF
NEXT


Böylede olabilir. Fakat bu örneklerin hiç birinde "TUS" değişkenine girdi yapacak hiç bir kod mevcut değil.
Kolay gelsin.

Öncelikle verdiğiniz cevap için teşekkür ederim. Ama sizin verdiğiniz bu kodlarda şifrenin ilk basamağı geldiğinde şifre doğru yada yanlış yazacak. Genelde son hane de geldikten sonra doğru yanlış kontrolü yapılır benim yapmak istediğim de.

sayment

Alıntı yapılan: orhanc - 16 Ağustos 2010, 00:17:20
2 şifreyi ayrı birer diziye kopyala ve diziyi karşılaştır. Dizi değerlerini döngüyle karşılaştırabilirsin.

if (dizi1[i] == dizi2[i])


gibi birşey kullanabilirsin

Size de teşekkür ederim ama verdiğiniz örnekten pek birşey anlayamadım.

orhanc

#7
Diyelim ki şifrelerini bir diziye yazdın
int sifrelerim[]={1,2,3,4,5,6,7,8};


Bu da giriş şifrelerinin tutulacağı dizi olsun
int girisler[7];


Girilen şifreleri de bu şekilde diziye aktarılır.

  girisler[0] = 1; // Dizinin ilk değeri 1 olarak atandı 
                         // Bu işlemi for döngüsüyle de yapabilirsin


Dizileri de şu şekilde karşılaştırabilirsin
  for (int i = 0 ;i<= 7;i++)
  {
     if (sifrelerim[i] == girisler[i])
      {
         // buraya şifrelerin doğruluğuna göre işlem yapabilirsin. 
         // Mesela bir sayaç koyup arttırırsın eğer şifre sayısına eşit ise ona göre işlem yapabilirsin
       }
  }


i'm doing nothing... Giddy Up  http://www.drorhan.com

muhittin_kaplan

@OrhanC, Basic Bilenler Pek C den Yazılımını Çözemezler.
dim Sifre(4) as byte
dim Giris(4) as byte
dim loop as byte

for loop=0 to 4
  if sifre(loop)<>Giris(loop) then 
     goto YanlısSifre
  else
     .....
  endif
next

orhanc

basic bilmediğim için c ile anlatmak zorunda kaldım. ama mantığını anladıysa sorun olmaz.
i'm doing nothing... Giddy Up  http://www.drorhan.com

muhittin_kaplan

for (int i = 0 ;i<= 7;i++)


bunu ilk gördüğümde "Bu ne la" demiştim.:)

orhanc

aslında vb biliyorum picbasic de ona benziyor ama ben basici sevmiyorum :)
i'm doing nothing... Giddy Up  http://www.drorhan.com

sayment

Verdiğiniz cevaplar için herkese teşekkür ederim. Basic yazıyorum ama yavaş yavaş C ye geçmeye çalışıyorum yazılanları biraz biraz anladım. Mesela bu ne dediğiniz yer bir for döngüsü yanlış bilmiyorsam.

orhanc

i'm doing nothing... Giddy Up  http://www.drorhan.com

muhittin_kaplan

ama bir "For" tanıdık. Diğerlerinin Hepsi el oğlu.
Aycıca C mi Ighhh :)