Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen izmirlikemal »

Verilen herhangi bir sayının örneğin Table1 de kayıtlı olan sayılardan en yakın,

küçük ve büyük değerini nasıl buluruz.

Sorumu Açıklama için örnekleme:
-------------------------------------------
Table1 deki sayı grubu şöyle olsun

1,00
1,25
1,50
1,65
-----> 1,75
1,85
2,10
....
Edit1 e girdiğim sayı diyelim ki 1,75
Sorumun cevabının 1,65 ile 1,85 olmasını istiyorum.
Bu iki sayıyı bulmak için nasıl bir yöntem uygulamam gerekiyor.
Yardımlarınız için teşekkür ederim.
AfterPost
Üye
Mesajlar: 144
Kayıt: 12 Tem 2014 10:22

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen AfterPost »

table1.first
for ii:=1 to table1.recorcount do
begin
if (edi1.text>table1alan) then showmessage('araduğınız sayı budur')// bu değilde bir sonraki kayde geç
table1.next;
end; gibi bir döngü işini görebilir
kirve
Üye
Mesajlar: 64
Kayıt: 03 Nis 2008 12:40

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen kirve »

Kod: Tümünü seç


SELECT TOP 1 * FROM TABLON WHERE ALAN >
(
SELECT ALAN FROM TABLON  WHERE ALAN=20
)
UNION 
(
SELECT TOP 1 * FROM TABLON WHERE ALAN<
(
SELECT ALAN FROM TABLON WHERE ALAN=20
) 


izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen izmirlikemal »

Bu problemin çözüm kodlarını SQL dilinde yazacak arkadaşlarıma müteşekkir kalacağım. Zira Paradox veri tabanından arzu ettiğim verileri alamadım.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen brs »

İki sayı arasında var ise var yok ise yok cevabını alırsın...

Kod: Tümünü seç

procedure TForm3.Button1Click(Sender: TObject);
begin
  with Form1.Playlist do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM PLAYLIST');
    SQL.Add('Where PROGRAMADI Like ' + QuotedStr('%' + Edit1.Text + '%'));
    SQL.Add('And ID BETWEEN :I1 And :I2 Order By SIRANO');
    ParamByName('I1').AsInteger := 20;
    ParamByName('I2').AsInteger := 40;
    Prepared := True;
    Open;
    if Not IsEmpty then // Kayıt Varsa
    begin
      Showmessage('VAR');
    end
    else
    begin
      Showmessage('YOK');
    end;
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
speed60
Üye
Mesajlar: 53
Kayıt: 07 Eki 2011 08:07

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen speed60 »

Table1.FindNearest; birebir eşleşmesse en yakın değeri bulur belki işinin görebilir.
kirve
Üye
Mesajlar: 64
Kayıt: 03 Nis 2008 12:40

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen kirve »

1. yol
sql kodu ile yapamazsan bir dinamik dizi oluştur.
sql kodunu büyükten küçüge doğru sırala
aradığın dizi elemanını bul.
dizi elamanı kaçıncı sırada ise
bir önceki ve bir sonraki dizinin sıra numarasından istediğin rakamları elde edebilirsin.
kodaları test etmedim uygulayıp bakabilirsiniz.

Kod: Tümünü seç

var
dizi:array of real;
i:Integer;
arananno,oncekino,sonrakino:Real;
begin
  with qry1 do
    begin
      Close;
      SQL.Clear;
      SQL.Text:='SELECT ALANADIN FROM TABLOADIN ORDER BY ALANADIN ASC';
      ExecSQL;
    end;
    SetLength(dizi,qry1.RecordCount);
    i:=0;
    qry1.First;
    while not (qry1.Eof) do
      begin
        dizi[i]:=qry1.FieldByName('ALANADIN').Value;
        Inc(i);
        qry1.Next;
      end;
       arananno:=7.5;
      for i := 0 to Length(dizi) do
        begin
          if (dizi[i]=arananno) then
            begin
              Exit;
            end;

        end;
       oncekino:=dizi[i-1];
       sonrakino:=dizi[i+1];

       Self.Caption:='Küçük '+FloatToStr(oncekino) + ' aranan'+FloatToStr(arananno)+' Büyük '+FloatToStr(sonrakino);



2. yol ise daha basit

sqlini büyükten küçüğe doğru sıralarsın
aradığın numarayı qry döngüsünde bulursun;
sonraki numarayı bumak için qry bir ileri atarsın
önceki numarayı bulmak için qry iki geri atarsın

farklı farklı algoritmaları kullanabilirsin.
performans testini yapıp birine karar verebilirsin.

verilerin çok büyükse mergeshort diye bir algoritma olacaktı onu arastırabilirsin

Kod: Tümünü seç

  with qry1 do
    begin
      Close;
      SQL.Clear;
      SQL.Text:='SELECT ALANADIN FROM TABLOADIN ORDER BY ALANADIN ASC';
      ExecSQL;
    end;
        while not (qry1.Eof) do
      begin
      	if (qry1.fieldbyname('alanadı').value=arananno)
      		begin
      			exit;
      		end
        qry1.Next;
      end;
      qry1.next;
      sonrakino:=qry1.fieldbyname("alanadı").value;
      qry1.prior;
      qry1.prior;
      oncekino:=qry1.fieldbyname("alanadı").value;
    
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen unicorn64 »

Kod: Tümünü seç

SELECT MAX(ALAN_ADI) KUCUKLERIN_EN_BUYUGU FROM TABLO WHERE ALAN_ADI<:KONTROL_DEGERI -- verilen örneğe göre kontrol değerine 1,75 verilirse 1,65 i döndürür

Kod: Tümünü seç

SELECT MIN(ALAN_ADI)  BUYUKLERIN_EN_KUCUGU FROM TABLO WHERE ALAN_ADI>:KONTROL_DEGERI -- verilen örneğe göre kontrol değerine 1,75 verilirse 1,85 i döndürür
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen izmirlikemal »

Sayın Dostum unicorn64 konuya biraz daha açıklık getirirminiz.
Sayın Dostum "kirve" ;
1. Paradox tablodaki verilerim string tipinde.
2. Örneğimde verdiğim 1,75 rakamı veritabanında kayıtlı değil.
Değerlendirmelerini buna göre yaparak daha ayrıntılı bilgi ve kod verirsen memnun olacağım.
Her ikinize çalışmalarınıza teşekkür ederim.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen unicorn64 »

izmirlikemal yazdı:Sayın Dostum unicorn64 konuya biraz daha açıklık getirirminiz.
Sayın Dostum "kirve" ;
1. Paradox tablodaki verilerim string tipinde.
2. Örneğimde verdiğim 1,75 rakamı veritabanında kayıtlı değil.
Değerlendirmelerini buna göre yaparak daha ayrıntılı bilgi ve kod verirsen memnun olacağım.
Her ikinize çalışmalarınıza teşekkür ederim.
ilk mesajda yazdığın duruma göre sana 2 sql sorgusu yazmışım, daha nasıl açıklık getireyim, sorguları çalıştırıp denedin mi?
denedin de beklediğin sonucu mu alamadın, sorguyu mu anlamadın?

önce sen derdine bir açıklık getir,
sonra verilen örnekleri dene, anlamaya çalış,
anlayamadığın yeri de ben şöyle yaptım (kodu buraya yazarak) ama olmadı, şu hatayı aldım, şu kısmını yapamadım vs... şeklinde açıkla
gerisi kolay,
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen izmirlikemal »

Sayın unicorn64 öncelikle derdime bir açıklık getireyim:
-------------------------------------------------------------------
Ben iklimlendirme ile ilgili bir çalışmanın içinde uzun süredir bulunuyorum.
ilk mesajımda örnek olarak verdiğim string şeklindeki değerlerin veritabanına kayıtlı olduğunu düşünmeniz için örnekleme yapmıştım.
Şimdi Veritabanı kayıtları ile ilgili daha detaylı bilgi vermek istiyorum.

veritabanı tablosu olarak: "psikrometrikdegerlerVT.db" şeklinde paradox da Table oluşturdum.
bu tablonun içinde yaklaşık 15 adet "alan adı" var.
bu alan adlarından birkaç tanesi : kurutermometre, yastermometre, izafirutubet , ....
Kuru termometre sıcaklıklarına ve izafi nem değerlerine bağlı olarak yaş termometre sıcaklıkları değişmektedir.
Alan adları kurutermometre IzafiNem YasTermometre
10 20 21,4
10 30 22,1
10 40 22,6
20 20 23,2
20 30 24,7
20 40 25,0
vs.

örneğin benim Hazırladığım formdaki Edit1 hücresine gireceğim 14°C Kuru Termometre ve Edit2 hücresine gireceğim 43 izafi nem değeri ni
kullanarak Yaş termometre sıcaklığını hesaplamak istiyorum.

Şimdi sizin yukarda 1. yol olarak vermiş olduğunuz kodları kendime adapte etmeye çalışarak aşağıdaki şekilde düzenledim:

procedure TForm1.Button1Click(Sender: TObject);
var
dizi:array of real;
i:Integer;
arananno,oncekino,sonrakino:real;
begin

with qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT KuruTermometre, IzafiNem FROM PsikrometrikDegerlerVT ORDER BY KuruTermometre ASC';
ExecSQL;
end;

SetLength(dizi,qry1.RecordCount);
i:=0;
qry1.First;
while not (qry1.Eof) do
begin
dizi:=qry1.FieldByName('KuruTermometre').value;
Inc(i);
qry1.Next;
end;
arananno:=7.5;
for i := 0 to Length(dizi) do
begin
if (dizi=arananno) then

begin
exit
end;

end;
oncekino:=dizi[i-1];
sonrakino:=dizi[i+1];
Self.Caption:='Küçük '+floattostr(oncekino) + ' Aranan : '+floattostr(arananno)+' Büyük : '+floattostr(sonrakino);

end;
---------------------
Kodları yukardaki gibi düzenlediğimde " Qry1: Cannot perform this operation on a closed dataset" şeklinde bir mesaj
alıyorum.
ExecSQL yerine Open; yazdığımda ise;
küçük ve Büyük değerlerinin : 3,607392...87E-313 gibi ilgisiz alakasız bir değer vermekde. Takdirleri size bırakıyorum. Yanlışımın nerede olduğu
konusunda aydınlatırsanız sevinirim.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen Lord_Ares »

with qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT KuruTermometre, IzafiNem FROM PsikrometrikDegerlerVT ORDER BY KuruTermometre ASC';
ExecSQL;
end;
bu kısım dikkatimi çekti oradaki close; kaldırıp birde SQL.text yerine sql.add kullanıp denermisin.

Kod: Tümünü seç

begin
SQL.Clear;
SQL.Add('SELECT KuruTermometre, IzafiNem FROM PsikrometrikDegerlerVT ORDER BY KuruTermometre ASC');
 OPEN;

end;[/quote]
ek olarak sıralama algoritmalarına bakabilirsin mesela quick Sort ,selection sort, shell sort algoritmaları işine yarayabilir. quick ve selection sort algoritmalarını incelemeni öneririm.
En son Lord_Ares tarafından 25 Haz 2015 01:20 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen izmirlikemal »

Ben problemi aşağıdaki şekilde çözdüm.
Ancak bu soruyla ilişkili olarak başka bir soruyu sormam gerekiyor. Bu konuda da yardımlarınız bekliyorum.
2. sorumu çözümümü yazdıkdan sonra soracağım.

ÇÖZÜM:
---------

procedure TForm1.Button1Click(Sender: TObject);
var
dizi:array of real;
i:Integer;
ArananKayit,KucukKayit,BuyukKayit:real;
BEGIN
SetLength(dizi,qry1.RecordCount);
i:=0;
qry1.First;
while not (qry1.Eof) do
begin
dizi:=StrTofloat(Qry1KuruTermometre.text);
Inc(i);
qry1.Next;
end;
ArananKayit:=strtofloat(edit1.text);
for i := 0 to Length(dizi) do
begin
if dizi[i-1]<ArananKayit then begin KucukKayit:=dizi[i-1];BuyukKayit:=dizi; end;
if dizi=ArananKayit then exit;
end;
Edit2.Text:=Floattostr(KucukKayit);
Edit3.Text:=Floattostr(BuyukKayit);
END;

-----------------------------------------
Yukarda çözümünü verdiğim problemde KuruTermometre sıcaklıkları birer birer (1,2,3,4,..45,46,47,...) şeklinde artıyor.
İkinci sorum şu:
-------------------
KuruTermometre sıcaklıkları onar onar(0,10,20,30,40,50,...,90,100) şeklinde arttığını düşünürsem o zaman yanıtı doğru vermiyor.
Bu konuda yardım edecek arkadaşlara teşekkür ederim.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen Lord_Ares »

artışlarda kullandığın inc(i) varya onun için şöyle birşey söyliyebilirim. İnc(i) derseniz i değişkeni varsayılan olarak birer birer artar. fakat inc(i,10) derseniz i nin değeri 10 ar 10 ar artar
izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak

Mesaj gönderen izmirlikemal »

Deneyeceğim dostum Lord_Ares. Sonra yanıtını yazarım.
Cevapla