Turktekno.net yeniden yayına başladı!! .
Uzun süren kesintinin ardından yeniden sizlerleyiz.

C++ Dersleri 10

Yazar admin

Programlamanın temellerinden olan C++ üzerine başlattığımız makalelere yeni bir bölüm ile devam ediyoruz.

Bu makalemizde "Fonksiyonları" işlemeye devam edeceğiz.

HAZIR KÜTÜPHANE FONKSİYONLARI

Her C++ derleyicisi program yazılmasını kolaylaştırmak, çok kullanılacak program parçalarını hazır bulundurmak amacıyla kütüphane fonksiyonlarına sahiptir. Kütüphane fonksiyonları konularına göre sınıflanır ve anlamlı bir adlandırma ile anılırlar. Örneğin matematiksel kütüphanede cos(), sin(), sqrt() gibi matematiksel işlemlerle ilgili fonksiyonlar bulunurken, grafik kütüphanede grafikle ilgili işlerin kotarılması için gerekli fonksiyonlar bulunur…

Bu bölümde hemen hemen tüm C++ derleycilerinin desteklediği ANSI C kütüphane fonksiyonları aşağıdaki başlıklar altında ele alınmıştır:

■    Karakterler üzerinde işlem yapan fonksiyonlar
■    Katarlar üzerinde işlem yapan fonksiyonlar
■    Bellek alanı üzerinde işlem yapan fonksiyonlar
■    Standart Giriş/Çıkış fonksiyonları
■    Matematiksel fonksiyonlar
■    Esnek argüman aktarını fonksiyonları
■    Zaman ve Tarih fonksiyonlar
■    Yerel olmayan Dallanma fonksiyonlar
■    Ayrıcalıklı Durum Kontrolü ile ilgili komutlar
■    Hata ayıklama fonksiyonları
■    Yerelleştirme fonksiyonları

1. Karakterler Üzerine İşlem Yapan Fonksiyonlar
Tek bir karakter üzerinde işlem yapan bu makro fonksiyonlar sorgulama ve değiştirme olarak iki kümeye ayrılır. Sorgulama fonksiyonları, bir karakterin kullanılan karakter kümesindeki sınıfını belirler; tamsayı tipte olup, olumlu olduğu zaman sıfırdan farklı bir sayı, olumsuzsa sıfır gönderirler. Değiştirme fonksiyonları kendisine gelen karakteri büyük ya da küçük harfe dönüştürmek için kullanılır.
Bu ayrıttaki fonksiyonların tamamı makro olup herhangi biri kullanıldığında, ctype.h adlı başlık dosyası program içine aşağıdaki gibi yazılarak koyulmalıdır:
ÖRNEK:
İSasCİİO Bildiri mi:    int   isascii (int  kr) ;
■    ir, normai bir ASCII karakterse sıfırdan farklı; aksi durumda sıfır gönderir. Normal
■ASCII karakterler 7 bit olup, sayısal kodları kümenin 0-127 arasında olanlardır.

2.   Katarlar Üzerinde ve Bellek Alanında İşlem Yapan Fonksiyonlar
Katar, NULL (\0′) ile sonlandırılmış karakter dizisidir; üzerinde işlem yapan fonksiyonlar (adları str… İle başlar) iki kümeye ayrılır. İlki kopyalama işlemi yapanlar olup genelde karakter işaretçi gönderirler; ikinicisi sorgulama işlemi yapanlar olup mantıksal sonuç gönderirler.

Bellek alanı üzerinde işlem yapan fonksiyonlar (adlan mem… ile başlar) katar üzerinde İşlem yapanlara benzer, ancak bunlar NULL ile karşılaştığında işlemi sonlandırmazlar.

Olup  olmadığı  programcıya  bırakılmıştır;   istenmeyen  durumlar oluşabilir, dikkatli olunmalıdır !

ÖRNEK:
StrcmpO    Bildirimi:    int   stremp (const   char   *kl,   const   char   *k2);
İki katarı karşılaştırır: eşitse 0; ki alfabetik sırada daha önceyse eksi tamsayı; ki alfa-I betik sırada daha sonraysa artı tamsayı gönderir.

3.   Matematiksel Fonksiyonlar
Matematiksel fonksiyonların tipleri çift duyarlı gerçel sayıdır (double); bu nedenle bildirimlerinin yapıldığı math.h adlı başlık dosyası, program içine aşağıdaki gibi yazılarak koyulmalıdır :
#include   <math.h>
Bu başlık dosyası içinde bazı simgesel sabit bildirimleri de yapılmıştır: EDOM (Error DOMain), HUGE_VAL, ERANGE,…

Fonksiyonlara gelen parametreler belirlenen sınırların dışındaysa, errno.h adlı başlık dosyası içinde bildirilmiş olan errno adlı değişkene EDOM atanır. Örneğin sqrt() fonksiyonuyla eksi bir sayının karekökü hesaplanmaz; eksi sayılar sınırların dışındadır.

4. Esnek Argüman Aktarım Fonksiyonları
Bir fonksiyonun, programın değişik yerlerinde farklı sayıda parametreyle çağrılacak biçimde tanımlanması için, stdarg.h adlı başlık dosyasında özel bir tip bildirimi ve 3 tane makro fonksiyon tanımlanması yapılmıştır, vajisî adlı bu özel tip birçok derleyicide "typedef char *va_list" olarak bildirilmiş bir işaretçidir. İlgili makro fonksiyonlar aşağıda açıklanmış olup kullanılacaksa stdarg.h adlı başlık dosyası program içine
ftinclude   <stdarg.h>
biçiminde yazılarak koyulması gerekir.

5 .   Zaman ve Tarih Fonksiyonları
Zaman ve tarih ile ilgili fonksiyonların bildirimleri ve bazı yeni veri tiplerinin tanımlanması time.h adlı başlık dosyasında yapılmıştır. İlgili başlık dosyasında tanımlanmış olan yeni veri tipleri ve topluluk:

typedef long clock_t; cypedef long time_t;
struct Cm {
int tm_sec;    /*    saniye için 0..59    */
int tm__min;    /*    dakika için 0..59    */
int  tm__hour;    /*    saat için 0..23         */
ine  tm_mday;    /*    gün için 1..31    */
int tmjnon;    /*    ay için 0.. 11    */
int  tm^year;    /*    yıl için 1900…    */
int tm_wday;    /*    Haftanın günleri için 0(pazar)..6    */
int tm_jyday;    /*    yılın günleri için 0.365    */
int^i.*.,,    /*    ^seyazsaafuygutoyor        V
Bildirimi yapılmış zaman ve tarih fonksiyonları,

6 .   Yerel Olmayan Dallanma Fonksiyonları
Yapısal bir dil olan C, program içinde dallanma deyimi (goto…) kullanılmasına gerpk olmayacak biçimde esnek kontrol ve döngü deyimlerine sahiptir. Buna karşın, zaman zaman, dallanma deyimi kullanılması gerektiği durumlarla da karşılaşılır. Eğer dallanma yapılacak yer ile o anda bulunulan yer, aynı fonksiyon içerisindeyse yerel; farklı fonksiyon içerisindeyse yerel olmayan dallanma olarak adlandırılır. Yerel dallanmalar goto deyimi ve etiket kullanılarak gerçeklenir (bkz. Ayrıt 4.4.). Yerel olmayan dallanma yapılabilmesi için (yerel için de kullanılabilir) setjmp.h adlı başlık dosyasında özel bir değişken tipi bildirimi ve iki tane makro fonksiyon tanımlanması yapılmıştır.
Bunlar kullanılarak program içinde herhangi bir yere dallanma yapılabilir; kullanılırsa, setjmp.h adlı başlık dosyası program içine aşağıdaki gibi yazılarak koyulmalıdır.
#include <setjmp.h>

7.   Ayrıcalıklı Durum Kontrolü
Programın yürütülmesi sırasında, o anda yapılan işi kesen ayrıcalıklı durumlar oluşabilmektedir. Örneğin, bir sayının sıfıra bölünmesi sonsuz bir değer olacağından herhangi bir sayısal değişkende saklanamaz ve ayrıcalıklı durum kabul edilir. Ayrıcalıklı durumlar programın yürütülmesi anında oluşabileceği gibi donanım tarafından da üretilebilir (örneğin, CTRL-C veya CTRL-BREAK tuşlarına basılarak). Bir sistemde hangi ayrıcalıklı durumların olduğu, sistemin başvuru kitaplarından öğrenilebilir.

Sistemde, oluşabilecek her ayrıcalıklı durum için yürütülecek, sistemin bir parçası olan hazır bir fonksiyon vardır; herhangi bir ayrıcalıklı durum oluştuğunda ilgili fonksiyon yürütülür. İstenirse, sisteme yerleştirilmiş olan hazır ayrıcalıklı durum fonksiyonları (exceptional handler routine) , yeni yazılan birisiyle değiştirilebilir. Bu amaçla signal.h adlı başlık dosyasında bazı simgesel sabitler ve fonksiyon bildirimleri yapılmıştır. Dolayısıyla, bu başlık dosya aşağıdaki gibi yazılarak program içine koyulmalıdır.
#include <signal.h>

Gerçek ve Tanımlı Parametrelerin Karşılaştırılması
   
Her fonksiyon tanımı, tanımlı argüman listesi (formal argüment list) olarak adlandırılan bir argüman listesine sahiptir. Listedeki öğeler keyfidir, dolayısıyla gerçek liste boş olabilir ya da integer, float ve character gibi veri tiplerinin bir birleşimini içerebilir.
   
Fonksiyon program tarafından  çağrıldığında, bir argüman listesi fonksiyona ayrıca aktarılır. Bu listeye gerçek argüman listesi (actual argument list) denir. ANSI C kodu yazarken, güçlü bir zorlama olmasa da genellikle, tanımlı ve gerçek parametreler arasında bire bir eşleşme vardır.
   
Aşağıdaki C kod satırını inceleyin:
Printf(“This is hexademical %x and octal %o “, ians);

Bu durumda printf () fonksiyonuna iki tane beklense de, tek bir argüman aktarılır. Daha az argüman sağlanırsa, eksik argümanlara anlamsız ilk değer ataması yapılır. C++, tanımlı argüman listesine varsayılan değer sağlanmasına izin vererek bir dereceye  kadar bu problemin üstesinden gelir. Gerçek argüman listesinde bir argüman eksik olduğunda, varsayılan argüman otomatik olarak yerine geçirilir. Örneğin C++ içinde fonksiyon prototipi aşağıdaki gibi görünebilir:
İnt ifonsiyonunuz(int it, float fu= 4.2,int iv=10)

Dikkat ederseniz, fu yada vi değerleri ifonksiyonunuz() fonksiyon çağrısında belirtilmezse, gösterilen değerler (4.2 ya da 10) kullanılacaktır. C++ varsayılan değerler kullanan tüm tanımlı argümanların, tanımlı argüman listesinin sonunda listelenmesini gerektirir. Diğer bir deyişle, ifonksiyonunuz(10) ve ifonksiyonunuz (10, 15.2) geçerlidir. Eğer fu sağlanmazsa iv de sağlanıyor olamaz.

main() Foksiyonun Parametreleri ve Kullanımı
 
Main fonksiyonu program çalışmaya başladığında çalıştırılan fonksiyondur. Bu fonksiyon üç parametre alır. Bu parametrelerin kullanılması zorunlu değildir.
Şimdi bu sırası ile bu parametrelerin kullanım anlamlarına amaçlarına değinelim.
Bir çok program, komut satırı parametrelerini aktif bir şekilde kullanır. Mesala sıkıştırma programları sıkıştırılacak dosyaların isimleri, sıkıştırma işleminden sonra oluşturulacak dosya isimi, sıkıştırma şekli gibi bilgileri komut satırı parametreleri arcılığıyla kullanıcıdan alırlar. Main fonksiyonun ilk iki parametresi komutsatırı parametrelerinin işlenmesi için kullanılır. Üçüncü parametre ise ortam değişkenlerinin (environment variables) değerlerini içerir.

main( int argc, char* argv[], char *env[])
{

}

main fonksiyonun genel tanımlaması yukarıdaki gibidir. İlk parametre komut satırından geçilen parametrelerin sayısını tutar. Programın ismi de bir komut satırı parametresi olarak kabul edilir yani her program en az bir komut satırı parametresi içerir. argc parameteresinin değeri en az bir olur. argv parametresi ise boyutu bilinmeyen stringler dizisidir. Bu parametrenin her bir elemanı bir komut satır parametresinin başlangıç adresini tutar. argc ve argv parametreleri birlikte bir anlama kazanırlar.

env parametresinde ise PATH, TEMP gibi ortam değişkenlerinin değerleri tutulur. env parametresi de uzunluğu bilinmeyen bir string dizisidir. Fakat dikkat edilirse env parametresi için komut satırı parametrelerinde olduğu gibi kaç adet ortam değişkeni olduğunu gösteren bir parametre yoktur. Bunun yerine env dizisinin son elemanı NULL değerini içerir.

Faruk Alkaya
Selçuk Üniversitesi - Teknik Eğitim Fakültesi

Yorum Yapın