Forum: Ders Arası RSS
İf koşulunda karakter ?
ghetto #1
Üye Ock 2010 tarihinden beri · 11 mesaj · Konum: trabzon
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: İf koşulunda karakter ?
Yeni yeni başladığım için sorularım genelde basit olacaktır şu anda soracağım soru gibi. Basit şeylerle uğraştıracağım için şimdiden özür dilerim.

if koşulunda, eğer cevap 1 ise şunu şunu yap. Bunu anladım da cevap sayı değilde harf olması için ne yapacağım onu anlayamadım.
Örnek;

import std.stdio;
import std.cstream;
 
void main()
{
    
    write("Gezelim mi?");
    int gez;
    din.readf(&gez);
 
    if (gez==1)
        {
        writeln("Gir koluma");
    }
}

Cevap 1 olursa gir koluma çıktısı veriyor. Peki bu cevabı 1 değilde evet olarak girebilmemiz için ne yapmamız gerekiyor?
canalpay (Moderatör) #2
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ı
Bunu derslerde ilerleyince anlayacaksınız. Ama ben yinede sorunuzu yanıtlıyorum:
import std.stdio;
import std.cstream;
 
void main()
{
    
    write("Gezelim mi?");
    char[] gez; /* int bildiğiniz gibi sayı değişkenini belirtmek için kullanılıyordu. 
charda utf-8 karakteri kullanılacağını belirtiyor. */
    din.readf(&gez);
 
    if (gez=="evet".dup) //.dup koymamızın nedeni ilerideki derslerde öğretiliyor. 
        {
        writeln("Gir koluma");
    }
}

Kısaca ne yaptığımızı anlatayım :
Bildiğiniz gibi siz int türünde adında bir değişken belirttiniz ve int sayılar için kullanılıyor. Ama biz karakter kullanmak istiyoruz. O zaman sayı değil karakter türü olduğunu belirtmeliyiz. Bunuda int yerine char yazarak sağlıyoruz. 

Peki [] ne işe yarıyor ?

char ile tek bir karakter tanımlayabiliyoruz.(örnek 'a', yalnız tek tırnak ile tanımladığıma dikkat edin.) Ama biz birden fazla karakter tanımlamak istiyoruz. Örneğin "evet" (çift tırnağa dikkat edin.) karakter topluluğunu tanımlamak istiyoruz. Bu [] belirtimide birden fazla char(karakter) belirtileceğini yazıyor.

Peki bu .dup ne ?

Bunu şimdi anlamayabilirsiniz. Ben yine de size kısaca açıklayayım. "örnek" karakter topluluğu(dizgi) D için sabittir. Ve D'de tür güvenliği çok önemli olduğu için sabit değer değişkene(char[]) atanamaz. Bizde .dup belirtimi ile "örnek" dizgisinin kopyasını alıp bu dizgiyi değişkene çeviriyoruz. Ve daha sonra da gez değişkene bu değeri veriyoruz.

Bunları dersleri okumadan anlamayabilirsiniz. Bunun nedeni dersleri okumamanız yada benim anlatma becerim olmamasıdır. Ama derslerde ilerlerseniz eminim dediklerimi siz kendi başınıza anlayacaksınızdır.

(Buradan Ali Bey'e not : . Dizgiler dersini öne çekerseniz daha iyi olur. Çünkü insan sadece D'de sayıları kullanılcağını sanıyor. Eğer dizgiler konusunu öne çekmeyeceksenizde okuyacaklara karakter derslerin ileride olacağını belirtin ki insanlar sadece sayılar ile işlem yapılmadığını bilebilsinler. Birde derleme hatası yazan yerlerde derleyicinin verdiği hatayıda gösterinki İlerde yaptığım hataların anlamlarını çıkarabilelim ( Yada çıkarayım :-) ) )
ghetto #3
Üye Ock 2010 tarihinden beri · 11 mesaj · Konum: trabzon
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
canalpay üşenmeden uzun uzun anlattın örnekle gösterdin anlamamak mümkün değil. Bu konu kafama takıldı öğrenmeden atlamak istemedim. Şİmdi öğrendim çok teşekkür ederim. Aslında basit bir konu olduğu için forumda kirlilik yapmak istememiştim. Ama konuyu açtığım iyi oldu belki birgün birilerinin işine yarar. Saygılarımla.
canalpay (Moderatör) #4
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ı
Aslında basit bir konu olduğu için forumda kirlilik yapmak istememiştim.

Lütfen böyle düşünmeyin. Basit konular bence kirlilik yapmaz. Hatta forumu zenginleştirir burada dediğiniz gibi:
Ama konuyu açtığım iyi oldu belki birgün birilerinin işine yarar.

Ayrıca bende bir çok basit konu açmışımdır. Hatta tahminim Ali Bey bile açmıştır(Emin değilim :-D ).


Ama benim yazdığım her bir şeyi tam olarak doğru kabul etmeyin. Belki yanlışım olabilir. O zamanda Ali Bey zaten düzeltir.


Bu arada konu ile ilgili. Konuda anlatırken geçtiğim pek çok önemli nokta var. Bu yüzden dersleri okumadan biliyorum diye geçmemenizi tavsiye ederim. Ben kkendim biliyor sandığım halde pek çok konuyu unutuyor anımsamıyor olabiliyorum.

Bu arada basit dahi olsa amacına uygun doğru ve forumu zenginleştiren konular açmaya devam edin.

Ayrıca D'de ilerledikten(yani derslerde ilerledikten sonra) sonra ddili.org projelerinide katılmanızı beklerim :-)
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Soru sorulmuşsa değerlidir. Sorulara devam... :)

.dup'a gerek yok aslında:

    if (gez == "evet")

Not: Zaten gerek de olmamalı; çünkü tek yaptığımız karakter karşılaştırmak. Eğer eskiden gerekiyor idiyse, belki de dmd hataları yüzündendi. Öyleyse geçtiğine sevindim. :)

Ali
ghetto #6
Üye Ock 2010 tarihinden beri · 11 mesaj · Konum: trabzon
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
Ayrıca D'de ilerledikten(yani derslerde ilerledikten sonra) sonra ddili.org projelerinide katılmanızı beklerim :-)

Aslında işimle programcılık arasında alaka yok. Türkiyede 1500 den fazla mağazası olan bir şirkette mağaza müdürüyüm ve pek vaktim olmuyor bilgisayar başında.  Vaktim oldukça da programalama ile uğraşmaya çalışıyorum. Kısaca programcılığı öğrenmek benim için bir hobi. Dolayısı ile hızlı bir gelişme gösteremeyeceğim. Ama öğrendikçe projelere katkı yapabilirsem inanın çok sevinirim. Zaten o zaman hobi olurya :)
canalpay (Moderatör) #7
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 #5
Aslında işimle programcılık arasında alaka yok. Türkiyede 1500 den fazla mağazası olan bir şirkette mağaza müdürüyüm ve pek vaktim olmuyor bilgisayar başında.

Tebrik ederim. Ayrıca sanırım zaman hepimizin ortak sıkıntısı. Bende öğrenciyim.
Kısaca programcılığı öğrenmek benim için bir hobi. Dolayısı ile hızlı bir gelişme gösteremeyeceğim. Ama öğrendikçe projelere katkı yapabilirsem inanın çok sevinirim. Zaten o zaman hobi olurya :)

Benim içinde şuan hobi(Kim bilir belki ilerideki mesleğim :-) ). Ve bende çok bir şey bilmesemde bazen Ali Bey'e yardımcı olabiliyorum. Ve daha çok o da benim sorularımı cevaplıyor ve daha çok zaman kaybetmiş oluyor :-)

.dup'a gerek yok aslında:

    if (gez == "evet")


Not: Zaten gerek de olmamalı; çünkü tek yaptığımız karakter karşılaştırmak.

Tabi doğru ama .dup koymamın sebepleri var.
1. ifli değerler sağ ile solun türüne baktığı için ve ben string(immutable char[] //sabit char[]) ile char[]'ı aynı tür kabul etmediğimden koydum.

2. Anladım ki immutable belirtimi ile char[] ayrı bir tür olmuyor. Sadece değişimine izin vermiyor. Ama Şöyle bir şey denedim. char[] yerine immutable int denedim ve yine derlendi. Bu sizi doğruluyor. Ama çalıştırdığımda ve rakam girdiğimde ise şöyle bir hata aldım :
segmentation fault

Bunu garipsedim.(Belkide bu da beni doğruluyordur. :-) )
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
canalpay:
Dizgiler dersini öne çekerseniz daha iyi olur.

Diziler oldukça baş taraftalar aslında. Şimdilik şu sıradalar:

...
if
while
tamsayılar
kesirli sayılar
diziler
karakterler
dilimler
dizgiler
...

Dizileri daha önceye alamam çünkü onları göstermek için while neredeyse gerekli. :(

Belki dizgileri dilimlerden önceye alabilirim. Onların bir sıra bağımlılığı yok.

Çünkü insan sadece D'de sayıları kullanılcağını sanıyor.

Belki baş tarafa daha reklamlı bir şeyler eklenebilir. D ile şunları şunları yapabilirsiniz gibi.

Eğer dizgiler konusunu öne çekmeyeceksenizde okuyacaklara karakter derslerin ileride olacağını belirtin ki insanlar sadece sayılar ile işlem yapılmadığını bilebilsinler.

Belki if dersinde "merhaba" gibi dizgiler de kullanılabilir ve ileride ayrıntılı anlatılacağı söylenir...

Birde derleme hatası yazan yerlerde derleyicinin verdiği hatayıda gösterinki İlerde yaptığım hataların anlamlarını çıkarabilelim ( Yada çıkarayım :-) ) )

Teşekkürler; buna da bakacağım...

Ali
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
(ghetto, kusura bakma başka konulara kayıyoruz. :) Umarım en azından kulak dolgunluğu olur. Çünkü örneğin 'değer türü' ve 'referans türü' ayrımı D'de önemli.)

Can, evet, şu çöküyor:

    string gez;
    din.readf(&gez);

çünkü string değiştirilemez. (Boş olarak oluşturulmuş bir string'in hemen hemen hiç kullanımı olmadığını da anlıyoruz.)

Bir işlevin dönüş değeri olsa, gez'i ilklemek daha kullanışlı olabilir:

import std.stdio;
import std.cstream;
 
string yanıtAl(string soru)
{
    write(soru);
    char[] yanıt;
    din.readf(&yanıt);
    return yanıt.idup;
}
 
void main()
{
    string gez = yanıtAl("Gezelim mi?");
 
    if (gez == "evet")
    {
        writeln("Gir koluma");
    }
}

İşlevin sonundaki .idup gerekli tabii: değişebilenden değişemeyene dönüştürüyor.

İşin ilginci, şimdi o işlevi kullanarak boş bir string'i de değiştirebiliriz:

    string boş;
    boş = yanıtAl("hello");

Yani şimdi ikinci satırda readf değil, başka bir string ile atama yaptığımız için bu çalışıyor. Çünkü string bir 'referans türü' olduğu için, atama işlemi başka bir dizgiyi göstermesini sağlıyor ve o çökmeden çalışıyor.

Ali
ghetto #10
Üye Ock 2010 tarihinden beri · 11 mesaj · Konum: trabzon
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali Bey benim problemim çözüldü bundan sonra yazılan herşey bana artı katar.  Dediğiniz gibi kulak doldunluğu olur benimde işime yarar. Her türlü bilgiye açığım :)
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 #9
Anlatımınız için teşekkürler, her ne kadar ben oradan bahsetmediysemde :-)

Benim sorum sadece if'li satırlardaki parantez içleri ile ilgili idi.

Ama ikinizde sağ olun. Sayenizde karşılaştırma işleminde .dup kullanımının gereksiz olduğunu ve string ile ilgili bir kaç sorunumu cevaplamış ya da cevaplanmasına neden  oldunuz, ve bende bir kere daha konuyu baltaladım :-)
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Can, ben de zaten sana yanıt olarak yazmadım; daha çok sesli düşünüyorum. :)

Çünkü immutable'ın neyi değiştirmediği konusu benim de kafama tam oturmuş değildi.

Şimdi daha iyi anladım: erişim sağladığı şeyi değiştirmeye izin vermiyor. Başka şeylere erişim sağlamaya başlamasında bir sakınca yok. O da bir işlevin dönüş türü ile olabiliyor.

(Yine sesli düşünmeye başladım... :) )

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:
Forum: Ders Arası 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-11-21, 11:12:32 (UTC -08:00)