Bölüm 6 - Diziler indeks 6.1 Giriş 6.2 Diziler 6.3 Dizilerin Bildirimleri 6.4 Dizilerin Kullanımlarına Örnekler 6.5 Dizileri Fonksiyonlara Geçirmek 6.6 Dizileri Sıralamak 6.7 Örnekler: Ortalama, Mod ve Medyanı Diziler Kullanarak Hesaplamak 6.8 Dizilerde Arama Yapmak 6.9 Çok Boyutlu Diziler
Bu Bölümde Öğreneceklerimiz: Amaçlar Bu Bölümde Öğreneceklerimiz: Dizi veri yapısını tanıtmak Dizilerin değerlerini depolama, sıralama ve listeleri arama ile değer tabloları oluşturmada kullanımlarını anlamak Bir dizinin nasıl bildirileceğini, bir diziye nasıl ilk değer atanacağını ve dizideki bağımsız elemanların nasıl çağrılacaklarını anlamak Dizileri fonksiyonlara geçirebilmek. Temel sıralama tekniklerini anlamak Çok boyutlu dizileri bildirebilmek ve kullanabilmek
6.1 Giriş Diziler Birbirleriyle ilişkili veri yapıları Statik yapılar- programın çalışma süresi boyunca hep aynı boyutta kalırlar. Dinamik veri yapıları.. 12. Bölümde göreceğiz..
6.2 Diziler Birbirleriyle ilişkili hafıza gurubu Aynı ad ve Tip Dizinin adı (Not: Bu dizinin bütün elementleri aynı ada sahiptir, c ) C dizisinin içindeki elemanların yerini belirten sayı c[6] -45 6 72 1543 -89 62 -3 1 6453 78 c[0] c[1] c[2] c[3] c[11] c[10] c[9] c[8] c[7] c[5] c[4] Dizi Birbirleriyle ilişkili hafıza gurubu Aynı ad ve Tip Dizi içindeki elemanı veya konumunu belirtme Dizi Adı Pozisyon Numarası Biçim: Diziadı[ pozisyon numarası ] Dizinin ilk elemanı her zaman sıfır’ıncı elemandır C dizisinin n. elemanı: c[ 0 ], c[ 1 ]...c[ n – 1 ]
Dizi elemanları normal değişkenler gibidir. 6.2 Diziler Dizi elemanları normal değişkenler gibidir. c[ 0 ] = 3; printf( "%d", c[ 0 ] ); Eğer x 3 e eşitse, belirteçteki bu işlemi yapar c[ 5 - 2 ] == c[ 3 ] == c[ x ]
6.2 Diziler
6.3 Dizilerin Bildirimleri Dizileri tanımlayacağımız zaman, Adı Dizi Tipi Eleman Sayısı Dizitipi Diziadı[ Elemansayısı ]; Örnekler: int c[ 10 ]; float myDizi[ 3284 ]; Aynı anda birden fazla dizi bildirimi, Aynı değişken tipleri için, tanımlama biçimleri aynı Example: int b[ 100 ], x[ 27 ];
6.4 Dizileri Kullanan Örnekler Atama değerleri int n[ 5 ] = { 1, 2, 3, 4, 5 }; Eğer dizideki elemanların sayısından daha az atama değeri varsa, kalan elemanlar 0 değerine atanır int n[ 5 ] = { 0 } Bütün elemanlar 0 Dizideki eleman sayısından fazla atama değeri varsa yazım hatası oluşacaktır. Dizinin boyutu belirtilmezse, dizinin boyutu atama listesindeki eleman sayısı olur int n[ ] = { 1, 2, 3, 4, 5 }; 5 atama değeri, n Dizisinin boyutunu 5 olarak belirler
fig06_03.c
Element Value 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 Program Çıktısı
fig06_04.c
Program Çıktısı Element Value 0 32 1 27 2 64 3 18 4 95 5 14 6 90 7 70 0 32 1 27 2 64 3 18 4 95 5 14 6 90 7 70 8 60 9 37 Program Çıktısı
fig06_05.c
Program Çıktısı Element Value 0 2 1 4 2 6 3 8 4 10 5 12 6 14 7 16 8 18 0 2 1 4 2 6 3 8 4 10 5 12 6 14 7 16 8 18 9 20 Program Çıktısı
fig06_06.c Program Output Total of Dizi element values is 383
fig06_07.c (Part 1 of 2)
fig06_07.c (Part 2 of 2) Program Output Rating Frequency 1 2 2 2 3 2 4 2 5 5 6 11 7 5 8 7 9 1 10 3
fig06_08.c (Part 1 of 2)
fig06_08.c (Part 2 of 2) Program Çıktısı Element Value Histogram 0 19 ******************* 1 3 *** 2 15 *************** 3 7 ******* 4 11 *********** 5 9 ********* 6 13 ************* 7 5 ***** 8 17 ***************** 9 1 *
fig06_09.c (Part 1 of 2)
fig06_09.c (Part 2 of 2) Program Output Face Frequency 1 1029 2 951 3 987 4 1033 5 1010 6 990
6.4 Dizileri Kullanan Örnekler Karakter Dizileri String “birinci” ,gerçekte karakterlerden oluşmuş statik bir dizidir. Karakter Dizisi bir string kullanarak ilk değerlere atanabilir char string1[] = “birinci"; Null karakterin, karakter sabiti olarak gösterimi ‘\0’ string1 gerçekte 7 elemanlıdır Az önceki bildirim char string1[] = { ‘b', 'i', 'r', ‘i', ‘n',’c’,’i’, '\0' }; Bağımsız karakterlere dizi belirteci gösterimiyle erişebiliriz. string1[ 3 ] is character ‘i’ Dizi adı dizinin başlangıç adresidir,‘&’ kullanımı gereksizdir scanf( "%s", string2 ); Boşluk karakteri girilinceye kadar karakter okur Dizinin sonundan öteye de yazabilir, dizinin büyüklüğüne dikkat etmez.
fig06_10.c (Part 1 of 2)
fig06_10.c (Part 2 of 2) Enter a string: Hello there string1 is: Hello string2 is: string literal string1 with spaces between characters is: H e l l o
fig06_11.c (Part 1 of 3)
fig06_11.c (Part 2 of 3)
fig06_11.c (Part 3 of 3)
Program Output Her bir fonksiyona ilk çağrı: staticDiziInit’e girerken değerler: Dizi1[ 0 ] = 0 Dizi1[ 1 ] = 0 Dizi1[ 2 ] = 0 staticDiziInit’den çıkarken değerler: Dizi1[ 0 ] = 5 Dizi1[ 1 ] = 5 Dizi1[ 2 ] = 5 automaticDiziInit ’e girerken değerler : Dizi2[ 0 ] = 1 Dizi2[ 1 ] = 2 Dizi2[ 2 ] = 3 automaticDiziInit ’den çıkarken değerler : Dizi2[ 0 ] = 6 Dizi2[ 1 ] = 7 Dizi2[ 2 ] = 8 Her bir fonksiyona ikinci çağrı: staticDiziInit’e girerken değerler : staticDiziInit’den çıkarken değerler : Dizi1[ 0 ] = 10 Dizi1[ 1 ] = 10 Dizi1[ 2 ] = 10 automaticDiziInit’e girerken değerler : automaticDiziInit’den çıkarken değerler : Program Output
6.5 Dizileri Fonksiyonlara Geçirmek Bir dizi argümanını fonksiyona geçirebilmek için, dizinin ismini parantez kullanmadan belirtmeliyiz… int myDizi[ 24 ]; myFunction( myDizi, 24 ); Genellikle Dizileri fonksiyonlara geçirirken boyutları da geçirilir Diziler referansa göre çağırma yöntemiyle geçirilir Dizinin adı ilk dizinin ilk elemanının adresidir Fonksiyon dizinin nerede tutulduğunu bilir Dizinin bellekteki orijinal değerlerini değiştirebilir. Dizinin Elemanlarını Geçirmek Değere göre çağrılarla geçirme (i.e., myDizi[ 3 ])
6.5 Dizileri Fonksiyonlara Geçirmek Fonksiyon Prototipi void modifyDizi( int b[], int Diziboyutu ); Prototipte parametre isimleri görecelidir int b[], int [] şeklinde de yazılabilir int Diziboyutu basitçe int olarak yazılabilir
fig06_12.c Program Output Dizi = 0012FF78 &Dizi[0] = 0012FF78
fig06_13.c (Part 1 of 3)
fig06_13.c (Part 2 of 3)
fig06_13.c (Part 3 of 3)
Bütün dizinin referansa göre çağrılarak geçmesinin etkileri: orijinal Dizinin değerleri : 0 1 2 3 4 Modifiye (ayarlanmış) edilmiş Dizinin değerleri: 0 2 4 6 8 Dizi elemanlarının değere göre çağrılarak geçmesinin etkileri: a[ 3 ] değeri 6 modifyElement da ki değeri 12 Program Çıktısı
fig06_14.c (Part 1 of 2)
fig06_14.c (Part 2 of 2) Program Çıktısı Compiling... FIG06_14.C fig06_14.c(24) : error C2166: l-value specifies const object fig06_14.c(25) : error C2166: l-value specifies const object fig06_14.c(26) : error C2166: l-value specifies const object
6.6 Dizileri Sıralama Veri sıralama Bubble sort (Kabarcık sıralama) Bilgisayar uygulamalarında önemlidir Hemen hemen tüm organizasyonlar bazı verileri sıralamak zorundadırlar. Bubble sort (Kabarcık sıralama) Dizi içerisinde birçok kez yer değiştirme olabilir Eleman çiftleri karşılaştırılır. Eğer bir çift artan sırada ise(yada değerleri eşitse), değişiklik olmaz Eğer azalan sırada ise, elemanlar yer değiştirilir. Tekrarlama Örnek: orijinal: 3 4 2 6 7 1. yer değişme: 3 2 4 6 7 2. yer değişme: 2 3 4 6 7 En küçük eleman dizinin en başında yer alır "bubble"
fig06_15.c (Part 1 of 3)
fig06_15.c (Part 2 of 3)
fig06_15.c (Part 3 of 3) Program Çıktısı Veriler Orijinal sıralamada 2 6 4 8 10 12 89 68 45 37 Veriler artan sıralamada 2 4 6 8 10 12 37 45 68 89
6.7 Örnek: Ortalama, Mod ve Medyanı Diziler Kullanarak Hesaplamak Orta – “ortalama” Medyan – sıralanmış listenin ortasındaki sayı 1, 2, 3, 4, 5 Medyanı 3 tür Mod – sık kullanılan sayı 1, 1, 1, 2, 3, 3, 4, 5 Mod’u 1 dir
fig06_16.c (Part 1 of 8)
fig06_16.c (Part 2 of 8)
fig06_16.c (Part 3 of 8)
fig06_16.c (Part 4 of 8)
fig06_16.c (Part 5 of 8)
fig06_16.c (Part 6 of 8)
fig06_16.c (Part 7 of 8)
fig06_16.c (Part 8 of 8)
Program Output ******** orta Orta veri nesnelerinin ortalama değeridir. Ortalama bütün veri nesnelerinin Toplamının veri nesnelerinin sayısına (99) Bölümüdür. Bu veriler için Ortalama:681 / 99 = 6.8788 medyan Sıralanmamış dizi 6 7 8 9 8 7 8 9 8 9 7 8 9 5 9 8 7 8 7 8 6 7 8 9 3 9 8 7 8 7 7 8 9 8 9 8 9 7 8 9 6 7 8 7 8 7 9 8 9 2 7 8 9 8 9 8 9 7 5 3 5 6 7 2 5 3 9 4 6 4 7 8 9 6 8 7 8 9 7 8 7 4 4 2 5 3 8 7 5 6 4 5 6 1 6 5 7 8 7 Sıralanmış dizi 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 Program Output
Program Output (continued) Sıralanmış 99 elemanlı dizide Medyan 49. elemandır. Bu çalıştırılmada medyan 7 ******** mod cevap Frekans Histogram 1 1 2 2 5 0 5 0 5 1 1 * 2 3 *** 3 4 **** 4 5 ***** 5 8 ******** 6 9 ********* 7 23 *********************** 8 27 *************************** 9 19 ******************* Mod en sık rastlanan değerdir. Bu calıştırılmada mod 8 dir 27 kez rastlanmıştır Program Output (continued)
6.8 Dizilerde Arama: Dizide lineer arama yapmak Bir key değeri için dizide arama Lineer arama Basit Key değeri ile dizinin her değerini karşılaştırır Küçük ve sıralanmamış diziler için kullanışlı
6.8 Dizilerde Arama: Dizide lineer arama yapmak Binary search Sıralanmış Diziler içindir key ile orta elementi karşılaştırır Eğer eşitse, arama değeri bulunmuştur Eğer key < orta element, dizinin ilk yarısında arar Eğer key > orta element , Son yarısında arama yapar İşlem tekrarlanır Çok hızlı; en fazla n adımda, 2n > eleman sayısı 30 elemanlı Dizide en fazla 5 adım sürer 25 > 30 öyleyse,en fazla 5 adıms
fig06_18.c (Part 1 of 3)
fig06_18.c (Part 2 of 3)
fig06_18.c (Part 3 of 3) Program Output Arama değeri (key) tam sayısını gir: 36 Değer, eleman 18 de bulundu 37 Değer bulunamadı
fig06_19.c (Part 1 of 5)
fig06_19.c (Part 2 of 5)
fig06_19.c (Part 3 of 5)
fig06_19.c (Part 4 of 5)
fig06_19.c (Part 5 of 5)
Program Output 0 ile 28 arasında bir sayı giriniz: 25 Belirteçler: Belirteçler: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------------------------------------------------------ 0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28 16 18 20 22* 24 26 28 24 26* 28 24* 25 bulunamadı 0 ile 28 arasında bir sayı giriniz: 8 0 2 4 6* 8 10 12 8 10* 12 8* 8 dizi elemanı 4 içinde bulundu Program Output
Program Output (continued) 0 ile 28 arasında bir sayı giriniz: 6 Belirteçler: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------------------------------------------------------ 0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28 0 2 4 6* 8 10 12 6, dizi elemanı 3 içinde bulundu Program Output (continued)
Çoklu belirteçli Diziler 6.9 Çok Boyutlu Diziler Çoklu belirteçli Diziler Satırlar ve sütunlarla gösterilir (m x n Dizisi) Matris gibi: önce satır belirtilir, sonra sütun Satır 0 Satır 1 Satır 2 Sütun 0 Sütun 1 Sütun 2 Sütun 3 a[ 0 ][ 0 ] a[ 1 ][ 0 ] a[ 2 ][ 0 ] a[ 0 ][ 1 ] a[ 1 ][ 1 ] a[ 2 ][ 1 ] a[ 0 ][ 2 ] a[ 1 ][ 2 ] a[ 2 ][ 2 ] a[ 0 ][ 3 ] a[ 1 ][ 3 ] a[ 2 ][ 3 ] Satır belirteci Dizi adı Sütün belirteci
Elemanların bildirimi 6.9 Çok Boyutlu Diziler İlk değer atama int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; Parantezler içinde satırlara göre guruplandırılarak değer atama Yeterli değer yoksa, belirtilmemiş elemanlar 0 olarak atanır int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; Elemanların bildirimi Önce satırı belirle, sonra sütunu printf( "%d", b[ 0 ][ 1 ] ); 1 2 3 4 1 0 3 4
fig06_21.c (Part 1 of 2)
fig06_21.c (Part 2 of 2) Program Output Values in Dizi1 by row are: 1 2 3 4 5 6 Values in Dizi2 by row are: 4 5 0 Values in Dizi3 by row are: 1 2 0 4 0 0
fig06_22.c (Part 1 of 6)
fig06_22.c (Part 2 of 6)
fig06_22.c (Part 3 of 6)
fig06_22.c (Part 4 of 6)
fig06_22.c (Part 5 of 6)
fig06_22.c (Part 6 of 6) Dizi: [0] [1] [2] [3] [0] [1] [2] [3] studentGrades[0] 77 68 86 73 studentGrades[1] 96 87 89 78 studentGrades[2] 70 90 86 81 En düşük not: 68 En yüksek not: 96 Öğrenci 0 için ortalama not 76.00 Öğrenci 1 için ortalama not 87.50 Öğrenci 2 için ortalama not 81.75