kaçıncı kelime

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

kaçıncı kelime

Mesaj gönderen sr1111 »

merhaba
bir kelimenin richeditte kacıncı kelime(harf karakter degil) oldugunu nasıl bulabilirim.

ornegin;
agaclar bu bahar elma vermedi gene; cumlesinde
elma kacinci kelime 4 olarak sonuc vermesi lazim.
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: kaçıncı kelime

Mesaj gönderen ikra »

Pos(elma)+1 komutu elma varsa 4, yoksa 0 döndürecektir.
kıdemsiz üye
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: kaçıncı kelime

Mesaj gönderen sr1111 »

döngüyü kuramadim yapamadim
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: kaçıncı kelime

Mesaj gönderen ikra »

Hangi döngüyü?
Döngü gecmiyor sorunun icinde.
kıdemsiz üye
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: kaçıncı kelime

Mesaj gönderen ertank »

ikra yazdı: 22 Şub 2020 05:25 Pos(elma)+1 komutu elma varsa 4, yoksa 0 döndürecektir.
Merhaba,

Belirttiğiniz kod eksik ve derlenemeyecek kadar hatalı. Doğru kullanımı şöyle olmalı;

Kod: Tümünü seç

var
  Deger: string;
  Konum: Integer;
begin
  Deger := 'agaclar bu bahar elma vermedi gene;';
  Konum := Pos('elma', Deger);
end;
Ancak, bu şekildeki kullanım "kelime" pozisyonunu değil "karakter" pozisyonunu verecektir. Sizin belirttiğiniz gibi dönen sonuç 4 değil 18 olacaktır. Dolayısıyla @sr1111 bu şekilde çözüme ulaşamayacaktır.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: kaçıncı kelime

Mesaj gönderen ertank »

sr1111 yazdı: 22 Şub 2020 05:21 merhaba
bir kelimenin richeditte kacıncı kelime(harf karakter degil) oldugunu nasıl bulabilirim.

ornegin;
agaclar bu bahar elma vermedi gene; cumlesinde
elma kacinci kelime 4 olarak sonuc vermesi lazim.
Merhaba,

Öncelikle RichEdit içindeki bilgileri metin olarak (formatsız) şekilde bir değişkene atayın. Ardından aşağıdaki gibi bir kod ile istediğinizi yapmanız mümkün olabilir.

Kod: Tümünü seç

const
  WordSeparatorChars: TArray<Char> = [' ', ',', '.'];

function GetWordPosition(const Word, Value: string; CaseInsensitive: Boolean = False): Integer;
var
  WordCount: Integer;
  I: Integer;
  I2: Integer;
  ControlChar: PChar;
  WordCharPosition: Integer;
begin
  if CaseInsensitive then
    WordCharPosition := Pos(Word.ToUpper(), Value.ToUpper())
  else
    WordCharPosition := Pos(Word, Value);

  if WordCharPosition = 0 then Exit(0);

  ControlChar := Pointer(Value);
  WordCount := 1;
  for I := 1 to WordCharPosition do
  begin
    for I2 := Low(WordSeparatorChars) to High(WordSeparatorChars) do
      if ControlChar^ = WordSeparatorChars[I2] then
        Inc(WordCount);
    Inc(ControlChar);
  end;
  
  Result := WordCount;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  Konum: Integer;
begin
  Konum := GetWordPosition(edtWord.Text, edtValue.Text, True);
  ShowMessage(Format('"%s" kelimesi "%s" cümlesi içinde %d. kelimedir', [edtWord.Text, edtValue.Text, Konum]));
end;
Kolaylık olması için ekte Delphi 10.3.3 ile çalışan komple projeyi bulabilirsiniz.

Kelime ayracı kısmını ("WordSeparatorChars" sabiti) kendinize göre ayarlamanız gerekebilir. Ben basit olması adına nokta, virgül ve boşluk işaretlerini kelime ayırıcı karakterler olacak şekilde tanımladım. Ayrıca ihtiyaç olabileceği için küçük/büyük karakter ayrımı yapmayan veya yapan şekilde çalışabilecek şekilde hazırlanmış bir örnek koddur.
Dosya ekleri
word_position.7z
(52.23 KiB) 105 kere indirildi
3ddark
Üye
Mesajlar: 89
Kayıt: 14 Eyl 2010 10:55
Konum: İstanbul

Re: kaçıncı kelime

Mesaj gönderen 3ddark »

En basit en doğru çözüm önce kelimeleri bölerek(boşluk virgül nokta) bir stringliste atın. Ardından kaçıncı kelimede olduğunu for ile birebir aratmalısınız pos yaparsanız aksi durumda pos ile "elmas" kelimesini de elma olarak veya "selma", "selmalar", "elmaslar" gibi kelimeleri de "elma" olarak alır.
PostgreSQL - Delphi - Linux :!:
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: kaçıncı kelime

Mesaj gönderen ertank »

3ddark yazdı: 23 Şub 2020 06:38 En basit en doğru çözüm önce kelimeleri bölerek(boşluk virgül nokta) bir stringliste atın. Ardından kaçıncı kelimede olduğunu for ile birebir aratmalısınız pos yaparsanız aksi durumda pos ile "elmas" kelimesini de elma olarak veya "selma", "selmalar", "elmaslar" gibi kelimeleri de "elma" olarak alır.
Alternatif olarak yine paylaşmış olduğum kod kullanarak aranan kelime başına bir boşluk eklenebilir

Kod: Tümünü seç

Konum := GetWordPosition(' ' + Trim(edtWord.Text), edtValue.Text, True);
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: kaçıncı kelime

Mesaj gönderen SimaWB »

3ddark yazdı: 23 Şub 2020 06:38 En basit en doğru çözüm önce kelimeleri bölerek(boşluk virgül nokta) bir stringliste atın. Ardından kaçıncı kelimede olduğunu for ile birebir aratmalısınız pos yaparsanız aksi durumda pos ile "elmas" kelimesini de elma olarak veya "selma", "selmalar", "elmaslar" gibi kelimeleri de "elma" olarak alır.
Bence de.
TStringList'in Delimiter özelliğini ' ' (bir boşluk) yapın, DelimitedText özelliğine de cümlenizi atayın. Kelimelere ayırmış olursunuz. Forumda bu konuda çokça örnek var:
There's no place like 127.0.0.1
Cevapla