Dizideki en Küçük Datayı nasıl bulabilirim?

Başlatan askb, 27 Nisan 2012, 16:27:55

askb

Merhaba,
Pic Basic Proda 5 adet register'dan en küçüğünü bulmaya çalışıyorum.Şu şekilde bir deneme yaptım ama çalışmıyor.
Sizlerin tavsiyesi nasıl olur?

SURE VAR WORD
J VAR BYTE
DATAA VAR BYTE[5]
ENKUCUK VAR BYTE
   
;---------------------------------
@ DEVICE PIC16F877, XT_OSC,WDT_ON,BOD_ON,CPD_OFF
@ DEVICE PIC16F877, PWRT_ON,LVP_OFF,PROTECT_OFF
;----------------------------------------------------
adcon1=7

porta=0:portb=0:portc=0:portd=0:porte=0
;-----------------------------------------
'PORTD=255:PAUSE 1000:PORTD=0:PAUSE 1000
'LCDOUT 254,1,128,"????????????" :PAUSE 1000
DATAA[0]=254
DATAA[1]=8
DATAA[2]=4
DATAA[3]=1
DATAA[4]=3
DATAA[5]=5


BASLA:
     
      J=0
      FOR J=0 TO 5
          IF DATAA(J)<DATAA(J+1)THEN ENKUCUK=DATAA(J)           
      NEXT J
      lcdout 254,192,dec ENKUCUK     
goto BASLA
;--------------------------------------------------------------------

bulunan sonuc 3 oluyor.yani DATAA[4] bulunuyor.Halbuki DATAA[3] bulunmalıydı.Acaba sorun nedir?




mufitsozen

#1
Alıntı yapılan: askb - 27 Nisan 2012, 16:27:55

bulunan sonuc 3 oluyor.yani DATAA[4] bulunuyor.Halbuki DATAA[3] bulunmalıydı.Acaba sorun nedir?

sorun senin programi yanlis yazman.

karsilastirma kucuk ile data[j] arasinda olmali data[j] kucukten daha kucuk ise kucuk=data[j] diyeceksin.

donguye girmeden once kucuk degiskenini ilk elemana esitle, bilahare donguyu 2den Ne dondur.

yada senin ozelinde

kucuk = data[1]
dongu 2 den 5'e: data[j] < kucuk ise kucuk=data[j]
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yamak

#2
Algoritma şu şekilde olmalı C ile yazıyorum.Basic bilmiyorum.

int j=0
int enKucuk;
for(i=1;i<=5;i++)
{
   if (data[i]<data[j])
       j=i;
}
en kucuk=data[j];

Not: mufitsozen ben yazarken cevabı vermiş.

askb

Merhaba,
Pic Basic Proda 5 adet register'dan en küçüğünü bulmaya çalışıyorum.Şu şekilde bir deneme yaptım ama çalışmıyor.
Sizlerin tavsiyesi nasıl olur?

SURE VAR WORD
J VAR BYTE
DATAA VAR BYTE[5]
ENKUCUK VAR BYTE
   
;---------------------------------
@ DEVICE PIC16F877, XT_OSC,WDT_ON,BOD_ON,CPD_OFF
@ DEVICE PIC16F877, PWRT_ON,LVP_OFF,PROTECT_OFF
;----------------------------------------------------
adcon1=7

porta=0:portb=0:portc=0:portd=0:porte=0
;-----------------------------------------

DATAA[0]=254
DATAA[1]=8
DATAA[2]=4
DATAA[3]=1
DATAA[4]=3
DATAA[5]=5


BASLA:
     
      J=0
      FOR J=0 TO 5
          IF DATAA(J)<DATAA(J+1)THEN ENKUCUK=DATAA(J)           
      NEXT J
      lcdout 254,192,dec ENKUCUK     
goto BASLA
;--------------------------------------------------------------------

bulunan sonuc 3 oluyor.yani DATAA[4] bulunuyor.Halbuki DATAA[3] bulunmalıydı.
Başka türlü nasıl yapılabilir.Fikirlerinizi almak istiyorum.




XX_CİHAN_XX

Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

canbulut

#5
ıf data0>data1 and  data0>data2 and data0>data3 and data0>data4 and data0>data5 then enbuyuk0
ıf data1>data0 and  data1>data2 and data1>data3 and data1>data4 and data1>data5 then enbuyuk1
ıf data2>data0 and  data2>data1 and data2>data3 and data2>data4 and data2>data5 then enbuyuk2
ıf data3>data0 and  data3>data1 and data3>data2 and data3>data4 and data3>data5 then enbuyuk3
ıf data4>data0 and  data4>data1 and data4>data2 and data4>data3 and data4>data5 then enbuyuk4
ıf data5>data0 and  data5>data1 and data5>data2 and data5>data3 and data5>data4 then enbuyuk5
enbuyuk0:
lcdout fe,1,"en buyuk data0'dır."
pause 200
goto bitti
enbuyuk1:
lcdout fe,1,"en buyuk data1'dır."
pause 200
goto bitti
enbuyuk2:
lcdout fe,1,"en buyuk data2'dır."
pause 200
goto bitti
enbuyuk3:
lcdout fe,1,"en buyuk data3'dır."
pause 200
goto bitti
enbuyuk4:
lcdout fe,1,"en buyuk data4'dır."
pause 200
goto bitti
enbuyuk5:
lcdout fe,1,"en buyuk data5'dır."
pause 200
goto bitti
bitti:
end


gibi yapsan iş görmezmi?ben sana fikir vermesi açısından yazdım program dahada güzelleştirilebilir.kolay gelsin.

Kabil ATICI

Bulduğun en küçük sayıyı bağımsız bir hafızada sakla ve ona göre değerlendirme yap.
...
ENKUCUK=DATAA(0) 
FOR J=1 TO 5
IF ENKUCUK>DATAA(J)THEN ENKUCUK=DATAA(J) 
...
şu şekilde bir yaklaşım belki olabilir.

gerçi bu sorunun birden fazla cevabı var...
ambar7

askb

Hepinize ayrı ayrı çok teşekkür ederim.
Yardımlarınız sayesinde sorun çözüldü...Program çalışıyor.
Hayırlı akşamlar.

ete

Sorunu çözmüş olabilirsin ancak dizi tanımlamasını yanlış yapıyorsun.
DATAA VAR BYTE[5] bu senin tanımlaman şunu diyor. 5 adet dizideğişkeni var.
Peki değer verdiğin dizi elemanlarına bir bakarmısın kaç tane;

DATAA[0]=254
DATAA[1]=8
DATAA[2]=4
DATAA[3]=1
DATAA[4]=3
DATAA[5]=5

Toplam 6 adet. Bu sıfır sayısını kimse sayıdan saymıyor her nedense. Dizi tanımlamasına 5 değil 6 yazacaksın.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

canbulut

ete hocam data var byte[5] demek zaten altı adet dizi değişkeni demek değilmidir? data0 dan data5'e kadar.

gladi

     ENKUCUK=255    ' yuksek değer ver 



FOR J=0 TO 5
      LOOKUP2 j,[dataa[0],dataa[1],dataa[2],dataa[3],dataa[4],dataa[5]],B1
      ENKUCUK=ENKUCUK min b1             
   

      NEXT J
      lcdout 254,192,dec ENKUCUK



böyle çalışıyor denedim şimdi
misafir olan kimse, beraberce getiremediği birşeye kalbini bağlamaz.

kayaaydin

Dizideki en küçük elemanı bulmak için döngüye girmeden önce ilk elemanını en küçük kabul etmelisin.
Ardından döngü içinde her bir elemanı sırayla o ilk elemandan küçük mü diye kontrol etmen gerekir.
Eğer küçükse yeni elemanı en küçük olarak almalısın.

Artık bunları koda dökmekte senin işin...

ete

Dizi degiskeni tanimlanirken dizi adı yanına adet yazılır ve buna sıfır dahil değildir. Sizin 6 adet dizi elemanınız var ve tanımlamada 5 yerine 6 yazmanız gerekir. Kullanırken 0-5 araliginda kullanacaksınız.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

taso

#13
c ile yazıyorum sen düzenlersin... yanlışlık ihtimalide mevcuttur :) dizinin her elemanı ile butun dizi ile karşılaştırmak lazım dizinin en kucuk elemanı dizi[0] olacak :)


int i,j;
dizi[]


while(j!=sizeof(dizi)){

bastan: ;
j=0;

for(i=0;i!=sizeof(dizi);i++){

if(dizi[j]>dizi){

int elde=dizi[j];

dizi[j]=dizi;

dizi=elde;

goto bastan;
}

}

j++;

}

ete

Bir değişken gurubunda en küçük değerliyi bulmanın muhtelif yolları vardır. Dizilerle çalışma yapmak işi biraz daha kolay hale getirebilir.
Ama en kolay yollarından birisi aşağıda zaman zaman benim uyguladığım yöntemdir.
Öncelikle KUCUK adı altında bir değişken tanımlayın buna mümkün olan en büyük değeri verin. Diyelimki değişkenlerimiz Byte cinsinden ve taşıyabilecekleri en büyük değer 255 olacaktır. O halde;
KUCUK var Byte
TEMP VAR BYTE
SAYI VAR BYTE[6]
INDEX VAR BYTE
KUCUK=255
FOR I=0 to 5
  TEMP=SAYI[I]
   IF TEMP<KUCUK THEN
         INDEX=I   
         KUCUK=TEMP
   ENDIF
NEXT
Bu döngü sona erdiği andan itibaren KUCUK isimli değişkene en küçük değişken değeri yerleştiği gibi INDEX isimli değişkenede o değişknein dizi içindeki konumu yerleşir.
Yalnızca değer lazım ise index kullanmaya gerek yoktur.

Ete

 
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com