<?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>thexpot.net &#187; Delphi</title>
	<atom:link href="http://www.thexpot.net/tag/delphi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thexpot.net</link>
	<description>...olur arada öyle...</description>
	<lastBuildDate>Mon, 18 Jan 2010 13:23:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Delphi&#8217;ye Oksijen lazım</title>
		<link>http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/</link>
		<comments>http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 18:01:25 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Oxygene]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=142</guid>
		<description><![CDATA[Delphi&#8217;nin hızlı yazılım geliştirmeye getirdiği kolaylıklar anlatmakla bitmez. 90&#8242;ların sonu ve 2000&#8242;lerin başında; saniyeler içinde derleme, tüm uygulamanın tek exe olarak çıkarılabilmesi, veritabanından arayüze data bağlamadaki kolaylıkları ve arkasındaki çok büyük bir komünite ile zirvedeydi diyebiliriz.

Öncesinde Java, sonrasında .Net&#8217;in gelmesi ve Borland-Inprise-Borland-CodeGear-Embarcadero arasında sekmesi sürecinde oldukça kötü delphi sürümleri (Delphi 8, Delphi 2005, Delphi 2006) [...]]]></description>
			<content:encoded><![CDATA[<p>Delphi&#8217;nin hızlı yazılım geliştirmeye getirdiği kolaylıklar anlatmakla bitmez. 90&#8242;ların sonu ve 2000&#8242;lerin başında; saniyeler içinde derleme, tüm uygulamanın tek exe olarak çıkarılabilmesi, veritabanından arayüze data bağlamadaki kolaylıkları ve arkasındaki çok büyük bir komünite ile zirvedeydi diyebiliriz.</p>

<p>Öncesinde Java, sonrasında .Net&#8217;in gelmesi ve Borland-Inprise-Borland-CodeGear-Embarcadero arasında sekmesi sürecinde oldukça kötü delphi sürümleri (Delphi 8, Delphi 2005, Delphi 2006) arkası arkasına geldi ve Delphi popüleritesini kaybetti.
<span id="more-142"></span>
Son 2 yıldır Delphi ile yazılım geliştirmiyorum. Ben de soğudum fakat soğumamın nedini birbiri arkasında gelen hantal ve hatalı IDE&#8217;ler değildi. Yıllardır aynı yerde sayan Object Pascal&#8217;dı. Delphi, delphi olalı kullandığımız object pascal dili nerdeyse 90&#8242;lardaki ile aynıydı.</p>

<p>Pascal, okunabilirlik olarak iyi bir dildir fakat iş kodlamaya geldikçe dildeki bazı yapılar gerçekten sinir bozucu oluyor. Tabi rakipleri görmeden bu eksiklikleri tümüyle göremiyorsunuz. Bir kere görünce de görmemezlikten gelemiyorsunuz.</p>

<p>Object Pascal&#8217;ı ayrı köklerden geldikleri için C# veya Java ile karışlaştırmak doğru olmaz. Kendi klasmanında <a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank">RemObjects Oxygene</a> (eski adıyla Chrome) ile karşılaştırabiliriz.
<h3>Tüm değişkenleri var bloğunda tanımlamak</h3>
Delphi&#8217;de tüm değişkenler var bloğu içinde tanımlanmak zorundadır. Bu geçtim kod okunurluğunu kod yazımını düşürüyor. Her yeni değişken için yukarı çıkıp tanım yapmak aşağı gelip koda devam etmek gerekirki, bunu yapmazsanız code completiondan yararlanamazsınız.</p>

<p>Oysa oxygene&#8217;de buna gerek yok. Değişkeninizi kod içerisinde herhangi bir yerde tanımlayabilirsiniz. Type inference ise cabası&#8230;
<h3>Stringleri case içinde kullanamamak</h3>
Evet, case içinde string değerleri kullanamıyorsunuz.
<pre class="prettyprint">case name of
  'ahmet':;
  'metin':;
else
end;</pre>
Object Pascal&#8217;da yukarıdaki kodu derleyemezsiniz. Oxygene buna izin veriyor. Hatta yanlış hatırlamıyorsam bunu <a href="http://andy.jgknet.de/dlang/" target="_blank">Delphi Language Extension</a> adıyla bir projede de ele almışlardı.
<h3>Değer döndüren metotları &#8220;function&#8221;, döndürmeyenleri ise &#8220;procedure&#8221; anahtarı ile tanımlamak</h3>
En sinir olduklarımdan bir tanesi. Delphi&#8217;de eğer bir metod değer döndürecekse:
<pre class="prettyprint">function yap(a,b:integer):integer;</pre>
değer döndürmeyecekse
<pre class="prettyprint">procedure yap(a,b:integer):integer;</pre>
şeklinde tanımlamamamız gerekiyor. Bence çok gereksiz bir ayrım. Oxygene&#8217;deki gibi sadece <strong>method</strong> diyip geçebiliriz:
<pre class="prettyprint">method yap(a,b:integer):integer;
method yap(a,b:integer);</pre>
<h3>Generic ya da template gibi bir yapının olmaması</h3>
Delphi&#8217;de herhangi bir collection oluşturmak istediğimizde ya TList, TCollection ya da TStringList sınıflarından türetmemiz gerekiyor. Eğer bunu yapmazsak pointer&#8217;lara ve typecastlere uğraşmak zorundayız. Templateler C++ da zaten vardı. C#&#8217;a 2.0&#8242;da Java&#8217;ya ise 1.5 sürümlerinde templatelerden biraz daha farklı olan genericler eklendi. Sene 2009, Delphi&#8217;ye yeni ekleniyor. Oxygene&#8217;de bu özellik 1.0 sürümünden beri bulunuyor.
<pre class="prettyprint">Dictionary = public class
 ...
end;</pre>
<h3>foreach yapısının yetersizliği</h3>
Delphi&#8217;ye foreach yapısı 2006 sürümünde eklendi. En azından her loop için bir değişken ile for döngüsü yazmaktan kurtulduk. Fakat bazen foreach ile bir koleksiyonda ilerlerken bir de index&#8217;e ihtiyacımız olabiliyor. Oxygene bunu çok güzel bir şekilde aşmış:
<pre class="prettyprint">for each u in Users index i do begin
  if i > 0 then Console.Write(';');
  Console.Write(u.Name);
end;</pre>
i değişkenini tanımlamama gerek yok, zaten index olduğu için integer olmak zorunda.
<h3>&#8216;try/except/finally&#8217; bloğunun olmayışı</h3>
Delphi&#8217;de try/finally ve try/except blokları mevcut ama bunları ayrı ayrı kullanabiliyoruz. try/except/finally olarak kullanamıyoruz. Bu Oxygene&#8217;de ise olması gerektiği gibi yapılmış.
<h3>return gibi bir keywordun olmayışı</h3>
Delphi&#8217;de bir fonksiyondan değer döndürmek için önce Result değişkenine atama yapar sonra da exit ile fonksiyondan çıkarız yani basit bir değer döndürme işlemini ancak iki adımda yapabiliriz. Oxygene&#8217;de ise bu işlemi tek adımda yapabiliyoruz:
<pre class="prettyprint">method sum(a,b:integer):integer;
begin
  exit a + b;
end;</pre>
Şimdiye kadar saydıklarım Delphi&#8217;de olması gerekipte olmayanlar, bir de olsa güzel olacaklar var, bunları da karşılıklı örnekler vererek size sunuyorum:
<h3>gelişmiş if</h3>
Delphi:
<pre class="prettyprint">if (0 &lt;= a) and (a &lt; 10) then</pre>
Oxygene:
<pre class="prettyprint">if 0 &lt;= a &lt; 10 then</pre>
Delphi:
<pre class="prettyprint">if not (a in [1..10]) then</pre>
Oxygene:
<pre class="prettyprint">if a not in [1..10] then</pre>
<h3>Oxygene&#8217;in en çok takdir ettiğim özelliklerinden birisi</h3>
node.Parent.Parent.Caption gibi bir değere ulaşmak istiyorsunuz fakat Parent değerleri null olabilir bu durumda Delphi&#8217;de (ve diğer dillerde) hepsini null kontrolünden geçirmek gerekir
<pre class="prettyprint">result := null;
if node &lt;> null then
  if node.parent &lt;> null then
   if node.parent.parent &lt;> null then
     result := node.parent.parent.caption;</pre>
oysa Oxygene&#8217;de bunu tek satırda yazabilirsiniz:
<pre class="prettyprint">result:= node:parent:parent:caption;</pre>
eğer node veya parentlardan birisi null ise tüm ifade null döndürecek, değilse caption değeri dönecek.</p>

<p>Oxygene&#8217;in daha sayamadığım bir çok güzel özelliği var hepsini RemObject sayfasından inceleyebilirsiniz. Eğer Delphi&#8217;ye oksijen verilirse geri dönmesi işten bile değil, merakla beklemekteyim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>DelphiPI &#8211; Delphi Package Installer</title>
		<link>http://www.thexpot.net/2007/07/delphipi-021-delphi-package-installer/</link>
		<comments>http://www.thexpot.net/2007/07/delphipi-021-delphi-package-installer/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[DelphiPI]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<b>DelphiPI'nin yeni sürümünü hazırladım: <a href="node/94">0.21</a></b>

<a href="http://delphipi.googlecode.com" target="_blank">Delphi <i><font face="arial" size="3px">&#960;</font></i></a>, Delphi bileşen paketlerini bağımlılık sırasını gözeterek derler, yükler.

Diyelimki elinizde kocaman bir bileşen kütüphanesi var. Bunu kurmak için hangi sırayla paketlerin derleneceğini ve yükleneceğini çıkarmanız lazım. Bu işlem oldukça zaman alır.

Örneğin; Developer Express'in bileşenleri (Quantum Grid+ Express Bars+SpreadSheet,vs...). Tüm seti kurmak için 30'a yakın paketi tek tek açıp derleyip yüklemeniz lazım.

Delphi PI ile bu işi bir iki tıklamayla halledebilirsiniz. ]]></description>
			<content:encoded><![CDATA[<p><a href="http://delphipi.googlecode.com" target="_blank">DelphiPI</a>, Delphi bileşen paketlerini bağımlılık sırasını gözeterek derler, yükler.</p>

<p>Diyelimki elinizde kocaman bir bileşen kütüphanesi var. Bunu kurmak için hangi sırayla paketlerin derleneceğini ve yükleneceğini çıkarmanız lazım. Bu işlem oldukça zaman alır.</p>

<p>Örneğin; Developer Express&#8217;in bileşenleri (Quantum Grid+ Express Bars+SpreadSheet,vs&#8230;). Tüm seti kurmak için 30&#8242;a yakın paketi tek tek açıp derleyip yüklemeniz lazım.
<span id="more-84"></span>
Delphi PI ile bu işi bir iki tıklamayla halledebilirsiniz.</p>

<p>Tek yapmanız gereken tüm paketlerin bulunduğu klasörü seçmek ve adımları takip etmek.</p>

<p>Siz bunu yaptıktan sonra DelphiPI
<ul>
    <li> paketleri tespit edecek</li>
    <li> paketler arasındaki bağımlıklıklara göre derleme listesi çıkaracak</li>
    <li> paketleri derleyecek</li>
    <li> paketleri delphi&#8217;ye yükleyecek</li>
    <li> SourcePath&#8217;leri arayıp LibraryPath&#8217;e ekleyecek</li>
    <li> Delphi 7 ve önceki sürümlerde; bulduğu yardım dosyalarını OpenHelp&#8217;e kaydecek.</li>
</ul>
<a href="http://delphipi.googlecode.com/files/delphipi_select_folders.png"> <img src="http://delphipi.googlecode.com/files/delphipi_select_folders.png" alt="" /></a></p>

<p><a href="http://delphipi.googlecode.com/files/delphipi_compile.png"><img src="http://delphipi.googlecode.com/files/delphipi_compile.png" alt="" /></a></p>

<p><a href="http://delphipi.googlecode.com/files/delphipi_install_help_files.png"><img src="http://delphipi.googlecode.com/files/delphipi_install_help_files.png" alt="" /></a></p>

<p><a href="http://code.google.com/p/delphipi/downloads/list" target="_blank">DelphiPI&#8217;yi indirmek için tıklayın</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/07/delphipi-021-delphi-package-installer/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Arayüz hazırlarken HTML&#8217;den faydalanmak</title>
		<link>http://www.thexpot.net/2007/07/arayuz-hazirlarken-htmlden-faydalanmak/</link>
		<comments>http://www.thexpot.net/2007/07/arayuz-hazirlarken-htmlden-faydalanmak/#comments</comments>
		<pubDate>Fri, 06 Jul 2007 21:27:24 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Genellikle yazılımlarımızda HTML içeriği görüntülememiz gerektiğinde, VCL ile gelen WebBrowser bileşeninden faydalanırız.
Bir adım ileri gidip bu bileşenden ve HTML'den yararlanarak görsel bakımdan zengin arayüzler oluşturmamız mümkündür. Aslında çok küçük bir hile ile HTML kullanarak hazırladığımız sayfalarla tek yönlü olarak haberleşebiliriz.

HTML kullanarak dinamik yardım veya menüler oluşturabilir ve HTML sayfasındaki bağlantılara tıklanıldığı zamanda yapılması gereken işlemi 
WebBrowser nesnesinin BeforeNavigate2 olayını kullanarak değiştirebiliriz.

Bunu yapmak için HTML içinde belirtilen bağlantı yollarının http'den farklı, kendimizin belirlediği bir protokolle şekillendirilmiş olması yeterlidir. ]]></description>
			<content:encoded><![CDATA[<p>Genellikle yazılımlarımızda HTML içeriği görüntülememiz gerektiğinde, VCL ile gelen WebBrowser bileşeninden faydalanırız.
Bir adım ileri gidip bu bileşenden ve HTML&#8217;den yararlanarak görsel bakımdan zengin arayüzler oluşturmamız mümkündür. Aslında çok küçük bir hile ile HTML kullanarak hazırladığımız sayfalarla tek yönlü olarak haberleşebiliriz.</p>

<p>HTML kullanarak dinamik yardım veya menüler oluşturabilir ve HTML sayfasındaki bağlantılara tıklanıldığı zamanda yapılması gereken işlemi
WebBrowser nesnesinin BeforeNavigate2 olayını kullanarak değiştirebiliriz.</p>

<p>Bunu yapmak için HTML içinde belirtilen bağlantı yollarının http&#8217;den farklı, kendimizin belirlediği bir protokolle şekillendirilmiş olması yeterlidir.
<span id="more-82"></span>
Örneğin :
<pre><a href="app://actShowHelpBox">Yardımı görüntüle</a></pre>
<pre class="prettyprint">procedure TForm1.WebBrowserBeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
var
 ActionName : string;
 Action : TContainedAction;
begin
  ActionName := '';
  // başında app stringi olan URL'lerden action adını çıkarıyoruz.
  if pos('app:',URL)=1 then
    ActionName := copy(URL,5,length(URL)-4);
  // action adı çıkarabildiysek bu URL'yi biz işleyeceğiz
  // dolayısıyla WebBrowser nesnesinin işlem yapmasını iptal ediyoruz.
  Cancel := Length(ActionName) > 0;</p>

<p>// ActionList'ten action bulmaya çalışıyoruz.
  Action := FindAction(ActionList,ActionName);
  // Eğer bulduysak çalıştırıyoruz.
  if Assigned(Action) then
    Action.Execute;
end;</pre>
Yukarıdaki kodda sadece gidilmesi istenen URL&#8217;nin app protokolü ile mi başladığını kontrol edip, eğer öyle ise ActionListten aynı isimli bir action arıyoruz.
Bulduğumuzda da çalıştırıyoruz.</p>

<p>FindAction fonksiyonu ise şu şekilde:
<pre class="prettyprint">function TForm1.FindAction(anActionList: TActionList;
  actionName: String): TContainedAction;
var
  i: Integer;
begin
  Result := nil;
  for I := 0 to anActionList.ActionCount - 1 do
    if UpperCase(anActionList.Actions[i].Name) = UpperCase(actionName) then begin
       Result := anActionList.Actions[i];
       exit;
    end;
end;</pre>
İki tane örnek uygulama:</p>

<p><a href="http://www.thexpot.net/files/html_arayuz.zip">html_arayuz.zip</a> (257 KB)
<a href="http://www.thexpot.net/files/dinamikyardim.zip">dinamikyardim.zip</a> (268 KB)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/07/arayuz-hazirlarken-htmlden-faydalanmak/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Expression Evaluation</title>
		<link>http://www.thexpot.net/2005/11/expression-evaluation/</link>
		<comments>http://www.thexpot.net/2005/11/expression-evaluation/#comments</comments>
		<pubDate>Thu, 17 Nov 2005 18:28:43 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Merhaba,

Recursion yöntemini kullanarak neler yapılabileceğini göstermek amacıyla
<blockcode highlight="off">
     12
  -------- + 6
   13 + 1

<hr />

<pre class='prettyprint'><code>28
</code></pre>

</blockcode>
gibi ifadeleri (Expression) hesaplayan örnek bir program yazalım dedim.

Program bölme ve toplama işlemlerini tanıyabilecek. Bölme için gerekli çizgiler ‘-‘ karakteri kullanılarak çizilecek.

İfadeler ya bölme ya toplama işlemi olacak o yüzden şöyle bir class hiyerarşisi oluşturuyoruz.

İlk olarak bütün ifadelerin hesaplama yapan bir metodu olmalı ve bu metod Real bir değer döndürmeli. O yüzden TExpression diye abstract bir class tanımlıyoruz ve içine Evaluate metodunu yazıyoruz.]]></description>
			<content:encoded><![CDATA[<p>Merhaba,</p>

<p>Recursion yöntemini kullanarak neler yapılabileceğini göstermek amacıyla</p>

<pre class='prettyprint'><code>   12
-------- + 6
 13 + 1
 ------
   28
</code></pre>

<p>gibi ifadeleri (Expression) hesaplayan örnek bir program yazalım dedim.</p>

<p>Program bölme ve toplama işlemlerini tanıyabilecek. Bölme için gerekli çizgiler ‘-‘ karakteri kullanılarak çizilecek.</p>

<p>İfadeler ya bölme ya toplama işlemi olacak o yüzden şöyle bir class hiyerarşisi oluşturuyoruz.</p>

<p>İlk olarak bütün ifadelerin hesaplama yapan bir metodu olmalı ve bu metod Real bir değer döndürmeli. O yüzden TExpression diye abstract bir class tanımlıyoruz ve içine Evaluate metodunu yazıyoruz.
<span id="more-4"></span></p>

<pre class='prettyprint'><code>TExpression =  class
public
  function Evaluate:Real;virtual;abstract;
end;
</code></pre>

<p>Tek başına yazılmış bir sayı da bir çeşit ifade olduğu için TExpression classından TSingleExpression adında bir class türetiyoruz</p>

<pre class='prettyprint'><code>TSingleExpression = class(TExpression)
private
  FValue : Real;
public
  function Evaluate: Real;override;
  constructor Create(AValue : Real);
end;
</code></pre>

<p>Bu classın Evaluate metodu çalışıtırıldığında Fvalue alanındaki değeri döndürecek.</p>

<p>Toplama işlemi için TAdditionExpression adıyla bir class daha tanımlıyoruz:</p>

<pre class='prettyprint'><code>TAdditionExpression = class(TExpression)
protected
  FLeft : TExpression;
  FRight: TExpression;
public
  function Evaluate: Real;override;
  constructor Create(Left,Right:TExpression);
  destructor Destroy;override;
end;
</code></pre>

<p>Bu classın evaluate metoduda Fleft ve Fright alanlarındaki Expression classlarının evaluate metodlarını çalıştırıp çıkan sonucu toplayarak döndürecek</p>

<p>Bölme işlemi de toplama işleminden çok farklı olmadığı için</p>

<pre class='prettyprint'><code>TDivisionExpression = class(TAdditionExpression)
public
  function Evaluate: Real;override;
end;
</code></pre>

<p>Program şöyle bir algoritma izleyecek:</p>

<pre class='prettyprint'><code>function Parse(Lines: TstringList):Texpression;
basla
  // bölme işlemi için
  eger &lt;&gt; basla
     &lt;&lt;İfadeyi o satırdan Sag ve Sol olamk üzere ikiye ayır&gt;&gt;
     Expr1 = parse(Sag);
     Expr2 = parse(Sol);
     Result := TDivisionExpression.Create(Expr1,Expr2);
     Exit;
  bitir;
  // toplama işlemi için
  eger &lt;&gt; basla
     &lt;&lt;İfadeyi o sütundan Ust ve Alt olam üzere ikiye ayır&gt;&gt;
     Expr1 = parse(Ust);
     Expr2 = parse(Alt);
     Result := TAdditionExpression.Create(Expr1,Expr2);
     Exit;
  bitir;
  // sayılar için
  eger &lt;&gt; basla
     Result := TSingleExpression.Create(Deger)
  bitir;
  // hiçbir koşula düşmediyse
  Hata;
bitir;
</code></pre>

<p>Hesaplama işlemi aşağıdaki kodla yapılabilecek</p>

<pre class='prettyprint'><code>var
  Exp : TExpression;
begin
Exp:=Parse(memo1.lines);
ShowMessage(FloatToStr(Exp.Evaluate));
End;
</code></pre>

<p>Metod çalıştırıldığında recursive olarak İfade Ağacı (Expression Tree) oluşturulacak.</p>

<p>Kaynak Kod: <a href="http://www.thexpot.net/files/memoevaluate.rar">memoevaluate.rar</a>
Çalıştırılabilir Dosya : <a href="http://www.thexpot.net/files/memoevaluate.exe.rar">memoevaluate.exe.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2005/11/expression-evaluation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backtracking</title>
		<link>http://www.thexpot.net/2005/11/backtracking/</link>
		<comments>http://www.thexpot.net/2005/11/backtracking/#comments</comments>
		<pubDate>Thu, 17 Nov 2005 17:25:09 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Merhaba arkadaşlar,
İlk algoritma olarak kodlaması kolay ama kolay olduğu kadarda masraflı çok olan “Aynı yere geri dönme” (Backtrack) algoritmasını seçtim. Makelenin geri kalanında backtrack olarak söz edeceğim.

Backtrack algoritması özyineleme (recursion) desteklenen her dilde kodlanabilir ve basit bir algoritma olmasına rağmen de bir çok ufak iş için kullanılabilir. Bu algoritmanın dezavantajı maximum adım sayısı bilinmeyen durumlarda stackoverflow hatasına neden olabilmesidir.

Algoritmanın pseudo-code’u aşağıdaki gibi :
<code>
  procedure backtrack(i:integer;deger: integer);
  basla
    Eger sonuclardan-biriyse
      &#60;&#60; sonucla ilgili islemleri yap >>
    degilse
       her adaydeger icin backtrack(i+1,adaydeger);
    bitir;]]></description>
			<content:encoded><![CDATA[<p>Merhaba arkadaşlar,
İlk algoritma olarak kodlaması kolay ama kolay olduğu kadarda masraflı çok olan “Aynı yere geri dönme” (Backtrack) algoritmasını seçtim. Makelenin geri kalanında backtrack olarak söz edeceğim.</p>

<p>Backtrack algoritması özyineleme (recursion) desteklenen her dilde kodlanabilir ve basit bir algoritma olmasına rağmen de bir çok ufak iş için kullanılabilir. Bu algoritmanın dezavantajı maximum adım sayısı bilinmeyen durumlarda stackoverflow hatasına neden olabilmesidir.</p>

<p>Algoritmanın pseudo-code’u aşağıdaki gibi :</p>

<pre class='prettyprint'><code>procedure backtrack(i:integer;deger: integer);
basla
  Eger sonuclardan-biriyse
    &lt;&lt; sonucla ilgili islemleri yap &gt;&gt;
  degilse
    her adaydeger icin backtrack(i+1,adaydeger);
  bitir;
bitir;
</code></pre>

<p>Tabi ilk bakışta bu pseudo-code’dan her şeyi anlamak kolay değil, o yüzden hemen bir örnek verelim. Bu algoritmayı kullanarak bir kümenin bütün alt kümelerini oluştururalım. Kümemiz 1’den 5’e kadar olan sayılardan oluşsun. Algoritmada bahsi geçen her adım için adaylar true ve false değerlerini alacak. Yani herhangi bir indexdeki eleman o altkümenin içindeyse true değilse false olarak işaretlenecek. Eger adım sayısı kümenin eleman sayısına eşit olduysa tüm kombinasyonlar üretildi demektir, sonucu ekrana yazıyoruz. Eger adım sayısı kümenin eleman sayısından küçükse daha üretilmesi gerek kombinasyonlar var demektir, bizde bir sonraki adım için tüm olası değerleri veriyoruz.</p>

<pre class='prettyprint'><code>arr : array[1..5] of boolean;

procedure Recurse(i : integer; val:boolean);
var 
  j : integer;
begin
  arr[i]:= val;
  if (i=Length(arr)) then begin
    Write('{ ');
    for j := 0 to Length(Arr) do  if(arr[j]) then Write(j,' ');
    WriteLN(' }');
  end else begin
    recurse(i+1,true);
    recurse(i+1,false);
  end;
end;
begin
  recurse(1,true);
  recurse(1,false);
  readln;
end.
</code></pre>

<p>n elemanlı bir kümenin 2^n tane altkümesi vardır, dolayısıyla örneği çalıştırdığımızda 32 tane sonuç göreceğiz.</p>

<p>İkinci örnek olarak da bir string içindeki karakterlerin bütün permütasyonlarını oluşturalım. Yine aynı mantığı kullanıcaz ama bu sefer biraz daha fazla çalışmamız lazım.</p>

<pre class='prettyprint'><code>var
  str : string = 'ABC';

 procedure backtrack(str:string;i:integer);
 var
  j: integer;
  ch : char;
 begin
   if i = length(str) then begin
     WriteLn(str);
   end else begin
     for j := i to length(str) do begin
        ch := str[i];
        str[i] := str[j];
        str[j] := ch;
        backtrack(str,i+1);
     end;
   end;
 end;

begin
  backtrack(str,1);
  Readln;
end.
</code></pre>

<p>Örnekteki i değeri str değişkeninin uzunluğuna denk olduğunda bunu ekrana yazıyoruz, eğer değilse i ve length(Str) arasındaki karakterleri str değişkeninin i. karakteri ile değiştirip prosedürü tekrar çağırıyoruz.
Üç karakterden oluşan stringin toplam 3! = 6 tane permütasyonu olması lazım, yalnız biz bunu yaparken bütün karakterlerin birbirinden farklı olduğunu farzediyoruz. ‘AAA’ şeklinde tanımlanmış bir değişkende birbirinin aynısı olmasına rağmen 6 tane satır göreceğiz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2005/11/backtracking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
