Forum: Projeler trileri RSS
Cmp denemeleri
Sayfa:  1  2  3  sonraki 
canalpay (Moderatör) #1
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ı
Konu adı: Cmp denemeleri
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 ?
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
canalpay (Moderatör) #3
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ı
Tabii hala zorluk devam ediyor değil mi ? Yani zorluk
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 ?
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
canalpay (Moderatör) #5
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ı
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.
canalpay (Moderatör) #6
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ı
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 ?
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
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
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

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

Ali
canalpay (Moderatör) #9
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ı
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.

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 mesaj canalpay tarafından değiştirildi; zaman: 2009-09-21, 02:36.
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet, hepsi doğru. :)

Diziyi elle oluşturmak yerine, modül düzeyinde şöyle bir diziden otomatik olarak oluşturabiliriz. Yalnızca beş harf için:

    auto sıralama = "abcçd";

Şimdi bu diziyi baştan sona yürüyerek sıra numaralarını başka bir diziye yerleştirebiliriz. Sonuçta sıra numarası dizimizde şunlar olur:

    int[] sıraNumaraları dizisi şu şekilde oluşturulabilir:
    sıraNumaraları['a'] değeri 0
    sıraNumaraları['b'] değeri 1
    sıraNumaraları['c'] değeri 2
    sıraNumaraları['ç'] değeri 3
    sıraNumaraları['d'] değeri 4

Not: İlginç bir hikaye olarak, ben bu çözümü ta 1989 yılında Digital Research firmasının programlarını Türkçeleştirirken de önermiştim. Onların bir programcısının yanında ve hayatımda ilk defa olarak gerçek koda bakarken. :)

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.

Burada doğru çözümü hâlâ bulamadık. ;)

Ben bu konuyu gerçekten daha derinlemesine düşünmedim ve başkalarının da fikirlerini de çok merak ediyorum.

Ali
canalpay (Moderatör) #11
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ı
Yanıtlanan mesaj ID 935
acehreli:
    auto sıralama = "abcçd";


Şimdi bu diziyi baştan sona yürüyerek sıra numaralarını başka bir diziye yerleştirebiliriz. Sonuçta sıra numarası dizimizde şunlar olur:

    int[] sıraNumaraları dizisi şu şekilde oluşturulabilir:
    sıraNumaraları['a'] değeri 0
    sıraNumaraları['b'] değeri 1
    sıraNumaraları['c'] değeri 2
    sıraNumaraları['ç'] değeri 3
    sıraNumaraları['d'] değeri 4

Nasıl a'ya 1 verdikten sonra b'ye derleyicinin iki vermesini sağlarız diye sormuştum. Bu dediklerinizden hiç bir şey anlamadım. Sonra "Nasıl a'ya 1 verdikten sonra b'ye derleyicinin iki vermesini sağlarız"' sorusuna değil  "şöylemi yapacağız" sorusuna cevap verdiğinizi anladım. Ayrıca tekrar soruyorum. Nasıl a'ya 1 verdikten sonra b'ye derleyicinin iki vermesini sağlarız ? Bunu enum ile yapamayacaksak başka yolu olmalı. D bize teker teker değer vermemizi istemez. birde
int[] sıraNumaraları
bunu yanlış yazdınız değil mi ? Doğrusu bu olacak sanırım.
int[dchar] sıraNumaraları
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
int[dchar], bir eşleme tablosu (assosiaced array) olurdu... O da olur. Ama ben şöyle bir şey düşünmüştüm; ve sanırım seninki daha kolay ve daha temiz:

import std.stdio;
 
void main()
{
    auto sıralama = "abcçd"d;
    int[] sıraNumaraları;
 
    foreach (i, harf; sıralama) {
 
        // Yeterince yer olduğunu garantilemek için; ama bunun
        // yavaş bir işlem olabileceğini biliyoruz (eğer
        // uzunluğu baştan biliyorsak, her seferinde büyütmek
        // yerine baştan da büyütebiliriz)
        if (harf >= sıraNumaraları.length) {
            sıraNumaraları.length = harf + 1;
        }
 
        sıraNumaraları[harf] = i;
    }
 
    void dene(dchar harf)
    {
        writeln(harf, ": ", sıraNumaraları[harf]);
    }
 
    dene('c');
    dene('ç');
}

Ali
canalpay (Moderatör) #13
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ı
Evet benimki bence de daha iyi :-D

Şaka bir yana a ile â'ya aynı değeri verebilir miyiz bunda ? Bana veremeyiz gibi geldi. Ben a ile â'ya aynı numarayı verip if ile ikisinin değeri aynı ise a'nın â'dan önce yazılması gerektiğini söyleyen çıktıyı verdirtecektim. Siz bunda a ile â'yı halletmek için ne yapacaksınız ?
Hem birde benim yöntemimle yaparsak değişkeni başka bir metinde tanımlayıp import ederek kullanabiliriz değil mi? Eğer karakter ekleyip sayıyı değiştirmek istersek oradan değiştiririz.

Ama size söyleyeyim sizin bu şekilde düşünme zekanıza hayranım. Ama ilk önce basiti düşünmek gerekir. Eğer çıkış yolu uzunsa zora yönelinir. Ve benim ki uzun gibi :-)

Bu arada
acehreli:
int[dchar], bir eşleme tablosu (assosiaced array) olurdu... O da olur. Ama ben şöyle bir şey düşünmüştüm; ve sanırım seninki daha kolay ve daha temiz:
Bizde eşleyeceğimize göre aslında yine en iyisi isime bakarsak benim önerdiğim :-)

Birde benim önerdiğim yöntemde kısaca  a'ya b'ye.. nasıl otomatik  sayı veririz. Örneğin
enum sıralama{
a=1, â=1,b, c, ç,d,
}
gibi.
acehreli (Moderatör) #14
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4391 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
D'nin eşleme tablolarının arka planda nasıl gerçekleştirildiklerinden emin değildim: C++'nın std::map'i gibi ağaç olsa daha yavaş olurdu (O(logN)), ama hızlı eşleme tablosu (hash table: O(1)) imiş. Güzel... :)

Sıralama için kullanacağımız tablo, modüle ait olacak. Sanırım modül için statik kurma diye bir kavram var; şimdilik önemli değil...

a ve â'nın aynı kodlu olmaları doğru, ama bir de şapkalı gibi bir belirteci olmalı. Ona daha sonra bakmalıyız. Bu yüzden, sıralama için bir int[dchar] değil, SıralamaBilgisi[dchar] gibi bir tablo oluşturabiliriz:

// Tabii ki ismi değişik olabilir
struct SıralamaBilgisi
{
    int sıra;
    bool şapkalı;
}

Evet, sonra daha hızlandıracak yollar bulacağız...

enum'u da doğru kullanıyorsun.

Ali
Bu mesaj acehreli tarafından değiştirildi; zaman: 2009-09-21, 17:04.
canalpay (Moderatör) #15
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ı
Şimdi ilkel halini hazırladım.
İlkel hali : http://www.ozgurlukicin.com/yapistir/242/
icmp de tekrar yazılması gerekiyor. Onun içinde tolower fonksiyonu ile küçültür yine cmp'den geçiririz. :-) Sonra cmp'yi hızlandırırız .

Şuan foreach döngüsü kurup teker teker baktıracağım herhalde. Eğer iki taraf aynı olmazsa foreachden çıkartıp sonucu yazacağım.
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:  1  2  3  sonraki 
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-04-24, 00:27:09 (UTC -07:00)