08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

printf("\n");<br />

for (k = 0; k < SIZE; ++k)<br />

printf("%d ", ai[k]);<br />

}<br />

return 0;<br />

g_swap isimli işlev, başlangıç adreslerini aldığı belirli uzunlukta iki bellek bloğunun<br />

içeriğini takas ediyor. Bu işlev, türden bağımsız sıralama işlemini gerçekleştiren bsort<br />

isimli işlev tarafından çağrılıyor. bsort işlevinin parametrik yapısının, daha önce yazılan<br />

get_max isimli işleve benzer olduğunu görüyorsunuz. İşlevin birinci parametresi<br />

sıralanacak dizinin adresi, ikinci parametresi dizinin eleman sayısı, üçüncü parametresi<br />

dizinin bir elemanının uzunluğu ve dördüncü parametresi ise dizinin elemanlarını<br />

karşılaştırma işlemini gerçekleştirecek işlevin adresidir.<br />

bsort işlevi içinde "kabarcık sıralaması" algoritması kullanılıyor. Dizinin ardışık iki<br />

elemanının büyüklük-küçüklük ilişikisi dışarıdan adresi alınan işlevin, parametre değişkeni<br />

olan gösterici ile çağrılmasıyla elde ediliyor. Eğer dizinin bu iki elemanı doğru yerde<br />

değilse bu elemanlar daha önce tanımlanan gswap işlevinin çağrılmasıyla takas ediliyor.<br />

Böyle bir işlevle her türden dizi sıraya sokulabilir. bsort işlevi yalnızca karşılaştırma<br />

işlemini gerçekleştirecek uygun bir işlevin adresine gereksinim duyar. Çünkü bu işlev<br />

dışarıdan adresi gelen dizinin elemanlarının türünü bilemez.<br />

İşlev göstericileri tanımlarken parametre ayracının içinin boş bırakılması ile parametre<br />

ayracının içerisine void yazılması farklı anlamlardadır. Parametre ayracının içi boş<br />

bırakılırsa, böyle tanımlanan işlev göstericisi değişkenlere, geri dönüş değeri uygun<br />

herhangi bir parametre yapısına sahip olan işlevin adresi yerleştirilebilir. Oysa void<br />

yazılması, parametresi olmayan işlevlerin adreslerinin yerleştirilebileceği anlamına gelir.<br />

Parametre ayracının içi boş bırakılarak, çağrılacak işlevlerin parametrik yapısı dışarıdan<br />

istendiği gibi düzenlenebilir.<br />

[C++ dilinde parametre ayracının içinin boş bırakılması, işlev göstericisi değişkenin, göstereceği işlevin parametreye sahip<br />

olmadığı bilgisini iletir. C++'da ayracın içine void yazılmasıyla, buranın boş bırakılması arasında bir anlam farkı yoktur.]<br />

Standart qsort İşlevi<br />

Standart qsort işlevi, yukarıda tanımlanan bsort işleviyle aynı parametrik yapıya sahiptir.<br />

Yazdığımız bsort işlevi kabarcık sıralaması algoritmasını kullanıyordu. Standart qsort işlevi<br />

ise "quick sort " algoritmasını kullanır.<br />

qsort işlevinin stdlib.h başlık dosyası içindeki bildirimi aşağıdaki gibidir:<br />

void qsort(void *vp, size_t size, size_t width, int (*cmp)(const void *,<br />

const void *));<br />

İşlevin birinci parametresi sıraya dizilecek dizinin başlangıç adresi, ikinci parametresi<br />

dizinin eleman sayısı, üçüncü parametresi dizinin bir elemanın uzunluğu ve son<br />

parametresi de karşılaştırma işlevinin adresidir. Karşılaştırma işlevi, birinci parametresine<br />

adresi gönderilen elemanın değeri, ikinci parametresine adresi gönderilen elemandan<br />

büyükse pozitif herhangi bir değere, küçükse negatif herhangi bir değere, eşitse sıfıra<br />

geri dönecek biçimde yazılırsa küçükten büyüğe sıraya dizme, ters yazılırsa büyükten<br />

küçüğe sıraya dizme gerçekleşir.<br />

Standartlar öncesi C derleyicilerinde qsort işlevinin bildiriminde karşılaştırma işlevinin<br />

adresini alacak göstericinin parametre ayracının içi boş bırakılmıştır. Bu durum<br />

karşılaştırma işlevini yazmayı kolaylaştırır. İstenirse qsort İşlevinda böyle bir kolaylık elde<br />

etmek için stdlib.h başlık dosyası içinde bulunan bildirimde işlev gösterici ayracı<br />

boşaltılabilir:<br />

void qsort(void *parray, size_t size, size_t width, void(*fp)());<br />

514

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!