September 27, 2009

Orada gereken, bir dönüşüm. Yani 'a' diye çağırınca onun cmpAbc'ye dönüşmesini ve cmp_tr'nin cmpAbc türleriyle çağrılmasını istiyorsun.

Bu dönüşüm için sonunda trchar diye bir tür tanımlamak zorunda kalabiliriz; ve char, wchar, ve dchar'dan otomatik olarak trchar türetebiliriz.

Ama algoritmalarla ilgilendiğimi şu sırada dönüşümü cmp_tr'nin içinde elle de yapabiliriz. Bunun için cmp_tr'nin dchar alması yeter. Ama öncelikle SıralamaKodu'na çıkartma işleci olan opSub'ı da eklemek gerek:

class SıralamaKodu
{
// ...
   // Bu alışılmışın dışında bir çıkartma işleci oldu; çünkü,
   // nasıl iki int'in farkı da int ise, bu çıkartmanın
   // sonucunun da bir SıralamaKodu türünden olması beklenirdi.
   const int opSub(in SıralamaKodu diğeri)
   {
       int fark = asciiKod_ - diğeri.asciiKod_;

       if (!fark) {
           fark = ikincilKod_ - diğeri.ikincilKod_;
       }

       return fark;
   }
// ...
}

// ...

int cmp_tr(dchar birinci, dchar ikinci)
{
   return sıralamaKodu(birinci) - sıralamaKodu(ikinci);
}

void main()
{
   dout.writefln(cmp_tr('c', 'ç'));
   dout.writefln(cmp_tr('ç', 'd'));

   dout.writefln(cmp_tr('ç', 'c'));
   dout.writefln(cmp_tr('d', 'ç'));
}

Ben yukarıdaki koddaki SıralamaKodu kavramını kullandım ama sen şöyle de yapabilirsin (derlemedim):

cmpAbc cmpAbcDönüştür(dchar harf)
{
   return cast(cmpAbc)(harf - 'a');
}

int cmp_tr(cmpAbc birinci, cmpAbc ikinci)
{
   return cmpAbcDönüştür(birinci) - cmpAbcDönüştür(ikinci);
}

Alıntı (canalpay):

>

cmp hangi kodlar için çalışıyor. Sadece ascii kodları yani 255 tanesi için çalışmıyor mu ?

Uzunluğu eşit olan dizgilerde bellek baytlarının değerlerini karşılaştıran 'std.c.string.memcmp''i çağırıyorlar.

Uzunlukları aynı olmayan dizgilerde de 'std.utf.decode' ile elde ettikleri değerleri.

Yani ASCII dışındaki harfler de karşılaştırılıyorlar ama bu kütüphanenin doğru sıralama derdi yok. Unicode'un verdiği değerlerle sıralanıyorlar.

Alıntı:

>

™ @€¶€¶™™←¾{[]¾]}½[]½#¾ gibi bir karakter topluluğunu adam varsın a ile û ile â ile ç ile karşılaştırmasın.

Programcı iki dizgiyi sıralamak için bize verecek. Dizgilerde de o harflerden var... Sonuçta '{' ile 'ç'yi karşılaştırmak durumunda kalacağız. Bunların her birisine tutarlı bir değer vermemiz gerek. Yoksa liste karman çorman sıralanır. Yani örneğin alfabemiz dışındaki karakterlerin hepsine birden örneğin -1 diyemeyiz. Kendi aralarında da tutarlı olarak sıralanmaları önemli.

ve, veya, ve ya da hatırlatması için teşekkürler. ;)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 28, 2009

Verdiğiniz ilk kod hata verdi( Büyük ihtimalle ne yaptığını anlamadığım için verdi ? ). İkinci verdiğiniz kod ile de bu işi beceremedim. Sanırım bu işi enum ile yapmak zor. Ben enum ile yapıp eğer biri kendine göre cmp_tr kodlarını değiştirmek isterse kolay bir şekilde yapsın diye istedim. dchar[string]hh; kullanımı da 255 den çok daha fazla karakteri kodlamak için çok zor.

Bu halde elimizde sadece Türk abc(alfabe)'sinde çalışan kod kaldı. Birde sizin istediğiniz gibi de yapabiliriz ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

1 2 3
Next ›   Last »