DİZİLER Arrays
Bir dizinin bütün elemanları bellekte ardışık olarak saklanır. Giriş Aynı isim altında, aynı türde birden fazla değer tutmak için kullanılan veri yapılarıdır (Data Structure). Dizi bir kümedir; aynı türde verilere tek bir isimle erişmek için kullanılır. Bir dizinin bütün elemanları bellekte ardışık olarak saklanır. Diziler bir veya daha çok boyutlu olabilirler. Hasan TINMAZ
Tek boyutlu dizilerin tanımlanması aşağıdaki biçimde olur. Buradaki eleman sayısı değişken olamaz. Fakat önceden tanımlanmış bir sembolik sabit olabilir. Genel kullanımdaki köşeli parantez isteğe bağlı anlamında değildir. Köşeli parantez sembolü dizi tanımlamalarında mutlaka yazılmalıdır. GK: dizinintürü dizininadı [elemansayısı] ; Hasan TINMAZ
/* 6 elemanlı, her elemanı int olan dizi*/ char d2[15]; Örnek int a[6]; /* 6 elemanlı, her elemanı int olan dizi*/ char d2[15]; /*15 elemanlı, her elemanı char olan dizi*/ float x[10]; /*10 elemanlı, her elemanı float olan dizi*/ double k[10]; /*10 elemanlı, her elemanı double olan dizi*/ Hasan TINMAZ
Bu alanın başlangıç adresini, dizi adına aktarır. Açıklama Derleyici ilk örnekteki gibi bir komutla karşılaştığında, 6 adet sayının saklanacağı bellek alanını ayırır. Bir tamsayı 2 byte (DOS'da) uzunluğunda olduğuna göre, dizinin bellekte kaplayacağı alan 2*6=12 byte olacaktır. Bu alanın başlangıç adresini, dizi adına aktarır. Hasan TINMAZ
İndis değerleri mutlaka tamsayı olmalıdır. Açıklama Dizi içerisindeki her bir elemana, dizi isminden sonra, yazılan pozisyon numarası; yani indis değeri (subscript) ile ulaşılır. İndis değerleri mutlaka tamsayı olmalıdır. C dilinde bütün dizilerin indis numarası 0'dan başlar. Dolayısı ile dizinin en büyük indis numarası eleman sayısından bir eksiktir. Hasan TINMAZ
Tek Boyutlu Dizi Hasan TINMAZ
Tek boyutlu dizilere değer atanması Dizinin elemanlarına ulaşmak için dizinin ismi ve köşeli parantez içerisinde indis numarasını yazmak yeterlidir. a[0]=-12; /*dizinin 0 no'lu elemanına -12 değerini ata*/ a[2]=a[4]+3; /*dizinin 2 nolu elemanına 4 nolu elemanının 3 fazlasını ata .*/ for(i=0;i<6;i++) a[i] =0; /*0'dan 6'ya kadar */ /* dizinin elemanlarına 0 değerini ata .*/ Hasan TINMAZ
Dolayısı ile bu iki ifade eşit değildir. Dikkat a[i] +1 ile a[i+1] İlk gösterim dizinin i no'lu indisindeki elemanın bir fazlası anlamına gelir, ikinci gösterim ise dizinin i'nin bir fazlası indisindeki elemanı anlamına gelir. Dolayısı ile bu iki ifade eşit değildir. Hasan TINMAZ
Tek boyutlu dizilere ilk değer atanması (initialize) Tanımlanan dizilere ilk değer ataması ise aşağıdaki şekilde yapılır. int a[5]={4,5,3,1,8}; İlk değer atama işleminde küme parantezi kullanılır. Küme işaretinden sonra ( ; ) kullanılmasına dikkat ediniz. Böyle bir ilk değer atamasından sonra dizinin elemanları aşağıdaki gibi yerleşir. Hasan TINMAZ
Tek boyutlu diziye ilk değer atamasından sonra elemanların yerleşimi Hasan TINMAZ
Ayrıca… Küme işaretleri içerisine dizinin eleman sayısından daha fazla eleman yazıldığında bir yazım hatası ortaya çıkar. Eleman sayısından daha az eleman yazıldığında ise, diğer elemanlar otomatik olarak sıfır değerini alır. İlk değer ataması yapılmayan dizilerin elemanları hafızadaki rasgele değerlerden oluşur. Hasan TINMAZ
Ayrıca İlk değer ataması yapıldığında eleman sayısını yazma zorunluluğu yoktur. Ne kadar eleman yazılmışsa, eleman sayısı o kadar olur. Hasan TINMAZ
ÖRNEK: Klavyeden girilen 5 adet tamsayıyı, giriş sırasının tersinden ekrana yazan C programını kodlayınız. Bu problemde dizi kullanılmayacak olsaydı, 5 ayrı değişkene ihtiyaç duyulacaktı. Çünkü girilen her bir değere klavyeden girme işlemi bittikten sonra, tekrar ulaşmak gerekecektir. Hasan TINMAZ
Kod: Hasan TINMAZ
Bu problem çözülürken öncelikle ortalamanın bulunması gereklidir. ÖRNEK: Klavyeden girilen 10 adet tamsayı sınav notuna göre, ortalamanın üstünde olanları ekrana yazan C programı… Bu problem çözülürken öncelikle ortalamanın bulunması gereklidir. Ortalamanın bulunabilmesi için bütün notların toplamı alınacak ve not adedine bölünecektir. Bu noktadan sonra daha önceden girilmiş notların her biri sıra ile ortalamayla karşılaştırılacak büyük olanlar ekrana yazdırılacaktır. Çözümde dizi kullanılmayacak olsaydı, 20 ayrı değişkene ihtiyaç duyulacaktı. Çünkü, girilen her bir değere klavyeden girme işlemi bittikten sonra tekrar ulaşmak gerekecektir. Hasan TINMAZ
Örnek Çalışma: Hasan TINMAZ
Kod: Hasan TINMAZ
Sıralama (Sorting)
Giriş Dizi elemanlarını sıralama ihtiyacı doğduğunda kullanılabilecek pek çok algoritma vardır. Bunlar kabarcık sıralama (bubble şort), seçme sıralama (selection şort), Shell şort, çabuk sıralama (quick sort) vs. olabilir. Bu derste, sıralama yöntemi olarak en çok kullanılan ve en basit sıralama algoritmalarından biri olan, kabarcık sıralama (bubble sort) algoritması kullanılacaktır. Hasan TINMAZ
Büyük ya da küçük sorgulaması yapılır. Bubble Sort Bu algoritmada her bir eleman kendisinden sonra gelen eleman ile karşılaştırılır. Büyük ya da küçük sorgulaması yapılır. Büyük sorgulaması yapıldığında dizi küçükten büyüğe, küçük sorgulaması yapıldığında dizi büyükten küçüğe sıralanır. Eğer şarta uyuyor ise elemanların yerleri değiştirilir (swap). Bu işlem dizinin eleman sayısınca tekrar ettirilir. Hasan TINMAZ
Sıralanması istenilen dizi 5 elemanlı olursa geçiş sayısı 5 dir. Bubble Sort Aşağıda örnek olarak seçilen bir dizi üzerinde algoritmanın çalışma şekli verilmiştir. Sıralanması istenilen dizi 5 elemanlı olursa geçiş sayısı 5 dir. Öncelikle büyük ya da küçük karşılaştırmalarından hangisinin uygulanacağına karar verilmesi gerekir. Aşağıdaki örnekte büyük karşılaştırması yapılmıştır. Hasan TINMAZ
Hasan TINMAZ
Örnek olarak a ve b adında iki adet değişken olsun. … Algoritmanın uygulamasını yapmadan önce, elemanların yer değiştirme işleminin nasıl yapıldığının bilinmesi gerekir . Örnek olarak a ve b adında iki adet değişken olsun. Yer değiştirme işlemi (swap) a değişkenin içerisindeki değer b içerisine , b değişkenin içerisindeki değerde a değişkenin içerisine aktarılacak demektir. Hasan TINMAZ
Bu işlemden sonra a değişkeni içerisinde de 7 değeri vardır. Bir programlama dilini yeni öğrenen öğrenenlerin çoğunluğu aşağıdaki gibi bir kod yazarlar. a = b; b = a; Varsayalım ki a değişkeni içerisinde 5, b değişkeni içerisinde de 7 değeri olsun. Yukarıdaki kod sadece b değişkeni içerisindeki 7 değerini a değişkeni içerisine aktarmaktadır. Bu işlemden sonra a değişkeni içerisinde de 7 değeri vardır. Sonra tekrar 7 değerini b değişkeni içerisine aktarmaktadır. Sonuçta iki değişkende aynı değeri saklarlar. Sağlıklı bir yer değiştirme için üçüncü bir geçici değişkene ihtiyaç vardır. Hasan TINMAZ
Yer değiştirme işlemi Hasan TINMAZ
Kod aşağıdaki gibi yazılabilir: yedek = a; /* 1 nolu gösterim*/ Burada… a değişkeni içerisindeki değer yedek içerisine alındıktan sonra b değişkeni içerisindeki değer a değişkeni içerisine aktarılır. Son olarak da yedek içerisindeki değerde b değişkeni içerisine aktarılır. Kod aşağıdaki gibi yazılabilir: yedek = a; /* 1 nolu gösterim*/ a = b; /* 2 nolu gösterim*/ b = yedek; /* 3 nolu gösterim*/ Hasan TINMAZ
Kabarcık sıralama algoritmasının uygulanması Hasan TINMAZ
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır: Hasan TINMAZ
Arama (Searching)
Giriş Dizi içerisinde belli bir elemanın var olup olmadığını belirleme işlemine arama adı verilir. Bu işlem içinde pek çok algoritma üretilmiş olup, bunlardan en basit ve insanların günlük hayatındaki arama yöntemlerine en çok benzeyeni doğrusal (linear) aramadır. Bu yöntemde aranacak olan eleman, dizinin ilk elemanından başlayarak bütün elemanları ile kontrol ettirilir. Aynı olan değere rastlandığında, dizi içerisinde elemanın var olduğu bulunmuş olur. Hasan TINMAZ
Arama İşlemi Hasan TINMAZ
Kod üzerinde algoritma yana yatık olarak yazılmıştır. Hasan TINMAZ
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır. Hasan TINMAZ
Dizilerin Fonksiyonlara Parametre Olarak Gönderilmesi (Passing Array to Function)
Bir dizi, fonksiyona parametre olarak gönderilmek istendiğinde, fonksiyon çağrılırken dizinin sadece adı yazılır. Fonksiyonun başlığında diziyi karşılayan tanımlamada ise köşeli parantezler kullanılır. Bu köşeli parantezler içerisine, dizi tanımlamada olduğu gibi eleman sayısı yazılmaz. Yazılırsa, derleyici sadece bu değerin 0'dan büyük olup olmadığını kontrol eder. Negatifse, derleyici hata verir. Pozitifse, bu değer derleyici tarafından göz ardı edilir. Hasan TINMAZ
ÖRNEK: Kendisine gönderilen bir diziyi ekrana yazdıran fonksiyonu main() fonksiyonu ile beraber yazınız Hasan TINMAZ
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır. Dizi üzerinde yapılacak işlemlerde, dizinin eleman sayısı önemli olduğundan bu değerin harici bir parametre olarak gönderilmesi uygun olacaktır. Hasan TINMAZ
ÖRNEK: Kendisine gönderilen tamsayı bir dizi, eleman sayısı ve aranacak değere göre bu değerin dizi içerisinde kaç tane olduğunu geri döndüren fonksiyonu , ilk değerleri atanmış bir dizi üzerinde deneyiniz. Hasan TINMAZ
Dizi içinde aranan değerden kaç tane olduğunu bulan fonksiyon Hasan TINMAZ
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır. ÇIKTI: 13 den içerisinde 3 tanedir. Diziler fonksiyonlara parametre olarak gönderilirken, bağlantılı çağırma (call by reference) yöntemi ile gönderilirler. Hatırlanacağı üzere, bu yöntemde; değerlerin kopyalandığı değişkenlerin değiştirilmesi orijinal değerleri etkiler. Hasan TINMAZ
Tek boyutlu dizinin fonksiyona parametre olarak gönderilmesi: Hasan TINMAZ
Program çalıştırıldığında ekran çıktıları aşağıdaki gibi olacaktır. Hasan TINMAZ
(Multiply Subscripted Arrays) Çok Boyutlu Diziler (Multiply Subscripted Arrays)
Giriş Birden fazla indis numarası ile elemanlarına ulaşılan dizilere çok boyutlu diziler denir. Bunlardan en sık kullanılanı çift boyutlu dizilerdir (double subscripted arrays). Bu diziler sayesinde değerler, bir tablodaki veriler gibi düşünülebilirler. (Hafızada yine ardışık olarak tutulurlar) Bu tür dizilerde her bir elemana ulaşmak için elemanın satır indisi (row) ve sütun indisi (column) kullanılır. Hasan TINMAZ
C dilindeki dizilerin boyutları ikiden de fazla olabilir. … C dilindeki dizilerin boyutları ikiden de fazla olabilir. Bir sınır olmamakla beraber en az 12 boyuta kadar destekler. Tanımlama: dizinintürü dizininadı [satır sayısı][sütun sayısı]; Hasan TINMAZ
/* 3 satırlı 4 sütunlu, int türünde değerler alabilen bir dizi*/ ÖRNEK: int a[3][4]; /* 3 satırlı 4 sütunlu, int türünde değerler alabilen bir dizi*/ float b[5][3]; /*5 satirli 3 sütunlu float türünde değerlerler alabilen bir dizi*/ Hasan TINMAZ
Bu dizi 3x4'lük bir tablo gibi düşünülebilir. … Örnekte verilen ilk dizi tanımlamasındaki birinci köşeli parantez içerisinde verilen değer satır sayısı, ikinci köşeli parantez içerisinde verilen değerde sütun sayısıdır. Bu dizi 3x4'lük bir tablo gibi düşünülebilir. Ancak hafızada tutulma şeklinin ardışık olduğu unutulmamalıdır. Hasan TINMAZ
Çift boyutlu dizilere ilk değer atanması (initialize) Tıpkı tek boyutlu dizilerde olduğu gibi ilk değer ataması aşağıdaki şekilde yapılır. int a[3][4] = {{4,5,3,1},{0,4,3,1},{1,9,7,2}}; İçteki küme işaretlerinin her biri satırları temsil eder. Daha anlaşılır olması için aşağıdaki gibi gösterilebilir: Hasan TINMAZ
ÖRNEK: 3x4'lük çift boyutlu bir dizi içerisine klavyeden girilen değerleri, tablo halinde ekrana yazdıran programı yazınız. Hasan TINMAZ
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır. Hasan TINMAZ
ÖRNEK: Elemanları klavyeden girilen 4x6'lık bir dizinin sütun toplamlarını ekrana yazan programı yazınız. Hasan TINMAZ
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır. Hasan TINMAZ
Çok boyutlu dizilerin fonksiyonlara parametre olarak gönderilmesi Çok boyutlu bir dizi, fonksiyona parametre olarak gönderilecekse, tek boyutlularda olduğu gibi sadece adı yazılır. Gönderilen dizi değeri karşılayan tanımlama da ise gönderilen dizinin boyutu kadar köşeli parantez açılır ve kapatılır, ilk köşeli parantez içerisine eleman sayısını ifade eden değer yazılmaz, fakat diğerlerine eleman sayıları verilmek zorundadır. Hasan TINMAZ
Dizi hangi tür olursa olsun, hafıza ard arda gelen hücrelerden oluşur. … Derleyici bu değerleri elemanların hafızaya yerleşimlerini tanımlamak için kullanır. Dizi hangi tür olursa olsun, hafıza ard arda gelen hücrelerden oluşur. Dolayısı ile indis numaralan ne olursa olsun, bütün dizi elemanları hafızada ardışık olarak saklanmak zorundadır. Hasan TINMAZ
Yani çift boyutlu diziler tablo halinde hafızada tutulmaz. Örneğin int a[2] [3] ={{13,12,8}, {0,5}}; gibi bir dizi tanımlandığında elemanları hafızada şekil'deki gibi tutulur. Yani çift boyutlu diziler tablo halinde hafızada tutulmaz. Her bir satır verilen sütun sayısı kadar sonraki hücreler içerisinde tutulur. Zaten her bir satır tek boyutlu dizi gibi düşünülebilir. Bütün satırlar uç uca eklenerek hafızaya yerleşir. Hasan TINMAZ
ÖRNEK: Kendisine gönderilen 3x4'lük bir diziyi ekrana tablo halinde yazan fonksiyonu main () fonksiyonu ile beraber yazınız. Hasan TINMAZ
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır. Hasan TINMAZ
Kaynakça: Programlamayı C ile öğreniyorum (2. Baskı), M. Yorulmaz, S. Yorulmaz, 2005, Ankara Hasan TINMAZ