Forum: D Programlama Dili RSS
bool değeri "false" veya "true" olarak okumak
acehreli (Moderatör) #1
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ı
Konu adı: bool değeri "false" veya "true" olarak okumak
bool değeri çıkışa gönderince "false" veya "true" yazdırılıyor ama girişten okurken o dizgiler kabul edilmiyorlar. Doğal olarak şunun çalışmasını beklerdim:

    bool b;
    din.readf(&b);

"false" veya "true" girince maalesef program göçüyor. Hiç anlamadım neden böyle yaptıklarını. (?)

Sonuçta basit bir dönüşüm programı yazdım ama bu işin de readf tarafından halledilmesini beklerdim. Belki daha kolay yolu da vardır...

Çünkü C++'da hem giriş hem de çıkış için "false" ve "true" kullanılabilir. boolalpha kullanmak yeter:

#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    cin >> boolalpha;
    cout << boolalpha;
 
    bool b = false;
    cin >> b;
    cout << b << endl;
}

Ali
Avatar
esatarslan52 (Moderatör) #2
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Girişi 1 veya 0 olarak denedim yine hata verdi. Digitalmars'ın sitesinde readf kullanımını aşağıdaki gibi örneklemiş.
 int x;
 double y;
 string s;
 file.readf(&x, " hello ", &y, &s);
 file.readf("%d hello %f %s", &x, &y, &s);
 file.readf("%d hello %f", &x, &y, "%s", &s);

 file.readf("%d hello %f %s", &x, &y, &s);
 file.readf("%d hello %f", &x, &y, "%s", &s);
Kısımlarında C de scanf() kullanımında olduğu gibi %d,%s ve %f kullanılmış. Bool veri tipini okutmak içinde atıyorum "%b" gibi özel bir tanımlamaya ihtiyaç duyulabilirmi?Ben aradım ama bulamadım :(. (Bu arada %b yi denedim program yine çöktü :D)
acehreli (Moderatör) #3
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ı
Çünkü %b binary anlamına geliyormuş. Aynılarını ben de denemiştim ve DigitalMars'ta sormuştum. Bakalım hiç yanıt gelmiş mi... Hayır, henüz bir yanıt yok. Onların yanıtlarını merak edenler için soru şurada:

http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

Bu konunun önemi, şu anda derslerin "Mantıksal İfadeler" sayfasını yazıyorum ve öğrencinin girişten "false" ve "true" girebilmesini istedim. Çünkü daha 0 ve 1 değer dönüşümlerini anlatmadım. Ayrıca öğrenciye "int olarak tanımla" demek de istemedim ve zaten çok saçma. Bence bunu readf'in yapması gerek.

Başka bir takıntı: güya henüz görmedikleri bir şeylere girmeyecektim. Yine de bu kuralı bozdum ve denemek için kullanacakları programa şöyle bir fonksiyon yerleştirmek zorunda kaldım:

bool girişten_bool_oku(string mesaj)
{
    // Mesajı yazdır
    dout.writef(mesaj);
 
    // Girilen kelimeyi bir dizgiye oku
    char[] giriş;
    din.readf(&giriş);
 
    /*
      Şimdi girilen dizgi "true" ise true değerini, "false"
      ise false değerini döndürmek istiyoruz. Yani burada bir
      dönüşüm yapıyoruz: örneğin "true" dizgisini görünce true
      değerini döndürüyoruz.
 
      Not: "true" dizgisi ile true değerinin aynı şey
           olmadıklarına dikkat edin: Birisi 't', 'r' gibi
           karakterlerden oluşur, diğeri ise bir bool
           değeridir.
    */
 
    // Sonuç olarak döndüreceğimiz değişken bu
    bool dönüştürülen_değer;
 
    // "false"->false ve "true"->true dönüşümü
    if (giriş == "false") {
        dönüştürülen_değer = false;
 
    } else if (giriş == "true") {
        dönüştürülen_değer = true;
 
    } else {
        /*
          Bilmediğimiz bir kelime geldi. Bu durumda ne
          yapacağımız belli olmadığı için işlemden vazgeçip
          hata atmaktan başka hiçbir çaremiz yok.
        */
        throw new Exception(
            cast(string)("Bu kelimeyi anlamadım: " ~ giriş));
    }
 
    return dönüştürülen_değer;
}

main içinde şöyle kullanılıyor:

bool yağmur_var = girişten_bool_oku("Yağmur yağıyor mu? ");

Ali
Avatar
esatarslan52 (Moderatör) #4
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Digitalmars'dan hala bi cevap yok :(
Bu arada dersi inceledim tekrardan ellerinize sağlık :). Yalnız Girişten bool Okumak kısmında örnek henüz yok. Digitalmars'dan cevap geldikten sonra mı koymayı düşünüyosunuz.

Ve bir öneri;
Acaba sözlükte olan kelimelerin, konu anlatımında geçtiği yerde kelimenin sözlükte açıklaması olduğunu belirtmek için altı çizgili (Renkli,kalın vs..) şekilde yazılsa nasıl olur  :rolleyes: .
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ı
Öneriler için teşekkürler.

Girişten bool okuma konusu beni biraz rahatsız ediyor çünkü o noktada daha girişten dizgi bile okumamışız. :) Eğer problemlerde kullandığım fonksiyona gerek kalmazsa, o bölümü o noktadan kaldırırım bile.

Ben onu yalnızca problemlerde kullanıldığı için söylemek zorunda kaldığımı hissettim. Yani o henüz anlatılan bir şey değil.

Sözcüklerin altını çizmek de ilginç bir fikir. Hatta fare üstüne gelince kısa anlamı hemen görünebilir ama başka sitelerde karşılaştığımda ben ona sinir oluyorum. :D

Sözcüklerin altını çizme konusunda teknik bir güçlük olabilir: benim elle her geçtiği yeri işaretlemem gerekir (otomatikleştirilebilir de belki). Olmayacak şey değil tabii, ama şimdiki yöntem, bütün sayfaya tek bir işaret koymak kadar kolay.

Ali
acehreli (Moderatör) #6
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ı
Bu konuyu D'nin hata veri tabanına girdim:

  http://d.puremagic.com/issues/show_bug.cgi?id=3223

Ayrıca Phobos kodlarına şöyle bir baktım, hiçbir yerde "false" ve "true"dan bool dönüşümü görünmüyor.

dmd/src/phobos/std/stream.d dosyasında vreadf diye bir fonksiyon var. Maalesef onun içinde bool görünmüyor. Neyse... Zaten o kadar önemli bir konu değil. int olarak 0 ve 1 girilebiliyor zaten.

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:
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-18, 09:27:42 (UTC -08:00)