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

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

orhanc

Bence her programcının bilmesi gereken bir dil C dilidir.
i'm doing nothing... Giddy Up  http://www.drorhan.com

yas

Alıntı yapılan: sayment - 16 Ağustos 2010, 01:50:39
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.

Merhaba benim verdiğim kod kesinlikle bir uygulamanın son hali olamaz, sadece fikir vermesi açısından sizin vermiş olduğunuz örneğin üzerinden giderek for next döngüsü yardımıyla dizi değişkenleri karşılaştırdım. Evet bu kodda for next içerisindeki Lcdout komutlarından dolayı ekran 4 defa refresh edilecek ama insan gözünün bunu algılaması mümkün değil ayrıca son olarak şifre doğru olarak ekranda yazması için bu iki dizini biribirine eşit olması gerekli eğer aradaki bir tuş değeri yanlış gelirse zaten bütün dizi içeriği siliniyor. Böylece sonraki tuş değerlerinin içeriği temizlenmiş oluyor yani şaşırma imkanı yok bu koddaki göze batan kısım lcd ye karşılaştırma esnasında veri gönderilmesi. Ben şahsen böyle bir uygulama yapacak olsam boolean bir değişkeni karşılaştırmada result olarak kullanırdım. Döngüden çıktıktan sonra lcd ve diğer işlemleri gerçekleştirirdim. Daha öncede belirtiğim gibi uygulama bu şekliyle hiç bir işe yaramaz fikir vermesi açısından yazmıştım. Şifreli kilit uygulaması için benim size bağzı önerilerim olacak bu önerileri modül modül hazırlayıp sonrada tek bir yapıda birleştirirseniz güzel bir şeyin ortaya çıkacağı kanaatindeyim.

- Dışarıdan veri(şifre ayar vs) girebilmek için keypad rutini
- Şifre girilme esnasında aşırı beklemeler olduğunda timeout rutini
- Kullanıcı dostu bir setup menüsü (şifre değiştirme, timeout ayarı, güvenlik kontrölü vs)
- Güvenlik kontrolünden kasıt eğer şifre belirlenen adetten fazla yanlış girilmişse uyarı vermesi, belirli birsüre kendini bloke etmesi veya kendini Contact servis moduna sokması gibi önlemler.
- Şifre tuşlanırken eğer ekrana yazılacaksa kısa süre sonra * karekteriyle ekrandaki görselin saklanması
- Eğer birden fazla şifre kullanılıyorsa bunlara için yetki sınırları admin operetör gibi.
- Eğer girilen şifreler epromda saklanacak ise bunlar ham haliyle eproma yazılmamalı basitte olsa bir kriptolama yapılmalı
- Sesli ikazlar ile kullanıcı uyarılabilir. (onay, hata, tuş sesi vb gibi)
- Rtc kullanılabilir bu sayede belirli saatlerin dışında (mesala mesai saatleri dışında veya hafta sonları) ayarlanan yetkiler kapatılabilir.
Bunun gibi bir çok unsur eklenebilir. Aslında oturup bunları yazana kadar bir uygulama yazsaydım şimdiye yarılamıştım  ;D herhalde.
Kolay gelsin.

orhanc

Mantığı şu şekilde yapsan daha iyi olur diyelim şifre 1071 ve adam 1072 giriyor son haneye gelene kadar şifre doğru yazacak ve son hanede şifre yanlış yazacak ekrana. Böyle yapmak yerine tüm diziyi karşılaştırdıktan sonra ekrana mesaj vermen daha iyi olur.
i'm doing nothing... Giddy Up  http://www.drorhan.com

sayment

Alıntı yapılan: yas - 16 Ağustos 2010, 23:08:28
Alıntı yapılan: sayment - 16 Ağustos 2010, 01:50:39
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.

Merhaba benim verdiğim kod kesinlikle bir uygulamanın son hali olamaz, sadece fikir vermesi açısından sizin vermiş olduğunuz örneğin üzerinden giderek for next döngüsü yardımıyla dizi değişkenleri karşılaştırdım. Evet bu kodda for next içerisindeki Lcdout komutlarından dolayı ekran 4 defa refresh edilecek ama insan gözünün bunu algılaması mümkün değil ayrıca son olarak şifre doğru olarak ekranda yazması için bu iki dizini biribirine eşit olması gerekli eğer aradaki bir tuş değeri yanlış gelirse zaten bütün dizi içeriği siliniyor. Böylece sonraki tuş değerlerinin içeriği temizlenmiş oluyor yani şaşırma imkanı yok bu koddaki göze batan kısım lcd ye karşılaştırma esnasında veri gönderilmesi. Ben şahsen böyle bir uygulama yapacak olsam boolean bir değişkeni karşılaştırmada result olarak kullanırdım. Döngüden çıktıktan sonra lcd ve diğer işlemleri gerçekleştirirdim. Daha öncede belirtiğim gibi uygulama bu şekliyle hiç bir işe yaramaz fikir vermesi açısından yazmıştım. Şifreli kilit uygulaması için benim size bağzı önerilerim olacak bu önerileri modül modül hazırlayıp sonrada tek bir yapıda birleştirirseniz güzel bir şeyin ortaya çıkacağı kanaatindeyim.

- Dışarıdan veri(şifre ayar vs) girebilmek için keypad rutini
- Şifre girilme esnasında aşırı beklemeler olduğunda timeout rutini
- Kullanıcı dostu bir setup menüsü (şifre değiştirme, timeout ayarı, güvenlik kontrölü vs)
- Güvenlik kontrolünden kasıt eğer şifre belirlenen adetten fazla yanlış girilmişse uyarı vermesi, belirli birsüre kendini bloke etmesi veya kendini Contact servis moduna sokması gibi önlemler.
- Şifre tuşlanırken eğer ekrana yazılacaksa kısa süre sonra * karekteriyle ekrandaki görselin saklanması
- Eğer birden fazla şifre kullanılıyorsa bunlara için yetki sınırları admin operetör gibi.
- Eğer girilen şifreler epromda saklanacak ise bunlar ham haliyle eproma yazılmamalı basitte olsa bir kriptolama yapılmalı
- Sesli ikazlar ile kullanıcı uyarılabilir. (onay, hata, tuş sesi vb gibi)
- Rtc kullanılabilir bu sayede belirli saatlerin dışında (mesala mesai saatleri dışında veya hafta sonları) ayarlanan yetkiler kapatılabilir.
Bunun gibi bir çok unsur eklenebilir. Aslında oturup bunları yazana kadar bir uygulama yazsaydım şimdiye yarılamıştım  ;D herhalde.
Kolay gelsin.

Teşekkür ederim vakit ayırdığınız için söylediklerinizde haklısınız bunlar yapılsa mükemmel bir sistem olur ama bunları yapacak bilgi seviyesinde değilim henüz :( Şuanda yazdığım programda da bir açık var zaten onu daha tam olarak çalıştırmış değilim.Yardımlarınız için tekrar teşekkür ederim.Kolay gelsin.

sayment

Alıntı yapılan: orhanc - 16 Ağustos 2010, 23:48:09
Mantığı şu şekilde yapsan daha iyi olur diyelim şifre 1071 ve adam 1072 giriyor son haneye gelene kadar şifre doğru yazacak ve son hanede şifre yanlış yazacak ekrana. Böyle yapmak yerine tüm diziyi karşılaştırdıktan sonra ekrana mesaj vermen daha iyi olur.

Benim yapmak istediğimde o zaten .Bence doğru olanda odur . Çünki her basamakta doğru yada yanlış ibresi çıksa şifreyi gir her basamak için maksimum on denemede doğru rakamı bulur :)

orhanc

ekrana yazı yazmak yerine oraya bi tane sayaç ekle. Her doğru şifre için onu bir arttır ve eğer sayaç şifrenin uzunluğuna eşitse ekrana şifre doğru mesajı verebilirsin mesela.
i'm doing nothing... Giddy Up  http://www.drorhan.com

sayment


muhittin_kaplan

her doğru şifrede, değişkenin birini 1 arttır. bu değişkenin sonucuna bakarak, şifrenin tam doğru olup olmadığını sorgula ve en son girişten sonra çıkış ver.

sayment

#23
Mantıklı . Ama klasik tuşa basınca  "*"  işareti çıkması daha bir hoş oluyor sanki.Yada ekranda "*" çıkarmadan her tuşa bastığında bip sesi yada bir ledi yakıp sondurmek de hoş olabilir. LCD , buzzer yada led kullanmazsak her tuşa basıldığında şifreyi sanki boşa giriyormuş gibi hissederiz. Sonuçta her tuşa bastığında hiç bir uyarıcı olmayacak öyle değilmi.

RcALTIN

#24
Aslında hep kafa karıştıran yoldan gidiliyor...
C'den örnekleyerek yazayım:
int hane=4;//şifre hane sayımızı belirliyoruz...
int dsifre[hane];//doğru kabul edilen şifremiz
int gsifre[hane];//dışarıdan girilen şifremiz
//Şimdi kontrol mekanizmamız için bir adet mantıksal değişkenimiz olsun (1 veya 0 değeri alan)
int1 a=1; // değişkeni tanımladık ve mantıksal olarak doğru kabul etmeye karar verip 1 atadık kendisine..
int i;//döngü değişkenimiz;
for(i=0;i<hane;i++)//kontrol mekanizmamız için for döngüsü
{
     if(gsifre[i]!=dsifre[i]) // eğer şifremizin doğru şifre ile bir karakteri uyuşmuyorsa
     {
          a=0; // mantıksal değişkenimiz artık yanlış sonucuna çevrildi...
          break;// döngüyü kırıyoruz, çünkü artık başka hanelere bakmamıza gerek yok, elimizde bir yanlış mevcut..
     }
}
//kontrol işlemimiz bitti artık mantıksal değişkenimizin son durumuna göre karar veriyoruz
if(a)
    lcd_putc("SIFRE DOGRU");
else
    lcd_putc("SIFRE YANLIS");


Önceki mesajlarımda anlatmaya çalıştığım olay budur, compiler olmadan yazdığım için direkt kopyala yapıştır yapılırsa sorunlar çıkabilir, zaten "girilen şifre" ve "doğru şifre" değişken değeleri set edilmemiş hali hazırda...

KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

sayment

Mantıklı ve daha basit teşekkür ederim. Aynı mantıkla yarın basic e uyarlamaya çalışacağım.

orhanc

Alıntı yapılan: RcALTIN - 17 Ağustos 2010, 02:45:56
Aslında hep kafa karıştıran yoldan gidiliyor...
C'den örnekleyerek yazayım:
int hane=4;//şifre hane sayımızı belirliyoruz...
int dsifre[hane];//doğru kabul edilen şifremiz
int gsifre[hane];//dışarıdan girilen şifremiz
//Şimdi kontrol mekanizmamız için bir adet mantıksal değişkenimiz olsun (1 veya 0 değeri alan)
int1 a=1; // değişkeni tanımladık ve mantıksal olarak doğru kabul etmeye karar verip 1 atadık kendisine..
int i;//döngü değişkenimiz;
for(i=0;i<hane;i++)//kontrol mekanizmamız için for döngüsü
{
     if(gsifre[i]!=dsifre[i]) // eğer şifremizin doğru şifre ile bir karakteri uyuşmuyorsa
     {
          a=0; // mantıksal değişkenimiz artık yanlış sonucuna çevrildi...
          break;// döngüyü kırıyoruz, çünkü artık başka hanelere bakmamıza gerek yok, elimizde bir yanlış mevcut..
     }
}
//kontrol işlemimiz bitti artık mantıksal değişkenimizin son durumuna göre karar veriyoruz
if(a)
    lcd_putc("SIFRE DOGRU");
else
    lcd_putc("SIFRE YANLIS");


Önceki mesajlarımda anlatmaya çalıştığım olay budur, compiler olmadan yazdığım için direkt kopyala yapıştır yapılırsa sorunlar çıkabilir, zaten "girilen şifre" ve "doğru şifre" değişken değeleri set edilmemiş hali hazırda...

a değişkeni bool olarak tanımlamak daha kolay kontrolü sağlayabilir.
i'm doing nothing... Giddy Up  http://www.drorhan.com

RcALTIN

Alıntı yapılan: orhanc - 17 Ağustos 2010, 04:52:49
a değişkeni bool olarak tanımlamak daha kolay kontrolü sağlayabilir.

Değişken BOOLEAN olarak tanımlanıp "TRUE/FALSE" atanabiliyor( BOOLEAN a=TRUE; ) ancak ccs'in "Basic and Special types" listesinde bu değişken tipi belirtilmemiş, bende o nedenle int1 olarak tanımlayıp "1/0" atamayı daha doğru buldum arkadaş basic'e çevirirken zorlanmasın diye.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

orhanc

sanırım #bit tipi var aynı iş için kullanılabilecek
i'm doing nothing... Giddy Up  http://www.drorhan.com

sayment

#29
define osc 4
'****************************************************************
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4    
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2   
DEFINE LCD_EREG PORTB   
DEFINE LCD_EBIT 3     
DEFINE LCD_BITS 4      
DEFINE LCD_LINES 4  
'****************************************************************
TRISB=$00
TRISD=$70
PORTD=$00
'****************************************************************
BUTON VAR BYTE
SIFRE VAR BYTE[3]
TUS VAR BYTE[3]
A var byte
B VAR BYTE
C VAR BYTE
'****************************************************************
SYMBOL SATIR1=PORTD.0
SYMBOL SATIR2=PORTD.1
SYMBOL SATIR3=PORTD.2
SYMBOL SATIR4=PORTD.3
SYMBOL SUTUN1=PORTD.4
SYMBOL SUTUN2=PORTD.5
SYMBOL SUTUN3=PORTD.6
SYMBOL KAPI  =PORTD.7
'****************************************************************
SIFRE[0] = 5
SIFRE[1] = 0
SIFRE[2] = 2
SIFRE[3] = 0
A = 0 : B = 1 : C = 0
'****************************************************************
MENU:
IF C = 4 THEN GOSUB DOGRULA
GOSUB TARAMA
GOTO MENU
'****************************************************************
TARAMA:

SATIR1=1
    IF SUTUN1=1 THEN BUTON=1  : GOSUB LCD 
    IF SUTUN2=1 THEN BUTON=2  : GOSUB LCD
    IF SUTUN3=1 THEN BUTON=3  : GOSUB LCD 
SATIR1=0

SATIR2=1
    IF SUTUN1=1 THEN BUTON=4  : GOSUB LCD 
    IF SUTUN2=1 THEN BUTON=5  : GOSUB LCD 
    IF SUTUN3=1 THEN BUTON=6  : GOSUB LCD 
SATIR2=0

SATIR3=1
    IF SUTUN1=1 THEN BUTON=7  : GOSUB LCD
    IF SUTUN2=1 THEN BUTON=8  : GOSUB LCD 
    IF SUTUN3=1 THEN BUTON=9  : GOSUB LCD 
SATIR3=0

SATIR4=1
    IF SUTUN1=1 THEN BUTON=11 : GOSUB LCD 
    IF SUTUN2=1 THEN BUTON=0  : GOSUB LCD 
    IF SUTUN3=1 THEN BUTON=12 : GOSUB LCD 
SATIR4=0

PAUSE 250
RETURN
'****************************************************************
LCD:
C = C + 1

IF B = 1 THEN
    IF A=4 THEN A=0
    TUS[A]=BUTON 
    KAPI = 1
    PAUSE 100
    KAPI = 0
    GOSUB KONTROL
    A=A+1
ELSE
    GOTO MENU 
ENDIF

RETURN
'****************************************************************
KONTROL:
    IF SIFRE[A] = TUS[A] THEN 
    B = 1
    ELSE
    B = 0 
    ENDIF
RETURN   
'****************************************************************
DOGRULA:

IF B = 1 THEN 
    LCDOUT $FE, $80, "SIFRE DOGRU" 
ELSE
    LCDOUT $FE, $80, "SIFRE YANLIS"
ENDIF
RETURN  
'****************************************************************
end


Böyle bir program yazdım ama hala tam olarak çalışmıyor. Doğru şifreyi girince kabul ediyor LCD 'de şifre doğru yazıyor. Ama sorun şu: diyelim şifre 1234 . Şifredeki rakamların dışında herhangi bir tuşa bastığımızda ikinci basışta şifre yanlış yazıyor. Normalde 4 hane tamamlanınca yazması lazım. Programı takip ederek yapması gerekenlere bakıyorum ama kaçırdığım bir nokta var galiba..