Forum: Projeler trileri RSS
Cmp denemeleri
Sayfa:  önceki  1  2  3 
acehreli (Moderatör) #31
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4513 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj 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);
}

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 (Moderatör) #32
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #33
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4513 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 922
canalpay on 2009-09-21, 01: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 (Moderatör) #34
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 ?
Bu mesaj canalpay tarafından değiştirildi; zaman: 2009-10-12, 12:58.
canalpay (Moderatör) #35
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #36
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4513 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2  3 
Forum: Projeler trileri RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-10-22, 01:16:34 (UTC -07:00)