C PROGRAMLAMA FONKSİYONLAR Hazır fonksiyonlar (math, rand) Kullanıcı Tanımlı Fonksiyonlar Değer ile Çağırma.

Slides:



Advertisements
Benzer bir sunumlar
Fonksiyonlar - Functions
Advertisements

STRİNG FONKSİYONLARI.
Soru1: 1’den 4’e kadar olan tamsayıları ekrana tek satırda görülecek şekilde yazdıran bir programı aşağıdaki metotları kullanarak yazınız. Bir printf ifadesi.
Fonksiyonlar.
Bölüm 12 ÜST DÜZEY KONULAR Dinamik Bellek Ayırma Önişlemci
Makine Müh. & Jeoloji Müh.
Bilgisayar Programlama Güz 2011
EKRAN ÇIKTISI.
C PROGRAMLAMA DİLİNE GİRİŞ
Bölüm 2 C Dilinin Temelleri
C Programlama Diline Giriş
Değişken Bildirimleri
Atama ve Girdi/Çıktı Komutları
Elektrik-Elektronik Mühendisliği Bölümü DİZİLER C Programlama Dili Yaz Stajı Cengiz TEPE SAMSUN 2007.
Soru1: kuvvet(taban,us) Şeklinde bir yinelenen fonksiyon yazın
BPR152 ALGORİTMA VE PROGRAMLAMA - II
Bölüm 9 Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri
String Kütüphanesindeki Arama Fonksiyonları
Bölüm 10 Yapılar ve Birleşimler
Nesne Tabanlı Programlama
Bölüm 2 C Dilinin Temelleri Genel Kavramlar
NESNEYE YÖNELİK PROGRAMLAMA
Erişim Denetimi, Fonksiyon
Fonksiyonlar.
NESNE TABANLI PROGRAMLAMA -METOTLAR-
C++ Temelleri C++ genel amaçlı, nesne tabanlı, yüksek seviye programlama dilidir.
C ile Programlamaya Giriş
DEĞİŞKENLER, VERİ TÜRLERİ VE OPERATÖRLER
Metotlar.
FONKSİYONLAR.
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved. Fonksiyonlar –Programı modüler hale getirir –Yerel değişkenler,
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
Bilgisayar Programlama
Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
Fonksiyonlar Fonksiyon Tanımı
BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL
Bölüm 5 - Fonksiyonlar index 5.1 Giriş 5.2 C de Program Modülleri
© Copyright by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved. 1 Amaçlar Bu derste öğrenilecekler: –Uygulamaları “method”
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
Bölüm 6 Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
STRING‘LER Karakter Kütüphanesi Fonksiyonları
Fonksiyonlar ile Çalışmak
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
1 Yapılandırılmamış programlama Prosedür/Fonksiyon gerekliliği Prosedural Programlama Fonksiyon Tanımlama/Prototip/Çağırma Örnek fonksiyonlar Fonksiyon.
SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
Bölüm 3 Atama ve Girdi/Çıktı Komutları Bölüm 3 Atama ve Girdi/Çıktı Komutları Atama Komutu Operatörler İsim Sabitleri Veri Tipi Dönüşümü Çıktı Fonksiyonu.
4. Hafta1 4. HAFTA. 4. Hafta2 Fonksiyonlar  Büyük problemler, küçük parçalara bölünerek kolay çözülür  Yazılımlar benzer modüller içerirler  Hata ayıklama.
Fonksiyonlar.
1 Değişken alanları Geçici değişkenler Birleşik ifadeler(bloklar) ve değişkenler Değişken Depolama Süresi ve Alanı –Local ve global değişkenler –Static.
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
Programlama Dillerinin Prensipleri
VERİ ve BELLEK & DEĞİŞKENLERİN SAKLANMASI Asst.Prof.Dr.Misket YEKTAY Gizem AYIK.
Bölüm 2 C Dilinin Temelleri Genel Kavramlar Yazım ve Noktalama Kuralları C Kütüphaneleri C Dilindeki Sözcükler Değer Sabitleri Veri Tipleri Değişkenler.
C dili kullanıcıya kendi ihtiyacı olan bir fonksiyonu yazma imkanı vermiştir. Bir sayının faktöriyelini almaya ihtiyaç duyduğumuzu ve aynı zamanda asal.
Fonksiyonlar ve Diziler
Bölüm 6 Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
C Programlama Dili Bilgisayar Mühendisliği.
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler
BİLGİSAYAR PROGRAMLAMA Ders 8: Fonksiyonlar
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
Bölüm 2 C Dilinin Temelleri
ARDUİNO Arduino Eğitimleri Bölüm 3 Programlama Dili Temelleri
Bilgisayar Bilimi Problem Çözme Süreci-2.
Bölüm 6: Kullanıcı Tanımlı Fonksiyonlar I
Bölüm 2 C Dilinin Temelleri
C ile Programlamaya Giriş
NİŞANTAŞI ÜNİVERSİTESİ
Sunum transkripti:

C PROGRAMLAMA FONKSİYONLAR Hazır fonksiyonlar (math, rand) Kullanıcı Tanımlı Fonksiyonlar Değer ile Çağırma

FONKSİYONLAR Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır. Daha büyük programlar yazmanın en kolay yolu onları küçük parçalar halinde yazıp sonra birleştirmektir. Böylece çok büyük boyutlardaki program kodlarını yönetmek daha kolay olacaktır. Büyük problemleri kendi içerisinde, her biri verilen bir işi çözmek için tasarlanmış alt program (sub program) parçacıklarından, yani modüllerden oluşturmak (modüler programlama) daha mantıklıdır. C dilinde bu modüllere fonksiyon (function) adı verilir.

FONKSİYONLAR Fonksiyonlara işlev ya da alt yordam adı da verilmektedir. Bir fonksiyonu çalıştırma işine çağırma (function call) denir. Her fonksiyon, fonksiyon ismi ve kendisinden istenen işi gerçekleştirmek için gerekli olan değerler yani parametreler-argümanlar ile çağrılırlar. Bazı fonksiyonlar kendi içerisinde çeşitli işlemler yaptıktan sonra yaptığı işlemin sonucunu kendisini çağıran fonksiyona döndürürler. Bu değere geri dönüş değeri (return value) adı verilir.

FONKSİYONLAR C programlarında main() ana fonksiyon olduğu için programın çalışması main() fonksiyonundan başlar. Main fonksiyonu diğer fonksiyonları çağırarak çalıştırır. Bir fonksiyon içerisinden başka bir veya birkaç fonksiyonda çağrılabilir.

Fonksiyon kullanmanın faydaları Kodun gereksiz yere büyümesini engeller. Sıkça tekrarlanan işler için bir kere fonksiyon yazıldığında aynı kodlar tekrar yazılmaksızın istendiği kadar çalıştırılabilir. Okunabilirliği artırarak algılamayı kolaylaştırır. Main() fonksiyonu içerisinde birbirinden ayrılmış sadece kendi işlerinin yapan fonksiyonların isimleri bulunur. Detay işlemler fonksiyonların içinde halledilir. Bu programlama tekniğine prosedürsel soyutlama (procedural abstraction) adı verilir. Programın test edilmesini ve hataların bulunmasını kolaylaştırır. Hata araştırılırken aranılması gereken alt program bloğuna bakılır. İstenilirse yalnız başlarına da test edilebilirler. Güncelleştirilebilir olmasını ve yeniden kullanabilme kolaylığı sağlar. Modüler olarak yazıldıklarında istenilen projelerde defalarca kullanılabilirler. C dilinde standart fonksiyonlar ve kullanıcı tanımlı fonksiyonlar olmak üzere iki tip fonksiyon bulunur.

Standart fonksiyonlar C dilinin geliştiricileri tarafından programcıların kullanmaları için önceden yazılmış olan hazır fonksiyonlardır. Programcı, kullanmak istediği hazır fonksiyon prototiplerinin bulunduğu başlık (header) dosyalarını #include ön işlemci direktifi ile bildirerek kullanabilir. Hazır fonksiyonların kendileri .LIB uzantılı kütüphane dosyaları içindedirler. Standart girdi-çıktı işlemleri için kullanılan printf() ve scanf() fonksiyonlar standart veya hazır fonksiyonlardır. stdlib kütüphanesinde bulunan rand() fonksiyonu rastgele sayı üretmek için kullanılan bir hazır fonksiyondur.

math.h kütüphanesi Standart veya hazır fonksiyonlara matematiksel işlemeleri gerçekleştirmek için kullanılan ve math kütüphane dosyasında bulunan fonksiyonlarda örnek olarak verilebilir.

math.h kütüphanesi

getchar() fonksiyonu Klavyeden girilen tek bir karakteri okur. Bu fonksiyonun kullanıldığı programlara #include <conio.h> başlık dosyası eklenmelidir. Genel formatı char ch; ch = getchar( ); Programda bu fonksiyona ulaşılınca, fonksiyon bir tuşa basılana kadar bekler. Bir karakter girilince fonksiyon bu karakteri ekrana yansıtır ve aldığı bu karakteri ch değişkenine atar.

putchar() fonksiyonu Çıktı: ?a a Tek bir karakteri ekranda görüntülemek için kullanılır. Genel formatı putchar(ch); #include <stdio.h> #include <conio.h> int main() { char ch; putchar (‘?’); ch = getchar( ); putchar(ch); } Çıktı: ?a a

getche() ve getch() fonksiyonları scanf() ve getchar() fonksiyonları veri girişini belleğe satırlık giriş olarak yaparlar. Yani enter’a basmadan veri girilmiş, okunmuş sayılmaz. Bu durum çok sık tuş kullanımı gerektiren uygulamalarda kullanışsızdır. getche() ve getch() fonksiyonları, her karakter girişinden sonra enter’a basmayı gerektirmezler. getche() ve getch() fonksiyonları arasındaki fark getche() fonksiyonunda girilen karakter ekranda görüntülenir. getch() fonksiyonunda ise ekranda görüntülenmeden programa devam edilir. char ch; printf(‘’devam edecek misiniz (e/h)’’); Ch = getche(); İf(ch == ‘e’) …..

Geri dönüş tuşudur (ENTER) Örnek – karakter sayısını bulma \r Geri dönüş tuşudur (ENTER) Uygulama: Programı girilen metindeki boşlukları, rakamları ve alfabetik karakterleri sayacak şekilde geliştirin.

rand() fonksiyonu Rasgele sayı üretmek için kullanılır. 0 ile stdlib.h dosyasında tanımlı RAND_MAX arasında değişen rasgele sayılar üretir. Bu fonksiyonun kullanıldığı programlara #include <stdlib.h> başlık dosyası eklenmelidir. Genel formatı unsigned u; u = rand( ); rand() fonksiyonunun ürettiği sayılar bazı uygulamalar için büyük olabilir. Belirli bir aralıkta sayı elde etmek için (%) mod işaretinden faydalanılır. rand() % 6 ifadesi 0-5 arasında sayılar üretir. 1+rand() % 6 ifadesi 1-6 arasında sayılar üretir.

srand() fonksiyonu Farklı dizi elde edilecek koşulları oluşturmaya randomizing denir. Bu koşullar srand() fonksiyonu ile sağlanır. srand() fonksiyonunun argümanı unsigned int tipindedir ve her kullanımda farklı rasgele sayı dizisi verir. srand( clock() ); Bu örnekte rasgele sayı üretmek için clock() fonksiyonu ile sistem zaman bilgisinden faydalanılmıştır. clock() fonksiyonu <time.h> başlık dosyasında bulunur.

Örnek – zar atışı simülasyonu Program Çıktısı

main fonksiyonuna gönderilen parametreler, çalışacak olan programa dışarıdan gönderilecek olan parametrelerdir. main parametreleri Parametre sayısı sorgulanıyor Parametreler okunuyor

main fonksiyonuna gelen parametrelerin kullanımı Bu program çalıştırılabilir koda döndürüldüğünde adı ortalama olsun. Linux üzerinde terminal ekranında # ./ortalama 5 7 8 Windows üzerinde msdos komut penceresinde C:\>ortalama.exe 5 7 8 Komutu uygulandığında, programın adından sonraki parametreler karakter olarak argv dizisine aktarılırken toplam parametre sayısı da argc ye aktarılır.

Kullanıcı tanımlı fonksiyonlar C dilinde programcı kendi fonksiyonlarını oluşturarak kullanabilir. Bu tür fonksiyonlara kullanıcı tanımlı fonksiyonlar denir. Genel fonksiyon tanımlaması aşağıdaki gibidir. Fonksiyonların, parametre alıp almamaları ve geriye değer döndürüp döndürmemelerine göre farklı kullanımları vardır.

Kullanıcı tanımlı fonksiyonlar UYARI !!! Her fonksiyon, iyi olarak tanımlanmış tek bir işi yapacak şekilde sınırlandırılmalıdır ve fonksiyon ismi fonksiyonun görevini etkili bir biçimde açıklamalıdır. Eğer fonksiyon birden fazla görevi yerine getirmeye çalışıyorsa, bu tarzda fonksiyonları daha küçük fonksiyonlara bölmek en iyi yoldur.

int topla(int a, int b) Kullanıcı tanımlı fonksiyonlar Fonksiyona girilen parametre türleri Fonksiyonun adı Fonksiyonun döndürdüğü (ürettiği) değişkenin türü Not: bu fonksiyona iki adet “int” türü değişken giriliyor, fonksiyon “int” türü bir değişken döndürüyor

Fonksiyonun aldığı değişkenler Fonksiyonun döndürdüğü değer Kullanıcı tanımlı fonksiyonlar Fonksiyonun aldığı değişkenler tip fonksiyon_ismi (parametre tip listesi) { değişken tanımlamaları; işlemler; return ifadesi; } Lokal değişkenler (fonksiyon bitiminde kaybolurlar. Static tanımlanırlarsa, bu fonksiyon bir daha çağrıldığında değeri tekrar hatırlanır. Fonksiyonun döndürdüğü değer

Kullanıcı tanımlı fonksiyonlar Geriye değer döndürmeyen ve parametre almayan fonksiyonlar: Bu tür fonksiyonlar, çağıran fonksiyondan ne bir değer alırlar nede geriye değer döndürürler. Geriye dönüş değeri olmadığı için fonksiyonun türü kısmına void ifadesi yazılır. Fonksiyonun türü aynı zamanda geriye dönüş değerinin türüdür. Fonksiyon türü yazılmadığında derleyici int olarak varsayar.

Kullanıcı tanımlı fonksiyonlar Parametre alıp geriye değer döndürmeyen fonksiyonlar: Bu tür fonksiyonlar çağıran fonksiyondan bir yada birden fazla parametre alır ve geriye değer döndürmezler. Bu tür fonksiyonlar çağrılırken fonksiyona gönderilecek değerler yada değerleri tutan değişkenler fonksiyon parantezinin içine yazılırlar. Bu değerleri karşılayan değişkenlerde fonksiyon tanımlama kısmında parantezler içerisinde belirtilir. Gönderilen değerler karşılayan değişkenler içerisine kopyalanır. Gönderilen değerler ile karşılayan değişkenlerin sayısı eşit ve aynı sırada olmalıdır.

Kullanıcı tanımlı fonksiyonlar Parametre alıp geriye değer döndürmeyen fonksiyonların kullanımına bir örnek.

Kullanıcı tanımlı fonksiyonlar Parametre alıp geriye değer döndüren fonksiyonlar: Bu tür fonksiyonlar çağıran fonksiyondan bir yada daha fazla parametre alır ve bunlar üzerinde çeşitli işlemler gerçekleştirerek geriye bir değer döndürürler. Bir fonksiyondan geriye değer döndürmek için return komutu kullanılır. Bu fonksiyonlarda return komutu çalıştığı anda fonksiyonun işi biter ve fonksiyon sonlanır. Bu fonksiyon çağrıldığı fonksiyon içinde bir değişkene değer atama işleminin sol tarafında çağrılmalıdır.

Kullanıcı tanımlı fonksiyonlar Parametre alan ve geriye değer döndüren fonksiyon kullanımına bir örnek.

Örnek – faktöriyel alan fonksiyon Bu örnekte fonksiyonlar main () ana fonksiyonundan önce yazıldıkları için prototiplerinin tanımlanmasına gerek kalmamıştır. carp() fonksiyonu başka bir fonksiyon faktoriyel() içerisinde çağrılmıştır.

Fonksiyon prototipi tanımlama Bu bölüme kadar olan örneklerde fonksiyonlar, kendisini çağıran fonksiyonların üzerinde olacak şekilde yazıldı (main() fonksiyonunun üstünde). Bunun sebebi, fonksiyonların geriye döndürecekleri değerlerin tiplerinin fonksiyonun çağrıldığı komut satırına gelmeden önce derleyiciye bildirilmesi gerektiğidir. Derleme işlemi yukarıdan aşağıya doğru yapıldığı için fonksiyonlar üstte tanımlandığında derleyici fonksiyonun geri dönüş değerinin tipini bilir.

Fonksiyon prototipi tanımlama #include<stdio.h> void func1(void); int func2(int, char); void main(void) { int i=1,j=2; char ch=‘0’; printf(“%d %d\n”,i,j); func1(); j=func2(i,ch); } void func1(void) printf(“selam!\n”); ....... Prototip tanımlar. Main içinde kullanmadan önce isimleri ve yapıları deklare edilir. main’den sonra fonksiyonları yazılacak Void tipi bir fonksiyonun çağırılması. Giriş parametresi de tanımlanmamış (void). Fonksiyon int türü bir değişken üretiyor. Dolayısıyla sonucu, int bir başka değişkene atanabiliyor. parametreleri de bir int ve bir char. En üstte prototipi verilen fonksiyonlardan biri. Burada da işlevi tanıtılıyor. Prototip deklarasyonu ile giriş/çıkış seviyesinde uyumlu.

Fonksiyon prototipi tanımlama Prototipler, eğer fonksiyonları programın alt kısmına yazacaksanız gerekir. Ayrıca bu şekilde bir fonksiyon içinde diğer bir fonksiyonu kullanmak mümkündür. Eğer fonksiyonları main’den önce yazarsanız, prototip deklarasyonuna gerek yoktur. Bu durumda diğer bir (a) fonksiyonu içinde kullanılan bir (b) fonksiyonu, (a)dan daha önce (yukarıya) yazılmalıdır.

Fonksiyon prototipi örnek

Fonksiyonlarda parametre akış türleri Fonksiyonlara değerler iki farklı yöntemle gönderilirler. 1 – Değerle çağırma (call by value): Bu yöntemle çağıran fonksiyondan gönderilen değerler, çağrılan fonksiyondaki parametrelerin içerisine kopyalanırlar. Kopyaların değişmesi orijinal değerleri etkilemez. Şu ana kadar fonksiyon çağrımlarında hep bu yöntem kullanıldı. 2 – Referansla çağırma (call by reference): Bu yöntemle kopyalanan değerlerin fonksiyon içerisinde değiştirilmesi orijinallerini de etkiler.

Fonksiyonu Değer ile Çağırma - Örnek !!! Şu ana kadar anlatılan konularda değer ile çağırma yöntemi kullanılmıştır.

Fonksiyonu Değer ile Çağırma Değişkenin tipi ile fonksiyonun tipi farklı ise tip dönüşümü yapılmalıdır. #include <stdio.h> double kureAlan (double); #define PI 3.141592 int main(){ float r, alan; printf (‘’küre çapini giriniz: ’’); scanf(‘’%f’’, &r); alan = (float) kureAlan(r); printf(‘’ küre alani = %.2f’’, alan); } double kureAlan(double d){ return 4*PI*d*d; kureAlan fonksiyonundan dödürülen double değer float’a dönüştürüldü.

Ev Ödevi Kullanıcı tarafından girilen üç sayı içerisinden en büyüğünü bulan ve bu değeri geri döndüren enbuyuk() adında bir fonksiyon yazınız. Saati, üç argümanla (saat,dakika ve saniye) alan ve saat 12:00’ den girilen saate kadar olan zamanı saniye cinsinden hesaplayıp döndüren bir fonksiyon yazınız. Daha sonra ayrı bir fonksiyon ile girilen iki saat arasındaki farkı 12'lik saat dilimine göre hesaplayan bir program yazınız. Bir tamsayı değeri alan ve bu sayıyı basamaklarını tersten yazıp döndüren bir fonksiyon yazınız. Örneğin verilen sayı 7631 ise fonksiyon 1367 geri göndermeli.

Ev Ödevi Eğer bir sayının kendisi hariç, bütün çarpanlarının toplamı yine o sayıya eşitse bu sayıya MÜKEMMEL SAYI denir. Örneğin, 6 bir mükemmel sayıdır. Çünkü 6 = 1 + 2 + 3. mukemmelSayi() isminde parametre olarak aldığı sayının mükemmel bir sayı olup olmadığını tespit eden bir fonksiyon yazınız. Bu fonksiyonu 1-1000 arasındaki tamsayılardan mükemmel olanlarını bulmak için bir program içinde kullanınız. Program sayının mükemmel olduğunu göstermek için mükemmel sayınının çarpanlarını ekrana yazdırsın. "Tuttuğum Sayıyı Tahmin Et" oynatan bir program yazınız. Program 1-1000 arasında rasgele bir tamsayı üretsin, kullanıcı bir sayı tahmininde bulunduktan sonra ekrana aşağıdaki ifadelerden birisini yazsın.

Örnek Uygulamalar Barbut Oyunu – oyunun kuralları Oyuncu iki zarı aynı anda atar. Zarlar durduktan sonra her iki zarında üste gelen yüzleri toplanır. Eğer toplam ilk atışta 7 ya da 11 ise oyuncu kazanır. Eğer toplam ilk atışta 2,3 ya da 12 gelirse (buna barbut denir) oyuncu kaybeder. Eğer ilk atışta toplam 4,5,6,8,9,10 ise bu toplam oyuncunun oyunu kazanma sayısı haline gelir. Kazanmak için oyuncu bu sayıyı bulana kadar zarları atmaya devam eder. Zarları atmaya devam ederken kendi sayısı yerine 7 atarsa kaybeder. Programda zar atış işlemi için, zar sonuçlarının değerlendirilmesi için ve 4,5,6,8, 9 ve 10 sayılarının gelmesi durumu için ayrı fonksiyonlar tasarlayınız.

Bir fonksiyona istenilen sayıda eleman gönderme Aynı fonksiyona istediğimiz sayıda argüman gönderebiliriz. Bu amaçla “stdarg.h” kütüphane başlık dosyasında tanımlı olan değişken ve metotları kullanırız.

Bir fonksiyona istenilen sayıda eleman gönderme

Makro Fonksiyonlar Makro fonksiyon programcının çok sık kullandığı kod parçasına simgesel isimler vererek tanımlaması ile oluşturulurlar. Makrolar, bir isim ile bu isimin yanında bulunan parantez arasındaki parametreler ve tanımdan oluşurlar. Bu işlem “#define” tanımlaması ile yapılır. Genel formatı: #define MAKRO_ADI (parametre listesi) ifade #define max (x, y) ((x) > (y) ? (x) : (y))

Makro Fonksiyonlar Makrolar karışık olmamalı, tek bir komut ile ifade edilmelidir. Basit makrolar programı büyütebilirler, ancak fonksiyonlardan daha hızlı çalışırlar.

Programlama Dilleri-ders04/ Makro Fonksiyonlar Programlama Dilleri-ders04/

Depolama sınıfları Bir değişken tanımlanırken değişkenin türü, değişkenin ismi ve değişkenin değeri olmak üzere üç özellik tanımlanır. Bu özelliklere ek olarak değişkenlerin depolama sınıfı (storage classes), ömrü (duration) ve faaliyet alanı (scope) kavramları vardır. C programlama dilinde auto, register, static, extern, belirleyicileri ile tanımlanabilecek 4 tür depolama sınıfı vardır. Bu belirleyiciler ile tanımlanan değişkenler ömürleri itibariyle ikiye ayrılırlar. Bunlar otomatik depolama ömürlüler (automatic storage classes) ve durağan depolama ömürlüler (static storage classes) dir.

Depolama sınıfları auto: int a; char b; ... gibi tanımlamakla aynıdır. İşletim sisteminin uygun gördüğü yerde depolanır. static: static int i; bu değişkenin değeri, tanımlandığı fonksiyon tekrar çağırıldığında kaybolmamış olur. Değişken son değerini korur. register: register char ch; eğer bir değişken çok fazla kullanılacaksa register olarak tanıtılarak programın çalışması hızlandırılabilir. Register’a erişim hafızaya erişimden daha hızlıdır. Sadece tam sayı ve karakter tanımlamaları için kullanılabilir. extern: extern int sicaklik; bir dosya için geçerli değişkenlerin diğer dosyalar içinde geçerli hale gelmesi için, dosyaların başına diğer dosyaların global değişkenleri yazılır ve başına " . extern" getirilir

Otomatik depolama ömürlüler (Automatic storage classes) Bu tür değişkenler auto veya register anahtar kelimeleri kullanılarak tanımlanan değişkenlerdir. Bir değişkenin otomatik ömürlü olması; fonksiyon çağırıldığında oluşturulur, işlevi bitince otomatik olarak yok edilir. Sadece değişkenler otomatik ömürlüdürler. Bir fonksiyonun yerel (local) değişkenleri (bunlar fonksiyonun parametre listesinde yada gövdesi içinde tanımlanmış olanlar olabilir) normal olarak bir belirleyici yazılmadığında varsayılan olarak otomatik ömürlüdürler.

Durağan depolama ömürlüler (Static Storage Classes) Bu tür değişkenler ya da fonksiyonlar extern veya static anahtar kelimeleri kullanılarak tanımlanırlar. Bir tanımın durağan depolama ömürlü olması; programın çalışmaya başlaması ile hafızaya yerleştirileceği ve program sonlanana kadar hafızadan silinmeyeceği anlamına gelir. Global değişkenler, global fonksiyonlar ve static anahtar kelimesi ile tanımlanmış olan yerel değişkenler bu sınıf içerisine girerler. Global değişkenler ve fonksiyonlar varsayılan olarak extern tanımlıdırlar. Global değişkenler fonksiyonların dışında tanımlanan değişkenlerdir. Bir değişkenin global olması programın çalıştığı andan itibaren bellekte tutulması anlamına gelir.

Durağan depolama ömürlüler (Static Storage Classes) Global değişkenler ve fonksiyonlar tanılandıkları noktadan programın sonuna kadar her yerde kullanılabilirler. Static anahtar kelimesi ile tanımlanmış olan yerel değişkenler yalnızca tanımlandıkları fonksiyon içerisinde kullanılabilirler ancak otomatik değişkenlere benzemezler. Bu tür değişkenler fonksiyon çalıştığı anda hafızaya yerleşirler ve program bitene kadar bellekte kendileri ve değerleri saklanır. Aynı fonksiyon bir kere daha çalıştırıldığında static olarak tanımlanmış olan değişken, bir önceki çalışmadan kalan değerini kullanmaya devam eder. Bütün durağan ömürlü tanımlanan sayısal değişkenlerin ilk değerleri 0 olarak belirlenir.

Durağan depolama ömürlüler - örnek Bu değişkenin değeri sadece fonksiyon ilk çağırıldığında 10’a atanır. Sonra kaldığı değer fonksiyon her çağrıldığında hatırlanır. void a(void) { int x=10; printf(“%d\n”,x); x++; } void b(void) static int x=10; void main(void) { a(); b(); } a: 10 11 b: 10 11 12 13 14

Faaliyet alanı kuralları (scope rules) Değişkenin geçerli olduğu yani kullanılabileceği program parçasına o değişkenin faaliyet alanı denir. Örneğin bir blok ( { ve } işaretleri arasındaki program parçası) içerisinde tanımlanan yerel değişkenler yalnızca o blok ve o bloğun içerisindeki bloklarda geçerlidir. C programlarında, dosya faaliyet alanı (File scope), blok faaliyet alanı (Block scope) ve fonksiyon faaliyet alanı (Function scope) olmak üzere üç tür faaliyet alanı vardır.

Faaliyet alanları Dosya faaliyet alanı: Blok faaliyet alanı: Bir tanımlama fonksiyonların dışında yapıldığı zaman tanımlanan değişken dosya faaliyet alanına sahiptir. Bunlar tanımlamanın yapıldığı noktadan dosyanın sonuna kadar bütün fonksiyonlar tarafından tanınır ve kullanılırlar. Global değişkenler, fonksiyon tanımlamaları ve fonksiyon prototipleri dosya faaliyet alanına girer. Blok faaliyet alanı: Bir blok içerisindeki bütün bildiriler blok faaliyet alnına sahiptir. Bunların faaliyet alanı blok sonunu gösteren } işaretine kadardır. Bloklar iç içe yazıldığında dıştaki blok içerisindeki değişkenler içteki blok içerisinde de geçerlidir. Dıştaki ve içteki bloklar aynı isimde değişkenlere sahip olabilirler, ancak iç bloktaki değişken dış bloktakini maskeler. Fonksiyon faaliyet alanı: Fonksiyon faaliyet alanı da blok faaliyet alnı gibi düşünülebilir. Fonksiyon parametre listesinde ve gövdesinde tanımlanan değişkenler yalnızca o fonksiyon içerisinde geçerlidirler. Static anahtar kelimesi ile tanımlanmış olan yerel değişkenler programın çalışmasından sonuna kadar bellekte tutulurlar ancak blok faaliyet alanına sahiptirler. Faaliyet alanları değişkenlerin ömürlerinin etkilemez.

faaliyet alanlarına göre değişkenlerin değerlerinin nasıl değiştiğini gösteren bir program

faaliyet alanlarına göre değişkenlerin değerlerinin nasıl değiştiğini gösteren bir program