BİLDİRİM, TANIMLAMA, DEĞİŞMEZLER ve İŞLEVLER

Benzer belgeler
C Programlama Dilininin Basit Yapıları

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

PROGRAMLAMAYA GİRİŞ DERS 2

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

BİLİNİRLİK ALANI ve ÖMÜR, KONTROL DEYİMLERİ

Genel Programlama II

Programlama Dilleri 1. Ders 12: Belirleyiciler ve Niteleyiciler

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

BASİT C PROGRAMLARI Öğr.Gör.Dr. Mahmut YALÇIN

C PROGRAMLAMA DİLİNE GİRİŞ

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

Programlama Dilleri 1. Ders 4: Diziler

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-8 Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

C Programlama Dilinde Değişkenler

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

Döngü (Loop) Deyimleri / Veri Belirleyicileri / Matematiksel Fonksiyonlar

C PROGRAMLAMA D İ L İ

Ders Tanıtım Sunumu. Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı. Öğr. Gör. Murat KEÇECİOĞLU 1

Sınav tarihi : Süre : 60 dak. c) En başta #include<stdio.h> yazılmamıştır. c) zt d) Pi e) X0

B02.6 Karar Verme, Eşitlik ve Bağıntı Operatörleri

Internet Programming II

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

HSancak Nesne Tabanlı Programlama I Ders Notları

Kocaeli Üniversitesi C Bilgisayar Programlama Ara Sınavı Test Soruları

Temel Giriş/Çıkış Fonksiyonları

Bölüm 2 - C ile Programlamaya Giriş

İŞLEVLER ve İŞLEÇLER. İstanbul Üniversitesi Elektrik Elektronik Mühendisliği. Kaynak: C ve Sistem Programcıları Derneği Kurs notu

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

PASCAL PROGRAMLAMA DİLİ YAPISI

Sınav tarihi : Süre : 60 dak.

GENEL GĐRĐŞ-ÇIKIŞ FONKSĐYONLARI. ENF102 Jeoloji 1. #include <stdio.h> printf Fonksiyonu ÖRNEK. printf

Programlamaya Giriş. Program : Belirli bir problemi çözmek için bir bilgisayar dili kullanılarak yazılmış deyimler dizisi.

BÖLÜM 6: KARŞILAŞTIRMALI KONTROL YAPILARI

Dr. Fatih AY Tel: fatihay@fatihay.net

8. İŞARETCİLER (POINTERS)

BMT 101 Algoritma ve Programlama I 6. Hafta. Yük. Müh. Köksal Gündoğdu 1

HSancak Nesne Tabanlı Programlama I Ders Notları

Üst düzey dillerden biri ile yazılmış olan bir programı, makine diline çeviren programa derleyici denir. C++ da böyle bir derleyicidir.

Nesne Yönelimli Programlama

Pointer Kavramı. Veri Yapıları

Program Çözümleme. Aşağıdaki örneklerde printf() ve scanf() fonksiyonlarının işlevleri gösterilmektedir. Liste 1.1. Çözümleme:

BÖLÜM 1b: C++ PROGRAMLAMANIN YAPISI. C++, hard diskte TC, BIN, INCLUDE, LIB gibi alt dizinlere yüklenir.

Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları. Mustafa Kemal Üniversitesi

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 3. Bölüm Veri Tipleri ve Değişkenler

NESNEYE YÖNELİK PROGRAMLAMA

HSancak Nesne Tabanlı Programlama I Ders Notları

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Giriş. ENF102 Jeoloji

Fonksiyonlar (Altprogram)

Biçem Belirteçleri (Format Specifiers)

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

MAK 1005 Bilgisayar Programlamaya Giriş C DİLİNE GİRİŞ. Prof. Dr. Necmettin Kaya

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

Dizgiler. C dilinde karakter m şeklinde tek tırnak içerisinde yazılan ifadelerdir. Bu karakterlerin her biri aslında bir tamsayı ile ifade edilir.

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

Her veri tipine yetecek ve ancak o kadar anabellek alanı ayrılır. Programcı, ana bellekte ayrılacak adresin büyüklüğünü bilerek değişkenlerini

Diziler (Arrays) Çok Boyutlu Diziler

B02.8 Bölüm Değerlendirmeleri ve Özet

Özyineleme (Recursion)

Nesne Tabanlı Programlama

İstanbul Üniversitesi Elektrik Elektronik Mühendisliği GENEL KAVRAMLAR. Kaynak: C ve Sistem Programcıları Derneği Kurs Notu. Öğr.Gör.Dr.

Bölüm 9. Altprogramlar ISBN

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

int printf (const char *format [, argument,...]);

C Programlama printf() Fonksiyonu

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

C Konsol Giriş Çıkış Fonksiyonları

DİZİLER 5/4/2010. ENF-102 Jeoloji Giriş. Tek Boyutlu Diziler. Tek Boyutlu Diziler. Örnek. Örnek

for döngüsü for (başlangıç değeri; şart; artım) ifade; for (başlangıç değeri; şart; artım) { ifadeler; }

Veri Tanımları ve Mantıksal İşlemler

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

Adım Adım C-II. Eksik kalmış konular

PROGRAMLAMA TEMELLER. C Program Yap s

Temel Giriş/Çıkış Fonksiyonları (Devam) Örnek :

BİLGİSAYAR BİLİMİ DERSİ (KUR 1) PYTHON PROGRAMLAMA DİLİ ÇALIŞMA KÂĞIDI - 1

Bir C programı C fonksiyonlarından oluşur. Bunlar arasında main() adı verilen ana fonksiyon daima olmalıdır. C fonksiyonları programı oluşturan

DÖNGÜ DEYİMLERİ (while, do while, for)

Algoritma ve Programlama: Karar Yapıları ve Döngüler

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

1.SORU. Genişlemiş ascii karakterlerinin kodlarını karşılarına yazan C programını

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

Eln 1001 Bilgisayar Programlama I

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

C#(Sharp) Programlama Dili

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Hafta 8 C Dilinde Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

Ders 4: Temel Giriş/Çıkış Fonksiyonları

Göstericiler (Pointers)

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

BİLGİSAYAR MÜHENDİSLİĞİ ALGORİTMA VE PROGRAMLAMA II 2.HAFTA SWİTCH (CASE), SAYAÇLAR, DÖNGÜLER,

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

Bigisayar Programlama

Transkript:

BİLDİRİM, TANIMLAMA, DEĞİŞMEZLER ve İŞLEVLER Kaynak: C ve Sistem Programcıları Derneği Kurs notu Öğr.Gör.Dr. Mahmut YALÇIN

C Dilinin İsimlendirme Kuralları İsimlendirmede yalnızca 63 karakter kullanılabilir. Bunlar: İngiliz alfabesinde yer alan 26 küçük harf karakteri: a,b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z İngiliz alfabesinde yer alan 26 büyük harf karakteri: A,B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z rakam karakterleri 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 alttire (_) (underscore) karakteridir. İsimlendirmelerde yukarıda belirtilen karakterlerin dışında başka bir karakterin kullanılması geçersizdir. Örneğin, boşluk karakterleri, Türkçeye özgü (ç, ğ, ı, ö, ş, ü, Ç, Ğ, İ, Ö, Ş, Ü) karakterler, +, -, /, *, & ya da $ karakterleri bir isimde kullanılamaz. Değişken isimleri rakam karakteriyle başlayamaz. Değişken isimleri alttire '_' karakteriyle başlayabilir. C'nin 32 anahtar sözcüğü isimlendirme amacı ile kullanılamaz. 2

Uzun Değişken İsimleri İsimler boşluk içeremeyeceği için uygulamalarda genellikle boşluk hissi vermek için alttire (underscore) karakteri kullanılır. genel_katsayi_farki, square_total, number_of_cards gibi. İsimlendirmede başka bir seçenek de her sözcüğün ilk harfini büyük, diğer harfleri küçük yazmaktır: GenelKatsayiFarki, SquareTotal, NumberOfCards C dili standartları isim uzunluğu konusunda bir sınırlama koymamıştır. Ancak ismin ilk 31 karakterinin derleyici tarafından dikkate alınmasını zorunlu kılar. Ancak derleyicilerin çoğu, çok daha uzun değişken isimlerini işleme sokabilirler. 31 karakterden daha uzun isimler kullanıldığında programcı için çok az da olsa şöyle bir risk söz konusudur: Herhangi bir derleyici ilk 31 karakteri aynı olan iki farklı ismi aynı isim olarak ele alabilir. İsimlendirmede Nelere Dikkat Edilmeli? İsimlendirme, yazılan programların okunabilirliği açısından da çok önemlidir. İyi yazılmış olan bir programda kullanılan isimlerin dilin kurallarına göre uygun olmalarının dışında, bazı başka özelliklere de sahip olması gerekir: 3

4 1. Seçilen isimler anlamlı olmalıdır. Verilen isimler, değişkenin kullanım amacı hakkında, okuyana bilgi vermelidir. Çoğu zaman, bir değişkenin ismini x, y, z gibi alfabenin harflerinden seçmek kötü bir tekniktir. Tanımlanan değişken, içinde neyin değerini tutacaksa buna yönelik bir isim vermek, kodu okuyanın işini kolaylaştırır, algılamasını hızlandırır. 2. İsimler farklı özelliklere sahip değişkenlerin ait oldukları grubun ismi olarak seçilmemelidir. Örneğin sayaç görevini üstlenen bir değişkenin ismini counter olarak seçmek yerine prime_counter, valid_word_counter vs. olarak seçmek çok daha iyidir. Zira programın içinde birden fazla sayaç bulunabilir. Bunların isimleri, neyi saydıklarına göre değişirse, kodu okuyan kişinin anlamlandırması çok daha kolaylaşır. 3. İsimlendirmede dil bütünlüğü olmalıdır. Yazılımda kullanılan temel dilin İngilizce olduğunu kabul etmek zorundayız. Yazılım projelerinde isimlendirme genellikle İngilizce tabanlı yapılır. Ancak bazı değişkenlerin isimlerinin İngilizce seçilirken bazı başka değişkenlerin isimlerinin Türkçe seçilmesi programın okunabilirliğine zarar verir.

Bildirim Örnekleri int x; unsigned long int var; double MFCS; unsigned _result; signed short total; Tür belirten anahtar sözcüklerin yazılmasından sonra aynı türe ilişkin birden fazla nesnenin bildirimi, isimleri arasına virgül atomu koyularak yapılabilir. Bildirim deyimi yine noktalı virgül atomu ile sonlandırılmalıdır. unsigned char ch1, ch2, ch3, ch4; float FL1, Fl2; unsigned total, subtotal; int _vergi_katsayisi, vergi_matrahi; Farklı türlere ilişkin bildirimler virgüllerle birbirinden ayrılamaz. long x, int y; /* Geçersiz! */ signed ve unsigned sözcükleri tür belirten anahtar sözcük(ler) olmadan yalnız başlarına kullanılabilirler. Bu durumda int türden bir değişkenin bildiriminin yapıldığı kabul edilir: signed x, y; İle signed int x, y; tamamen aynı anlamdadır. 5

Bildirimlerin Kaynak Kod İçindeki Yerleri C dilinde genel olarak 3 yerde değişken bildirimi yapılabilir : 1. Blokların içinde 2. Tüm blokların dışında. 3. İşlevlerin parametre değişkeni olarak, işlev parametre ayraçlarının içinde. C dilinde eğer bildirim blokların içinde yapılacaksa, bildirim işlemi blokların ilk işlemi olmak zorundadır. Başka bir deyişle bildirimlerden önce, bildirim deyimi olmayan başka bir deyimin bulunması geçersizdir. Bir bildirimin mutlaka işlevin ana bloğunun başında yapılması gibi bir zorunluluk yoktur. Eğer iç içe bloklar varsa içteki herhangi bir bloğun başında da yani o bloğun ilk işlemi olacak biçimde, bildirim yapılabilir. Örnekler : int var1, var2; char ch1, ch2, ch3; var1 = 10; float f; /* Geçersiz */ Yukarıdaki örnekte var1, var2, ch1, ch2, ch3 değişkenlerinin tanımlanma yerleri doğrudur. Ancak f değişkeninin bildirimi geçersizdir. Çünkü bildirim deyiminden önce bildirim deyimi olmayan başka bir deyim yer alıyor. Bu durum geçersizdir. 6

Tanımlanan Değişkenlere İlkdeğer Verilmesi Bir değişken tanımlandığında bu değişkene bir ilkdeğer verilebilir (initialize). Bu özel bir sözdizim ile yapılır: int a = 20; İlkdeğer verme deyimi bir atama deyimi değildir, bir bildirim deyimidir. Bu deyim ile, programın çalışma zamanında bir değişkenin önceden belirlenen bir değer ile hayata başlaması sağlanır. Yukarıdaki bildirimi gören derleyici a değişkenini 20 değeri ile başlatacak bir kod üretir. İlkdeğer verme deyiminde atama işlecinin sağ tarafında kullanılan ifadeye "ilkdeğer verici" (initializer) denir. Bir bildirim deyimi ile birden fazla değişkene de ilkdeğer verilebilir: int a = 10, b = 20, c = 30; Yukarıdaki deyimle a değişkenine 10, b değişkenine 20, c değişkenine 30 ilkdeğerleri veriliyor. İlkdeğer verme deyimi bir atama deyimi değildir: void func() int a; a = 20; int b; /* Geçersiz! */ /****/ Yukarıdaki kod parçasında b değişkeninin tanımı geçersizdir. 7

DEĞİŞMEZLER Veriler ya nesnelerin içinde ya da doğrudan değişmez (sabit - constant) biçiminde bulunur. Değişmezler nesne olmayan, programcı tarafından doğrudan sayısal büyüklük olarak girilen verilerdir. Değişmezlerin sayısal değerleri derleme zamanında tam olarak bilinir. Örneğin: x = y + z; ifadesi bize y ve z içindeki değerlerin toplanacağını ve sonucun x değişkenine aktarılacağını anlatır. Oysa d = x + 10; ifadesinde x değişkeni içinde saklanan değer ile 10 sayısı toplanmıştır. Burada 10 sayısı herhangi bir değişkenin içindeki değer değildir, doğrudan sayı biçiminde yazılmıştır. Tamsayı Değişmezleri Tamsayı değişmezlerinin (integer constants) değerleri tamsayıdır. Bir tamsayı değişmezi signed int unsigned int signed long unsigned long türlerinden olabilir. Bir tamsayı değişmezinin türü, yazımında kullanılan sayı sistemine ve değişmezin aldığı soneke göre belirlenir. 8

Karakter Değişmezleri Karakter değişmezleri tipik olarak char türden nesnelere atanan değişmezlerdir. Karakter değişmezleri C'de farklı biçimlerde bulunabilir. i. Bir karakterin görüntüsü tek tırnak (single quote) içinde yazılırsa derleyici tarafından doğrudan karakter değişmezi olarak ele alınır. Örnek : 'a' 'J' 'Ç' ':' '8' '<' Yukarıdaki atomların her biri birer karakter değişmezidir. C'de tek tırnak içinde yazılan char türden değişmezler, aslında o karakterin (kullanılan sistemin karakter kodundaki (örneğin ASCII)) kod numarasını gösteren bir tamsayıdır. char ch; ch = 'a'; /***/ ASCII karakter kodlamasının kullanıldığını düşünelim. Bu örnekte aslında ch isimli char türden bir değişkene 'a' karakterinin ASCII tablosundaki kod numarası olan 97 değeri aktarılır. 9

Ters Bölü Karakter Değişmezleri Karakter değişmezlerinin diğer yazımlarında tek tırnak içinde ters bölü '\' karakteri ve bunu izleyen başka karakter(ler) kullanılır. Tek tırnak içindeki ters bölü karakterinden sonra yer alan bazı karakterler çok kullanılan bazı karakterlerin yerlerini tutar. Bunların listesi aşağıda veriliyor: Önceden Tanımlanmış Ters Bölü Karakter Değişmezleri 10

İŞLEVLER (FONKSİYONLAR) İşlev Nedir? C'de alt programlara işlev (function) denir. İngilizcedeki "function" sözcüğü bu bağlamda matematiksel anlamıyla değil diğer programlama dillerinde ya da ortamlarında kullanılan, "alt program", "prosedür", sözcüklerinin karşılığı olarak kullanılır. Bir işlev, bağımsız olarak çalıştırılabilen bir program parçasıdır. Programı İşlevlere Bölerek Yazmanın Faydaları Bir programı alt programlara yani işlevlere bölerek yazmak bazı faydalar sağlar: 1. Programın kaynak kodu küçülür. Böylece oluşturulması hedeflenen çalışabilir dosya da (örneğin.exe uzantılı dosya) küçülür. 2. Kaynak dosyanın okunabilirliği artar. Okunabilirliğin artması, kodu yazanın ve okuyanın işini kolaylaştırır. Böylece proje geliştirme süresinin azalması yönünde kazanım sağlanmış olur. 3. Belirli kod parçalarının programın farklı yerlerinde yinelenmesi, programda yapılacak olası bir değişikliğin maliyetini artırır. Programın farklı yerlerinde, kodun kullanıldığı yere bağlı olarak değişiklikler yapmak gerekir. Kaynak dosyalarda böyle değişiklikler yapmak hem zaman alıcıdır hem de risklidir. Çünkü bir değişikliğin yapılmasının unutulması durumunda ya da değişiklik yapılmaması gereken bir yerde kodun değiştirilmesi durumunda program yanlış çalışabilir. Oysa ortak kod parçaları işlevler şeklinde paketlendiğinde, yalnızca işlevlerde değişiklik yapılmasıyla, istenen değişiklik gerçekleştirilmiş olur. 11

4. Programda hata arama daha kolay gerçekleştirilir. Projelerdeki hata arama maliyeti azalır. 5. Yazılan işlevler başka projelerde de kullanılabilir. Alt programlar tekrar kullanılabilir (reusable) bir birim oluştururlar. Böylelikle de projelerdeki kodlama giderlerini azaltırlar. İşlevler C'nin temel yapı taşlarıdır. Çalıştırılabilen bir C programı en az bir C işlevinden oluşur. Bir C programının oluşturulmasında işlev sayısında bir kısıtlama yoktur. İşlevlerin onları çağıran işlevlerden aldıkları girdileri ve yine onları çağıran işlevlere gönderdikleri çıktıları vardır. İşlevlerin girdilerine aktüel parametreler (actual parameters) ya da argümanlar (arguments) denir. İşlevlerin çıktılarına ise geri dönüş değeri (return value) diyoruz. Bir işlev başlıca iki farklı amaçla kullanılabilir: 1. İşlev, çalışması süresince belli işlemleri yaparak belirli amaçları gerçekleştirir. 2. İşlev, çalışması sonunda üreteceği bir değeri kendisini çağıran işleve gönderebilir. 12

İşlevlerin Tanımlanması ve Çağrılması Bir işlevin ne iş yapacağının ve bu işi nasıl yapacağının C dilinin sözdizimi kurallarına uygun olarak anlatılmasına, yani o işlevin C kodunun yazılmasına, o işlevin tanımı (definition) denir. İşlev tanımlamaları C dilinin sözdizimi kurallarına uymak zorundadır. Bir işlev çağrısı (call / invocation) ise o işlevin kodunun çalışmaya davet edilmesi anlamına gelir. İşlev çağrı ifadesi karşılığında derleyici, programın akışını ilgili işlevin kodunun bulunduğu bölgeye aktaracak şekilde bir kod üretir. Programın akışı işlevin kodu içinde akıp bu kodu bitirdiğinde, yani işlevin çalışması bittiğinde, programın akışı yine işlevin çağrıldığı noktaya geri döner. Bir işleve yapılacak çağrı da yine bazı sözdizimi kurallarına uymalıdır. İşlevlerin Tanımlanması İşlevlerin kodunun yazılması için tanımlama (definition) terimi kullanılır. C'de işlev tanımlama işleminin genel biçimi şöyledir: [Geri dönüş değerinin türü] <işlev ismi> ([parametreler]) /***/ 13

[Geri dönüş değerinin türü] <işlev ismi> ([parametreler]) /***/ Yukarıdaki gösterimde bulunması zorunlu sözdizim elemanları açısal ayraç içinde, bulunması zorunlu olmayan sözdizim elemanları ise köşeli ayraç içinde belirtilmiştir. Tanımlanan işlevler en az bir blok içermelidir. Bu bloğa işlevin ana bloğu denir. Ana blok içinde istenildiği kadar iç içe blok yaratılabilir. Aşağıdaki işlev tanımından func isimli işlevinin parametre almadığı ve geri dönüş değerinin de double türden olduğu anlaşılır. double func() Yukarıdaki tanımı inceleyin. Önce işlevin geri dönüş değerinin türünü gösteren anahtar sözcük yazılır. Bildirim ve tanımlama konusunda anlatılan C'nin doğal türlerini belirten anahtar sözcük(ler) ile işlevin hangi türden bir geri dönüş değeri ürettiği belirtilir. Yukarıda tanımlanan func isimli işlevin geri dönüş değeri double türdendir. 14

void Anahtar Sözcüğü Tanımlanan bir işlevin bir geri dönüş değeri üretmesi zorunlu değildir. İşlev tanımında bu durum geri dönüş değerinin türünün yazıldığı yere void anahtar sözcüğünün yazılmasıyla anlatılır: void func() Yukarıda tanımlanan func işlevi geri dönüş değeri üretmiyor. Geri dönüş değeri üretmeyen işlevlere void işlevler denir. İşlev tanımında geri dönüş değerinin türü bilgisi yazılmayabilir. Bu durum, işlevin geri dönüş değeri üretmediği anlamına gelmez. Eğer geri dönüş değeri tür bilgisi yazılmaz ise, C derleyicileri tanımlanan işlevin int türden bir geri dönüş değerine sahip olduğunu varsayar. Örneğin: func() Yukarıda tanımlanan func işlevinin geri dönüş değerinin türü int türüdür. Yani işlevin yukarıdaki tanımıyla int func() tanımı arasında derleyici açısından bir fark yoktur. 15

İşlevlerin Tanımlanma Yerleri C dilinde bir işlev tanımı içinde bir başka işlev tanımlanamaz. Yani içsel işlev tanımlamalarına izin verilmez. Örneğin aşağıdaki gibi bir tanımlama geçersizdir, çünkü func işlevi tanımlanmakta olan foo işlevinin içinde tanımlanıyor: double foo() /***/ int func() /* Geçersiz */ /***/ /***/ Tanımlamanın aşağıdaki biçimde yapılması gerekirdi: double foo() /***/ int func() /***/ 16

İşlevlerin Geri Dönüş Değerlerinin Oluşturulması C dilinde işlevlerin geri dönüş değerleri return deyimi (return statement) ile oluşturulur. return deyiminin iki ayrı biçimi vardır: return; Ya da return anahtar sözcüğünü bir ifade izler: return x * y; return anahtar sözcüğünün yanındaki ifadenin değeri, geri dönüş değeri olarak, işlevi çağıran kod parçasına iletilir. return ifadesinin değişken içermesi bir zorunluluk değildir. Bir işlev bir değişmez değerle de geri dönebilir. return 1; return deyiminin bir başka işlevi de içinde bulunduğu işlevi sonlandırmasıdır. Bir işlevin kodunun yürütülmesi sırasında return deyimi görüldüğünde işlevin çalışması sona erer. int func() /**/ return x * y; 17

Bazı programcılar return ifadesini bir ayraç içinde yazarlar. Bu ayraç return deyimine ek bir anlam katmaz. Yani return x * y; gibi bir deyim return (x * y); biçiminde de yazılabilir. Okunabilirlik açısından özellikle uzun return ifadelerinde ayraç kullanımı salık verilir. return (a * b - c * d); Geri dönüş değeri üretmeyen işlevlerde, yani void işlevlerde, return anahtar sözcüğü yanında bir ifade olmaksızın tek başına da kullanılabilir: return; Bu durumda return deyimi içinde yer aldığı işlevi, geri dönüş değeri oluşturmadan sonlandırır. C dilinde işlevler yalnızca tek bir geri dönüş değeri üretebilir. Bu da işlevlerin kendilerini çağıran işlevlere ancak bir tane değeri geri gönderebilmeleri anlamına gelir. 18

main İşlevi main de diğer işlevler gibi bir işlevdir, aynı tanımlama kurallarına uyar. C programlarının çalışması, ismi main olan işlevden başlar. C programları özel bir işlem yapılmamışsa, main işlevinin çalışmasının bitişiyle sonlanır. main işlevine sahip olmayan bir kaynak dosyanın derlenmesinde bir sorun çıkmaz. Ancak bağlama (linking) aşamasında bağlayıcı main işlevinin bulunmadığını görünce bağlama işlemini gerçekleştiremez. Bağlayıcı programlar bu durumda bir hata iletisi verir. int main() return 0; Biçiminde tanımlanmış bir main işlevi de int türden bir değer döndürmelidir. main işlevinin ürettiği geri dönüş değeri, programın çalışması bittikten sonra işletim sistemine iletilir. Geleneksel olarak, main işlevinin 0 değerine geri dönmesi programın sorunsuz bir şekilde sonlandırıldığı anlamına gelir. main işlevinin 0 dışında bir değere geri dönmesi ise, kodu okuyan tarafından programın başarısızlıkla sona erdirildiği biçiminde yorumlanır. Yani bazı nedenlerle yapılmak istenenler yapılamamış, bu nedenle main işlevi sonlandırılmıştır. 19

İşlevlerin Çağrılması C dilinde bir işlev çağrısı (function call - function invocation), ismi işlev çağrı işleci olan bir işleç ile yapılır. İşlev çağrı işleci olarak () atomları kullanılır. Çağrılacak işlevin ismi bu işleçten önce yazılır. func(); Yukarıda deyim ile func isimli işlev çağrılır. Bir işlev çağrıldığı zaman programın akışı, işlevin kodunun yürütülmesi için bellekte işlevin kodunun bulunduğu bölgeye atlar. İşlevin kodunun çalıştırılması işlemi bittikten sonra da akış yine çağıran işlevin kalınan yerinden sürer. İşlevin geri dönüş değeri bir değişkene atanabileceği gibi doğrudan aritmetik işlemlerde de kullanılabilir. Örneğin: sonuc = hesapla(); Yukarıdaki örnekte önce hesapla() işlevi çağrılır, daha sonra işlevin kodunun çalıştırılmasıyla elde edilen geri dönüş değeri sonuc değişkenine atanır. İşlev çağrı ifadeleri nesne göstermez yani sol taraf değeri (L value) değildir. Yani C dilinde aşağıdaki gibi bir atama deyimi geçersizdir: func() = 5; /* Geçersiz */ İşlevlerin geri dönüş değerleri sağ taraf değeridir. sonuc = func1() + func2() + x + 10; İşlevler, ancak tanımlanmış işlevlerin içinden çağrılabilirler. Blokların dışından işlev çağrılamaz. 20

İşlev Parametre Değişkenlerinin Tanımlanması İşlevler çağrıldıkları yerlerden alacakları bilgileri, işlev çağrı ifadeleri ile alırlar. Bir işlevin formal parametreleri (formal parameters) ya da parametre değişkenleri, işlevlerin kendilerini çağıran işlevlerden aldıkları girdileri tutan değişkenleridir. Bir işlevin parametre sayısı ve bu parametrelerin türleri gibi bilgiler, işlevlerin tanımlanması sırasında derleyiciye bildirilir. İşlev çağrısı ile gönderilen argüman ifadelerin değerleri, işlevin ilgili parametre değişkenlerine kopyalanır. Örneğin bir küpün hacmini hesaplayan işlev, çağrıldığı yerden bir küpün kenar uzunluğunu alacağına göre, bu değerin kopyalanması için, bir parametre değişkenine sahip olması gerekir. Benzer şekilde iki sayıdan daha büyük olanını bulan bir işlevin iki tane parametre değişkenine sahip olması gerekir. İşlev parametre değişkenlerinin bildirimi işlev ayraçlarının içinde yalnızca bir kez yapılır. Bu biçimde, işlevin ayraçlarının içine parametre değişkenin türü ve yanına da ismi yazılır. Eğer birden fazla işlev parametre değişkeni varsa bunlar virgüllerle ayrılır, ancak her bir değişkenin tür bilgisi yeniden yazılır. 21

Örnek : int func(int x, int y) /***/ double foo(double a, int b) /***/ İşlev parametre değişkenleri aynı türden olsa bile her defasında tür bilgisinin yeniden yazılması zorunludur. Örneğin: int foo (double x, y) /* Geçersiz */ /***/ bildirimi hatalıdır. Doğru tanımlama aşağıdaki biçimde olmalıdır: int foo (double x, double y) /***/ 22

Argümanların Parametre Değişkenlerine Kopyalanması Bir işlevin parametre değişkenleri, o işlevin çağrılma ifadesiyle kendisine gönderilen argümanları tutacak olan yerel değişkenlerdir. Örnek: void func(int a) /***/ int main() int x = 10; /***/ func (x); return 0; Yukarıdaki örnekte main işlevi içinde, func isimli işlev çağrılıyor ve çağrılan işleve x isimli değişkenin değeri argüman olarak geçiliyor. İşlev çağrısı, programın çalışma zamanında, programın akışının func işlevinin kodunun bulunduğu yere sıçramasına neden olur. func işlevindeki a isimli parametre değişkeni için bellekte bir yer ayrılır ve a parametre değişkenine argüman olan ifadenin değeri, yani x değişkeninin değeri atanır. Yani int a = x; işleminin derleyicinin ürettiği kod sonucu otomatik olarak yapıldığı söylenebilir. 23

int add(int a, int b) return a + b; int main() int x = 100, y = 200, z; z = add(x, y); /***/ return 0; Yukarıda tanımlanan add işlevi çağrıldığında programın akışı bu işleve geçmeden önce, x ve y değişkenlerinin içinde bulunan değerler, add işlevinin parametre değişkenleri olan a ve b'ye kopyalanır. 24

Standart C İşlevleri Standard C işlevleri, C dilinin standartlaştırılmasından sonra, her derleyicide bulunması zorunlu hale getirilmiş işlevlerdir. Yani derleyicileri yazanlar standart C işlevlerini kendi derleyicilerinde mutlaka tanımlamak zorundadırlar. Bu durum C dilinin taşınabilirliğini (portability) artıran ana etmenlerden biridir. Örneğin printf işlevi standart bir C işlevidir. Yani printf işlevi her derleyici paketinde aynı isimle bulunmak zorundadır. Standart C işlevlerinin derlenmiş kodları özel kütüphanelerin içindedir. Başlık dosyaları içinde, yani uzantısı.h biçiminde olan dosyaların içinde standart C işlevlerinin bildirimleri bulunur. İşlev bildirimi konusu ileride ayrıntılı bir biçimde incelenecek. Neden Standart İşlevler Bazı işlevlerin bulunmasının dilin standartları tarafından güvence altına alınması ile aşağıdaki faydalar sağlanmış olur. i) Bazı işlemler için ortak bir arayüz sağlanmış olur. Mutlak değer hesaplayan bir işlevi yazmak çok kolaydır. Ancak standart bir C işlevi olan abs işlevinin kullanılmasıyla ortak bir arayüz sağlanır. Her kaynak kod kendi mutlak değer hesaplayan işlevini tanımlamış olsaydı, tanımlanan işlevlerin isimleri, parametrik yapıları farklı olabilirdi. Bu durum da kod okuma ve yazma süresini uzatırdı. 25

Neden Standart İşlevler (Devam...) ii) Bazı işleri gerçekleştirecek işlevlerin kodları sistemden sisteme farklılık gösterebilir. Bu da kaynak dosyanın taşınabilirliğini azaltır. Bu işlemleri yapan standart işlevlerin tanımlanmış olması kaynak kodun başka sistemlere taşınabilirliği artırır. iii) Bazı işlevlerin yazılması belirli bir alanda bilgi sahibi olmayı gerektirebilir. Örneğin bir gerçek sayının bir başka gerçek sayı üssünü hesaplayan bir işlevi verimli bir şekilde yazabilmek için yeterli matematik bilgisine sahip olmak gerekir. iv) Sık yapılan işlemlerin standart olarak tanımlanmış olması, programcının yazacağı kod miktarını azaltır. Böylece proje geliştirme süresi de kısalır. v) Derleyicilerin sağladığı standart işlevler çok sayıda programcı tarafından kullanılmış olduğu için çok iyi derecede test edilmişlerdir. Bu işlevlerin tanımlarında bir hata olma olasılığı, programcının kendi yazacağı işlevlerle kıyaslandığında çok düşüktür. İyi bir C programcısının C dilinin standart işlevlerini çok iyi tanıması ve bu işlevleri yetkin bir şekilde kullanabilmesi gerekir. 26

printf İşlevi printf standart bir C işlevidir. printf işlevi ile ekrana bir yazı yazdırılabileceği gibi, bir ifadenin değeri de yazdırılabilir. Değişkenlerin içindeki değerler aslında bellekte ikilik sistemde tutulur. Bir değişkenin değerinin ekrana, hangi sayı sisteminde ve nasıl yazdırılacağı programcının isteğine bağlıdır. Değişkenlerin değerlerinin ekrana yazdırılmasında standart printf işlevi kullanılır. printf aslında çok ayrıntılı özelliklere sahip bir işlevdir. printf işlevlerle ilgili yukarıda açıklanan genel kurallara uymaz. printf işlevi değişken sayıda parametreye sahip bir işlevdir. Bir işlevin kaç tane parametre değişkeni varsa o işlev çağrıldığında, işleve o kadar argüman geçilmelidir ama printf işlevine istenen sayıda argüman geçilebilir. Bu işleve kaç tane argüman geçilirse işlevin o kadar sayıda parametre değişkenine sahip olacağı düşünülebilir. printf işlevine ilk gönderilen argüman genellikle çift tırnak içinde yer alan bir yazıdır. Çift tırnak içinde yer alan böyle yazılara dizge (string) denir. printf işlevine argüman olarak geçilen dizge içinde yer alan tüm karakterler ekrana yazılır. Ancak printf işlevi dizge içindeki % karakterini ve bunu izleyen belirli sayıda karakteri ekrana yazmaz. İşlev, dizge içindeki % karakterlerini yanındaki belirli sayıda karakter ile birlikte formatlama karakterleri (conversion specifiers) olarak yorumlar. 27

printf İşlevi (devam...) Formatlama karakterleri, çift tırnaktan sonra yazılan argümanlarla bire bir eşleştirilir. Formatlama karakterleri önceden belirlenmiştir, kendileriyle eşlenen bir ifadenin değerinin ekrana ne şekilde yazdırılacağı bilgisini işleve aktarırlar. Bu format bilgisi Argüman olan ifadenin hangi türden olarak yorumlanacağı İfadenin değerinin ekrana hangi sayı sistemi kullanılarak yazılacağı İfadenin kaç karakterlik bir alana yazdırılacağı Pozitif tamsayıların yazımında '+' karakterinin yazdırılıp yazdırılmayacağı Gerçek sayıların yazımında üstel notasyonun kullanılıp kullanılmayacağı Gerçek sayıların yazımında noktadan sonra kaç basamağın yazılacağı gibi açıklamalardır. Aşağıdaki programı inceleyin: #include <stdio.h> int main() int x = 25; double pi = 3.1415; printf("x = %d\npi = %lf\n", x, pi); return 0; 28

printf İşlevi (devam...) main işlevi içinde yapılan printf("x = %d\npi = %lf\n", x, pi); çağrısında işleve gönderilen birinci argüman olan çift tırnak içindeki yazıda iki ayrı format dizgesi kullanılıyor: %d ve %lf. %d format karakterleri ikinci argüman olan x ile, %lf format karakterleri ise 3. argüman olan pi ile eşleniyor. Format karakterleri ile eşlenen ifadelerin değerleri, istenen formatlama özellikleri ile ekrana yazılır. Örneğin yukarıdaki çağrıyla ekrana x = 25 pi = 3.141500 yazısı yazdırılır. Aşağıda formatlama karakterlerinden bazılarının anlamı veriliyor. 29

scanf İşlevi scanf işlevi, klavyeden her türlü bilginin girişine olanak tanıyan standart bir C işlevidir. scanf işlevi de printf işlevi gibi aslında çok ayrıntılı, geniş kullanım özellikleri olan bir işlevdir. Ancak bu noktada scanf işlevi yüzeysel olarak ele alınacak. scanf işlevinin de birinci parametresi bir dizgedir. Ancak bu dizge yalnızca klavyeden alınacak bilgilere ilişkin format karakterlerini içerir. printf işlevinde olduğu gibi scanf işlevinde de bu format karakterleri önceden belirlenmiştir. % karakterinin yanında yer alırlar. scanf işlevinin kullandığı format karakterlerinin printf işlevinde kullanılanlar ile hemen hemen aynı olduğu söylenebilir. Yalnızca gerçek sayılara ilişkin format karakterlerinde önemli bir farklılık vardır. printf işlevi %f formatı ile hem float hem de double türden verileri ekrana yazabilirken scanf işlevi %f format karakterini yalnızca float türden veriler için kullanır. double türü için scanf işlevinin kullandığı format karakterleri %lf şeklindedir. scanf işlevinin format kısmında format karakterlerinden başka bir şey olmamalıdır. printf işlevi çift tırnak içindeki format karakterleri dışındaki karakterleri ekrana yazıyordu, ancak scanf işlevi format karakterleri dışında dizge içine yazılan karakterleri ekrana basmaz, bu karakterler tamamen başka anlama gelir. Bu nedenle işlevin nasıl çalıştığını öğrenmeden bu bölgeye format karakterlerinden başka bir şey koymayın. Buraya konulacak bir boşluk bile farklı anlama gelir. 30

scanf İşlevi (devam...) #include <stdio.h> int main() int x, y; printf("iki sayı girin : "); scanf("%d%d", &x, &y); printf("%d + %d = %d\n", x, y, x + y); return 0; Yukarıdaki örnekte, programı kullanan kişiye değer girmesinin beklendiğini söyleyen bir yazı, printf işleviyle ekrana yazdırılıyor. Bu iş scanf işlevi ile yapılmazdı. scanf işlevi ile ekrana bir yazı yazdırmak mümkün değildir. scanf yalnızca giriş amacıyla tanımlanmış bir işlevdir, çıkış işlemi yapmaz. scanf("%d%d", &x, &y); çağrısı ile programın çalışma zamanında klavyeden girilecek değerler x ve y değişkenlerine aktarılır. x ve y değişkenleri için onluk sayı sisteminde klavyeden giriş yapılır. Giriş arasına istenildiği kadar boşluk karakteri konulabilir. Yani ilk sayıyı girdikten sonra SPACE, TAB ya da ENTER tuşuna bastıktan sonra ikinci değer girilebilir. Örneğin: 5 60 biçiminde bir giriş, geçerli olacağı gibi; 5 60 biçiminde bir giriş de geçerlidir. scanf işlevine gönderilecek diğer argümanlar & adres işleci ile kullanılır. & bir gösterici işlecidir. 31

TO BE CONTINUED... 32