En küçük ve en büyük datayı bulmak

Başlatan . Kağan, 02 Mart 2014, 23:03:11

. Kağan

Sayın ETE,

En küçük datayı bulmak için
ENKUCUK=255
IF OLCUMA<ENKUCUK THEN ENKUCUK=OLCUMA
IF OLCUMB<ENKUCUK THEN ENKUCUK=OLCUMB
IF OLCUMC<ENKUCUK THEN ENKUCUK=OLCUMC
IF OLCUMD<ENKUCUK THEN ENKUCUK=OLCUMD


önerdiniz.

1. Burada niçin 255 rakamını yazıyoruz?
2. En büyük datayı bulmak için ne yazmalıyız?

Hattuşa

slm kagan ustam,
4 kanaldan en büyük ve en küçüğü ekteki dosyada gösterdim, ben protonda yazdım artık sen PBP ya çevirirsin. LCD printi ile ilgili sorun vardı o kısma dikkat etme, en büyük ve en küçük değerleri bulmak için 2 rutin kurdum,
en büyüğü bulmak için for döngüsü içinde sonsuz karşılaştırma yaptım, 16 kez döngüyü karşılaştırdım. ama bu 16 çok kritik değil, belki mantıksız gibi gelir ama (yanlışsam düzeltin diyelim ki A1 küçükse A2 den o zaman o şart atlanacak) böyle düşündüm
EnBK:
X =0
For X =0 To 16
If A1 > A2 Then enBu =A1
If A2 >A3 Then enBu =A2
If A3 >A4 Then enBu =A3
If A4 >A1 Then enBu =A4
Next
Return


aynı şekilde en küçük içinde;
EnKc:
X =0
For X =0 To 16
If A1 < A2 Then EnKu =A1
If A2 <A3 Then EnKu =A2
If A3 <A4 Then EnKu =A3
If A4 <A1 Then EnKu =A4
Next
Return



ete

En küçük bulurken en küçük daima en büyükten başlamalı byte için 255 değeri. En büyük bulurken de en büyük daima en küçükten başlamalı yani sıfır. Bu açıkladığım genel bir kanun değil benim uyguladığım bir metod dur. Bu değerleri vermeden de büyük küçük mukayesesi yapabilirsiniz.
Ete

Hattuşa

ete hocam bu hesaplama bana da lazım olacak

http://etepic.com/index.php/topic,207.msg1755.html#msg1755

'Buraya kadar 15 adet değişkenimizde okunan adc değerleri rastgele yerleşmiş oldu.
'Şimdi bunları bir sıraya dizmemiz gerekiyor. Bubble Sort yöntemini kullanacağız.
FOR X=0 to 13
   FOR Y=(X+1) TO 14
      IF OKUNAN[X]>OKUNAN[Y] THEN
          TEMP=OKUNAN[X]
           OKUNAN[X]=OKUNAN[Y]
           OKUNAN[Y]=TEMP
      ENDIF
   NEXT
NEXT


yukarıdaki linkte kararlı filtre için algoritmada kullandığımız yöntem, ama işe yaramadı denememde,

kagan ustamın yaptığı şekille daha düzgün bir algoritma nasıl yapabiliriz. kafam durdu yine  ;D

Hattuşa

#4
ete hocam;
yukarıdaki örneğe göre en büyük ve en küçük değeri buldum, yani mantık hatası yapmışım, şimdi bulduğum en büyük değer ile en küçük değerin hangisine ait olduğunu nasıl göstereceğim, yani ekranda en büyük değeri veya en küçük değeri basma yerine hangisine ait  olduğunu yazdırmak istiyorum

EnBK:
For X =0 To 2
    For Y =(X +1) To 3
    If A[X] >A[Y] Then
    eMaNeT =A[X]
    A[X] =A[Y]
    A[Y] =eMaNeT
   
    EndIf
Next
Next
enBu =A[3]
enBu=(enBu *5) /1023

Return

EnKc:
For X =0 To 2
    For Y =(X +1) To 3
    If A[X] < A[Y] Then
    eMaNeT =A[X]
    A[X] =A[Y]
    A[Y] =eMaNeT
     
    EndIf
Next
Next
EnKu =A[3]
EnKu =(EnKu *5) /1023

Return

ete

"Hangisine ait olduğunu" tabirini pek anlamadım ne demek istiyorsun acaba. ?
Yoksa bir çok sayı içinden en küçüğü bulduğun zaman o sayının sayılar içinden hangisinin karşılığı olduğunu mu kast ediyorsun.
Her neyse bu neden gerekli onuda anlamadım normalde bu tür şeyler pek gerekli olmaz ama çok gerekli ise yer değiştirme anında index numarasını kayıt ederek en küçük (veya en büyük) sayının hangi sayı olduğunuda anlayabilirsin.

Ete

Hattuşa

ete hocam;
diyelim ki
A1 =200
A2 =100
A3 =400
A4 =50

bunu en büyükten küçüğe doğru sıraladığımızda A3,A1,A2,A4 oluyor ya yukarıdaki algoritmaya göre en küçük A4 ama bunun değeri yazıyor yani 50, ben değeri değilde A4 ü göstermek istiyorum

ete

Değişkenler index li değil ise bir bir sürü kod yazmak gerekir.
A1 =200
A2 =100
A3 =400
A4 =50
ENKUCUK=50 olarak bulduktan sonra
IF ENKUCUK=A4 THE
  LCDOUT "A4=";enkucuk
ENDIF
...
diğer değişkenleri de aynı test den geçirirsin olur biter. Aklıma gelen budur. Pek lazım olmayan bir konu olduğu için daha fazlası aklıma gelmiyor.

Ete


. Kağan

#8
Peki şöyle bir soru sorayım.

4 değerden hiçbiri bir diğerinden 5 farktan daha farklı değilse. yani hata payımız 5 ise ne eklemeliyiz aşağıdaki koda.

Yani;
           FARK_A = 83
           FARK_B = 81
           FARK_C = 84
           FARK_D = 80    ise hiç led yanmaması lazım.


 IF FARK_A > 5 THEN 
                    LED_SOL_ON=1
                    bekle=1
              ENDIF
                 
              IF FARK_B > 5 THEN 
                   LED_SAG_ON=1
                   Bekle=1
              ENDIF

              IF FARK_C > 5 THEN   
                 LED_SOL_ARKA =1
                 BEKLE=1
              ENDIF

              IF FARK_D > 5 THEN   
                   LED_SAG_ARKA =1
                   BEKLE=1
              ENDIF   

              IF bekle=1 then
                                   
                 PAUSE 20000                     
                    LED_SOL_ON=0:LED_SAG_ON=0:LED_SOL_ARKA =0: LED_SAG_ARKA =0
              ENDIF
             

ete

Bu verdiğin kodlarla bütün ledler yanar. Hepside 5 denbüyük çünki. Ancak kafanda olan şeyi anlatamadın diye düşünüyorum.
Hata payı konuşup Fark değeri kullanıyorsun gibime geliyor. Şöyle mi olmalı acaba?
ELinde 4 adet fark değeri var
FARK_A = 83
FARK_B = 81
FARK_C = 84
FARK_C = 80   
Bunların en büyüğü FARK_C=84 dür. Bunu bulduğunu düşünelim.
Buradan HATA(A)=84-83=1
IF HATA>5 then
         LED_SOL_ON=1
         bekle=1
ENDIF
şeklinde bir ifade yazabilirsin.
Benzer şekilde diğerler hatalarıda hesaplayıp hata miktarına göre ledlerin yanıp yanmamasını sağlayabilirsin.

Benzer şekilde enküçük değeri bulup farklar dan en küçük değeri de çıkartabilir ve onu hata olarak kabul edebilirsin.

Ete

. Kağan

Şöyle olabilirmi?


'****************************************************************
EN_KUCUK=255
   
            IF OLCUM_A<EN_KUCUK THEN EN_KUCUK = OLCUM_A        '4 DEĞERDEN EN KÜÇÜK OLANI BUL
            IF OLCUM_B<EN_KUCUK THEN EN_KUCUK = OLCUM_B
            IF OLCUM_C<EN_KUCUK THEN EN_KUCUK = OLCUM_C
            IF OLCUM_D<EN_KUCUK THEN EN_KUCUK = OLCUM_D
           
'****************************************************************
           IF OLCUM_A > 0 THEN
                    FARK_A = OLCUM_A - EN_KUCUK
                ELSE
                    FARK_A = 0
                ENDIF
               
        IF OLCUM_B > 0 THEN
                    FARK_B = OLCUM_B - EN_KUCUK
                ELSE
                    FARK_B = 0
                ENDIF
               
        IF OLCUM_C > 0 THEN
                    FARK_C = OLCUM_C - EN_KUCUK
                ELSE
                    FARK_C = 0
                ENDIF
               
        IF OLCUM_D > 0 THEN
                    FARK_D = OLCUM_D - EN_KUCUK
                ELSE
                    FARK_D = 0
                ENDIF     

'****************************************************************

        IF
            FARK_A - FARK_B > 5 OR FARK_A - FARK_C > 5 OR FARK_A - FARK_D > 5 THEN
            LED_SOL_ON = 1
            BEKLE =1
        IF   
            FARK_B - FARK_A > 5 OR FARK_B - FARK_C > 5 OR FARK_B - FARK_D > 5 THEN
            LED_SAG_ON = 1
            BEKLE =1
        IF   
            FARK_C - FARK_A > 5 OR FARK_C - FARK_B > 5 OR FARK_C - FARK_D > 5 THEN
            LED_SOL_ARKA = 1
            BEKLE =1
        IF   
            FARK_D - FARK_A > 5 OR FARK_D - FARK_B > 5 OR FARK_D - FARK_C > 5 THEN
            LED_SAG_ARKA = 1
            BEKLE =1   
           
            ENDIF
           
         IF bekle=1 then
                                   
                 PAUSE 20000                     
                    LED_SOL_ON=0:LED_SAG_ON=0:LED_SOL_ARKA =0: LED_SAG_ARKA =0
            ENDIF 

İlyas KAYA

MIN ve MAX komutları iş görür sanırım.

sonuc=A max b  'a ve b değişkenlerinden hangisi büyük ise sonuc değişkenine ata
sonuc=A min b 'a ve b değişkenlerinden hangisi küçük ise sonuç değişkenine ata

sonuc= A min 50 'a 50 den küçükse a'yı değilse sonucu 50 yap
sonuc= A max 50 'a 50den büyükse a'yı değilse sonucu 50 yap

GİBİ.

6 FARKLI SAYI İÇİNDEN EN KÜÇÜK OLANI;

s1=a min b
s2=c min d
s3=e min f

s4=s1 min s2
s5=s2 min s3

sonuc=s4 min s5

denemedim ancak mantık olarak bu şekilde bulmuş oluruz.

Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Hattuşa

Alıntı yapılan: İlyas KAYA - 05 Mart 2014, 23:34:22
MIN ve MAX komutları iş görür sanırım.

sonuc=A max b  'a ve b değişkenlerinden hangisi büyük ise sonuc değişkenine ata
sonuc=A min b 'a ve b değişkenlerinden hangisi küçük ise sonuç değişkenine ata

sonuc= A min 50 'a 50 den küçükse a'yı değilse sonucu 50 yap
sonuc= A max 50 'a 50den büyükse a'yı değilse sonucu 50 yap

GİBİ.

6 FARKLI SAYI İÇİNDEN EN KÜÇÜK OLANI;

s1=a min b
s2=c min d
s3=e min f

s4=s1 min s2
s5=s2 min s3

sonuc=s4 min s5

denemedim ancak mantık olarak bu şekilde bulmuş oluruz.



çok yaşayasın ilyas usta;
PBP yu bilmem ama protonda max ve min komutları mevcutmuş sayenizde farkettim. dword ve float değişkenlerinde çalışmaz diyor helpte, sayıları karşılaştırmak veya belli değerde sınırlandırmak için kullanılıyormuş, nasipse bir kod denemesi yaparım isisde 1-2 günlük şehir dışına çıkacam dönünce denerim inş.

Powered by EzPortal