Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları
Veri yapısı, bilginin anlamlı sırada bellekte veya disk, çubuk bellek gibi saklama birimlerinde tutulması veya saklanması şeklini gösterir. Bilgisayar sistemleri ikili taban üzerine kurulmuş olup hemen her şey 1 ve 0 ların anlamlı sırada dizilerek birbirinden farklı kodlar oluşturulmasına dayanır. Veri yapısı verilerin saklanış biçimiyle ilgilenirken, veri modeli ise veriler arasındaki ilişki ve bağlantılar konusu ile ilgilenir.
1) Veri Yapısı Ham haliyle 01000001 şeklinde bit dizisinde oluşan verilerin anlamlı hale gelmesi veya bilgi olması için onun formatının da bilinmesi gerekir. Örneğin verilen 01000001 bit dizisi ASCII kümeye göre A harfine, ikili sayı sistemine göre 65 sayısına karşılık düşer. Veri yapıları, sayısal sistemlerin iç yapısında bit dizisi şeklinde bulunan verilerin anlamlı hale getirilmesi için kullanılan bir biçimleme-kalıplama yöntemdir, yani verinin tutulacağı yerin şeklidir. Örneğin 16-bit biraraya getirilip tamsayı, 8-bit bir araya getirilip karakter veri türü oluşturulur.
1) Veri Yapısı Her programlama dili tarafından desteklenen temel veri o o o o türleri; Tamsayı (21, 5678, vs.) Karakter (A, B, ~, @, vs.) Gerçel Sayı (3.5, 2.68, 3.6*10 3 vs.) Sözce/Sözcük (ali, elma vs.) Veri yapıları; temel veri yapıları ve tanımlamalı veri yapıları olmak üzere ikiye ayrılabilir. Temel veri yapıları, daha çok programlama dilleri tarafından doğrudan değişken veya sabit bildirimi yapılarak kullanılırken, tanımlamalı veri yapıları kendisinden önceki tanımlamalı veya temel veri yapıları üzerine kurulurlar.
2) Temel Veri Yapıları Tüm programlama dilleri genel olarak karakter, tamsayı, gerçel sayı, sözce/sözcük ve dizi için temel veri yapılarını destekler, bazıları da karmaşık sayı, mantıksal değer tutulması gibi veri yapılarını da desteklemektedir. 62 10 sayısı bilgisayar belleğinde; o Sayının ikili tabandaki karşılığına göre 0011 1110 o ASCII karakter kümesine göre 0011 0110 0011 0010 o BCD kodlamaya göre 0110 0010
2-1. Karakter Karakter, en temel veri yapılarından birisi olup tek tek karakterlerin veya art arda gelerek sözcüklerin, cümlelerin tutulduğu bir yapıdır. Kodlama işlemi bir karakter tablosuna göre yapılır, tablo değiştirildiğinde karakterlere karşı düşen kodlar değişeceğinden ham verinin içerdiği bilgi farklı görülür. Bilgisayar uygulamasında en yaygın kullanılan karakter tabloları ASCII dir; Unikod kodlama standardı da yaygınlaşmaktadır.
ASCII ASCII tabloda her bir karakter 7 bit olup 128 farklı karakterden oluşmaktadır. Genişletilmiş ASCII tabloda ise her bir karakter 8 bit olup tabloda 256 karakter bulunmaktadır. Bilgisayar uygulamalarında daha çok genişletilmiş ASCII kod tablosu kullanılmaktadır. Bu kod tablosu kullanan her yapı karakter başına 1 byte (8 bit) yer işgal eder. Örneğin yalın metin dosyalarının(*.txt) boyutu yaklaşık olarak içerdiği karakter sayısı kadardır. Tablodaki ilk 32 karakter (yazdırılamayan) kontrol amaçlı olarak kullanılır ve kontrol karakteri olarak adlandırılır. Dosyalama işlemleri, veri aktarımı vs gibi uygulamalarda belirli anlamlara sahiptirler.
Unikod (Unicode) Unikod, metin tabanlı verilerin sayısal ortamda gösterilmesi ve bellekte tutulması için evrensel bir kodlama şeklidir. Ortaya çıkışının ana temeli Dünya üzerinde konuşulan/yazılan ulusal dillerden bağımsız ortak bir kodlama sisteminin gereksinimidir. Unikod kodlama sisteminde herbir karakter bellekte 16 bit yer işgal eder(2 16 =65536 farklı karakter). Unikod kodlama sistemi kod blokları şeklinde düzenlenmiştir. Örneğin; Genişletilmiş Latin-A, Mathematical Alphanumeric Symbols, vb.
2-2. Tamsayılar Bir tamsayı, bellekte en yalın haliyle ikili tabandaki doğal karşılığı ile saklanır. Tamsayı formatları; o o o o Doğal ikili kod 1 e Tümleyen 2 ye Tümleyen BCD Kodlamalı
Doğal İkili Kod Sayı doğrudan ikili tabandaki karşılığı ile saklanır. Sayının mutlak değeri S S=b n-1 2 n-1 +b n-2 2 n-2 +b n-3 2 n-3 +..+b 2 2 2 +b 1 2 1 +b 0 2 0 S 10 =(b n-1 b n-2 b n-3 b 2 b 1 b 0 ) 2 Bit dizisinin en solundaki bit en anlamlı, en sağındaki bit en anlamsız olarak adlandırılır. 10 luk tabandaki sayı 2 ye bölünerek ikili taban karşılığı elde edilir.
1 e Tümleyen Bu yöntemde sayının doğal ikili tabandaki karşılığının 1 e tümlenmişi kullanılır. 1 e tümleme bit dizisi içerisindeki 1 lerin 0, 0 ların 1 yapılması ile elde edilir. 2 ye Tümleyen Bu yöntemde sayının doğal ikili tabandaki karşılığının 2 ye tümlenmişi kullanılır. 2 e tümleme bit dizisi içerisindeki 1 lerin 0, 0 ların 1 yapılıp sonuca 1 eklenmesi ile elde edilir. Aynı zamanda 1 e tümlenmiş olan ikili diziye 1 eklenmiş halidir.
BCD Kodlama BCD kodlama, [0,9] arasındaki rakamların 4 bitlik kodlaması kullanılarak gerçekleştirilir. Rakam BCD Kodu Rakam BCD Kodu 0 0000 5 0101 1 0001 6 0110 2 0010 7 0111 3 0011 8 1000 4 0100 9 1001 123 sayısı 1=0001; 2=0010; 3=0011 0001 0010 0011
İşaretsiz Tamsayı (Unsigned Integer) İşaretsiz tam sayılar, pozitif tamsayılar anlamına gelir. Hiçbir zaman eksi olamayacağı için sayının işaret bilgisinin tutulmasına gerek yoktur. n bitlik işaretsiz bir tamsayı 0 ile 2 n -1 arasında bir değere sahiptir.
İşaretli Tamsayı (Signed Integer) İşaretli tamsayı hem artı hem de eksi sayıların olabileceği anlamına gelir. Bu nedenle sayı içerisinde işaret bilgisi de tutulmalıdır. Genel olarak, 1 tane bit işaret biti olarak değerlendirilir. Bu bit 1 iken sayı eksi bölgede, 0 iken sayı artı bölgede anlamındadır. 10 bitlik bir işaretli tamsayıda, 9 bit sayının mutlak değerini, 1 bit ise sayının işaretini temsil eder. Tamsayıları işaretli göstermek için o o Doğal ikili kodun en soluna işaret biti eklenmesi 2 ye tümleyen şekliyle gösterilmesi
İşaretli Tamsayı - Örnek 8 bitlik -1 ve +1 sayısının hem doğal hem de 2 ye tümleme yöntemi ile gösterilmesi 1 sayısı => 0000 0001 Doğal ikili kod ile -1 için; 1000 0001 2 ye tümleme ile -1 için; 1111 1111
Tamsayının bit Uzunluğu ve Bölgesi Uzunluklar konusunda belirli standartlar vardır. Sayının bit uzunluğu 1 bit olsa dahi çalışılan tamsayı türü 32 bitlik ise sayı bu alanda tutulmak zorundadır. Tamsayı Türü İşaretsiz İşaretli 8 bitlik [0, 255] [-128, +127] 16 bitlik [0, 65 535] [-32 768, +32 767] 32 bitlik [0, 4 294 967 295] [-2 147 483 648, +2 147 483 647] 64 bitlik [0, 2 64-1] [-2 63, +2 63-1] 128 bitlik [0, 2 128-1] [-2 127, +2 127-1]
İşaretli Tamsayı - Örnek -39 10 sayısının 16 bitlik olarak doğal ve 2 ye tümleme yöntemiyle gösterimi 39=> 10 0111 ==(16bit)=>0000 0000 0010 0111 Doğal => 1000 0000 0010 0111 2 ye tümleme ile; 0000 0000 0010 0111 =(tümleme ile)=>1111 1111 1101 1001 Doğal ikili kod ile => 1000 0000 0010 0111 2 ye tümleme ile => 1111 1111 1101 1001
2-3. Gerçel Sayı Tam kısma ek olarak kesri olan sayılardır, gerçel sayı yapısı hem kesri olan gerçel sayıların gösterilmesinde hem de tamsayı veri yapısıyla gösterilemeyecek kadar çok büyük veya çok küçük sayıların gösterilmesinde kullanılır. Sayısal ortamlarda kesirli sayıların gösterilmesinde bilgisayar uygulamalarında en fazla kayan noktalı o o gösterim kullanılır. Kayan Noktalı (Kesrin yeri değişken) Sabit Noktalı (Kesrin yeri sabit)
Kayan Noktalı Sayı Formatı & IEEE 754 Kayan noktalı sayıların bit düzeyindeki veri yapısında, bit dizisindeki bitlerin bir kısmı üs, bir kısmı çarpan ve bir tane de işaret biti kullanılır. IEEE 754 standardına göre 32 bitlik bir kayan noktalı sayının bit haritası şöyledir; 23 ü çarpan, 8 i üs ve 1 bit de işaret.
Kayan Noktalı Sayı Formatı & IEEE 754 Sayı genel olarak şu şekilde gösterilir (Ç:Çarpan, T:Taban, Ü:Üs) Sayı = ± Ç x T ±Ü T, taban bilgisi olup tüm sayılar için aynı olacağından saklanmasına gerek yoktur. Bu nedenle Ç,Ü ve işaret bitinin saklanması yeterlidir.
Veri Yapıları
Kayan Noktalı Sayı Formatı & IEEE 754 *Örnek 3,14 şeklinde verilen pi sayısının 32-bitlik IEEE 754 formatına göre bit haritasını çıkartınız. 3,14=(-1) i *(1+k)*2 üs-bias i: sayının işareti (1+k): Çarpan (1 Çarpan 2 aralığında olmalıdır. K=0, şeklinde bir ondalık sayı) Bias: bit haritasında verilen üs sayısından çıkarılan bir sabit olup 32 bitlik kayan noktalı sayı için değeri 127 (tablodan) Sayı + olduğu için i=0;
Kayan Noktalı Sayı Formatı & IEEE 754 *Örnek (-1) 0 *(1+k)*2 n =3,14 => n=1 için k=0,57 dir. üs-bias=n=1 bias=127(tablodan), üs=1+127=128 olur. i üs k 0 128 0,57
Kayan Noktalı Sayı Formatı & IEEE 754 *Örnek i=(0) 10 =(0) 2 üs=(128) 10 =(1000 0000) 2 k=(0,57) 10 =(???) 2 0.57*2=1,14 1 den büyük q -1 =1 0.14*2=0,28 1 den küçük q -2 =0 0.32*2=0,64 1 den küçük q -22 =0 0.64*2=1,28 1 den büyük q -23 =1 0.28*2=0,56 1 den büyük q -24 =0
Kayan Noktalı Sayı Formatı & IEEE 754 *Örnek k=(0,57) 10 (0,10010001111010111000010) 2 i üs k 0 1000 0000 100 1000 1111 0101 1100 0010 Tam karşılığı bulunamadığı için 24. bitte kesilmiştir. Sonuç gerçel sayı IEEE 754 e formatında tutulduğunda bir miktar hata payı olur.
2-4. Sözce ve Sözcükler Bir yazının/metnin tamamını, herhangi bir cümlesini, sözcüğünü veya hecesini bellek üzerinde tutmak için sözce(string) veri yapısı kullanılır. Sözce, aslında karakterlerin art arda geldiği bir karakter dizisidir. Sıradan bir karakter dizisinden farkı, sözcenin kaç elemanlı olduğunun bilinmesi veya sözce sonu karakteri kullanılmasıdır. C dilinde sonlandırma karakteri \0 verisidir(null).
2-4. Sözce ve Sözcükler Bu yapıda iki tip yaklaşım mevcuttur. Birisi oluşturulacak olan dizi yapısının karakter sayısını tutması, diğeri ise sonlandırma karakteri kullanılması. Karakter sayısını kullanan yaklaşımda eleman sayısı dizinin en başında verilmiştir. Ve diziye girilecek karakter sayısı bu rakam ile sınırlıdır. Sonlandırma karakteri yaklaşımında ise, oluşturulacak olan karakter dizisinin boyutu sonlandırma karakterinin bulunduğu yer ile sınırlıdır. Bu da tüm belleğin kullanılmasına izin verir niteliktedir. Sonlandırma karakteri yaklaşımının dezavantajı elemanların sayımı gibi işlemlerde ortaya çıkar. Sonlandırma elemanına kadar olan karakterlerin sayılması gereklidir. Karakter sayısının tutulması yönteminde ise dizinin ilk elemanına bakmak yeterlidir.
Veri Yapıları
2-5. Dizi/Matris Dizi veri yapısında, kümeye ait olan veriler bellekte art arda tutulur. Dolayısıyla dizinin başlangıç adresi veya adı bilindiğinde herhangi bir elemana kolayca erişilebilir. Dizi veri yapısı, doğrudan programlama dilinin imkanı dahilinde dizi bildirimleri yapılarak sağlanır. Temel veri yapısına dayanan birkaç dizi bildirimi;
2-5. Dizi/Matris struct tarih{ } short int gun; short int ay; int yil; struct kayit{ } char ad[10]; char soyad[15]; char adres[50]; char sehir[10]; char bolum[8]; int boy; float kilo;
2-5. Dizi/Matris struct tarih dogumgunleri[2000]; struct kayit ogrenciler[10]; Bu dizi bildirimlerinin geçerli olabilmesi için daha önce struct tarih ve struct kayit adlı toplulukların tanımlı olması gerekir. Bu durumda her bir tarih veri yapısı 6; kayıt veri yapısı da 99 sekizli(byte) boyutundadır. Buna göre dogumgunu dizisi bellekte 2000*6, ogrenciler dizisi de 10*99 bytelık yer işgal eder(veri türü tablosundan).
3) Tanımlamalı Veri Yapıları Tanımlamalı veri yapısı, temel ya da daha önceden tanımlanmış veri yapılarının kullanılıp yeni veri yapıları oluşturulmasıdır. Yeni veri yapısı tanımlamak gereksinime göre iki şekilde o o yapılabilir; Topluluk Oluşturma Ortaklık Oluşturma Her birinin kullanım amacı farklı olup uygulamaya göre bir tanesi veya hepsi bir arada kullanılabilir.(en çok kullanılanı topluluk oluşturmadır)
3-1. Topluluk Oluşturma Topluluk birden çok veri yapısının bir araya getirilip yeni bir veri yapısı, bir aile ortaya çıkarmaktır. Bağlantılı liste, ağaç ve özel amaçlı veri modelleri böylesi yeni veri yapılarına gereksinim duyar, zaman, tarih gibi birden çok değişkenin olduğu veri yapıları da topluluk bildirimiyle yapılabilir. Topluluk tanımlanması C dilinde struct deyimiyle yapılır.
Veri Yapıları
3-1. Topluluk Oluşturma struct kimlik{ } char ad[15]; char soyad[20]; int yas; char adres[50];
3-2. Ortaklık Oluşturma Ortaklık, birden çok değişkenin aynı bellek alanını kullanmasını sağlayan bir veri yapısı tanımlamasıdır. Böylece, bellek alanı kısıtlı uygulamalarda bazı değişkenlerin ortaklaşa yer kullanması sağlanmış olur. Ancak, birine atama yapıldığında diğerinin değişeceği unutulmamalıdır. Ortaklık tanımlanması C dilinde union deyimiyle yapılır. Ortaklıkta en fazla yeri işgal eden veri yapısı hangisi ise, ortaklık içerisindeki tüm değişkenler orayı paylaşır.
3-2. Ortaklık Oluşturma union paylas{ int i; float f; char kr; }