December 26, 2017

Alıntı (cos00kun):

>

hemde beni Foreach döngüsüne yönlendirdiniz

Zamanla çoğu kodun döngüsüz yazılabildiğini göreceksin. Bazı programcılar açıkça döngü kullanımının zararlı olduğunu savunuyorlar. Örneğin, gösterdiğim kod aralıklardan ve UFCS'ten yararlanarak şöyle de yazılabilir (derlemeden yazıyorum):

import std.algorithm : map, each;
// Not: Button'dan Düğme diye bir tür türetmiş olduğunu da varsayarak:
Düğme[] düğmeler = düğmeBilgileri
                  .map!(bilgi => new Düğme(bilgi.isim, bilgi.x, bilgi.y))
                  .array;
düğmeler.each!(d => düzen.put(d, d.x, d.y));

Tabii bunlara gerek yok; yalnızca başka bir yöntem olarak gösterdim.

Ali

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

December 27, 2017

Alıntı (cos00kun):

>

Benim şimdiki sorunum yukarıdaki mesajlarda yazdığım gibi sadece ve sadece (Şimdilik) tıklanmayı nasıl algılayacağım konusu ?

Aslında önceki örnekte de göstermiştim ama daha açık olarak senin yazdığın örnek üzerinde göstereyim. düğmeler isminde bir dizi yerine sadece bir Button düğme ekleyeceğiz.

       foreach (d; düğmeBilgileri)
       {
           düğme = new Button(d.isim);
           düzen.put(düğme, d.x, d.y);
           düğme.addOnClicked(&hesapla);
       }
   '// düğmeler[1].addOnClicked(&topla);'
   void hesapla (Button düğme)
   {
       giriş1.setText(düğme.getLabel());
   }

Böylece bir düğmeye basıldığı zaman hesapla işlevini çalıştıracağız. Ama senin şimdi yapman gereken sayılarla işleçleri tespit etmek. Örneğin kullanıcı 23 sonra + girdi.

Bu durumda ilk durumda ekranı 2 yapacağız. Sonra 23. Daha sonra bir işleç girildiği için önceki iletide bahsettiğim şekilde sayılar bir tarafta işleçler bir tarafta olacak şekilde çift uçlu kuyruğa atıp, kullanıcı hesapla = düğmesine bastığında ilk eklenen önce olacak şekilde çıkartıp hesaplama yaptıracağız.

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

December 27, 2017

Anladım..
şimdi şöyle yaptım ve oldu :-)

       foreach (d; düğmeBilgileri) {
           düğmeler ~= new Button(d.isim);
           düzen.put(düğmeler[$-1], d.x, d.y);
       }

		for(int say=0;say<16;say++) {
		düğmeler[say].addOnClicked(&hesapla);
		}

Şimdi sırada hangi butonun tıklandığını ve seninde bahsettiğin üzere tanımlamaları işlevleri planlayacağım ..

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

December 27, 2017

İstersen ilk döngünün içine bu satırı ekleyerek de yapabilirsin.

           düğmeler[$-1].addOnClicked(&hesapla);

Böylece ikinci döngüye gerek kalmaz.

Hatta bir ipucu daha ekleyeyim.

   void hesapla (Button düğme)
   {
       auto ekran = giriş1.getText();
       giriş1.setText(ekran ~ düğme.getLabel());
   }

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

December 27, 2017

Süper oldu bu sağol :) gerisini getirmeye çalışacağım bu haftasonuna kadar artık..

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

December 29, 2017

Evet şimdilik Bir D dili acemisinin oluşturabileceği kadarıyla kafamda bir algoritma geliştirdim.. Sizlerle paylaşıp kısmetse bu haftasonu programın geri kalanını yani hesap makinasının çalışır şeklini bitireceğimi umuyorum.
tasarladığım algoritma kısaca şöyle (Belkide uzunca bilemedim :-p )

öncelikle programı çalıştırıp rakamları girerken program rutin çalışacak ancak "+", "-", "/" yada "*" ya basıldığı anda program bir işleve yönelecek orda yukardaki işlemlerden hangisinin olduğu tespit edilecek ve o andaki giriş kutusundaki değer bir değişkene atanacak.. ardından giriş kutusunun hafızası silinecek ama yazısal yani görsel durum kalacak.. sonra program işlevin çağrıldığı yerden devam edecek.. ardından geri dönüp ikinci sayı için rutin işlem devam edecek.

Bu yeni tanımladığımız işlevde 4 işlem kontrolünden hemen önce "=" kontrolü yapılacak ve eğer önceden bir sayı girilmiş ise ona göre sonucu hesaplatan bir işleve yönlenip hafızadaki iki sayı bu 4 işlevden hangisi tanımlandıysa ona göre sonuş üretip Giriş kutusuna yazılacak..
Bu aşamayı bitirdikten sonrada Giriş kutusunda 2 sayımı girildi ? 4 işlemden önce ya "=" girildiyse ne olacak? hata kontrolleri ? gibi konuları çözüp ardından float double gibi üst düzeye geçeceğim..

Daha fazlasını kimse benden beklemesin çünkü daha önceden bahsettiğim dosyalardan verileri alıp okumak vesaire gibi konulara geri dönmem gerekiyor :-p

ekleyeceğiniz düzelteceğiniz yada hatalı buldüğunuz herşeyi yazabilirsiniz arkadaşlar.. Şimdiden teşekkür ederim

Not: Erdem hocam bu not size! bu bahsettiğim yeni işlevi tanımlarken en çok sıkıntı çektiğim konu olan hangi parametrenin tanımlanacağı konusunu biraz daha açarsanız sevinirim.. Örneğin yeniİşlev (Button düğme); burda Button modülü bu işlevin içinde hiç kullanılmasada neden parametre olarak giriliyor mantığını biraz anlasamda tam çözemedim.. daha açıklayıcısı yukarda bahsettiğim yeni işlevi tanımlarken ben "auto ekran = giriş1.getText();" ifadesindeki ekran değişkenini parametre olarak yollamam gerekecek bu durumdada yeni işleve yine yeniİşlev(Button düğme); gibi bir parametremi yollamalıyım ?

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

December 29, 2017

https://github.com/erdemoncel/gtkd/blob/master/import/gtk/Button.d

Buradan kaynak koduna bakıp da görebileceğin üzere aslında parametre olarak gönderdiğimiz düğme kullanılıyor. Burada dlg.

	gulong addOnClicked(void delegate(Button) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
	{
		auto wrapper = new OnClickedDelegateWrapper(dlg);
		wrapper.handlerId = Signals.connectData(
			this,
			"clicked",
			cast(GCallback)&callBackClicked,
			cast(void*)wrapper,
			cast(GClosureNotify)&callBackClickedDestroy,
			connectFlags);
		return wrapper.handlerId;
	}

Aslında bu işleve bir delegate gönderiyoruz.

http://ddili.org/ders/d/kapamalar.html

Ya da bir fonksiyonun adresi gibi düşünülebilir sanırım.

Algoritma kısmı ise kolay. Hatta ben bazen öyle yapıyorum. Uzun bir programın takıldığım kısmını ilkönce çok basit bir örnek üzerinde kodluyorum sonra programa ekliyorum.

Yapman gereken kullanıcı sayısal, işleç ve = karakterleri girecek. İlkönce girilen karakter sayısal mı, işleç mi, eşittir mi bunu bulan konsolda bir d programı yazabilirsin. Sonra programa eklersin.

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

December 29, 2017

Erdem hocam cevap güzel ama henüz yazdıklarınızı anlayabilecek düzeyde değilim.. Yavaş yavaş bakıyorum dediğiniz konulara.. Bu arada kodda biraz karalama birşeyler yaptım ancak aşağıda belirttiğim yerde bi ufak tıkanıklık yaşadım;

import gtk.Main;
import gtk.MainWindow;
import gtk.Layout;
import gtk.Label;
import gtk.Entry;
import gtk.Button;
import std.stdio : writeln;
import std.string : format;
import std.conv;

class Pencere : MainWindow {
   Layout düzen;
   Entry giriş1,giriş2,giriş3;
   Label etiket1;
   Button[] düğmeler;

   this() {
       super("İlkel Hesap Makinası..");

       struct DüğmeBilgisi {
           string isim;
           int x;
           int y;
       }

       DüğmeBilgisi[] düğmeBilgileri = [
						{ "0", 10, 210 },
						{ "1", 10, 165 },
						{ "2", 70, 165 },
						{ "3", 130, 165 },
						{ "4", 10, 120 },
						{ "5", 70, 120 },
						{ "6", 130, 120 },
						{ "7", 10, 75 },
						{ "8", 70, 75 },
						{ "9", 130, 75 },
						{ "+", 190, 75 },
						{ "-", 190, 120 },
						{ "*", 190, 165 },
						{ "/", 190, 210 },
						{ ".", 70, 210 },
						{ "=", 130, 210 },
										  ];

       düzen = new Layout(null, null);
       etiket1 = new Label("İLKEL HESAPLAMA YAPIYORUZ..");
       giriş1 = new Entry();

       foreach (d; düğmeBilgileri) {
           düğmeler ~= new Button(d.isim);
           düzen.put(düğmeler[$-1], d.x, d.y);
			düğmeler[$-1].addOnClicked(&işle);
       }

       // Bileşen Ayarları..
       setSizeRequest(250, 275);
       move(100, 100);
       giriş1.setAlignment(1);
       düzen.setSizeRequest(50, 50);
       düzen.put(etiket1, 5, 5);
       düzen.put(giriş1, 10, 25);

       add(düzen);
       showAll();

       düğmeler[1].addOnClicked(&işle);
   }

   void işle(Button düğme) {   // Bu işlevde girilen değerler sayımı değilmi ve giriş kutusuna gelen değerler yan yana eklenerek yazılıyor..
		if(düğme.getLabel()=="+"||düğme.getLabel()=="-"||düğme.getLabel()=="*"||düğme.getLabel()=="/"||düğme.getLabel()=="=") {
			işlemYap();
		}
		else {
			writeln("Tıklama oldu",düğme.getLabel()); // fonksiyonun çalışıp çalışmadığının konrolünü sağlamak için vardır. Program bitimikaldırılacak!
			auto ekran = giriş1.getText();
			giriş1.setText(ekran ~ düğme.getLabel());
			try {
				int ilk = to!int(giriş1.getText());
				giriş1.setText(to!string(ilk));
			} catch (ConvException hata) {
				// Hatayı bildiriyoruz
				etiket1.setLabel("HATA: İki tamsayı girmelisiniz");
				writeln("Uyarı!! Hata fırlatıldı!!");

			} catch (Exception hata) {
				// Başka çeşit bir hata oluştu
				etiket1.setText(format("HATA: %s", hata.msg));
			}
		}
	}

	void işlemYap() {  // Bu işlevde  4 işlem ve "=" işlemleri komtrol edilecek böylece 4 işlem yapılabilecek
		writeln("işlemYap Tıklandı işlem yapıyorum..."); // fonksiyonun çalışıp çalışmadığının konrolünü sağlamak için vardır. Program bitimikaldırılacak!
		switch (düğme.getLabel()) {
			case "+":
				writeln("+ Tıklandı");
				break;
			case "-":
				writeln("- Tıklandı");
				break;
			case "*":
				writeln("* Tıklandı");
				break;
			case "/":
				writeln("/ Tıklandı");
				break;
			case "=":
				writeln("= Tıklandı");
				break;
			default:
				break;
		}
	}
}

void main(string[] args)
{
   Main.init(args);
   Pencere pencere= new Pencere();
   Main.run();
}

Bu kod da 'switch (düğme.getLabel()) {' ifadesinde hata alıyorum.. Sanırım bir işlevden diğer işleve giderken bir parametre hatası yapıyorum..

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

December 29, 2017

Alıntı (acehreli):

>

işle() işlevine parametre olarak gelen 'düğme' çağrılan başka her işleve otomatik olarak gitmez.
Ali

püf noktası bu ..tamamdır Ali hocam ;-)
Aslında bu noktada D diline dönüp biraz daha sınıf ve işlevlere yoğunlaştıktan sonra tekrar kaldığım yerden devam etmek işin özünü kavramak için belkide daha iyi olacak.. Hazmetmeden işin özünü çok kavramadan birşeyi yapmak pek bana göre değil :blush: Yinede temelim sağlam az biraz daha kurcalarsam 1 haftaya Sınıf ve İşlev parametreleri ve kullanımlarını iyi öğrenirim sanırım..

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

December 29, 2017

Alıntı (cos00kun):

>

Erdem hocam cevap güzel ama henüz yazdıklarınızı anlayabilecek düzeyde değilim.

Benim de temsilciler delegates konusunda henüz anlamadığım noktalar olabilir. Basitçe bilmemiz gereken bir düğmeye tıklandığında hangi düğmeye tıklandığını ayırt edebilmemiz için 'addOnClicked' işlevini yazıyorsak düğmeyi de parametre olarak gönderiyoruz.

Senin yapacağın şey çok basit.

Bir tane program yazmanı istediler. Bu programda kullanıcı sayılar işleçler ve = karakteri giriyor. Örneğin :

>

Bilgi giriniz :
3
Bir rakam girdiniz
/
Bir işleç girdiniz

Eşittir tuşuna bastınız.

Bunu konsolda D ile yazmanı istediler. Gtkd kullanmadan. Soru bu.

Ben de bu yöntemi özellikle kod miktarı artıp program karmaşıklaştıkça kullanıyorum. Çünkü parçaları birbirini etkileyen bir programda sonucunu tam kestiremediğimiz bir değişiklik yaparsak bu sefer düzeltmek de zor olabilir. Ya git'le eski bir sürüme almak gerekecek. Ama bu durumda da yaptığımız son eklemeler kaybolabilir.

Örneğin merak ettim baktım kodladığım programlama sayfası için kaç satır kod yazmışım diye.

   $ find . -path ./venv -prune -o -name '*.py' | xargs wc -l
   919 ./programlama.py
    97 ./yanıtoyla.py
   129 ./soruoyla.py
wc: ./venv: Bir dizin
     0 ./venv
   228 ./identicon.py
  1373 toplam

Gene de 1000 satırın üzerine geçmiş. (identicon'u hazır kullandım. Sanırım sadece Python3'le çalışacak şekilde düzenledim)

Örneğin bu programda çalışırken kullanıcı oy verdikten sonra 5 dakika kadar verdiği oyu değiştirme özelliğini nasıl eklerim diye düşündüm.

Sonra programın bu bölümüne odaklandım ve çalışabilecek en basit programı yazdım. Takıldığım nokta oturum değişkenlerinin Flask'ta iş parçacıkları arasında paylaşılamıyor olmasından kaynaklanıyordu. Ben de bunun yerine geçici bellekleme (caching) kullandım.

Gene iletileri bir biri altına yazdırmak için bir ağaç yapısını MongoDB ile nasıl gösterebilirim onu bulmam gerekti. Bunu da ayrı bir program olarak yazdım sonra asıl programla birleştirdim.

Demek istediğim programlar geliştikçe ben programı alt programlara bölüp, sonra parçaları birleştirmeyi faydalı buluyorum.

Eğer programın basit diyebileceğimiz ve diğer kısımları etkilemeyecek değişiklikler yapıyorsam ana programa yazmaya devam ediyorum. Takıldığım noktalarda ise problemi alt parçalara bölmek kolaylık sağlıyor.

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