algorİtma ve programlama i...yzm 1101 – algoritma ve programlama i dizilerin bildirimi •bir...
TRANSCRIPT
ALGORİTMA VE PROGRAMLAMA I
Yrd. Doç. Dr. Deniz KILINÇ
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu
Teknoloji Fakültesi YZM 1101
• Diziler
• Dizi Nedir?
• Dizilerin Bildirimi
• Dizilere Başlangıç Değeri Verme
• Dizilerde Arama ve Sıralama Algoritmaları
• Dizilerde Arama
• Doğrusal Arama (Linear Search)
• Karakter Dizileri
• Karakter Dizilerini Okumak ve Yazmak
• Karakter Dizilerinin Uzunluğunu Bulmak
• Karakter Dizilerini Birleştirmek
• Karakter Dizisi Kopyalamak
• Karakter Dizilerini Karşılaştırmak
Genel Bakış… 2
YZM 1101 – Algoritma ve Programlama I
1. BÖLÜM
Diziler
3
YZM 1101 – Algoritma ve Programlama I
4
YZM 1101 – Algoritma ve Programlama I
Dizi Nedir?
• Veri yapısı türlerinden bir tanesidir (Array, Struct, Pointer,
Class …).
• İç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.
5
YZM 1101 – Algoritma ve Programlama I
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.
• 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 hangi tipte
olacağı belirtilmelidir.
6
YZM 1101 – Algoritma ve Programlama I
Dizilerin Bildirimi (devam…)
• 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];
7
YZM 1101 – Algoritma ve Programlama I
Örnek: Dizilerin Bildirimi (devam…)
45
56
78
93
78
69
77
90
ogrenci_notu[0]
ogrenci_notu[1]
ogrenci_notu[2]
ogrenci_notu[3]
ogrenci_notu[4]
ogrenci_notu[5]
ogrenci_notu[6]
ogrenci_notu[7]
1. eleman
2. eleman
3. eleman
4. eleman
5. eleman
6. eleman
7. eleman
8. eleman
8
YZM 1101 – Algoritma ve Programlama I
Örnek: Dizilerin Bildirimi (devam…)
• 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
9
YZM 1101 – Algoritma ve Programlama I
Örnek: Dizilerin Bildirimi (devam…)
• 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.
10
YZM 1101 – Algoritma ve Programlama I
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.
11
YZM 1101 – Algoritma ve Programlama I
Dizilere Başlangıç Değeri Verme (devam…)
• 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.
12
YZM 1101 – Algoritma ve Programlama I
Dizilere Başlangıç Değeri Verme (devam…)
• 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 tipindeki dizi elemanlarına 0 değeri, metin
tipindeki dizi elemanlarına NULL değeri atanır.
13
YZM 1101 – Algoritma ve Programlama I
Örnek1: Dizi elemanlarına değer atama ve
okuma
• Tek boyutlu, 5 elemanlı, sayısal (int) bir dizi
tanımlanarak:
• Dizi elemanlarına dizi indislerinin 3 katı for döngüsü
içerisinde değer olarak atanacaktır.
• Yine başka bir for döngüsü içerisinde bu değerler
ekrana yazdırılacaktır.
14
YZM 1101 – Algoritma ve Programlama I
Örnek1: Dizi elemanlarına değer atama ve
okuma (devam…)
15
YZM 1101 – Algoritma ve Programlama I
int x[5]; // 5 elemanlı sayısal x dizisi
int i = 2;
• x[0] = 20; // Geçerli atama
• x[2.3] = 5; // Geçersiz atama
• x[2*i – 3] = 3; // Geçerli atama, x[1] dizi elemanına 3
değerini atar
• x[i++]; // Önce x[2] dizi elemanına erişilir daha sonra
i değişkenine 3 değeri atanır
• x[(int) x[1]]; // x[3] dizi elemanına erişilir
Örnek2: Dizi atamaları
16
YZM 1101 – Algoritma ve Programlama I
Örnek3: Klavyeden sayısal değer girme
• Klavyeden maksimum 10 tane sayısal değer
girilecektir.
• Girilen sayılar bir dizide saklanacaktır.
• Sayı girme işlemi 0 girilene kadar devam edecektir.
• 0 değeri girildiği anda 0 sayısı hariç girilen diğer tüm
değerler diziden okunarak ekrana yazdırılacaktır.
17
YZM 1101 – Algoritma ve Programlama I
Örnek3: Klavyeden sayısal değer girme (devam..)
18
YZM 1101 – Algoritma ve Programlama I
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.
19
YZM 1101 – Algoritma ve Programlama I
Örnek4: Dizi elemanı değeri kadar ekrana *
karakteri yazdırma (Uygulama Dersi)
• 10 elemanlı { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 } grafik isimli bir
dizi oluşturulacaktır.
• Dizideki elemanlar tek tek okunarak her dizi elemanının sayısı
kadar ekrana * karakteri yazdırılacaktır.
• Ekran çıktısı aşağıdaki gibi olacaktır.
20
YZM 1101 – Algoritma ve Programlama I
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.
21
YZM 1101 – Algoritma ve Programlama I
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 2 tane arama tekniği üzerinde
durulacaktır:
• Doğrusal Arama (Linear / Sequential Search)
• İkili Arama (Binary Search)
22
YZM 1101 – Algoritma ve Programlama I
Doğrusal Arama
• 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.
23
YZM 1101 – Algoritma ve Programlama I
Doğrusal Arama (devam…)
24
YZM 1101 – Algoritma ve Programlama I
Karakter Dizileri (Strings)
• Bazı programlama dillerinde karakter dizilerini tutmak için
özel veri türleri (String, string vb.) bulunmaktadır.
• Ancak C programlama dilinde böyle bir veri türü olmadığı
için yerine karakterlerden oluşan bir boyutlu diziler
kullanılır.
• Karakter dizilerine özel olarak, karakter dizilerinin sonuna
sonlandırıcı karakter olarak adlandırılan bir simge eklenir.
• Sonlandırıcı karakter:
• Dizinin bittiği yeri gösterir,
• ASCII tablosunun sıfır numaralı ('\0') karakteridir.
25
YZM 1101 – Algoritma ve Programlama I
Karakter Dizileri (Strings) devam…
• Karakter dizilerine 2 şekilde başlangıç değeri verilebilir:
(1) char s[7] = {'d','e','n','e','m','e','\0'};
(2) char s[7] = "deneme";
• Birinci tanımlamada sonlandırıcı karakter programcı
tarafından konmalıdır.
• İkinci tanımlamada ise buna gerek yoktur. Çünkü,
sonlandırıcı karakter bu atamayla, derleyici tarafından
eklenir.
26
YZM 1101 – Algoritma ve Programlama I
Karakter Dizilerini Okumak
• Bir karakter dizisini klavyeden okumak için C'nin standart gets() fonksiyonu kullanılır.
• stdio.h dışında yeni bir kitaplığı C programına dahil
etmeye gerek yoktur.
• Bu fonksiyon herhangi bir indeks tanımlamadan
karakter dizilerinin okunmasını sağlar.
• Okuduğu karakter dizisinin sonuna satır sonu işaretini
değil, NULL değerini yerleştirir.
27
YZM 1101 – Algoritma ve Programlama I
Karakter Dizilerini Okumak (devam…)
• gets() fonksiyonu, klavyeden girilen karakter dizilerini,
herhangi bir ek tanımlamaya gerek duymadan bir dizi içine
yerleştirir.
• Dizinin her bir karakteri dizinin farklı bir hücresi içine
yerleşir.
• Örnek:
char ad[20];
...
gets(ad);
28
YZM 1101 – Algoritma ve Programlama I
Örnek5: Karakter Dizisi Okuma ve Yazma
• Maksimum 50 karakter okuyabilecek bir karakter dizisi
tanımlayın.
• Klavyeden karakter dizisini okuyun ve ekrana karakterleri
yazdırın.
• Tek tek karakterleri yazdırın
• Tüm metni tek seferde yazdırın
29
YZM 1101 – Algoritma ve Programlama I
Örnek5: Karakter Dizisi Okuma ve Yazma (devam…)
30
YZM 1101 – Algoritma ve Programlama I
Karakter Dizilerinin Uzunluğu Bulmak
• Bazı uygulamalarda bir karakter dizisinin uzunluğunu
bulmak gerekebilir.
• Bir karakter dizisinin uzunluğunu, yani kaç karakter içerdiğini bulmak için C'nin standart strlen()
fonksiyonu kullanılır.
• Uzunluk bulunurken, içerdiği en son karakter olan NULL
karakteri göz özüne alınmaz.
• Örneğin, karakter dizisi "abc" değerlerini içeriyorsa,
strlen() fonksiyonu bu uzunluk olarak "3" değerini
döndürür.
31
YZM 1101 – Algoritma ve Programlama I
Örnek6: Girilen Karakter Dizisinin
Uzunluğunu Bulmak
32
YZM 1101 – Algoritma ve Programlama I
Karakter Dizilerini Birleştirmek
• İki karakter dizisini birleştirilerek tek bir karakter dizisi haline dönüştürmek için C'nin strcat() fonksiyonu kullanılır.
• Bu fonksiyon, var olan bir karakter dizisinin sonuna bir başka
karakter dizisini ekleyecektir.
• Örneğin "abc" karakter dizisinin sonuna "def" karakter dizisi
strcat() fonksiyonu kullanılarak eklenebilir.
33
YZM 1101 – Algoritma ve Programlama I
Örnek7: Girilen Karakter Dizilerini
Birleştirmek
34
YZM 1101 – Algoritma ve Programlama I
Karakter Dizisi Kopyalama
• Karakter dizilerine direk atama yapılamamaktadır.
• Örneğin aşağıdaki atama ifadesi yanlıştır:
char dizi[50];
katar = "abcde";
• Çünkü bu atama göstergeye yapılan atamadır.
• Göstergelerin ne olduğunu daha sonra detaylı olarak ele
alınacaktır.
• Atamanın bir karakter dizisine yapılabilmesi için, C'nin
standart strcpy() fonksiyonu kullanılır.
35
YZM 1101 – Algoritma ve Programlama I
Örnek8: Karakter Dizilerini Kopyalamak
36
YZM 1101 – Algoritma ve Programlama I
Karakter Dizilerini Karşılaştırmak
• İki karakter dizisinin birbirleriyle karşılaştırılarak, içerdiği
karakterlerin aynı olup olmadıkları test edilebilir.
• Bu amaçla strcmp() fonksiyonu kullanılır.
• Karşılaştırma sonucunda, her iki karakter dizisi birbirinin
aynı ise "0"; birbirinden farklı ise "1" değeri üretilir. Elde
edilen bu değer kullanılarak programın akışı yönlendirilebilir.
37
YZM 1101 – Algoritma ve Programlama I
Örnek9: Karakter Dizilerini Karşılaştırmak
38
YZM 1101 – Algoritma ve Programlama I
KAYNAKLAR
• N. Ercil Çağıltay ve ark., C DERSİ PROGRAMLAMAYA
GİRİŞ, Ada Matbaacılık, ANKARA; 2009.
• Milli Eğitim Bakanlığı "Programlamaya Giriş ve
Algoritmalar Ders Notları", 2007
• http://tr.wikipedia.org/wiki/Code::Blocks
• http://www.codeblocks.org
• http://www.AlgoritmaveProgramlama.com
• http://www1.gantep.edu.tr/~bingul/c
39
İYİ ÇALIŞMALAR…
Yrd. Doç. Dr. Deniz KILINÇ
YZM 1101 – Algoritma ve Programlama I