<?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; C/C++</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/cc/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>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>Ö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>Poisson Dağılımı (Poisson Distribution)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/06/08/poisson-dagilimi-poisson-distribution/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/06/08/poisson-dagilimi-poisson-distribution/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 05:46:07 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/06/08/poisson-dagilimi-poisson-distribution/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimleri de dahil olmak üzere pek çok mühendislik ve istatistiksel uygulamada kullanılan bir dağılımdır. İsmini, kendi olasılık teorisini yayınlayan Sim`eon Denis Poisson&#8217;un soy isminden almaktadır ve Türkçede, “pvasson” kelimesinin okunması şeklinde telaffuz edilmektedir. (neden bilmiyorum ama ben de dahil pek çok kişi bilmeden bu dağılımı İngilizcedeki “poison” gibi telaffuz [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">Bilgisayar bilimleri de dahil olmak üzere pek çok mühendislik ve istatistiksel uygulamada kullanılan bir dağılımdır. İsmini, kendi olasılık teorisini yayınlayan Sim`eon Denis Poisson&#8217;un soy isminden almaktadır ve Türkçede, “pvasson” kelimesinin okunması şeklinde telaffuz edilmektedir. (neden bilmiyorum ama ben de dahil pek çok kişi bilmeden bu dağılımı İngilizcedeki “poison” gibi telaffuz etmekte ısrar ediyoruz, oysaki kelime Fransızca <img src='http://www.bilgisayarkavramlari.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p style="margin-bottom: 0cm;">İlginç bir şekilde doğal olaylardaki dağılımlar oluşturulduğunda Poisson dağılımına yakın karakterde çıkmaktadır. Örneğin bir telefon santraline dakikada gelen aramaların dağılımı, bir web sunucusunda yapılan dakika başına sayfa talepleri veya sabit bir radyasyon altında bir DNA diziliminde meydana gelen mutasyon sayıları gibi değerlerin dağılımı hep Poisson dağılımına uymaktadır.</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307512070_0__.jpg" border="0" alt="" width="141" height="50" /></p>
<p>Karakteristik denklemi ile hesaplanmaktadır. Formüldeki k, gerçekleşen olayların sayısını  <em>λ i</em> <span style="font-style: normal;">se beklenen değeri (expected value) vermektedir</span> <em>.</em></p>
<p style="margin-bottom: 0cm; font-style: normal;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307512070_1__.jpg" border="0" alt="" width="472" height="349" /></p>
<p>Yukarıdaki şekilde farklı  <em>λ</em> değerleri için çizilmiş farklı dağılım grafikleri görülmektedir. (şekildeki yatay eksen k değerlerini ifade etmektedir).</p>
<p style="margin-bottom: 0cm; font-style: normal;">Yukarıda verdiğimiz fonksiyonu C dilinde kodlayalım:</p>
<p style="margin-bottom: 0cm; font-style: normal;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307512070_2__.jpg" border="0" alt="" width="643" height="359" />Poisson dağılımı yukarıdaki kodda görüldüğü üzere basit bir fonksiyon ile hesaplanabilir. Bu fonksiyondaki e değeri kabulü yine kodda verilmiştir, hassasiyeti arttırmak için hane sayısı arttırılabilir.</p>
<p style="margin-bottom: 0cm; font-style: normal;">Yukarıdaki kodun ekran çıktısı aşağıda verilmiştir:</p>
<p style="margin-bottom: 0cm; font-style: normal;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307512070_3__.jpg" border="0" alt="" width="296" height="225" /></p>
<p>Yukarıdaki değerleri grafik üzerine yerleştirecek olursak:</p>
<p style="margin-bottom: 0cm; font-style: normal;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307512070_4__.jpg" border="0" alt="" width="303" height="236" /></p>
<p>Şekilde görüldüğü üzere dağılım fonksiyonu, yazının başında verilen dağılım şeklindedir.&nbsp;</p>
</div>

<p class="sayac_bilgi">450 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/06/08/poisson-dagilimi-poisson-distribution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Normal Dağılım (Normal Distribution, Gauss Distribution)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/06/08/normal-dagilim-normal-distribution-gauss-distribution/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/06/08/normal-dagilim-normal-distribution-gauss-distribution/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 04:39:36 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/06/08/normal-dagilim-normal-distribution-gauss-distribution/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, bilgisayar bilimlerinde, çeşitli konularda geçen normal dağılımı anlatmaktır. Literatürde, normal dağılım (normal distribution) veya Gauss dağılımı (Gauss distribution) olarak da geçen konu kabaca çan eğrisi olarak tanımlanabilir (bell curve). &#160; Yukarıdaki şekil, normal dağılımın grafiğidir ve aşağıdaki formülle hesaplanır (Gauss fonksiyonu): Yukarıdaki formül, aynı zamanda gauss dağılımının, [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">Bu yazının amacı, bilgisayar bilimlerinde, çeşitli konularda geçen normal dağılımı anlatmaktır. Literatürde, normal dağılım (normal distribution) veya Gauss dağılımı (Gauss distribution) olarak da geçen konu kabaca çan eğrisi olarak tanımlanabilir (bell curve).</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307508075_0__.jpg" border="0" alt="" width="416" height="257" /></p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p>Yukarıdaki şekil, normal dağılımın grafiğidir ve aşağıdaki formülle hesaplanır (Gauss fonksiyonu):</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307508075_1__.jpg" border="0" alt="" width="197" height="53" /></p>
<p>Yukarıdaki formül, aynı zamanda gauss dağılımının, olasılık yoğunluk fonksiyonu (probability dense function, pdf) olarak geçmektedir. Formülde kullanılan ve çan eğrisinin şeklini belirleyen en önemli değişken  <em>σ</em> <span style="font-style: normal;">değeridir. Bu değer dağılımın üzerinde uygulandığı olasılıksal sürecin (stochastic process) veya topluluğun (population)  <a href="http://www.bilgisayarkavramlari.com/2011/05/30/standart-sapma-standard-deviation-stdev/">standart sapmasıdır (standard deviation)</a>. Dikkat edilirse formülde kullanıldığı iki yerde de karesi alınmıştır. Bu anlamda değişme (varyans, variance) değeri olarak kabul edilebilir (E = σ</span> <sup><span style="font-style: normal;">2</span></sup> <span style="font-style: normal;">olduğunu hatırlayınız).</span></p>
<p style="margin-bottom: 0cm;"><span style="font-style: normal;">Ayrıca formülümüzde bulunan μ değeri, ortalama değerdir (mean) ve çan eğrisinin tepe noktasının hangi x değeri için olduğunu belirler. Örneğin yukarıdaki şekilde 3.6 noktasında tepe yapmıştır. Bu durumda μ=3.6 olmuş denilebilir.</span></p>
<p style="margin-bottom: 0cm;"><span style="font-style: normal;">Bütün dağılım fonksiyonlarının ortak özelliği olarak, çizilen eğrinin altında kalan alanın toplam değeri 1 olmalıdır (olasılıkların toplamının 1 olduğunu hatırlayınız).</span></p>
<p style="margin-bottom: 0cm;"><span style="font-style: normal;">Bu değerleri hesaplayan programı C++ dilinde yazmaya çalışalım:</span></p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307508075_2__.jpg" border="0" alt="" width="643" height="395" /> <span style="font-style: normal;">Kodda basitçe anlatılan fonksiyon kodlanmıştır. Fonksiyonu kodlarken math.h kütüphanesinden faydalandık ve PI ve e sabitlerini kodda görüldüğü şekilde tanımladık. Hassas sonuçlar için bu değerler daha hassas hale getirilebilir.</span></p>
<p style="margin-bottom: 0cm;"><span style="font-style: normal;">Kodun çalışan hali aşağıdaki şekildedir:</span></p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307508075_3__.jpg" border="0" alt="" width="462" height="100" /></p>
<p><span style="font-style: normal;">Yukarıdaki kod üç değer almaktadır. Buna göre hesaplanması istenen x, dağılımın ortalama değeri ve standart sapması girilmelidir. Dağılımın nasıl bir yapıda olduğunu görebilmek için bir döngü halinde bazı değerleri hesaplatalım:</span></p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307508075_4__.jpg" border="0" alt="" width="643" height="330" /></p>
<p style="margin-bottom: 0cm;"><span style="font-style: normal;">Yukarıdaki kodda, bir döngü içerisinde x=3.2 ile 4.0 arasındaki değerleri otomatik olarak hesaplatıyoruz. Kodun çıktısı aşağıdaki şekildedir:</span></p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307508075_5__.jpg" border="0" alt="" width="347" height="195" /></p>
<p><span style="font-style: normal;">Yukarıdaki sonuçlardan anlaşılacağı üzere değerler bir çan eğrisi şeklinde yükselip 3.6 değerinde tepe yaptıktan sonra tekrar alçalmaktadır. Bu durumu, yukarıdaki değerleri, aşağıdaki şekilde işaretleyerek göstermeye çalışalım:</span></p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307508075_6__.jpg" border="0" alt="" width="408" height="286" /></p>
<p><span style="font-style: normal;">Yukarıdaki şekilde kesikli olarak (discrete) elde edilen sonuç bir gauss dağılımıdır ve yazının başında verilen grafiğin kodlanarak ulaşılmış halidir. Grafiği daha iyi görebilmek için daha sık aralıklar verilerek deneme yapılabilir.</span></p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;"><span style="font-style: normal;">Ayrıca konunun bilgisayar bilimleri ile ilgili bir uygulaması için, resim işleme (image processing) konusunda kullanılan  <a href="http://www.bilgisayarkavramlari.com/2007/11/25/duzlestirme-filitresi-gauss-filtresi-gaussian-filter-smoothing-filter-gaussian-blur/">düzleştirme filitresi (gauss filter)</a> başlıklı yazıyı okuyabilirsiniz.</span></p>
</div>

<p class="sayac_bilgi">519 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/06/08/normal-dagilim-normal-distribution-gauss-distribution/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>ctype.h</title>
		<link>http://www.bilgisayarkavramlari.com/2011/05/29/ctype-h/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/05/29/ctype-h/#comments</comments>
		<pubDate>Sun, 29 May 2011 20:23:35 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/05/29/ctype-h/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı C kütüphanelerinden ctype.h kütüphanesini açıklamaktır. Kütüphane kabaca C dilinde bulunan karakterler (char) üzerinde işlem yapmaya imkan sağlar. Kütüphane ismi de buradan gelmektedir ( char + type = ctype) Amacı bir karakterin tipini algılama veya değiştirmektir. Kütüphane karakterler üzerinde işlem imkanı sağladığı için dizgiler (string) üzerinde yapılan işlemler [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı C kütüphanelerinden ctype.h kütüphanesini açıklamaktır. Kütüphane kabaca C dilinde bulunan karakterler (char) üzerinde işlem yapmaya imkan sağlar. Kütüphane ismi de buradan gelmektedir ( char + type = ctype)  Amacı bir karakterin tipini algılama veya değiştirmektir. Kütüphane karakterler üzerinde işlem imkanı sağladığı için <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizgiler (string)</a> üzerinde yapılan işlemler açısından avantaj sağlar.</p>
<p>Kütüphane herhangi bir C kodunda aşağıdaki şekilde eklenir.</p>
<p>#include &lt;ctype.h&gt;</p>
<p>Eklemenin ardından aşağıdaki fonksiyonlar çağırılabilir:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 108px;"></col>
<col style="width: 610px;"></col>
</colgroup>
<tbody>
<tr style="height: 40px;">
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-bottom: solid black 1.0pt;"><span style="color: black;"><strong>Fonksiyon İsmi</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-bottom: solid black 1.0pt;">
<p style="text-align: center;"><span style="color: black;"><strong>Açıklama</strong></span></p>
</td>
</tr>
<tr style="height: 20px; background: silver;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isalnum</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin alfa nümerik olup olmadığını sınar</span></td>
</tr>
<tr style="height: 20px;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isalpha</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin alfabetik bir karakter olup olmadığını sınar</span></td>
</tr>
<tr style="height: 20px; background: silver;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isblank</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin boşluk karakteri olup olmadığını sınar</span></td>
</tr>
<tr style="height: 20px;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>iscntrl</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin kontrol karakteri olup olmadığını sınar</span></td>
</tr>
<tr style="height: 20px; background: silver;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isdigit</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin sayı olup olmadığını sınar</span></td>
</tr>
<tr style="height: 22px;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isgraph</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin yazıcıdan basılabilen bir karakter olup olmadığını denetler. Bu karakter boşluk olamaz.</span></td>
</tr>
<tr style="height: 20px; background: silver;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>islower</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">karakterin küçük olarak yazılıp yazılmadığını sınar</span></td>
</tr>
<tr style="height: 20px;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isprint</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin basılabilir bir karakter olup olmadığını denetler</span></td>
</tr>
<tr style="height: 20px; background: silver;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>ispunct</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin bir imla karakteri olup olmadığına bakar</span></td>
</tr>
<tr style="height: 20px;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isspace</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">karakterin boşluk karakteri olup olmadığını sınar (ascii 32)</span></td>
</tr>
<tr style="height: 20px; background: silver;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isupper</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin büyük harf olup olmadığına bakar</span></td>
</tr>
<tr style="height: 19px;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>isxdigit</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakterin onaltılık tabandaki bir sayı olup olmadığına bakar (hexadecimal)</span></td>
</tr>
<tr style="height: 20px; background: silver;">
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>tolower</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px;"><span style="color: black;">Karakteri küçük harfe çevirir</span></td>
</tr>
<tr style="height: 20px;">
<td style="padding-left: 7px; padding-right: 7px; border-bottom: solid black 1.0pt;"><span style="color: black; font-family: Arial Unicode MS; font-size: 10pt;"><strong>toupper</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px; border-bottom: solid black 1.0pt;"><span style="color: black;">Karakteri büyük harfe çevirir</span></td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<p>Örnek olarak klavyeden bir <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizgi (string)</a> alan ve bu dizgi içerisindeki büyük harfleri küçüğe ve küçük harfleri büyüğe çeviren kodu aşağıdaki şekilde kodlayabiliriz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052911_2024_ctypeh1.png" alt="" /></p>
<p>Kodun örnek çıktısı aşağıda verilmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052911_2024_ctypeh2.png" alt="" /></p>

<p class="sayac_bilgi">181 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/05/29/ctype-h/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dosyayı Tersten Basan Kod</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 09:14:56 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Kod Örnekleri]]></category>
		<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Gelen bir soru üzerine, C dilinde bir dosyanın içeriğini tersten ekrana basan kodu yazıp sitede yayınlıyorum. Öncelikle algoritmamızı inşa edelim. Ters almak gibi işlemler yapı olarak özyineli (recursive) fonksiyonlara çok uygundur. Genelde stack (yığın) yapısının kullanıldığı özyineli fonksiyonlar bilgiyi tutma ve ters çevirme (son giren ilk çıkar (LIFO) algoritması) için [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Gelen bir soru üzerine, C dilinde bir dosyanın içeriğini tersten ekrana basan kodu yazıp sitede yayınlıyorum.
</p>
<p>Öncelikle algoritmamızı inşa edelim.
</p>
<p>Ters almak gibi işlemler yapı olarak <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive) fonksiyonlara</a> çok uygundur. Genelde <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">stack (yığın)</a> yapısının kullanıldığı <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli fonksiyonlar</a> bilgiyi tutma ve ters çevirme (son giren ilk çıkar (LIFO) algoritması) için elverişli olurlar. Bu yüzden biz de bir <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli fonksiyon</a> kullanarak dosyamızdan karakter karakter değerleri okuyacak sonra da bunları ekrana basacağız.
</p>
<p>Kodu aşağıda veriyorum:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/042611_0914_DosyayTerst11.png" alt=""/>
	</p>
<p>Kodumuzdaki main fonksiyonu sadece dosyayı açmakta ve sonra ters fonksiyonunu çağırmaktadır. Dosya ters fonksiyonunda işlendikten sonra (ki bu işleme dosyayı tersten basmak olacak) dosya kapatılmakta ve program sonlandırılmaktadır.
</p>
<p>Gelelim ters fonksiyonuna. Bu fonksiyon, dosya göstericisini (file pointer) parametre olarak alıp, dosya sonu olup olmadığını kontrol ediyor. Feof fonksiyonu, şayet dosyanın sonuna ulaştıysa, return; satırını çalıştıracak ve dolayısıyla fonksiyondan çıkılacak. Aslında bu durum bizim dosyamızın sonu ve dolayısıyla fonksiyonumuzun sonu ve dolayısıyla <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">özyineleme yığınımızın (recursion stack)</a> sonu olmaktadır.
</p>
<p>Fonksiyonun geri kalanında işlem gayet basit bir şekilde fscanf ile dosyadan okumak ve ardından tekrar ters fonksiyonunu çağırmak ve sonra da okunan karakteri ekrana basmak şekline ilerler.
</p>
<p>Buradaki kritik nokta, ters fonksiyonunu, ekrana karakter basmadan çağırmaktır. Şayet kodun 11. ve 12. satırları yer değiştirecek olsaydı, yani önce ekrana basıp sonra ters fonksiyonunu çağıracak olsaydık, bu durumda dosyanın içeriği olduğu gibi ekrana basılacaktır. Biz bunun yerine o andaki okunan karakteri bekletiyoruz ve sonraki karakteri basması ve ters çevirmesi için yeniden fonksiyona veriyoruz. Bu işlem dosya sonuna kadar gidiyor. Nihayet dosya sonuna erişilince <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">özyineli yığınımız (recursion stack)</a> toparlanmaya başlıyor ve bu toparlanma sırasında ekrana karakterleri basarak ilerliyor.
</p>
<p>Yukarıdaki kod, Dev-CPP ile test edilmiş ve çalışmaktadır. Örneğin girdi.txt dosyası olarak aşağıdaki içerikte bir dosyayı verirsek:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/042611_0914_DosyayTerst21.png" alt=""/>
	</p>
<p>Programın çıktısı aşağıdaki şekilde olur:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/042611_0914_DosyayTerst31.png" alt=""/>
	</p>
<p>
 </p>

<p class="sayac_bilgi">533 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Floyd Üçgeni (Floyd’s Triangle)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/02/14/floyd-ucgeni-floyd%e2%80%99s-triangle/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/02/14/floyd-ucgeni-floyd%e2%80%99s-triangle/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 03:59:38 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/02/14/floyd-ucgeni-floyd%e2%80%99s-triangle/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Robert Floyd tarafından tasarlanan bir sayı üçgenidir. Üçgen, her satırda, o satır kadar elemandan oluşan ve ardışık sayma sayılarının satırlara dağıtılması ile şekillenen, sağa yaslı bir dik üçgen olarak tanımlanabilir: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Yukarıdaki şekilde üçgenin ilk 5 [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Robert Floyd tarafından tasarlanan bir sayı üçgenidir. Üçgen, her satırda, o satır kadar elemandan oluşan ve ardışık sayma sayılarının satırlara dağıtılması ile şekillenen, sağa yaslı bir dik üçgen olarak tanımlanabilir:</p>
<pre>
1

2  3

4  5  6

7  8  9 10

11 12 13 14 15
</pre>
<p>Yukarıdaki şekilde üçgenin ilk 5 satırı görülebilir.</p>
<p>Üçgenin en solundaki sütunda bulunan sayıları listeleyecek olursak:</p>
<p>1, 2, 4, 7, 11 şeklindeki sayılara, merkezi poligon sayıları ismi verilir. Bu sayılar, verilen doğru sayısına göre, bir daireyi kaç farklı şekle böldüğünü gösterir.</p>
<p>Örneğin yukarıdaki sayı serisini eksi olmayan tam sayılar ile birebir eşleştirirsek</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 106px;"></col>
<col style="width: 106px;"></col>
<col style="width: 106px;"></col>
<col style="width: 106px;"></col>
<col style="width: 106px;"></col>
<col style="width: 106px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">5</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">7</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">11</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">16</td>
</tr>
</tbody>
</table>
</div>
<p>Yukarıdaki gibi bir tablo elde ederiz. Bu tablodaki ilk satır kaç doğru kullandığımız, ikinci satır ise kaç parça elde ettiğimizdir. Örneğin ilk sütunda 0 doğru kullanılmış ve daire en fazla tek parçaya ayrılabilmiştir. İkinci sütunda tek bir doğru ile daire iki parçaya ayrılmıştır. 3 doğru kullanarak daire en fazla 7 parçaya ayrılabilir. Bu durumu aşağıdaki şekilde görebilirsiniz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/021411_0359_FloydgeniF1.png" alt="" /></p>
<p>Yukarıdaki şekilde görüldüğü üzere daire 7 farklı parçaya bölünmüştür.</p>
<p>Kısacası, Floyd üçgeninin ilk sütununda bulunan sayılara, <a href="http://www.bilgisayarkavramlari.com/2011/02/14/merkezi-poligon-sayilari-centeral-polygon-numbers/">merkezi poligon sayıları (central polygon numbers) veya tembel pizzacı serileri (lazy caterer&#8217;s sequence) </a>isimleri verilir.  Bu ikinci isimlendirme, bir pizzacının, pizzasını en az bıçak darbesi ile en çok parçaya ayırma hevesinden gelmektedir <img src='http://www.bilgisayarkavramlari.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span style="font-family: Wingdings;"></span></p>
<p>Floyd üçgeninin ilk sütununu oluşturan bu seri, aşağıdaki formül ile hesaplanabilir:</p>
<p>k = (n<sup>2</sup> + n + 2) / 2 , bu denklemdeki n satır sayısı, k ise bu satırdaki ilk elemandır (veya aynı formül merkezi poligon sayılarını bulmak için de kullanılır)</p>
<p>Floyd üçgeninin diğer bir özelliği ise, herhangi bir satırdaki sayıların toplamının aşağıdaki formül ile bulunabilmesidir:</p>
<p><em>n</em>(<em>n</em><sup>2</sup> + 1)/2</p>

<p class="sayac_bilgi">312 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/02/14/floyd-ucgeni-floyd%e2%80%99s-triangle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dekker’s Algorithm</title>
		<link>http://www.bilgisayarkavramlari.com/2011/01/06/dekker%e2%80%99s-algorithm/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/01/06/dekker%e2%80%99s-algorithm/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 11:26:56 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[işletim sistemleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/01/06/dekker%e2%80%99s-algorithm/</guid>
		<description><![CDATA[Yazan: Şadi Evren ŞEKER Bilgisayar mühendisliğinde, birbirinde ayrı işlerin kontrolü için kullanılır. Aynı anda çalışan işlerin birbirinden tamamen ayrı olması için (mutually exclusive), bazı kontrollerin yapılması gerekmektedir. Algoritma bu problemi aşağıdaki şekilde çözer. Yukarıdaki kodda görüldüğü üzere, kod üç kısımdan oluşmaktadır: Bariyer Kritik alan Bitiş Bariyer kodunda, işlem (process), diğer çalışmakta olan ve o anda [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan: Şadi Evren ŞEKER
</p>
<p>Bilgisayar mühendisliğinde, birbirinde ayrı işlerin kontrolü için kullanılır. Aynı anda çalışan <a href="http://www.bilgisayarkavramlari.com/2011/01/05/birbirini-dislama-mutually-exclusive/">işlerin birbirinden tamamen ayrı olması için (mutually exclusive),</a> bazı kontrollerin yapılması gerekmektedir. Algoritma bu problemi aşağıdaki şekilde çözer.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/010611_1127_DekkersAlgo11.png" alt=""/>
	</p>
<p>Yukarıdaki kodda görüldüğü üzere, kod üç kısımdan oluşmaktadır:
</p>
<ol>
<li>Bariyer
</li>
<li>Kritik alan
</li>
<li>Bitiş
</li>
</ol>
<p>Bariyer kodunda<a href="http://www.bilgisayarkavramlari.com/2007/11/18/islem-process/">, işlem (process),</a> diğer çalışmakta olan ve o anda kritik bir koda erişen işlemleri bekler. Kendi önündeki bariyerin kalkmasıyla kritik alana girer. Bu alana o anda giren tek işlemdir çünkü kendi önündeki bariyerin kalkması ancak diğer işlemin bitiş kodunu çalıştırması ile mümkündür. Kritik alandaki görevini yerine getirdikten sonra bitiş kodunu çalıştırır ve beklemeden olan diğer işlemin bariyerlerini kaldırır.
</p>
<p>Yukarıdaki kodda kullanılan flag dizisi (array), boolean tipinde olup o anda hangi işlemin çalıştığını tutmaktadır. Örneğin yukarıdaki kodun simetriği olarak diğer işlemin kodu aşağıdaki şekilde verilebilir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/010611_1127_DekkersAlgo21.png" alt=""/>
	</p>
<p>İkinci kod ile ilk kod karşılaştırılırsa, flag[] ve turn değişkenlerine göre kimin çalışacağı belirlenmektedir.
</p>
<p>Kodlarda bulunan 7. Satırdaki while döngüsü, aslında bekleme işlemini sağlar. Bu döngü turn değişkenine göre sonsuza kadar beklemektedir. Ancak diğer işlem tarafından değeri değiştirilince işlem çalışmasına devam edebilir.
</p>
<p>Burada kullanılan turn değişkeni, iki işlem de aynı anda kritik alana girmek istiyorsa, anlık olarak bir tanesinin girmesini sağlar. Flag değişkeni ise o anda kritik alan girmek isteyen diğer işlem olup olmadığını kontrol eder.
</p>
<p>Örneğin P1 işlemi, kritik alana girmek istemiyorsa, P2 işleminin kritik alana girerken turn değişkenine bakmasının bir anlamı yoktur. Benzer şekilde P2 işleminin kritik alan ihtiyacı yoksa, P1 de turn değişkenine bakmaz. Ancak iki işlem (yani P1 ve P2) aynı anda kritik alana girmek istiyorlarsa turn değişkeni anlamlı olur.
</p>
<p>Bu tip beklemelere meşgul bekleme (busy wait) ismi verilir. Bu ismin verilme sebebi, işlemin sürekli olarak değişkenin değerine bakarak değeri değişene kadar beklemesidir. Bu bekleme işleminin sürekli bir kontrol yapıyor olması, işlemci üzerinde bir yük getirmektedir.
</p>
<p>Algoritmanın diğer bir özelliği ise <a href="http://www.bilgisayarkavramlari.com/2008/11/20/kilitlenme-deadlock/">kilitlenme (deadlock)</a> ve <a href="http://www.bilgisayarkavramlari.com/2008/11/19/kitlik-starvation/">kıtlık (starvation)</a> konularına karşı dayanıklı olmasıdır. Algoritmamızda <a href="http://www.bilgisayarkavramlari.com/2008/11/20/kilitlenme-deadlock/">kilitlenme (deadlock</a>) olmayacağı, turn değişkeninin kullanılmasından anlaşılabilir. Bu değişkenin sistemde anlık olarak tek değeri bulunacak (1 veya 0) ve bu değere göre sistem iki işlemden bir tanesini çalıştıracaktır.
</p>
<p><a href="http://www.bilgisayarkavramlari.com/2008/11/19/kitlik-starvation/">Kıtlık (starvation</a>) problemini görmek için ise bir ihtimalin daha hesaplanması gerekir. Buna göre örneğin P1 çalışıyor ve P0 bekliyorken, P1 işini bitirip P0&#8242;ın kilidini kaldırdığında P0 henüz çalışmaya başlamadan P1 yeniden çalışıyor mu diye algoritmaya bakmalıyız. Diğer bir deyişle, sürekli olarak kritik alana erişmeye çalışan P1 ve P0 işlemlerinden örneğin P1 işini bitirip kritik alandan çıktından sonra henüz P0 kritik alana girmeden yeniden P1 kritik alana giriyorsa kıtlık (starvation) oluşuyor demektir.
</p>
<p>Algoritmada böyle bir durum yaşanmaz. Bunun sebebi algoritmanın kullandığı flag değişkenidir. P1 işlemi, kritik alandan çıkarken, beklemede olan P0 işleminin bariyerini kaldırır ve bu kaldırma sonucunda P0 işlemi çalışırken P1&#8242;in yeniden çalışmasını engelleyici biçimde, diğer tarafın flag değişkenini atar.
</p>
<p>Kısaca algoritma <a href="http://www.bilgisayarkavramlari.com/2008/11/20/kilitlenme-deadlock/">kilitlenme (deadlock)</a> ve <a href="http://www.bilgisayarkavramlari.com/2008/11/19/kitlik-starvation/">kıtlık (starvation)</a> ihtimallerine karşı başarılı bir şekilde çalışır. </p>

<p class="sayac_bilgi">249 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/01/06/dekker%e2%80%99s-algorithm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

