Jump to page: 1 25  
Page
Thread overview
Müzik Yapalım
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
mert
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 17, 2012
mert
Oct 17, 2012
Salih Dinçer
Oct 18, 2012
mert
Oct 18, 2012
Salih Dinçer
Oct 18, 2012
mert
Oct 18, 2012
Salih Dinçer
Oct 18, 2012
mert
Oct 18, 2012
Salih Dinçer
Apr 07, 2013
Salih Dinçer
Oct 17, 2012
mert
October 17, 2012

Şu şekilde notalarımız olsun:

 enum Notalar { Do = 1, Re, Mi, Fa, Sol, La, Si }

Onları şu şekilde okunduğu sırada ekrana yazabiliriz:

 foreach(nota; 1..8) {
   writef("%s\t", cast(Notalar)nota);
 }

Öyleyse bununla çok şey yapabiliriz. Örneğin klavyeden aralarında boşluklar olacak şekilde notaları istetiriz ve bunu bir dosyaya kaydedebiliriz. Bunlar D'de ekrana yazmak kadar kolay. Ancak zor olan şeyler de var! Örneğin "do re mi" dediğimizde yine yukarıdaki gibi ama bu sefer tersi şekilde "[ 1, 2, 3 ]" çıktısını almak. Ben bunu beceremedim. Ama gelin isterseniz nereye kadar gidebileceğimizi birlikte kodu geliştirerek görelim.

Bunun için aynı işi yapan iki kod vereceğim. Birisi başlangıç için temel olsun diye. Diğeri ise Mert ağabey için; işlevlerden oluşan bu temeli nasıl yapıya dönüştürdüğümüz birlikte şahit olmak için...

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

October 17, 2012
 import std.array, std.stdio, std.conv;

 enum Notalar { Do = 1, Re, Mi, Fa, Sol, La, Si }

 string notayıKodla(string nota) {
   switch(nota) {
     case "do" : return "1";
     case "re" : return "2";
     case "mi" : return "3";
     case "fa" : return "4";
     case "sol": return "5";
     case "la" : return "6";
     case "si" : return "7";
     default   : return "0";
   }
 }

 void dosyayaYaz(string dosya_ismi, string notalar) {
   File dosya;
   dosya.open(dosya_ismi ~ ".dat", "w");
   dosya.write(notalar);
   dosya.close();
 }

 int[] dosyadanOku(string dosya_ismi) {
   File dosya;
   dosya.open(dosya_ismi ~ ".dat", "r");
   scope(exit) dosya.close();

   int[] sonuç;
   foreach(sayı; dosya.readln()) {
     sonuç ~= to!int(sayı) - 48;
   }
   return sonuç;
 }

void main() {
 // Notaları klavyeden oku
 string müzik_notası;
 readf(" %s\n", &müzik_notası);

 // Notaları sıkıştır (kodla)
 string müzik_verisi;
 foreach(nota; split(müzik_notası)) müzik_verisi ~= notayıKodla(nota);

 // Notaları dosyaya yaz
 string kayıt_dosyası = "ses";
 dosyayaYaz(kayıt_dosyası, müzik_verisi);

 // Notaları dosyadan oku ve biçimli şekilde ekrana yaz
 int[] veri_dosyası = dosyadanOku(kayıt_dosyası);
 foreach(nota; veri_dosyası) {
   writef("%s\t", cast(Notalar)nota);
 }
}

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

October 17, 2012
 import std.array, std.stdio, std.conv;

 enum Notalar { Do = 1, Re, Mi, Fa, Sol, La, Si }

 struct MüzikKutusu {
   int[] kodlar;
   string dosya;
   File veriler;

   this(string dosya_ismi) {
     dosya = dosya_ismi ~ ".dat";
   }

   private string kodla(string notalar) {
     string sonuç;

     foreach(nota; split(notalar)) {
       switch(nota) {
         case "do" : sonuç ~= "1"; break;
         case "re" : sonuç ~= "2"; break;
         case "mi" : sonuç ~= "3"; break;
         case "fa" : sonuç ~= "4"; break;
         case "sol": sonuç ~= "5"; break;
         case "la" : sonuç ~= "6"; break;
         case "si" : sonuç ~= "7"; break;
         default   : sonuç ~= "0";
       }
     }
     return sonuç;
   }

   public void kaydet(string notalar) @property {
     veriler.open(dosya, "w");
     veriler.write(kodla(notalar));
     veriler.close();
   }

   public void oku() @property {
     veriler.open(dosya, "r");

     foreach(sayı; veriler.readln()) {
       kodlar ~= to!int(sayı) - 48;
     }
     veriler.close();
   }

   public string toString() @property {
     auto sonuç = appender!string();

     foreach(nota; kodlar) {
       std.format.formattedWrite(sonuç, "%s\t", cast(Notalar)nota);
     }
     return sonuç.data;
   }
}

void main() {
 auto müzik = MüzikKutusu("ses");

 // Notaları klavyeden oku
 string müzik_notası;
 readf(" %s\n", &müzik_notası);

 // Notaları dosyaya kodlayarak yaz
 müzik.kaydet(müzik_notası);

 // Notaları dosyadan oku
 müzik.oku();

 // Biçimli şekilde ekrana yaz
 müzik.writeln();
}

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

October 17, 2012

Fark ettiniz mi; iki örnek hemen hemen aynı biçimde yazılmış ve benzer kodlama kullanılmış ama ikincisinde 'main()' içindeki yük alınarak yapı içine taşınmış. İlginçtir satır sayısı ve dosya boyutu hafiflememiş, artmıştır...:)

Ancak birden fazla File nesnesine ve notaların yazıldığı dizilere ihtiyaç duyulmamış. Sadece kodlar isminde tek bir dizi yeterli görünmüştür. Sizce hangi kod daha okunaklı ve daha ne tür geliştirmeler yapabiliriz?

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

October 17, 2012

Alıntı:

>

Şu şekilde notalarımız olsun:

enum Notalar { Do = 1, Re, Mi, Fa, Sol, La, Si }

Onları şu şekilde okunduğu sırada ekrana yazabiliriz:

foreach(nota; 1..8) {
writef("%s\t", cast(Notalar)nota);
}

Salih,
Eğer bu program kod örneklerine girecekse;
standartlara uyacaksak foreach döngüsünden sonra paranteze gelmeden bir boşluk,
ve açıklamaların yazılması gerekecek.

Alıntı:

>

foreach(nota; 1..8)

Buraya nasıl gelindiğini ve tür dönüşümüne bir referans verilmesi gibi..
Bahsettiğim yalınlıkla ilgili meseleye girmiş olduk böylece :-)

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

October 17, 2012

Şurada Ali Hocamın bir açıklaması bulunmakta http://ddili.org/forum/post/3767 Kısaca:
Alıntı:

>

Bundan sonraki adım, DarbeTipi'ni enum yapmak yerine Darbe diye bir sınıf sıradüzeni kurmak olabilir. Nesne yönelimli programlamaya tam sadık olanlar için switch deyimi bir işarettir: o deyimin görüldüğü yere bir sıradüzen gelebilir. :)

Darbenin etkisi, sınıfları olmayan C'de switch ile yazılmak zorundadır. (Aslında işlev göstergeleriyle C'de de nesne yönelimli programlama yapılır ama çetrefillidir.) D gibi dillerde ise aşağıdaki gibi de olabilir. (Not: enum ve switch yasak değildir. :) Bir işaret olarak görülebileceğini söylemek istiyorum.)

Diye belirtmiş ki tam olarak benim anlatmak istediğim açıklamaya referans oluyor.

Ders arası bölümünde olmasını arzu ettiğim ve yararlı olacağına inandığım örnekler böyle açıklamaları da barındırmalı ki daha rahat kavranılsın.

Nasıl geliştirebiliriz sorusu orada yanıta da dönüşüyor.

Şimdi senin koduna dönersek; Ben bu aşamaya gelene kadar sanıyorum bir kaç ara kod daha vermenin iyi olacağını düşünürdüm. Önce tasarımı anlatırdım nereden başlayıp nereye gitmek istediğimi bildirirdim. Programım için kullandığım modüllerden nasıl faydalandığımı açıklardım ( ki sen bunu her zaman unutmadan ekliyorsun güzel ve yararlı :-) Elimden geldiğince kullandığım olanakları açıklamayı ihmal etmezdim gibi gibi. Çünkü kod örneği vermekten çok derslerin anlaşılmasına katkımız olsun derdindeyiz diye düşünürdüm.
Salih'çiğim aman söylediklerim yanlış anlaşılmasın. Ben sadece dün belirttiğim eksikliği nasıl giderebileceğimiz konusunda sesli sesli düşünüyorum. Yoksa kodların gayet güzel anlaşılır ve yeterli.

     Alıntı:
>
> case "do" : sonuç ~= "1"; break;
>           case "re" : sonuç ~= "2"; break;
>           case "mi" : sonuç ~= "3"; break;
>           case "fa" : sonuç ~= "4"; break;
>           case "sol": sonuç ~= "5"; break;
>           case "la" : sonuç ~= "6"; break;
>           case "si" : sonuç ~= "7"; break;
>           default   : sonuç ~= "0";
> ```

>

Şimdi bir örnek; ben konsoldan "Re" girdiğimde çıktıyı tür dönüşümü olarak alıyorum ve hemen aklıma takılan soruyu soruyorum:
Programcımız burada neyi hedeflemektedir. Acaba:

case "re","Re" : sonuç ~= "2"; break;


Biçiminde bir düzenleme gerekiyor mu?

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

Alıntı (mert):

>

Salih,
Eğer bu program kod örneklerine girecekse;
standartlara uyacaksak foreach döngüsünden sonra paranteze gelmeden bir boşluk,
ve açıklamaların yazılması gerekecek.

Yani şunu demek istiyor olabilir misin?

Alıntı:

>

foreach() içinde iki parametre ve bunlardan ikincisinde iki sayı arasında iki nokta görürseniz bunun bir aralığı ifade ettiğini düşünmelisiniz. Tıpkı dizi ile yapılan şu uygulama gibi:

> // foreach(i; 1..8) i.writeln; /*
> auto int[] birDizi = [  1, 2, 3, 4, 5, 6, 7 ];
> foreach(i; birDizi) {
>   i.writeln;
> }//*/
> ```

>

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

Alıntı:

>

foreach() içinde iki parametre ve bunlardan ikincisinde iki sayı arasında iki nokta görürseniz bunun bir aralığı ifade ettiğini düşünmelisiniz. Tıpkı dizi ile yapılan şu uygulama gibi:

Budur...

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

October 17, 2012
foreach (i; 1..8) i.writeln; // foreach birkarakterboşluk(/* ifadeler */) { .....// }

Gayet hoş. Ben de en basit haliyle bir kahraman karakteri yaratmaya çalışıyorum. İşlev yüklemelere de örnek olsun dizilere de referans versin akışına göre yapı, daha sonra class ve arayüzünü kuyllansın mantığında ilerliyorum. Bakalım ortaya nasıl bir şey çıkacak :-)

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

October 17, 2012

Alıntı (mert):

>

Şimdi bir örnek; ben konsoldan "Re" girdiğimde çıktıyı tür dönüşümü olarak alıyorum ve hemen aklıma takılan soruyu soruyorum:
Programcımız burada neyi hedeflemektedir. Acaba:

>  case "re","Re" : sonuç ~= "2"; break;
> ```

> Biçiminde bir düzenleme gerekiyor mu?
>
Bunu yazarken düşünmüştüm ama özellikle eklemedim. Bu vesileyle olası bir sorunun çözümünü de gösterdiğin için ayrıca teşekkür ediyorum. Hatta Caps Lock açık unutulduğu zaman ise tüm yazılanlar büyük olacağı için dönüş değeri her zaman bol sıfırlı (0000000 ..) olacak, yani default: ...:)

Bu arada ben daha farklı bir çözüm düşünüyordum. Sanırım yine std.string sınıfında olmalı ....

Alıntı:
> Unutmadan araya sıkıştırayım: (önceki konudaki alıntının bağlantısı (<http://ddili.org/forum/post/7978>))
> Alıntı (Salih Dinçer):
> > ...Hatta yanılmıyorsam std.string sınıfında olan split() işlevi ile çok daha akıllı bir şey yapabilirdik. Yine de dilim olayın göstermeyi ve bu konularda olabildiğince örnek çözmeyi tercih ederim.
> Meğer split() işlevi std.array içerisideymiş. Sürekli bir şeyler deprecated olduğu için karıştırıyorum. Sanırım ileride std.string diye bir şey kalmayacak...:)
>

.. bir string ifadeyi küçük harfe çeviren toLower() işlevi vardı. İşte bunu döngü içinde bir kere kullanarak her şeyi daha basitleştirebiliriz. Ne dersiniz?

Sevgiler, saygılar...

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
« First   ‹ Prev
1 2 3 4 5