Pazar, Ağustos 16, 2009

D'dili örnek kod

Bu zamana kadar D dili ile ilgili yazılarım kurulumla ilgiliydi. Artık ufaktan kod paylaşmanın zamanı geldi.

Aklıma toplu bir örnek gelmedi o yüzden C++ sınav sorularımı D ile yapıyorum. Aşağıdaki kod da sınav sorularımından bir tanesinin biraz daha modifiye edilmiş hali. Soruyu ddili.org sitesinin forumunda Haftanın Sorusu 2 başlığı altında paylaştım. Sorunun farklı yollardan çözümlerine oradan ulaşabilirsiniz.

Mümkün olduğunca açıklama satırları eklemeye çalıştım.Kullandığım fonksiyonlar hakkında daha ayrıntılı bilgi için ddili.org sitesinden yararlanabilirsiniz.


//Standart giriş çıkış kütüphanesi
import std.stdio;
import std.cstream;
//appender fonksiyonu için
import std.array;

class Foo
{
private:
//3x3 lük bir dizi. C++ için mDizi[3][3]
float[3][3] mDizi;
public:
//Foo sınıfının yapılandırıcısı. C++ da sınıfın ismi
this()
{
mDizi = new float[3][3];
mDizi = [[0,0,0],[0,0,0],[0,0,0]];
}
//Foo sınıfının yıkıcı fonksiyonu
~this()
{
//Ekrana parametre olarak girilen string yazdırılır ve imleç bir alt satra geçer
//C++ için cout<<"Nesne Silindi..."<<endl;
writeln("Nesne Silindi...");

/* D nin kendi çöp toplayıcısı var ama isteğe bağlı olarakta kendimiz de
c++ da olduğu gibi yine "delete" yardımı ile silme işlemini yapabiliyoruz.*/
delete mDizi[][];
}

/* İşletim sistemine göre 2 ayrı yaz() fonksiyonu var.
version() yardımı ile hangi işletim sistemi olduğunu belirliyoruz.
C++ için #ifndef-#endif */
version(Windows)
{
//İşletim sistemi windows ise çalışacak fonksiyon
void yaz()
{
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
// ┌ karaterin ekrana basar
if (i==0 && j ==0)
{
/*cast() yardımı ile tür dönüşümü yapıyoruz.
c++ için static_cast<char>
Ekrana parametre ile girilen string yazdırılır fakat imleç aynı satırda kalır.*/
write(cast(char)218);
}

// │ karakterini ekrana basar
if (i==1 && j == 0)
write(cast(char)179);

// └ karakterini ekrana basar
if (i==2 && j == 0)
write(cast(char)192);

//writef() fonksiyonu printf() fonksiyonu gibi kullanılır.
writef("%8.2f ",mDizi[i][j]);

// ┐ karakterini ekrana basar
if (i==0 && j ==2)
write(cast(char)191);

// │ karakterini ekrana basar
if (i==1 && j ==2)
write(cast(char)179);

// ┘ karakterini ekrana basar
if (i ==2 && j ==2)
write(cast(char)217);
}
writeln();
}
}
}
else version(linux)
{
//İşletim sistemi linux ise çalışacak fonksiyon
void yaz()
{
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
if (i==0 && j ==0)
write("┌");

if (i==1 && j == 0)
write("│");

if (i==2 && j == 0)
write("└");

writef("% 8.2f ",mDizi[i][j]);

if (i==0 && j ==2)
write("┐");

if (i==1 && j ==2)
write("│");

if (i ==2 && j ==2)
write("┘");
}
writeln();
}
}

}

void diziDoldur()
{
float k=1.00;
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
{
mDizi[i][j] = k*1.00;
k++;
}
}
}
//c++ daki const D dilinde de mevcut. Ama aralarında bazı farklıklar var.
void dizidenAl(const float pDizi[][3])
{
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
mDizi[i][j] = pDizi[i][j];
}
}
//"ref" anahtar kelimesi ile fonksiyona parametre olarak referans göndermiş olduk.
//C++ da "&" işleci bu işi yapar
void diziyeDöndür(ref float pDizi[][3])
{
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
pDizi[i][j] = mDizi[i][j];
}
}
//Kullanıcının sayı girebilmesi için
void klavyedenAl()
{
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
{
writef("mDizi[%d][%d]: ",i,j);
//Program çalışırken kullanıcıdan veri girişi istenir.
din.readf(&mDizi[i][j]);
}
}
}

/* toplama operatörünü(+) Foo sınıfdan oluşturulmuş iki nesnenin mDizi değişkenlerini
toplayacak şekilde aşırı yüklenmesi
C++ için "Foo Foo::operator+(Foo pToplanan)"*/
Foo opAdd(Foo pToplanan)
{
Foo yedek = new Foo();
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
yedek.mDizi[i][j] = mDizi[i][j] + pToplanan.mDizi[i][j];
}

return yedek;
}
}

Foo nesneOluştur()
{
Foo nesne = new Foo();
// nesne.klavyedenAl();
nesne.diziDoldur();

return nesne;
}

char tuşAl()
{
char tuş;

do
{
din.read(tuş);
} while(tuş == '\n');

return tuş;
}

int main()
{
char cevap;
float[3][3] dizidenAl=[[10.00,11.00,12.00],[13.00,14.00,15.00],[16.00,17.00,18.00]];
float[3][3] diziyeDöndür;
Foo f1 = new Foo();
Foo f2 = new Foo();
Foo f3 = new Foo();
Foo f4 = new Foo();
Foo[] fooDepo = new Foo[0];

auto sonunaEkle = appender(&fooDepo);

sonunaEkle.put(nesneOluştur());
do
{
if (cevap!='x')
writeln("NesneEklendi...");
write("Yeni Bir Nesne Oluşturmak İstermisiniz(E/H)?");
cevap = tuşAl();

switch(cevap)
{
/*C++ da olmayan bir özellik.D de switch yapısnda
virgül yardımı tek bir "case" satırında koşula
uygun birden fazla değer sonuç yazabiliyoruz*/
case 'e','E':sonunaEkle.put(nesneOluştur());break;
case 'h','H':break;
default:writeln("Lütfen E veya H karakterlerinden birini seçin");
cevap='x';break;
}
}while(cevap =='e' || cevap =='E' || cevap =='x');

foreach(yedek;fooDepo)
f2 = f2+yedek;

writeln("\n===fooDepo dizisine eklenen nesnelerindeki mDizi değişkenlerinin toplamı===");
f2.yaz();

writeln();

//Harici bir diziden veri alınması
f3.dizidenAl(dizidenAl);
writeln("===Harici bir diziden veri alan f3 nesnesi===");
f3.yaz();

writeln();

//Harici bir diziye veri gönderilmesi
f4.diziDoldur();
f4.diziyeDöndür(diziyeDöndür[]);
writeln("===f4 Nesnesinde harici bir diziye veri gönderildi===");
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
writef("%8.2f",diziyeDöndür[i][j]);

writeln();
}

return 0;
}



Hiç yorum yok: