Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

DİZİLER Arrays.

Benzer bir sunumlar


... konulu sunumlar: "DİZİLER Arrays."— Sunum transkripti:

1 DİZİLER Arrays

2 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

3 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

4 /* 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

5 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

6 İ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

7 Tek Boyutlu Dizi Hasan TINMAZ

8 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

9 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

10 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

11 Tek boyutlu diziye ilk değer atamasından sonra elemanların yerleşimi
Hasan TINMAZ

12 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

13 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

14 Ö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

15 Kod: Hasan TINMAZ

16 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

17 Örnek Çalışma: Hasan TINMAZ

18 Kod: Hasan TINMAZ

19 Sıralama (Sorting)

20 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

21 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

22 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

23 Hasan TINMAZ

24 Ö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

25 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

26 Yer değiştirme işlemi Hasan TINMAZ

27 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

28 Kabarcık sıralama algoritmasının uygulanması
Hasan TINMAZ

29 Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır:
Hasan TINMAZ

30 Arama (Searching)

31 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

32 Arama İşlemi Hasan TINMAZ

33 Kod üzerinde algoritma yana yatık olarak yazılmıştır.
Hasan TINMAZ

34 Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır.
Hasan TINMAZ

35 Dizilerin Fonksiyonlara Parametre Olarak Gönderilmesi
(Passing Array to Function)

36 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

37 ÖRNEK: Kendisine gönderilen bir diziyi ekrana yazdıran fonksiyonu main() fonksiyonu ile beraber yazınız Hasan TINMAZ

38 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

39 Ö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

40 Dizi içinde aranan değerden kaç tane olduğunu bulan fonksiyon
Hasan TINMAZ

41 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

42 Tek boyutlu dizinin fonksiyona parametre olarak gönderilmesi:
Hasan TINMAZ

43 Program çalıştırıldığında ekran çıktıları aşağıdaki gibi olacaktır.
Hasan TINMAZ

44 (Multiply Subscripted Arrays)
Çok Boyutlu Diziler (Multiply Subscripted Arrays)

45 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

46 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

47 /* 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

48 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

49 Ç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

50 Ö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

51 Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır.
Hasan TINMAZ

52 ÖRNEK: Elemanları klavyeden girilen 4x6'lık bir dizinin sütun toplamlarını ekrana yazan programı yazınız. Hasan TINMAZ

53 Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır.
Hasan TINMAZ

54 Ç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

55 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

56 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

57 ÖRNEK: Kendisine gönderilen 3x4'lük bir diziyi ekrana tablo halinde yazan fonksiyonu main () fonksiyonu ile beraber yazınız. Hasan TINMAZ

58 Program çalıştırıldığında ekran çıktısı aşağıdaki gibi olacaktır.
Hasan TINMAZ

59 Kaynakça: Programlamayı C ile öğreniyorum (2. Baskı), M. Yorulmaz, S. Yorulmaz, 2005, Ankara Hasan TINMAZ


"DİZİLER Arrays." indir ppt

Benzer bir sunumlar


Google Reklamları