<?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>Ahmet Kakıcı &#187; kod</title>
	<atom:link href="http://www.ahmetkakici.com/tag/kod/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ahmetkakici.com</link>
	<description>Blog</description>
	<lastBuildDate>Sun, 03 Apr 2011 10:48:45 +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>C# ile Görüntü İşleme &#8211; 3</title>
		<link>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-3/</link>
		<comments>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-3/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 09:27:35 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[görüntü işleme]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[kod]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=200</guid>
		<description><![CDATA[İlk iki yazının ardından ( 1 &#8211; 2 ) sonunda üçüncü yazıyı da yazabildim. Bu yazıya sadece morfolojik filtreler kaldı. Diğer yazılara gelen yorumlardan sonra açıklamadan çok koda ihtiyaç olduğu anladım, onun için aşağıda genleşme (dilation) ve aşınma (erosion) işlemini yapan fonksiyonları bulacaksınız. Benim kullandığım genleşme ve aşınma maskeleri en basit olanları. Siz kendi maskelerinizi [...]]]></description>
			<content:encoded><![CDATA[<p>İlk iki yazının ardından ( <a title="C# ile Görüntü İşleme - 1" href="http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-1/" target="_self">1</a> &#8211; <a title="C# ile Görüntü İşleme - 2" href="http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/" target="_self">2</a> ) sonunda üçüncü yazıyı da yazabildim. Bu yazıya sadece morfolojik filtreler kaldı. Diğer yazılara gelen yorumlardan sonra açıklamadan çok koda ihtiyaç olduğu anladım, onun için aşağıda genleşme (dilation) ve aşınma (erosion) işlemini yapan fonksiyonları bulacaksınız. Benim kullandığım genleşme ve aşınma maskeleri en basit olanları. Siz kendi maskelerinizi if koşulu içine yazarak dilediğiniz gibi kullanabilirsiniz.</p>
<p>Eğer genleşme ve aşınma hakkında daha fazla bilgi istiyorsanız <a title="Dilation" href="http://homepages.inf.ed.ac.uk/rbf/HIPR2/dilate.htm" target="_blank">Dilation</a> &#8211; <a title="Erosion" href="http://homepages.inf.ed.ac.uk/rbf/HIPR2/erode.htm" target="_blank">Erosion</a> bağlantılarını takip edebilirsiniz.<br />
<span id="more-200"></span></p>
<pre class="brush: csharp; title: ; notranslate">
void Dilation()
{
    if (!dilationDone)
    {

        dilationPixelArray = new int[imageWidth, imageHeight];
        for (int i = 1; i &lt; imageWidth - 1; i++)
        {
            for (int j = 1; j &lt; imageHeight - 1; j++)
            {
                if (binaryPixelArray[i, j] == 255)
                {
                    dilationPixelArray[i - 1, j] = 255;
                    dilationPixelArray[i, j - 1] = 255;
                    dilationPixelArray[i, j + 1] = 255;
                    dilationPixelArray[i + 1, j] = 255;
                }
            }
        }
    }
    else
    {
        int[,] tempArray = new int[imageWidth, imageHeight];
        Array.Copy(dilationPixelArray, tempArray, imageWidth * imageHeight);
        for (int i = 1; i &lt; imageWidth - 1; i++)
        {
            for (int j = 1; j &lt; imageHeight - 1; j++)
            {
                if (tempArray[i, j] == 255)
                {
                    dilationPixelArray[i - 1, j] = 255;
                    dilationPixelArray[i, j - 1] = 255;
                    dilationPixelArray[i, j + 1] = 255;
                    dilationPixelArray[i + 1, j] = 255;
                }
            }
        }
    }

}
void Erosion()
{
    if (!erosionDone)
    {
        erosionPixelArray = new int[imageWidth, imageHeight];
        for (int i = 1; i &lt; imageWidth - 1; i++)
        {
            for (int j = 1; j &lt; imageHeight - 1; j++)
            {
                if (binaryPixelArray[i, j] == 255)
                {
                    if (binaryPixelArray[i, j - 1] == 0 ||
                        binaryPixelArray[i - 1, j] == 0 ||
                        binaryPixelArray[i + 1, j] == 0 ||
                        binaryPixelArray[i, j + 1] == 0
                        )
                    {
                        erosionPixelArray[i - 1, j] = 0;
                        erosionPixelArray[i, j - 1] = 0;
                        erosionPixelArray[i, j + 1] = 0;
                        erosionPixelArray[i + 1, j] = 0;
                        erosionPixelArray[i, j] = 0;
                    }
                    else
                    {
                        erosionPixelArray[i, j] = binaryPixelArray[i, j];
                    }
                }
                else
                {
                    erosionPixelArray[i, j] = binaryPixelArray[i, j];
                }
            }
        }
    }
    else
    {
        int[,] tempArray = new int[imageWidth, imageHeight];
        Array.Copy(erosionPixelArray, tempArray, imageWidth * imageHeight);
        for (int i = 1; i &lt; imageWidth - 1; i++)
        {
            for (int j = 1; j &lt; imageHeight - 1; j++)
            {
                if (tempArray[i, j] == 255)
                {
                    if (tempArray[i, j - 1] == 0 ||
                        tempArray[i - 1, j] == 0 ||
                        tempArray[i + 1, j] == 0 ||
                        tempArray[i, j + 1] == 0
                        )
                    {
                        erosionPixelArray[i - 1, j] = 0;
                        erosionPixelArray[i, j - 1] = 0;
                        erosionPixelArray[i, j + 1] = 0;
                        erosionPixelArray[i + 1, j] = 0;
                        erosionPixelArray[i, j] = 0;
                    }
                    else
                    {
                        erosionPixelArray[i, j] = tempArray[i, j];
                    }
                }
                else
                {
                    erosionPixelArray[i, j] = tempArray[i, j];
                }
            }
        }
    }
}
</pre>
<p>Bundan önceki yazılardaki yapıyı kullandığınızı varsayarak yukarıdaki iki fonksiyonu aşağıdaki şekilde çağırmanız gerekli. Bu fonksiyonların yaptığı iş ise eğer resim ikili seviyeye indirgenmemişse (siyah-beyaz) önce bu işlemi yapmak. Tabii ikiliye çevirmek için herhangi bir eşik değeri belirlenmemişse otsu fonksiyonunu çağırarak önce bir eşik değeri hesaplatıyoruz. Binary fonksyionu ise 0-255 arasındaki parametreyi eşik değeri olarak kullanarak resmi ikili seviyeye indirgiyor, parametrenin 256 olması ise otsu ile hesaplanan eşik değerini alması içindir.</p>
<pre class="brush: csharp; title: ; notranslate">
public void ShowDilation()
{
    if (!dilationDone)
    {
        if (!binaryDone)
        {
            if (otsuValue == 0)
                Otsu();
            Binary(256);
        }
        Dilation();
        dilationDone = true;
    }
    else
    {
        Dilation();
    }
    SetImage(ref dilationPixelArray);
}

public void ShowErosion()
{
    if (!erosionDone)
    {
        if (!binaryDone)
        {
            if (otsuValue == 0)
                Otsu();
            Binary(256);
        }
        Erosion();
        erosionDone = true;
    }
    else
    {
        Erosion();
    }
    SetImage(ref erosionPixelArray);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-3/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>C# ile Görüntü İşleme &#8211; 2</title>
		<link>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/</link>
		<comments>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 14:31:41 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[görüntü işleme]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[kod]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=105</guid>
		<description><![CDATA[Daha önce görüntü okuma, gösterme ve kaydetme gibi başlıca fonksiyonları vermiştim. Aşağıda ise asıl görüntüyü işeyecek fonksiyonlar bulunmaktadır. Tabii buradaki fonksiyonları kullanbilmek için daha önceden verdiğim şekilde görüntünün dizilere aktarılmış olması gerekiyor. Önceki yazıda gri seviyeye çevirilmiş görüntümüz vardı eğer bu görüntüyü siyah beyaza çevirmek istiyorsanız bunun için bir eşik değeri seçerek 0-255 arasındaki gri [...]]]></description>
			<content:encoded><![CDATA[<p>Daha önce görüntü okuma, gösterme ve kaydetme gibi başlıca fonksiyonları <a href="http://www.ahmetkakici.com/yazilim/goruntu-isleme-c/" target="_blank">vermiştim</a>. Aşağıda ise asıl görüntüyü işeyecek fonksiyonlar bulunmaktadır. Tabii buradaki fonksiyonları kullanbilmek için daha önceden verdiğim şekilde görüntünün dizilere aktarılmış olması gerekiyor.</p>
<p>Önceki yazıda gri seviyeye çevirilmiş görüntümüz vardı eğer bu görüntüyü siyah beyaza çevirmek istiyorsanız bunun için bir eşik değeri seçerek 0-255 arasındaki gri seviye görüntüyü bu seviyeye göre siyah veya beyaz olarak ayırmak gerekiyor. Eşik değerini sabit bir değer olarak belirleyebileceğiniz gibi her görüntüye göre dinamik olarak bir eşik değeri belirleyebilen bir yöntem de mevcuttur: otsu. Otsu algoritması sayesinde üzerinde çalıştığınız görüntüye özel bir eşik değerini otomatik olarak belirleyebilirsiniz. Bunun için görüntünün histogram dizisine ihtiyacınız olacak. İlk yazıda verdiğim kodda histogram çıkartma özelliği yoktu. Bunun için aşağıdaki kodu kullanabilirsiniz:</p>
<p><span id="more-105"></span></p>
<pre class="brush: csharp; title: ; notranslate">

int[,] pixelArray = new int[pictureBox1.Image.Height, pictureBox1.Image.Width];
int[,] greyPixelArray = new int[pictureBox1.Image.Height, pictureBox1.Image.Width];
int[] histogram = new int[256];

void BuildPixelArray(ref Image myImage)
{
pixelArray = new int[imageWidth, imageHeight];
greyPixelArray = new int[imageWidth, imageHeight];
Rectangle rect = new Rectangle(0, 0, myImage.Width, myImage.Height);
Bitmap temp = new Bitmap(myImage);
BitmapData bmpData = temp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int remain = bmpData.Stride - bmpData.Width * 3;
unsafe
{
byte* ptr = (byte*)bmpData.Scan0;
for (int j = 0; j &lt; bmpData.Height; j++)
{
for (int i = 0; i &lt; bmpData.Width; i++)
{
pixelArray[i, j] = ptr[0] + ptr[1] * 256 + ptr[2] * 256 * 256;
greyPixelArray[i, j] = (int)((double)ptr[0] * 0.11 + (double)ptr[1] * 0.59 + (double)ptr[2] * 0.3);
histogram[greyPixelArray[i, j]]++;
ptr += 3;
}
ptr += remain;
}
}
temp.UnlockBits(bmpData);
}
</pre>
<p>Burada histogram dizisini de oluşturduktan sonra artık otsu algoritması sayesinde dinamik olarak eşik değerini belirleyebiliriz:</p>
<pre class="brush: csharp; title: ; notranslate">

int otsuValue;

void Otsu()
{
double fmax = -1.0;
double m1, m2, S, toplam1 = 0.0, toplam2 = 0.0;
int nTop = 0, n1 = 0, n2;

for (int i = 0; i &lt; 256; i++)
{
toplam1 += (double)i * (double)histogram[i];
nTop += histogram[i];
}

for (int i = 0; i &lt; 256; i++)
{
n1 += histogram[i];
if (n1 == 0)
continue;
n2 = nTop - n1;
if (n2 == 0)
break;
toplam2 += (double)i * (double)histogram[i];
m1 = toplam2 / n1;
m2 = (toplam1 - toplam2) / n2;
S = (double)n1 * (double)n2 * (m1 - m2) * (m1 - m2);
if (S &gt; fmax)
{
fmax = S;
otsuValue = i;
}
}
}
</pre>
<p>Otsu veya sabit bir değere göre görüntüyü siyah beyaza çevirecek kod ise aşağıdadır. Bu fonksiyonun aldığı argThreshold parametresi eşik değerini belirtern 0-255 arasında bir değerdir.</p>
<pre class="brush: csharp; title: ; notranslate">

void Binary(int argThreshold)
{
binaryPixelArray = new int[imageWidth, imageHeight];
for (int i = 0; i &lt; imageWidth; i++)
{
for (int j = 0; j &lt; imageHeight; j++)
{
if (greyPixelArray[i, j] &lt; threshold)
binaryPixelArray[i, j] = 0;
else
binaryPixelArray[i, j] = 255;
}
}
}
</pre>
<p>Görüntüyü siyah beyaza çevirdikten sonra eğer kenar bulma algoritmalarını kullanmak isterseniz bir kaç seçeneğiniz mevcut. Bunlardan en popüleri sobel kenar bulma filtresidir. Aşağıdaki fonksiyonda type parametresi hangi tür kenarların bulunacağını belirtmek içindir. Dikey, yatay, köşegen şeklindeki kenarları veya tamamını ayrı ayrı bulabilirsiniz.</p>
<pre class="brush: csharp; title: ; notranslate">

void Sobel(int type)
{
int normalizeMax = 0;
int normalizeMin = maxIntVal;

sobelPixelArray = new int[imageWidth, imageHeight];
int[,] sobelArray1 =
new int[3, 3] {
{ 1, 0, -1 },
{ 2, 0, -2 },
{ 1, 0, -1 }
};

int[,] sobelArray2 =
new int[3, 3] {
{ 1, 2, 1 },
{ 0, 0, 0 },
{-1,-2,-1 }
};
int[,] sobelArray3 =
new int[3, 3] {
{ 2, 1, 0 },
{ 1, 0,-1 },
{ 0,-1,-2 }
};

int G1, G2, G3;
for (int i = 1; i &lt; imageWidth - 1; i++)
{
for (int j = 1; j &lt; imageHeight - 1; j++)
{
G1 = 0;
G2 = 0;
G3 = 0;
for (int k = -1; k &lt; 2; k++)
{
for (int l = -1; l &lt; 2; l++)
{
G1 += greyPixelArray[i + k, j + l] * sobelArray1[k + 1, l + 1];
G2 += greyPixelArray[i + k, j + l] * sobelArray2[k + 1, l + 1];
G3 += greyPixelArray[i + k, j + l] * sobelArray3[k + 1, l + 1];
}
}
if(type == 0)
{
sobelPixelArray[i, j] = Math.Abs(G1) + Math.Abs(G2) + Math.Abs(G3);
}
else if (type == 1)
{
sobelPixelArray[i, j] = Math.Abs(G2);
}
else if (type == 2)
{
sobelPixelArray[i, j] = Math.Abs(G1);
}
else if (type == 3)
{
sobelPixelArray[i, j] = Math.Abs(G3);
}

if (normalizeMax &lt; sobelPixelArray[i, j])
normalizeMax = sobelPixelArray[i, j];
if (normalizeMin &gt; sobelPixelArray[i, j])
normalizeMin = sobelPixelArray[i, j];
}
}

NormalizeArray(ref sobelPixelArray, normalizeMax, normalizeMin);
}
</pre>
<p>Yukarıda bulunan kodun en altında çağırılan normalize fonksiyonu ise sonuç dizisini 0-255 değerleri arasına düşürmek içindir:</p>
<pre class="brush: csharp; title: ; notranslate">

void NormalizeArray(ref int[,] sourceArray,int normalizeMax,int normalizeMin)
{

int factor = normalizeMax - normalizeMin;
for (int i = 0; i &lt; sourceArray.GetLength(0); i++)
{
for (int j = 0; j &lt; sourceArray.GetLength(1); j++)
{
sourceArray[i, j] = (sourceArray[i, j] - normalizeMin) * 255 / factor;
}
}
}
</pre>
<p>Bir diğer kenar bulma yöntemi ise Prewitt&#8217;tir:</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] prewittPixelArray;

void Prewitt()
{
int normalizeMax = 0;
int normalizeMin = maxIntVal;
prewittPixelArray = new int[imageWidth, imageHeight];
int[,] PrewittArray1 =
new int[3, 3] {
{-1,-1,-1 },
{ 0, 0, 0 },
{ 1, 1, 1 }
};

int[,] PrewittArray2 =
new int[3, 3] {
{ -1, 0, 1 },
{ -1, 0, 1 },
{ -1, 0, 1 }
};
int[,] PrewittArray3 =
new int[3, 3] {
{-1,-1, 0 },
{-1, 0, 1 },
{ 0, 1, 1 }
};

int[,] PrewittArray4 =
new int[3, 3] {
{ 1, 1, 0 },
{ 1, 0,-1 },
{ 0,-1,-1 }
};

int G1, G2, G3, G4;
for (int i = 1; i &lt; imageWidth - 1; i++)
{
for (int j = 1; j &lt; imageHeight - 1; j++)
{
G1 = 0;
G2 = 0;
G3 = 0;
G4 = 0;
for (int k = -1; k &lt; 2; k++)
{
for (int l = -1; l &lt; 2; l++)
{
G1 += greyPixelArray[i + k, j + l] * PrewittArray1[k + 1, l + 1];
G2 += greyPixelArray[i + k, j + l] * PrewittArray2[k + 1, l + 1];
G3 += greyPixelArray[i + k, j + l] * PrewittArray3[k + 1, l + 1];
G4 += greyPixelArray[i + k, j + l] * PrewittArray4[k + 1, l + 1];
}
}

prewittPixelArray[i, j] = Math.Abs(G1) + Math.Abs(G2) + Math.Abs(G3) + Math.Abs(G4);
if (normalizeMax &lt; prewittPixelArray[i, j])
normalizeMax = prewittPixelArray[i, j];
if (normalizeMin &gt; prewittPixelArray[i, j])
normalizeMin = prewittPixelArray[i, j];
}
}

int factor = normalizeMax - normalizeMin;
for (int j = 1; j &lt; imageHeight - 1; j++)
{
for (int i = 1; i &lt; imageWidth - 1; i++)
{
prewittPixelArray[i, j] = (prewittPixelArray[i, j] - normalizeMin) * 255 / factor;
}
}
}
</pre>
<p>Prewitt ve sobel&#8217;e alternatif olarak Robert kenar bulma filtresi de mevcuttur :</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] robertPixelArray;

void Robert()
{

robertPixelArray = new int[imageWidth, imageHeight];
for (int i = 1; i &lt; imageHeight - 1; i++)
{
for (int j = 1; j &lt; imageWidth - 1; j++)
{
robertPixelArray[j, i] = Math.Abs(greyPixelArray[j, i] - greyPixelArray[j - 1, i - 1]) + Math.Abs(greyPixelArray[j, i - 1] - greyPixelArray[j - 1, i]);
}
}
}
</pre>
<p>Eğer kenar bulma algoritmalarını kullanmadan önce görüntüdeki gürültüleri temizlemek istiyorsanız mean, median ve gaussian filtereleri ile bu işlemi yapabilirsiniz.</p>
<p>Mean filtresi :</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] meanPixelArray;

void Mean()
{
meanPixelArray = new int[imageWidth, imageHeight];
for (int i = 1; i &lt; imageHeight - 1; i++)
{
for (int j = 1; j &lt; imageWidth - 1; j++)
{
meanPixelArray[j, i] =
(
greyPixelArray[j, i - 1]
+ greyPixelArray[j, i + 1]
+ greyPixelArray[j, i]
+ greyPixelArray[j - 1, i - 1]
+ greyPixelArray[j - 1, i + 1]
+ greyPixelArray[j - 1, i]
+ greyPixelArray[j + 1, i - 1]
+ greyPixelArray[j + 1, i + 1]
+ greyPixelArray[j + 1, i]
) / 9;
}
}
}
</pre>
<p>Median filtresi:</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] medianPixelArray;

void Median()
{

medianPixelArray = new int[imageWidth, imageHeight];
int[] tempArray = new int[9];
for (int i = 1; i &lt; imageHeight - 1; i++)
{
for (int j = 1; j &lt; imageWidth - 1; j++)
{
int counter = 0;
for (int k = -1; k &lt; 2; k++)
{
for (int l = -1; l &lt; 2; l++)
{
tempArray[counter++] = greyPixelArray[j + l, i + k];
}
}
System.Array.Sort(tempArray);
medianPixelArray[j, i] = tempArray[4];
}
}
}
</pre>
<p>Gaussian filtresi</p>
<pre class="brush: csharp; title: ; notranslate">

int[,] gaussianPixelArray;

void Gaussian()
{
gaussianPixelArray = new int[imageWidth, imageHeight];

int[,] gaussianArray =
new int[5, 5] {
{1,4,7,4,1},
{4,16,26,16,4},
{7,26,41,26,7},
{4,16,26,16,4},
{1,4,7,4,1}
};
int tempSum;
for (int i = 2; i &lt; imageHeight - 2; i++)
{
for (int j = 2; j &lt; imageWidth - 2; j++)
{
tempSum = 0;
for (int k = -2; k &lt; 3; k++)
{
for (int l = -2; l &lt; 3; l++)
{
tempSum += greyPixelArray[j + l, i + k] * gaussianArray[k + 2, l + 2];
}
}
gaussianPixelArray[j, i] = tempSum / 273;
}
}
}
</pre>
<p>Daha sonraki yazıda yapısal (morfolojik) işlemleri yapan filtreleri de açıklamalarıyla birlikte vermeyi düşünüyorum. O zamana kadar hepinize kolay gelsin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/c-ile-goruntu-isleme-2/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Prolog ile Determinant Hesabı</title>
		<link>http://www.ahmetkakici.com/programlama/prolog-ile-determinant-hesabi/</link>
		<comments>http://www.ahmetkakici.com/programlama/prolog-ile-determinant-hesabi/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 11:37:42 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[kod]]></category>
		<category><![CDATA[prolog]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=104</guid>
		<description><![CDATA[Determinant; bir kare matrisi, reel bir sayıyla eşleştiren özel bir fonksiyondur. Sadece kare matrislere uygulanabilir. Determinant hesabının temel yolu minör ve kofaktörlerinin hesaplanması yöntemidir. Buna ek olarak kolay hesaplama için Sarrus Yöntemi adında başka bir yöntem daha geliştirilmiştir. Minör ve kofaktör hesabı ile daha büyük matrisleri daha sistemli bir şekilde çarpabiliriz. Minör tanım olarak: A [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Determinant" target="_blank">Determinant</a>; bir kare matrisi, reel bir sayıyla eşleştiren özel bir fonksiyondur. Sadece kare matrislere uygulanabilir. Determinant hesabının temel yolu minör ve kofaktörlerinin hesaplanması yöntemidir. Buna ek olarak kolay hesaplama için <a href="http://en.wikipedia.org/wiki/Rule_of_Sarrus" target="_blank">Sarrus Yöntemi</a> adında başka bir yöntem daha geliştirilmiştir.<br />
<span id="more-104"></span><br />
Minör ve kofaktör hesabı ile daha büyük matrisleri daha sistemli bir şekilde çarpabiliriz.<br />
Minör tanım olarak: A = (aij) nxn kare matrisinde bir aij ( 1≤i,j≤n)  öğesinin bulunduğu i. satır ve j. sütunun çıkarılmasıyla elde edilen n-1. dereceden kare matrisinin determinantıdır. Mij ile ifade edilir.<br />
A = (aij) nxn matrisinde aij öğesinin minörü olan Mij ‘nin (-1)^(i+j) ile çarpılmasıyla elde edilen sayıya aij öğesinin kofakötür denir ve Aij ile gösterilir.<br />
Bir kare matrisin minör ve kofaktörlerinin çarpımlarının toplamı o matrisin determinantını verir.<br />
Prolog dilinde yazılan programda da kofaktör ve minör hesabı ile determinant hesabı yapılmıştır. Goal kısmında örnek bir matris verilerek determinantı hesaplanıştır.</p>
<pre class="brush: jscript; title: ; notranslate">

DOMAINS
liste=integer*
matris = liste*
int=integer

PREDICATES
ilkEleman(liste,int)
uzunluk(liste,int)
detBul(liste,liste,int)
ilkleriSil(matris,matris)
negatif(int,int)
sonaAt(matris,matris)
tersCevirListe(matris,matris)
tersCeviriciListe(matris,matris,matris)
det(matris,int,int,int)

CLAUSES
ilkEleman([X|_],X).

uzunluk([],0).
uzunluk([_|K],U):-uzunluk(K,X),U=X+1.

ilkleriSil([],[]).
ilkleriSil([[_|BasKuyruk]|Kuyruk1],[ BasKuyruk |SonucKuyruk]):-
ilkleriSil(Kuyruk1,SonucKuyruk).

negatif(-1,1).
negatif(1,-1).

sonaAt([Bas|Kuyruk],Sonuc):-
tersCevirListe(Kuyruk,TersKuyruk),
tersCevirListe([Bas|TersKuyruk],Sonuc).

tersCevirListe(X,Y):-tersCeviriciListe(X,[],Y).
tersCeviriciListe([],X,X).
tersCeviriciListe([B|K],TMP,SONUC) :-
tersCeviriciListe(K,[B|TMP],SONUC).

detBul([Bas1,Kuyruk1|_],[Bas2,Kuyruk2|_],Sonuc):-
Sonuc = Bas1*Kuyruk2-Bas2*Kuyruk1.

det([Bas1,Bas2|_],_,Sonuc,_):-
uzunluk(Bas1,En),
En&lt;=2,
detBul(Bas1,Bas2,Sonuc),!.

det([Bas|_],Sayac,0,_):-uzunluk(Bas,En),En&lt;=Sayac,!.

det([Bas|Kuyruk],Sayac,Sonuc,_):-
YeniSayac=Sayac+1,
uzunluk(Bas,En),
En&gt;Sayac,
En&lt;=3,
sonaAt([Bas|Kuyruk],Sonda),
ilkEleman(Bas,KatSayi),
ilkleriSil(Kuyruk,KuyrukOrta),
det(KuyrukOrta,0,OrtaSonuc,_),
det(Sonda,YeniSayac,YanSonuc,_),
Sonuc=(KatSayi*OrtaSonuc)+YanSonuc,!.

det([Bas|Kuyruk],Sayac,Sonuc,X):-
YeniSayac=Sayac+1,
uzunluk(Bas,En),
En&gt;Sayac,
sonaAt([Bas|Kuyruk],Sonda),
ilkEleman(Bas,KatSayi),
ilkleriSil(Kuyruk,KuyrukOrta),
negatif(X,Y),
det(KuyrukOrta,0,OrtaSonuc,Y),
det(Sonda,YeniSayac,YanSonuc,Y),
Sonuc=(X*KatSayi*OrtaSonuc)+YanSonuc.

GOAL
write(&quot;_____&quot;),nl,det([[1,2,4,8],[2,2,7,11],[3,6,3,12],[4,13,0,5]],0,Sonuc,1),write(Sonuc).
</pre>
<p>Programda kullanılan yüklemlere tek tek bakacak olursak yüklemlerin yaptığı görevler aşağıda açıklanmıştır:</p>
<ul>
<li>ilkEleman(liste,int):  aldığı tamsayı listesinin ilk elemanını vermektedir.</li>
<li>uzunluk(liste,int) :  aldığı tamsayı listesinin eleman sayısını vermektedir.</li>
<li>detBul(liste,liste,int) :  2&#215;2 matrisin çarpımını yapar. Aldığı iki listenin uzunluğu da birbirine eşit ve iki olmalıdır.</li>
<li>ilkleriSil(matris,matris) :  Minörleri ilk satıra göre açtığım için verilen matrisin ilk satırını silmek için bu yüklem kullanılmıştır.</li>
<li>negatif(-1,1) :  Kofaktörlerin katsayılarını hesaplamak için kullanılmıştır. Her kofaktörde bir önceki kofaktörün katsayısının negatifi hesaplanmıştır.</li>
<li>sonaAt(matris,matris) :  Minörlerin hesabında bir sonraki sütuna göre açılım yapıldığında bu yüklem sayesinde ilk sütun sona atılarak ikinci sütun ilk sütun haline getirilir. Ayrıca 3&#215;3 matrislerde determinant hesaplanırken katsayılarının sırasıyla +1 ve -1 ile çarpılmasına bu yüklem sayesinde gerek kalmamıştır.</li>
<li>tersCevirListe(matris,matris) :  Sona at yükleminde ilk sütunu sona atmak için varolan matrisin ilk sütunu alınarak kalan matris ters çevirilerek ilk sütun başa koyulduktan sonra matris tekrar ters çevrilmiştir. Bu yüklem ters çevirme işlemini yapmaktadır.</li>
<li>tersCeviriciListe(matris,matris,matris) :  tersCevirListe yükleminde kullanılan geçici matrisi bu yüklem ile tanımlayarak asıl yüklemin iki parametre ile gerekli çevirmeyi yapması sağlanmıştır.<br />
det(matris,int,int,int) ) : det yüklemi bütün determinant çarpım işlemlerini gerçekleştirmektedir.</li>
</ul>
<p>Yukarıdan aşağıya doğru yazılmış dört yüklemi sırasıyla incelersek;</p>
<ol>
<li>İlk yüklem 2&#215;2 matris kaldığı zaman bunu detBul yüklemi sayesinde hesaplar ver geri döndürür.</li>
<li>İkinci yüklem ise ilk sütunu sona atarak hesaplanan determinantların durma koşulunu belirler. Eğer sayac değişkeni sıfır olmuşsa yani n sütun varsa ve her biri için açılım yapılmışsa sonuç değeri sıfır olarak döndürür.</li>
<li>Üçüncü yüklem ise 3. dereceden matrislerin determinant hesabında kullanılmıştır. 3. Dereceden matrislerde daha fazla alt matris olmadığından dolayı katsayı değişimine gerek kalmamıştır.</li>
<li>Dördüncü yüklem ise 4. derece ve üstü matrislerin determinantını hesaplarken kofaktörü değiştirmek için kullanılmıştır.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/prolog-ile-determinant-hesabi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prolog ile Liste İşlemleri</title>
		<link>http://www.ahmetkakici.com/programlama/prolog-ile-liste-islemleri/</link>
		<comments>http://www.ahmetkakici.com/programlama/prolog-ile-liste-islemleri/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 13:43:46 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[kod]]></category>
		<category><![CDATA[prolog]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=102</guid>
		<description><![CDATA[Prolog&#8217;un bel kemiği olan liste veri yapısı için daha önceden kullandığım liste fonksiyonlarını aşağıda listeledim. Fonksiyonların isimlerinden ne iş yaptıkları belli oluyor yine de anlamadığınız yer olursa bir yorum bırakabilirsiniz.]]></description>
			<content:encoded><![CDATA[<p>Prolog&#8217;un bel kemiği olan liste veri yapısı için daha önceden kullandığım liste fonksiyonlarını aşağıda listeledim. Fonksiyonların isimlerinden ne iş yaptıkları belli oluyor yine de anlamadığınız yer olursa bir yorum bırakabilirsiniz.</p>
<p><span id="more-102"></span></p>
<pre class="brush: jscript; title: ; notranslate">

PREDICATES
listeGoster(liste)
uzunluk(liste,int)
uye(int,liste)
ekle(int,liste,liste)
yoksaEkle(int,liste,liste)
sil(int,liste,liste)
hepsiniSil(int,liste,liste)
elemanTopla(liste,int)
arttir(int,liste,liste)
birles(liste,liste,liste)
birlesim(liste,liste,liste)
kesisim(liste,liste,liste)
buda(liste,liste)
tersCevir(liste,liste)
tersCevirici(liste,liste,liste)
prefix(liste,liste)
suffix(liste,liste)

CLAUSES
listeGoster([]).
listeGoster([B|K]):-write(B),nl,listeGoster(K).

uzunluk([],0).
uzunluk([_|K],U):-uzunluk(K,X),U=X+1.

uye(X,[X|_]).
uye(X,[_|K]):-uye(X,K).

ekle(X,L,[X|L]).

yoksaEkle(X,L,L):-uye(X,L),!.
yoksaEkle(X,L,[X|L]).

sil(X,[X|L],L).
sil(X,[B|K1],[B|K2]):-sil(X,K1,K2).

hepsiniSil(_,[],[]).
hepsiniSil(X,[X|L],M):-sil(X,L,M),!.
hepsiniSil(X,[Y|K1],[Y|K2]):-sil(X,K1,K2).

elemanTopla([],0).
elemanTopla([X|K],T):-elemanTopla(K,Y),T=Y+X.

arttir(_,[],[]).
arttir(X,[B1|K1],[B2|K2]):-B2=B1+X,arttir(X,K1,K2).

birles([],L,L).
birles([B|K1],L2,[B|K2]):-birles(K1,L2,K2).

birlesim([],L,L).
birlesim([B|K1],L2,K2):- uye(B,L2),birlesim(K1,L2,K2),!.
birlesim([B|K1],L2,[B|K2]):- birlesim(K1,L2,K2).

kesisim([],_,[]).
kesisim(_,[],[]).
kesisim([B|K1],L2,[B|K2]):-uye(B,L2),kesisim(K1,L2,K2),!.
kesisim([_|K1],L2,K2):-kesisim(K1,L2,K2).

buda([],[]).
buda([B|K],L):- uye(B,K),buda(K,L),!.
buda([B|K1],[B|K2]):- buda(K1,K2).

tersCevir(X,Y):-tersCevirici(X,[],Y).
tersCevirici([],X,X).
tersCevirici([B|K],TMP,SONUC) :- tersCevirici(K,[B|TMP],SONUC).

prefix([],_).
prefix([B|K1],[B|K2]):-prefix(K1,K2).

suffix(X,Y):-tersCevir(X,TX),tersCevir(Y,TY),prefix(TX,TY).
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/prolog-ile-liste-islemleri/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java ile Sözlük Uygulaması</title>
		<link>http://www.ahmetkakici.com/programlama/java-ile-sozluk-uygulamasi/</link>
		<comments>http://www.ahmetkakici.com/programlama/java-ile-sozluk-uygulamasi/#comments</comments>
		<pubDate>Sat, 13 Dec 2008 11:30:34 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[kod]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=98</guid>
		<description><![CDATA[Çok mükemmel bir sözlük değil ama örnek olması açısından işe yarayacağını düşünüyorum. Düzenli ifadeler ile arama yapan bir sözlük denemesi hani şu yazmaya başladığınızda arama yapanlardan. Sözlük herhangi bir veri tabanı kullanmıyor sadece bir txt dosyasından okuma yapıyor. kelimeler.txt adında bir dosya oluşturup içine istediğiniz kelimeleri girebilirsiniz. Ancak formatı şu şekilde olmalıdır : İngilizce\tTürkçe. İngilizce [...]]]></description>
			<content:encoded><![CDATA[<p>Çok mükemmel bir sözlük değil ama örnek olması açısından işe yarayacağını düşünüyorum. Düzenli ifadeler ile arama yapan bir sözlük denemesi hani şu yazmaya başladığınızda arama yapanlardan. Sözlük herhangi bir veri tabanı kullanmıyor sadece bir txt dosyasından okuma yapıyor. kelimeler.txt adında bir dosya oluşturup içine istediğiniz kelimeleri girebilirsiniz. Ancak formatı şu şekilde olmalıdır : İngilizce<strong>\t</strong>Türkçe. İngilizce kelime ardından bir tab karakteri ve sonra türkçe anlamı gelmelidir. Kendi kullandığım kelimeler.txt dosyasını da örnek olsun diye <a href="http://www.ahmetkakici.com/wp-content/uploads/2008/12/kelimeler.rar">veriyorum</a>. Dosyaya dilediğiniz gibi kelime ekleyip çıkarabilir hatta okuma kaynağını değiştirip herhangi bir sitden vs arama da yapabilirsiniz diyor ve kodu sunuyorum:</p>
<p><span id="more-98"></span></p>
<pre class="brush: java; title: ; notranslate">
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.awt.datatransfer.Clipboard;

public class SozLook extends JFrame implements ActionListener,KeyListener
{

public File dosya;					//Kelimelerin okunacağı dosya
public FileReader acilan_dosya;
public BufferedReader girdi;
public String yazilar=&quot;&quot;;			//Dosyadan okunan veriler
public int myIndex;					//TR-&gt;ING  ING-&gt;TR çevrim türünü tutuyor

public JTextField Word;				//Kelime girilen TextField
public JTextField Sonuc;			//Sonucu gösteren TextField
public JPanel myPanel1,myPanel2;

public JList list;					//Seçim listesi
public JListData ldata;

public JRadioButton trButton,ingButton;
public ButtonGroup 	myGroup;

public String urlString;
public String gelen;
public Boolean bulundu=false;
public Pattern urlPattern;
public Matcher urlMatcher;

public void init()
{
Container container = getContentPane();
container.setLayout(new BorderLayout(25,5));

myPanel1 = new JPanel();
myPanel1.setLayout(new BorderLayout(25,5));

myPanel2 = new JPanel();
myPanel2.setLayout(new FlowLayout());

Word = new JTextField(25);
Word.addKeyListener(this);

Sonuc = new JTextField(50);
Sonuc.setEditable(false);

ingButton = new JRadioButton(&quot;İngilizce -&gt; Türkçe&quot;, true);
trButton  = new JRadioButton(&quot;Türkçe -&gt; İngilizce&quot;, false);
trButton.addActionListener(this);
ingButton.addActionListener(this);

myGroup= new ButtonGroup();
myGroup.add(trButton);
myGroup.add(ingButton);

myPanel2.add(ingButton);
myPanel2.add(trButton);
myPanel1.add(Word,BorderLayout.NORTH);
myPanel1.add(Sonuc,BorderLayout.SOUTH);

JScrollPane sp = new JScrollPane();
myPanel1.add(&quot;Center&quot;, sp);

ldata = new JListData();
list= new JList(ldata); 	//data verisiyle yeni liste oluşturuyor
sp.getViewport().add(list); //scrollpane

container.add(myPanel1,BorderLayout.CENTER);
container.add(myPanel2,BorderLayout.SOUTH);

setSize(500,300);
setResizable(false);

list.addMouseListener(new MouseAdapter()
{
public void mouseReleased( MouseEvent e )
{
if(!list.isSelectionEmpty())
elemanSecildi();
}
}
);

}

public SozLook()
{
super(&quot;SözLook - KTÜ&quot;);
init();
setVisible(true);
}

public static void main(String args[])
{
new SozLook();
}

public void actionPerformed( ActionEvent actionEvent )
{
Sonuc.setText(&quot;&quot;);
ldata.temizle();
ldata.addElement(&quot;&quot;);
list.disable();
harfYazildi();
return;
}

public void keyPressed( KeyEvent event )
{
}
public void keyTyped( KeyEvent event )
{
}
public void keyReleased( KeyEvent event )
{
harfYazildi();
}

public void harfYazildi()
{
Sonuc.setText(&quot;&quot;);
if(Word.getText().toLowerCase().length()==0)
{
ldata.temizle();
ldata.addElement(&quot;&quot;);
list.disable();
return;
}

bulundu=false;
ldata.temizle();
list.enable();
list.clearSelection();

if(ingButton.isSelected())
urlString =&quot;^&quot;+Word.getText().toLowerCase()+&quot;[^\t]*&quot;;
else
urlString =&quot;\t&quot;+Word.getText().toLowerCase()+&quot;.*$&quot;;

bul(0);
}

public void elemanSecildi()
{
if(ingButton.isSelected())
{
urlString =&quot;^&quot;+list.getSelectedValue().toString()+&quot;.*\t.*&quot;;
myIndex=1;
}
else
{
urlString =&quot;^.*&quot;+list.getSelectedValue().toString()+&quot;.*$&quot;;
myIndex=0;
}
bul(1);
}

public void bul(int tur)
{
try
{
dosya = new File( &quot;kelimeler.txt&quot; );
acilan_dosya = new FileReader ( dosya );
girdi = new BufferedReader ( acilan_dosya );
urlPattern = Pattern.compile(urlString);

while ( (yazilar=girdi.readLine()) != null )
{
urlMatcher = urlPattern.matcher(yazilar);
if(urlMatcher.find())
{
if(tur==0)	//harfe göre kelime aranıyor
{
bulundu=true;
ldata.addElement(urlMatcher.group());
}
else		//listeden seçilen kelimenin karşılığı aranıyor
{
String [] bulunan=urlMatcher.group().split(&quot;\t&quot;);
Sonuc.setText(bulunan[myIndex]);
break;
}
}
if(yazilar.toLowerCase().toCharArray()[0]&gt;Word.getText().toLowerCase().toCharArray()[0])
break;
}

if(tur==0 &amp;amp;amp;amp;&amp;amp;amp;amp; !bulundu)
{
ldata.addElement(&quot;&quot;);
list.disable();
return;
}

}
catch ( IOException exception )
{
System.out.println(&quot;Dosyadan okurken hata oluştu&quot;);
}
finally
{
try
{
girdi.close();
}
catch( IOException exception )
{
System.out.println(&quot;Dosya kapatılırken hata oluşturuldu.&quot;);
}
}

}

}

class JListData extends AbstractListModel {
private Vector dlist;

public JListData()
{
dlist = new Vector();
makeData();
}
public int getSize()
{
return dlist.size();
}
private Vector makeData()
{
dlist = new Vector();
return dlist;
}
public Object getElementAt(int index)
{
return dlist.elementAt(index);
}
public void addElement(String s)
{
dlist.addElement(s);
fireIntervalAdded(this, dlist.size()-1, dlist.size());
}
public void temizle()
{
dlist.clear();
}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/java-ile-sozluk-uygulamasi/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Prolog ile Matris Çarpımı</title>
		<link>http://www.ahmetkakici.com/programlama/prolog-ile-matris-carpimi/</link>
		<comments>http://www.ahmetkakici.com/programlama/prolog-ile-matris-carpimi/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 23:54:00 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[kod]]></category>
		<category><![CDATA[prolog]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=96</guid>
		<description><![CDATA[Matris çarpımı birçok programlama dilinde öncelikli verilen ödevlerden biri olsa gerek. Aşağıdaki kodu yazarken anladım ki prolog bu dillerin arasında yok ve olmamalı :) Prolog yapısından dolayı bu tip işlemleri yapmak için [bence] oldukça zor bir dil. Mantıksal programlamada veya özyinelemeli şekildeki problemlerin çözümünde kullanıldığı zaman az kod ile çok iş yapılabiliniyor ancak matris çarpımı [...]]]></description>
			<content:encoded><![CDATA[<p>Matris çarpımı birçok programlama dilinde öncelikli verilen ödevlerden biri olsa gerek. Aşağıdaki kodu yazarken anladım ki prolog bu dillerin arasında yok ve olmamalı :) Prolog yapısından dolayı bu tip işlemleri yapmak için [bence] oldukça zor bir dil. Mantıksal programlamada veya özyinelemeli şekildeki problemlerin çözümünde kullanıldığı zaman az kod ile çok iş yapılabiliniyor ancak matris çarpımı için aynı şeyi diyemiyorum ve öncelikle sizlere kodu takdim ediyorum :</p>
<p><span id="more-96"></span></p>
<pre class="brush: css; title: ; notranslate">
DOMAINS
liste=integer*
matris = liste*
int=integer

PREDICATES
listeGoster(liste)
matrisGoster(matris)
listeTopla(liste,int)
listeCarp(liste,liste,liste)
listeVeMatris(liste,matris,liste)
matrisCarp(matris,matris,matris)

CLAUSES
listeGoster([]).
listeGoster([B|K]):-write(B,&quot; &quot;),listeGoster(K).

matrisGoster([]).
matrisGoster([B|K]):-
write(&quot;[&quot;),
listeGoster(B),
write(&quot;]&quot;),nl,
matrisGoster(K).

listeTopla([],0).
listeTopla([X|K],T):-listeTopla(K,Y),T=Y+X.

listeCarp([],[],[]).
listeCarp([Bas1|Kuyruk1],[Bas2|Kuyruk2],[SonucBas|SonucKuyruk]):-
SonucBas=Bas1*Bas2,
listeCarp(Kuyruk1,Kuyruk2,SonucKuyruk).

listeVeMatris(_,[],[]).
listeVeMatris(Liste1,[MatrisBas|MatrisKuyruk],[CarpimBas|CarpimKuyruk]):-
listeCarp(Liste1,MatrisBas,Carpim),
listeTopla(Carpim,CarpimBas),
listeVeMatris(Liste1,MatrisKuyruk,CarpimKuyruk).

matrisCarp([],_,[]).
matrisCarp([Bas1|Kuyruk1],Matris2,[SonucBas|SonucKuyruk]):-
listeVeMatris(Bas1,Matris2,SonucBas),
matrisCarp(Kuyruk1,Matris2,SonucKuyruk).

GOAL
matrisCarp(
[[1,2,3],[3,4,5],[3,1,1]],
[[1,5,5],[2,3,3],[3,4,1],[5,5,1]], Y),
matrisGoster(Y).
</pre>
<p>Programda kullanılan yüklemlere tek tek bakacak olursak yüklemlerin yaptığı görevler aşağıda açıklanmıştır:</p>
<ul>
<li><em>listeGoster</em> : Liste elemanlarını write iç yüklemi ile göstermek yerine bu yüklem kullanılmıştır.</li>
</ul>
<ul>
<li> <em>matrisGoster</em> : Matris elemanlarını write iç yüklemi ile göstermek yerine bu yüklem kullanılmıştır, aldığı matrisin her bir satırını listeGoster yüklemi sayesinde ekrana yazdırır.</li>
</ul>
<ul>
<li><em>listeTopla</em>: Listenin elemanlarını toplayan bir yüklemdir. Çarpım sonucu elde edilen listeyi toplamada kullanılmıştır.</li>
</ul>
<ul>
<li><em>listeCarp</em>: Uzunluğu eşit iki liste elemanlarını birebir çarpan bir yüklemdir.</li>
</ul>
<ul>
<li><em>listeVeMatris</em>: Birinci matrisin ilk satırı ile ikinci matrisin tamamını çarpmak için bu yüklem kullanılmıştır.</li>
</ul>
<ul>
<li> <em>matrisCarp</em>: Verilen iki matrisin birincisini satır satır alıp ikinci matrisle listeVeMatris yüklemi saysinde çarpar.</li>
</ul>
<p>Programa goal kısmındaki ikinci matris transpozesi alınmış şekilde yazılmıştır. Transpozesini hesaplayacak bir yüklem yazmayı gözüme kestiremediğim için bu şekilde yaptım :) Umarım işinize yarar ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/prolog-ile-matris-carpimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rasgele Labirent Oluşturma ve Çözme</title>
		<link>http://www.ahmetkakici.com/programlama/rasgele-labirent-olusturma-ve-cozme/</link>
		<comments>http://www.ahmetkakici.com/programlama/rasgele-labirent-olusturma-ve-cozme/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 19:44:04 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[kod]]></category>
		<category><![CDATA[pointer]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=88</guid>
		<description><![CDATA[Aşağıdaki program çalışan ve bir şeye benzeyen ilk C programım diyebilirim :) Tabii ilk programım olmasından dolayı optimum şekilde çalışmıyor olabilir. Ayrıca programı yazdığım zamanda görsel programlama namına bir şey bilmediğim için program konsoldan çalışıyor. Sadece kod verip bırakmak istemedim ve az da olsa ne yaptığımı açıklayım dedim. Öncelikle programın üç ana özelliğini belirtmeliyim sanırım; [...]]]></description>
			<content:encoded><![CDATA[<p>Aşağıdaki program çalışan ve bir şeye benzeyen ilk C programım diyebilirim :) Tabii ilk programım olmasından dolayı optimum şekilde çalışmıyor olabilir. Ayrıca programı yazdığım zamanda görsel programlama namına bir şey bilmediğim için program konsoldan çalışıyor.</p>
<p>Sadece kod verip bırakmak istemedim ve az da olsa ne yaptığımı açıklayım dedim. Öncelikle programın üç ana özelliğini belirtmeliyim sanırım;</p>
<p><span id="more-88"></span></p>
<p>-Her seferinde rasgele bir labirent oluşturulacak</p>
<p>-Labirent üzerinde kapalı yani ulaşılamayan bir bölge olmayacak</p>
<p>-Son olarak labirent çözülecek :)</p>
<p>Ana hatları söyledikten sonra programın çalışmasına gelelim.</p>
<p>Labirenti oluşturacak alan belirlendikten sonra (ör 10&#215;10) bu çerçeve üzerinde bulunan her noktayı bir listeye ekleniyor. Daha sonra bu noktalardan biri rasgele olarak seçiliyor. Bu nokta başlangıç alınarak daha önceden belirlenen adım sayısı kadar rasgele yönlerde ilerlenerek duvar örülüyor. Rasgele yönlerde atılan bu adımlar sonrasında oluşan yeni duvarlar çerçevenin olduğu listeye ekleniyor. Başlangıç olarak seçtiğimz ilk nokta ise listeden siliniyor.Yeni bir adım atılıp duvar örüldüğünde dikkat edilmesi gereken nokta ise kapalı alan oluşturmamaktır.</p>
<p>Labirenti çözmek ise oluşturmaktan çok daha kolay. Klasik <strong><a href="http://en.wikipedia.org/wiki/Self-avoiding_walk" target="_blank">self avoding walk</a></strong> algoritmasıyla çözüme gidilmiştir. Labirentin sol en üst köşesi başlangıç, sağ en alt köşesi ise bitiş noktası olarak belirlenmiş ve çözüm ona göre çalışmaktadır. Tabii değiştirmek sizin elinizde :)</p>
<pre class="brush: cpp; title: ; notranslate">
///////////////////////////////////////////////////
/*             HEADER DOSYALARI                  */
///////////////////////////////////////////////////
#include &quot;conio.h&quot;
#include &quot;stdlib.h&quot;
#include &quot;stdio.h&quot;
#include &quot;iostream.h&quot;
#define STEP 5
#define YOL 0
#define YOL2 1
#define GEREKSIZ -6
#define DUVAR -2
#define pasifDUVAR -5
#define DUGUM -1
#define eskiDUGUM -3
#define pasifDUGUM -4
#include &lt;time.h&gt;

///////////////////////////////////////////////////
/*                LISTE YAPISI                   */
///////////////////////////////////////////////////
struct Item {
	struct Item *next;
	int val1,val2;    // Dizi iki boyutlu oldugu icin 2 elemanli liste olusturdum.
};

struct List {
	struct Item *list;
};

///////////////////////////////////////////////////
/*     LISTE FONKSIYONLARININ PROTOTIPLERI       */
///////////////////////////////////////////////////
	struct List *liste_yarat(struct List *pl);			//Liste Olusturuyor
	void listeye_ekle(struct List *pl,int,int);			//Listeye eleman ekliyor
	void listeden_sil(struct List *pl,int,int);			//Listeden eleman siliyor
	void liste_gez(struct List *pl,int ,int&amp; , int&amp;);	//Listeden n. siradaki elemani aliyor
	void liste_goster(struct List *pl);					//Lisde degerlerini yazdiriyor
	int  uzunluk(struct List *pl);						//Liste uzunlugunu veriyor
	bool arama(int,int);								//listede eleman ariyor
///////////////////////////////////////////////////
/*         DIGER FONKSIYON PROTOTIPLERI          */
///////////////////////////////////////////////////
	void degeryaz(int **);                             	//ekrana labirenti ciziyor
	void diziyap();                                    	//dinamik dizi olusturuyor
	void duzenle();                                    	//bos labirent olusturuyor
	void kontrol(int,int);                             	//kapali alan kontrolu yapiyor
	void ilerle(int ,int);                             	//duvar olusturuyor
	int rasgele(int);                                  	//random sayi uretiyor
	void devam(int, int);                              	//adim sayisini tutuyor
	void ayikla();                                     	//gereksiz dugumleri ayikliyor
	void labirent();                                   	//Genel fonksiyon
	void yonbul(int , int );                           	//cikis yolunu buluyor
	int adim_sayisi();									//cikisa kac adim var
///////////////////////////////////////////////////
/*       KULLANACAGIM DEGISKENLER, GLOBAL        */
///////////////////////////////////////////////////
	int **dizi,**dizii,x,y,val1,val2,yon,adim=0,varmi=0;
/*/////////////////////////////////////////////////////
//dizi=&gt;Labirenti tutuyor                            //
//x,y=&gt; labirent boyutlari                           //
//val1,val2=&gt;Liste degerlerini almak icin kullandim  //
//yon=&gt;gidilecek yonu tutuyor                        //
//adim=&gt;kac adim gidildigini tutuyor                 //
//varmi=&gt;labirent olup olmadigini tutuyor            //
*//////////////////////////////////////////////////////

	struct List *l1;

//###############################################//
/*               MAIN FONKSIYONU                 */
//###############################################//

main(){

	l1=liste_yarat(l1);                // Listemi yaratyiyorum
	char ch='1';                      // Kullanici arayuzu
	while(ch!='2')   {
		cout&lt;&lt;endl&lt;&lt;
		&quot;0-Ekrani temizle&quot;&lt;&lt;endl&lt;&lt;
		&quot;1-Yeni labirent Olustur&quot;&lt;&lt;endl&lt;&lt;
		&quot;2-Programdan Cik&quot;&lt;&lt;endl;
		if(varmi==1){
			cout&lt;&lt;&quot;3-Labirenti Coz&quot;&lt;&lt;endl;
		}
		ch=getch();
		if(ch=='1'){
			clrscr();labirent();yonbul(1,1);varmi=1;
		}
		else if (ch=='2'){
			clrscr();
			cout&lt;&lt;endl&lt;&lt;
			&quot;Veri Yaplilari Labirent Olusturma Odevi\nYazan:Ahmet KAKICI - 150165\nCikmak icin herhangi bir tusa basiniz.&quot;;
			getch();
		}
		else if(ch=='3'){
			clrscr();
			degeryaz(dizi);
			cout&lt;&lt;endl;
			degeryaz(dizii);
			cout&lt;&lt;&quot;Labirentten &quot;&lt;&lt;adim_sayisi()&lt;&lt;&quot; adimda cikildi.&quot;&lt;&lt;endl;
			varmi=0;
		}
		else if(ch=='0'){
			clrscr();
		}
	}
}

//////////////////////////////////////////////////
/*  SELF AVOIDING WALK ve LABIRENTTEN CIKIS     */
//////////////////////////////////////////////////

void yonbul(int a, int b){

	int xMax=x-1,yMax=y-1;
	if(a==x-2 &amp;&amp; b==y-2){
		for(int i=0;i&lt;x;i++)
		for(int j=0;j&lt;y;j++)
		dizii[i][j]=dizi[i][j];
		return;
	}

	if(b+2&lt;yMax &amp;&amp; dizi[a][b+1]==pasifDUVAR &amp;&amp; dizi[a][b+2]==YOL){
		dizi[a][b+2]=YOL2;
		yonbul(a,b+2);
		dizi[a][b+2]=YOL;
	}
	if(a-2&gt;0 &amp;&amp; dizi[a-1][b]==pasifDUVAR &amp;&amp; dizi[a-2][b]==YOL){
		dizi[a-2][b]=YOL2;
		yonbul(a-2,b);
		dizi[a-2][b]=YOL;
	}
	if(b-2&gt;1 &amp;&amp; dizi[a][b-1]==pasifDUVAR &amp;&amp; dizi[a][b-2]==YOL){
		dizi[a][b-2]=YOL2;
		yonbul(a,b-2);
		dizi[a][b-2]=YOL;
	}
	if(a+2&lt;xMax &amp;&amp; dizi[a+1][b]==pasifDUVAR &amp;&amp; dizi[a+2][b]==YOL){
		dizi[a+2][b]=YOL2;
		yonbul(a+2,b);
		dizi[a+2][b]=YOL;
	}
}
///////////////////////////////////////////////////
/*      LABIRENT OLUSTURMA FONKSIYONU            */
///////////////////////////////////////////////////
void labirent(){
	srand(time(NULL));
	cout&lt;&lt;endl&lt;&lt;&quot;Labirent boyutlarini gir&quot;&lt;&lt;endl&lt;&lt;&quot;x=&quot;;
	cin&gt;&gt;x;
	cout&lt;&lt;endl&lt;&lt;&quot;y=&quot;;
	cin&gt;&gt;y;
	diziyap();
	duzenle();

	while((uzunluk(l1))&gt;0){
		liste_gez(l1,rasgele(uzunluk(l1)),val1,val2);
		ilerle(val1,val2);
		ayikla();
	}
	degeryaz(dizi);
}
///////////////////////////////////////////////////
/*          DIZI OLUSTURMA FONKSIYONU            */
///////////////////////////////////////////////////
void diziyap()
{
	x=x*2+1;
	y=y*2+1;
	dizi=new int *[x];
	dizii=new int *[x];
	for(int i=0;i&lt;x;i++){
		dizi[i]=new int[y];
		dizii[i]=new int[y];
	}
}
///////////////////////////////////////////////////
/*       RASGELE SAYI URETEN FONKSIYON           */
///////////////////////////////////////////////////
int rasgele(int n)
{
	return rand()%n;
}
///////////////////////////////////////////////////
/*       ADIM SAYISINI TUTAN FONKSIYON           */
///////////////////////////////////////////////////
int adim_sayisi()
{
	int adimSayisi=0;
	for(int i=0;i&lt;x;i++){
		for(int j=0;j&lt;y;j++){
			if(dizii[i][j]==YOL2){
				adimSayisi++;
			}
		}
	}
	return adimSayisi;
}
///////////////////////////////////////////////////
/*   DIZI DEGERLERINI YAZAN FONKSIYON            */
///////////////////////////////////////////////////
void degeryaz(int **dizim){
	for(int i=0;i&lt;x;i++){
		for(int j=0;j&lt;y;j++){
			if(dizim[i][j]==DUVAR)
			cout&lt;&lt;'\xDB'&lt;&lt;'\xDB';
			else if(dizim[i][j]==YOL)
			cout&lt;&lt;&quot; &quot;&lt;&lt;&quot; &quot;;
			else if(dizim[i][j]==YOL2)
			cout&lt;&lt;&quot;_&quot;&lt;&lt;&quot;_&quot;;
			else if (dizim[i][j]==pasifDUGUM)
			cout&lt;&lt;'\xDB'&lt;&lt;'\xDB';
			else if (dizim[i][j]==eskiDUGUM ||dizim[i][j]==GEREKSIZ || dizim[i][j]==-2 )
			cout&lt;&lt;'\xDB'&lt;&lt;'\xDB';
			else cout&lt;&lt;' '&lt;&lt;&quot; &quot;;
		}
		cout&lt;&lt;endl;
	}
}
///////////////////////////////////////////////////
/*      LABIRENTIN BOS HALINI OLUSTURUYOR        */
/*     ILK DUGUM NOKTALARINI LISTEYE ATIYOR      */
///////////////////////////////////////////////////
void duzenle(){
	int xx,yy;
	xx=x-1;
	yy=y-1;
	for(int i=0;i&lt;x;i++){
		for(int j=0;j&lt;y;j++){
			if( i==0 || j==0 || i==xx || j==yy)
				dizi[i][j]=GEREKSIZ;          			//KENARLARDAKI GEREKSIZ YERLER
			if(  (  (j==0 ||j==yy) &amp;&amp; j%2==0)|| ( (i==0||i==xx) &amp;&amp; i%2==0) ){
				dizi[i][j]=DUGUM;    					//LABIRENTIN KENARLARINI
				listeye_ekle(l1,i,j);     				//LISTEYE EKLE
			}
			else if (i%2!=0 &amp;&amp; j%2!=0){     			//GIDILECEK YOLLAR
				dizi[i][j]=YOL;
			}
			else if( ((i%2!=0 &amp;&amp; j!=0 &amp;&amp; j!=yy) &amp;&amp;  j%2==0)||(i%2==0 &amp;&amp; (i!=0 &amp;&amp; i!=xx &amp;&amp;  j%2!=0)) ){
				dizi[i][j]=pasifDUVAR;            		//PASIF DUVARLAR
			}
			else if(i%2==0 &amp;&amp; j%2==0){
				dizi[i][j]=pasifDUGUM;           		//PASIF DUGUMLER
			}
			//else dizi[i][j]=8;
		}
	}
	//LABIRENTIN KOSELERINDEKI DUGUMLERI LISTEDEN SIL
	listeden_sil(l1,0,0);dizi[0][0]=eskiDUGUM;
	listeden_sil(l1,xx,0);dizi[xx][0]=eskiDUGUM;
	listeden_sil(l1,0,yy);dizi[0][yy]=eskiDUGUM;
	listeden_sil(l1,xx,yy);dizi[xx][yy]=eskiDUGUM;
}
///////////////////////////////////////////////////
/*  LABIRENTTE DUVAR OREREK ILERLEME FONKSIYONU  */
///////////////////////////////////////////////////
void ilerle(int Xnokta,int Ynokta){
	yon=rasgele(4);
	int a=Xnokta;
	int b=Ynokta;

	if(Xnokta==0)yon=3;
	if(Ynokta==0)yon=1;
	if(Xnokta==x-1)yon=0;
	if(Ynokta==y-1)yon=2;
    //liste_goster(l1);

	// Kuzey =&gt; 0 , dogu =&gt;1 , bati=&gt;2 , guney=&gt; 3,
	if(yon==0){             //KUZEY
		if(a-2&gt;0){
			if(dizi[a-2][b]==pasifDUGUM){
				dizi[a-1][b]=DUVAR;
				kontrol(a-2,b);
				kontrol(a,b);
				devam(a-2,b);
			}
		}
	}

	if(yon==1){         // DOGU
		if(b+2&lt;y){
			if(dizi[a][b+2]==pasifDUGUM){
				dizi[a][b+1]=DUVAR;
				kontrol(a,b+2);
				kontrol(a,b);
				devam(a,b+2);
			}
		}
	}
	if(yon==2){        // BATI
		if(b-2&lt;0){
			if(dizi[a][b-2]==pasifDUGUM){
				dizi[a][b-1]=DUVAR;
				kontrol(a,b-2);
				kontrol(a,b);
				devam(a,b-2);
			}
		}
	}
	if(yon==3){             // GUNEY
		if(a+2&lt;x){
			if(dizi[a+2][b]==pasifDUGUM){
					dizi[a+1][b]=DUVAR;
					kontrol(a+2,b);
					kontrol(a,b);
					devam(a+2,b);
			}
		}
	}

}  //gezi func. sonu

void devam(int Xnokta,int Ynokta)
{
	if(adim&lt;STEP){
		adim++;
		ilerle(Xnokta,Ynokta);
    }
	else{
		adim = 0;
	}
}
 ///////////////////////////////////////////////////
/*                   AYIKLA  FONKSIYONU          */
//////////////////////////////////////////////////
void ayikla(){
	for (int i=0;i&lt;uzunluk(l1);i++){
		liste_gez(l1,i,val1,val2);
		kontrol(val1,val2);
	}
}
////////////////////////////////////////////////////
/*                KONTROL  FONKSIYONU            */
//////////////////////////////////////////////////
void kontrol(int Xnokta,int Ynokta)
{
	int cevre = 0;

	if(Ynokta+2&lt;y){
		if(dizi[Xnokta][Ynokta+2]==pasifDUGUM ){
			cevre++;
		}
	}
	if(Ynokta-2&gt;0){
		if(dizi[Xnokta][Ynokta-2]==pasifDUGUM ){
			cevre++;
		}
	}
	if(Xnokta+2&lt;x){
		if(dizi[Xnokta+2][Ynokta]==pasifDUGUM ){
			cevre++;
		}
	}
	if(Xnokta-2&gt;0){
		if( dizi[Xnokta-2][Ynokta]==pasifDUGUM){
			cevre++;
		}
	}
	if (cevre==0){
		dizi[Xnokta][Ynokta]=eskiDUGUM;
		listeden_sil(l1,Xnokta,Ynokta);
	}
	else if( cevre!=0 &amp;&amp; (dizi[Xnokta][Ynokta]!=DUGUM)){
		if(!(arama(Xnokta,Ynokta))){
			listeye_ekle(l1,Xnokta,Ynokta);
		}
		dizi[Xnokta][Ynokta]=DUGUM;
	}
}
 ///////////////////////////////////////////////////
/*             LISTE FONKSIYONLARI                */
///////////////////////////////////////////////////

///////////////////////////////////////////////////
/*           LISTE YARATMA FONKSIYONU           */
//////////////////////////////////////////////////
struct List *liste_yarat(struct List *pl){
	pl=(struct List *)malloc(sizeof(struct List));
	pl-&gt;list=0;
	return pl;
}
///////////////////////////////////////////////////
/*      LISTE UZUNLUGUNU BULAN FONKSIYON         */
///////////////////////////////////////////////////
int uzunluk(struct List *pl){
	struct Item *tmp=pl-&gt;list;
	int uzun=0;
	while(tmp){
		uzun++;
		tmp=tmp-&gt;next;
	}
	return(uzun);
}
///////////////////////////////////////////////////
/*      LISTEDEN ELEMAN SILEN FONKSIYON          */
///////////////////////////////////////////////////
void listeden_sil(struct List *pl,int val1,int val2){
	struct Item *prv, *pt = pl-&gt;list;
	if ( (pt) &amp;&amp; (pt-&gt;val1==val1)&amp;&amp;(pt-&gt;val2==val2)  ){
		pl-&gt;list= pt-&gt;next;
		free(pt);
	}
	else if (pt){
		for ( prv=pt, pt= pt-&gt;next;
			  ((pt) &amp;&amp; ((pt-&gt;val1 != val1) || (pt-&gt;val2 != val2)));
			  prv=prv-&gt;next, pt=pt-&gt;next);
		if ( (pt)&amp;&amp; (pt-&gt;val1==val1) &amp;&amp; (pt-&gt;val2==val2) ){
			prv-&gt;next=pt-&gt;next;
			free(pt);
		}
	}
}
///////////////////////////////////////////////////
/*    LISTE ELEMANLARINI YAZDIRAN FONKSIYON      */
///////////////////////////////////////////////////
void liste_goster(struct List *pl){
	struct Item *tmp=pl-&gt;list;
	while (tmp){
		printf(&quot;%d &quot;, tmp-&gt;val1) ;
		printf(&quot;%d \n&quot;, tmp-&gt;val2) ;
		tmp=tmp-&gt;next;
	}
}
///////////////////////////////////////////////////
/*  LISTE BASINA ELEMAN EKLEYEN FONKSIYON        */
///////////////////////////////////////////////////
void listeye_ekle(struct List *pl,int val1, int val2) {
	struct Item *pt=(struct Item *)malloc(sizeof(struct Item));
	pt-&gt;val1=val1;
	pt-&gt;val2=val2;
	pt-&gt;next=pl-&gt;list;
	pl-&gt;list=pt;
}
///////////////////////////////////////////////////
/*    LISTEDEN n. ELEMANI ALMA FONKSIYONU        */
///////////////////////////////////////////////////
void liste_gez(struct List *pl,int n,int &amp;val1, int &amp;val2){
	struct Item *tmp=pl-&gt;list;
	while(n--&gt;0){
		tmp=tmp-&gt;next;
	}
	val1=tmp-&gt;val1;
	val2=tmp-&gt;val2;
}
bool arama(int xVal,int yVal){
	struct Item *tmp=l1-&gt;list;
	int uzun=uzunluk(l1);
	while(uzun--&gt;0){
		if(tmp-&gt;val1==xVal &amp;&amp; tmp-&gt;val2==yVal){
			return true;
		}
		tmp=tmp-&gt;next;
	}
	return false;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/programlama/rasgele-labirent-olusturma-ve-cozme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kod Yazarken</title>
		<link>http://www.ahmetkakici.com/yazilim/kod-yazarken/</link>
		<comments>http://www.ahmetkakici.com/yazilim/kod-yazarken/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 09:52:08 +0000</pubDate>
		<dc:creator>Ahmet Kakıcı</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[kod]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[prolog]]></category>

		<guid isPermaLink="false">http://www.ahmetkakici.com/?p=74</guid>
		<description><![CDATA[Yaklaşık 5-6 yıldır iyi kötü birşeyler yazıyorum. Bu süre zarfı içinde birçok program, editör, derleyici kullandım ve artık neredeyse kullandığım her dil için belirli başlı programlarda karar kıldım. İlk defa HTML ve PHP yazmaya başladığımda NotePad kullanıyordum şimdilerde ise yelpaze oldukça genişledi ve haliyle kalite de arttı. Yazının devamında kullandığım programlama dilleri ve bu dillere [...]]]></description>
			<content:encoded><![CDATA[<p>Yaklaşık 5-6 yıldır iyi kötü birşeyler yazıyorum. Bu süre zarfı içinde birçok program, editör, derleyici kullandım ve artık neredeyse kullandığım her dil için belirli başlı programlarda karar kıldım.</p>
<p>İlk defa HTML ve PHP yazmaya başladığımda NotePad kullanıyordum şimdilerde ise yelpaze oldukça genişledi ve haliyle kalite de arttı. Yazının devamında kullandığım programlama dilleri ve bu dillere ait editörler/derleyicileri sıraladım. Umarım biraz da olsa fikir sahibi olmanıza yardımcı olurum. Eğer önerileriniz varsa lütfen yorum yapmaktan çekinmeyin, keşfedilmeyi bekleyen programlara da şans verelim :)</p>
<p><span id="more-74"></span></p>
<p><strong>HTML (CSS/JS)</strong></p>
<p>HTML yazmaya başladığımda ki bu kod yazma sürecimin başlangıcına denk geliyor, elimde not defterinden başka bir alternatif yoktu. Zaten o sıralarda 33.6k dial-up bağlantı kullandığımdan bir program bilsem/bulsam bile indirmem eziyet olacaktı. Uzun bir süre not defteri ile devam ettikten sonra FrontPage&#8217;i bulmuştum. İşleri çok kolaylaştırmasına rağmen arka planda olan işlerden haberdar olmamak ve neyi nasıl yaptığımı bilmeyişim bu programdan soğumama sebep oldu. Bir dili öğrenme aşamasında bu tip programların kullanılması bence pek doğru değil.</p>
<p>Daha sonra aşağıda bir çok dil için de kullandığımı belirteceğim NotePad++ kullanmaya başladım. Genelde pek fazla tasarım ile uğraşmadığımdan dolayı HTML yazma işine de girmem. Eğer ufak tefek düzenleme işleri dışında büyük bir iş ile uğraşacaksam Visual Studio&#8217;ya geçiş yaparım. VS 2008&#8242;in <strong><a href="https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=10826&amp;wa=wsignin1.0" target="_blank">Hotfix</a></strong>&#8216;i çıkmadan önce dizayn arayüzü gerçekten yavaştı ama şimdi nispeten daha hızlı ve iş görebilecek seviyede.</p>
<p>Sonuç olarak HTML yazarken işin büyüklüğüne göre NotePad++ veya VS2008 kullanıyorum</p>
<p><strong>PHP</strong></p>
<p>Bu dil ile tanıştığım zamanlarda da not defterinden başka bir alternatifim yoktu. Daha sonra PHP Designer, PHPed gibi programlar kullandım. Ancak en hızlı ve efektif kullanıma yine NotePad++ ile eriştim. Geçen sene ilk defa büyük ve ciddi bir projeye başladığımda ise Zend Development Environment kullanmayı denedim. Gerçekten denemeye değer bir program. PHP&#8217;nin yaratıcılarından olan Zend firması tarafından çıkarılması destek ve güncellik konusunda herhangi bir kaygınızın oluşmaması için yeterli olur.</p>
<p>NotePad++ bir çok dili desteklediğinden dolayı her dilin en ince ayrıntısına kadar destek veremiyor. Ancak ZDE bu konuda PHP için oldukça kaliteli bir program. Eğer büyük bir proje ile uğraşıyorsanız ZDE&#8217;yi denemenizi tavsiye ederim. Ufak çaplı işler peşindeyseniz NotePad++ hızı ile en sadık editörünüz olacaktır.</p>
<p><strong>JAVA</strong></p>
<p>Java (hala javascript ile karıştıran var mı ?) ile üniversiteye gittikten sonra tanıştım ve çevremdeki arkadaşlarım ve öğretim görevlileri sayesinde az çok ufkum açılmıştı. En azından not defteri ile işe başlamayacağımı biliyordum :).</p>
<p>Derste örnekleri işlerken JCreator kullanılıyordu ve gözüme gayet güzel bir program gibi göründü. Hemen gidip JCreator&#8217;ı denemeye başladım. Olabilecek en temel Java editörü olduğunu çok daha sonradan ve acı bir tecrübe ile öğrendim. Java ile Tr&lt;-&gt;İng sözlük programı yazmaya başladığımda programın ana işlevi arama işlevini bitirmemin ardından tam program bitti edasıyla rahatlamışken arayüz yapmadığımı hatırladım. Konsol üzerinden çalışan bir sözlüğü kim kullanır ki? Arayüz tasarlamaya başladığımda ise programın ana işlevinden çok arayüzle uğraştığımı farkettim. Sürükle bırak gibi bir özelliği olmadığından ve Java&#8217;nın layout özelliklerinde yeni olmamdan dolayı epey zaman harcadım ve JCreator ile aram bozuldu.</p>
<p>JCreator sonrasında Eclipse ile tanıştım. Eklenti özelliği gerçekten mükemmel görünüyordu. Ancak eklentilerin bağımlılıkları baş ağrıtıyordu. Yeni çıkan bir eklenti yüklediğimde bağımlı olduğu eklentilerin de düzenlenmesi gibi sorunlardan (acemiliğim) dolayı sürükle bırak tipi bir eklentiyi kuramadım ve NetBeans&#8217;e geçiş yaptım.</p>
<p>Evet NetBeans java konusunda aradığım yegane programdır. Java ile yazılmış olmasından dolayı biraz yavaş çalışmasına ve biraz fazla bellek tüketmesine rağmen kullandığım en iyi editördür. Kod tamamlama özelliğinin yanı sıra değişken tamamlama özelliği de mevcut. Bir fonksiyonun prototipinde alacağı veri tipini belirttikten sonra o fonkisyonu çağıracağınız zaman yazabileceğiniz değişkeni tipine göre tahmin edip tamamlaması çok kullanışlı bir özellik.</p>
<p><strong>C/C++/C#</strong></p>
<p>Bilgisayar mühendisliği birinci sınıfta okuyorsunuz ve bir gün o çok korktuğunuz programlama dili C ile karşılaşıyorsunuz. Turbo C denilen mavi bir ekranda (mavi ekran zaten bir kabus :] ) birşeyler yazıldığını görüyorsunuz. Evet işte korkutucu C maceram böyle başladı, dili kavrama konusunda bir sorunum olmasa da (php tabanımdan dolayı) editör gözümü korkutmuştu. Turbo C&#8217;yi bir kere bile kullanmadan dönemi bitirdim ve o dönem boyunca herşeyi defterime yazdım :)</p>
<p>Daha sonra C++ ile tanıştığımızda Borland C++ Builder ile haşır neşir olduk. İlk defa sürükle bırak tarzında bir editör kullanmanın verdiği zevk ile BCB&#8217;ye tutulmuştum. Yazdığım şeylerin arkaplanında ne olduğunu bilmeden uzun süre BCB ile birlikteliğim devam etti. Daha sonraları derinlere indikçe az buz birşeyler öğrendim ve sürükle bırak yapmama rağmen arka planda olan işlerin farkına vardım. Ancak bir gün Visual Studio diye bir program ile tanıştım ve BCB&#8217;yi bir daha kurmamak üzere sildim.</p>
<p>Visual Studio&#8217;dan sonra C/C++/C# yazarken herhangi bir alternatifi göz önüne almadım bile. Halen daha kullanmaya devam ediyorum. Sadece küçük düzenlemeler için sadık dostum NotePad++&#8217;ı kullanıyorum.</p>
<p><strong>Prolog</strong></p>
<p>Öğrendiğim en ilginç dillerden biri olan prolog için adını bile hatırlamadığım editörleri deneyip bıraktım. Sonunda ise kullanımı eziyet verse de TurboProlog&#8217;a döndüm. Ancak kodlarımı halen daha NotePad++ ile yazıp derleme işlemini Turbo Prolog ile yapıyorum.</p>
<p><strong>Assembly</strong></p>
<p>Assembly yazarken de kullandığım en pratik program yine NotePad++. Derleme ve trace aşamasında MPLab&#8217;dan yararlansak da NotePad++ bu işte de sadık programım oldu. Ancak şunu belirteyim ki Assembly ile yazdığım çok az program var. Odtü robot yarışlarında ve mikroişlemciler ödevim dışında assembly yazdığımı hatırlamıyorum :)</p>
<p>Özet olarak en iyi editörüm hiç kuşkusuz NotePad++ hele stil dosyasını değiştirip arka planı siyah yaptıktan sonra gözleri de yormadan rahatça saatlerinizi ona bakarak geçirebilirsiniz :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ahmetkakici.com/yazilim/kod-yazarken/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

