Karmaşık Veri Türleri

[vc_row][vc_column][vc_column_text]

C++ dili karmaşık veri tipi kullanımını destekler. Bileşik veri tipi olarak da adlandırılabilen karmaşık veri tipi, birden çok veri saklayabilmektedir.

Dizi (Array)

Dizi, bir araya getirilmiş, birim olarak yönetilen nesneler kümesidir. Tek boyutlu (liste), iki boyutlu (tablo), üç boyutlu (küp) vb. diziler oluşturulabilmektedir.  C++’daki dizilerin bazı özellikleri şunlardır:

  • Dizideki her bir eleman bir değer saklamaktadır.
  • Dizinin ilk elemanı 0 indeksine sahiptir.
  • Dizinin boyutu alabileceği toplam eleman sayısıdır.
  • Diziler tek ya da çok boyutlu olabilmektedir.
  • Dizinin düzeyi (rank) dizideki boyut sayısıdır.
  • Bir dizide tek bir veri tipi tutulabilir.
 

Genel Kullanımı:

veriTipi Adi[satir]

Örnek:

int sayilar[5];
sayilar[0]=11;
sayilar[1]=5;
sayilar[2]=23;
sayilar[3]=4;
sayilar[4]=54;
int sayac;
for(sayac=0;sayac<5;sayac++){
cout << sayilar[sayac];
}
15 elemanlı bir dizi tanımlaması yapıldı.
2Dizide ilk eleman 0. indekste bulunur. Bu satırda, dizinin 0. elemanına 11 sayısı ataması yapıldı.
 
Not
int dizi1[10]; 
int dizi2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int dizi3[10] = {1, 2, 3};
110 elemanı olan bir dizi tanımlandı ve elemanları otomatik olarak 0 atandı.
2Köşeli parantez içine yazılmasa da elemanların değerleri teker teker belirlenerek eleman sayısı oluşturulmuş oldu.
310 elemanlı bir dizi tanımlandı. Tanımlanmayan diğer elemanlarıiçin varsayılan olan 0 değeri atandı.

Yukarıdaki şekillerdeki gibi de atamalar yapılabilir.

C++ 11 ile uniform initialization da kullanılabilmektedir.

int dizi[10]{ }; int dizi2[5]{1,2,3,4,5};

Dizilerin İndexlerine Erişim:

int dizi[5]{0,1,2,3,4}; //uniform 
std::cout << dizi[3] << " " << dizi[2] << std::endl; // 3 2

Dizilerin Döngüde Kullanımı:

int dizi[6] {} ;
for(int i{0}; i< 6 ; ++i)
{
    dizi[i] = i;
}
Dizi Elemanlarına Erişim:

Belirli bir elemanın indeksi verilerek ya da döngü ile tüm diziyi dolaşarak elemanlara erişim sağlanabilmektedir.

Örnek:

 
/// Indeks ile erişim
int sayilar[] = {1, 2, 3, 4, 5};

/// x, 3 değerini içerecektir
int x = sayilar[2];

Yukarıdaki örnekte 2. indeksteki elemana erişimi gösterilmektedir.

 

Not

Dizilerin ilk elemanı her zaman 0 indekslidir. N elemanlı bir dizinin son elemanı N-1 indeksli olacaktır. Dizi sınırları dışına çıkılması durumunda sonuç dönmeye devam edecektir fakat bu veri alakasız bir veri olacaktır.

Bunun sebebi dizilerin belirli bir hafıza alanında bir işaretçi olmasıdır. Eğer bu sınırlardan çıkacak olursanız hafızanın başka bir adresini işaret etmiş olursunuz ve hafızanın o adresindeki değer dönüş değeri olarak alınır.

Örnek:

 
/// Dizi üzerinde dolaşma
int sayilar[] = {1, 2, 3, 4, 5};

for(int i = 0; i < 5; i++){
    int x = sayilar[i];
}

Yukarıdaki örnekte dizi içerisinde döngü ile dolaşılarak erişim gösterilmektedir.

Karakter Dizisi (String)

Stringler karakter dizileridir. Karakter dizileri bellekte birden fazla karakterin ardışık şekilde saklanması ile oluşturulur.

Genel Kullanımı:

char Adi[elemanSayisi]

C++ stringleri iki yolla gösterir. Birincisi C dilinden kalma karakter dizisi yöntemidir. Bu yöntemde dikkat edilmesi bir nokta vardır; her stringin son karakteri null karakterine sahip olmalıdır, ASCII karşılığı \0 ‘dır.

Örnek:

char dogruString[8] = {'M', 'e', 'r', 'h', 'a', 'b', 'a', '\0'}; 
char yanlisString[7] = {'M', 'e', 'r', 'h', 'a', 'b', 'a'}; 
cout << dogruString << endl; cout << yanlisString << endl;

Kullanıcılar tarafından en çok yapılan hata ‘\0’ elemanını eleman sayısına katmamak ve ‘\0’ karakterini diziye eklememektir. Null karakterin koyulmaması sonucu hatalı çıktıya sebep olmaktadır çünkü C++ bu diziyi karakter dizisi yani string olarak tanımamaktadır.

Karakter dizisi tanımlamanın bir alternatifi de string literal olarak oluşturmaktır. String literal çift tırnak (” “) içerisinde bulunanlar karakterler dizisidir.

Örnek:

char string1[12] = "MerhabaDünya"; 
char string2[] = "Dizi boyutu anlasilabilir";

1 . satırda 12 boyutunda bir dizi oluşturulmuştur ve MerhabaDünya string literali bu diziye atanmıştır. İkinci örnekte ise derleyici string literalin boyutundan dizinin boyutunu anlamaktadır. String literaller \0 karakterine ihtiyaç duymaz, derleyici bunu kendisi ekleyecektir. Fakat \0 karakteri için bir eleman fazla yazmak kod için sağlıklı olmayacaktır çünkü boş kalan her elemana varsayılan olarak \0 karakteri atanmaktadır.

 

std::string

C++ çok daha güçlü bir string türüne sahiptir.

Dilin çekirdek özelliklerinden olmamakla birlikte standart kütüphanede bulunmaktadır. Kullanmak için string kütüphanesini programa dahil etmek gerekir.

#include <string>
std::string isim;
std::string isim("Ali"); 
isim= "Ayse";

Struct

Struct, farklı veri tiplerinden oluşabilen bir yapı oluşturabilmektedir. Mesela kahve ile ilgili saklanacak verilerde ismi, menşeisi ve sertlik derecesi olmalıdır. Sertlik derecesini 1 – 10 arasında kabul edilirse, iki string değerli ve bir integer değerli kahve veri tipi oluşturulmalıdır.

Genel Yapı:

struct kahve{ 
    string isim; 
    string mensei; 
    int sertlik; 
};
kahve yeniKahve = {"Strata" , "Columbia" , 10};
kahve kahve2;
kahve2.isim = "Flora";
kahve2.mensei = "Mexico";
kahve2.strength = 9;

Yuakrıdaki örnektedki gibi değer ataması yapılmaktadır. Nokta operatörü ile struct elemanlarının özelliklerine ulaşılabilmektedir.

Union

Union, birden fazla değer ve veri tipi saklama açısından structlara benzemektedir. Fakat union aynı anda sadece bir veri saklayabilmektedir. Union için bellekte yer ayrılacağı zaman sadece en geniş elemanın saklanabileceği kadar yer ayrılmaktadır.

Örnek:

union numerikUnion
{
     int intDeger;
     long longDeger;
     double doubleDeger;
};
numericUnion ornekUnion;
ornekUnion.intDeger = 3;
cout << ornekUnion.intDeger << endl;
ornekUnion.doubleDeger = 4.5;
cout << ornekUnion.doubleDeger << endl;
cout << ornekUnion.intDeger << endl;

Union kullanımının sebebi sınırlı hafızaya sahip bir cihazda bir uygulama yazıldığında daha kârlı  olmasıdır.

Enumeration

Enumeration bir tür sembolik sabit oluşturmadır. Bir tür yaratılıp, elemanlarının belli tipte olması sağlanmaktadır.

enum Gunler {Pazartesi, Sali, Carsamba, Persembe, Cuma, Cumartesi, Pazar};

Varsayılan olarak enum değerleri 0’dan başlayıp birer birer artmaktadır.

  • Pazartesi = 0
  • Sali = 1
  • Carsamba = 2
  • …​

Varsayılan başlangıç değeri değiştirilebilmektedir.

enum Gunler {Pazartesi = 1, Sali, Carsamba, Persembe, Cuma, Cumartesi, Pazar};

Enum anahtar kelimesi Gunler tipini oluşturmaktadır.

enum Gunler {Pazartesi = 1, Sali, Carsamba, Persembe, Cuma, Cumartesi, Pazar};
Gunler faturaGunu;
faturaGunu = Persembe;
cout << faturaGunu << endl;

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width=”1/2″][vc_btn title=”Önceki Ders” color=”green” align=”left” i_icon_fontawesome=”fa fa-chevron-left” add_icon=”true” link=”url:https%3A%2F%2Fyapbenzet.org.tr%2Fcpp-degiskenleri-sabitleri%2F|||”][/vc_column][vc_column width=”1/2″][vc_btn title=”Sonraki Ders” color=”green” align=”right” i_align=”right” i_icon_fontawesome=”fa fa-chevron-right” add_icon=”true” link=”url:https%3A%2F%2Fyapbenzet.org.tr%2Fcpp-operatorleri%2F|||”][/vc_column][/vc_row]