C Gömülü Programlama konularımız yayında...
Diziler aynı veri çeşidinden olan değişkenlerin aynı isim altında tanımlanması olarak ifade edilebilir. Diziler kullanılarak, aynı isimle birden fazla değişkene erişilebilir ve işlem yapılabilir.
Diziler tek ya da çok boyutlu olarak tanımlanabilir ve dizi boyutu ihtiyaca göre ayarlanabilir.
Diziler belirli bir veri türünden tanımlanabileceğinden, dizilerde sadece aynı veri türünden değişken değerleri yer alabilir.
C++'da, aynı veri tipinden olan değişkenleri tek bir isim altında toplayarak tek boyutlu diziler oluşturabiliriz. Programlarda, aynı veri türünden ve farklı isimlere sahip çok fazla sayıda değişken tanımlamak yerine, dizi bildirimi yapmak suretiyle sadece tek isim kullanarak aynı sayıda değişken tanımlamak daha pratik bir sistem ve kolaylık sağlar. Dizi tanımlandığında, dizinin her bir elemanına dizi adı ile birlikte 0'dan başlayarak kullanılan indeks değeri ile erişim sağlanır.
Tek boyutlu dizilerin bildirimi için kullanılan genel yapı aşağıda gösterilmektedir:
veri-çeşidi dizi-adı [boyut];
Bir dizi bildirimi 3 temel elemandan oluşur. Yukarıdaki satırda yer alan veri-çeşidi ifadesi dizinin içerdiği değişkenlerin veri çeşidini dizi-adı ifadesi dizinin adını, boyut ifadesi ise dizideki değişken sayısını yani dizi boyutunu göstermektedir. Aşağıdaki işlem satırı idizi adlı ve 10 elemanlı int bir dizi tanımlar:
int idizi[10];
Bir dizinin bildirimini yaptıktan sonra, atama işlemcisini kullanarak bu diziye değerler atanabilir. Dizi içinde yer alan bir elemana değer atamak veya eleman değerine erişmek için, dizi adı ile birlikte 0'dan başlayan indeks değeri kullanılır.
C++'da bir dizinin ilk elemanına 0 değeri ile erişim sağlanır.
int idizi[10]; // 10 elemanlı idizi adlı bir dizi oluşturur.
idizi[0] = 21; // Dizinin ilk elemanına 21 değerini atar.
idizi[3] = 36; // Dizinin dördüncü elemanına 36 değerini atar.
idizi[7] = 174; // Dizinin sekizinci elemanına 174 değerini atar.
Yukarıdaki ilk işlem satırında idizi adlı ve 10 elemanlı int bir dizi oluşturulur. Böylece, bilgisayar belleğinde 10 int değişkeni için yer ayrılmış olur. İkinci işlem satırı, dizinin ilk elemanına 21 sayısını, üçüncü işlem satırı dizinin dördüncü elemanına 36 sayısını ve dördüncü işlem satırı dizinin sekizinci elemanına 174 sayısını atar. Burada, dizi[0] ifadesinin dizinin ilk elemanını gösterdiğine dikkat ediniz. Aşağıdaki şekil üzerinde atanan değerler gösterilmekte, diğer eleman değerleri ise boş gözükmektedir. Aslında, dizinin atanmamış değerleri, tıpkı değişkenlerde olduğu gibi, rastgele bir değer içerir. Aşağıdaki şekilde, bellekte ayrılmış ve değer atanmamış değerler renksiz, değer atanmış bellek bölümleri ise renkli olarak gösterilmektedir:
dizi[0] | dizi[1] | dizi[2] | dizi[3] | dizi[4] | dizi[5] | dizi[6] | dizi[7] | dizi[8] | dizi[9] |
---|---|---|---|---|---|---|---|---|---|
21 | 36 | 174 |
Şimdi, bu özelliği bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
int main(void)
{
int dizi[5];
dizi[0] = 27; // Dizinin ilk elemanına değer atama
dizi[1] = 348; // Dizinin 2.elemanına değer atama
dizi[2] = 51; // Dizinin 3.elemanına değer atama
dizi[3] = 1254; // Dizinin 4.elemanına değer atama
dizi[4] = 127; // Dizinin 5.elemanına değer atama
cout << dizi[0] << " ";
cout << dizi[1] << " ";
cout << dizi[2] << " ";
cout << dizi[3] << " ";
cout << dizi[4];
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
27 348 51 1254 127
Program önce beş elemanlı int bir dizi bildirimi yapar. Sonra, int dizinin elemanlarına sıra ile birer değer atar. Daha sonra bu değerleri ekrana yazar.
Bir diziye atanan değerler düzenli değilse, her bir atama işlemi için ayrı bir işlem satırı kullanılır. Eğer, diziye atanan değerler düzenli ise, dizi elemanlarına değer atamak için döngüler kullanılır. Şimdi, bu özelliği örnekler üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
int main(void)
{
int idizi[10];
int id;
// Dizinin elemanlarına 1-10 arasındaki değerleri sıra ile atama
for (id=0; id<10; id++) {
idizi[id] = id+1;
}
// Dizi değerlerini ekrana yazma
for (id=0; id<10; id++) {
cout << idizi[id] << " ";
}
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
1 2 3 4 5 6 7 8 9 10
Program önce 10 elemanlık int bir dizi bildirimi yapar. Bir for döngüsü ile dizi elemanlarına 1-10 arasındaki değerleri atar. İkinci for döngüsü ile dizi değerlerini ekrana yazar. İlk for döngüsü sonunda dizinin aldığı değerler aşağıda gösterildiği şekildedir:
dizi[0] | dizi[1] | dizi[2] | dizi[3] | dizi[4] | dizi[5] | dizi[6] | dizi[7] | dizi[8] | dizi[9] |
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Tıpkı diğer değişkenler de olduğu gibi, dizi elemanlarına da dizinin tanımlandığı işlem satırında bir ilk değer verebiliriz. Bu işlemi yerine getirmek için aşağıdaki genel yapı kullanılır:
veri-türü dizi-adı [boyut] = { sabit-değerler };
Yukarıdaki satırda yer alan sabit değerlerin veri türü dizi veri türü ile aynı olmalıdır.
Sabit değerler listesinde yer alan sabitler sırası ile dizi elemanlarına atanır. Örneğin, aşağıdaki işlem satırı tek boyutlu ve 5 elemanlı idizi dizisine sırası ile 1, 2, 3, 4 ve 5 sayılarını atar:
int idizi[5] = { 1, 2, 3, 4, 5 };
Yukarıdaki satırda yapılan diziye ilk değer atama işlemi, aşağıdaki işlem satırlarının yaptığı işin aynısını yapar:
int idizi[5], id;
for (id=0; id<5; id++) idizi[id] = id+1;
Şimdi, dizilere ilk değer atama yöntemini bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
int main(void)
{
int idizi[5] = { 1, 2, 3, 4, 5 };
int id;
for (id=0; id<5; id++) cout << idizi[id] << " ";
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
1 2 3 4 5
Program önce oluşturduğu tek boyutlu beş elemanlı ve idizi adlı int bir diziye, 1'den 5'e kadar olan sayıları ilk değer atama metodu ile atar ve bir for döngüsü ile dizi elemanlarını ekrana yazar.
Karakter dizilerine ilk değer atama işlemi ise iki farklı şekilde yapılabilir.
Karakter dizisinin her elemanına ayrı ayrı değer atanacaksa, diziye atanacak karakter sayısının bir fazlası kadar dizi boyutu tanımlamak ve en son elemana '\0' karakteri atamak gerekir.
Eğer bir karakter dizisine toplu değer ataması yapılacaksa, karakter dizisi (" ") işaretleri arasında tanımlanmalıdır. Bu durumda dizi boyutu karakter dizisinde yer alan karakter sayısından bir fazla tanımlanır ve karakter dizisinin sonuna derleyici tarafından otomatik olarak '\0' karakteri eklenir.
char cdizi[8] = { 'D', 'i', 'z', 'i', 'l', 'e', 'r', '\0' }; // Her bir dizi elemanına ayrı ayrı değer atama
char cdizi[8] = "Diziler"; // Diziye toplu değer atama
Yukarıdaki her iki işlem satırı da aynı sayıda karakteri dizilere atar. Ancak, ikinci işlem satırındaki dizinin son elemanı derleyici tarafından eklenecek olan 0 değeri için ayrılmıştır. İlk değer atama işlemi için bir karakter dizisi kullanılırsa, { } işaretleri işlem satırında yer almaz.
Karakter dizilerine ilk değer atama yöntemini kullanırken, atanan değerler ile tanımlanan dizi boyutu birbirine uygun olmalıdır. Aksi takdirde, derleyici programını derlerken hata verir.
Şimdi, karakter dizilerine ilk değer atama işlemini örnekler üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
int main(void)
{
char cdizi1[9] = { 'K', 'a', 'r', 'a', 'k', 't', 'e', 'r', '\0' };
char cdizi2[9] = "dizileri" ;
cout << cdizi1 << " " << cdizi2;
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
Karakter dizileri
Program önce cdizi1 ve cdizi2 adlı tek boyutlu ve 9 elemanlı 2 adet char dizi oluşturur. cdizi1 dizisine "Karakter" kelimesini, cdizi2 dizisine "dizileri" kelimesini ilk değer atama metodu ile atar. Sonra her iki dizinin içeriğini ekrana yazar.
* C++'da karakter dizisi olarak tanımlanan bir veri türü yoktur.
* Karakter dizisi veri desteğini sağlamak için tek boyutlu char diziler kullanılır.
* Karakter dizisi NULL(0) değer ('\0') ile sona eren bir char dizidir.
Bir karakter dizisi tanımlandığında, derleyici otomatik olarak dizi sonuna 0 değeri ekleyerek dizi sonunu belirler.
char dizilere değer atarken ve ekrana yazdırırken karakterlere tek tek işlem yapılacağı zaman dizinin en sonunda dizi sonu tanımlayan '\0' karakteri için yer ayırmaya gerek yoktur. Ancak, diziye tek seferde işlem yapılacağı zaman dizi sonunda '\0' karakteri mutlaka tanımlanmalıdır.
Bu nedenle, bir karakter dizisi içerecek bir karakter dizisi tanımlarken, dizi boyutunu karakter dizisinden bir byte yani bir karakter fazla olacak şekilde daha uzun tanımlamak gerekir. Derleyici 0 değerini diziye eklemek için ayrılan bir byte'lık boş alanı kullanacaktır.
C++'da, klavyeden girilen karakter dizileri, cin fonksiyonu veya cstdio başlık dosyasında yer alan standart bir kütüphane fonksiyonu olan ve aşağıda genel yapısı verilen fgets() fonksiyonu ile okutulur.
char* fgets(char *str, int count, FILE *stream);
Verilen dosya akışından en fazla count parametre değerinin 1 eksiği kadar karakter okur ve okuduğu karakterleri str parametresi ile gösterilen karakter dizisine atar. ENTER tuşuna basıldığında, belirtilen sayıda karakter okumadan işlem sona erer. Klavyeden girilen karakterleri okumak için stream parametresinde stdin değeri kullanılır. Okunan karakterler str ile gösterilen karakter dizisine atandıktan sonra, str sonuna otomatik olarak, dizi sonu belirlemek üzere, NULL bir karakter ('\0') eklenir. Başarı durumunda, fonksiyon str parametresinin içeriğini geri döndürür. Dosya sonu ile karşılaşılırsa ve hiçbir karakter okunmazsa, str içeriği değişmeden kalır ve NULL bir işaretçi geri döndürülür. Eğer bir hata oluşursa, NULL bir işaretçi geri döndürür.
Klavyeden veri okuma işleminde, girilebilecek maksimum karakter sayısından (count-1) daha az karakter girilirse, giriş işlemini sona erdiren yeni satır karakteri (10), '\0' karakterinden önce diziye eklenir.
* cin fonksiyonu ile karakter dizisi okuturken ilk boşluk karakterinden itibaren hiçbir karakterin okunmaz.
* fgets() fonksiyonu ile karakter dizisi okuturken okunacak karakter sayısı tanımlanır.
Şimdi, klavyeden girilen karakter dizilerini okumak için, cin ve fgets() fonksiyonlarının kullanılmasını bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
#include <cstdio>
using namespace std;
int main(void)
{
char cdizi[40];
cout << "Bir karakter dizisi giriniz:" << "\n";
fgets(cdizi, 39, stdin); // En fazla 39 adet karakter okur.
cout << cdizi;
cout << "Bir karakter dizisi giriniz:" << "\n";
cin >> cdizi; // Boşluk karakterinden itibaren girilen karakterleri dikkate almaz.
cout << cdizi;
return 0;
}
Yukarıdaki örnekte, program 40 elemanlı bir karakter dizi bildirimi yaptıktan sonra bir karakter dizisi girilmesini ister. Girilen karakter dizisini fgets() fonksiyonu ile okuyarak cdizi adlı diziye atar ve dizi içeriğini ekrana yazar. Tekrar bir karakter dizisi girilmesini ister. Girilen karakter dizisini cin fonksiyonu ile okuyarak cdizi adlı diziye atar ve dizi içeriğini ekrana yazar. cin ile okuma işleminde boşluk karakteri girilirse, boşluk karakterinden itibaren girilen hiçbir karakteri diziye dahil etmez.