<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bilgisayar Kavramları &#187; Programlama Dilleri</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/programlama-dilleri/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PROLOG</title>
		<link>http://www.bilgisayarkavramlari.com/2012/01/15/prolog/</link>
		<comments>http://www.bilgisayarkavramlari.com/2012/01/15/prolog/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 00:40:27 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=6091</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, PROLOG diline giriş yapmak ve basit bazı yapay zeka problemlerinin PROLOG dilinde nasıl kodlanarak çözüldüğünü göstermektir. Kurulum ve çalıştırma: Bu yazı kapsamında SWI-PROLOG programı kullanılacaktır. Programı, www.swi-prolog.com adresinden temin etmek mümkündür. Yazı kapsamında MAC OSX üzerinde örnekler çalıştırılarak gösterilecektir ancak kurulum ve sonrasında başarılı bir çalıştırma yapılabiliyorsa [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">Yazan : Şadi Evren ŞEKER</p>
<p class="MsoNormal"><span lang="TR">Bu yazının amacı, PROLOG diline giriş yapmak ve basit bazı yapay zeka problemlerinin PROLOG dilinde nasıl kodlanarak çözüldüğünü göstermektir. </span></p>
<p class="MsoNormal"><strong><span lang="TR">Kurulum ve çalıştırma:</span></strong></p>
<p class="MsoNormal"><span lang="TR">Bu yazı kapsamında SWI-PROLOG programı kullanılacaktır. Programı, </span><a href="http://www.swi-prolog.com/"><span lang="TR">www.swi-prolog.com</span></a><span lang="TR"> adresinden temin etmek mümkündür. </span></p>
<p class="MsoNormal"><span lang="TR">Yazı kapsamında MAC OSX üzerinde örnekler çalıştırılarak gösterilecektir ancak kurulum ve sonrasında başarılı bir çalıştırma yapılabiliyorsa hangi işletim sisteminde olduğunuzun bir önemi yoktur, bütün sistemlerde aynı PROLOG komutları çalışır. </span></p>
<p class="MsoNormal"><span lang="TR">Siteden indirilip kurulum yapıldıktan sonra, </span></p>
<p class="MsoNormal"><tt><span style="font-size: 10pt;" lang="TR">$ /opt/local/bin/swipl</span></tt><span lang="TR"> </span></p>
<p class="MsoNormal"><span lang="TR">Dizini altında bulunan swipl komutu çalıştırılarak, PROLOG komut satırı açılabilir. </span></p>
<p class="MsoNormal"><span lang="TR">Program çalıştırıldığında, aşağıdakine benzer bir komut satırı ile komut girilmesini bekleyecektir:</span></p>
<p class="MsoNormal"><tt><span style="font-size: 10pt;" lang="TR">?- _</span></tt></p>
<p class="MsoNormal"><strong><span lang="TR">Yardım</span></strong></p>
<p class="MsoNormal"><span lang="TR">İlk ve en önemli komutumuz olan yardım komutu ile başlayabiliriz. </span></p>
<p class="MsoNormal"><tt><span style="font-size: 10pt;" lang="TR">?- help(help).</span></tt></p>
<p class="MsoNormal"><span lang="TR">Bu komut, X11 ekranında, yardım dokümanını görüntüleyecektir. Basitçe herhangi bir komut hakkında bilgi alınmak istendiğinde bu komutu help fonksiyonuna parametre olarak vermek yeterlidir. Yukarıdaki kullanımda help komutunun kendisi için yardım alınmıştır. </span></p>
<p class="MsoNormal"><strong><span lang="TR">Çıkış</span></strong></p>
<p class="MsoNormal"><span lang="TR">Prolog komut satırından çıkmak için </span></p>
<p class="MsoNormal"><tt><span style="font-size: 10pt;" lang="TR">?- halt.</span></tt></p>
<p class="MsoNormal"><span lang="TR">Yazılması yeterlidir. Bu komut programı sonlandıracaktır. </span></p>
<p class="MsoNormal"><strong><span lang="TR">Basit Kaziyeler</span></strong></p>
<p class="MsoNormal"><span lang="TR">Aşağıdaki komutları PROLOG üzerinde çalıştıralım ve ardından burada yapılan işlemleri yorumlayalım.</span></p>
<p class="MsoNormal"><span lang="TR">Sistemimizde kayıtlı olan bir dosyayı program tarafından açıp çalıştırılır bir şekilde yüklemek için dosya ismi köşeli parantezler içerisinde verilmelidir:</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Courier;" lang="TR">?- [‘ilkdosya.pl'].</span></p>
<p class="MsoNormal"><span lang="TR">Yukarıda, bilgisayarımızda bulunan “ilkdosya.pl” isimli dosyayı sisteme tanıtarak yükledik. Bu dosyada bulunan tanımlar da otomatik olarak yüklenmiş ve sorgulanmaya / çalışmaya hazır hale getirilmiş olacaktır. Ayrıca bu dosyada bulunan genel hatalar, yükleme sırasında ekrana basılır.<br />
</span></p>
<p class="MsoNormal"><strong><span lang="TR">PROLOG ile Faktöriyel Kodu</span></strong></p>
<p class="MsoNormal"><span lang="TR">PROLOG dili, yapısal olarak özyineli (recursive) bir yapıdadır ve döngülerin yerine özyineli fonksiyon (recursive function) kullanılması gerekir. Bu kullanımı göreceğimiz en basit uygulamalardan birisi olan faktöriyel kodunu yazıp kodlamaya çalışalım.</span></p>
<p class="MsoNormal"><span lang="TR">Herhangi bir editör açılarak (ben tercihen vi kullanıyorum, siz de istediğiniz bir editör ile dosyayı açıp içeriğini ) aşağıdaki şekilde yazabilirsiniz:</span></p>
<pre><span lang="TR">factorial(0,1).      </span></pre>
<pre><span lang="TR">factorial(A,B) :- </span></pre>
<pre><span lang="TR">             A &gt; 0,</span></pre>
<pre><span lang="TR">             C is A-1,</span></pre>
<pre><span lang="TR">            factorial(C,D),</span></pre>
<pre><span lang="TR">            B is A*D. </span></pre>
<p class="MsoNormal"><span lang="TR">Ardından aşağıdaki şekilde dosyamızı sisteme yükleyelim:</span></p>
<p class="MsoNormal"><span lang="TR">?- ['ilkdosya.pl'].</span></p>
<p class="MsoNormal"><span lang="TR">% ilkdosya.pl compiled 0.00 sec, 732 bytes</span></p>
<p class="MsoNormal"><span lang="TR">true.</span></p>
<p class="MsoNormal"><span lang="TR"> </span></p>
<p class="MsoNormal"><span lang="TR">Komut satırında dosyamızın yüklendiği ve yükleme süresi ve dosya boyutu gösterilmektedir. Son satırda yer alan true bilgisine kadar bir hata bulunmamış olması, dosyamızda bir hata olmadığını gösterir. Şimdi artık ilk fonksiyonumuzu kullanmaya başlayabiliriz. </span></p>
<p class="MsoNormal"><span lang="TR">?- factorial(5,X).</span></p>
<p class="MsoNormal"><span lang="TR">X = 120 ;</span></p>
<p class="MsoNormal"><span lang="TR">false.</span></p>
<p class="MsoNormal"><span lang="TR"> </span></p>
<p class="MsoNormal"><span lang="TR">Komut satırında, factorial(5,X) komutu verilerek, 5! Değerinin X değişkenine döndürülmesi istenmiştir. Burada öğrenilen birkaç önemli noktayı belirtelim. Birincisi X ile gösterilen değer bir değişkendir ve PROLOG dünyasında buna unbounded variable (bağlanmamış değişken) ismi verilir. Basitçe Prolog kodlarındaki bütün büyük harf ile başlayan ifadeler birer değişkendir ve ayrıca bir değişken tanımı yapılmaz. İkinci bir nokta, Prolog dilinde kod yazılırken girilen her satır bir emirdir ( declaration) ve yapısal olarak Prolog dili, haber mantığını (predicate calculus) barındırır. Buna göre yüklü olan dosyada bulunan komutlar yukarıdan aşağıya doğru çalıştırılırken üstte bulunan satır, alttakine gore öncelikli olur ve aynı zamanda birden fazla satırda emirin tanımlanması durumunda, sırasıyla bu emirler işlenir. </span></p>
<p class="MsoNormal"><span lang="TR">Örneğin yukarıdaki kodda, ilk satırda bulunan factorial (0,1). İfadesi, 0! = 1 anlamındadır ve bir şekilde birisi bize sıfır faktöriyeli sorarsa, ikinci değer olarak 1 sonucunu döndürmeyi gerektirir. </span></p>
<p class="MsoNormal"><span lang="TR">İkinci satırdan sonra başlayan tanımda ise, sırasıyla A&gt;0 kontrolü yapılmış, ardından C değişkenine değer olarak A-1 değeri konmuş ve yeni bulunan C değerinin faktöriyeli hesaplanarak, B sonucuna hesaplanan bu C faktöriyel değeri ile A’nın çarpımı eklenmiştir. </span></p>
<p class="MsoNormal"><span lang="TR">Yukarıdaki şekilde kodumuzu ilkdosya.pl<span>  </span>dosyasına yazıp kaydettikten sonra prolog komut satırında dosyamızı yükleyip çalıştırabiliriz:</span></p>
<p class="MsoNormal"><span lang="TR"> <a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/Untitled2.png"><img class="alignnone  wp-image-6106" title="Untitled2" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/Untitled2.png" alt="" width="510" height="235" /></a></span></p>
<p class="MsoNormal"><span lang="TR">Yukarıda görüldüğü üzere faktöriyel kodumuz çalışmış ve sonucu doğru şekilde bulmuştur. </span></p>
<p class="MsoNormal"><span lang="TR">Kodun çalışmasını takip etmek için trace komutu kullanılabilir. Basitçe komut satırında:</span></p>
<p class="MsoNormal"><span lang="TR">trace.</span></p>
<p class="MsoNormal"><span lang="TR">Yazıldıktan sonra çalışmaya başlar ve bu çalışmadan sonra çağrılan fonksiyonların detayları ekrana basılır:</span></p>
<p class="MsoNormal"><span><a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/Untitled1.png"><img class="alignnone  wp-image-6107" title="Untitled" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/Untitled1.png" alt="" width="311" height="708" /></a></span></p>
<p class="MsoNormal"><span lang="TR">Görüldüğü üzere factorial fonksiyonumuzun her adımı ekrana basılmıştır.</span></p>
<p class="MsoNormal"><strong><span lang="TR">Hanoi Kuleleri (Towers of Hanoi)</span></strong></p>
<p class="MsoNormal"><span lang="TR">İkinci bir uygulama olarak çok klasik bilgisayar bilimleri problemlerinden olan Hanoi Kulelerini ( tower of hanoi ) kodlamaya çalışalım.</span></p>
<p class="MsoNormal"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeEAAADICAYAAADfnllEAAADHmlDQ1BJQ0MgUHJvZmlsZQAAeAGFVN9r01AU/tplnbDhizpnEQk+aJFuZFN0Q5y2a1e6zVrqNrchSJumbVyaxiTtfrAH2YtvOsV38Qc++QcM2YNve5INxhRh+KyIIkz2IrOemzRNJ1MDufe73/nuOSfn5F6g+XFa0xQvDxRVU0/FwvzE5BTf8gFeHEMr/GhNi4YWSiZHQA/Tsnnvs/MOHsZsdO5v36v+Y9WalQwR8BwgvpQ1xCLhWaBpXNR0E+DWie+dMTXCzUxzWKcECR9nOG9jgeGMjSOWZjQ1QJoJwgfFQjpLuEA4mGng8w3YzoEU5CcmqZIuizyrRVIv5WRFsgz28B9zg/JfsKiU6Zut5xCNbZoZTtF8it4fOX1wjOYA1cE/Xxi9QbidcFg246M1fkLNJK4RJr3n7nRpmO1lmpdZKRIlHCS8YlSuM2xp5gsDiZrm0+30UJKwnzS/NDNZ8+PtUJUE6zHF9fZLRvS6vdfbkZMH4zU+pynWf0D+vff1corleZLw67QejdX0W5I6Vtvb5M2mI8PEd1E/A0hCgo4cZCjgkUIMYZpjxKr4TBYZIkqk0ml0VHmyONY7KJOW7RxHeMlfDrheFvVbsrj24Pue3SXXjrwVhcW3o9hR7bWB6bqyE5obf3VhpaNu4Te55ZsbbasLCFH+iuWxSF5lyk+CUdd1NuaQU5f8dQvPMpTuJXYSWAy6rPBe+CpsCk+FF8KXv9TIzt6tEcuAcSw+q55TzcbsJdJM0utkuL+K9ULGGPmQMUNanb4kTZyKOfLaUAsnBneC6+biXC/XB567zF3h+rkIrS5yI47CF/VFfCHwvjO+Pl+3b4hhp9u+02TrozFa67vTkbqisXqUj9sn9j2OqhMZsrG+sX5WCCu0omNqSrN0TwADJW1Ol/MFk+8RhAt8iK4tiY+rYleQTysKb5kMXpcMSa9I2S6wO4/tA7ZT1l3maV9zOfMqcOkb/cPrLjdVBl4ZwNFzLhegM3XkCbB8XizrFdsfPJ63gJE722OtPW1huos+VqvbdC5bHgG7D6vVn8+q1d3n5H8LeKP8BqkjCtbCoV8yAAAL9UlEQVR4Ae3dAXLiRhAFUJPa+1+ZmGSNBQJbiJFm+uttVSpYBk3367F/pFDL6fz558MfAgQIECBAYHeBf3Zf0YIECBAgQIDAfwJC2EYgQIAAAQKdBIRwJ3jLEiBAgAABIWwPECBAgACBTgJCuBO8ZQkQIECAgBC2BwgQIECAQCcBIdwJ3rIECBAgQEAI2wMECBAgQKCTgBDuBG9ZAgQIECAghO0BAgQIECDQSUAId4K3LAECBAgQEML2AAECBAgQ6CQghDvBW5YAAQIECAhhe4AAAQIECHQSEMKd4C1LgAABAgSEsD1AgAABAgQ6CQjhTvCWJUCAAAECQtgeIECAAAECnQSEcCd4yxIgQIAAASFsDxAgQIAAgU4Cfzqte4hlT6fTrM/z+Tw75gABe8UeuAjYB8fbB66EN5r5ox+mZz9kG5XgtEUE7JUig9q4TPtgY+BBTy+ENxjMsx+mr6V++/7X8/w7X+C3vfDb9/OFjtHhb3P+7fvHUMrsUgg3nuv8h+Vy+/nrn+/F5s/7/p5HxxCY74GvfXL7vyzmzzuGz1G6nM/XPjjK7C99CuFNp337y/T/MN50QScvK2CvlB1d08Ltg6acBU4mhAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisCBAgQKCAghAsMSYkECBAgkCkghDPnqisC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" alt="" /></p>
<p class="MsoNormal"><span lang="TR">Oyunun kuralı gayet basit. Başlangıçta bir çubukta dizili olan bütün diskler her adımda tek bir disk hareket ettirerek diğer iki çubuktan birisine taşınacaktır. Bu taşıma işlemleri sırasında büyük bir disk, küçük olan bir diskin üzerine gelmeyecektir. </span></p>
<p class="MsoNormal"><span lang="TR">Ayrıca oyunun internetten oynan bir denemesi için daha önce hazırladığım aşağıdaki ödev sayfasına bakabilirsiniz:</span></p>
<p class="MsoNormal"><a href="http://www.sadievrenseker.com/c/odev5.html"><span lang="TR">http://www.sadievrenseker.com/c/odev5.html</span></a></p>
<p>Problemin çözümünde kullanacağımız kod aşağıdaki şekildedir:</p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">SADIs-MacBook-Air:prolog sadievrenseker$ vi hanoi.pl </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">oyna(1,X,Y,_) :-</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    write(X),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    write(&#8216; en üstteki diskini &#8216;),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    write(Y),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    write(&#8216; oynat &#8216;),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    nl.</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">oyna(N,X,Y,Z) :-</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    N&gt;1,</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    M is N-1,</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    oyna(M,X,Z,Y),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    oyna(1,X,Y,_),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">    oyna(M,Z,Y,X).</span></p>
<p class="MsoNormal"><span lang="TR">Kod örneği yukarıda verilmiştir. Kodumuzun çalışmasını görüp ardından nasıl çalıştığını açıklamaya geçebiliriz. </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR"> </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">?- oyna(4,a,b,c).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini c oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">c en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini c oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">b en üstteki diskini a oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">b en üstteki diskini c oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini c oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">c en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">c en üstteki diskini a oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">b en üstteki diskini a oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">c en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini c oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">c en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">true .</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">?-</span></p>
<p class="MsoNormal"><span lang="TR">Yukarıdaki çalışmadan da görüldüğü üzere ilk baştaki 4 diskin dizili olduğu a çubuğundan bütün diskler sırasıyla b çubuğuna taşınmıştır.<br />
</span></p>
<p class="MsoNormal"><span lang="TR">Kodumuz, doğru sıra ile oynama yaklaşımı ile kodlanmıştır. Hanoi kulelerinin farklı çözümleri bulunur. Örneğin geri izleme algoritması (backtracking) kullanarak kaba kuvvetle (brute force) bütün ihtimallerin denendiği ve başarısızlık olması halinde en son iyi duruma geri dönen yaklaşımları kodlamak da mümkündür. </span></p>
<p class="MsoNormal"><span lang="TR">Bizim kodlamamızda ise her seferinde doğru çubuktan doğru diskin oynatılması esası kullanılmıştı. Bu yüzden hiç geri oynama veya yapılan hamleden vaz geçme olmamıştır. </span></p>
<p class="MsoNormal"><span lang="TR">Bu oynama esasını daha iyi anlatabilmek için daha ufak bir örnek üzerinden çalışmayı gösterelim :</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">?- oyna(2,a,b,c).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini c oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">a en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">c en üstteki diskini b oynat </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">true </span></p>
<p class="MsoNormal"><span lang="TR"> </span></p>
<p class="MsoNormal"><span lang="TR">Görüldüğü üzere iki disklik bir dizilimde, c çubuğu geçici olarak kullanılmakta, esas büyük diskin b çubuğuna oynanması sırasında, küçük diskleri depolamak için kullanılmaktadır. </span></p>
<p class="MsoNormal"><span lang="TR">Bu durum disk sayısı artsa da değişmez. En büyük diskin a çubuğundan b çubuğuna oynanması sırasında,<span>  </span>diğer bütün küçük diskleri depolamak için c çubuğunu kullanırız. Buradan anlaşılacağı üzere ikinci büyük diskin c çubuğuna oynaması gerekir. Bunun için de b çubuğunu geçici depolama için kullanırız. Bu yaklaşım en büyük diskten en küçüğüne kadar aynı mantıkla işleyerek devam eder.<br />
</span></p>
<p class="MsoNormal"><strong><span lang="TR">8 Vezir Problemi (8 Queens Problem)</span></strong></p>
<p class="MsoNormal"><span lang="TR">Yeni bir problem olarak klasik sorulardan birisi olan 8 vezir problemini ( eight queens problem) ele alalım. Problem basitçe bir satranç tahtasına 8 veziri, birbirini yemeden nasıl yerleştireceğimizdir. </span></p>
<p class="MsoNormal"><span lang="TR"> </span><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAADHmlDQ1BJQ0MgUHJvZmlsZQAAeAGFVN9r01AU/tplnbDhizpnEQk+aJFuZFN0Q5y2a1e6zVrqNrchSJumbVyaxiTtfrAH2YtvOsV38Qc++QcM2YNve5INxhRh+KyIIkz2IrOemzRNJ1MDufe73/nuOSfn5F6g+XFa0xQvDxRVU0/FwvzE5BTf8gFeHEMr/GhNi4YWSiZHQA/Tsnnvs/MOHsZsdO5v36v+Y9WalQwR8BwgvpQ1xCLhWaBpXNR0E+DWie+dMTXCzUxzWKcECR9nOG9jgeGMjSOWZjQ1QJoJwgfFQjpLuEA4mGng8w3YzoEU5CcmqZIuizyrRVIv5WRFsgz28B9zg/JfsKiU6Zut5xCNbZoZTtF8it4fOX1wjOYA1cE/Xxi9QbidcFg246M1fkLNJK4RJr3n7nRpmO1lmpdZKRIlHCS8YlSuM2xp5gsDiZrm0+30UJKwnzS/NDNZ8+PtUJUE6zHF9fZLRvS6vdfbkZMH4zU+pynWf0D+vff1corleZLw67QejdX0W5I6Vtvb5M2mI8PEd1E/A0hCgo4cZCjgkUIMYZpjxKr4TBYZIkqk0ml0VHmyONY7KJOW7RxHeMlfDrheFvVbsrj24Pue3SXXjrwVhcW3o9hR7bWB6bqyE5obf3VhpaNu4Te55ZsbbasLCFH+iuWxSF5lyk+CUdd1NuaQU5f8dQvPMpTuJXYSWAy6rPBe+CpsCk+FF8KXv9TIzt6tEcuAcSw+q55TzcbsJdJM0utkuL+K9ULGGPmQMUNanb4kTZyKOfLaUAsnBneC6+biXC/XB567zF3h+rkIrS5yI47CF/VFfCHwvjO+Pl+3b4hhp9u+02TrozFa67vTkbqisXqUj9sn9j2OqhMZsrG+sX5WCCu0omNqSrN0TwADJW1Ol/MFk+8RhAt8iK4tiY+rYleQTysKb5kMXpcMSa9I2S6wO4/tA7ZT1l3maV9zOfMqcOkb/cPrLjdVBl4ZwNFzLhegM3XkCbB8XizrFdsfPJ63gJE722OtPW1huos+VqvbdC5bHgG7D6vVn8+q1d3n5H8LeKP8BqkjCtbCoV8yAAAgAElEQVR4Ae2dB5gUxdaGDznnnHOQIKBkAUmSJCqCJAVBLlHlqohyVVSCIqigggFFSQpIEiUKglxyFkFykpxzDr/f8fb8M7szy8xO92x373eeZ3equ6tPVb3FzqHqVJ1KcO3atbs3btwQCgmQAAmQAAkESyB16tSS4NVXX707ZMiQYN9hPhIgARIgARKQCxcuSEJyIAESIAESIIHYEEjs/VL+/Pklffr03rcclb5586bcuXPHUXWOWtmECRNKkiRJot523DWmRe/eveu4entXOFGiRJI4sc+fiPdjx6SvX7/umLoGqmiCBAkkadKkgR475r7Tv6P27dsnf7s9PLx9/jreeecdadasmeeh0xJHjhyRS5cuOa3aPvVNlSqV5MqVy+eeEy/wDw1/LE6WjBkzSubMmZ3cBLl9+7bs2bPH0W1A5ZMlSyb58uVzfDsOHjzo8wXstAZ16NBB/vzzT0+1OYXlQcEECZAACZBAKARoQEKhxbwkQAIkQAIeAjQgHhRMkAAJkAAJhEKABiQUWsxLAiRAAiTgIUAD4kHBBAmQAAmQQCgEfFZhhfKiG/Ni2enRo0dlypQp2rzGjRtL4cKFY2zq3r175ccff9Q8LVu21FU7yZMnj/EdPiQBEiABNxCgAfHqxenTp4v3rvwFCxbImDFjJGfOnF65/j+JZarvvfeerF+/Xm9OmDBBDc5nn33m6P00/99CpkiABEggMAFOYf2PDdbLG8YjS5YsevfEiRNy9uzZgPQOHz7sWRONkQo2Ou3evVu+//77gO/wAQmQAAm4hQANiJ+e9N6Nf/LkST85/rmVLVs2KVSokF5g858bdi0HbCwfkAAJkEAUAjQg/wOCECKdOnXSq127dnkwjR8/Xq5eveq59k6sWrVKtmzZoreWLl0qV65ckRw5ckijRo28szFNAiRAAq4kEC8MyOLFi3V6qmfPnoJpKX+CWDvYpm9IsWLFNLl582ZZvXq1cdvzCaMC4wJ56KGHpGjRopquVauW5M2bV9P+fkFXt27dZOjQobJ//35/WXiPBEiABBxBwPUG5P3335e+ffvKtGnT1BAMGDAgqI556623pHLlypr3zTff9DEiCE73+uuvy++//67PoT9FihT31LtmzRp54YUXZN26dbrSC4YEMaMoJEACJOBEAq42ILNnz/YsyTU658CBA3Ls2DHj0udz+/bteo0geiVKlJBPPvlE4Oe4fPmyvPTSS4JVVlji269fP1myZInm7dGjhzRo0MBHT6ALrNbCyq3SpUtrcLhTp05Jnz59AmXnfRIgARKwNQFXGxD8jx97OxAe/bvvvtOOOH78uCDqsD+BTwOSPXt2/ZJ/8MEH5Y033pBMmTKpH+Sjjz7Sqadly5Zpvn/9618yYsQIXX314osv6r2pU6eKv/DZ33zzjYwdO1bzpEyZUqe9cAG/CYUESIAEnEjA1QbkgQceEPg28L/+Nm3aSJUqVbSP4Ido3ry5HDp0SA3MrVu3ZPny5TJu3Dh9/vcpjZ6+xAgDK7FGjhwpTZo0ERzjiHdHjRol2O9hrLwqX768YOSCsnr16qUGB8YLBuLrr7/W0QzOKsFSX5QPvwzEDWd/eGAxQQIkEK8IuHojYYsWLdRPsWjRIv0iX7lypX5hY8UVjAcMwaOPPio4R2Tjxo3a8Xny5JEKFSr4/COAEerdu7f++DzwurjvvvukY8eOglEKdNWpU0fq168vmEYzBAYNe0zmz5+vPpPq1avrO8ZzfpIACZCAkwi4egSCjoADHKOFNGnSaL8UKVJE4Fg3Dm36+eef9QsfRuL++++XhQsXirECK9SOHD58uDrJoQsn8hnGA6FN6tWrJ61bt1bjAb1dunSRwYMHe1ZvhVoW85MACZBAXBNw9QjEgFuqVCkZNmyYwGexbds2NSZr167VaSsjD770H3/8ceMy1p8wItWqVdOT4AwlmNrCyKNmzZp6C1Np7dq1Mx7zkwRIgAQcSSBeGBD0DEYXWJYLRzmmmTC9heCHVgh0R5Vnn31Wzpw5o7exYdHwnUTNx2sSIAEScAoB109hGR0BZ7Wx0xybA2fOnGk8svwTox6szoK0atVKV3hZXigLIAESIAGLCcQbAwKOxigEaSy/PXfuHJKWC5YTnz9/XrJmzapGjCuvLEfOAkiABCJAIF4ZEHxxY6UUBCulZs2apWkrfyGaL4wVBJsTjUi/VpZJ3SRAAiQQCQLxyoAAaLly5TzLdOfOnWs5YxipTZs2aTnYi0IhARIgAbcQiHcGJFGiRB4DAr+ElbGosJEQy4Ih2GiIfSAUEiABEnALgXhnQNBx2DyIUwaxMxybDK0SbFacNGmSqq9UqZLuireqLOolARIggUgTiJcGBAESCxQooKxhQHAaoRUyb948VQvfC0cfVhCmThIggbgkEC8NCIA/8cQTyh3Hzxr7M8zsCBglY3SD0UeZMmXMVE9dJEACJBDnBOKtAcGKKExjQX744QfTO+LixYsyefJk1etvY6HpBVIhCZAACUSYQLw1IAgvkipVKsX9yy+/qD/ETPaGcx4HTWXIkMFM1dRFAiRAArYgEG8NCOgjPDtk+vTpGvxQL0z6hakxCM4WwQZGCgmQAAm4jUC8NiD4YsfhTpAtW7aY1rfwf4wZM0b1mRGg0bSKUREJkAAJmEggXhsQROk1ppeM0OtmsMX+D8MxnzZtWjNUUgcJkAAJ2I5AvDYg6A0rppc++OAD7WjEvsI5IBQSIAEScCOBeG9AcO455N133zWtf40z0XHGCMO2m4aVikiABGxGIN4bkGTJkgmOuMW0k1lihC/B/g8KCZAACbiVQLw3IA0bNpR06dLpMl5j53i4nb1u3TpVgb0mFBIgARJwK4F4b0CMjkVcLDNXYiFoo+GgN8rgJwmQAAm4iQANyN+9ib0aZsnhw4d1NIPlwXXq1DFLLfWQAAmQgO0I0ID83SWYxjJLECLecKKbpZN6SIAESMCOBBLbsVJxVScc/GTsII9tHXDSIYUESIAE4gMBGhCvXsbZHcb5HV63mSQBEiABEvBDgAbkbyjFixeXdu3a+cET+1sVKlSI/ct8kwRIgAQcQIAG5O9OwmFPPPDJAf9aWUUSIAFbEaAT3VbdwcqQAAmQgHMI0IA4p69YUxIgARKwFQEaEFt1BytDAiRAAs4h4OMDuXnzply7ds05tY9SU+z+Tp48eZS7zrpEG5zcBwbtpEmTCtridHF6XyDCgtP/JvBvCEFJnd4XaEeSJEnw4VhBgFhv8TEgp06dkoMHD3o/d1QaZ5xny5bNUXWOWtnLly87ug+M9hQoUMDxfyw408XJfw/oCxjxQoUKGd3i2E9szj1w4IBj629UPG/evI426PiPobdwCsubBtMkQAIkQAJBE6ABCRoVM5IACZAACXgToAHxpsE0CZAACZBA0ARoQIJGxYwkQAIkQALeBGhAvGkwTQIkQAIkEDQBGpCgUTEjCZAACZCANwEaEG8aTNuOwKFDh2Tv3r16SFcwlTt37pzmv3DhQjDZmYcESCAMAjQgYcDjq9YRWLJkiTz11FNSuXJlKVu2rLRt21Zu374dY4ETJkyQBg0aaP5GjRrJtGnTYszPhyRAAuERoAEJjx/ftoDApUuXZMCAATJz5kwxRhJz5swRnPYYk7z99tuybds2zfL7779Lz549ZdWqVTG9wmckQAJhEKABCQMeX7WGwK5du2TDhg2q/JFHHvGcWZ8wYXD/XKtUqaLvXrlyRU6cOGFNJamVBEhAgvuLJCgSiCCBDBkySNasWbXEdevWCUKKQC5evKif/n4hzMXVq1f10cqVK/1l4T0SIAGTCdCAmAyU6u5NYN68eXL69OmAGfPnzy/fffedZMmSRc6ePSslSpTQvEOGDAn4zqhRo+T8+fM+zwcOHCh169b1ued9gfhK3377rezbt8/7NtMkQAJBEqABCRIUs4VPYMGCBfqFjuODy5UrF6OTGw5zGA/IK6+8ogHoTp48KT169IhWERiKL774Qu8///zznueZM2eWlClTeq69E9CPevTu3VuqVasm77//vvdjpkmABIIgQAMSBCRmCZ/A/v37pXXr1rJmzRpdTYXltgsXLgyo+MaNG3Lr1i19Dp9G/fr15e7duzJx4kQ1IniGH1yPGzdOdeIc+kGDBonhK0Eo80AybNgwgUGDYGoM7w0fPjxQdt4nARLwQ4AGxA8U3jKfAL6c8b/+3Llzy6effqoFTJo0SbD0FoYhqvz22296C+GjYRCwIqtZs2aaF+9kzJhRf7p37y7Hjh0T5Ovfv7+kSpVKRyx4+cMPP4yqVq8xdTV06FBNI/w/pshgbL755hs5cuSI33d4kwRIIDoBGpDoTHjHQgLYGGhMN6EYTElhFOEtW7du9dzr3Lmz5MmTRx9jX0fLli0lderUnuw4LKlevXoCvwoMDASjFQhWYC1fvlzTxq+jR4+qDhyeBsEZMsbS3+PHj3umzYz8/CQBEghMwOdAqcDZ+IQEwiOAL3eMKuCw3rhxoxQvXly/4LHCCkYEK6fgj8B1ly5d5PDhw5ImTRr597//7SkYhyNhL8jq1atl9+7dej9HjhxSu3ZtTx4kypcvr6MT6IKf45lnnpFWrVqpwxyjDBzaZQjqAkmRIoVOYZUsWdJ4xE8SIIF7EKABuQcgPjaHAFZDLVu2TLp27SrYFLh9+3apU6eOTklh1/n48eP1x7u0Tz75RAoXLux9S9OVKlUS/AQSTGPNnj1bmjdvLnC8w9+BH0NgdOA4NzYmVqxYUbAJsWrVqkYWfpIACQRBgFNYQUBiFnMIpE2bVj7//HNBmBEIpo7wJY5VVDVr1tR7WDUFYzNmzBjPlJQ+CPEXjMH06dNVV6ZMmfTt7Nmz6/X8+fNl06ZNeg8+EPhiaDxCBMzsJPA3AY5A+M8gogTSpUsnr776qvom4I/AEt3Ro0dL3759dfc5fBqlS5c2pU4YZWCl144dOzQkCgxJwYIF1b9iTIFhesvYtGhKoVRCAvGIAEcg8aiz7dLUMmXKeEYhGGlgtzn8G1iGa5bx8G5rsWLFVDeMBwTTVVj5hVEHVnFRSIAEYkeABiR23PhWmAQ++ugjyZcvn2qBvyJSghVfGH3AYGEklD59+kgVzXJIwHUEaEBc16XOaBBWPb3wwgta2Q8++CBilf7ll190zwc2Jz788MMRK5cFkYAbCdCAuLFXHdImrKTCno5r166pI93qaiPE+4wZM7SYqEt/rS6b+knAjQRoQNzYqw5pU6lSpaRx48Za20jEosK0GQIuYqWXd8wsh+BiNUnAdgRoQGzXJfGrQrVq1dJQJQjFvnjxYssaj82Dxq507G5PkiSJZWVRMQnEFwI0IPGlp23azjZt2ugucIQWwYZCqwTGaefOnaq+SZMmVhVDvSQQrwjQgMSr7rZnYx977DGt2Ndff21ZBadMmaK6jeCJlhVExSQQjwjQgMSjzrZrU7GcFoKwIwiKaLbg8CrsNYFgFzx2xFNIgATCJ0ADEj5DagiTQK5cuVQDzgCxYhpry5YtGnsLhTz11FNh1pavkwAJGARoQAwS/IwzAgkSJNCIuagAzv0wWzZv3qwqCxQoIPihkAAJmEOABsQcjtQSJgFjXwaOsTXiVIWp0vM6ov9CjDDvngdMkAAJhEWABiQsfHzZLAJYzgvBIVDY8GeWIGDj3r17VV3lypXNUks9JEACfxOgAeE/A1sQSJYsmeeMj19//dW0OuGIWmNE89BDD5mml4pIgARoQPhvwCYEcKY5ovRCVq1aZVqtjFVdOGkQB0lRSIAEzCPAEYh5LKkpTALGwU+IjeV97Gw4ajds2KCv582bVzJkyBCOKr5LAiQQhQANSBQgvIw7Ah07dtTC//jjD1mxYkXYFYEhglMegjPZKSRAAuYSoAExlye12YjAgQMHxPCn+Dtb3UZVZVVIwJEEaEAc2W3urHTmzJmlfv362jgjbpU7W8pWkYA7CNCAuKMfXdEKRMg1/CDTpk0zrU0PPvigJUflmlZBKiIBhxKgAXFox7HawRPA+R84AZFCAiRgLoHE5qqjNhIwh8CyZcvCXjV1584dcypDLSRAAn4J0ID4xcKbcUWgWrVqMnnyZLl165acO3fOlGokTsx/5qaApBISiEKAf1lRgPAybgm0b99e4Ew3wo+YURseIGUGReoggegEaECiM+GdOCbQoEGDOK4BiycBEgiGAJ3owVBiHhIgARIggWgEaECiIeENEiABEiCBYAjQgARDiXlIgARIgASiEfDxgWTJkkXy5csXLZNTbiDuEc6/drIgrLmT+8Bgf/z4cbl9+7Zx6cjPVKlSOb4vsJQZIV2cLthk6oa/C3w/3bx507HdgWOnvcXHgGC5I77AnCr4Y7l+/bpTq6/1dnofGPDxR+LkPxS0AwbEyX8PaAOMuNP/JtAOiNP7Am3A8nQn98fdu3fRDI9wCsuDggkSIAESIIFQCNCAhEKLeUmABEiABDwEaEA8KJggARIgARIIhQANSCi0mJcESIAESMBDgAbEg4IJEiABEiCBUAjQgIRCi3lJgARIgAQ8BGhAPCiYIAESCETgyJEjMmrUKHn55ZcFZ9bfS7BUdf78+dKjRw/56aef5MqVK/d6hc8dSMBnH4gD688qkwAJWEzgyy+/lBkzZsiJEye0pBUrVsgnn3wi5cqV81syNpsNHjxYfv75Z32+Zs0aWb58ubzxxhs82MsvMefe5AjEuX3HmpOA5QT++usvmTBhghqPUqVKaXkYXVy4cCFg2ZcuXfIYD+OdhQsXypgxYwK+wwfOJEAD4sx+Y61JICIEzpw5o7unUViuXLlCLtP7HbMOCAu5EnzBMgI0IJahpWIScD6BMmXKSKVKlbQh8GkYMnHiRCMZ7XPLli2ee8Y7+fPnl27dunnuM+EOAvSBuKMf2QoSCIkAYmTBCMC5jfhrnTp1kkSJEvnVMXz4cMFRw/BtIB7VtWvXZOPGjbJ69WqPcTFexLOvv/5aL5MmTaqxuFDWoEGDBMFa/QniK/34449y9OhRfdymTRtJly6dv6y8ZzMCNCA26xBWhwSsJoAgl2+99ZbMmzfPUxSMSMeOHT3X3gn4PPAlnz59eo3sW6tWLVm/fr2888476kzH6AIC49G9e3fZunWrGqOpU6fKZ599JnPnzo0xgKChS5X8/Wvp0qX6Ho2IQcS+n5zCsm/fsGYkYAkBfKEbxiNDhgxaBhzlly9f9lve9OnTdfSBh2nSpJF+/fpppOJjx45J79691ZDs2LFDevXqJZi+wkgGeZo2berR991333nS3gkYs7Fjx+otRD/GqGXXrl063RU18qv3e0zbgwANiD36gbUggYgR+OGHHzxlPfbYY5qGg/uVV16Rixcvep4ZiSVLlmgya9as+tmyZUudpkqdOrVOO82aNUvatWsnmzZtkoQJE6rxGDhwoOZt1qyZfv7+++8Ch7y3ILQ59pZgKgxSsWJFyZ07t6ZhRGhAFIWtf9GA2Lp7WDkSMJ9AtmzZPEq/+uoryZMnj16vWrVK+vfvL7t37/Y8nzlzpo4qEiRIIG+++abnfqtWreSXX36RJ554Qv0j8JHgB3s/DOOBzJUrV5a0adMKDhjDSOPw4cOqAxsTsZdk/Pjxeo06/Prrr7J37169NoyVXvCXbQnQB2LbrmHFSMAaAjAS+N8+fBT4wsZpf61bt5bJkycLNglitFCkSBEtfNu2bXowWLFixQTObW/B6qwpU6Z434qWxiquFi1ayLfffiuYxlq0aJEuB4YBgVGBVK9eXT+x5wSO9iZNmkjz5s11NKMP+Mu2BGhAbNs1rBgJWEMAznCMHDBd1KdPHzUiyZMn15EDnN6HDh3SVVZG6UWLFtXRhnEd6ufIkSMFU2SY6sJudmNHe8qUKeXpp5/WqS0YLwjq9cwzz4RaBPPHEQEakDgCz2JJIK4JVKlSRaelEGIETnCMMtauXSt//vmn7j5H/bCqCqusMmfOHOvqYgoLTno43UeMGKFLh2GwEFcLfpCyZcuq7vbt20uHDh1iXQ5fjDwBGpDIM2eJJGAbAg0bNtSpKwRIhO8CjvDs2bMLluqaKXC4Fy5cWD7++GMftdhciNVf8Ms8+eSTOp3mk4EXtiZAJ7qtu4eVIwHrCTz77LNaCHwfWLIbKYHPA058CJb8wnBRnEWABsRZ/cXakoDpBOAMh7Mby2axwRDTSlaLd1kYfXjvGbG6bOo3jwANiHksqYkEHEkAu9ANxzVGIViea7WcP3/eM/rAqqscOXJYXST1W0CABsQCqFRJAk4jULJkSYGfAjJ79mzLq2+UgSXEDzzwgOXlsQBrCNCAWMOVWknAUQSwtBebAyHY24GVWFYJpq9wPggEh1JhTwrFmQRoQJzZb6w1CZhOAFNJkFOnTsmGDRtM128oxOZFYwd648aNjdv8dCABGhAHdhqrTAJWEIAzu0KFCqo6UPBDM8qdNGmSqsmYMaNUrVrVDJXUEUcEaEDiCDyLJQG7EUAkXMMfgZDq2FxoheCMdUjx4sU1RLwVZVBnZAjQgESGM0shAUcQqFGjhtYT55qvXLnSkjpjigxilGVJIVQaEQI0IBHBzEJIwBkEsFvccGobZ4aYWfPRo0frwVNY8cW9H2aSjRtdNCBxw52lkoAtCeAwKMMPgvAmZ8+eNbWeWH2FVViYKsOUGcXZBGhAnN1/rD0JmE7ACG6Io2nNNiDLly/X+hplmF55KowoARqQiOJmYSRgfwJ58+b1HDI1Z84c0yr83//+V088xKmFiARMcT4BGhDn9yFbQAKmEsiUKZNgiS1k8+bNpunGqq6rV68KTjc0DqwyTTkVxQkBGpA4wc5CScDeBB555BGt4Pz58wVxq8wQHFQFqVu3rhnqqMMGBGhAbNAJrAIJ2I0ATiuEIOT6jRs3TKmesfvcOIPdFKVUEqcEaEDiFD8LJwF7EsAJhEZwRXvWkLWyAwEaEDv0AutAAjYjgF3iRoh1nJMeruzbt08uXLigah5//PFw1fF9mxCgAbFJR7AaJGBXAmYs5V2zZo2cPHlSm4gz0inuIEAD4o5+ZCtIgARIIOIEEke8RBZIAiTgCALGTnHs3+jXr19Ydd6+fXtY7/NlexKgAbFnv7BWJBDnBNq1ayevvfaarF27Vn/MqFD58uUFR+hS3EGAPemOfmQrSMB0AqVKlZLSpUvr7nGzlHft2lUQb4viDgI0IO7oR7aCBEwnkDNnThk7dqzpeqnQPQToRHdPX7IlJEACJBBRAjQgEcXNwkiABEjAPQRoQNzTl2wJCZAACUSUgI8P5MqVK6YFTotoK/5XWJIkSSRdunRxUbRpZSLUtVnB60yrVCwUpUqVSg8OisWrtnkFUWOd3hc4vMnpfxP4B+GWv4sUKVJIsmTJbPNvPNSKRF0A4WNA8Mdy/PjxUHXaJj+cfk6P33P58mU5fPiwbZjGtiIFChQQGHQny5kzZxz99wD2+IMvVKiQk7tB6379+nU5cOCA49uBs1aSJ0/u2HZEXYLNKSzHdiUrTgIkQAJxS4AGJG75s3QSIAEScCwBGhDHdh0rTgIkQAJxS4AGJG75s3QSIAEScCwBGhDHdh0rTgIkQAJxS4AGJG75s3QSIAEScCwBGhDHdh0rTgIkQAJxS4AGJG75s3QSIAESCJrAihUrpFWrVlKuXDn9adu2rWDvWEzy0UcfefLjva1bt8aUPaRnPhsJQ3qTmUmABEiABCJGAJu8W7RoIVevXvWUuWfPHsGGV0R+8Cd//fWXfP755z6bkx999FH56aefBOH6wxWOQMIlyPdJgARIIAIE7ty54zEeL774YlAl3rhxQ27duqV5e/fuLThlEgYHIxkzhAbEDIrUQQIkQAIWE0BsNiM80PDhwz2lLVu2zJOOmti5c6cnHM/HH38sMCiIxVWxYsWoWWN1TQMSK2x8iQRIgATMI4A4hEePHpXTp08HVJo9e3YZPXq053maNGk0PWLECDlx4oTnvpGAsTAMTeXKlSVt2rT6qEGDBlK2bFkjW7RPTJWhLsHERaQBiYaPN0iABEggcgQOHjwoNWvWlGLFiunIYPXq1QELhxPckH79+ulo4s8//5S33norWvTrIUOGyJo1azT7Qw895PGTeOswdBmfGM3AN4K64LNv374xHmlMA2KQ4ycJkAAJRJjAoUOHpFmzZgJnOOTkyZPy3nvvBazFsWPHPM9q164t1atX1+vx48fLp59+qiMRjDwGDhwoEyZM0GdwvA8YMMDzXkyJ5cuXCyIfQ/D52WefybfffhvwFRqQgGj4gARIgASsJYAvehiPSpUqydNPP62FbdiwQZYsWeK34IkTJ+r9MmXKyH333ScwHBUqVNB7r732mjRs2FCaNm0qQ4cO1SmojBkzqkHCMRf58uXTfD/88INf3ZgGGzNmjD7D8uA8efJo2ijT30s0IP6o8B4JkAAJRIAAjAUEI4+NGzdqGqukYEyWLl2q18YvTG0tWLBAL2FwcFAY/CKzZ8+W1q1b66Fbu3bt0hVW8Hf06NFDMKIoUqSIvgOjAMGU18yZMzVt/Fq5cqXgueFLwcotY/WWkcffJ/eB+KPCeyRAAiQQAQLwY3Ts2FH27t2rpWXJkkWw2gpf5B06dJBGjRoJpqogkyZNklOnTglGFb169dJ7+JUtWzb5/vvv5fXXX/f4QXBoVeHChT15kICBwIhl7dq16jPBVBcEe0UwYvHeXzJlyhR9hv0l9erV07S/XzQg/qjwHgmQAAlEgAD8E5iCmj59uhqACxcu6Ghizpw5aixgNPDjLVhZVbp0ae9bmi5ZsmS0e943MmXKpIYDRgnTZl26dPF+rAYHp7r+9ttvev/hhx+WL774QnLkyOGTz/uCU1jeNJgmARIggQgSwGgDvoannnpKihYtqo5rTFVho9/gwYM9ow9UqU6dOuobMaaiYlNN+EimTZsm3bp187yO8l966SWdHjOmsKpWrSpTp87RU3gAACAASURBVE6N0XhAAUcgHoxMkAAJkEDcEMiQIYOMHTtWV1Xt2LFD4BDHNNIrr7wit2/f1krhfPuECcP/P/9jjz2mIVFGjhypemHEcNY5nOUoG/Lqq68GdXZ7+LXR4viLBEiABEggHAKYlsIKKghWSm3ZskUNBnaf48cM42HUz9jVDr0wHvCHDBo0SH0o1apVE/wEIzQgwVBiHhIgARKIAIFhw4Z5nN+IohspmTx5sq7OQnkY9WC0E4zQgARDiXlIgARIIAIEsmbN6omSi70g586ds7xUhIM3Qp7AcV6lSpWgy6QBCRoVM5IACZCA9QSee+45DTuyb98+XXZrdYlY1rt582YtBlF+EbE3WKEBCZYU85EACZBABAiUL19e6tatqyUtWrTI40S3qmhjpzk2JZYoUSKkYmhAQsLFzCRAAiRgPYHHH39cC5k1a5Zs2rTJsgLPnj2rGwtRQOfOnQVTaKEIDUgotJiXBEiABCJAACOQvHnzaknYZGiVIKSJMX3VpEmTkIuhAQkZGV8gARIgAWsJIPihcegTDoKySnC0LQThUrCRMVShAQmVGPOTAAmQQAQIGDGwLl26JAh2aLbg8Cpj42CNGjV0P0ioZdCAhEqM+UmABEggAgTat2+vgRLv3r0bLTKvGcUfOXJEtm7dqns+sHw3NkIDEhtqfIcESIAEIkAA8a8gRhh3M4s09n4g7tWDDz4YK9U0ILHCxpdIgARIwHoCxtnl69evN7UwnPWByL8QhIePrdCAxJYc3yMBEiABiwngLI5kyZLJlStXZO7cuaaVhqi7M2bMUH2dOnWKtV4akFij44skQAIkYC2BggULqnMbIwbj0CkzSjx48KCqwWovRAKOrdCAxJYc3yMBEiCBCBBo06aNljJu3DjTSjN2n+O423LlysVaLw1IrNHxRRIgARKwngBOCYQcPnzY9MKKFy8elk4akLDw8WUSIAESsJbAs88+qwUgau7OnTvDLgz7Sr799lvV8+ijj4aljwYkLHx8mQRIgASsJZA2bVotAKHdV61aFXZh2Fdy8eLFsPVAAQ2IKRiphARIgAScQQAOeQiW7xYrViysStOAhIWPL5MACZCA9QRiu1PcX83ef/99vZ0pU6awDUhifwXwHgmQAAmQgD0I4Pxy7BRfunSpnDx5Uvbv3x9Wxcw85ZAGJKyu4MskQAIkEDkCL730kuDHLsIpLLv0BOtBAiRAAgEIGEt5AzyO1W0zdHIEEiv0fIkESIAEIkcApwWGetzsvWoXm/M/ouqkAYlKhNckQAIkYDMCiRIlkmrVqtmsVlzGa7sOYYVIgARIwCkE6ANxSk+xniRAAiRgMwI0IDbrEFaHBEiABJxCwMcHkiZNGsmcObNT6h6tntevX5dr165Fu++kG1jz7eQ+MFifP3/eSDr20y19cerUKcf2gXfF3fB3gThU+HGqGLvYjfr7GBDEhg/ndCpDaVx94oxfJ3cOuKVKlUpy5coVVwhNK3ffvn1y8+ZN0/TFhSL8LWC3rpPl9u3bsmfPHic3QeuOQ5Xy5cvn+HbgHA4n/ycX/568hVNY3jSYJgESIAESCJoADUjQqJiRBEiABEjAmwANiDcNpkmABEiABIImQAMSNCpmJAESIAES8CZAA+JNg2kSIAESIIGgCdCABI2KGUmABEiABLwJ+Czj9X7AtHMJYN3/d99952nAU089JenSpfNc+0tMnDhRzpw5o48qVaokFStW9JeN90iABEjAQ4AGxIPCHYnTp09L06ZN5Y8//vA0aNeuXTJy5EjPddTE3LlzpUePHoKzkiFYcz979mypXLly1Ky8JgESIAEPAU5heVC4I/Hmm2+q8UicOLHUqFFDGxV180/Ult65c0eNR7ly5SRDhgyCHf1t27aNmo3XJEACJOBDgAbEB4d7LhD2YefOndqgy5cvS0xG5MKFC5pv48aNrtjt655eZEtIwN4EaEDs3T8h165FixaSNm1aOXbsmP5AwfTp02XHjh1+dcG4eE9vbdq0SRADqkOHDn7z8yYJkAAJGARoQAwSNv/csmWLtG7dWn8WLFgQsLZ16tSRunXr6vMHH3xQChYsqOknn3xSp6aivghfx9atW/X2E088oZ/wgbz11ltRs3qujx8/Lu3bt9e6fPPNN577TJAACcQvAjQgDuhvfMG3bNlS4OzGT5cuXQKOKLybkzVrVjUEKVOmlP3798u7777r/VgWLlwoffv21XuPPPKIVK1a1ed5oAsYox9//FHr8vLLL8vXX38dKCvvkwAJuJgADYjNOxcO7ubNm8vRo0cF4fZz5swp586dkw0bNvitOaakEJXYEIwUatWqpZfDhw+XevXq6Zd/9+7d5ZlnnlFdOXLkkEGDBsl9990nSZIkUX/J3r17DRU+n4gmunv3br1XrFgxHdX069dPli1b5pOPFyRAAu4nQANi8z7G0lpMGUHw5Z89e3ZNv/jii/LTTz9p2vvXr7/+KqtWrdJbXbt21U/s8TCMCJ7BqOAezuyA8Zg1a5ZUqFBB6tevLwjpjzDsw4YN81araRiPxx9/XN+DnwT7SyAITw2jRiEBEohfBGhAHNTf06ZN84w8cO5J586dBaMKLLuFXL16VUaMGKFpbARs1KiRprGJEL6OKVOmSK9evaR06dLqJ8GoA74VGA9DevfurcmZM2fK9u3bjdv6PoyH4YyHYevfv7/nORMkQALxjwA3Etq8zxMlSiSYThoyZIh8+eWXWtv8+fPLjRs3dKoKzm4YEYwI8KVuHKj16quvStKkST2tw0FVcJLjByMG6MV0VVSBURg8eLDqwT4SI8+VK1c8S4Gfe+45GT16tI5UateuLfhp2LBhVFW8JgEScDkBGhAHdDD2dMBI4It//Pjx6hDH6ANf6hhZwO/hvYu8Z8+e6jcJ1LTkyZMHeqRGZ968efq+9xHBMDjly5fXUUe3bt3UeOC0PoxUKCRAAvGTAA2Ig/p94MCBgs1+CFMCX8fy5ctl0qRJ8sUXX3imsbCMt0SJEmG1CjouXrwoixcv9izxxXGiCJHSpk0b9clgxDNjxoywyuHLJEACziZAA+Kg/kOYkeeff14whYRpLYxGsIzWcJab3RRjesrQu3btWpkzZ45eNmjQQMqWLWs84icJkEA8JEAnusM6HZsJMRKAfPLJJ4LgiZGSDz/8UBD2JEuWLHSgRwo6yyEBGxOgAbFx5wSqGnwc2BOCZbVjx44NlM3U+wj1vm7dOtWJTY3333+/qfqpjARIwHkEaECc12c6dYRNfBD4QrBvw2qBrwVh4SHYiU4hARIgARoQh/4bMDbxwScB34SVggOqPv30Uy2icePGuo/EyvKomwRIwBkEaECc0U/RatmqVSspVKiQ3sdOcisFmweNTYVw2uOsEQoJkAAJ0IA49N8AAiQaJwZ+/PHHnk1+VjTno48+UrWFCxeWvHnzWlEEdZIACTiQAA2IAzvNqDLiW2E/BkKYWBXMEHG4Nm/erEWWKVNGsHmQQgIkQAIgQAPi4H8H3tNYCM1uhSAMvOE8f+GFF6wogjpJgAQcSoAGxKEdZ1QbS3oh2KNhhRh6Eeo9d+7cVhRBnSRAAg4lQAPi0I4zqp0+fXoNjIhYWGZvKkTARoR8h3D6yiDOTxIgAYMADYhBwqGfCLGOTYVGoEUzm3Ho0CFBYEXI008/baZq6iIBEnABARoQF3SicZY5NvuZKYY+nCeCkQ6FBEiABLwJ0IB403BoOk+ePFrzAwcOmNoCQx/8HyVLljRVN5WRAAk4nwANiPP7UKeXcF4HprGMFVPhNstbF41HuDT5Pgm4kwANiAv6FWHeIYiU+9tvv5nSIpwHsnTpUtWF0O0UEiABEohKgAYkKhGHXleqVElrvnLlSlNbgNDtBQsWNFUnlZEACbiDAA2IO/pRqlWrpi1ZsmSJKS3CGeyQbNmySZEiRUzRSSUkQALuIkAD4q7+ZGtIgARIIGIEaEAihtragqzyU1il11oa1E4CJBAJAjQgkaAcgTKMlVLHjh2TFStWhFXinTt35MSJE6rD0BuWQr5MAiTgSgI82MFl3Xr58mXp0aOHZM+ePdYtgwGxKjhjrCvFF0mABGxHgAbEdl0SfoUQft0IwR6+NmogARIgAf8EaED8c3Hc3WTJksngwYNl/fr1ptUdIUzq1q1rmj4qIgEScBcBGhCX9GfChAmlV69eLmkNm0ECJOAEAnSiO6GXWEcSIAESsCEBGhAbdgqrRAIkQAJOIEAD4oReYh1JgARIwIYEfHwgt2/flps3b9qwmsFVCX6AJEmSBJfZprnQBif3gYEV0YHdIE7vCyzJdvrfBP4d4d+T0/vCaIeT+yNBggQ+f9Y+BgSbx/bt2+eTwUkXOXPmDGv/gx3ain0cTu4Dg2GBAgUc/8V15swZx/cFvngLFSpkdItjP69fv+74vgD8vHnzSvLkyR3bD0mTJvWpO6ewfHDwggRIgARIIFgCNCDBkmI+EiABEiABHwI0ID44eEECJEACJBAsARqQYEkxHwmQAAmQgA8BGhAfHLwgARIgARIIlgANSLCkmI8ESIAESMCHgM8yXp8nsbi4evWqvoW1wsEsVbtx44Zg7wkEwQCxB4JCAiRAAiTgDAKmfWPjLO7q1avrT8OGDe8ZTvz48ePSpk0bzzv/+c9/5PDhw86gxlqSAAmQAAmIKQZk7dq10q9fPw/Oixcvyvvvv++59pf46quv5MCBA55HCxYs0GiyeJdCAiRAAiRgfwKmGBDsnL5165Zgl2L58uVDanWuXLnkySef1Hf++usvuXbtWkjvMzMJkAAJkEDcEDDFgGTOnFlj1cCnsW7dOm0J/CEXLlzw2yr4PU6fPq3PMG31/fffazpjxoyOD3/ht8G8SQIkQAIuJHBPA4Iv+OXLl8fY9Nq1a8tjjz3mkwfTU/Pnz/e5Z1xs375dli5dqpcdOnTQz0yZMsnw4cMlffr0RrZon7///rv897//5SglGhneIAESIIHIEwhoQI4dOybPPvusdO7cWV544QVNx1S9bNmy6WOMRpo1a6bpkSNHRjMid+/elTFjxuhzHJlaqVIlTWfPnl0KFiyoaX+/5syZIz179tS6tG/f/p5Oen86eI8ESIAESMA8AgENyNSpU2Xjxo1y6tQpwZf+5s2boxkD72rs3LlTL+EDee+99wTRWDGN9c477wgc5JDdu3fLgAEDZNmyZXqNM7wffPBBTW/dulXL0gs/v+bOnav68Gj//v3y/PPPuyK8s5+m8hYJkAAJOIKAXwOCaauff/5ZG9C9e3d1juNcgREjRuiXt7+WGdNcjRo1kmLFism4ceM0G5ziMBqPPPKIdOrUyaMXU14Y3eTIkUPy5MmjeWFE/MmsWbM8vpVRo0YJRi6XLl2SSZMm+cvOeyRAAiRAAhEg4NeAYFWV4eT+8ssvPSurcF7I6NGjoxmR119/XXCOBVZhVahQQatdtWpV2bFjh+71gPE5d+6cIKY/Ngxi5DFlyhRN58uXT4oWLarvTJw4UQ2D0W68N3v2bBk0aJBntNGnTx+Pc54rtgxS/CQBEiCByBPwuxO9WrVqAj8DprHwJb1ixQqpUqWKrFy5UhYtWiRwZmOzYJMmTeS3337zOMSbN28ulStX1lZgVzkMA0YJ+Pniiy+kSJEiUqtWrWitxCZCbESEwenWrZuOTLCbHb4SONwh2NmOusAIwVDhOtQlw9EK5g0SIAESIIFYE/BrQKANPoamTZtKjx495OTJk7Jp0ybBF/2HH36o15iiMqapkD937tye5bi4jipdu3aNestzXbNmTXn77bd1qgsG4+WXX/Y8S5w4sZQqVUpPVZs2bZoaDoxIHn74YU8eJkiABEiABCJPIKABQVXgCIfPARv94BCHUx1Lc7HLfNeuXZ7aYiSA0ULU83I9GYJIvPbaa1K6dGmdrjJ2o6dOnVr69++vRqN+/fqqBUaNxiMIoMxCAiRAAhYTiNGAoGwYkbZt28r48ePl119/lb59+8rMmTMtqRamxPDjLZi2evTRR/VWiRIldCmv93OmSYAESIAE4oaAXyd61Kpg/wX2aVy5cuWeMa6ivhvuNZb8Ll68WNXAkKVKlSpclXyfBEiABEjABAJBGRD4IZ555hktDk50Yx+HCeXHqAKjj3fffVfzYGlwjRo1YszPhyRAAiRAApEjEJQBQXWw6ipv3rzqCxk6dGhEaoiwJcboAyFPUqZMGZFyWQgJkAAJkMC9CQRtQFKkSOFZNosNf5E4uwN7QCCFChUSxNuikAAJkAAJ2IdA0AYEVW7Xrp3WHBsNvZfwWtEcbEz87LPPVPUDDzygez+sKIc6SYAESIAEYkcgJAOCXePGclr4QrBT3CoZMmSIIDw8wpa0atXKqmKolwRIgARIIJYEQjIgKMOIngsDgn0hVsnChQtVNaL8YikxhQRIgARIwF4EQjYgZcuWFfhDIEbARbObdPbsWcExuRDjtEKzy6A+EiABEiCB8AiEbECwEssImIg4WIhNZbZ8/vnnGkI+TZo0Hse92WVQHwmQAAmQQHgEQjYgKA6h2SGYxtr/99kcZgvORofAWOXMmdNs9dRHAiRAAiRgAoFYGZD77rtPndsof8+ePSZUw1fFhAkT9Ab2nlBIgARIgATsSSBWBiR//vxSuHBhbRHO9TBTJk+erGeLJEqUSEcgZuqmLhIgARIgAfMIxMqAoPiWLVtqLRCVFzGyzBIcoXv79m3d94FDqSgkQAIkQAL2JBBrAwIHNwSHTeG0QbPEWH3Vpk0bs1RSDwmQAAmQgAUEYm1AcIBU5syZtUrGeehm1O+XX35RNThxkEICJEACJGBfAmEZkCxZsmjLsJzXDFm/fr2cP39eVfG4WjOIUgcJkAAJWEcg1gYEVTL7bA4Eabx06ZK2FqcTUkiABEiABOxLICwDYsSoQtgRHHlrlqRPn94sVdRDAiRAAiRgEYGwDIhRpx07dsitW7eMy1h//vDDD/pu8+bNwzpfPdYV4IskQAIkQAJBEzDFgARd2j0y7ty58x45+JgESIAESMAuBMIyIHB046x0CgmQAAmQQPwjkDicJqdNm1aSJUumKhBgMWHCsOyR4KAqCgmQAAmQgDMIhGVAvJsIP4hZUrx4cbNUUQ8JkAAJkIBFBMI2IDja1uyTCVOnTm1Rc6mWBEiABEjALAJhGxCz94KY1TDqIQESIAESsJZAeE4La+tG7SRAAiRAAjYmQANi485h1UiABEjAzgRoQOzcO6wbCZAACdiYgI8PJGPGjJIrVy4bVzfmql2+fNkTjDHmnPZ9miRJEkf3gUEW57qYvbjC0B2pT0SEdvLfAzjdvXtXDh8+HClklpWDA+ac3heAg6MvcN6RU+XmzZs+VfcxINjT4WSnOCL5wog4WcDfyX1gsD9x4oRE/cdmPHPKp9P/HsAZX1ZHjhxxCvKA9URfuGHT8unTp+XatWsB22n3B1H/U8gpLLv3GOtHAiRAAjYlQANi045htUiABEjA7gRoQOzeQ6wfCZAACdiUAA2ITTuG1SIBEiABuxOgAbF7D7F+JEACJGBTAjQgNu0YVosESIAE7E7AZxmv3SvL+pEACZBAbAlgafnkyZNly5Ytuqekb9++kiJFioDqsNx2+PDhcuDAAbnvvvukUaNGUrhwYcGeFMo/BGhA+C+BBEjA9QQOHjwoTZo08Tlz6MqVK/Lee+8FbPuiRYt8nr/55pvy8ccfy9NPPx3wnfj2gFNY8a3H2V4SiIcEcOwEDqzDiCNbtmxKYPfu3TGSmDhxoj7PkiWLlCxZUtNDhw519E7yGBsci4c0ILGAxldIgAScSQA7qW/duhVS5ZHf2D3+119/aXiYkBS4ODMNiIs7l00jARL4h0Dnzp2laNGicv36dUE4EciKFStk586d/2SI8vvChQueGGJnz56VPXv2aI7BgwfTB+LFigbECwaTJEACziKwadMmGTVqlFSqVEmmTZsWsPI5cuSQunXr6vNMmTJJ3rx5NW5enz59BMYiqrz99tuyceNGvd2zZ0/9bN26tfTo0UMSJEgQNbteY4oM+kqUKCGff/653zxuu0kD4rYeZXtIIJ4Q+Oqrr6RevXrSr18/+fPPPwWrqoyRQkwIcufOLV26dNEsy5Ytk1atWgkc6ob8+OOP8s033+gldNauXVvTM2fOlIsXLxrZon0+++yzgjodOnRIXn75ZenUqVO0PG67QQPith5le0ggHhBAlOEhQ4aobyJx4n8Wk548eVLGjBnjt/VXr16V0aNH67NXXnlF/vOf/0jNmjX1GlNZWKE1cOBAqV+/vnTo0EFu3Lgh+fLlk27dunmmrDD9FSjC9I4dO3S5LxQaBuenn36SdevWaRlu/UUD4taeZbtIwMUEsEIK+zogVapUkWrVqml66tSpsn79+miO8iVLlqjzG3s4UqZMqdNQY8eOla5du0ratGll7dq1ghVWK1eu1GfY94FlvAUKFJBSpUp5QsnDaEWVbdu2SbNmzeT48eP6CHtFcK4PDI4xDRb1Hbdc04C4pSfZDhKIRwSqVq0qadKk0RZjGsqYWoJRqVWrlgwYMEAwIoFgI6DxxV+2bFn9ssf9/Pnzq68CxgMjl+LFi6v/AsYJRqFQoULIpp8YlUC+/PJLmTRpkqZxaNqaNWvk8ccf9zlz5YsvvtCRSsKECdU4aWaX/vpn7OfSxrFZJEAC7iSA/+XjixqjBvwvf/PmzYITJHHwFA6WGzlypMBnUb58eZk9e7Z+oWOqq3///tGAYHUWfrBSK5DAkf7zzz+rYUF6wYIFsmHDBtm/f7++AmNWsWJFHbXgBkYtr776qk6NaQaX/uIIxKUdy2aRgNsJPProo4KpKWOVFAwEfBbt27fX0Ql2n0+fPl2NB0YTc+fOlRYtWsQKC/whgwYN0lEL/C/QaxgPrLrq1auXToNBOVZ8LV682PXGA23lCAQUKCRAAo4kgCW1cIhj5RQ2+c2YMUP3d7z44oueaS00DAYAS3fDkebNm+uIBst1vQW71J977jldDpwzZ0754YcfdDTkncetaRoQt/Ys20UC8YRAqlSp9AscS2exMfC7777TEYEVzccSYPx4C/aizJo1S291795dp6+8n7s5zSksN/cu20YC8YQA/BeNGzfW1mJjoeFAj0TzEbH30qVLOspp27ZtJIq0TRk0ILbpClaEBEggtgTg/3jppZf0dWwq3Lt3b2xVhfQeVmth6TAERgyBF+OT0IDEp95mW0nAxQSwRLdhw4bawvfffz8iLYUTH/s9sF/kySefjEiZdiqEBsROvcG6kAAJxJoA9l3UrFlT30dcLIwOrJQzZ87IJ598okVgJVb27NmtLM6WumlAbNktrBQJkEBsCLRs2VKKFCmir86fPz82KoJ+B6u+MF2WNGlSwaqv+Cg0IPGx19lmEnApAfggSpcura3D6ACjBCsEe0EQOwvywAMP6PJeK8qxu04aELv3EOtHAiQQEgEjCi4c6fc6dTAkxV6ZYZiw3wOCOFjxVWhA4mvPs90k4FIC999/v4YmQfOMsOxmNxV7TSCpU6fWs0jM1u8UfTQgTukp1pMESCAoAhkyZJBy5cppXuwaDxSCPShlATIZYUwQkBHxtuKr0IDE155nu0nAxQQQdgQyb948PXnQzKZi2e64ceNUZceOHc1U7ThdNCCO6zJWmARI4F4EcKiTEY79008/vVf2kJ7jvBHjXHUcjxufhQYkPvc+204CLiWQIkUKPdQJzfN35nk4zcaoBoLgjE2bNg1HlePfpQFxfBeyASRAAv4I9OnTR28PGzYs2gmF/vIHew9LeCHVq1f3GKlg33VbPhoQt/Uo20MCJKAEMArB7vQ7d+7IlStXTKOCQ6wglStXNk2nUxXRgDi151hvEiCBGAnAkY7zOSAjRoyIMW+wD8+dO6dZcba6caRusO+6MR8NiBt7lW0iARKwhADORL9165ZgqfBjjz1mSRlOUkoD4qTeYl1JgARCImAcYXvo0KGQ3mPm4AjQgATHiblIgAQcSKBgwYJa6/Hjx5tSe+OckdatW5uiz+lKaECc3oOsPwmQQMQITJ48WcuKeqxtxCpgs4JoQGzWIawOCZCAeQSKFi2q4dbN00hN3gQSe18wTQIkQAJuIoC9GilTptRwJiNHjgy7aQhjQvl/AjQg/8+CKRIgAZcSQEDF559/3rTWJUiQwDRdTlZEA+Lk3mPdSYAE7kmgX79+em75PTMGmSFx4sTSo0ePIHO7OxsNiLv7l60jgXhPgF/21v0ToBPdOrbUTAIkQAKuJkAD4uruZeNIgARIwDoCNCDWsaVmEiABEnA1AR8fyLVr1+TSpUuObTCcWzij2MmCNji5Dwz2iISaLFky49KRn1hp4/S+uHv3ruP/JvCPB8ELnd4XaAf+JvA37lRBdGNv8WnJ2bNn5ciRI97PHZVG5E2nG5DLly/L4cOHHcXdX2ULFCjg+LMSzpw54+i/B/QLvniNk/n89ZNT7mH/xYEDB5xS3YD1xCFUyZMnD/jc7g+SJEniU0Vfc+LziBckQAIkQAIkEJgADUhgNnxCAiRAAiQQAwEakBjg8BEJkAAJkEBgAjQggdnwCQmQAAmQQAwEaEBigMNHJEACJEACgQnQgARmwyckQAIkQAIxEKABiQEOH5GAGQROnTolmzdvlhMnTgSl7vbt25p/x44dQeVnJhKIKwI++0DiqhIslwTcSAD7SH7++WeZPn26/PXXX4J9Si+88ILUrl07YHMPHjwoAwYMkN9//12wGbNGjRryyiuvSNq0aQO+wwckEFcEOAKJK/Is1/UEZs6cKSNGjFDjgcZik+5XX30VY7vnz5+vxgOZrl69KrgeNmxYjO/wIQnEFQEakLgiz3JdT+DXX3/1tLFbt26aPn36tOdeTIl06dJJyZIlNcvixYtl9+7dMWXnMxKIEwI0IHGCnYXGBwJPPvmkp5njx4/3pGNKbNu2TR+fP39etm7dI8Sz/wAAB6BJREFUqukSJUpI/vz5Y3qNz0ggTgjQgMQJdhbqdAJ79uyRr7/+WhCANJA0aNBAGjdurI/LlCmjnxiBzJkzx+8rf/zxh6xYscLnWdasWaV///4xBuDDCAU6ETiRQgKRJEADEknaLMvxBPbv369O7datW8uoUaPkX//6l2DVlD9BIEPDcDz88MNSq1Yt/ZKHT+PPP//0eeXWrVt6Zjd05ciRQ5577jl9ni1bNsmXL59PXuMCBmPq1KnSt29feeONN6RFixZy9OhR4zE/ScByAjQgliNmAW4hgC/5wYMHy6JFi3SFFAwEppliCjM+YcIET/OxugrRoi9cuKAGYtOmTXLy5ElZvXq19OrVSzBtBZ1YufXvf/9b34PjHSuz/AlWeb333nueR4cOHZKePXuqHs9NJkjAQgI0IBbCpWp3Edi1a5ds2LBBGzV06FDJkyePpvGlDaMQVTDKMJzmGTNm1CW5s2bNEjjIcXRCly5dpGHDhvqlv27dOn29U6dOUq5cOY8qvI9yowpGHzA0EIQHr1u3rqZhbObNm6dp/iIBqwnQgFhNmPpdSQAGxNgYuH37dundu7caBe/GTpw40TM6wVQXBHtAMO0Ex7i3lC5dWjBa+fzzz/V2lixZpHr16pqGAx5Leg3BxsRx48bJyJEj9RYMyJYtW4zH0erhecAECZhMILHJ+qiOBFxLAIcBNWvWTKewsDEQAl8IDAKmsrp27SpPPPGEFCxYUObOnSvLli3TPPBnYFOgIY888oisXLlSp66Me9WqVfPJkzJlSvVtQAec6927d5cOHTroXhJjYyLehX/E+6AlOO0xiqGQQCQI0IBEgjLLcAWBVKlSyeuvvy5t27aVF198UeBz+O2336Rjx46ydOlSwcosjEy8BdNcb775ZrRVVNhZDkMSk2C08swzz+hqLxgR7Ej3Fkx1Zc+eXQ0IpsVee+01eeihhxx/lLB3G5m2NwFOYdm7f1g7GxLAEbF9+vTREQNWPcH/sXDhQjUsxn6NOnXqyFtvvaXLcuH/iI1gFPLxxx/Ljz/+6JnOgh6McjDV1a9fPx3p4B6MEcp08nGpaAfFWQQ4AnFWf7G2NiGAZbmYskKoEoQswcgEPg/4J3CuPZbfmvFlDiPSpEkTNQ5YsQXBqAbLfevXr6/XhkHTC/4igQgS4AgkgrBZlLsIwP+BqSgs7x04cKA2LnPmzOqXMMN4eNOCIYG/Az8JEybU5btGqJSnn36a01besJiOGAEakIihZkFuI5A0aVLp3LmzNuunn36S9evXR6yJmDKDNG3aVJcCR6xgFkQCXgRoQLxgMEkCoRJo166dpEmTRpfZGquuQtURan6ELkFZGIlUqlRJEiRIEKoK5icBUwjQgJiCkUriM4E2bdpo8xGiJKZd6WYxgnMeGwmxrNjwg5ilm3pIIBQCNCCh0GJeEvBDAA51yOHDh3XFlJ8spt3CznRMlWH0gZ3sFBKISwI0IHFJn2W7gkDRokU1UCIag02FVsr333+vq7ySJUsmiPZLIYG4JEADEpf0WbYrCMAHUbFiRW0LnNtRQ7Kb2UgsFYYghhaFBOKaAA1IXPcAy3cFgXr16mk7sAdk+fLllrQJIUt27NihuitXrmxJGVRKAqEQoAEJhRbzkkAAAliJZRiRGTNmBMgV3m2ES0EIdwjOFqGQQFwToAGJ6x5g+a4gAKd2hQoVtC3Hjh1Th7rZDTOi72IDI5fumk2X+mJDgAYkNtT4Dgn4IWBMK+3bt0927tzpJ0fsb2HqyjhYyjuyb+w18k0SCJ8ADUj4DKmBBJQAprGwIgvy7rvv6qdZvxAu3oiFxXDtZlGlnnAJ0ICES5Dvk8D/COC42lKlSlnCY8GCBar3gQceEIRQoZCAHQjQgNihF1gH1xCAfwKC8zv279+vaTN+GXG2ChcuLEmSJDFDJXWQQNgEaEDCRkgFJBCdwJEjRzznoUd/GtodnDdy5coVfSlTpkyhvczcJGAhARoQC+FSdfwjkCNHDsH55hDsGjdDVq9eLdu2bVNViL5LIQG7EKABsUtPsB6uIIBzOzJkyKBt2bt3r6ltwiFV9H+YipTKwiRAAxImQL5OAlEJFCxYMOqtsK7HjBmj72OfCc4+p5CAXQjQgNilJ1gP1xCoUaOGtmXevHlixijEWL7rGkBsiGsI0IC4pivZELsRgOP75s2bdqsW60MCphFIbJomKiIBEohG4MaNG3L9+vVo90O5cefOHc1etmzZUF5jXhKwnAANiOWIWUB8JnD//feb1vxy5cqZpouKSMAMApzCMoMidZCAF4HcuXNLyZIlve6En0yePLkkTsz/74VPkhrMJMB/kWbSpC4S+JtAxowZ5YMPPpB169aZxgNLeHPlymWaPioiATMI0ICYQZE6SCAKAewYr1+/fpS7vCQBdxHgFJa7+pOtIQESIIGIEfAZgWzZsiViBVtREHYAY67YyYIVO8apc05uR9asWSVRokROboJcunRJLl686Og24KArBHZ0umA59KlTp5zeDMmcObOjg2GeP3/epw98DMj48eN9HvKCBEiABEiABAIR4BRWIDK8TwIkQAIkECOBxDVr1owxAx+SAAmQAAmQQFQCCOz5f+rWzfTR8px6AAAAAElFTkSuQmCC" alt="" /></p>
<p class="MsoNormal"><span lang="TR">Problemin çözümü olan PROLOG kodu aşağıda verilmiştir.</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">perm([X|Y],Z) :- perm(Y,W), birinial(X,Z,W).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">perm([],[]).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR"> </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">birinial(X,[X|R],R).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">birinial(X,[F|R],[F|S]) :- birinial(X,R,S).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR"> </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">cozum(P) :-</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">     perm([1,2,3,4,5,6,7,8],P),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">     birlestir([1,2,3,4,5,6,7,8],P,S,D),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">     hepsifarkli(S),</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">     hepsifarkli(D).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR"> </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">birlestir([X1|X],[Y1|Y],[S1|S],[D1|D]) :-</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">     S1 is X1 +Y1,</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">     D1 is X1 &#8211; Y1,</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">     birlestir(X,Y,S,D).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">birlestir([],[],[],[]).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR"> </span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">hepsifarkli([X|Y]) :-  \+member(X,Y), hepsifarkli(Y).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">hepsifarkli([X]).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR"> </span></p>
<p class="MsoNormal"><span lang="TR">Kodun çalışan örneği aşağıdaki şekildedir:</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">?- cozum(P).</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [5, 2, 6, 1, 7, 4, 8, 3] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [6, 3, 5, 7, 1, 4, 2, 8] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [6, 4, 7, 1, 3, 5, 2, 8] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [3, 6, 2, 7, 5, 1, 8, 4] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [6, 3, 1, 7, 5, 8, 2, 4] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [6, 2, 7, 1, 3, 5, 8, 4] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [6, 4, 7, 1, 8, 2, 5, 3] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [3, 6, 2, 7, 1, 4, 8, 5] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [6, 3, 7, 2, 4, 8, 1, 5] ;</span></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">&#8230;</span></p>
<p class="MsoNormal"><span lang="TR"> </span></p>
<p class="MsoNormal"><span lang="TR">Yukarıdaki örneklerde görüldüğü üzere her kolon için, o kolondaki kaçıncı satıra vezir yerleştirilebileceği ve bu yerleştirme işlemine göre bütün kuralları sağlayan bir dizilimin nasıl elde edileceği listelenmiştir. Problemin birden fazla çözümü olduğu için her satır, çözümlerden birisini göstermektedir. Örneğin ilk çözüm satırını ele alırsak, aşağıdaki gibi bir satranç tahtası elde ederiz. </span></p>
<p class="MsoNormal"><span lang="TR"> </span><img src="data:image/png;base64,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" alt="" /></p>
<p class="MsoNormal"><span style="font-family: courier new,courier;" lang="TR">P = [5, 2, 6, 1, 7, 4, 8, 3] ;</span></p>
<p class="MsoNormal"><span lang="TR">Kodda, kabaca bütün ihtimalleri deneyen bir permütasyon algoritması geliştirilmiştir. Ardından koşulların sağlanıp sağlanmadığı kontrol edilmiş ve buna göre koşulları sağlayan ihtimaller sonuç olarak döndürülmüştür. </span></p>
<p class="MsoNormal"><span lang="TR">Algoritma, bir arama algoritması (search algorithm) şeklinde probleme yaklaştığı için, problemin çözümü sırasındaki bütün ihtimaller sadece bir kere denenecek ve denenen bir ihtimal tekrar etmeyecektir. Bu deneme sırası, permütasyon fonksiyonu ile sağlanır.<br />
</span></p>

<p class="sayac_bilgi">113 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2012/01/15/prolog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Callback (Geriçağrım)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/11/callback-gericagrim/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/11/callback-gericagrim/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 01:31:47 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=6022</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, bilgisayar programlama dillerinde kullanılan bir yaklaşım olan geri çağırım (call back) kavramını açıklamaktır. Bir programlama dilinin, yapısal programlama dili (structured programming language) olabilmesi için aşağıdaki üç özelliğe haiz olması gerekir: Kod bloğunun koşula bağlı olabilmesi : Klasik programlama dillerindeki if/else yapısı Kod bloğunun tekrar ettirilebilir olması : [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı, bilgisayar programlama dillerinde kullanılan bir yaklaşım olan geri çağırım (call back) kavramını açıklamaktır. </p>
<p>Bir programlama dilinin, <a href="http://www.bilgisayarkavramlari.com/2007/12/18/yapisal-programlama-structured-programming/">yapısal programlama dili (structured programming language)</a> olabilmesi için aşağıdaki üç özelliğe haiz olması gerekir:</p>
<ul>
<li>Kod bloğunun koşula bağlı olabilmesi : Klasik programlama dillerindeki if/else yapısı</li>
<li>Kod bloğunun tekrar ettirilebilir olması : Klasik programlama dillerindeki döngü (loop) yapısı </li>
<li>Kod bloğunun parametrize edilebilir olması: Klasik programlama dillerindeki fonksiyon (function) yapısı </li>
</ul>
<p>Yukarıdaki bu üç özelliği günümüz programlama dillerinin hemen hepsi bünyelerinde barındırmaktadır ve günümüzdeki çoğu dil, yapısal programlama dili olma özelliğini taşır. </p>
<p>Geri çağırım ismi verilen özellik ise, yukarıdaki özelliklerden üçüncüsünün parametre olarak bir kod bloğunu alabilmesidir. Diğer bir deyişle, çalıştırılacak olan kod bloğunun, parametre olarak basit sayılar veya değişkenler yerine, farklı bir kod bloğunu alması ve bu kod bloğunu çalıştırması, hatta diğer iki özelliği de kullanarak, alınan parametredeki kod bloklarını tekrar etmesi veya koşullu olarak sçmesi anlamına gelir</p>
<p>Geri çağırım özelliği (call back), bir programlama dilinde, aşağıdakine benzer bir yapı kazandırır:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2011/callback.png" alt="Callback" title="callback.png" border="0" width="560" height="175" /></p>
<p>Yukarıdaki temsili resimde, klasik bir geri çağırımda, bir ana fonksiyonun (örneğin C gibi dillerdeki main fonksiyonu olabilir), herhangi bir kütüphanede bulunan fonksiyonu çağırması ve ardından bu kütüphanenin de ana programdaki bir fonksiyonu geri çağırması ifade edilmiştir. </p>
<p>Bu gösterimden anlaşıldığı üzere kütüphane fonksiyonu, basitçe kendisine gelen çağırımı, ana programdan aldığı bir parametreye geri yönlendirmektedir. Bu kullanım ise C gibi dillerde ancak <a href="http://www.bilgisayarkavramlari.com/2007/12/18/fonksiyon-gostericileri-function-pointer/">fonksiyon göstericisi (function pointer)</a> yapısı ile mümkündür. Yani gelen bir çağrının, ana programdaki hangi fonksiyona yönlendirileceği (geri çağrılacağı , callback), gelen kütüphane fonksiyonuna verilmiş bir parametre olan ikinci bir fonksiyon ile yapılabilir ki bu parametrede ancak ikinci bir fonksiyon olabilir. </p>
<p>Bu durumu örnek bir kod ile anlatmaya çalışalım:</p>
<pre>
#include &lt;stdio.h&gt;
int func(int);
void PassPtr(int (*pt2Func)(int))
{
   int sonuc = (*pt2Func)(12);
   printf("%d",sonuc);
}

main(){
      int (*fp)(int);
      fp = func;
      PassPtr(fp);

}
int
func(int arg){
     return ++arg;
}
</pre>
<p></p>
<p>Yukarıdaki kodda bulunan main fonksiyonu, öncelikle fp isminde bir <a href="http://www.bilgisayarkavramlari.com/2007/12/18/fonksiyon-gostericileri-function-pointer/">fonksiyon göstericisi </a>tanımlamış ve bu fonksiyon göstericisini, PassPtr ismi verilen fonkisyona parametre olarak geçirmiştir. Yukarıdaki yapıda, PassPtr isimli fonkisyon, daha alt seviyede olan bir kütüphane fonksiyonu ve func ismi verilen ve main fonkisyonunda fp isimli gösterici ile ifade edilen fonksiyon ise geri çağırım yapılan fonksiyon olarak düşünülebilir. </p>
<p>Bu durumda, bizim tasarım yapımız aşağıdaki şekilde görülebilir</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/2011/callback2.png" alt="Callback2" title="callback2.png" border="0" width="419" height="163" /></p>
<p>Yukarıdaki yaklaşımın faydası, bize alt seviye fonksiyonunun hiç bilgisi olmadan üst seviyedeki herhangi bir fonksiyona geri dönüş imkanı vermesidir. Bu anlamada, <a href="http://www.bilgisayarkavramlari.com/2009/03/30/veri-yapilari-uzerinde-fonksiyonlar/">programda soyutlama (abstraction)</a> yakalanmasında veya geçirilen parametreler sayesinde bilgi gizlenmesi (inforation hiding) özelliği kazandırmaktadır. </p>
<p>Özet olarak geri çağırım özelliği, bir programlama yaklaşımında kullanılan tasarım yöntemlerinden birisidir ve nesne yönelimli olmayan programlama dillerinde, yukarıda bahsedilen durumlarda sıklıkla kullanılan bir çözümdür. Nesne yönelimli programlama dillerinin gelişimi ile birlikte, <a href="http://www.bilgisayarkavramlari.com/2008/11/29/tasarim-kaliplari-design-patterns/">tasarım kalıpları (design patterns)</a> önem kazanmış ve bu kalıplardan gözlemci kalıbı (observer patter) yukarıda açıklanan özelliklerin tamamını bir nesne yönelimli programlama dilinde çözmeye yöenlik olarak programcıların hizmetine sunulmuştur. </p>

<p class="sayac_bilgi">174 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/11/callback-gericagrim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lisan-ı Kaime (Dillerde Dik Açı, Orthogonal Languages)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/09/14/lisan-i-kaime-dillerde-dik-aci-orthogonal-languages/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/09/14/lisan-i-kaime-dillerde-dik-aci-orthogonal-languages/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 19:02:18 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Derleyiciler]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/09/14/lisan-i-kaime-dillerde-dik-aci-orthogonal-languages/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Özellikle bilgisayar programlama dillerinde kullanılan bir terimdir. Buna göre dillerde bulunan özelliklerin birbirine dik olması, yani birbirinden bağımsız olması kast edilir. Kelime olarak, yöneylerin (vectors) dikliğinden esinlenilmiştir. Vektörlerin birbirine dik olması, aralarında ilişki bulunmaması (birbirine iz düşümünün sıfır olması) anlamına gelmektedir. Şayet bir dilde bulunan özellikler arasında da ilişki bulunmuyorsa, [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Özellikle bilgisayar programlama dillerinde kullanılan bir terimdir. Buna göre dillerde bulunan özelliklerin birbirine dik olması, yani birbirinden bağımsız olması kast edilir. Kelime olarak, yöneylerin (vectors) dikliğinden esinlenilmiştir. Vektörlerin birbirine dik olması, aralarında ilişki bulunmaması (birbirine iz düşümünün sıfır olması) anlamına gelmektedir. Şayet bir dilde bulunan özellikler arasında da ilişki bulunmuyorsa, dilin özelliklerinin genişlemiş olduğu düşünülebilir.</p>
<p>Örneğin değişken tipleri olarak tamsayı (integer) ve küsurlu sayının (float) bulunduğu bir dil ve <a href="http://www.bilgisayarkavramlari.com/2008/10/12/c-dilinde-operatorler/">işlem(operator)</a> olarak <a href="http://www.bilgisayarkavramlari.com/2007/10/16/pointer-gosterici-2/">dizi (array) ve işaretçi (pointer)</a> bulunduğu bir dili ele alalım. Bu dildeki 2 değişken tipi ve iki işlem şekli, şayet kaime arz ediyorsa, bu durumda bir işaretçi, tamsayı veya küsurlu sayıyı gösterebilmektedir. Benzer şekilde dizinin elemanları işaretçi olabilmekte ve işaretçi de diziye işaret edebilmektedir.</p>
<p>Şayet dilde, kaime bulunmasaydı, örneğin dizi işlemi, sadece küsurlu sayılar üzerinde çalışıyor olsaydı, bu durumda dildeki esneklik büyük ölçüde kaybedilmiş olacak ve örneğin tam sayı dizisi bulunmayacağı gibi, tam sayı dizisine işaret eden bir işaretçi veya her elemanı işaretçi olan bir tamsayı dizisi de kullanılamayacaktı.</p>
<p>C dilinde toplama işlemi (+) bulunmakta ve lisan-ı kaime gereği mümkün olduğunca değişken yapısından bağımsız tutulmaktadır.</p>
<p>Örneğin,</p>
<p>a+b şeklindeki bir işlemde, C dili, a ve b değişken değerlerini alıp <a href="http://www.bilgisayarkavramlari.com/2008/11/07/rastgele-erisilebilir-bellek-random-access-memory-ram/">hafızaya yükledikten</a> sonra toplama işlemini yine hafızada tutmaktadır.</p>
<p>Yukarıdaki bu örnekte, a ve b değerleri, herhangi bir değişken tipinde olabilir. Örneğin tam sayı (int) veya karakter (char) yapısında olmasının bir mahsuru yoktur.</p>
<p>Ayrıca yukarıdaki a ve b değerleri birer <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">işaretçi (pointer)</a> da olabilir.</p>
<p>Örneğin;</p>
<pre>
int *a ;
int x[10];
a = x;
int b = 4;
a = a + b;</pre>
<p>şeklindeki kodun anlamı, a işaretçisinin gösterdiği mevcut yerin 4 sonraki adresini göstermesidir. Buna göre, x dizisinin 4. elemanına işaret etmektedir. Yukarıdaki bu özellik, C dilinde bulunan ve işaretçi ile dizi ve değişken tipleri arasında bulunan diklik özelliğine istinat edilebilir.</p>
<p>Bir dilde diklik özelliğinin fazla olması, dildeki kodlamayı kolaylaştırır ve dilin öğrenilmesini basit hale getirir. Örneğin işaretçi kullanmayı öğrenen birisi yukarıdaki bu işlemleri ilave bir kural öğrenmeksizin kodlayabilir. Şayet diklik özelliği az olsaydı, bu durumda dili öğrenen veya kodlayan kişilerin istisna kurallarını da öğrenmesi gerekecekti. Örneğin ingilizce öğrenen birisi, fiillerin sonuna –ed eki getirerek geçmiş zaman yapılacağını öğrenir, ancak bunun istisnası olan kelimeleri de öğrenmek zorundadır. Şayet istisnası hiç olmasaydı, dili öğrenmek ve kullanmak çok daha kolay olacaktı.</p>
<p>Bir dildeki diklik özelliğinin çok fazla olması da sakıncalıdır. Aşırı derecede diklik içerilmesi halinde, dili çalıştıracak bir <a href="http://www.bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/">derleyicinin (compiler)</a> geliştirilmesi imkansızlaştığı gibi kodu kullanan kişilerinde hata yapma ihtimali artar.</p>
<p>Örneğin C dilinde iki tip veri birliktelik ilişkisi bulunmaktadır (data associativity). Bunlar <a href="http://www.bilgisayarkavramlari.com/2007/10/16/pointer-gosterici-2/">diziler (array)</a> ve kayıtlardır (records, C dilinde özel olarak <a href="http://www.bilgisayarkavramlari.com/2007/11/08/olusum-composition-ve-struct-yapilar/">yapı (struct)</a> ismi ile geçer). C dilinde bulunan fonksiyonlar, iki tipte de parametre alırken, sadece kayıt tipinde veri döndürebilmektedir. Dizi tipinde döndürmesi mümkün değildir. Bu durum dilin diklik özelliğine uymadığı gibi, dilde bulunan bu özelliklere de diklik eklenmesi halinde, hafıza yönetimi (Dizi boyutunun kestirilmesi) ve hafızanın ihalili gibi pek çok problemi, kodu yazan kişinin kontrol etmesi gerekecekti. Çözüm olarak, C dilinin tasarımı sırasında, bu özelliklere diklik getirilmemiştir.</p>

<p class="sayac_bilgi">211 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/09/14/lisan-i-kaime-dillerde-dik-aci-orthogonal-languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yeknesan (Invariant , Değişmez)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 07:53:50 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[bilgisayar felsefesi]]></category>
		<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde, bir programın incelenmesi sırasında, herhangi bir kaziyenin (predicate, haber, önerme), çeşitli işlemler uygulanmasına karşılık yeknesan olması halidir. Diğer bir deyişle, program çalışır ve çeşitli işlemlerden geçer, ancak bazı şeyler değişmeden kalıyor ve ne kadar işlem yapılırsa yapılsın değişmiyorsa buna yeknesan (değişmez, invariant) ismi verilir. En basit örneği, bir [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bilgisayar bilimlerinde, bir programın incelenmesi sırasında, herhangi bir <a href="http://www.bilgisayarkavramlari.com/2009/05/07/haber-predicate/">kaziyenin (predicate, haber, önerme)</a>, çeşitli işlemler uygulanmasına karşılık yeknesan olması halidir.
</p>
<p>Diğer bir deyişle, program çalışır ve çeşitli işlemlerden geçer, ancak bazı şeyler değişmeden kalıyor ve ne kadar işlem yapılırsa yapılsın değişmiyorsa buna yeknesan (değişmez, invariant) ismi verilir.
</p>
<p>En basit örneği, bir <a href="http://www.bilgisayarkavramlari.com/2008/09/08/degisken-variable/">değişkenin (variable)</a> içine değer atanması ama hiç değiştirilememesidir. </p>
<pre>
int a = 10;
// işlemler
printf("%d",a);
</pre>
</p>
<p>Yukarıdkai kodda, a değerini ilgilendiren işlemler yapılmıyorsa, a için yeknesan olmuş denilebilir. Farklı bir örnek de döngülerde görülür:</p>
<pre>
for(int i = 0;i&lt;10;i++){
   printf("%d",i);
}
</pre>
</p>
<p>Yukarıdaki döngüde, i&lt;10 şartında bulunan 10&#8242;dan küçük olma şartı yeknesan olmuştur. Yani döngünün dönmesi sırasında değişmeden kalmaktadır. Hemen bu noktada önemli bir farkı belirtmek gerekir. Yeknesean kavramı, sabit kavramı ile (constant) karıştırılabilmektedir. Örneğin yukarıdaki döngüde bulunan 10 sayısı bir sabittir ve yeknesan değildir. 10&#8242;dan küçük olma durumu ise değişmeden kalan bir yeknesan olarak düşünülmelidir.<br />
Yukarıdaki tip yeknesan örneklerine, özel olarak daire yeknesanı (loop invariant, döngü değişmezi) ismi de verilebilir.
</p>
<p>Bu yaklaşım, ayrıca program analizi veya problem analizi sırasında da kullanılabilir. Örneğin <a href="http://www.bilgisayarkavramlari.com/2011/07/19/mu-bulmacasi-mu-puzzle/">MU Probleminin</a> çözümünde, yeknesan bir değer yakalamaya çalışmak gerekir. Benzer şekilde <a href="http://www.bilgisayarkavramlari.com/2009/09/10/hoare-mantigi-hoare-logic/">Hoare Mantığı (Hoare Logic),</a> programların belirli bölümlerinde, ön ve son koşullar belirleyerek bunların yeknesan olmasını sağlamaktadır.
</p>
<p>Bu yöntem, bilgisayar bilimleri dışında da kullanılır. Örneğin, kanun yapım sürecinde, bütün kanunlarda değişmeyen kötü hasletler vardır. Bu yüzden, hırsızlık veya cinayet gibi suçlar, kanunlar değişmesine karşılık, bütün kanunlarda yerini almaktadır. Bu anlamda, değişen kanun sistemleri için, hırsızlık, yeknesan bir suçtur denilebilir. </p>

<p class="sayac_bilgi">243 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Örtüşen Alt Problem (Overlapping Subproblem)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/07/18/ortusen-alt-problem-overlapping-subproblem/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/07/18/ortusen-alt-problem-overlapping-subproblem/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 08:41:47 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/07/18/ortusen-alt-problem-overlapping-subproblem/</guid>
		<description><![CDATA[Yazan :Şadi Evren ŞEKER Bilgisayar bilimlerinde, özellikle özyineli (recursive) problemlerde, problemin bir kısmının tekrar edilmesi durumudur. Örneğin, klasik bir problem olan fibonacci sayıları örneğinde, örtüşen altproblem bulunmaktadır. Fibonacci serisinin 4. terimini hesaplamak isteyelim ve bunun için aşağıdaki fonksiyonu yazmış olalım: Matematiksel olarak : fib(0) = 1, fib(1) = 1 ve fib(n) = fib(n-1)+fib(n-2) Programlama dillerinde: [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan :Şadi Evren ŞEKER
</p>
<p>Bilgisayar bilimlerinde, özellikle <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive)</a> problemlerde, problemin bir kısmının tekrar edilmesi durumudur. Örneğin, klasik bir problem olan <a href="http://www.bilgisayarkavramlari.com/2008/08/05/fibonacci-sayilari-fibonacci-numbers/">fibonacci sayıları</a> örneğinde, örtüşen altproblem bulunmaktadır.
</p>
<p>Fibonacci serisinin 4. terimini hesaplamak isteyelim ve bunun  için aşağıdaki fonksiyonu yazmış olalım:
</p>
<p>Matematiksel olarak : fib(0) = 1, fib(1) = 1 ve fib(n) = fib(n-1)+fib(n-2)
</p>
<p>Programlama dillerinde:</p>
<pre>
fib(int n){
   if(n==0||n==1)
      return 1;
   return fib(n-1)+fib(n-2);
}
</pre></p>
<p>Yukarıdaki bu fonksiyonun çalışması sırasında çağırdığı alt fonksiyonları bir ağaç şeklinde çizecek olursak:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/071811_0841_rtenAltPro1.png" alt=""/>
	</p>
<p>Yukarıdaki ağaçta, görüldüğü üzere, bazı terimler birden fazla kere hesaplanmaktadır. Örneğin fib(2) fonksiyonu, hem fib(4) hesaplanırken, hem de fib(3) hesaplanırken hesaplanmaktadır. Bu anlamda, problemin bir alt grubunun (subproblem) örtüştüğünden (overlap) bahsedebiliriz. Genelde bu tip örtüşmelerde, hız kazandırmak ve problemin sadece bir kere çözülmesini saplamak için <a href="http://www.bilgisayarkavramlari.com/2007/12/03/dinamik-programlama-dynamic-programming/">dinamik programlama (dynamic programming)</a> yöntemi kullanılır. </p>

<p class="sayac_bilgi">192 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/07/18/ortusen-alt-problem-overlapping-subproblem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bin Packing (Kutulama Problemi)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 07:50:05 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER İyileştirme problemleri açısından klasik bir örnektir (optimisation problems). Problem basitçe bir kutunun içerisine en az boş alan bırakarak, eşyaların en iyi şekilde nasıl yerleştireceği olarak düşünülebilir. Aslında problemi boyutlara göre incelersek aşağıdaki şekilde bir liste yapılabilir: Tek boyutlu kutulama (1D bin packing) :Bu problemde amaç bir çizgi veya hat gibi [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">İyileştirme problemleri açısından klasik bir örnektir (optimisation problems). Problem basitçe bir kutunun içerisine en az boş alan bırakarak, eşyaların en iyi şekilde nasıl yerleştireceği olarak düşünülebilir.</p>
<p style="margin-bottom: 0cm;">Aslında problemi boyutlara göre incelersek aşağıdaki şekilde bir liste yapılabilir:</p>
<p style="margin-bottom: 0cm;"><strong>Tek boyutlu kutulama (1D bin packing)</strong> :Bu problemde amaç bir çizgi veya hat gibi görülebilecek yapının içerisine farklı boyutlardaki çizgileri yerleştirmek olarak düşünülebilir.</p>
<p style="margin-bottom: 0cm;">Örneğin zaman çizelgelemesinde, bir kişinin yapacağı işleri, zaman çizgisinin üzerine yerleştirmesi (ve her işin farklı miktarda zaman gerektirdiğini ve kişinin çalışma saatlerinin sınırlı olduğunu düşünürsek en fazla işi en az zamanda (örneğin 8 saatlik mesailer içinde) yapması ) bir problemdir. Buradaki hem kişinin yapacağı işler hem de bu işlerin yerleştirileceği zaman çizgisi tek boyutludur.</p>
<p style="margin-bottom: 0cm;">Daha basit olması açısından örneğin 100m uzunluğundaki bir ipi 7 ve 9m uzunluğundaki parçalara en az fire ile bölmek istiyoruz, en verimli bölme işleminde kaç adet 7 ve kaç adet 9 uzunluğunda ipimiz olur gibi soruları düşünebiliriz. Bu tip sorular tek boyutlu kutulama problemleridir.</p>
<p style="margin-bottom: 0cm;"><strong>İki boyutlu kutulama problemleri (2D bin packing optimization):</strong> Bu grupta bir tablodan ve iki boyuttan bahsedilebilir. Örneğin kot pantolon üreten bir tekstil firmasında farklı boyutlardaki Pantolon kalıplarının en az fire ile 5x5m büyüklüğündeki bir kare kumaştan kesilmesi isteniyor olsun. Bu problem iki boyutlu (x ve y boyutları) bir kutulama problemidir. Benzer bir problem, bir gazetedeki seri ilanların, en az fire ile sayfaya yerleştirilmesi olarak da düşünülebilir.</p>
<p style="margin-bottom: 0cm;"><strong>3 boyutlu kutulama (3D bin packing)</strong> problemin en zor şekli olarak tanımlanır ve 3 boyutlu bir kutunun içerisine konulan her şeklin farklı x,y ve z boyutlarında şekiller olması olarak düşünülebilir. Problemin genel tanımını yaptığımız için belirteyim, örneğin ev taşıma sırasında çıkan eşyaların kutulanması olarak düşünebilirsiniz. Bu durumu daha da karmaşık yapmaktadır çünkü kutular farklı boyut ve şekillerdedir (örneğin silindir bir varil veya küp veya dikdörtgenler prizması gibi kutuların içerisine yerleştirme yapılmakta) ve kutulanan şekillerde farklıdır ve hatta girintilidir (concave , non-convex) (örneğin avize, koltuk, sandalye gibi birbirinin içine girebilen nesneleri düşününüz). 2 ve 3 boyutlu paketleme, paketlenen nesnelerin girintili olup olmamasına göre ikiye ayrılmaktadır. Dış bükey nesnelerin paketlenmesi nispeten daha basit bir problemdir. Ancak nesnelerin iç bükey olması halinde problem biraz daha karmaşıklaşır.</p>
<p style="margin-bottom: 0cm;">Hatta literatürdeki kısıtlı aramalarım sonucunda ulaşabildiğim kadarıyla tam olarak iç bükey nesnelerin paketlenebildiği bir sonuç ne yazık ki bulamadım. Örneğin iki vidanın en verimlim paketlenmesi sırasında vidaların girinti çıkıntılarının üstüste gelmesi gerektiğini tecrübi olarak biliyoruz. N adet vida için bu durum birbirini tekrar eden bir hal alır. Gerçekten farklı boylarda ve adım sıklığında ve çaplarda vidalar verilse bu durumda en verimli paketlemeyi yapabilen bir algoritma henüz görmedim.</p>
<p style="margin-bottom: 0cm;"><strong>Paketlenen nesnelere göre problemin sınıflandırılması:</strong></p>
<p style="margin-bottom: 0cm;">Paketlenen nesne çeşitlerinin sabit olması ve ön tanımlı olması halinde problem homojen olarak tanımlanır. Örneğin tek boyutlu kutulama probleminin tanımı sırasında verilen ve “100m uzunluğundaki bir ipi 7 ve 9m uzunluğundaki parçalara en az fire ile bölmek” şeklinde geçen örnek bu tip homojen (homogenous) bir yapıdadır. Buna karşılık heterojen bir problemde, paketlenecek nesnelerin tipleri ya tamamen birbirlerinden farklıdır ya da aynı tipte çok az tekrar vardır. Yine tek boyutlu problem örneğinde verilen zaman çizgisi üzerinde farklı uzunluklardaki randevuların yerleştirilmesi bu tiptendir.</p>
<p style="margin-bottom: 0cm;">Bu anlamda aşağıdaki problemler, kutulama probleminin birer özel hali olarak düşünülebilir:</p>
<ul>
<li>
<p style="margin-bottom: 0cm;">kamyon yükleme problemi (truck loading),</p>
</li>
<li>
<p style="margin-bottom: 0cm;">konteyner yükleme problemi (Container loading problem, CLP)</p>
</li>
<li>
<p style="margin-bottom: 0cm;">şerit paketleme problemi (Strip Packing problem, SPP)</p>
</li>
</ul>
<p style="margin-bottom: 0cm;">Yukarıda, problemin tanımını yaptıktan sonra çözümlere bir göz atalım:</p>
<p style="margin-bottom: 0cm;"><strong>Homojen tek boyutlu problem çözümü</strong></p>
<p style="margin-bottom: 0cm;">Şayet problem tek boyutlu ise ve homojen nesnelerin paketlenmesi olarak problemin çözülmesi isteniyorsa problem oldukça basit demektir ve basit matematiksel hesaplamalar ile problemi çözebiliriz.</p>
<p style="margin-bottom: 0cm;">Örneğin tek nesne ve tek paket varsa işlem basitçe paketin nesneye bölümü olarak bulunur (zaten burada zor Bir şey de yok):</p>
<p style="margin-bottom: 0cm;">Örneğin 100m uzunluğundaki bir ipten kaç tane 5m uzunluğunda ip kesilebilir:</p>
<p style="margin-bottom: 0cm;">100 / 5 = 20</p>
<p style="margin-bottom: 0cm;">biraz daha zorlaştırıp ip sayısını 2 çeşide veya 3 çeşide çıkarırsak problem  <a href="http://www.bilgisayarkavramlari.com/2008/03/24/belirsiz-cokterimli-tam-np-complete-nondeterministic-polynomial-complete/">np-tam (np-complete)</a> bir hal alır. Örneğin aşağıdaki kodu inceleyelim:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_0__.jpg" border="0" alt="" width="599" height="470" /></p>
<p style="margin-bottom: 0cm;">Kodda görüldüğü üzere bütün ihtimaller denenmektedir. Basitçe herhangi bir k değeri için, k-a ve k-b değerlerini denemekte ve denenen duruma göre a veya b değerini bir arttırmaktadır. Aslında kodumuz basit bir  <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-agac-binary-tree/">ikili ağaç (binary tree)</a> oluşturmaktadır:</p>
<p>Önce 9 veya 7 ile başlanması ihtimalleri:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_1__.gif" alt="" width="275" height="149" /></p>
<p>Sonra bu ihtimallerin de 7 veya 9 azalma ihtimalleri:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_2__.gif" alt="" width="416" height="225" /></p>
<p>Yukarıda gösterildiği gibi her düğümden yine ikişer ihtimal indirerek bir alt seviyeye geçilebilir. Neticede 0 olana kadar yapılan bir aramadır ve 0 sonucuna birden farklı yoldan ulaşılabilir.</p>
<p style="margin-bottom: 0cm;">Kodumuz çalıştırıldığında çözüm olarak aşağıdaki sonuçları üretmektedir:</p>
<p style="margin-bottom: 0cm;">cozum : 7*4 + 9*8</p>
<p style="margin-bottom: 0cm;">cozum : 7*13 + 9*1</p>
<p style="margin-bottom: 0cm;">Gerçekten de problemin iki farklı çözümü bulunmaktadır.</p>
<p style="margin-bottom: 0cm;">Yukarıdaki kod basit bir hesaplama ile, 2&#8242;nin üstlerinin toplamı kadar adım hesaplamaktadır.</p>
<p style="margin-bottom: 0cm;">Bu değer yukarıdaki ağaçtan çıkarılabilir:</p>
<p style="margin-bottom: 0cm;">ilk düğüm için tek ihtimal 2 <sup>0</sup></p>
<p style="margin-bottom: 0cm;">ikinci seviye için iki ihtimal: 2 <sup>1</sup></p>
<p style="margin-bottom: 0cm;">üçüncü seviye için dört ihtimal 2 <sup>2</sup></p>
<p style="margin-bottom: 0cm;">şeklinde gitmektedir ve örneğin problemimiz üçüncü seviyede çözülseydi (sonuç 0 olsaydı) o zaman karmaşıklığımız bu değerlerin toplamı olacaktı ve 2 <sup>0</sup> + 2 <sup>1</sup> + 2 <sup>2</sup> şeklinde hesaplanacaktı.</p>
<p style="margin-bottom: 0cm;">Bu değer, ikili ağaçlardan bilindiği üzere 2 <sup>n</sup>-1 şeklinde hesaplanabilir.</p>
<p style="margin-bottom: 0cm;">Görüldüğü üzere yukarıdaki algoritma O(2 <sup>n</sup>) değerinde bir karmaşıklığa sahiptir ve bu değer bir çok terimli (polynom) değildir yani algoritmanın karmaşıklık sınıfı <a href="http://www.bilgisayarkavramlari.com/2008/03/24/belirsiz-cokterimli-tam-np-complete-nondeterministic-polynomial-complete/">np-tam (NP-Complete)</a> olarak belirtilebilir. Ayrıca yukarıdaki k değeri için bir çözüm bulunmuştur ancak çözüm bulunamasaydı bu değer k terim için denenecekti. Yani 100 için çözüm yoksa bir yaklaşığı olan 99 için ardından iki yaklaşığı 98 için &#8230; Bu işlem hiç çözüm bulunamaması halinde k terim için denenecekti.</p>
<p>Yukarıdaki problem,  <a href="http://www.bilgisayarkavramlari.com/2007/12/03/dinamik-programlama-dynamic-programming/">dinamik programlama (dynamic programming)</a> kullanılarak iyileştirilebilir. Bunun sebebi arama işlemi sırasında bazı sonuçların tekrar etmesidir. Örneğin yukarıdaki ikili ağacı aşağıdaki şekilde çizebiliriz:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_3__.gif" alt="" width="416" height="225" /></p>
<p>Farka dikkat ederseniz, 93 – 9 = 84 ve aynı zamanda 91-7 = 84 olduğu görülür. Bu durumda aslında 84 değeri bir önceki kodda iki farklı durum için aranmaktayken şimdi tek bir durum için aransın istiyoruz. Elbette 84 sadece bir örnektir ve buna bağlı olarak çok sayıda tekrar eden değer bulunmaktadır.</p>
<p style="margin-bottom: 0cm;">Hesaplanan bu değerleri bir  <a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/">dizi (array)</a> içerisinde tutup tekrar hesaplanmasını engellemek istiyoruz:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_4__.jpg" border="0" alt="" width="643" height="525" />Yukarıdaki yeni kodda, bir dizi içerisinde tek döngü ile sonucu hesaplattık. Buna göre algoritmamız iki elemanlı bir diziyi kullanmakta, dizinin 0. elemanları 7lerin sayısını ve 1. elemanları ile 9ların sayısını saymaktadır.</p>
<p style="margin-bottom: 0cm;">Kodumuz ilk başta 0 için 0 tane 7 ve 0 tane 9 gerektiği gerçeği ile çalışmaya başlıyor. 14-23. satırlar arasındaki döngü basitçe i. terim için i-a ve i-b değerlerine bakıyor. Şayet i. terim için i-a veya i-b değerinde bir çözüm varsa (nereden geldiğini önemsemeksizin) bu çözüme bulduğu koşulu ilave ederek mevcut i değeri için çözümü kaydediyor. Şayet bu iki terim de bulunmuyorsa o zaman bir sonraki i değerine geçiyor.</p>
<p style="margin-bottom: 0cm;">Ekran çıktısı aşağıdaki şekildedir:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_5__.jpg" border="0" alt="" width="280" height="315" /></p>
<p>Son 20 satır görülmekle birlikte daha önceki satılar alıntılanmamıştır. Ayrıca son 20 satırda görüldüğü üzere, tamamına ait bir çözüm bulunmaktadır. Örneğin 88 sayısı için 7*10 + 9*2 = 88 sonucuna ulaşılmıştır. En son satırda ise 100 için 7*13 + 9*1 sonucu görülmektedir.</p>
<p style="margin-bottom: 0cm;">Görüldüğü üzere birden fazla sonuç olsa bile tek bir sonucu görmekteyiz bunun sebebi veri yapısının bir sonuç üretmek üzere tasarlanmış olmasıdır. Elbette daha farklı veri yapıları kullanılarak diğer çözümleri de gösteren sonuçlar elde edilebilir.</p>
<p style="margin-bottom: 0cm;">Yukarıdaki algoritmanın karmaşıklığı ise bir öncekine göre oldukça iyi sayılabilecek O(n) olarak bulunur. Bunun sebebi dizideki her elemanın üzerinden tek bir kere geçiyor olması ve dolayısıyla tek bir döngünün (koddaki 14-21 satırlar arası) çalışıyor olmasıdır.</p>
</div>

<p class="sayac_bilgi">569 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Swing Kütüphanesi</title>
		<link>http://www.bilgisayarkavramlari.com/2011/06/01/swing-kutuphanesi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/06/01/swing-kutuphanesi/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 09:23:09 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Kod Örnekleri]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/06/01/swing-kutuphanesi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, JAVA dilinde bulunan ve grafiksel kullanıcı ara yüzü geliştirmekte kullanılan SWING kütüphanesine hızlı bir başlangıç yapmaktır. Öncelikle Swing kütüphanesinin gelişiminden hızlıca bahsedelim. Swing kütüphanesi JAVA diline JDK 1.1 sürümünden sonra eklenmiştir. Daha önce AWT (Active Window Toolkit) ismi verilen bir kütüphane kullanmaktaydık ancak çok daha fazla ve [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family:Times New Roman; font-size:12pt">Yazan : Şadi Evren ŞEKER<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu yazının amacı, JAVA dilinde bulunan ve grafiksel kullanıcı ara yüzü geliştirmekte kullanılan SWING kütüphanesine hızlı bir başlangıç yapmaktır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Öncelikle Swing kütüphanesinin gelişiminden hızlıca bahsedelim. Swing kütüphanesi JAVA diline JDK 1.1 sürümünden sonra eklenmiştir. Daha önce AWT (Active Window Toolkit) ismi verilen bir kütüphane kullanmaktaydık ancak çok daha fazla ve gelişmiş özelliklerle gelen swing kütüphanesi neredeyse tamamen AWT yerine geçti denilebilir. AWT halen kullanılmakta, bunun en büyük sebebi JAVA&#8217;nın Visual Studio gibi geliştirme ortamlarından farklı olarak geçmişle uyumlu olmasıdır (back compatibility). Yani, örneğin 1997 yılında yazdığım bir kodu hala derleyip çalıştırabiliyorum.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">AWT&#8217;nin bulunmasındaki diğer önemli bir faktör ise, Swing kütüphanesinin AWT üzerinde geliştirilmiş olmasıdır. AWT&#8217;den bu kadar bahsettikten sonra son olarak aynı projede hem AWT hem de Swing kullanmamanız gerektiğini, aksi halde ağır ve hafif bileşenlerin ekranda hatalı görüleceğini (heavy weighted, light weighted) söyleyerek Swing kütüphanesini anlatmaya başlayalım.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Swing kütüphanesi, javax altında bulunmaktadır ve bütün swing sınıfları (classes) javax.swing paketi ile başlar.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Örneğin, ekrana basit bir düğme koyarak uygulama geliştirmeye başlayalım.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_0__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki kodun çıktısı, aşağıdaki şekilde bir pencereye yerleştirilmiş bir düğmeden (button) ibarettir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_1__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p>Kodumuzda kullandığımız iki swing bileşeni olan JFrame ve JButton import edildikten sonra sınıfın bir JFrame olacağını, extedns JFrame yazıp JFrame sınıfını <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">kalıtımla (inheritance)</a> alarak belirtiyoruz.
</p>
<p><span style="font-family:Times New Roman; font-size:12pt">Kodumuzda bulunan iki metottan ilki bir <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">inşa fonksiyonu olup (constructor)</a>, this.add fonksiyon çağrılması ile JFrame içinde tanımlı olan add fonksiyonuna bir adet JButton parametre verilmiştir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Klasik olarak swing kütüphanesinde, bir bileşenin diğer bileşenleri içinde barındırma özelliği bulunuyorsa (container) bu durumda add fonksiyonu, parametre olarak aldığı bileşeni, barındırıcı bileşene eklemektedir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Kodun 5. satırında yapılan bu ekleme işleminde dikkat edilecek bir husus da, JButton bileşenini oluşturan ve new ile çağrılan yapıcı fonksiyonun (constructor) parametre olarak bir <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizgi (string)</a> almış olmasıdır. Bu dizgi, düğmenin üzerinde görülecek olan yazıdır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Son olarak main fonksiyonunda, yeni tanımladığımız bu sınıftan bir nesne (object) oluşturarak bu objenin referansına sb ismini veriyoruz. Kodun 9. ve 10. satırlarında ise sırasıyla sb isimli bu nesneyi (ki artık JFrame özelliği taşıyan ve içerisinde bir buton olan nesnedir) paketliyoruz ve göstertiyoruz. Paketleme işlemini basitçe, bir pencerenin içerisindeki bileşenlerin sığacağı en ufak hali alması olarak düşünebilirsiniz. Gösterme işlemi ise bir bileşenin görünürlülüğünü (visibility) doğru yapmaktan ibarettir (true). Tersi şekilde görünürlülüğü yanlış (false) yapılarak bir bileşen gizlenebilir. Yine daha önceki sürümlerde bu işlem için sırasıyla show() ve hide() fonksiyonları da kullanılmaktaydı ancak JDK 1.3 sonrasında bu fonksiyonlar kaldırıldı.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Şimdi gelelim bu düğmenin tıklanması halinde eylemi algılamaya.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki kodu yazıp denediyseniz tıklama eyleminin herhangi bir sonuç doğurmadığını görmüşsünüzdür. Bunun sebebi JAVA dilinde tanımlı olan herhangi bir eylemin sınıf içerisinde yer alamamasıdır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">JAVA dilinde eylemi üreten ve yakalayan nesneler farklı olabilir. Örneğin yukarıdaki örnekte düğmeyi tanımladığımız swingbuton isimli sınıf düğmeye tıklandığında devreye girebileceği gibi tamamen başka bir sınıf da devreye sokulabilir. Biz basit olsun diye ilk örneğimizde yine aynı sınıfta eylemi yakalayacağız. Bunun için öncelikle sınıfa bu özelliğin kazandırılması gerekir. JAVA dilinde bir sınıfın herhangi bir bileşen ile ilgili bir eylem yakalayabilmesi için ActionListener olması gerekir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">public class swingbuton extends JFrame implements ActionListener<br />
</span></p>
<p> <br />
 </p>
<p><span style="font-family:Times New Roman; font-size:12pt">şeklinde sınıfın tanımını değiştirerek bu sorunu çözebiliriz. Ancak, <a href="http://www.bilgisayarkavramlari.com/2008/11/22/arayuz-interface/">arayüzlerden (interface)</a> hatırlanacağı üzere bir <a href="http://www.bilgisayarkavramlari.com/2008/11/22/arayuz-interface/">arayüzü (interface)</a> sınıfa kazandırmanın (implements), bağlayıcı bir sonucu olmaktadır.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_2__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Kodumuzda yeni olan en büyük fark, sınıfta artık ActionListener arayüzünün implement edilmesidir. Bu arayüzün sınıfa uygulanması ile birlikte, sınıfta &#8221; actionPerformed&#8221; isimli fonksiyonu bulundurma zorunluluğu ortaya çıkar. Nitekim yukarıdaki kodun 10-12. satırları arasında bu fonksiyon kodlanmış ve herhangi bir eylem olması halinde çalışacak olan bu fonksiyonun içerisinde ekrana &#8220;butona basıldı&#8221; mesajının yazılması sağlanmıştır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Diğer bir ilave ise artık düğmenin bir eylem dinleyicisi olmasına olan ihtiyaçtır. Düğmemize basıldığında hangi sınıfın bu eylemi yakalacağını kodda belirtmemiz gerekir ki bu durum da 8. satırda kodlanmıştır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki kodun ekran çıktısı aşağıdaki şekildedir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_3__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Birden fazla düğme bulunması halinde düğmeleri ayırt etmek için eylemin özel olarak koşullandırılması gerekir.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_4__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Kodun yeni halinde, düğmelerin tanımlandığı satırı sınıf geçerlilik alanına alarak actionPerformed fonksiyonu içerisinde hangi düğmeye tıklandığını kontrol edebiliyoruz. Bunun için parametre olarak gelen ActionEvent tipindeki e nesnesinin kaynağını okutan .getSource metodunu çağırıyor ve hangi nesneye eşit olduğunu sorguluyoruz.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Ayrıca kodda yapılan yeni bir ilave, birden fazla bileşeni aynı anda ekranda gösterebilmek için bir yayılım (Layout) eklenmesidir. Yukarıdaki kodda, 10. satırda bulunan komut, this ile ifade edilen JFrame nesnesinin yayılımının FlowLayout tipinde olacağını belirtmektedir. Bunun anlamı eklenen her bileşen, bir öncekinin sağına ilave edilecek, nihayet ekranda daha fazla sağa eklenecek yer kalmayınca aşağıya geçileceğidir.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_5__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p>Swing kütüphanesi kullanılarak mevcut bileşenler, yukarıda gösterildiği şekilde ekrana eklenip kullanılabileceği gibi, bileşenler üzerinde değişiklik yapılması da mümkündür. Örneğin bir swing bileşeni olan Jpanel üzerinde çizim yapmaya çalışalım:
</p>
<p> <br />
 </p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_6__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki kodda bulunan sınıf, Jpanel bileşenini miras almış ve bu bileşenin &#8220;paintComponent&#8221; isimli metodunun <a href="http://www.bilgisayarkavramlari.com/2008/11/22/cignemek-overriding/">üzerine ezmiştir (override)</a>. Neticede Jpanel jf isimli Jframe&#8217;e eklenmiş ancak yeni çizim özellikleri ile görüntülenmiştir. Kodun ekran çıktısı aşağıdaki şekildedir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_7__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">paintComponet fonksiyonu yukarıda gösterildiği şekilde <a href="http://www.bilgisayarkavramlari.com/2008/11/22/cignemek-overriding/">ezilerek (override)</a> Graphics kütüphanesinden istenilen bir nesne, yukarıda gösterildiği şekilde ekrana eklenebilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Ayrıca JAVA&#8217;nın kuvvetli kütüphanelerinde birisi de Graphics2D kütüphanesidir. 2 boyutlu şekillerin bulunduğu kütüphane olarak tanımlayabileceğimiz bu kütüphane ile görsel pek çok işlem yapılabilir. Bu kütüphaneyi kullanmak için örnek kod aşağıda verilmiştir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_8__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki yeni kodda, paintComponent fonksiyonu altında, Graphics2D sınıfından türetilmiş bir nesne olan g2d nesnesine, şimdiye kadar kullandığımız ve klasik Graphics kütüphanesinin bir nesnesi olan g nesnesini tip inkılabı ile (type casting) atıyoruz. Bu sayede g2d nesnesinin fonksiyonlarını kullanabiliyoruz.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Kodda, dikdörtgen ve daire şeklinde iki nesne ekrana eklenerek gösterilmiştir. Kodun çıktısı aşağıda verilmiştir:<br />
</span></p>
<p> <br />
 </p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306920273_9__.jpg" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Aynı ekranda hem çizim hem de bileşen (component) kullanan kod (Ahmet beyin sorusu üzerine ekliyorum):<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Sorunumuz, aynı ekranda hem çizim yapabilmek, yani Graphics kütüphanesini kullanmak, hem de java&#8217;nın bileşenlerinin (örneğin düğme (buton) veya yazı alanı (text areat) gibi ) kullanabilmek.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bunu yapan örnek bir kodu aşağıdaki şekilde kodlayabiliriz:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/060111_1223_SwingKtphan1.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Kodda, öncelikle bir JPanel sınıfı oluşturuyoruz. Basitçe JPanel miras alan bir sınıfımız var, ismi cizim ve bu sınıf içerisinde, yukarıda da anlatılan paintComponent metodunun üzerine ezere (method overriding) Graphics kütüphanesini kullanıyoruz (örnek olarak bir çizgi çizdirilmiştir).<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Ardından main fonksiyonumuzu içeren bir sınıf kodlanmıştır. Bu sınıf içerisinde x nesne atıfı (object referrer) ile gösterilen bir JFrame oluşturulmuş ve bileşen yayılımı (layout) GridLayout olarak ayarlanmıştır. Kabaca ekran 2&#215;2 boyutlarında dört parçaya bölünmüştür. Javada bu yayılıma ekleme yapıldığında sol üst köşeden başlanarak bileşenler eklenir ve ilk satır bitince aşağıya geçilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Buna göre sırasıyla eklediğimiz bileşenler, c ismindeki ve cizim sınıfından türetilmiş bir JPanel, satır içinde (inline) olarak türetilmiş bir cizim nesnesi, üzerinde &#8220;deneme&#8221; yazan bir düğme (buton) ve içinde &#8220;www.bilgisayarkavramlari.com&#8221; yazılı bir yazı alanı (JTextArea).<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Ekranın çıktısı aşağıdaki şekildedir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/060111_1223_SwingKtphan2.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Görüldüğü üzere, ekranda çizim içerikli iki panel ve iki adet swing kütüphanesinden bileşen eklenmiştir.<br />
</span></p>
<p>   </p>

<p class="sayac_bilgi">570 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/06/01/swing-kutuphanesi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Algoritma (Algorithm)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/25/algoritma-algorithm/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/25/algoritma-algorithm/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 18:23:52 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[bilgisayar felsefesi]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/25/algoritma-algorithm/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bazan biz insanlar için çok kullanılan kelimeler, tanımlanması en güç kelimeler haline dönüşebiliyor. Algoritma da sanırım bilgisayar bilimleri için benzer özellikte olan bir kelime. Sanırım bu kelimeyi tanımlarken &#8220;bir dizi matematiksel adım&#8221; ifadesini kullanmak yerinde olur. Bütün algoritmalar, matematiksel olarak ispatlanabilen ve dizilimi kesinlikle önem taşıyan ve bir metot anlatmasıdır. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bazan biz insanlar için çok kullanılan kelimeler, tanımlanması en güç kelimeler haline dönüşebiliyor. Algoritma da sanırım bilgisayar bilimleri için benzer özellikte olan bir kelime.
</p>
<p>Sanırım bu kelimeyi tanımlarken &#8220;bir dizi matematiksel adım&#8221; ifadesini kullanmak yerinde olur.
</p>
<p>Bütün algoritmalar, matematiksel olarak ispatlanabilen ve dizilimi kesinlikle önem taşıyan ve bir metot anlatmasıdır.
</p>
<p>Aslında bir kelimeyi başka bir kelime ile ifade etmek bir hatadır. Şayet iki kelime aynı şeyi anlatıyorsa, o zaman bir tanesi fazla demektir ama genelde algoritma için bu &#8220;metot&#8221; veya &#8220;sistem&#8221; kelimeleri sıkça kullanılıyor. Oysaki algoritma bunlardan farklı olarak bir, matematiksel bir dizilimdir. Evet, bir problemi çözmek için gerek metodu anlatır bu çözümde kullanılan sistemi gösterir ama atlanmaması gereken ispat edilebilirlik, karmaşıklığının ölçülebilirliği aslında bilgisayar bilimlerinin de temelini oluşturur.
</p>
<p>Bu durumu bir örnek üzerinden açıklamaya çalışalım.
</p>
<p>Örneğin sık kullanılan <a href="http://www.bilgisayarkavramlari.com/2008/08/09/siralama-algoritmalari-sorting-algorithms/">sıralama problemini (sorting problem)</a> ele alalım. Elimizde bir dizi karıştırılmış sayı var ve biz bunları küçükten büyüğe doğru sıralamak istiyoruz. Bu durumda birisinin çıkıp ben bunları sıraladım demesi bir algoritma olmaz. Çünkü algoritmanın sistematik olarak probleme yaklaşması gerekir.
</p>
<p>Ben bunları sıralayan bir sistem yaptım demesi de algoritma olmaz. Çünkü sistemin bütün adımlarını belirli olması ve analiz edilebilir olması gerekir.
</p>
<p>Ben bunları sıralayan ve şu adımlardan oluşan bir sistem yaptım demesi de yeterli olmaz çünkü bu algoritmanın her durumda çalışacağının matematiksel olarak ispatlanabilmesi gerekir.
</p>
<p>Ancak bu aşamadan sonra bir algoritmadan bahsediyoruz demektir ve tam da bu aşamadan sonra artık algoritmanın performansından bahsetmeye başlar ve algoritmamızın hafıza ve zaman ihtiyaçlarını ölçebilmeyi isteriz.
</p>
<p>Yukarıdaki bütün bu tanımların yanında, bir algoritma elde ettikten sonra ayrıca bu algoritmanın uygulanabilir oluşu da tartışmaya açıktır. Örneğin geliştirilen algoritma, günümüz bilgisayarları için uygulanabilir olmayabilir. Bu durum algoritmamızı , algoritma olmakta çıkarmaz ancak uygulanamaz bir hale sokar (örneğin şu anda yeni yeni gelişen kuantum hesaplama algoritmaları buna birer örnek olabilir).
</p>
<p>Ayrıca algoritmaların yaklaşımlarına göre sınıflandırılması da mümkündür. Hatta bu sınıflandırmaya uygun olarak algoritma geliştirilme metodolojileri de bulunmaktadır. Örneğin <a href="http://www.bilgisayarkavramlari.com/2007/04/14/nesne-yonelimli-programlama-object-oriented-programming/">nesne yönelimli programlama (object oriented programming)</a> , <a href="http://www.bilgisayarkavramlari.com/2007/12/18/yapisal-programlama-structured-programming/">yapısal programlama (structured programming)</a> veya <a href="http://www.bilgisayarkavramlari.com/2007/12/18/fonksiyonel-programlama-procedural-programming-functional-programming/">fonksiyonel programlama (functional programming)</a> , <a href="http://www.bilgisayarkavramlari.com/2009/11/16/emirli-programlama-imperative-programming/">Emirli programlama (Imperative Programing)</a>, <a href="http://www.bilgisayarkavramlari.com/2007/12/18/otomat-yonelimli-programlama-automata-based-programming/">özdevinirli programlama (automat based programming)</a> gibi.</p>

<p class="sayac_bilgi">566 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/25/algoritma-algorithm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kod Kelimesi</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/19/kod-kelimesi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/19/kod-kelimesi/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 10:50:56 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Derleyiciler]]></category>
		<category><![CDATA[Network(Ağ)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Veri Güvenliği(Cryptography)]]></category>
		<category><![CDATA[Veri Sıkıştırma (Data Compression)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/19/kod-kelimesi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Haberleşmede kullanılan bir terimdir. Bir kod kelimesi (code word), belirli bir teşrifatın (protocol, protokol) anlamlı en küçük parçasıdır. Her kod kendi başına tek bir anlam ifade eder ve bu anlam yeganedir (unique). Aynı yaklaşım programlama dilleri için de geçerlidir. Her programlama dilinde bulunan her kelime tek bir anlam ifade eder. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Haberleşmede kullanılan bir terimdir. Bir kod kelimesi (code word), belirli bir <a href="http://www.bilgisayarkavramlari.com/2009/08/22/3317/">teşrifatın (protocol, protokol)</a> anlamlı en küçük parçasıdır. Her kod kendi başına tek bir anlam ifade eder ve bu anlam yeganedir (unique).
</p>
<p>Aynı yaklaşım programlama dilleri için de geçerlidir. Her programlama dilinde bulunan her kelime tek bir anlam ifade eder.
</p>
<p>Örneğin bir programlama dilindeki &#8220;if&#8221; kelimesi, bu dildeki <a href="http://www.bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/">kaynak kodda bulunan (source code)</a> kod kelimesidir (code word).
</p>
<p>Benzer durum herhangi bir haberleşme teşrifatında da olabilir.
</p>
<p>Kod kelimeleri kullanıldıkları yere göre kanal kelimeleri (channel code words) veya kaynak kelimeleri (source code words) olarak isimlendirilebilir. İlki haberleşme ikincisi ise programlama tabiridir.
</p>
<p>Ancak kavramsal olarak kaynak kelimelerinin veri sıkıştırma (data compression) veya veri güvenliği (cryptography) gibi alanlarda kullanılması da mümkündür. Örneğin uzun bir kelimeyi, daha kısa bir kelime ile ifade etmenin anlamı, bu kelimenin yerine geçen bir kaynak kod kullanılmasıdır.
</p>
<p>Benzer şekilde kanal kodları, gürültülü ortamlarda veri iletişimini güvenli hale getirmek için gereksiz ilave bilgiler içerebilir. Yani kod kelimeleri, yerine kullanıldıkları anlamdan uzun veya kısa olabilmektedirler.
</p>
<p>Veri güvenliği açısından da bir kod kelimesi, yerine kullanıldığı kelimeye dönüşü sadece belirli kişiler tarafından yapılabilen şifreli metindir. </p>

<p class="sayac_bilgi">197 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/19/kod-kelimesi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spagetti Kod (Spaghetti Code)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/02/15/spagetti-kod-spaghetti-code/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/02/15/spagetti-kod-spaghetti-code/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 23:35:40 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Yazılım Mühendisliği (Software Engineering)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/02/15/spagetti-kod-spaghetti-code/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar kodlamasında, bir kodun okunabilirliğinin düşük olması, yani kod takibinin zor olması durumunda, koda verilen isimdir. Genellikle yapısal programlama dillerinde (structured programming languages) fonksiyonların bulunması ile birlikte GOTO veya JMP gibi, kodun içerisinde bir yerden başka bir yere atlayan komutların kaldırılması mümkündür. Bu tip komutların kullanılması durumunda, kodun hem diğer [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bilgisayar kodlamasında, bir kodun okunabilirliğinin düşük olması, yani kod takibinin zor olması durumunda, koda verilen isimdir.
</p>
<p>Genellikle <a href="http://www.bilgisayarkavramlari.com/2007/12/18/yapisal-programlama-structured-programming/">yapısal programlama dillerinde (structured programming languages)</a> fonksiyonların bulunması ile birlikte <a href="http://www.bilgisayarkavramlari.com/2009/12/26/etiket-ve-gitme-komulari-label-and-goto/">GOTO veya JMP gibi</a>, kodun içerisinde bir yerden başka bir yere atlayan komutların kaldırılması mümkündür.
</p>
<p>Bu tip komutların kullanılması durumunda, kodun hem diğer programcılar tarafından okunabilirliği düşer, hem de kodun karmaşıklığı kestirilemez bir hâle gelebilir.
</p>
<p>Spagetti kodu engellemek için 3 temel adım kullanılır:
</p>
<ol>
<li>Kodda bulunan ve koşula bağlanması istenen satırlar için if bloğu kullanılır
</li>
<li>Kodda bulunan ve tekrarlanması istenen satırlar için döngü kullanılır
</li>
<li>Kodda bulunan ve parametrize edilmesi istenen satırlar için (aynı satırların farklı değerlerle çalışması isteniyorsa) fonksiyon kullanılır.
</li>
</ol>
<p>Yukarıdaki bu üç adım tamamlandıktan sonra kodda herhangi bir <a href="http://www.bilgisayarkavramlari.com/2009/12/26/etiket-ve-gitme-komulari-label-and-goto/">GOTO satırı</a> kalmamalıdır.
</p>
<p>Ayrıca spagetti kodundan esinlenerek katmanlı mimarinin kullanıldığı ve projelerin birden fazla seviyeye bölünerek ele alındığı yaklaşımlara lazanya kod (lasagna code) ; veya özellikle <a href="http://www.bilgisayarkavramlari.com/2007/04/14/nesne-yonelimli-programlama-object-oriented-programming/">nesne yönelimli programlama dillerinde (object oriented programming languages),</a> program parçalarının birbiri ile olan ilişkisinin asgariye indirildiği ve neredeyse her parçacığın tek başına varlığını sürdürebildiği kodlama yaklaşımlarına da ravioli kod (ravioli code) isimleri verilmektedir.</p>

<p class="sayac_bilgi">197 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/02/15/spagetti-kod-spaghetti-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

