Pos(Harf/Kelime, İçindeAranılanMetin)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
monet
Üye
Mesajlar: 68
Kayıt: 26 Şub 2004 02:12
Konum: İstanbul

Pos(Harf/Kelime, İçindeAranılanMetin)

Mesaj gönderen monet »

Selam..

bir yazi düsünün mesela...

"ANKARALI"

Burada ben mesela A harfinin son kullanildigi yerin pos'unu bulmak istiyorum.. veya 2. veya 3. veya 4. kez kullanildigi yerin position'ını bulmak istiyorum..

Pos('A','ANKARALI') dedigimde ilk 'A' yı buluyor.. ama ben diyeim ki son kullanıldıgı yeri.. veya 3. kez kullanıldıgı yeri bulmak istiyorum...

Nasıl yapabilirim?


Allah hepinizi korusun
MT
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Şu kod işini görebilir:

Kod: Tümünü seç

function BelirtilenPos(const aSubstr: string; aStr: string; aPosition: Integer): Integer;
//aPosition < 1 ise en sonuncuyu gösterir.
var
  I, L, P: Integer;
  aFindLast: Boolean;
begin
  Result := 0;
  L := Length(aSubstr);
  if (L = 0) or (L > Length(aStr)) then Exit;
  if aPosition < 1 then
  begin
    aFindLast := TRUE;
    aPosition := High(Integer);
  end
  else
    aFindLast := FALSE;
  for I := 1 to aPosition do
  begin
    P := Pos(aSubstr, aStr);
    if P < 1 then
    begin
      if not aFindLast then Result := 0;
      Exit;
    end;
    if I = 1 then
      Result := P
    else
      Result := Result + P + L - 1;
    System.Delete(aStr, 1, P + L - 1);
  end;
end;

  ShowMessage(IntToStr(BelirtilenPos('A', 'ANKARALI', 1)));
  ShowMessage(IntToStr(BelirtilenPos('A', 'ANKARALI', 2)));
  ShowMessage(IntToStr(BelirtilenPos('A', 'ANKARALI', 3)));
  ShowMessage(IntToStr(BelirtilenPos('A', 'ANKARALI', 4)));
  ShowMessage(IntToStr(BelirtilenPos('A', 'ANKARALI', 0)));
İyi çalışmalar.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Hazırı var.

StrUtils unitinde

Kod: Tümünü seç

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
coderlord yazdı:Hazırı var.

StrUtils unitinde

Kod: Tümünü seç

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
sizin verdiğiniz fonksiyon tam olarak arkadaşımızın işini görmüyor. Çünkü cardinal a değer vermeniz gerekir. Ve o değeri nerden bulacaksınız?
Yine bir pos kullanmanız lazım.

Kod: Tümünü seç

    showmessage(inttostr(PosEx('a','kadri yalcın ', 1)));
bana 2 değerini veriyor.

Kod: Tümünü seç

  showmessage(inttostr(PosEx('a','kadri yalcın ', 3)));
bana 8 değerini veriyor. Yani birinci a nın pozisyonundan yüksek bir rakam verdiğim zaman 2. nin pozisyonunu veriyor.
Veya ben örneği yanlış kuruyorum. Yanlışsa bize örnek verebilir misiniz?

Kolay gelsin.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

ofenX yazdı: sizin verdiğiniz fonksiyon tam olarak arkadaşımızın işini görmüyor. Çünkü cardinal a değer vermeniz gerekir. Ve o değeri nerden bulacaksınız?
Yine bir pos kullanmanız lazım.
Yukarıda diğer arkadaşın verdiği örnekte de değer vermeniz gerekiyor. Fark nedir anlayamadım?
ofenX yazdı:

Kod: Tümünü seç

    showmessage(inttostr(PosEx('a','kadri yalcın ', 1)));
bana 2 değerini veriyor.
Beklenen bu zaten. Evet...
ofenX yazdı:

Kod: Tümünü seç

  showmessage(inttostr(PosEx('a','kadri yalcın ', 3)));
bana 8 değerini veriyor. Yani birinci a nın pozisyonundan yüksek bir rakam verdiğim zaman 2. nin pozisyonunu veriyor.
Olması gereken de bu. Arkadaş sorusunda 2. veya 3. kullanıldığı yeri bulmak istiyorum demiş. Siz zaten örnekleri gayet güzel vermişsiniz.

Bunu nasıl kullanırsınıza gelirsek.

Kod: Tümünü seç

Index:= PosEx('a','kadri yalcın ');
Bununla ilk 'a' geçen yerin index'ini aldık. 2. 'a' geçen yeri bulmak için:

Kod: Tümünü seç

Index:= PosEx('a','kadri yalcın ', Index + 1);
Yapmamız gerekir. Bundan sonrakileri bulmak için de aynı kodu kullanabiliriz.
4. için, bir önce tespit edilen index'ten sonrakinden başlıyoruz gene.

Kod: Tümünü seç

Index:= PosEx('a','kadri yalcın ', Index + 1);
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Anladım.
Ben posx e verilen değere göre n'inci sırada olanın indexini verir diye anladım.

yani cardinal kısmına 'adana' için cardinal kısmına 3 yazdığımızda 5 değerini döndüreceğini zannettim. Öyle olsaydı çok daha güzel olurdu.

Ben yanlış anlamışım kusura bakmayın.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Bu istediğini yapmak da çok zor değil. Posex kullanan bir function yazmak yetecektir. ;)
monet
Üye
Mesajlar: 68
Kayıt: 26 Şub 2004 02:12
Konum: İstanbul

Mesaj gönderen monet »

Hakan Can arkadasimizin verdigi kod isimi gordu ilgilenen herkesecok tesekkür ederim...:)

biraz yüzsüzlük olucak ama birsey daha sormak istiyorum...

bir de bir kelimedeki belirtilen harf sayisini bulmayı nasil yapabilirim?

Örneğin TÜRKİYE kelimesindeki R sayısını bulmak istiyorum...

1 tane diyecek.. Aklimda bisey var ama daha kolay bi yolu varmi diye soruyorum .. .aklimdaki su..

var
sayi, i : integer;
s : ansistring;
begin
s := Edit1.text;
for i := 1 to length(s) do
if edit1.text = 'A' then sayi = sayi +1;
showmessage(inttostr(sayi));
end;

bunun disinda daha kolay bir yolu varmi?
MT
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Yok. Yapabileceğin en iyi şey bu şekilde harf saymak.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Kod: Tümünü seç

function NumberOfSubStringInString(const aSubString: string; aMainString: string): Integer;
var
  I, L: Integer;
begin
  Result := 0;
  L := Length(aSubString);
  if L = 0 then Exit;
  repeat
    I := Pos(aSubString, aMainString);
    if I = 0 then Exit;
    Inc(Result);
    System.Delete(aMainString, 1, I + L - 1);
  until 1 = 2;
end;
monet
Üye
Mesajlar: 68
Kayıt: 26 Şub 2004 02:12
Konum: İstanbul

Mesaj gönderen monet »

Hakan Can yazdı:

Kod: Tümünü seç

function NumberOfSubStringInString(const aSubString: string; aMainString: string): Integer;
var
  I, L: Integer;
begin
  Result := 0;
  L := Length(aSubString);
  if L = 0 then Exit;
  repeat
    I := Pos(aSubString, aMainString);
    if I = 0 then Exit;
    Inc(Result);
    System.Delete(aMainString, 1, I + L - 1);
  until 1 = 2;
end;
saolasin :D
MT
Cevapla