<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-16T00:05:38+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">B-Ağaçları: Veritabanlarının Diskteki Hız Sırrı</title><link href="https://program.sonsuz.us/posts/b-agaclari-veritabanlarinin-diskteki-hiz-sirri/" rel="alternate" type="text/html" title="B-Ağaçları: Veritabanlarının Diskteki Hız Sırrı" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/b-agaclari-veritabanlarinin-diskteki-hiz-sirri</id><content type="html" xml:base="https://program.sonsuz.us/posts/b-agaclari-veritabanlarinin-diskteki-hiz-sirri/"><![CDATA[<p>Bir veritabanında milyonlarca kayıt bulunmasına rağmen sorguların birkaç milisaniyede sonuçlanması sihir değildir. Bu başarının arkasında, verileri disk üzerinde akıllıca düzenleyen indeksler ve özellikle B-ağaçları vardır. Dengeli, geniş ve kısa bir yapıya sahip olan B-ağaçları, pahalı disk erişimlerinin sayısını azaltarak aradığımız kayda mümkün olduğunca az adımda ulaşmamızı sağlar.
``</p>

<h2 id="asıl-sorun-disk-erişimi-pahalıdır">Asıl sorun: Disk erişimi pahalıdır</h2>

<p>RAM üzerindeki verilere erişmek son derece hızlıdır; ancak kalıcı veriler SSD veya sabit diskte tutulur. Diskten tek bir bayt yerine genellikle <strong>sayfa</strong> ya da <strong>blok</strong> adı verilen sabit boyutlu veri parçaları okunur. Bir sayfanın boyutu örneğin 4 KB, 8 KB veya 16 KB olabilir.</p>

<p>Bu nedenle disk tabanlı bir veri yapısında temel maliyet, yapılan karşılaştırmalar değil, okunan sayfa sayısıdır. Bir milyon kayıt arasında ikili arama teorik olarak</p>

\[\log_2(1.000.000) \approx 20\]

<p>adım gerektirir. Fakat her düğüm ayrı bir disk sayfasındaysa yaklaşık 20 disk erişimi oldukça pahalı olabilir. B-ağaçları ise bir düğümde çok sayıda anahtar saklayarak ağacın dallanma katsayısını büyütür.</p>

<h2 id="b-ağacının-temel-mantığı">B-ağacının temel mantığı</h2>

<p>İkili arama ağacındaki her düğüm en fazla iki çocuğa sahiptir. B-ağacında ise bir düğüm onlarca, hatta yüzlerce çocuk barındırabilir. Düğüm boyutu genellikle bir disk sayfasını dolduracak şekilde seçilir.</p>

<p>Bir B-ağacının dallanma katsayısı $m$ ise yaklaşık yüksekliği şöyledir:</p>

\[h \approx \log_m(n)\]

<p>Örneğin bir düğüm 100 çocuk gösterebiliyorsa bir milyon kayıt için:</p>

\[\log_{100}(1.000.000) = 3\]

<p>Yani teorik olarak yalnızca üç sayfa okumasıyla hedef bölgeye ulaşılabilir. Üst düğümlerin önbellekte tutulması durumunda gerçek disk erişimi daha da azalır.</p>

<table>
  <thead>
    <tr>
      <th>Yapı</th>
      <th style="text-align: right">Düğüm başına çocuk</th>
      <th style="text-align: right">Yaklaşık yükseklik</th>
      <th>Disk kullanımı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İkili arama ağacı</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right">Yüksek</td>
      <td>Çok sayıda rastgele erişim</td>
    </tr>
    <tr>
      <td>B-ağacı</td>
      <td style="text-align: right">Çok sayıda</td>
      <td style="text-align: right">Düşük</td>
      <td>Sayfa odaklı ve verimli</td>
    </tr>
    <tr>
      <td>B+ ağacı</td>
      <td style="text-align: right">Çok sayıda</td>
      <td style="text-align: right">Düşük</td>
      <td>Sıralı taramalar için çok uygun</td>
    </tr>
    <tr>
      <td>Hash indeks</td>
      <td style="text-align: right">Kovaya bağlı</td>
      <td style="text-align: right">Genellikle sabit</td>
      <td>Eşitlik sorgularında güçlü</td>
    </tr>
  </tbody>
</table>

<h2 id="arama-nasıl-gerçekleştirilir">Arama nasıl gerçekleştirilir?</h2>

<p>Her düğümde anahtarlar sıralı tutulur. Aranan değer düğümdeki anahtarlarla karşılaştırılır ve uygun çocuk sayfasına geçilir. Aşağıdaki sadeleştirilmiş Python kodu, bellekteki bir B-ağacı düğümünde bu yönlendirmeyi gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">BTreeNode</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">keys</span><span class="p">,</span> <span class="n">children</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">leaf</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">keys</span> <span class="o">=</span> <span class="n">keys</span>
        <span class="n">self</span><span class="p">.</span><span class="n">children</span> <span class="o">=</span> <span class="n">children</span> <span class="ow">or</span> <span class="p">[]</span>
        <span class="n">self</span><span class="p">.</span><span class="n">leaf</span> <span class="o">=</span> <span class="n">leaf</span>

    <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
        <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>

        <span class="k">while</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">)</span> <span class="ow">and</span> <span class="n">target</span> <span class="o">&gt;</span> <span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">[</span><span class="n">index</span><span class="p">]:</span>
            <span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>

        <span class="k">if</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">)</span> <span class="ow">and</span> <span class="n">target</span> <span class="o">==</span> <span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">[</span><span class="n">index</span><span class="p">]:</span>
            <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>

        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">leaf</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>

        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">children</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="nf">search</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, önce hedefin hangi anahtar aralığında bulunduğunu belirler. Düğüm yaprak değilse yalnızca ilgili çocuğa ilerler. Gerçek veritabanlarında <code class="language-plaintext highlighter-rouge">children</code> listesindeki öğeler çoğunlukla nesne değil, disk sayfalarının adresleridir. Ayrıca düğüm içindeki arama doğrusal tarama yerine ikili aramayla yapılabilir.</p>

<h2 id="ekleme-ve-bölünme">Ekleme ve bölünme</h2>

<p>Bir düğüm dolduğunda yeni kayıt gelişigüzel başka bir yere konmaz. Düğüm iki parçaya bölünür ve ortadaki anahtar üst düğüme taşınır. Üst düğüm de dolarsa bölünme köke kadar ilerleyebilir. Kök bölündüğünde ağacın yüksekliği yalnızca bir artar.</p>

<p>Bu kurallar bütün yaprakların aynı seviyede kalmasını sağlar. Böylece kötü sıralanmış eklemeler bile ağacı uzun bir zincire dönüştüremez. Arama, ekleme ve silme işlemlerinin maliyeti genel olarak $O(\log_m n)$ seviyesindedir.</p>

<h2 id="b-ağaçları-neden-daha-yaygın">B+ ağaçları neden daha yaygın?</h2>

<p>Modern veritabanları çoğunlukla B-ağacının bir türevi olan <strong>B+ ağacını</strong> kullanır. İç düğümler yalnızca yönlendirme anahtarlarını içerirken gerçek kayıtlar yapraklarda saklanır. Yapraklar birbirine bağlı olduğundan <code class="language-plaintext highlighter-rouge">WHERE yas BETWEEN 20 AND 30</code> gibi aralık sorguları, ilk kayıt bulunduktan sonra sayfalar üzerinde sıralı biçimde ilerleyebilir.</p>

<p>Kısacası B-ağaçlarının gücü yalnızca hızlı arama yapmalarından gelmez. Disk sayfalarıyla uyumlu çalışmaları, dengelerini korumaları ve yüksek dallanma katsayıları sayesinde milyonlarca kaydı birkaç disk erişimine indirgemeleri onları veritabanı indekslerinin vazgeçilmez kahramanı yapar.</p>

<p><img src="/img/b-agaclari-veritabanlarinin-26.svg" alt="b-agaclari-veritabanlarinin-26" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="b-ağacı" /><category term="veritabanı" /><category term="veri yapıları" /><category term="algoritma" /><category term="indeksleme" /><category term="disk erişimi" /><summary type="html"><![CDATA[Bir veritabanında milyonlarca kayıt bulunmasına rağmen sorguların birkaç milisaniyede sonuçlanması sihir değildir. Bu başarının arkasında, verileri disk üzerinde akıllıca düzenleyen indeksler ve özellikle B-ağaçları vardır. Dengeli, geniş ve kısa bir yapıya sahip olan B-ağaçları, pahalı disk erişimlerinin sayısını azaltarak aradığımız kayda mümkün olduğunca az adımda ulaşmamızı sağlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/b-agaclari-veritabanlarinin-26.png" /><media:content medium="image" url="https://program.sonsuz.us/img/b-agaclari-veritabanlarinin-26.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C# Arayüzler ve Yapılar: Davranış Sözleşmesinden Verimli Bellek Kullanımına</title><link href="https://program.sonsuz.us/posts/c-arayuzler-ve-yapilar-davranis-sozlesmesinden-verimli-bellek-kullanimina/" rel="alternate" type="text/html" title="C# Arayüzler ve Yapılar: Davranış Sözleşmesinden Verimli Bellek Kullanımına" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-arayuzler-ve-yapilar-davranis-sozlesmesinden-verimli-bellek-kullanimina</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-arayuzler-ve-yapilar-davranis-sozlesmesinden-verimli-bellek-kullanimina/"><![CDATA[<p>C# dünyasında <code class="language-plaintext highlighter-rouge">interface</code> ve <code class="language-plaintext highlighter-rouge">struct</code>, benzer görünen problemlere tamamen farklı yönlerden yaklaşır. Arayüzler bir türün <strong>ne yapması gerektiğini</strong> söylerken yapılar küçük verileri düşük maliyetle temsil etmeyi amaçlar. Biri davranış sözleşmesi, diğeri değer semantiği sunar. Doğru yerde kullanıldıklarında kodu hem esnek hem de hızlı hâle getirirler; yanlış tercihler ise kutulama, gereksiz kopyalama ve karmaşık tasarım gibi sürprizler doğurabilir.</p>

<p><img src="/img/c-arayuzler-ve-77.svg" alt="c-arayuzler-ve-77" /></p>

<p>``</p>

<h2 id="arayüz-davranışın-sözleşmesi">Arayüz: Davranışın sözleşmesi</h2>

<p>Arayüz, onu uygulayan türlerin sunması gereken üyeleri tanımlar. Genellikle durum saklamaz ve doğrudan örneklenemez. Böylece kod, belirli bir sınıfa değil davranışa bağımlı olur. Bu yaklaşım bağımlılıkların tersine çevrilmesini ve birim testlerini kolaylaştırır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">interface</span> <span class="nc">IBildirimGonderici</span>
<span class="p">{</span>
    <span class="k">void</span> <span class="nf">Gonder</span><span class="p">(</span><span class="kt">string</span> <span class="n">alici</span><span class="p">,</span> <span class="kt">string</span> <span class="n">mesaj</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">EpostaGonderici</span> <span class="p">:</span> <span class="n">IBildirimGonderici</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Gonder</span><span class="p">(</span><span class="kt">string</span> <span class="n">alici</span><span class="p">,</span> <span class="kt">string</span> <span class="n">mesaj</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"E-posta gönderildi: </span><span class="p">{</span><span class="n">alici</span><span class="p">}</span><span class="s"> - </span><span class="p">{</span><span class="n">mesaj</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">IBildirimGonderici</code>, gönderimin nasıl yapılacağını açıklamaz; yalnızca <code class="language-plaintext highlighter-rouge">Gonder</code> davranışını zorunlu kılar. Daha sonra SMS veya mobil bildirim sınıfları aynı arayüzü uygulayabilir. Çağıran kodun hangi somut sınıfı kullandığını bilmesine gerek kalmaz.</p>

<p>Modern C# sürümlerinde arayüzler varsayılan metot gövdeleri ve statik üyeler içerebilse de temel amaçları hâlâ ortak davranış sınırı oluşturmaktır. Arayüzü, “Bu etiketi taşıyorsan şu yetenekleri sunmalısın” diyen bir kulüp üyeliği gibi düşünebiliriz.</p>

<h2 id="struct-küçük-ama-ciddi-bir-değer-tipi">Struct: Küçük ama ciddi bir değer tipi</h2>

<p><code class="language-plaintext highlighter-rouge">struct</code>, sınıflardan farklı olarak bir <strong>değer tipidir</strong>. Bir yapı değişkene atandığında çoğunlukla referansı değil, içindeki değerler kopyalanır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">readonly</span> <span class="k">struct</span> <span class="nc">Nokta</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">X</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">Y</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">Nokta</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span><span class="p">,</span> <span class="kt">double</span> <span class="n">y</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">X</span> <span class="p">=</span> <span class="n">x</span><span class="p">;</span>
        <span class="n">Y</span> <span class="p">=</span> <span class="n">y</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="kt">double</span> <span class="nf">Uzaklik</span><span class="p">()</span> <span class="p">=&gt;</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Sqrt</span><span class="p">(</span><span class="n">X</span> <span class="p">*</span> <span class="n">X</span> <span class="p">+</span> <span class="n">Y</span> <span class="p">*</span> <span class="n">Y</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu yapı iki boyutlu bir noktayı temsil eder. Öklid uzaklığı şu formülle hesaplanır:</p>

\[d = \sqrt{x^2 + y^2}\]

<p><code class="language-plaintext highlighter-rouge">readonly struct</code>, oluşturulduktan sonra değerin değişmeyeceğini belirtir. Bu özellik hem niyeti açıklar hem de derleyicinin bazı gereksiz savunma kopyalarını azaltmasına yardımcı olabilir.</p>

<h2 id="temel-farklar">Temel farklar</h2>

<p>\vert  Özellik \vert  Interface \vert  Struct \vert 
\vert —\vert —\vert —\vert 
\vert  Ana amacı \vert  Davranış sözleşmesi tanımlamak \vert  Küçük bir değeri temsil etmek \vert 
\vert  Örneklenebilir mi? \vert  Hayır \vert  Evet \vert 
\vert  Semantik \vert  Uygulayan türe bağlı \vert  Değer semantiği \vert 
\vert  Kalıtım \vert  Bir tür birden fazla arayüz uygulayabilir \vert  Başka sınıf veya struct kalıtamaz \vert 
\vert  Durum \vert  Normal örnek alanı taşımaz \vert  Alan ve özellik taşıyabilir \vert 
\vert  <code class="language-plaintext highlighter-rouge">null</code> değeri \vert  Referans üzerinden mümkün \vert  Yalnızca <code class="language-plaintext highlighter-rouge">Nullable&lt;T&gt;</code> ile \vert</p>

<h2 id="birlikte-kullanılabilirler-mi">Birlikte kullanılabilirler mi?</h2>

<p>Elbette! Bir yapı da arayüz uygulayabilir:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">interface</span> <span class="nc">IAlanHesaplayici</span>
<span class="p">{</span>
    <span class="kt">double</span> <span class="nf">AlanHesapla</span><span class="p">();</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">readonly</span> <span class="k">struct</span> <span class="nc">Dikdortgen</span> <span class="p">:</span> <span class="n">IAlanHesaplayici</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">En</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">Boy</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">Dikdortgen</span><span class="p">(</span><span class="kt">double</span> <span class="n">en</span><span class="p">,</span> <span class="kt">double</span> <span class="n">boy</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">(</span><span class="n">En</span><span class="p">,</span> <span class="n">Boy</span><span class="p">)</span> <span class="p">=</span> <span class="p">(</span><span class="n">en</span><span class="p">,</span> <span class="n">boy</span><span class="p">);</span>

    <span class="k">public</span> <span class="kt">double</span> <span class="nf">AlanHesapla</span><span class="p">()</span> <span class="p">=&gt;</span> <span class="n">En</span> <span class="p">*</span> <span class="n">Boy</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Ancak yapı, arayüz türündeki bir değişkene atanırsa <strong>boxing</strong> oluşabilir. Boxing sırasında değer, yönetilen yığında bir nesne içine sarılır. Yaklaşık maliyeti yalnızca veri boyutu $S$ değil, nesne başlığı $H$ ile birlikte kabaca $S + H$ olarak düşünülebilir. Sık çalışan döngülerde bu tahsisler çöp toplayıcı üzerinde baskı yaratır. Generic kısıtlar, bazı senaryolarda boxing maliyetini önleyebilir.</p>

<h2 id="sınırlar-ve-seçim-rehberi">Sınırlar ve seçim rehberi</h2>

<p>Struct; küçük, mantıksal olarak tek bir değer olan ve tercihen değişmez veri modellerinde uygundur. Koordinat, renk, tarih aralığı veya ölçü birimi iyi adaylardır. Büyük struct’lar her atamada kopyalanabileceği için performansı tersine çevirebilir. Kimliği olan, uzun yaşayan veya sık değişen nesnelerde sınıf tercih edilmelidir.</p>

<p>Arayüz ise farklı türlerin ortak bir yeteneği paylaşması, bağımlılıkların soyutlanması veya test doubles kullanılması gerektiğinde güçlüdür. Kısacası arayüz <strong>“ne yapabilir?”</strong>, struct ise <strong>“hangi değeri temsil eder?”</strong> sorusuna cevap verir. Bu ayrımı korumak, hem temiz mimarinin hem de bilinçli bellek kullanımının anahtarıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="csharp" /><category term="arayüzler" /><category term="struct" /><category term="değer-tipleri" /><category term="oop" /><category term="bellek-yönetimi" /><summary type="html"><![CDATA[C# dünyasında interface ve struct, benzer görünen problemlere tamamen farklı yönlerden yaklaşır. Arayüzler bir türün ne yapması gerektiğini söylerken yapılar küçük verileri düşük maliyetle temsil etmeyi amaçlar. Biri davranış sözleşmesi, diğeri değer semantiği sunar. Doğru yerde kullanıldıklarında kodu hem esnek hem de hızlı hâle getirirler; yanlış tercihler ise kutulama, gereksiz kopyalama ve karmaşık tasarım gibi sürprizler doğurabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-arayuzler-ve-77.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-arayuzler-ve-77.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Değişkenler, Sabitler ve Veri Tipleri: Belleğin Dilini Öğrenmek</title><link href="https://program.sonsuz.us/posts/c-degiskenler-sabitler-ve-veri-tipleri-bellegin-dilini-ogrenmek/" rel="alternate" type="text/html" title="C Değişkenler, Sabitler ve Veri Tipleri: Belleğin Dilini Öğrenmek" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-degiskenler-sabitler-ve-veri-tipleri-bellegin-dilini-ogrenmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-degiskenler-sabitler-ve-veri-tipleri-bellegin-dilini-ogrenmek/"><![CDATA[<p>C programında oluşturduğumuz her değişken, bellekte ayrılmış bir alanı temsil eder. Veri tipi ise derleyiciye bu alanın yaklaşık büyüklüğünü, içindeki bitlerin nasıl yorumlanacağını ve hangi işlemlerin uygulanabileceğini söyler. Kısacası değişken bir kutuysa veri tipi kutunun etiketi, sabit ise kapağı kilitlenmiş kutudur.</p>

<p><img src="/img/c-degiskenler-sabitler-64.svg" alt="c-degiskenler-sabitler-64" /></p>

<p>``</p>

<h2 id="değişkenin-bellekteki-yaşamı">Değişkenin bellekteki yaşamı</h2>

<p>Bir değişken tanımlanırken genel olarak <code class="language-plaintext highlighter-rouge">veri_tipi isim = değer;</code> kalıbı kullanılır. Örneğin <code class="language-plaintext highlighter-rouge">int yas = 25;</code> ifadesi, <code class="language-plaintext highlighter-rouge">yas</code> adında bir bellek alanı oluşturur ve buraya 25 değerini yazar.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">yas</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">sicaklik</span> <span class="o">=</span> <span class="mi">22</span><span class="p">.</span><span class="mi">5</span><span class="n">f</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">seviye</span> <span class="o">=</span> <span class="sc">'A'</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"Yaş: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">yas</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Sıcaklık: %.1f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">sicaklik</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Seviye: %c</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">seviye</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">int</code> tam sayıları, <code class="language-plaintext highlighter-rouge">float</code> ondalıklı sayıları, <code class="language-plaintext highlighter-rouge">char</code> ise tek bir karakteri saklar. Karakterler bellekte aslında sayısal kodlar hâlinde tutulur. Örneğin ASCII sisteminde <code class="language-plaintext highlighter-rouge">'A'</code> karakterinin karşılığı 65’tir.</p>

<h2 id="temel-veri-tipleri">Temel veri tipleri</h2>

<p>C standardı bazı tiplerin kesin boyutunu değil, asgari kapasitesini ve birbirleriyle ilişkisini tanımlar. Bu nedenle aşağıdaki boyutlar yaygın sistemlerde görülen değerlerdir; kesin sonuç için <code class="language-plaintext highlighter-rouge">sizeof</code> kullanılmalıdır.</p>

<table>
  <thead>
    <tr>
      <th>Veri tipi</th>
      <th style="text-align: right">Yaygın boyut</th>
      <th>Kullanım amacı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">char</code></td>
      <td style="text-align: right">1 bayt</td>
      <td>Karakter veya küçük tamsayı</td>
      <td><code class="language-plaintext highlighter-rouge">'K'</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">short</code></td>
      <td style="text-align: right">2 bayt</td>
      <td>Küçük tamsayı</td>
      <td><code class="language-plaintext highlighter-rouge">1200</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">int</code></td>
      <td style="text-align: right">4 bayt</td>
      <td>Genel amaçlı tamsayı</td>
      <td><code class="language-plaintext highlighter-rouge">50000</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">long long</code></td>
      <td style="text-align: right">8 bayt</td>
      <td>Büyük tamsayı</td>
      <td><code class="language-plaintext highlighter-rouge">9000000LL</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">float</code></td>
      <td style="text-align: right">4 bayt</td>
      <td>Tek duyarlıklı ondalık</td>
      <td><code class="language-plaintext highlighter-rouge">3.14f</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">double</code></td>
      <td style="text-align: right">8 bayt</td>
      <td>Daha hassas ondalık</td>
      <td><code class="language-plaintext highlighter-rouge">3.14159</code></td>
    </tr>
  </tbody>
</table>

<p>Bir tip $n$ bitlik işaretsiz bir tamsayı saklıyorsa değer aralığı genellikle $0$ ile $2^n-1$ arasındadır. İki’nin tümleyeni kullanılan işaretli sistemlerde yaklaşık aralık $-2^{n-1}$ ile $2^{n-1}-1$ olur. Örneğin 8 bitlik işaretsiz değer $0$–$255$ aralığını kapsar.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"int: %zu bayt</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"double: %zu bayt</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">double</span><span class="p">));</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"char: %zu bayt</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">char</span><span class="p">));</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sizeof</code>, türün veya değişkenin kaç bayt kapladığını döndürür. Sonuç <code class="language-plaintext highlighter-rouge">size_t</code> tipinde olduğu için <code class="language-plaintext highlighter-rouge">%zu</code> biçim belirteci kullanılır.</p>

<h2 id="niteleyiciler-neyi-değiştirir">Niteleyiciler neyi değiştirir?</h2>

<p><code class="language-plaintext highlighter-rouge">short</code>, <code class="language-plaintext highlighter-rouge">long</code>, <code class="language-plaintext highlighter-rouge">signed</code> ve <code class="language-plaintext highlighter-rouge">unsigned</code>, tamsayı tiplerinin kapasitesini veya işaret davranışını düzenler. <code class="language-plaintext highlighter-rouge">const</code> ve <code class="language-plaintext highlighter-rouge">volatile</code> ise erişim kurallarını belirtir.</p>

<table>
  <thead>
    <tr>
      <th>Niteleyici</th>
      <th>Etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">unsigned</code></td>
      <td>Negatif değer yerine daha geniş pozitif aralık sağlar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">signed</code></td>
      <td>Pozitif ve negatif değerleri destekler</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">short</code></td>
      <td>Genellikle daha küçük tamsayı tipi oluşturur</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">long</code></td>
      <td>Daha geniş sayı türü belirtir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">const</code></td>
      <td>Program kodu üzerinden değiştirilmeyi engeller</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">volatile</code></td>
      <td>Değerin dış etkenlerle değişebileceğini derleyiciye bildirir</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">volatile</code>, özellikle mikrodenetleyici yazmaçlarında veya sinyal işleyicilerinde önemlidir. Derleyicinin değeri bir kez okuyup önbellekte tutmasını engeller; ancak değişkeni eşzamanlı erişime karşı güvenli yapmaz.</p>

<h2 id="sabit-oluşturma-yöntemleri">Sabit oluşturma yöntemleri</h2>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdint.h&gt;</span><span class="cp">
</span>
<span class="cp">#define BUFFER_SIZE 256
</span>
<span class="k">enum</span> <span class="p">{</span> <span class="n">MAX_RETRY</span> <span class="o">=</span> <span class="mi">3</span> <span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">const</span> <span class="kt">double</span> <span class="n">pi</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">1415926535</span><span class="p">;</span>
    <span class="kt">uint32_t</span> <span class="n">paket_no</span> <span class="o">=</span> <span class="mi">42U</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">alan</span> <span class="o">=</span> <span class="n">pi</span> <span class="o">*</span> <span class="mi">5</span><span class="p">.</span><span class="mi">0</span> <span class="o">*</span> <span class="mi">5</span><span class="p">.</span><span class="mi">0</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">alan</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">.</span><span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">paket_no</span> <span class="o">&lt;</span> <span class="n">BUFFER_SIZE</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">const</code>, türü belli salt okunur bir nesne oluşturur. <code class="language-plaintext highlighter-rouge">#define</code> metinsel ön işlemci değişimidir ve tip denetimi sağlamaz. <code class="language-plaintext highlighter-rouge">enum</code> ise tamsayı sabitleri için kullanışlıdır. <code class="language-plaintext highlighter-rouge">stdint.h</code> içindeki <code class="language-plaintext highlighter-rouge">uint32_t</code> gibi tipler, mevcut olduklarında kesin bit genişliği sağlayarak taşınabilir veri formatlarında belirsizliği azaltır.</p>

<p>Sonuç olarak doğru veri tipi seçimi yalnızca bellek tasarrufu değildir; sayı taşmalarını, hassasiyet kaybını ve platformlar arası sürprizleri önleyen temel bir tasarım kararıdır. C, belleği gizlemek yerine size anahtarları verir; fakat hangi kapıyı açtığınıza dikkat etmek tamamen sizin sorumluluğunuzdadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="değişkenler" /><category term="veri-tipleri" /><category term="sabitler" /><category term="bellek" /><category term="programlama" /><summary type="html"><![CDATA[C programında oluşturduğumuz her değişken, bellekte ayrılmış bir alanı temsil eder. Veri tipi ise derleyiciye bu alanın yaklaşık büyüklüğünü, içindeki bitlerin nasıl yorumlanacağını ve hangi işlemlerin uygulanabileceğini söyler. Kısacası değişken bir kutuysa veri tipi kutunun etiketi, sabit ise kapağı kilitlenmiş kutudur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-degiskenler-sabitler-64.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-degiskenler-sabitler-64.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Dizileri: Bellekte Yan Yana Yaşayan Veriler</title><link href="https://program.sonsuz.us/posts/c-dizileri-bellekte-yan-yana-yasayan-veriler/" rel="alternate" type="text/html" title="C Dizileri: Bellekte Yan Yana Yaşayan Veriler" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-dizileri-bellekte-yan-yana-yasayan-veriler</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-dizileri-bellekte-yan-yana-yasayan-veriler/"><![CDATA[<p>C dilinde çok sayıda aynı tür veriyi ayrı ayrı değişkenlerle yönetmek, her yolcu için ayrı otobüs çağırmaya benzer. Diziler ise tüm yolcuları tek araca bindirir: Veriler ardışık bellek hücrelerinde saklanır, ortak bir adla yönetilir ve indeksler sayesinde hızlıca erişilebilir hâle gelir.</p>

<p><img src="/img/c-dizileri-bellekte-85.svg" alt="c-dizileri-bellekte-85" /></p>

<p>``</p>

<h2 id="dizi-nedir">Dizi Nedir?</h2>

<p>Dizi, <strong>aynı veri türüne sahip sabit sayıda elemanın</strong> bellekte art arda tutulduğu veri yapısıdır. Beş öğrencinin notlarını saklamak için beş değişken tanımlamak yerine şöyle bir dizi oluşturabiliriz:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">notlar</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">78</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">90</span><span class="p">};</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">notlar</code> dizinin adı, <code class="language-plaintext highlighter-rouge">int</code> eleman türü ve <code class="language-plaintext highlighter-rouge">5</code> kapasitesidir. C dizilerinde indeksler sıfırdan başladığı için ilk eleman <code class="language-plaintext highlighter-rouge">notlar[0]</code>, son eleman ise <code class="language-plaintext highlighter-rouge">notlar[4]</code> olur.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Ayrı değişkenler</th>
      <th>Dizi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tanımlama</td>
      <td><code class="language-plaintext highlighter-rouge">n1</code>, <code class="language-plaintext highlighter-rouge">n2</code>, <code class="language-plaintext highlighter-rouge">n3</code></td>
      <td><code class="language-plaintext highlighter-rouge">notlar[3]</code></td>
    </tr>
    <tr>
      <td>Döngüyle işleme</td>
      <td>Zor</td>
      <td>Kolay</td>
    </tr>
    <tr>
      <td>Bellek düzeni</td>
      <td>Ardışık olması garanti değil</td>
      <td>Ardışık</td>
    </tr>
    <tr>
      <td>Eleman erişimi</td>
      <td>Değişken adıyla</td>
      <td>İndeksle</td>
    </tr>
    <tr>
      <td>Veri türü</td>
      <td>Farklı olabilir</td>
      <td>Tamamı aynıdır</td>
    </tr>
  </tbody>
</table>

<h2 id="bellekte-yerleşim-mantığı">Bellekte Yerleşim Mantığı</h2>

<p>Bir dizinin en önemli özelliği, elemanlarının ardışık adreslerde bulunmasıdır. Dizinin başlangıç adresi $B$, her elemanın boyutu $s$ bayt ise $i$ indeksli elemanın adresi şu formülle hesaplanır:</p>

\[Adres(A[i]) = B + i \times s\]

<p>Örneğin <code class="language-plaintext highlighter-rouge">int</code> türünün 4 bayt olduğu bir sistemde başlangıç adresi 1000 olan dizinin <code class="language-plaintext highlighter-rouge">A[3]</code> elemanı şu adrestedir:</p>

\[1000 + 3 \times 4 = 1012\]

<p>Bu doğrudan hesaplama sayesinde herhangi bir elemana erişim sabit zamanda gerçekleşir: $O(1)$. Bilgisayarın önceki elemanları tek tek gezmesi gerekmez.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">sayilar</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">};</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"sayilar[%d] = %d, adres = %p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
               <span class="n">i</span><span class="p">,</span> <span class="n">sayilar</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">sayilar</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu program her elemanın değerini ve adresini gösterir. Çıktıdaki adres farklarının genellikle <code class="language-plaintext highlighter-rouge">sizeof(int)</code> kadar olduğunu görebilirsiniz. Böylece ardışık yerleşim yalnızca teori olmaktan çıkar, terminalde görünür hâle gelir.</p>

<h2 id="dizi-adı-ve-pointer-i̇lişkisi">Dizi Adı ve Pointer İlişkisi</h2>

<p>Çoğu ifadede dizi adı, ilk elemanın adresine dönüşür. Bu nedenle <code class="language-plaintext highlighter-rouge">sayilar</code> ile <code class="language-plaintext highlighter-rouge">&amp;sayilar[0]</code> aynı başlangıç konumunu gösterir. İndeksleme de pointer aritmetiğiyle yakından ilişkilidir:</p>

\[A[i] \equiv *(A + i)\]

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">degerler</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">15</span><span class="p">};</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">degerler</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">degerler</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
</code></pre></div></div>

<p>İki satır da <code class="language-plaintext highlighter-rouge">10</code> yazdırır. Ancak dizi ve pointer tamamen aynı kavram değildir. Dizi için ayrılmış alan sabittir; dizi adına yeni bir adres atanamaz. Pointer ise farklı adresleri gösterebilen ayrı bir değişkendir.</p>

<h2 id="dizileri-döngülerle-yönetmek">Dizileri Döngülerle Yönetmek</h2>

<p>Dizilerin asıl gücü döngülerle ortaya çıkar. Aşağıdaki kod, notların toplamını ve ortalamasını hesaplar:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">notlar</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">78</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">90</span><span class="p">};</span>
    <span class="kt">int</span> <span class="n">adet</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">notlar</span><span class="p">)</span> <span class="o">/</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">notlar</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
    <span class="kt">int</span> <span class="n">toplam</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">adet</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">toplam</span> <span class="o">+=</span> <span class="n">notlar</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span>

    <span class="kt">double</span> <span class="n">ortalama</span> <span class="o">=</span> <span class="p">(</span><span class="kt">double</span><span class="p">)</span> <span class="n">toplam</span> <span class="o">/</span> <span class="n">adet</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Ortalama: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ortalama</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sizeof(notlar) / sizeof(notlar[0])</code> ifadesi toplam dizi boyutunu tek elemanın boyutuna bölerek eleman sayısını bulur. Bu yöntem yalnızca gerçek dizi aynı kapsamdayken güvenilirdir; fonksiyona aktarılan dizi parametresi pointer gibi davranır.</p>

<h2 id="sınırların-dışına-çıkma-tehlikesi">Sınırların Dışına Çıkma Tehlikesi</h2>

<p>C, indeksleri otomatik olarak denetlemez. Beş elemanlı bir dizide <code class="language-plaintext highlighter-rouge">notlar[5]</code> kullanmak tanımsız davranıştır. Program çökebilir, yanlış sonuç üretebilir veya çalışıyor gibi görünebilir. En sinsi ihtimal de sonuncusudur!</p>

<p>Bu nedenle döngü koşullarında <code class="language-plaintext highlighter-rouge">i &lt; adet</code> tercih edilmeli, <code class="language-plaintext highlighter-rouge">i &lt;= adet</code> hatasından kaçınılmalıdır. Diziler hızlı ve verimlidir; fakat güvenlik kemerini programcı takar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="diziler" /><category term="bellek-yönetimi" /><category term="programlama" /><category term="pointer" /><category term="veri-yapıları" /><summary type="html"><![CDATA[C dilinde çok sayıda aynı tür veriyi ayrı ayrı değişkenlerle yönetmek, her yolcu için ayrı otobüs çağırmaya benzer. Diziler ise tüm yolcuları tek araca bindirir: Veriler ardışık bellek hücrelerinde saklanır, ortak bir adla yönetilir ve indeksler sayesinde hızlıca erişilebilir hâle gelir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-dizileri-bellekte-85.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-dizileri-bellekte-85.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Namespace ve Koenig Araması: Fonksiyon Çözümlemesinin Görünmeyen Kuralları</title><link href="https://program.sonsuz.us/posts/c-namespace-ve-koenig-aramasi-fonksiyon-cozumlemesinin-gorunmeyen-kurallari/" rel="alternate" type="text/html" title="C++ Namespace ve Koenig Araması: Fonksiyon Çözümlemesinin Görünmeyen Kuralları" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-namespace-ve-koenig-aramasi-fonksiyon-cozumlemesinin-gorunmeyen-kurallari</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-namespace-ve-koenig-aramasi-fonksiyon-cozumlemesinin-gorunmeyen-kurallari/"><![CDATA[<p>C++’ta bir fonksiyon çağrısının hangi bildirime bağlanacağı her zaman kodda gördüğümüz isimle sınırlı değildir. <code class="language-plaintext highlighter-rouge">foo(x)</code> gibi masum bir çağrı; normal isim aramasını, ad alanlarını, aşırı yük çözümlemesini ve Koenig araması olarak da bilinen ADL mekanizmasını harekete geçirir. Bu görünmez süreç doğru kullanıldığında genişletilebilir API’ler oluşturur, yanlış anlaşıldığında ise derleyicinin neden “alakasız” bir fonksiyonu seçtiğini düşündüren hatalara yol açar.</p>

<p><img src="/img/c-namespace-ve-35.svg" alt="c-namespace-ve-35" /></p>

<p>``</p>

<h2 id="fonksiyon-çözümlemesinin-iki-perdesi">Fonksiyon çözümlemesinin iki perdesi</h2>

<p>Niteliksiz bir <code class="language-plaintext highlighter-rouge">f(x)</code> çağrısında adaylar temel olarak iki kaynaktan gelir:</p>

<ol>
  <li><strong>Normal niteliksiz isim araması:</strong> Çağrının bulunduğu kapsam, üst kapsamlar ve ilgili <code class="language-plaintext highlighter-rouge">using</code> bildirimleri incelenir.</li>
  <li><strong>Argument-Dependent Lookup (ADL):</strong> Argüman türleriyle ilişkili namespace ve sınıflardaki fonksiyonlar aranır.</li>
</ol>

<p>Bunu kavramsal olarak şöyle gösterebiliriz:</p>

\[Adaylar = Normal\ Arama \cup ADL\]

<p>Ardından overload resolution, uygulanabilir adaylar arasından dönüşümler bakımından en iyi olanı seçer. Yani ADL doğrudan kazananı belirlemez; yarışa yeni fonksiyonlar ekler.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Normal arama</th>
      <th>ADL / Koenig araması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Başlangıç noktası</td>
      <td>Çağrının yazıldığı kapsam</td>
      <td>Argümanların türleri</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">using</code> etkisi</td>
      <td>Adayları görünür yapabilir</td>
      <td>İlişkili namespace esas alınır</td>
    </tr>
    <tr>
      <td>Nitelikli çağrıda çalışır mı?</td>
      <td>Evet</td>
      <td>Genellikle hayır</td>
    </tr>
    <tr>
      <td>Temel amacı</td>
      <td>Sözcüksel isim bulma</td>
      <td>Türle birlikte tanımlanan işlemleri bulma</td>
    </tr>
  </tbody>
</table>

<h2 id="adlnin-sahneye-çıkışı">ADL’nin sahneye çıkışı</h2>

<p>Aşağıdaki fonksiyon çağrı noktasında açıkça içeri alınmamıştır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">namespace</span> <span class="n">grafik</span> <span class="p">{</span>
    <span class="k">struct</span> <span class="nc">Nokta</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">x</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">y</span><span class="p">;</span>
    <span class="p">};</span>

    <span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="k">const</span> <span class="n">Nokta</span><span class="o">&amp;</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="p">.</span><span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">", "</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="p">.</span><span class="n">y</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">grafik</span><span class="o">::</span><span class="n">Nokta</span> <span class="n">n</span><span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">};</span>
    <span class="n">yazdir</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="c1">// ADL, grafik::yazdir fonksiyonunu bulur.</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Nokta</code>, <code class="language-plaintext highlighter-rouge">grafik</code> namespace’ine ait olduğu için bu namespace çağrıyla ilişkilendirilir. Argüman <code class="language-plaintext highlighter-rouge">int</code> olsaydı kullanıcı tanımlı ilişkili bir namespace bulunmayacağından aynı numara işe yaramazdı.</p>

<p>Çağrıyı <code class="language-plaintext highlighter-rouge">::yazdir(n)</code> biçiminde nitelendirmek ise yalnızca global kapsamdaki ismi istemek anlamına gelir ve ADL katkısını ortadan kaldırır. Bu ayrım, hata ayıklarken oldukça değerlidir.</p>

<h2 id="gizli-arkadaşlar-kontrollü-görünürlük">Gizli arkadaşlar: Kontrollü görünürlük</h2>

<p>ADL’nin en güçlü kullanım alanlarından biri sınıf içinde tanımlanan <code class="language-plaintext highlighter-rouge">friend</code> fonksiyonlardır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;compare&gt;</span><span class="cp">
</span>
<span class="k">namespace</span> <span class="n">matematik</span> <span class="p">{</span>
    <span class="k">class</span> <span class="nc">Kesir</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">pay</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">payda</span><span class="p">;</span>

    <span class="nl">public:</span>
        <span class="n">Kesir</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="kt">int</span> <span class="n">q</span><span class="p">)</span> <span class="o">:</span> <span class="n">pay</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">payda</span><span class="p">(</span><span class="n">q</span><span class="p">)</span> <span class="p">{}</span>

        <span class="k">friend</span> <span class="kt">bool</span> <span class="k">operator</span><span class="o">==</span><span class="p">(</span><span class="k">const</span> <span class="n">Kesir</span><span class="o">&amp;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">Kesir</span><span class="o">&amp;</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">pay</span> <span class="o">*</span> <span class="n">b</span><span class="p">.</span><span class="n">payda</span> <span class="o">==</span> <span class="n">b</span><span class="p">.</span><span class="n">pay</span> <span class="o">*</span> <span class="n">a</span><span class="p">.</span><span class="n">payda</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">};</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu operatör normal namespace aramasında kolayca görünmez; fakat <code class="language-plaintext highlighter-rouge">Kesir</code> argümanlarıyla yapılan <code class="language-plaintext highlighter-rouge">a == b</code> ifadesinde ADL tarafından bulunur. Böylece namespace yüzeyi gereksiz fonksiyonlarla kirletilmeden türe ait işlem sunulur. Buna <strong>hidden friend idiomu</strong> denir.</p>

<h2 id="swap-kalıbı-neden-önemlidir"><code class="language-plaintext highlighter-rouge">swap</code> kalıbı neden önemlidir?</h2>

<p>Genel kodda yalnızca <code class="language-plaintext highlighter-rouge">std::swap(a, b)</code> yazmak, kullanıcı türünün kendi optimize edilmiş <code class="language-plaintext highlighter-rouge">swap</code> fonksiyonunu engelleyebilir. Geleneksel çözüm şöyledir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">;</span>
<span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</code></pre></div></div>

<p>İlk satır standart sürümü yedek aday yapar. İkinci satır niteliksiz çağrı olduğu için ADL’ye izin verir. Türün namespace’inde daha uygun bir <code class="language-plaintext highlighter-rouge">swap</code> varsa overload resolution onu seçer; yoksa <code class="language-plaintext highlighter-rouge">std::swap</code> kullanılır.</p>

<table>
  <thead>
    <tr>
      <th>Yazım</th>
      <th style="text-align: right">ADL</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::swap(a, b)</code></td>
      <td style="text-align: right">Hayır</td>
      <td>Yalnızca standart adaylar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">swap(a, b)</code></td>
      <td style="text-align: right">Evet</td>
      <td>Yerel adaylar ve ADL adayları</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">using std::swap; swap(a, b);</code></td>
      <td style="text-align: right">Evet</td>
      <td>Güvenli geri dönüş ve özelleştirme</td>
    </tr>
  </tbody>
</table>

<h2 id="sürprizlerden-korunma-rehberi">Sürprizlerden korunma rehberi</h2>

<p>Aynı isimli fonksiyonları geniş namespace’lere gelişigüzel yerleştirmek beklenmeyen belirsizlikler oluşturabilir. Özellikle bir çağrının argüman türü değiştiğinde ilişkili namespace kümesi de değişebilir. Şablonlarda bu etki daha belirgindir; bağımlı çağrıların bazı adayları ancak şablon örneklendiğinde belirlenir.</p>

<p>Kütüphane tasarlarken işlemleri ilgili türle aynı namespace’e koymak, global kapsamı kirletmemek ve özelleştirilebilir işlemlerde niteliksiz çağrı kullanmak iyi bir dengedir. Bir çağrının gizemli davrandığı durumlarda ise şu soruyu sorun: “Bu fonksiyon normal aramayla mı geldi, yoksa argümanlardan biri ADL için gizli bir kapı mı açtı?”</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="namespace" /><category term="adl" /><category term="koenig araması" /><category term="fonksiyon çözümleme" /><summary type="html"><![CDATA[C++’ta bir fonksiyon çağrısının hangi bildirime bağlanacağı her zaman kodda gördüğümüz isimle sınırlı değildir. foo(x) gibi masum bir çağrı; normal isim aramasını, ad alanlarını, aşırı yük çözümlemesini ve Koenig araması olarak da bilinen ADL mekanizmasını harekete geçirir. Bu görünmez süreç doğru kullanıldığında genişletilebilir API’ler oluşturur, yanlış anlaşıldığında ise derleyicinin neden “alakasız” bir fonksiyonu seçtiğini düşündüren hatalara yol açar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-namespace-ve-35.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-namespace-ve-35.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ RAII: İstisna Güvenliğinin Görünmez Süper Kahramanı</title><link href="https://program.sonsuz.us/posts/c-raii-istisna-guvenliginin-gorunmez-super-kahramani/" rel="alternate" type="text/html" title="C++ RAII: İstisna Güvenliğinin Görünmez Süper Kahramanı" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-raii-istisna-guvenliginin-gorunmez-super-kahramani</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-raii-istisna-guvenliginin-gorunmez-super-kahramani/"><![CDATA[<p><img src="/img/c-raii-istisna-26.svg" alt="c-raii-istisna-26" /></p>

<p>C++ programında dosya açmak, bellek ayırmak veya kilit edinmek kolaydır; asıl macera, işler ters gittiğinde bunları güvenle bırakabilmektir. Bir istisna normal kontrol akışını aniden kesebilir. RAII (Resource Acquisition Is Initialization), kaynakların ömrünü nesnelerin ömrüne bağlayarak bu sorunu dil seviyesindeki otomatik ömür yönetimine teslim eder.</p>

<p>``</p>

<h2 id="raii-tam-olarak-ne-söyler">RAII tam olarak ne söyler?</h2>

<p>RAII prensibinde kaynak, bir nesnenin kurucusunda edinilir ve yıkıcısında serbest bırakılır. Nesne kapsamdan normal biçimde çıksa da bir istisna nedeniyle ayrılsa da yıkıcı otomatik olarak çağrılır. Böylece <code class="language-plaintext highlighter-rouge">delete</code>, <code class="language-plaintext highlighter-rouge">close</code> veya <code class="language-plaintext highlighter-rouge">unlock</code> çağrılarını her çıkış yoluna elle yerleştirmek gerekmez.</p>

<p>Bir fonksiyonda $n$ farklı erken çıkış ve hata yolu bulunduğunu düşünelim. Elle yönetimde denetlenmesi gereken temizlik senaryoları kabaca $O(n)$ büyür; birden fazla bağımsız kaynak etkileşime girdiğinde olası durumlar $2^k$ seviyesine yaklaşabilir. RAII ise her kaynağın sorumluluğunu kendi nesnesine dağıtır: kapsam çözülürken nesneler edinilme sırasının tersine yok edilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Kaynak edinme</th>
      <th>Temizleme</th>
      <th>İstisna durumunda risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Elle yönetim</td>
      <td>Fonksiyon içinde</td>
      <td>Her çıkışta açıkça</td>
      <td>Sızıntı ve kilitli kalma</td>
    </tr>
    <tr>
      <td>RAII</td>
      <td>Kurucuda</td>
      <td>Yıkıcıda otomatik</td>
      <td>Çok düşük</td>
    </tr>
    <tr>
      <td>Çöp toplama</td>
      <td>Çalışma zamanı yönetir</td>
      <td>Zamanı belirsiz</td>
      <td>Bellek güvenli, diğer kaynaklar belirsiz</td>
    </tr>
  </tbody>
</table>

<h2 id="yığın-çözme-ve-istisna-güvenliği">Yığın çözme ve istisna güvenliği</h2>

<p>Bir istisna fırlatıldığında C++, uygun <code class="language-plaintext highlighter-rouge">catch</code> bloğunu ararken aradaki kapsamları terk eder. Bu sürece <strong>stack unwinding</strong>, yani yığın çözme denir. Her terk edilen kapsamın otomatik nesneleri yok edilir. RAII’nin merkezi rolü tam burada ortaya çıkar: yıkıcı, hem başarı hem başarısızlık yolunun ortak temizlik kapısıdır.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;fstream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="kt">void</span> <span class="nf">kaydet</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">veri</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">ofstream</span> <span class="n">dosya</span><span class="p">(</span><span class="s">"sonuc.txt"</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">dosya</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="p">(</span><span class="s">"Dosya açılamadı"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="n">dosya</span> <span class="o">&lt;&lt;</span> <span class="n">veri</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">dosya</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="p">(</span><span class="s">"Yazma başarısız"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span> <span class="c1">// ofstream yıkıcısı dosyayı kapatır</span>
</code></pre></div></div>

<p>İkinci hata oluşursa fonksiyon sonundaki açıklama satırına normal akışla ulaşılamaz. Buna rağmen <code class="language-plaintext highlighter-rouge">dosya</code> nesnesinin yıkıcısı çalışır ve işletim sistemi tanıtıcısı serbest bırakılır. RAII, unutkan programcıya karşı oldukça sabırlı bir güvenlik görevlisidir.</p>

<h2 id="i̇stisna-güvenliği-garantileri">İstisna güvenliği garantileri</h2>

<p>C++ kodunda genellikle üç güvence seviyesi konuşulur:</p>

<table>
  <thead>
    <tr>
      <th>Garanti</th>
      <th>Hata sonrası durum</th>
      <th>RAII’nin katkısı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel garanti</td>
      <td>Nesne geçerli, kaynak sızıntısı yok</td>
      <td>Otomatik temizlik sağlar</td>
    </tr>
    <tr>
      <td>Güçlü garanti</td>
      <td>İşlem hiç yapılmamış gibi görünür</td>
      <td>Geçici nesne ve takas desenini destekler</td>
    </tr>
    <tr>
      <td>Fırlatmama garantisi</td>
      <td>İşlem istisna üretmez</td>
      <td>Güvenli yıkıcılar için kritiktir</td>
    </tr>
  </tbody>
</table>

<p>RAII tek başına güçlü garantiyi sihirli biçimde sağlamaz; fakat onun temelini oluşturur. Örneğin önce geçici bir sonuç hazırlanıp yalnızca başarıdan sonra mevcut değerle değiştirilebilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">guncelle</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">hedef</span><span class="p">,</span>
              <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">yeniVeri</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">gecici</span> <span class="o">=</span> <span class="n">yeniVeri</span><span class="p">;</span> <span class="c1">// Kopyalama hata verebilir</span>
    <span class="n">hedef</span><span class="p">.</span><span class="n">swap</span><span class="p">(</span><span class="n">gecici</span><span class="p">);</span>                 <span class="c1">// Başarılıysa değiştir</span>
<span class="p">}</span> <span class="c1">// Eski veri gecici ile birlikte temizlenir</span>
</code></pre></div></div>

<p>Kopyalama başarısız olursa <code class="language-plaintext highlighter-rouge">hedef</code> değişmez. Başarılı olursa eski içerik <code class="language-plaintext highlighter-rouge">gecici</code> nesnesinin yıkımıyla temizlenir. Bu, güçlü garantinin “ya tamamen uygula ya hiç uygulama” mantığıdır.</p>

<h2 id="modern-c-araçları">Modern C++ araçları</h2>

<p>Ham <code class="language-plaintext highlighter-rouge">new</code> ve <code class="language-plaintext highlighter-rouge">delete</code> yerine <code class="language-plaintext highlighter-rouge">std::unique_ptr</code> tek sahipliği, <code class="language-plaintext highlighter-rouge">std::shared_ptr</code> paylaşımlı sahipliği temsil eder. <code class="language-plaintext highlighter-rouge">std::lock_guard</code> ve <code class="language-plaintext highlighter-rouge">std::scoped_lock</code> kilitleri kapsam sonunda bırakır. Dosya akışları da aynı prensibi uygular.</p>

<p>Yıkıcıların mümkün olduğunca istisna fırlatmaması gerekir. Yığın çözülürken çalışan bir yıkıcı ikinci bir istisna üretirse program <code class="language-plaintext highlighter-rouge">std::terminate</code> ile sonlanabilir. Bu nedenle pratik formül şudur: kaynağı kurucuda edin, sahipliği açıkça modelle, yıkıcıda güvenle bırak ve ham kaynağı mümkün olduğunca kısa süre çıplak tut. RAII yalnızca temizlik tekniği değil, C++’ta güvenilir tasarımın omurgasıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="raii" /><category term="istisna güvenliği" /><category term="akıllı işaretçiler" /><category term="kaynak yönetimi" /><summary type="html"><![CDATA[C++ programında dosya açmak, bellek ayırmak veya kilit edinmek kolaydır; asıl macera, işler ters gittiğinde bunları güvenle bırakabilmektir. Bir istisna normal kontrol akışını aniden kesebilir. RAII (Resource Acquisition Is Initialization), kaynakların ömrünü nesnelerin ömrüne bağlayarak bu sorunu dil seviyesindeki otomatik ömür yönetimine teslim eder.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-raii-istisna-26.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-raii-istisna-26.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Temelleri: Tarihten Derleme Modeline Sistem Programlamanın Alfabesi</title><link href="https://program.sonsuz.us/posts/c-temelleri-tarihten-derleme-modeline-sistem-programlamanin-alfabesi/" rel="alternate" type="text/html" title="C Temelleri: Tarihten Derleme Modeline Sistem Programlamanın Alfabesi" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-temelleri-tarihten-derleme-modeline-sistem-programlamanin-alfabesi</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-temelleri-tarihten-derleme-modeline-sistem-programlamanin-alfabesi/"><![CDATA[<p>C, işletim sistemlerinden gömülü cihazlara kadar sayısız teknolojinin görünmeyen motorudur. Sözdizimi ilk bakışta sade görünse de bellek, işlemci ve program arasındaki ilişkiyi doğrudan hissettirmesi onu öğretici ve güçlü kılar. C öğrenmek yalnızca yeni bir dil öğrenmek değil, bilgisayarın perde arkasına küçük ama oldukça aydınlatıcı bir pencere açmaktır.
``</p>
<h2 id="kısa-bir-tarih-yolculuğu">Kısa Bir Tarih Yolculuğu</h2>

<p>C’nin hikâyesi 1970’lerin başında Bell Laboratuvarları’nda başladı. Dennis Ritchie, Ken Thompson’ın geliştirdiği B dilinden esinlenerek daha güçlü ve taşınabilir bir dil tasarladı. Temel amaç, Unix işletim sistemini donanıma bağımlı Assembly kodları yerine daha üst seviyeli bir dille geliştirmekti.</p>

<p>Bu tercih büyük bir dönüşüm yarattı: Unix farklı bilgisayarlara daha kolay taşınırken C de sistem programlamanın ortak dili hâline geldi. Brian Kernighan ve Dennis Ritchie’nin 1978’de yayımladığı kitap, dilin ilk yaygın başvuru kaynağı oldu. Ardından ANSI C ya da C89 standardı geldi; C99, C11, C17 ve C23 sürümleri ise dili modern ihtiyaçlara göre geliştirdi.</p>

<table>
  <thead>
    <tr>
      <th>Dönem</th>
      <th>Gelişme</th>
      <th>Önemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1972</td>
      <td>C’nin ilk sürümü</td>
      <td>Unix geliştirmede kullanıldı</td>
    </tr>
    <tr>
      <td>1978</td>
      <td>K&amp;R kitabı</td>
      <td>Dilin fiilî tanımı yayıldı</td>
    </tr>
    <tr>
      <td>1989</td>
      <td>ANSI C (C89)</td>
      <td>Taşınabilir bir standart oluştu</td>
    </tr>
    <tr>
      <td>1999</td>
      <td>C99</td>
      <td>Yeni veri türleri ve sözdizimi eklendi</td>
    </tr>
    <tr>
      <td>2011–2023</td>
      <td>C11, C17, C23</td>
      <td>Güvenlik ve modernleştirme çalışmaları yapıldı</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/c-temelleri-tarihten-76.svg" alt="c-temelleri-tarihten-76" /></p>

<h2 id="bir-c-programının-anatomisi">Bir C Programının Anatomisi</h2>

<p>C programları fonksiyonlardan oluşur ve yürütme genellikle <code class="language-plaintext highlighter-rouge">main</code> fonksiyonundan başlar. Kütüphaneler başlık dosyalarıyla programa tanıtılır. Değişkenler veriyi, ifadeler hesaplamayı, kontrol yapıları ise programın kararlarını temsil eder.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">kare</span><span class="p">(</span><span class="kt">int</span> <span class="n">sayi</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">sayi</span> <span class="o">*</span> <span class="n">sayi</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">deger</span> <span class="o">=</span> <span class="mi">6</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">sonuc</span> <span class="o">=</span> <span class="n">kare</span><span class="p">(</span><span class="n">deger</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"%d sayısının karesi: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">deger</span><span class="p">,</span> <span class="n">sonuc</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">#include &lt;stdio.h&gt;</code> standart giriş-çıkış araçlarını bildirir. <code class="language-plaintext highlighter-rouge">kare</code> fonksiyonu aldığı tam sayıyı kendisiyle çarpar. Matematiksel olarak işlem</p>

\[f(x)=x^2\]

<p>şeklinde gösterilebilir. <code class="language-plaintext highlighter-rouge">main</code>, değişkenleri oluşturur, fonksiyonu çağırır ve sonucu <code class="language-plaintext highlighter-rouge">printf</code> ile ekrana yazar. <code class="language-plaintext highlighter-rouge">return 0</code> ifadesi de programın başarıyla tamamlandığını işletim sistemine bildirir.</p>

<p>C’de tür bilgisi önemlidir. Örneğin <code class="language-plaintext highlighter-rouge">int</code> tam sayıları, <code class="language-plaintext highlighter-rouge">char</code> karakterleri, <code class="language-plaintext highlighter-rouge">float</code> ve <code class="language-plaintext highlighter-rouge">double</code> ondalıklı değerleri saklar. Bir dizinin bellekte kapladığı yaklaşık alan şu ilişkiyle düşünülebilir:</p>

\[Bellek = Eleman\ Sayısı \times sizeof(Tür)\]

<p>Bu nedenle C, programcıya hem güç hem de sorumluluk verir; yanlış sınır kullanımı bellek hatalarına yol açabilir.</p>

<h2 id="kaynak-kod-nasıl-çalışan-programa-dönüşür">Kaynak Kod Nasıl Çalışan Programa Dönüşür?</h2>

<p>C çoğunlukla derlenen bir dildir. Yazdığımız kaynak kod işlemci tarafından doğrudan anlaşılmaz. Dönüşüm zinciri genel olarak şöyledir:</p>

\[Kaynak \rightarrow Ön\ İşleme \rightarrow Derleme \rightarrow Assembly \rightarrow Nesne\ Dosyası \rightarrow Bağlama\]

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Görevi</th>
      <th>Tipik çıktı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ön işleme</td>
      <td><code class="language-plaintext highlighter-rouge">#include</code> ve makroları işler</td>
      <td>Genişletilmiş kaynak</td>
    </tr>
    <tr>
      <td>Derleme</td>
      <td>C kodunu düşük seviyeli yapıya çevirir</td>
      <td>Assembly kodu</td>
    </tr>
    <tr>
      <td>Assembler</td>
      <td>Assembly komutlarını makine koduna dönüştürür</td>
      <td>Nesne dosyası</td>
    </tr>
    <tr>
      <td>Bağlama</td>
      <td>Kütüphane ve nesne dosyalarını birleştirir</td>
      <td>Çalıştırılabilir dosya</td>
    </tr>
  </tbody>
</table>

<p>GCC ile örnek program şöyle derlenebilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc <span class="nt">-Wall</span> <span class="nt">-Wextra</span> <span class="nt">-std</span><span class="o">=</span>c17 program.c <span class="nt">-o</span> program
./program
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">-Wall</code> ve <code class="language-plaintext highlighter-rouge">-Wextra</code>, olası sorunlar hakkında uyarılar üretir; <code class="language-plaintext highlighter-rouge">-std=c17</code> kullanılacak standardı seçer. Uyarıları görmezden gelmemek, C dünyasında emniyet kemeri takmaya benzer: Program yine ilerleyebilir ama ilk sert virajda farkı anlarsınız.</p>

<p>C’nin kalıcı etkisi; küçük çalışma zamanı, donanıma yakınlık, taşınabilirlik ve öngörülebilir performanstan gelir. Değişkenler, fonksiyonlar, koşullar ve döngüler temeli oluştururken derleme modelini anlamak hataları çözmeyi kolaylaştırır. Kısacası C, bilgisayara yalnızca ne yapacağını değil, bunu kaynakları nasıl kullanarak yapacağını da anlatmayı öğretir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="programlama" /><category term="derleyici" /><category term="algoritma" /><category term="sistem programlama" /><summary type="html"><![CDATA[C, işletim sistemlerinden gömülü cihazlara kadar sayısız teknolojinin görünmeyen motorudur. Sözdizimi ilk bakışta sade görünse de bellek, işlemci ve program arasındaki ilişkiyi doğrudan hissettirmesi onu öğretici ve güçlü kılar. C öğrenmek yalnızca yeni bir dil öğrenmek değil, bilgisayarın perde arkasına küçük ama oldukça aydınlatıcı bir pencere açmaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-temelleri-tarihten-76.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-temelleri-tarihten-76.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">En Uzun Tekrar Eden Alt Dizgi: Son Ek Dizileriyle Metnin Gizli Tekrarlarını Bulmak</title><link href="https://program.sonsuz.us/posts/en-uzun-tekrar-eden-alt-dizgi-son-ek-dizileriyle-metnin-gizli-tekrarlarini-bulmak/" rel="alternate" type="text/html" title="En Uzun Tekrar Eden Alt Dizgi: Son Ek Dizileriyle Metnin Gizli Tekrarlarını Bulmak" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/en-uzun-tekrar-eden-alt-dizgi-son-ek-dizileriyle-metnin-gizli-tekrarlarini-bulmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/en-uzun-tekrar-eden-alt-dizgi-son-ek-dizileriyle-metnin-gizli-tekrarlarini-bulmak/"><![CDATA[<p><img src="/img/en-uzun-tekrar-83.svg" alt="en-uzun-tekrar-83" /></p>

<p>Bir metnin içinde en az iki kez geçen en uzun parça hangisidir? İlk bakışta bütün alt dizgileri üretip karşılaştırmak makul görünebilir. Ancak metin büyüdüğünde bu yöntem, samanlıkta iğne ararken önce bütün samanları tek tek numaralandırmaya dönüşür. Son ek dizisi ve LCP dizisi ise tekrarları düzenli, hızlı ve şaşırtıcı derecede zarif biçimde ortaya çıkarır.
``</p>
<h2 id="problem-tam-olarak-nedir">Problem tam olarak nedir?</h2>

<p>Bir $S$ metni verildiğinde, metin içinde farklı başlangıç konumlarında en az iki kez bulunan en uzun <strong>alt dizgiyi</strong> ararız. Örneğin <code class="language-plaintext highlighter-rouge">banana</code> metninde cevap <code class="language-plaintext highlighter-rouge">ana</code> olur:</p>

<ul>
  <li>İlk geçiş: <code class="language-plaintext highlighter-rouge">b[ana]na</code></li>
  <li>İkinci geçiş: <code class="language-plaintext highlighter-rouge">ban[ana]</code></li>
</ul>

<p>Geçişlerin çakışmasına izin verilebilir. Örneğin <code class="language-plaintext highlighter-rouge">aaaa</code> içinde <code class="language-plaintext highlighter-rouge">aaa</code>, 0 ve 1 indislerinden başlayarak iki kez görünür.</p>

<p>Naif yaklaşım tüm alt dizgileri karşılaştırır. Uzunluğu $n$ olan bir metinde yaklaşık $n(n+1)/2$ alt dizgi bulunduğundan maliyet hızla büyür.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Temel fikir</th>
      <th style="text-align: right">Yaklaşık zaman</th>
      <th style="text-align: right">Bellek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kaba kuvvet</td>
      <td>Bütün alt dizgileri karşılaştır</td>
      <td style="text-align: right">$O(n^3)$</td>
      <td style="text-align: right">$O(1)$–$O(n^2)$</td>
    </tr>
    <tr>
      <td>Hash tabanlı arama</td>
      <td>Uzunluğu ikili arayıp hash karşılaştır</td>
      <td style="text-align: right">$O(n \log n)$</td>
      <td style="text-align: right">$O(n)$</td>
    </tr>
    <tr>
      <td>Son ek dizisi + LCP</td>
      <td>Sıralı son eklerin ortak öneklerini ölç</td>
      <td style="text-align: right">$O(n \log n)$</td>
      <td style="text-align: right">$O(n)$</td>
    </tr>
  </tbody>
</table>

<h2 id="son-ek-dizisi-neden-işe-yarar">Son ek dizisi neden işe yarar?</h2>

<p>Bir <strong>son ek</strong>, metnin herhangi bir konumundan başlayıp sona kadar giden parçadır. <code class="language-plaintext highlighter-rouge">banana</code> için son ekler şöyledir:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">Başlangıç</th>
      <th>Son ek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">0</td>
      <td>banana</td>
    </tr>
    <tr>
      <td style="text-align: right">1</td>
      <td>anana</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td>nana</td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td>ana</td>
    </tr>
    <tr>
      <td style="text-align: right">4</td>
      <td>na</td>
    </tr>
    <tr>
      <td style="text-align: right">5</td>
      <td>a</td>
    </tr>
  </tbody>
</table>

<p>Bunlar alfabetik sıralandığında başlangıç indisleri <code class="language-plaintext highlighter-rouge">[5, 3, 1, 0, 4, 2]</code> olur. Bu indis listesine <strong>son ek dizisi</strong> denir.</p>

<p>Kritik fikir şudur: Ortak başlangıca sahip son ekler alfabetik sıralamada yan yana gelir. Dolayısıyla bütün son ek çiftlerini karşılaştırmak yerine yalnızca komşuları incelemek yeterlidir.</p>

<p>Komşu son eklerin ortak önek uzunluklarını tutan yapıya <strong>LCP</strong> (<em>Longest Common Prefix</em>) dizisi denir. Aradığımız sonuç:</p>

\[L = \max_{1 \le i &lt; n} LCP[i]\]

<p><code class="language-plaintext highlighter-rouge">banana</code> için en büyük LCP değeri 3’tür; ilgili parça <code class="language-plaintext highlighter-rouge">ana</code>dır.</p>

<h2 id="python-ile-çözüm">Python ile çözüm</h2>

<p>Aşağıdaki uygulama, son ek dizisini önek katlama yöntemiyle kurar. Her turda karşılaştırılan önek uzunluğu iki katına çıkar. Ardından Kasai algoritması LCP dizisini doğrusal zamanda hesaplar.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">suffix_array</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
    <span class="n">sa</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
    <span class="n">rank</span> <span class="o">=</span> <span class="p">[</span><span class="nf">ord</span><span class="p">(</span><span class="n">ch</span><span class="p">)</span> <span class="k">for</span> <span class="n">ch</span> <span class="ow">in</span> <span class="n">text</span><span class="p">]</span>
    <span class="n">k</span> <span class="o">=</span> <span class="mi">1</span>

    <span class="k">while</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">:</span>
        <span class="n">sa</span><span class="p">.</span><span class="nf">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="p">(</span>
            <span class="n">rank</span><span class="p">[</span><span class="n">i</span><span class="p">],</span>
            <span class="n">rank</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">k</span><span class="p">]</span> <span class="k">if</span> <span class="n">i</span> <span class="o">+</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="k">else</span> <span class="o">-</span><span class="mi">1</span>
        <span class="p">))</span>

        <span class="n">new_rank</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">n</span>
        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
            <span class="n">previous</span><span class="p">,</span> <span class="n">current</span> <span class="o">=</span> <span class="n">sa</span><span class="p">[</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">],</span> <span class="n">sa</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
            <span class="n">prev_key</span> <span class="o">=</span> <span class="p">(</span><span class="n">rank</span><span class="p">[</span><span class="n">previous</span><span class="p">],</span>
                        <span class="n">rank</span><span class="p">[</span><span class="n">previous</span> <span class="o">+</span> <span class="n">k</span><span class="p">]</span> <span class="k">if</span> <span class="n">previous</span> <span class="o">+</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="k">else</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
            <span class="n">curr_key</span> <span class="o">=</span> <span class="p">(</span><span class="n">rank</span><span class="p">[</span><span class="n">current</span><span class="p">],</span>
                        <span class="n">rank</span><span class="p">[</span><span class="n">current</span> <span class="o">+</span> <span class="n">k</span><span class="p">]</span> <span class="k">if</span> <span class="n">current</span> <span class="o">+</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="k">else</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
            <span class="n">new_rank</span><span class="p">[</span><span class="n">current</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_rank</span><span class="p">[</span><span class="n">previous</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="n">prev_key</span> <span class="o">!=</span> <span class="n">curr_key</span><span class="p">)</span>

        <span class="n">rank</span> <span class="o">=</span> <span class="n">new_rank</span>
        <span class="k">if</span> <span class="n">rank</span><span class="p">[</span><span class="n">sa</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">==</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
            <span class="k">break</span>
        <span class="n">k</span> <span class="o">*=</span> <span class="mi">2</span>

    <span class="k">return</span> <span class="n">sa</span>


<span class="k">def</span> <span class="nf">longest_repeated_substring</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">text</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">""</span>

    <span class="n">sa</span> <span class="o">=</span> <span class="nf">suffix_array</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
    <span class="n">rank</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nf">len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">position</span><span class="p">,</span> <span class="n">suffix_start</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">sa</span><span class="p">):</span>
        <span class="n">rank</span><span class="p">[</span><span class="n">suffix_start</span><span class="p">]</span> <span class="o">=</span> <span class="n">position</span>

    <span class="n">best_length</span> <span class="o">=</span> <span class="n">best_start</span> <span class="o">=</span> <span class="n">common</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">text</span><span class="p">)):</span>
        <span class="n">position</span> <span class="o">=</span> <span class="n">rank</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">position</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">continue</span>

        <span class="n">j</span> <span class="o">=</span> <span class="n">sa</span><span class="p">[</span><span class="n">position</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
        <span class="nf">while </span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="n">common</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="ow">and</span>
               <span class="n">j</span> <span class="o">+</span> <span class="n">common</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="ow">and</span>
               <span class="n">text</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="n">common</span><span class="p">]</span> <span class="o">==</span> <span class="n">text</span><span class="p">[</span><span class="n">j</span> <span class="o">+</span> <span class="n">common</span><span class="p">]):</span>
            <span class="n">common</span> <span class="o">+=</span> <span class="mi">1</span>

        <span class="k">if</span> <span class="n">common</span> <span class="o">&gt;</span> <span class="n">best_length</span><span class="p">:</span>
            <span class="n">best_length</span><span class="p">,</span> <span class="n">best_start</span> <span class="o">=</span> <span class="n">common</span><span class="p">,</span> <span class="n">i</span>

        <span class="n">common</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">common</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">text</span><span class="p">[</span><span class="n">best_start</span><span class="p">:</span><span class="n">best_start</span> <span class="o">+</span> <span class="n">best_length</span><span class="p">]</span>


<span class="nf">print</span><span class="p">(</span><span class="nf">longest_repeated_substring</span><span class="p">(</span><span class="sh">"</span><span class="s">banana</span><span class="sh">"</span><span class="p">))</span>  <span class="c1"># ana
</span></code></pre></div></div>

<p>Kasai algoritmasındaki <code class="language-plaintext highlighter-rouge">common</code> değerinin her adımda tamamen sıfırlanmaması önemlidir. Bir sonraki son eke geçildiğinde ortak önek uzunluğu en fazla bir azalır; böylece tekrar tekrar aynı karakterleri okumaktan kaçınılır.</p>

<h2 id="karmaşıklık-ve-kullanım-alanları">Karmaşıklık ve kullanım alanları</h2>

<p>Bu Python uygulamasında sıralama nedeniyle son ek dizisinin kurulması yaklaşık $O(n \log^2 n)$, LCP hesabı ise $O(n)$ sürer. Özel sıralama teknikleriyle toplam süre $O(n \log n)$, gelişmiş yöntemlerle $O(n)$ seviyesine indirilebilir.</p>

<p>Aynı yaklaşım DNA dizilerindeki tekrarları, belgelerdeki kopya bölümleri, sıkıştırılabilir kalıpları ve kod içindeki benzer parçaları bulmak için kullanılabilir. Kısacası son ek dizisi, metni yalnızca sıralamaz; görünmeyen tekrarların yan yana gelmesini sağlayarak problemi kolay bir maksimum aramasına dönüştürür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritma" /><category term="son-ek-dizisi" /><category term="metin-işleme" /><category term="python" /><category term="lcp" /><category term="veri-yapıları" /><summary type="html"><![CDATA[Bir metnin içinde en az iki kez geçen en uzun parça hangisidir? İlk bakışta bütün alt dizgileri üretip karşılaştırmak makul görünebilir. Ancak metin büyüdüğünde bu yöntem, samanlıkta iğne ararken önce bütün samanları tek tek numaralandırmaya dönüşür. Son ek dizisi ve LCP dizisi ise tekrarları düzenli, hızlı ve şaşırtıcı derecede zarif biçimde ortaya çıkarır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/en-uzun-tekrar-83.png" /><media:content medium="image" url="https://program.sonsuz.us/img/en-uzun-tekrar-83.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">En Uzun Yol Problemi Neden Bu Kadar Zor?</title><link href="https://program.sonsuz.us/posts/en-uzun-yol-problemi-neden-bu-kadar-zor/" rel="alternate" type="text/html" title="En Uzun Yol Problemi Neden Bu Kadar Zor?" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/en-uzun-yol-problemi-neden-bu-kadar-zor</id><content type="html" xml:base="https://program.sonsuz.us/posts/en-uzun-yol-problemi-neden-bu-kadar-zor/"><![CDATA[<p>Bir şehirden diğerine giderken navigasyon uygulaması en kısa rotayı saniyeler içinde bulabilir. Peki uygulamadan hiçbir kavşağı iki kez ziyaret etmeden mümkün olan en uzun rotayı bulmasını istersek ne olur? Masum görünen bu değişiklik, problemi algoritmalar dünyasının en çetin sınıflarından birine taşır: En Uzun Yol Problemi genel graflarda NP-zordur.
``</p>

<h2 id="önce-yol-kavramını-netleştirelim">Önce “yol” kavramını netleştirelim</h2>

<p>Bir graf $G=(V,E)$, düğümlerden oluşan $V$ kümesi ile bu düğümleri bağlayan $E$ kenar kümesidir. Ağırlıklı bir grafta her kenarın $w(u,v)$ maliyeti bulunur. Bir $P$ yolunun toplam ağırlığı şöyle hesaplanır:</p>

\[w(P)=\sum_{(u,v)\in P} w(u,v)\]

<p>Buradaki kritik ayrıntı, aradığımız yapının <strong>basit yol</strong> olmasıdır; yani hiçbir düğüm birden fazla ziyaret edilemez. Tekrara izin verilseydi pozitif ağırlıklı bir döngünün çevresinde sonsuza kadar dolaşarak yol uzunluğunu sınırsız büyütebilirdik. Dolayısıyla anlamlı optimizasyon problemi, tekrar içermeyen en uzun yolu arar.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>En kısa yol</th>
      <th>En uzun basit yol</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Genel çözüm</td>
      <td>Dijkstra, Bellman-Ford</td>
      <td>Bilinen polinom zamanlı çözüm yok</td>
    </tr>
    <tr>
      <td>Döngü etkisi</td>
      <td>Pozitif döngüler sorun çıkarmaz</td>
      <td>Düğüm tekrarı yoksa seçimleri zorlaştırır</td>
    </tr>
    <tr>
      <td>Açgözlü yaklaşım</td>
      <td>Bazı koşullarda çalışır</td>
      <td>Genellikle yanlış sonuç verir</td>
    </tr>
    <tr>
      <td>Karmaşıklık</td>
      <td>Çoğunlukla polinom</td>
      <td>Genel durumda NP-zor</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/en-uzun-yol-21.svg" alt="en-uzun-yol-21" /></p>

<h2 id="en-kısa-yol-kolayken-en-uzun-yol-neden-zor">En kısa yol kolayken en uzun yol neden zor?</h2>

<p>En kısa yol algoritmaları <strong>optimal alt yapıdan</strong> yararlanır. Bir düğüme ulaşmanın en iyi maliyeti bulunduğunda, özellikle negatif ağırlık yoksa bu karar güvenle kullanılabilir. En uzun basit yolda ise erken seçilen bir kenar, ileride ihtiyaç duyulan önemli bir düğümü tüketebilir. Yerel olarak uzun görünen seçim, küresel olarak kısa bir çıkmaza dönüşebilir.</p>

<p>Örneğin en ağır komşuya gitmeyi seçen açgözlü algoritma, birkaç adım sonra kapanan bir kola sapabilir. Daha hafif başlayan başka bir kol ise grafın neredeyse tamamını dolaşabilir. Algoritmanın bütün olası düğüm sıralamalarını hesaba katması gerekebilir; bu olasılık sayısı üstel biçimde büyür.</p>

<h2 id="hamilton-yolu-bağlantısı">Hamilton Yolu bağlantısı</h2>

<p>Zorluğu göstermenin klasik yolu, <strong>Hamilton Yolu Problemi</strong> ile ilişki kurmaktır. Hamilton yolu, graftaki her düğümü tam bir kez ziyaret eden basit bir yoldur ve bu karar problemi NP-tamdır.</p>

<p>Ağırlıksız bir grafta her kenara $1$ ağırlığını verelim. $\vert V\vert =n$ düğüm varsa Hamilton yolu tam olarak $n-1$ kenar içerir. Şu soruyu sorabiliriz:</p>

\[\text{Uzunluğu en az } n-1 \text{ olan basit bir yol var mı?}\]

<p>Bu soruya cevap verebilen bir en uzun yol algoritması, Hamilton yolu olup olmadığını da belirler. Dönüşüm polinom zamanda yapıldığı için en uzun yol problemi NP-zordur. Ayrıca verilen bir yolun basit olduğunu ve hedef uzunluğa ulaştığını hızlıca doğrulayabildiğimizden karar sürümü NP-tamdır.</p>

<h2 id="her-graf-türünde-umutsuz-muyuz">Her graf türünde umutsuz muyuz?</h2>

<p>Hayır! Graf bir <strong>DAG</strong>, yani yönlendirilmiş döngüsüz graf ise topolojik sıralama sayesinde problem $O(\vert V\vert +\vert E\vert )$ zamanda çözülebilir. Döngü bulunmadığından geçmiş bir düğüme dönme ihtimali yoktur.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">longest_path_dag</span><span class="p">(</span><span class="n">vertices</span><span class="p">,</span> <span class="n">edges</span><span class="p">,</span> <span class="n">order</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
    <span class="n">dist</span> <span class="o">=</span> <span class="p">{</span><span class="n">v</span><span class="p">:</span> <span class="nf">float</span><span class="p">(</span><span class="sh">"</span><span class="s">-inf</span><span class="sh">"</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">vertices</span><span class="p">}</span>
    <span class="n">dist</span><span class="p">[</span><span class="n">source</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="n">order</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">dist</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">==</span> <span class="nf">float</span><span class="p">(</span><span class="sh">"</span><span class="s">-inf</span><span class="sh">"</span><span class="p">):</span>
            <span class="k">continue</span>
        <span class="k">for</span> <span class="n">v</span><span class="p">,</span> <span class="n">weight</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">[</span><span class="n">u</span><span class="p">]:</span>
            <span class="n">dist</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">dist</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">+</span> <span class="n">weight</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">dist</span>
</code></pre></div></div>

<p>Kod, düğümleri topolojik sırayla işler. <code class="language-plaintext highlighter-rouge">dist[v]</code>, kaynaktan <code class="language-plaintext highlighter-rouge">v</code> düğümüne bulunan en uzun mesafeyi saklar; her kenar yalnızca bir kez gevşetilir. Bu, en kısa yol gevşetmesine benzer, fakat <code class="language-plaintext highlighter-rouge">min</code> yerine <code class="language-plaintext highlighter-rouge">max</code> kullanılır.</p>

<p>Genel graflarda ise kesin çözüm için geri izleme, bitmask dinamik programlama veya dal-sınır yöntemleri kullanılabilir. Büyük örneklerde yaklaşım algoritmaları ve sezgiseller tercih edilir. Kısacası tek kelimelik “en” değişikliği, kolay bir rota probleminden kombinatoryal bir labirente geçmemize yeter!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritmalar" /><category term="graf teorisi" /><category term="np-zor" /><category term="en uzun yol" /><category term="dinamik programlama" /><summary type="html"><![CDATA[Bir şehirden diğerine giderken navigasyon uygulaması en kısa rotayı saniyeler içinde bulabilir. Peki uygulamadan hiçbir kavşağı iki kez ziyaret etmeden mümkün olan en uzun rotayı bulmasını istersek ne olur? Masum görünen bu değişiklik, problemi algoritmalar dünyasının en çetin sınıflarından birine taşır: En Uzun Yol Problemi genel graflarda NP-zordur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/en-uzun-yol-21.png" /><media:content medium="image" url="https://program.sonsuz.us/img/en-uzun-yol-21.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">İHA Uçuş Kontrolcüleri Rüzgâra Nasıl Meydan Okur?</title><link href="https://program.sonsuz.us/posts/iha-ucus-kontrolculeri-ruzgara-nasil-meydan-okur/" rel="alternate" type="text/html" title="İHA Uçuş Kontrolcüleri Rüzgâra Nasıl Meydan Okur?" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/iha-ucus-kontrolculeri-ruzgara-nasil-meydan-okur</id><content type="html" xml:base="https://program.sonsuz.us/posts/iha-ucus-kontrolculeri-ruzgara-nasil-meydan-okur/"><![CDATA[<p>Bir drone sakin havada uslu bir robot gibi davranabilir; ancak rüzgâr başladığında işler hızla değişir. Ani yön değişimleri, pervane itkisindeki dengesizlikler ve gövde üzerindeki aerodinamik kuvvetler, İHA’yı hedeflenen konumdan uzaklaştırır. Uçuş kontrolcüsünün görevi bu bozucu etkileri algılamak, uygun motor komutlarını hesaplamak ve araç daha ne olduğunu anlamadan dengeyi yeniden kurmaktır.
``</p>

<h2 id="rüzgâr-neden-bir-bozucudur">Rüzgâr neden bir bozucudur?</h2>

<p>Bir İHA’nın hareketi basitleştirilmiş biçimde Newton’un ikinci yasasıyla açıklanabilir:</p>

\[m\vec{a}=\vec{F}_{itki}+\vec{F}_{yerçekimi}+\vec{F}_{rüzgar}\]

<p>Burada $\vec{F}_{rüzgar}$ kontrolcünün doğrudan yönetemediği dış kuvvettir. Rüzgârın sürükleme kuvveti yaklaşık olarak</p>

\[F_d=\frac{1}{2}\rho C_d A v_r^2\]

<p>ile modellenir. $\rho$ hava yoğunluğu, $C_d$ sürükleme katsayısı, $A$ rüzgâra maruz kalan alan ve $v_r$ bağıl hava hızıdır. Hızın karesi özellikle önemlidir: Rüzgâr iki katına çıktığında sürükleme yaklaşık dört katına çıkabilir. Küçük drone’un neden sert rüzgârda alışveriş poşeti gibi savrulduğu böylece anlaşılır.</p>

<h2 id="kontrol-döngüleri-nasıl-çalışır">Kontrol döngüleri nasıl çalışır?</h2>

<p>Modern uçuş kontrolcüleri genellikle iç içe geçmiş kontrol döngüleri kullanır. En içte açısal hız, onun dışında tutum, daha dışta hız ve konum kontrolü bulunur. İç döngüler yüzlerce veya binlerce hertz hızında çalışırken GPS tabanlı konum döngüsü daha yavaştır.</p>

<table>
  <thead>
    <tr>
      <th>Kontrol katmanı</th>
      <th>Ölçülen büyüklük</th>
      <th>Tipik sensör</th>
      <th>Rüzgâra karşı görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Açısal hız</td>
      <td>Roll, pitch, yaw hızı</td>
      <td>Jiroskop</td>
      <td>Ani dönmeleri bastırır</td>
    </tr>
    <tr>
      <td>Tutum</td>
      <td>Gövde açıları</td>
      <td>IMU</td>
      <td>Aracı istenen eğimde tutar</td>
    </tr>
    <tr>
      <td>Hız</td>
      <td>Yatay ve düşey hız</td>
      <td>GPS, optik akış</td>
      <td>Sürüklenmeyi azaltır</td>
    </tr>
    <tr>
      <td>Konum</td>
      <td>Dünya koordinatları</td>
      <td>GPS, GNSS-RTK</td>
      <td>Aracı hedef noktaya döndürür</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/iha-ucus-kontrolculeri-78.svg" alt="iha-ucus-kontrolculeri-78" /></p>

<p>Rüzgâr drone’u sağa sürüklediğinde konum kontrolcüsü sola doğru hız talep eder. Hız kontrolcüsü bu talebi bir eğim açısına dönüştürür; tutum kontrolcüsü de motorların devirlerini değiştirir. Sonuçta drone, rüzgâra doğru hafifçe yatıp konumunu korur.</p>

<h2 id="pid-kontrolünün-rolü">PID kontrolünün rolü</h2>

<p>Yaygın PID kontrol yasası şöyledir:</p>

\[u(t)=K_p e(t)+K_i\int e(t)dt+K_d\frac{de(t)}{dt}\]

<p>$K_p$ mevcut hataya tepki verir, $K_i$ sürekli rüzgârın oluşturduğu kalıcı kaymayı giderir, $K_d$ ise hızlı değişimleri sönümler. Fazla yüksek kazançlar titreşime, düşük kazançlar ise ağır ve yetersiz tepkiye yol açar.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>PID</td>
      <td>Basit, hızlı ve ucuz</td>
      <td>Değişen koşullara uyumu sınırlı</td>
    </tr>
    <tr>
      <td>LQR</td>
      <td>Çok değişkenli sistemi birlikte yönetir</td>
      <td>Doğru model gerektirir</td>
    </tr>
    <tr>
      <td>MPC</td>
      <td>Kısıtları ve geleceği hesaba katar</td>
      <td>Yüksek işlem yükü oluşturur</td>
    </tr>
    <tr>
      <td>Adaptif kontrol</td>
      <td>Rüzgâra göre kendini ayarlayabilir</td>
      <td>Tasarımı ve doğrulaması zordur</td>
    </tr>
  </tbody>
</table>

<p>Aşağıdaki örnek, yatay hız hatasından pitch komutu üreten sade bir PID döngüsüdür:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">PID</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">kp</span><span class="p">,</span> <span class="n">ki</span><span class="p">,</span> <span class="n">kd</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">kp</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">ki</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">kd</span> <span class="o">=</span> <span class="n">kp</span><span class="p">,</span> <span class="n">ki</span><span class="p">,</span> <span class="n">kd</span>
        <span class="n">self</span><span class="p">.</span><span class="n">integral</span> <span class="o">=</span> <span class="mf">0.0</span>
        <span class="n">self</span><span class="p">.</span><span class="n">previous_error</span> <span class="o">=</span> <span class="mf">0.0</span>

    <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">measured</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
        <span class="n">error</span> <span class="o">=</span> <span class="n">target</span> <span class="o">-</span> <span class="n">measured</span>
        <span class="n">self</span><span class="p">.</span><span class="n">integral</span> <span class="o">+=</span> <span class="n">error</span> <span class="o">*</span> <span class="n">dt</span>
        <span class="n">derivative</span> <span class="o">=</span> <span class="p">(</span><span class="n">error</span> <span class="o">-</span> <span class="n">self</span><span class="p">.</span><span class="n">previous_error</span><span class="p">)</span> <span class="o">/</span> <span class="n">dt</span>
        <span class="n">self</span><span class="p">.</span><span class="n">previous_error</span> <span class="o">=</span> <span class="n">error</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">kp</span> <span class="o">*</span> <span class="n">error</span> <span class="o">+</span> <span class="n">self</span><span class="p">.</span><span class="n">ki</span> <span class="o">*</span> <span class="n">self</span><span class="p">.</span><span class="n">integral</span> <span class="o">+</span> <span class="n">self</span><span class="p">.</span><span class="n">kd</span> <span class="o">*</span> <span class="n">derivative</span>

<span class="n">pid</span> <span class="o">=</span> <span class="nc">PID</span><span class="p">(</span><span class="mf">0.8</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">)</span>
<span class="n">pitch_command</span> <span class="o">=</span> <span class="n">pid</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">measured</span><span class="o">=</span><span class="mf">1.2</span><span class="p">,</span> <span class="n">dt</span><span class="o">=</span><span class="mf">0.01</span><span class="p">)</span>
</code></pre></div></div>

<p>Burada hedef hız sıfırdır; ölçülen pozitif hız rüzgâr kaynaklı sürüklenmeyi temsil eder. Üretilen pitch komutu, drone’un ters yönde kuvvet oluşturmasını sağlar. Gerçek sistemlerde integral taşmasını önleyen sınırlar, çıkış doyumu ve türev filtresi de eklenmelidir.</p>

<h2 id="dayanıklılığı-artıran-unsurlar">Dayanıklılığı artıran unsurlar</h2>

<p>Başarılı rüzgâr dayanıklılığı yalnızca kontrol algoritmasına bağlı değildir. Düşük gürültülü IMU, doğru sensör füzyonu, rijit gövde, yeterli motor rezervi ve dengeli pervaneler birlikte çalışmalıdır. Kalman filtresi; jiroskop, ivmeölçer, barometre ve GPS verilerini birleştirerek daha güvenilir durum tahmini üretir.</p>

<p>Kontrolcü ayrıca motorların maksimum itki sınırını bilmelidir. Rüzgârı yenmek için gereken kuvvet fiziksel kapasiteyi aşarsa dünyanın en akıllı algoritması bile mucize yaratamaz. Bu nedenle dayanıklı bir İHA; iyi modellenmiş, doğru ayarlanmış, simülasyonda sınanmış ve kontrollü saha testleriyle doğrulanmış sistemdir. Kısacası rüzgârla kavga etmek yerine onu ölçer, tahmin eder ve motorlara doğru karşı hamleyi yaptırır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="iha" /><category term="drone" /><category term="uçuş kontrolü" /><category term="pid" /><category term="robotik" /><category term="rüzgar dayanıklılığı" /><summary type="html"><![CDATA[Bir drone sakin havada uslu bir robot gibi davranabilir; ancak rüzgâr başladığında işler hızla değişir. Ani yön değişimleri, pervane itkisindeki dengesizlikler ve gövde üzerindeki aerodinamik kuvvetler, İHA’yı hedeflenen konumdan uzaklaştırır. Uçuş kontrolcüsünün görevi bu bozucu etkileri algılamak, uygun motor komutlarını hesaplamak ve araç daha ne olduğunu anlamadan dengeyi yeniden kurmaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/iha-ucus-kontrolculeri-78.png" /><media:content medium="image" url="https://program.sonsuz.us/img/iha-ucus-kontrolculeri-78.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>