Forum: Ders Arası RSS
Derslerle ilgili sorular
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ı: Derslerle ilgili sorular
Bir değişkeni string değerde nasıl oluşturabiliriz ? İlk str denedim olmadı.String denedim olmadı. Char ı denedim yine hata verdi. Galiba string değerler için char ile tanımlamak lazım ama ben beceremedim.
import std.cstream;
 
void main()
{
    dout.writefln("Merhaba dünya!");
}
Galiba burada uygulamaya bir cstream adlı modül ekliyoruz. Benim burada sormak istediğim cstream adlı modüldeki dout.writefln("Merhaba dünya!"); fonksiyonu ile stdio adlı modüldeki write("Merhaba Dünya"); arasındaki fark nedir. Nerede hangisini kullanmak gerekir. Harelde ikiside aynı şey değildir. Değil mi?
import std.cstream;
 
void main()
{
    dout.writef("Okulda kaç öğrenci var? ");
 
    // Öğrenci sayısının tutulacağı değişkenin tanımlanması
    int öğrenci_sayısı;
 
    // Girişten gelen bilginin öğrenci_sayısı değişkenine atanması
    din.readf(&öğrenci_sayısı);
 
    dout.writefln( "Anladım: okulda ",
                   öğrenci_sayısı, " öğrenci varmış.");
}
Birde buradaki & operatörü ne işe yaramaktadır. Harelde oraya başka operatörlerde geliyordur. Acaba onların görevi nedir?
Bu mesaj erdem tarafından değiştirildi; zaman: 2009-07-27, 15:32.
acehreli (Moderatör) #2
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ı
Biraz sabır! :D Yakında devam edeceğiz...

Şimdilik: D'de değişken dizgilerin türü char[]. string de kullanabilirsin ama string'ler değişmezdirler (immutable).

import std.cstream;
 
void main()
{
    // değişmez (immutable)
    string merhaba = "Merhaba";
 
    // değişebilir; değişmezden kopyalanarak ilkleniyor
    char[] hedef = "dünya".dup;
 
    dout.writefln(merhaba, " ", hedef, "!");
 
    hedef = "Venüs".dup;
    dout.writefln(merhaba, " ", hedef, "!");
}

dout.write ile write'ın aynı olduklarını düşünebilirsin. Bu, C'de şunların ikisinin eşdeğer olmalarına benzer:

fprintf(stdout, "merhaba");
printf("merhaba");

& işlecini elimdeki derste anlatıyorum zaten. Kısaca, read'in okuduğu bilginin nereye yerleştirileceğini belirtir. Yani "hangi adrese" yerleştirileceğini... O yüzden "adres işleci" de denebilir. İşaretçi kavramı yani...

Ali
emre413 (Moderatör) #3
Kullanıcı başlığı: Celal Emre ÇİÇEK
Üye Tem 2009 tarihinden beri · 62 mesaj · Konum: Kırıkkale
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Dilimler
Dilimler dersini okuduktan sonra alttaki ödevi yaptım. Çözümü de bakmadan yaptım :D. Sonra cevabı çözümle karşılaştırdım. Ancak orada .dup'un önemli olduğu yazıyordu. Burayı tam olarak anlamadım.
Benim çözümüm:

import std.stdio;
 
void main()
{
    int sayılar[10] = [ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 ];
    int temp[5] = sayılar[0..$/2];
    writeln("Once:  ", sayılar);
    sayılar[0..$/2] = sayılar[$/2..$];
    sayılar[$/2..$] = temp[0..$];
    writeln("Sonra: ", sayılar);
}

Ali hocamın çözümü:

import std.stdio;
 
void main()
{
    int sayılar[10] = [ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 ];
   // Önce ilk yarının bir kopyasını alıyorum;
    // Sonundaki .dup ÖNEMLİ!
    int kopya[] = sayılar[0..$/2].dup;
 
    // İlk yarıya son yarıyı kopyalıyorum
    sayılar[0..$/2] = sayılar[$/2..$];
 
    // Son yarıya ilk yarının kopyasını kopyalıyorum
    sayılar[$/2..$] = kopya;
 
    writeln("Sonra: ", sayılar);
}

ikisi de aynı sonucu veriyor. .dup burada neden önemli?
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ı
Kopyasını alacağın dilimin boyutunu bilmediğini varsayarsak kopyalama satırını int temp[] = sayılar[0..$/2]; şeklinde değiştirdiğimizde yine yanlış olan sonucu veriyor. Benim farkettiğim bu, belki teknik açından da farklılıklar olabilir.
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ı
Ah! İşte burada daha önce de konuştuğumuz statik dizi, dinamik dizi, ve dilim kavramlarının birbirlerine bu kadar yakın olmalarının sıkıntısını çekiyoruz! :) (Bunları tam da şu sıralarda değiştiriyorlar. Umarım daha kullanışlı bir şey çıkar.)

emre413 dizinin uzunluğunu yazınca, yani şöyle deyince:

int temp[5] = sayılar[0..$/2];

sol tarafta bir statik dizi oluşuyor ve sağ taraftan kopyalanıyor. Bense şöyle uzunluğunu yazmayınca:

int kopya[] = sayılar[0..$/2].dup;

sol taraf, sağ taraftan kopyalanan ve ismi olmayan dizinin bir dilimi oluyor. (Aslında dinamik dizi de oluyor galiba. Bu kavram karmaşasını daha önce konuşmuştuk.)

esatarslan52'nin farkettiği gibi, sağ tarafta .dup olmazsa sağdaki dizinin dilimi oluyoruz; kopyası değil.

Bu konuyu sonraya bırakmaya çalışmıştım ama string'lerin değişmezlik [immutable] kavramı sırasından anlatırken gerekli olduğu için vermek zorunda kaldım ve kirli çamaşırlar hemen ortaya döküldü... :D

Ali
Avatar
esatarslan52 (Moderatör) #6
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şimdilik olayı pek deşmemek en mantıklısı kanımca.Yoksa Ali beyinde dediği gibi kirli çamaşırlar çıkıyor :-D .
emre413 (Moderatör) #7
Kullanıcı başlığı: Celal Emre ÇİÇEK
Üye Tem 2009 tarihinden beri · 62 mesaj · Konum: Kırıkkale
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler,
Peki o zaman en iyisi dediğiniz gibi olayı fazla kurcalamamak.
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, 15:16:29 (UTC -08:00)