Forum: Projeler trileri RSS
Cmp denemeleri
Page:  previous  1  2  3 
acehreli (Moderator) #31
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
In reply to post ID 1075
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);
}

Quote by 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.

™ @€¶€¶™™←¾{[]¾]}½[]½#¾ 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
canalpay (Moderator) #32
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 ?
acehreli (Moderator) #33
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
In reply to post ID 922
Quote by canalpay on 2009-09-21, 02:19:
c      99
d      100

Bizde  if ile ç'yi  kontrol edip değerini 99.5 yaparsak doğru sonuç verir. Değil mi ?

Can, bu fikrin gittikçe daha çok kafama yatmaya başladı. Bir şeyler yazdım. Sanırım aşağıdaki gibi bir şey düşünüyordun. Bu kodu tr/string.d'nin sonuna yapıştırabilirsin:

private static double[dchar] icmpAbc;
 
static this()
{
    icmpAbc['ç'] = 'c' + .5;
    icmpAbc['ğ'] = 'g' + .5;
    icmpAbc['ı'] = 'h' + .5;
    icmpAbc['ö'] = 'o' + .5;
    icmpAbc['ş'] = 's' + .5;
    icmpAbc['ü'] = 'u' + .5;
    icmpAbc['Ç'] = 'C' + .5;
    icmpAbc['Ğ'] = 'G' + .5;
    icmpAbc['İ'] = 'I' + .5;
    icmpAbc['Ö'] = 'O' + .5;
    icmpAbc['Ş'] = 'S' + .5;
    icmpAbc['Ü'] = 'U' + .5;
}
 
private double sıraNumarası_tr(in dstring dizgi, inout size_t indeks)
{
    return sıraNumarası_tr(cast(dchar[])dizgi, indeks);
}
 
private double sıraNumarası_tr(in dchar[] dizgi, inout size_t indeks)
{
    auto numara = (dizgi[indeks] in icmpAbc);
 
    if (numara) {
        ++indeks;
        return *numara;
 
    } else {
        return cast(double)(std.utf.decode(dizgi, indeks));
    }
}   
unittest
{
    void testDoğruSıra(dchar önceki, dchar sonraki)
    {
        dchar[] öncekiDizgi;
        öncekiDizgi ~= önceki;
 
        dchar[] sonrakiDizgi;
        sonrakiDizgi ~= sonraki;
 
        size_t i1;
        size_t i2;
 
        double sıra1 = sıraNumarası_tr(öncekiDizgi, i1);
        double sıra2 = sıraNumarası_tr(sonrakiDizgi, i2);
 
        debug dout.writefln(öncekiDizgi, ": ", sıra1, "  ",
                            sonrakiDizgi, ": ", sıra2);
 
        assert(sıra1 < sıra2);
    }
 
    testDoğruSıra('c', 'ç');
    testDoğruSıra('ç', 'd');
    testDoğruSıra('I', 'İ');
    testDoğruSıra('İ', 'J');
    testDoğruSıra('s', 'ş');
    testDoğruSıra('ş', 't');
}
 
int cmp_tr(dchar[] ilk, dchar[] son)
{
    size_t i1, i2;
 
    for (;;)
    {
        if (i1 == ilk.length) return i2 - son.length;
        if (i2 == son.length) return ilk.length - i1;
 
        invariant double sıra1 = sıraNumarası_tr(ilk, i1);
        invariant double sıra2 = sıraNumarası_tr(son, i2);
 
        if (sıra1 != sıra2) {
            return cast(int)sıra1 - cast(int)sıra2;
        }
    }
}
unittest
{
    assert(cmp_tr("aa"d.dup, "aaa"d.dup) < 0);
    assert(cmp_tr("aaa"d.dup, "aa"d.dup) > 0);
    assert(cmp_tr("deneme"d.dup, "debeme"d.dup) > 0);
    assert(cmp_tr("çalışkan"d.dup, "öğrenci"d.dup) < 0);
    assert(cmp_tr("TürkçeyeUygun"d.dup, "TürkçeyeUygun"d.dup) == 0);
}

Diğer bütün karakterleri kendi kodlarıyla karşılaştırabilmek için string.cmp'un da kullandığı std.utf.decode'u çağırabilmek için sıraNumarası_tr'ye indeks de geçirmek gerekti.

Projeyi yeniden canlandırmak adına buna bir bakmanızı istedim. double karşılaştırmasının int'lerden çok daha yavaş olacağını bilmeme rağmen... :)

Ali
canalpay (Moderator) #34
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Yeni cmp_tr de anlamadığım kodlar var. Burada onları sormak istiyorum:

1:
private static immutable double[dchar] icmpAbc;
Burada cmpAbc tanımlanıyor. Diyorki benim sınıfım dan başka kimse bunu ellemesin. Her yerde son değer geçerli olsun, dizgi değiştirilemesin... Buraya kadar herhalde tamam. private sınıfta kullanılmıyor mu ? Sınıf nerede ?
2:       
return *numara;
Ne için * karakteri var ? Neye yarıyor.
3:
0x0.8p0
Burda 2 üzeri sıfır ne için var ? Sonuçta 0x.8 de aynı işi görmüyor mu ?
4:
inout size_t indeks
ne demek ?

5: işlevin adına cmp_tr( Büyük--küçük ayrımlı) demişsiniz ama sanırım icmp_tr olması gerekmiyor mu ?

6: sıraNumarası_tr bu ad doğru mu? Çünkü bunun başında küçük büyük harf ayrımı yapmadığına dair bir belirtici konması gerekmez mi ?

tr/string.d ile ilgili;


1.dstringleri const dchar[] yapalım mı ?

2.Ben bunu birde cmpli haline getireyim mi ?
This post was edited on 2009-10-12, 13:58 by canalpay.
canalpay (Moderator) #35
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
işlevin adına cmp_tr( Büyük--küçük ayrımlı) demişsiniz ama sanırım icmp_tr olması gerekmiyor mu ?


Gerekmiyormuş ama icmAbc cmpAbc olması gerekiyormuş. Ben issues açıyorum, eğer yanlış anladıysam sileriz.
acehreli (Moderator) #36
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
private static immutable double[dchar] icmpAbc;

private: Sınıflarda da kullanılır ama D'de modül düzeyinde de kullanılabiliyor. Buradaki anlamı, "bu modüle özel". Böylece bu modülü "import edenler" göremiyorlar.

static: Program çalıştığı sürece yaşamaya devam edecek

immutable: Değişmeyecek

double[dchar]: dchar'dan double'a eşleyecek

return *numara;

in, bir gösterge döndürür. O gösterge NULL ise bulunamadı, NULL değilse bulundu demektir ve numara o bulunan şeyi "gösterir." Gösterilen şeye erişmek için * işleci kullanılır

0x0.8p0

Ben de baştan 0x.8 yazmıştım derlenememişti. Sonra D.ershane'deki sayfasına baktım (gerçekten! :)) ve onaltılı kesirli sayılarda p'nin şart olduğunu öğrendim :)

inout size_t indeks

inout: "burada yaptığımız değişiklikler işleve gönderileni değiştirecek" demek

size_t: ulong'un takma ismi; herhalde Phobos öyle yaptı diye ben de öyle yazmışımdır. İsmi "uzunluk türü" anlamına gelen "size type"tan gelir ve C'de de çoğunlukla 'unsigned long'dur.

sıraNumarası_tr bu ad doğru mu?

Herhalde büyük/küçük ayrımı yaptığını da belirtebilirmişiz.

icmp'un nasıl gerçekleştirileceğine de bağlı. Eğer dizgileri küçüklerine çevirdikten sonra cmp'u çağırırsak, sıraNumarası_tr yine uygun olur herhalde.

dstringleri const dchar[] yapalım mı

Evet.

Ben bunu birde cmpli haline getireyim mi ?

icmp_tr()'yi demek istiyorsun. Evet, teşekkür! :)

Ali
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  previous  1  2  3 
Forum: Projeler trileri RSS
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-02-05, 11:40:58 (UTC -08:00)