Procedure-Based Programming in C++ Çoğu gerçek dünya problemleri binlerce kod satırı gerektirir ( MS Windows NT 5.0 25 million dan fazla kod satırından oluşmaktadır). Yazılımın tasarımı, kodlanması ve bakımını kolaylaştırmak için programlama dilleri (C++ dahil) genelde tepeden aşağıya (top-down design) böl-yönet yönteminde olduğu gibi (divide-and-conquer) tasarım desteği sunarlar. C++ buiş için iki tip modül desteğine sahiptir: function ve class. C++ programcısının yazdığı yeni modüllerin daha önce yazılan function ve class ları çağırabilmesine destek verir. 10/17/2007 Nesneye Yonelik Programlama 3.1
Örnek: Standard Math Function #include <iostream> #include <cmath> // called maht.h in old C style int main() { double number, root; while (true) { cin >> number; cout << The square root of << number << is ; root = sqrt (number); cout << root << endl; } return 0; } 10/17/2007 Nesneye Yonelik Programlama 3.2
C++ Standart Kütüphanesindeki Fonksiyonlar C++ ın önceden tasarlanmış (pre-defined) zengin bir fonksiyon seti vardır: Giriş/çıkış (Input/output) Yaygın matematiksel fonksiyonlar - Common mathematical functions Katar düzenleyicileri - String manipulations Karakter düzenleyicileri - Character manipulations Hata kontrolleri - Error checking Mümkün olduğunca aynı işi yapan yeni fonksiyonlar yazmak yerine mevcut olanları kullanmak gerekir: Standart fonksiyonlar uzmanlarca yazılmıştır. Standart fonksiyonlar daha verimlidir. Standart fonksiyonlar daha taşınabilirdir. Yeni kod geliştirime maliyeti gerektirir. 10/17/2007 Nesneye Yonelik Programlama 3.3
10/17/2007 Nesneye Yonelik Programlama 3.4
Fonksiyon Deklarasyonu (Function Definitions) Yazım şekli: <return_type> <function_name> (<parameters>){ <local_variable_declerations> <procedure_body_statements> } Notes: Eğer geri döndürdüğü değer tipi (return type) bildirilmemişse, int default olarak kabul edilir. Eğer geri döndürdüğü değer tipi void ise, fonksiyondan bir değer dönmez. Dolayısıyle return ifadesine gerek yoktur. Eğer geri döndürdüğü değer tipi void değilse, fonksiyonda en az bir tane return ifadesine gerek vardır. 10/17/2007 Nesneye Yonelik Programlama 3.5
Function Declaration / Prototype Bir fonksiyon main veya diğer bir fonksiyon tarafından kullanılmadan önce deklaredilmelidir. Bu iş için iki yol vardır: Fonksiyonun ilk kullanımından önce fonksiyon tanımlamasını belirtmek, Fonksiyon deklerasyonunu (function prototype) fonksiyonun ilk kullanımından önce belirtmek 10/17/2007 Nesneye Yonelik Programlama 3.6
10/17/2007 Nesneye Yonelik Programlama 3.7
Değişkenin Etki Alanı (Variable Scope) Hem parametre değişkenleri ve hem de fonksiyon içerisinde tanımlanan değişkenler yerel değişkenlerdir (local variable). Yerel değişkenlere ancak ait oldukları fonksiyon içerisinden erişilebilir. Yerel değişkenlerin değerinin değişiminin, fonksiyon dışında tanımlı aynı isimlere sahip değişkenlere etkisi yoktur. Fonksiyon ilk olarak çağrıldığında, fonksiyonun yerel değişkenleri aktif duruma geçerler. Fonksiyon sonlandığında bu değişkenler hafızadan atılır. Bu kuralın bir istisnası: static olarak tanımlanan yerel değişkenler aynı fonksiyonun farklı çağrımlarında bir önceki değerini muhafaza ederler. 10/17/2007 Nesneye Yonelik Programlama 3.8
Fonksiyon Parametrelerinin İletilme Mekanizması Parameter Passing Mechanisms Call-by-value C++ nin varsayılan mekanizması Fonksiyonun çağrılmasında kullanılan parametreler (actual parameters )fonksiyonun çağrımında fonksiyonun deklerasyonunda oluşturulan parametrelere (formal parameters) kopyalanır. Fonksiyonun çağrıldığı yere gere dönüşünde Fonksiyonun çağrılmasında kullanılan parametrelerin değerleri değiştirilmez. Call-by-reference Fonksiyonun çağrılmasında kullanılan parametrelerin memory adresleri fonksiyonun deklerasyonunda oluşturulan parametrelere kopyalanır. Değer kopyalama olmadığından büyük nesneler için zaman ve memory alananından tasarruf edilir. Fonksiyonun çağrıldığı yere gere dönüşünde Fonksiyonun çağrılmasında kullanılan parametrelerin değerleri değiştirilebilir. Bunu önlemek için formal parameter const olarak tanımlanabilir. 10/17/2007 Nesneye Yonelik Programlama 3.9
10/17/2007 Nesneye Yonelik Programlama 3.10
Parametrelerin Tip Dönüşümüne Zorlanması Type coercion of parameters Eğer fonksiyon çağırma ifadesindeki parametrenin tipi fonksiyon deklarasyonundaki tipten farklı olması durumunda C++ parametrenin tipini mümkünse beklenilen tipe çevirir. Promotion: (çevirim sırasında bilgi kaybı yok) Örnek: char, bool, veya short int, int tipine dönüştürüldüğünde; double, long double tipine dönüştürüldüğünde Conversions: (bilgi kaybı olabilir) Örnek: float, int tipine çevrildiğinde; int, bool tipine çevrildiğinde 10/17/2007 Nesneye Yonelik Programlama 3.11
Başlık Dosyaları - Header Files Başlık dosyaları derleyicilere fonksiyon deklarasyonlarıyla (prototypes) ilgili bilgileri temin ederler Kullanıcı programlar diğer dosyalarda tanımlanan fonksiyonları çağırdığında gerekli tip kontrolü yerine getirilir #include önişlemci talimatı (processor directive) kullanılarak dosyalar programa dahil edilir: Standart kütüphane dosyaları (standard library functions) #include <iostream> Kullanıcı tarafından programlanmış fonksiyonlardan oluşan başlık dosyalar (User-programmed functions) #include myheader.h 10/17/2007 Nesneye Yonelik Programlama 3.12
10/17/2007 Nesneye Yonelik Programlama 3.13
10/17/2007 Nesneye Yonelik Programlama 3.14
rand ( ) function 0 <= rand( ) <= RAND_MAX aralığında sahte rasgele sayılar (pseudorandom numbers) oluşturur. RAND_MAX cstdlib başlık dosyasında tanımlanmış bir sabittir. srand ( ) fonksiyonu kullanılarak rand ( ) fonksiyonu için başlangıç tohumu (starting seed) belirlenebilir. Ölçeklendirme: 0.0 1.0 aralığında sayı elde etmek için float(rand()) / RAND_MAX 0 N arasında bir tamsayı elde etmek için rand() % (N+1) 10/17/2007 Nesneye Yonelik Programlama 3.15
Storage Classes, Scope ve Linkage Her bir nesnenin (değişkenler ve fonksiyonlar da dahil) bilgisayarın memorysinde bulunduğu zaman periyodunu belirleyen bir depolama sınıfı (storage class) i vardır. Her bir nene için bu nesneye program kodunun hangi bölümlerinin erişebilecegini belirleyen bir etki alanı (scope) var. Her bir nesne için bu nesneye hangi kaynak dosyaların erişebileceğini belirleyen bir bağlantı kurucu (linkage) var. 10/17/2007 Nesneye Yonelik Programlama 3.16
Automatic Storage Class Automatic storage class fonksiyonlardaki yerel değişkenler için varsayılan olarak oluşturulurlar. Dolayısıyla keyword auto kullanılmasa bile aksi belirtilmedikçe yerel değişkenler automatic storage class a sahiptirler. Otomatik değişkenler bloklar içinde değişkenler deklare edildiklerinde de oluşturulabilirler. register anahtar kelimesi hızlı hesaplama yapmak için ilgili değişkenin değerinin registerda tutulması gerektiği bilgisini derleyiciye bildirir. Örnekler: auto float density = 0.0; register int counter = 0; 10/17/2007 Nesneye Yonelik Programlama 3.17
static Storage Class static storage sahip değişkenler ve fonksiyonlar programın çalışması süresince (program running/execution time) mevcutlar. externstatic storage class: Fonksiyon ve blokların dışında tanımlanan değişkenler (global variables) varsayılan olarak extern static storage class a sahipler Eğer başlangıç değeri mevcutsa bu değer bir kez atanır. Yerel değişkenler static anahtar kelimesiyle static storage class a sahip olmaları sağlanabilir. 10/17/2007 Nesneye Yonelik Programlama 3.18
Nesnelerin Etki Alanları (Scope) File Scope: Fonksiyonların dışında, dosya içerisinde tanımlanan değişkenlerdir (global variables). Bu tip değişkenlere herhangi bir fonksiyonun herhangi bir yerinden erişilebilirler. Fuction Scope: Bir fonksiyonun içinde tanımlanan yerel değişkenler ve etiketler (case ve goto etiketleri). Bunlar sadece bulundukları fonksiyonlar içinde kullanılabilirler. Block scope: Block içinde deklare edilen değişkenler Function Declaration Scope: Fonksiyon deklarasyonlarında kullanılan tanımlayıcılar. Class Scope: daha sonra bahsedilecek 10/17/2007 Nesneye Yonelik Programlama 3.19
Recursion - Rekürsiyon- Yineleme Bir çok problem kendi kendini çağıran fonksiyonlarla kolayca çözümlenebilir: Ağaç yapılı veri yapıları (tree-structured data structures) Liste işleme (list processing) Bir cok matematiksel fonksiyon Fonksiyon kendi kendini problemin daha küçük bir parçasını çözmek için çağırır Karmaşıklığı (Complexity) azaltmak için bir divideand-conquer tekniğidir. 10/17/2007 Nesneye Yonelik Programlama 3.20