C derleyicisinin içeriği C derleyicileri hız ve verimlilikler assembly diline yakın bir kod üretirler. Ancak, bunun yanı sıra, yüksek seviyeli bir dilin özelliklerini de içerirler C derleyicileri, birleşik nesneler üzerinde işlem yapmaz ( C++ bu konuda farklılaşmıştır), Giriş-Çıkış olanakları sunmaz, dosya erişim yöntemleri sağlamaz. Tüm bu yüksek seviyeli mekanizmalar, ayrıca çağrılacak bir standart fonksiyonlar kütüphanesi ile sağlanır.
Bir C yazılımının içeriği Önişlemci Yönergeleri Genel tanımlamalar Yerel tanımlamalar ifadeler
Her C programı Genel tanımlamalar bölümü ve bir yada birden fazla fonksiyondan oluşur. Genel tanımlamalar bölümü programın başında bulunur ve programın tüm parçalarında kullanılabilir. Her C programı mutlaka en azından bir main fonksiyonu içermelidir. (Kütüphane fonksiyonu derlemeleri hariç) main fonksiyonu programın giriş bölümüdür. Program içindeki main ve diğer fonksiyonlar, tanımlama bölümleri (declaration) ve ifade (statement) bölümlerinden oluşurlar. Fonksiyon içindeki tanımlama bölümleri, yalnızca o fonksiyon içinde kullanılabilecek verileri tanımlar. Bunlara yerel tanımlamalar denir. İfade bölümü, bilgisayarın yapması gereken işleri tanımlar.
Preprocessor Direktifleri Yazılım içinde Önişlemci tarafından işlenen özel komutlar, programın nasıl derleneceğini açıklar (örneğin include direktifi, programın derlenebilmesi için header dosyaları seçili kütüphane dosyalarındaki bilgilere ve fonksiyonlara ihtiyaç duyulacağını anlatır. örneğin <stdio.h>).
İlk C programı /* C dilinde ilk program*/ # include <stdio.h> Global Declaration main (void) { Local declaration printf ( Merhaba Dünya! \n ); Statements return 0; } C dilindeki ilk programın çıktısı : Merhaba Dünya
Açıklamalar (Comments-Program Notları) Bazen kodun anlamı tam olarak açık değildir. Eğer programı yazan kişi kod içerisinde açıklamalar yaparsa, kodu okuyana faydalı olacaktır. Derleyici, programı çalıştırılabilir bir koda dönüştürürken bu açıklama kısımlarını dikkate almayacaktır. Açıklamaları tanıtabilmek için, C açıklama başlatma/* ve açıklama sonlandırma */ atomlarını kullanır. Tek bir satırda verilen açıklamalar için açıklamanın başına yalnızca // karakterini koymak yeterlidir. Bu karakterden sonraki tüm satır açıklama olarak değerlendirilecektir.
Açıklama Örnekleri /* Bu bir açıklamadır */ /* Bu iki satırlık bir açıklamadır */ /* Bu birden fazla satırlık bir açıklamadır /* A=b+c; /* A, b ve c nin toplamıdır. */ A=b+c; // A, b ve c nin toplamıdır.
Açıklamalar programın herhangi bir yerinde olabilir İyi bir programlamada, Program, amacı, gidileri ve çıktıları ifade eden, açıklamalarla başlar. Açıklamalar, kodun algılanmasını artıracak her yere koyulabilir. İç içe açıklamalara izin verilmez.
/* deneme /*...*/...*/ İzin verilmez. İhmal edilir Kapatma atomu
/* İlk Program. Bu program basit bir C programının bazı bileşenlerini temsil etmektedir. Yazan : isminizi buraya yazın Yazma Tarihi : programın yazıldığı tarih */ #include <stdio.h> int main ( void ) { /* Yerel Tanımlamalar */ /* İfadeler */ printf( Merhaba!\n" ) ; return 0 ; } /* main */
Tanıtıcılar Tanıtıcılar, program içinde verileri ve diğer nesneleri tanımlamamızı sağlarlar. Bilgisayardaki her bir veri, tekil bir adreste saklanır Tanıtıcılar kullandığımızda, adreslerle uğraşmak zorunda kalmayız. Derleyiciler adresleri bizim için otomatik olarak takip edecektir. C dilinde, yalnızca aşağıdaki semboller isimlendirmede kullanılabilir : A dan Z ye kadar büyük ve küçük harfler, 0 dan 9 a kadar rakamlar ve altçizgi _ karakteri. Genellikle, ilk karakter olarak alt çizgi kullanılması tercih edilmez, çünkü çoğunlukla kütüphane fonksiyonlarında kullanılan tanıtıcılar bunları kullanır.
Tanıtıcı kuralları İlk karakter alfabetik yada altçizgi olmalıdır.. Alfabetik karakterler, sayılar ve altçizgiden oluşur (Türkçe karakterler kullanılamaz). Tanıtıcının yalnızca ilk 31 karakteri değerlendirilir, gerisi dikkate alınmaz. Anahtar kelimeler yada reserve edilmiş kelimeler kullanılamaz ( main, include, printf & scanf vb..). C küçük büyük harf duyarlıdır, Örneğin Bilgi bilgi.
Geçerli ve Geçersiz isim örnekleri Geçerli İsimler Geçersiz isimler a a1 $sum /* $ geçersiz */ student_name stdntnm 2names /* 2 ile başlıyor */ _asystemname _anthrsysnm stdnt Nmbr /* Boşluk olmamalı*/ TRUE FALSE int /* reserve kelime */
Veri Tipleri type, değerler ve bu değerler üzerine uygulanan işlemler tanımlar. type ile verilen değerler kümesi tipin tanımladığı türler olarak bilinir. C 4 değişik standart tip tanımlar : void char (character kısıltması) int (integer kısaltması) float (floating point (kayan noktalı sayılar) için kısaltma)
Standart Veri Tipleri Standart veri türleri daha küçük alt-tip lere bölünemez. Ancak, standart tipler daha karmaşık türemiş veri tipleri üretmek için kullanılmaz. (pointer, array, union vb..).
void void türü hiçbir değer ve işlem olmaz. Değerler ve işlemler kümesi boştur. integer Kesir kısmı olmayan sayılardır: Tam sayılar. C üç değişik tamsayı türünü tanımlar : short int int long int
Integer Türleri (int)
Tipik Integer Boyutları Type Sign Byte Size Number of bits Minimum value Maximum value short int int long signed unsigned signed unsigned signed unsigned 2 16-32,768 0 2 16-32,768 0 4 32-2,147,483,648 0 32,767 65,535 32,767 65,535 2,147,483,647 4,294,967,295 1. Eğer integer işaretliyse, bir biti işaret için kullanılır (0 pozitif, 1 negatiftir). 2. İşaretsiz tamsayılar bu nedenle, aynı boyuttaki tam sayılara göre iki kat daha büyük değer alırlar.
sizeof ( ) Operatorü Ctanıtıcıların byte cinsinden boyutunu veren, sizeof, isimli bir operatöre sahiptir. ANSI / ISO C aşağıdaki durumun sağlanmasını ister : sizeof (short int) <= sizeof (int) <= sizeof (long int)
Bir karakter bir small integer (0 ile 255 arası) olarak yorumlanabilir. Bu nedenle C char tanımını sıklıkla bir tamsayı olarak değerlendirir. char, başına unsigned terimi eklendiğinde byte karşılığı olarak değerlendirilebilir. Örnekler : Character a x ASCII kod değeri 97(decimal) yada 01100001(binary) 120(decimal) yada 01111000(binary)
Kayan Nokta(Floating point) Kayan noktalı sayı, kesir kısmına sahip sayı olarak tanımlanır. Örnegin 65.32 C üç değişik türde kayan noktalı veri türüne sahiptir. : float, double, long double. sizeof (float) <= sizeof (double) <= sizeof (long double). Floating-point daima işaretlidir.
Tipik Floating-Point boyutları Type Byte Size Number of Bits float 4 32 double 8 64 long double 10 80
Floating-Point Türleri
Tür Özeti void character integer float void char unsigned short int; unsigned int; unsigned long int short int; int; long int Float; double; long double Herbir karakterin bellekte kapladığı yer, türüne göre farklıdır.
C de Mantıksal veri türü Bir mantıksal veri türü, TRUE (Doğru) yada FALSE (Yanlış) değerlerinden birini alabilir. C dilinde mantıksal veri türü yoktur. C de mantıksal veriler tamsayı (integer) türleri ile ifade edilebilir. Burada 0 FALSE, Sıfırdan farklı herhangi bir değer TRUE değerine karşı düşer.
Değişkenler Değişkenler, isim verilmiş bellek bölgeleridir ve int, float yada char gibi türlerdedir. Bir değişken atanan türüne göre boyuta sahip olacaktır. Değişkenler belirli türlere sahip olduklarında bu türler üzerinde işlem yapabilecek operasyonlar mevcuttur. Her bir değişken tanımlanmalı ve deklare edilmelidir.
Değişkenler C dilinde, bir deklarasyon bir nesneyi isimlendirmek için kullanılır. Tanımlamalar, nesneyi oluşturmak için kullanılır. Bir değişken aynı zamanda deklare edilebilir ve tanımlanabilir. Bir değişken oluşturulduğunda, deklarasyon, değişkene sembolik bir isim verirken, tanımlama değişkene bellekte yer ayırır. Bir defa tanımlandığında değişkenler, program için gerekli veriyi tutarlar.
Variables in Memory Bellekteki veriye, adresleri kullanılarak değil, sembolik isimleri kullanılarak erişilir.
Değişkenlerin Tanımlanması Bir değişkenin türü char, int, ve float gibi void haricinde tanımlanabilir. Bir değişkeni yaratabilmek için, türü ve tanıtıcısını vermelisiniz. : float fiyat; int sayi; char deger;
Değişken tanımlama örnekleri short int maxitem; /* Word separator : Capital */ long int national_debt; /* Word separator : underscore */ float payrate; /* Word separator : Capital */ double tax; char code, kind; /* Poor style : multiple variables */ Int a, b; /* Poor style : multiple variables */
Değişkenlerin İlklenmesi Değişkenler ilk tanımlandıklarında, genellikle rasgele değerler içerirler. İlklendirme değişkenler program başlangıcında değer atamaktır. Bir değişken deklare edildiği satırda, ilklenebilir. Basit bir ilklendirme örneği : intcount = 0; Diğer örnek : int count, sum=0; burada yalnızca sum değişkeni ilklenir.
Program 2 /* Bu program üç kullanıcı tarafından klavyeden girilen üç sayının toplamını hesaplar ve ekrana yazar. yazan : isim tarih : */ #include <stdio.h> int main (void) { /* Yerel tanımlamalar */ int a; int b;
int c; int sum; Program 2 /* ifadeler */ printf ( \nmerhaba bu program girdiğiniz\n ); printf ( Girilen üç sayıyı toplar. \n ); printf ( Lütfen sayıları yandaki biçimde giriniz : nnn nnn nnn <Enter>\n ); scanf ( %d %d %d, &a, &b, &c);
Program 2 Results /* Sayılar a, b, c ye girildi, şimdi toplanacaklar. */ sum = a + b + c; printf ( Toplam : %d\n\n, sum); printf ( Teşekkürler.\n ); return 0; } /* main */
Sabitler Sabitler, programın çalışması sırasında değerleri değiştirilemeyecek verilerdir. Değişkenlere benzer olarak sabitlerde türlere sahiptir. C dilinde 4 değişik sabit vardır : Integer sabitler Floating-point sabitler Character sabitleri String sabitleri
Tamsayı sabitlerine örnekleri Literal Value Type +123 123 int -378-378 int -32271L -32,271 long int 76542LU 76,542 unsigned long int Varsayılan türü u yada U ile işaretsiz, l yada L ile uzun (long) türde tanımlayabiliriz.
Float sabitler Literal Value Type 0. 0.0 double.0 0.0 double 2.0 0.0 double 3.1416 3.1416 double -2.0f -2.0 float 3.1415926536L 3.1415926536 long double
Symbolic Names for Special Characters ASCII Character Symbolic Name Null character \0 Alert (bell) \a Backspace \b Horizontal tab \t Newline \n Vertical tab \v Form feed \f Carriage return \r Single quote \ Backslash \\
String Sabitleri Bir string sabiti arasına yerleştirilmiş bir yada daha fazla karakterden oluşur. String örnekleri h merhaba\n Elektronik ve Haberleşme Mühendisliği
Yalın (Literal) sabitler Bir yalın sabit, veriyi tanımlamak için kullanılan isimlendirilmemiş sabitlerdir. Yalın sabit örnekleri A /* a character literal */ 5 /* numeric literal 5 */ a + 5 /* another numeric literal (5) */ 3.1416 /* a float literal */ Hello /* a string literal */
Tanımlanmış sabitler Bu türden sabitler define (define bir önişlemci (preprocessor) anahtar kelşmesidir )ile tanımlanır. Önişlemci komutlar # ile başlar. #define VERGI_ORANI.18 Genellikle program başlarında tanımlanır. İsmi takip eden tanımlamalar, program içinde ismin yerine yerleştirilir. preprocessor kodu herhangi bir şekilde işletmez, sadece atamaları etkiler.
Bellek sabitleri Bellek sabitleri, belirli bir bellek bölgesini sabit bir değerle doldurmak için kullanılır ve bir C tip tanıtıcısı (type qualifier) aracılığıyla tanımlanır. type qualifier const anahtar kelimesi olarak tanımlanır : Örnek const float pi = 3.1416;
Program 3 /* Bu program sabitleri kullanmanın üç biçimini gösterir Yazan : Tarih : */ #include <stdio.h> #define PI 3.1415926536 int main(void) { const double pi = 3.1415926536
/* ifadeler */ printf( Tanımlanış sabit PI: %13.10f\n", PI ) ; printf( Bellek sabiti pi: %13.10f\n", pi ) ; printf("literal sabit: %13.10f\n", 3.1415926536 ); return 0 ; } /* main */ /* Sonuçlar : Tanımlanış sabit PI : 3.1415926536 Bellek sabiti pi : 3.1415926536 Literal sabit : 3.1415926536 */
Formatlanmış Giriş/Çıkış C dilinde, Formatlanmış veri bir text dosya aracılığıyla programa aktarılırken, programdan bir text aracılığıyla dışarıya aktarılır. keyboard standard giriş (text file) dosyası olarak değerlendirilir. monitör ise standard çıkış (text file) dosyası olarak değerlendirilir. Veri, keyboard aracılığıyla C programına yalnızca karakter dizileri olarak girilebilir. C program formatlama fonksiyonlarını kullanır ve veriyi uygun biçimde değiştirir.
Standard dosyalar Standart dosya, genellikle giriş akıntısı (input stream) olarak isimlendirilen geçici bir bellek bölgesine tamponlanır. Giriş akıntısı, tüm satır alınana kadar giriş karakter dizisini saklar. Bu nedenle, giriş dizisini, entera basmadan önce backspace yada delete ile silebiliyoruz.
Formatlanmış Giriş ve Çıkış
Formatlanmış Çıkış (printf) C de standtart formatlı çıkış fonksiyonu printf dir. printf bellekteki karakter ve ikili veriyi kullanıcının okuyabileceği hale getirir. Veriyi basabilmek için, printf iki parametreye ihtiyaç duyar : Formatlama için gerekli talimatlar (format string); Yazılacak veri (data list). format string ( ) karakterleri arasında belirtilir ve yazılacak sabit yazı ve sıfır yada daha fazla sayıda alan tanımlaması (field specification) içerir. Alan Tanımlama lar %karakteri ile başlar.
Alan Tanımlama %[bayrak][genişlik][.kesir]<format karakteri> Bayrak: + ise sayılar daima işaretli olarak yazılır. İşaret + ise +12 gibi yazılır Bayrak ise sayı balirtilen genişliklten küçük ise sayı sola dayalı olarak yazılır Bayrak 0 ise sayı belirtilen genişlikten kısa ise başı 0 ile doldurulur. Genişlik sayının ne kadar uzunluklu bir alana yazılacağını belirtmek için kullanılır. Ancak yazılacak değerin uzunluğu daha fazla ise bu değer ihmal edilir. Eğer sayı float türündeyse kesir kısmının uzunluğu. İle belirtilerek tanımlanır.
Format Karakteri değişkenin yazılış türünü belirtir. d :ondalık tamsayı x yada X: hex formatında sayı s: verilen adresten itibaren null karakterine kadar tüm karakterler f: double ve float türünden yazma c: karakter
Örnek { double x=6.265; int y=100; char *p= DENEME ; printf( Sayılar\n%f\n%5.2f\n /5.1f\n,x,x,x); printf( /05d\n,y); printf( Yazı Örneği\n%10s\n,p); } 6. 2 6 5 0 0 0 6. 2 6 6. 2 0 0 1 0 0 D E N E M E
Formatlanmış Giriş C de standart formatlanmış giriş fonksiyonu scanf scanf aşağıdaki girdileri içerir : Format dizisi verinin türünü açıklar; adres listesi, verinin bellekte tutulacağı yeri gösterir. scanf ( format dizisi, adres listesi ); ( %c.%d..%f.., &a,.&i,..,&x..)
Format dizisi : girilecek bilginin türünü ve nasıl girileceğini belirtir. scanf( %d %d %f, &a, &b, &c) 12 10 6.23 <enter> scanf( %d, %d, %f, &a, &b, &c) 12, 10, 6.23 <enter> scanf( %d- %d- %lf, &a, &b, &c) 12-10- 6.23 <enter> %f 6. digit giriş yapar, %lf long float giriş yapar.
Seçme ve Karar Verme Seçme, iki yada daha fazla olası program akışı arasında karar vermenizi sağlar. Bilgisayar tarafından verilen kararlar 1 ve 0 a indirgenmelidir. Karmaşık kararları programın anlayabileceği 1 ve 0 indirgemek programcının işidir.
Mantıksal veri ve Operatörler C de mantıksal veri türü yoktur. Bunun için int yada char kullanılabilir. Veri değeri sıfır (=0) sıfırdan farklı (>0, <0) Mantıksal Anlamı FALSE TRUE
Mantıksal Operatörler Operatör Anlamı Örnek x=0, y=1 için sonuç! not (değil)!x 1 && and (ve) x && y 0 or (veya) x y 1 not (değil) operatörü TRUE değerini FALSE yapar, yada FALSE değerini TRUE yapar. and (ve) operatörü İşleme giren her iki değer TRUE ise sonuç TRUE değil ise sonuç FALSE dir. or (veya) operatörü İşleme giren her iki değer FALSE ise sonuç false değil ise sonuç TRUE dur.
Mantık değerlerini işleme C mantıksal ifadeleri işlemek için kısadevre yöntemini kullanır. Örneğin bir and işleminin ilk değeri 0 ise diğer değere bakmadan sonucu 0 olarak verir. And ve Or için kısadevre yöntemi
Kısa-devre yönteminin sorunları Kısa-devre yöntemi verimlidir. Ancak, ikinci değere ilişkin etkileri vardır. Örneğin : x && y++ Eğer x TRUE ise, sorun yoktur. Eğer x FALSE, ise ikinci terim işleme girmez, halbuki ikinci terimin değeri işlem sonrasında 1 artıtılmaktadır (++ operatörü). Ancak bu işlem gerçeklenmez. x y++ işlemi için aynı sorun vardır. Eğer x TRUE, ise y artırılmaz.
İlişkisel Operatörler Operatör Anlamı kullanımı x=10, y=20 için sonuç < Küçük x < y 1 <= küçük yada eşit x<=y 1 > büyük x > y 0 <= büyük yada eşit x >= y 0 == eşit x==10 1!= farklı x!=5 1 İlişkisel operatörler karşılaştırabilmek için iki değere ihtiyaç duyar. Sonuç 0 yada 1 dir.
Eşlenikler < eşlenik >= > eşlenik <= == eşlenik!= Örnekler! (x < y) x >= y! (x > y) x <= y! (x!= y) x = = y! (x <= y) x > y! (x >= y) x < y! (x = = y) x!= y
İki yollu seçim Sonuç sıfır ise yapılacak işlemler. Sonuç 1 ise (true) Yapılacak işlemler.
if... else karar komutu if (karar ifadesi) { //doğru ise yapılacak işlemler ifadeler } else Eğer tek bir ifade varsa blok başlatıcılarına gerek yoktur! {//yanlış ise yapılacak işlemler } ifadeler
if... else karar komutu: örnekler if (a==5) y=x+2; else y=x-2; Yanlış ise yapılacak işlemler kısmı kullanılmak zorunda değildir. if (a==5) y=x+2;
if... else karar komutu: Örnekler, Birleşik ifadeler if (a!=b) { x++; y - ; printf( x-y:%d\n,x-y); } else { x--; y++ ; printf( x-y:%d\n,x-y); } Birleşik ifadeler tek bir ifade gibi işlenir. else kısmı gerekirse kullanılır.
Birbirinin Tamamlayıcısı olan if else Durumu if (!ifade) if (ifade) { {...... } } else else { {...... } } Asıl Eşlenik
NULL else Durumu Null else Bazı durumlarda if in yanlış sonuçlarında birşey yapmaya gerek yoktur else ifadesi için program yürümez.
A NULL if Durumu else kısmı ihmal edilebilirken if kısmı için aynı şey yapılmaz. null if olarak ifade edilir. Genellikle null if durumunu iki durumu yer değiştirip ve ifadeyi tamlayıp giderebiliriz. null if durumunu null else durumuna dönüştür
İç içe geçmiş if durumları iç içe geçmiş if sayısında sınırlama yoktur ancak 3 ten sonra programın okuması zorlaşır
Örnek if (a==b) y=x+1; else if (a>b) y=x-1; else if (y==x) sonuc=1; else sonuc=0;
else için oluşabilecek problemler Her if için eşleşmemiş else varsa problem oluşur. C de açıkta kalan else en yakın ifile eşleştirilir. Sonraki slaytta programcı else i ilk if ile eşleştirir. Ancak derleyici else i ikinci if ile eşleştirir. Çözüm : İlk if deki doğru ifade parantez içine alınır.
if (ifade1) if (ifade2) işlem1; else işlem2; C derleyicisi else ifadesini ikinci if ile eşleştirir. Eğer programcı else kısmını 1. if ile eşleştirmek isterse, 2. if ifadesini aşağıdaki gibi blok içine almalıdır. if (ifade1) { } else if (ifade2) işlem1; işlem2;
if ifadesini Basitleştirme Bazen if içindeki kontrol ifadesi basitleştirilebilir. If ( a! = 0 ) durum if ( a = = 0 ) durum sadeleştirme If ( a ) durum if (!a ) durum ( a ) a Doğru (a sıfır değil) (! a ) a Yanlış (a sıfır)