Jump to page: 1 24  
Page
Thread overview
September 20, 2009

Cmp'yi Türkçe destekli yazmak için denemeler yapacağım ama daha cmp'yi anlamış değilim. Dizginin küçük veya büyük olduğuna neye göre karar veriyor. ? eksi veya artı değerleri rastgele bir sayı mı veriyor ? Hiç bir şey anlamadım.
Mesela :
'aaa | aaa' = 0 Bu normal
'aa | aaa' =-1 Buda normal
'aaaaa | aaa' = 2 Bunuda anladım.
'za | aaa' = 1 Bu şimdi ne demek ?

Fonksiyonda bir sürpriz yaşayacaksınız demişti Ali Bey sürpriz bu mu ? Değilse bu cmd'nin çalışma mantığını birileri anlatabilir mi ?

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

September 20, 2009

Tabii hala zorluk devam ediyor değil mi ? Yani zorluk Alıntı (acehreli):

>

ASCII tabloda harfler alfabetik sıralarına uydukları için, iki harfin karşılaştırması tek bir çıkartma işlemi ile bulunabilir:

Bunu bulmak değil Türkçe karakterlerde doğru sonucu vermesini sağamak. Birde icmp'de düzeltilmesi gerekiyor anlaşılan. Çünkü sorun ı i değil Türkçe karakterler.

Ben açıkca hepsine bir değer veririm örn a=1 b=2 diye bulurum :-D Ama şuan gözüme zor gibi gözüktü :-) Açıkca bir fonksiyondan yararlanacağımı sanmıyorum. Kendim yazmam gerekecek gibi. Değil mi ?

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

September 21, 2009

Alıntı (acehreli):

>

Evet, hepsine bir "sıra değeri" vermek iyi fikir. Gelen karakterin sıra değerini de bir diziden bakabiliriz.

Evet enum ile bunu halledebiliriz sanırım. Ama aklıma başka bir çözüm yolu daha geldi. Ama sonuç double olacak. Şimdi ascii karakterlerinin numarasını buldum.
' c 99
d 100'
Bizde if ile ç'yi kontrol edip değerini 99.5 yaparsak doğru sonuç verir. Değil mi ?

Bu sanki bize fonksiyonu yeniden yazma gereksinimini ortadan kaldıracak gibi geliyor ama if kontrolü yapıp ç'ye 99.5 değeri verebilir miyiz bilmiyorum.

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

September 20, 2009

Sürpriz, cmp'un zorluğuydu. Başka sürpriz yok... :) Anlaştık zaten. Yani "inanamıyorum, cmp ötekilere göre ne kadar zormuş" deneceğini düşünmüştüm. Sürpriiiz! :)

cmp, C'nin strcmp'inin mantığıyla çalışıyor: karşılaştırılan iki şeyden

  • birincisi küçükse (veya sıralamada önceyse): eksi bir değer (örneğin -1)
  • eşitlerse (veya sıralamada aynı yerdeyseler): 0
  • birincisi büyükse (veya sıralamada sonraysa): artı bir değer (örneğin 1)

Karakterler ve dizgiler alfabetik olarak sıralama kurallarına göre karşılaştırılırlar. Verdiğin örneklerin hepsi yukarıda anlatığım kurallara uyuyor.

ASCII tabloda harfler alfabetik sıralarına uydukları için, iki harfin karşılaştırması tek bir çıkartma işlemi ile bulunabilir:

int karsilastir(char birinci, char ikinci)
{
   return birinci - ikinci;
}

Sonuç, alfabetik sıralamaya uyar. Dizgilerde de aynı mantık...

Ali

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

September 21, 2009

Enum ile a'dan z'ye ve A'dan Z'ye tanımladım. Ama c girilirse nasıl enumdan c'nin değerini aldırtcam.

if (değer=='c'){
cmpabc.c
}

gibi yapmayacağım herhalde. Yoksa enum bunu yapmak için uygun değil mi ?

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

September 21, 2009

Alıntı (acehreli):

>

Yaptığın arama doğru ve çalışır, ama herhalde yavaş olur. Çünkü o if zincirinde bütün karakterlerin bulunmaları gerekir, değil mi?) Her karakter için, karakterin zincirde bulunduğu yere bağlı olarak değişen sayıda karşılaştırma yapmamız gerekir. Buna doğrusal arama (linear search) denir.

Tamamen farkındayım. Hatta bu yüzden sordum.

Alıntı (acehreli):

>

Ama eğer bir dizi oluşturursak, sıralama değerini yıldırım hızıyla :) elde ederiz.

Bu tam anlayamadım sanırım. şöylemi yapacağız.

int[string] deneme;
deneme['a']=1;
deneme['b']=2;

Gibi mi ?(Burada en az 58 karakter( İngiizce harfleri saymıyorum) var. Tek tek mi tanımlayacağız daha kolay bir yolu var değil mi ?
Sonrada

deneme[değer];

gibi mi yapacağım

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

September 20, 2009

Evet, hepsine bir "sıra değeri" vermek iyi fikir. Gelen karakterin sıra değerini de bir diziden bakabiliriz.

Şimdilik yine karakter karşılaştıran bir fonksiyon üzerinde duralım. Daha sonra dizgiye geçince bunu kullanırız:

int karşılaştır(dchar birinci, dchar ikinci)
{
   // ...
}

Ali

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

September 21, 2009

Alıntı (acehreli):

>

Ama konu tabii ki bu kadar kolay değil. Örneğin â bu dizide nerede duracak? Ha ha! :) Eğer â harfine a'dan daha sonra bir sıra numarası versek, "hala" ile "hâlâ"nın sıralamasında bir rahatsızlık olmaz, ama bu sefer de "hâl" "hat"tan daha sonra sıralanacağı için yanlış olur.

Tdk â kullanımını kaldırdı. Zaten çok fazla kullanımı yoktu. Hele bilgisayar ortamında kullanımını tamamen kaybetti gibi.
Bu yüzden bu büyük bir sorun değil. Bence şu anlık Türk alfabesindeki 29 harfe göre sıralama yapsak yeter. Kütüphanemiz Türkçe harfler ile ilgili. Ne arap ne ingiliz harfleri ile alakası olmak zorunda değil. En azından şimdilik. Zaten eğer başka bir şey olursa hemen harfin sıralama dizisinde değiştiririz. Ben bir sözlük açıp sıralamaları nasıl yapıyor bakayım :-) çünkü 'aaa' kelimesi 'aa ' kelimesinden önce gelemez. Ama cmp'de geliyordu sanırım. Yanlış mı hatırlıyorum bilmiyorum.

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

September 21, 2009

Bunları düzeltmemiz gerekiyor.
'Harf Kod # Harf Kod #
ç 231 Ç 199
ğ 287 Ğ 286
ı 305 İ 304
ö 246 Ö 214
ş 351 Ş 350
ü 252 Ü 220'

Sanırım birde bunlar.
' â 226 Â 194
î 238 Î 206
û 251 Û 219'
Alıntı:

>

Washington
Bunda W kullanılmasının nedeni gerçeğinde W olması. Biliyorsunuz özel adlar değiştirilemez. :-)
Alıntı (acehreli):

Örneğin Türkçe'de î, û harfleri de bulunur ama alfabede böyle harfler yok...

Bu harfler Türkçede bulunmaz. Bir dil bilimci Türk alfabesince tek eksik genizli n mi ne o demişti. O da istanbul ağzında bulunmadığı için ve bizde İstanbul ağzını kullandığımız için bence tam olarak eksik sayılmaz.

Evet şapkalı a kaldırıldı ama sonra yine getilirmiş. Ama bir kurala bağlı olarak getirilmiş. hala ve hâlâ arasında farkı belirtmek için. Yoksa diyarı diyâr diye yazarsak biz hatalı duruma düşermişiz.

Alıntı (acehreli):

>

Sorun şurada: Türk alfabesi, Türkçe yazmaya yeterli değil

Aslında Türk alfabesi Arapça gibi dillerdeki sözcükleri yazmak için yeterli değil. Buda Türk alfabesinin sorunu değil. ;-)

Ben elime ansiklopedi(genbetik veya bilgilik) alacağım ve ona göre sıralacağız.

Alıntı (acehreli):

>

Eğer â harfine a'dan daha sonra bir sıra numarası versek, "hala" ile "hâlâ"nın sıralamasında bir rahatsızlık olmaz, ama bu sefer de "hâl" "hat"tan daha sonra sıralanacağı için yanlış olur.

Açıkca bunda ne gibi bir sorun var anlamadım.

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

September 21, 2009

Güzel düşünce... :)

Ama 'ç'nin değeri bir değerdir zaten. Bir dizgi içinde geçtiğinde, veya 'ç' olarak (çift tırnak değil) yazıldığında, zaten bir tamsayı değeri vardır.

Değeri değiştiremeyeceğimiz için olmaz. Örneğin

'ç' = 99.5; // çalışmaz

çünkü 231=99.5 gibi anlamsız bir ifadedir. 'ç'nin değerinin 231 olduğunu şöyle öğrendim:

   writeln(cast(int)'ç');

Burada elimizde bulunan 231 değerini 99.5 gibi başka bir değere, örneğin bir tablodan bakarak dönüştürmek gerekir.

Başka bir nokta, kesirli sayı karşılaştırmaları hem tamsayılardan çok daha yavaştır, hem de eşitlik karşılaştırmaları güvensizdir. (Kesirli sayılar dersinde örnekleri vardı.)

O yüzden, sıra numalarının herhalde ASCII'ye sadık kalmadan yapmak zorunda kalacağız. Tamamen uydurarak:

c 114
ç 115
d 116

Eğer karakter değerini bir diziyi indekslemek için kullanırsak olabilir:

return sıralamaDizisi[birinciKarakterDeğeri] - sıralamaDizisi[ikinciKarakterDeğeri];

Ali

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

« First   ‹ Prev
1 2 3 4