14 Ekim 2016 Cuma

Doğrusal Arama (Linear Search)


Dizinin ilk elemanından başlanarak dizinin her elemanı, arama değeriyle karşılaştırılır. Aranan değer bulunduğunda ilgili dizi elemanının indisi değer olarak döndürülür.  Aranan değer bulunamazsa -1 değeri döndürülür, Dizi herhangi bir şekilde sıralanmadığından değer ilk ya da son elemanda bulunabilir.  Dolayısıyla, program ortalama olarak, arama değeriyle dizinin elemanlarının yarısını karşılaştırmalıdır.




Dizilerde Arama ve Sıralama Algoritmaları

Arama ve sıralama algoritmaları (search and sort algorithms) programlama ve yazılım geliştirme dünyasında hem akademik hem de endüstri açısından önemli bir yere sahiptirler. Özellikle büyük veri kaynakları ile çalışırken,  aradığınız veriye en hızlı şekilde ulaşmanız doğru algoritmayı kullanmanıza bağlıdır.

Dizilerde Arama
Bir dizinin, belli bir arama değerine eşit olan bir değer içerip içermediğine karar vermek gerekebilir.
Dizinin belirli bir elemanını bulma sürecine arama denir.

Ders kapsamında iki tane arama tekniği üzerinde durulacaktır:
Doğrusal Arama (Linear / Sequential Search)
İkili Arama (Binary Search)

Dizi Kullanımlarında Dikkat Edilmesi Gereken En Önemli Nokta!

Dizi boyunca döngü kullanırken dizi indisi asla 0’ın altına inmemeli ve her zaman dizideki toplam eleman sayısından az olmalıdır (büyüklük-1).

Döngü devam şartının bu aralığın dışındaki elemanlara ulaşılmasını engellediğinden emin olmamız gereklidir.

Dizi sınırlarının dışındaki elemanları kullanmanın yaratacağı hatalar (genelde ciddi hatalardır) sistemden sisteme farklılık gösterir.

Dizilere Başlangıç Değeri Verme

Bir dizi, doğal olarak bazı veriler içerecektir. Diziye aynı anda birden fazla değer atanabilir. Bunun için söz konusu değerler { } işaretleri arasında virgül ile ayrılarak yazılırlar.

Örnek:
float  kutle[5] = { 8.471, 3.683, 9.107, 4.739, 3.918 };
int    maliyet[3] = { 25, 72, 94 };
double a[4] = { 10.0, 5.2, 7.5, 0.0};

Küme parantezleri sonlandırıcı ; karakteri ile bitmektedir. Bir dizinin uzunluğu belirtilmeden de başlangıç değeri atamak mümkündür.

Örnek:
int   a[] = { 100, 200, 300, 400 };
float v[] = { 9.8, 11.0, 7.5, 0.0, 12.5};
Derleyici bu şekilde bir atama ile karşılaştığında, küme parantezi içindeki eleman sayısını hesaplar ve dizinin o uzunlukta açıldığını varsayar.

Yukarıdaki örnekte, a dizisinin 4, v dizisinin 5 elemanlı olduğu varsayılır. Dizilere başlangıç değeri atarken, tüm elemanlara değer vermeden de atama yapmak mümkündür.

Örnek:
int sayilar[20] = {0};
Tüm dizi elemanlarına 0 değeri atanır…
int sayilar[20] = {1, 2, 3};
Dizinin ilk 3 elemanına 1, 2 ve 3 değerleri atanır. 4’ten itibaren olan dizi elemanlarına 0 değeri atanır…

Sayısal tipteki dizi elemanlarına 0 değeri, metin tipindeki dizi elemanlarına NULL değeri atanır.

Dizilerin Bildirimi

Bir dizi çok sayıda değişken barındırdığından, bunları birbirinden ayırt etmek için indis adı verilen bilgiler kullanılır.
Bir dizi, içerisinde çok fazla sayıda değişken barındırabilir.  Bunları birbirinden ayırt etmek için indis adı verilen bilgiler kullanılır. C Programlama Dili'nde, bir dizi hangi tipte tanımlanmış olursa olsun başlangıç indisi her zaman 0'dır. C Programlama Dili'nde, bir dizi hangi tipte tanımlanmış olursa olsun başlangıç indisi her zaman 0'dır.

Diziler tanımlanırken;
dizinin adı,
dizinin boyutu,
dizi elemanlarının hangi tipte olacağı belirtilmelidir.

Bir dizinin bildirim işleminin genel biçimi aşağıdaki gibidir:

   veriTipi dizi_adı[eleman_sayısı];

Örneğin; double türündeki 8 adet öğrenci notunu bellekte tutmak için aşağıdaki gibi bir dizi tanımlayabiliriz:
        double ogrenci_notu[8];

Şu andaki bilgilerimizle bunu nasıl yapabiliriz?

 double ogrenci_notu1;
 double ogrenci_notu2;
 double ogrenci_notu3;
 double ogrenci_notu4;
 double ogrenci_notu5;
 double ogrenci_notu6;
 double ogrenci_notu7;
 double ogrenci_notu8;


Dizinin ismi ogrenci_notu dur.

Dizinin 8 elemanı
ogrenci_notu[0], ogrenci_notu[1], ......, ogrenci_notu[7] şeklinde gösterilmiştir.

ogrenci_notu[0] içinde tutulan değer 45, ogrenci_notu[1] içinde tutulan değer 56, ogrenci_notu[7] içinde tutulan değer 90 dır.

Bu dizinin ilk iki elemanının içinde tutulan değerlerin toplamını yazdırmak isteseydik;
printf("Sonuc: %f", ogrenci_notu[0] + ogrenci_notu[1]);
Sonuc: 101

Bu dizinin yedinci elemanının değerini ikiye bölüp, oluşan sonucu x değişkenine atasaydık;
x = ogrenci_notu[6] / 2;

Dizinin yedinci elemanı ile yedinci dizi elemanı arasındaki farkı önemlidir. Dizi indisleri 0’dan başladığı için “dizinin yedinci elemanı” 6 indisine sahiptir. ”yedinci dizi elemanı” ise 7 indisine sahiptir ve aslında dizinin sekizinci elemanıdır.

Dizi Nedir?

Diziler, veri yapısı türlerinden bir tanesidir.(Array, Struct, Pointer, Class …) İçerisinde birden fazla, aynı tip ve isimdeki veriyi bellekte depolayabilen değişkenlere dizi denir.


İçerisinde birden fazla,
aynı tip ve
aynı isimdeki
veriyi bellekte depolayabilen değişkenlere dizi denir.

Örneğin; bir sınıftaki öğrencilerin notlarını saklamak için dizileri kullanmak mümkündür.

Sonsuz Döngüler

Bir döngü işlemini sonsuz kere tekrarlarsa bu döngü sonsuz döngü olarak adlandırılır.
Örnekler:
    while(1) {
         printf("Sonsuz döngü...\n");
    }

     while(7>3) {
         printf("Sonsuz döngü...\n");
      }

    for(;;)
         printf("Sonsuz döngü...\n");



İç İçe Geçmiş Döngüler

Bir program içinde birbiri içine geçmiş birden çok döngü kullanılabilir. Bu durumda (bütün programlama dillerinde olduğu gibi) önce içteki döngü, daha sonra dıştaki döngü tamamlanır.
   
    for (i=1; i<n; i++){
            //1.dış döngü
        for (j=1; j<m; j++) {
            //2.iç döngü
        }
    }

Continue Deyimi

Bir döngüyü terk etmeden bir adımın atlanması söz konusu olduğunda kullanılan deyimdir.

Kullanım biçimi aşağıdaki gibidir:

    continue;