Diziler - WordPress.com

Download Report

Transcript Diziler - WordPress.com

DİZİLER
Arrays
C Programlama Dilinde Diziler
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.
2
Hasan TINMAZ
C Programlama Dilinde Diziler
Tek Boyutlu Diziler
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ı] ;
3
Hasan TINMAZ
C Programlama Dilinde Diziler
Ö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*/
4
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
5
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
6
Hasan TINMAZ
C Programlama Dilinde Diziler
Tek Boyutlu Dizi
7
Hasan TINMAZ
C Programlama Dilinde Diziler
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 .*/
8
Hasan TINMAZ
Dikkat
C Programlama Dilinde Diziler
 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.
9
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
10
Hasan TINMAZ
C Programlama Dilinde Diziler
Tek boyutlu diziye ilk değer atamasından sonra
elemanların yerleşimi
11
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
12
Hasan TINMAZ
Ayrıca
C Programlama Dilinde Diziler
 İ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.
13
Hasan TINMAZ
C Programlama Dilinde Diziler
Ö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.
14
Hasan TINMAZ
C Programlama Dilinde Diziler
Kod:
15
Hasan TINMAZ
C Programlama Dilinde Diziler
Ö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.
16
Hasan TINMAZ
C Programlama Dilinde Diziler
Örnek Çalışma:
17
Hasan TINMAZ
C Programlama Dilinde Diziler
Kod:
18
Hasan TINMAZ
Sıralama (Sorting)
C Programlama Dilinde Diziler
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.
20
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
21
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
22
Hasan TINMAZ
23
Hasan TINMAZ
C Programlama Dilinde Diziler
C Programlama Dilinde Diziler
…
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.
24
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
25
Hasan TINMAZ
C Programlama Dilinde Diziler
Yer değiştirme işlemi
26
Hasan TINMAZ
C Programlama Dilinde Diziler
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*/
27
Hasan TINMAZ
C Programlama Dilinde Diziler
Kabarcık sıralama algoritmasının uygulanması
28
Hasan TINMAZ
C Programlama Dilinde Diziler
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi
olacaktır:
29
Hasan TINMAZ
Arama (Searching)
C Programlama Dilinde Diziler
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.
31
Hasan TINMAZ
C Programlama Dilinde Diziler
Arama İşlemi
32
Hasan TINMAZ
C Programlama Dilinde Diziler
Kod üzerinde algoritma yana yatık olarak
yazılmıştır.
33
Hasan TINMAZ
C Programlama Dilinde Diziler
Program çalıştırıldığında ekran çıktısı
aşağıdaki gibi olacaktır.
34
Hasan TINMAZ
Dizilerin Fonksiyonlara
Parametre Olarak
Gönderilmesi
(Passing Array to Function)
C Programlama Dilinde Diziler
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.
36
Hasan TINMAZ
C Programlama Dilinde Diziler
ÖRNEK: Kendisine gönderilen bir diziyi ekrana yazdıran
fonksiyonu main() fonksiyonu ile beraber yazınız
37
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
38
Hasan TINMAZ
ÖRNEK:
C Programlama Dilinde Diziler
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.
39
Hasan TINMAZ
C Programlama Dilinde Diziler
Dizi içinde aranan değerden kaç tane olduğunu
bulan fonksiyon
40
Hasan TINMAZ
C Programlama Dilinde Diziler
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.
41
Hasan TINMAZ
C Programlama Dilinde Diziler
Tek boyutlu dizinin fonksiyona parametre olarak
gönderilmesi:
42
Hasan TINMAZ
C Programlama Dilinde Diziler
Program çalıştırıldığında ekran çıktıları
aşağıdaki gibi olacaktır.
43
Hasan TINMAZ
Çok Boyutlu Diziler
(Multiply Subscripted Arrays)
C Programlama Dilinde Diziler
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.
45
Hasan TINMAZ
…
C dilindeki dizilerin boyutları ikiden de
fazla olabilir.
Bir sınır olmamakla beraber en az 12
boyuta kadar destekler.
Tanımlama:
C Programlama Dilinde Diziler
 dizinintürü dizininadı [satır sayısı][sütun sayısı];
46
Hasan TINMAZ
ÖRNEK:
C Programlama Dilinde Diziler
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*/
47
Hasan TINMAZ
C Programlama Dilinde Diziler
…
Ö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.
48
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.
C Programlama Dilinde Diziler
 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:
49
Hasan TINMAZ
C Programlama Dilinde Diziler
ÖRNEK: 3x4'lük çift boyutlu bir dizi içerisine klavyeden girilen
değerleri, tablo halinde ekrana yazdıran programı yazınız.
50
Hasan TINMAZ
C Programlama Dilinde Diziler
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi
olacaktır.
51
Hasan TINMAZ
C Programlama Dilinde Diziler
ÖRNEK: Elemanları klavyeden girilen 4x6'lık bir dizinin sütun
toplamlarını ekrana yazan programı yazınız.
52
Hasan TINMAZ
C Programlama Dilinde Diziler
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi
olacaktır.
53
Hasan TINMAZ
C Programlama Dilinde Diziler
Ç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.
54
Hasan TINMAZ
C Programlama Dilinde Diziler
…
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.
55
Hasan TINMAZ
C Programlama Dilinde Diziler
Ö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.
56
Hasan TINMAZ
C Programlama Dilinde Diziler
ÖRNEK: Kendisine gönderilen 3x4'lük bir diziyi ekrana
tablo halinde yazan fonksiyonu main () fonksiyonu ile
beraber yazınız.
57
Hasan TINMAZ
C Programlama Dilinde Diziler
Program çalıştırıldığında ekran çıktısı aşağıdaki gibi
olacaktır.
58
Hasan TINMAZ
Kaynakça:
C Programlama Dilinde Diziler
Programlamayı C ile öğreniyorum (2. Baskı), M.
Yorulmaz, S. Yorulmaz, 2005, Ankara
59
Hasan TINMAZ