C Dersleri

Ders1: Giriş

Dersin bu kısmında C programlama dilinin basit yapısı temel örneklerle anlatılmıştır. Gerekli olan bilgiler sade bir şekilde verilmiştir. Ayrıntılar ise bu dersin sahasının dışındadır. Eğer C dışında herhangi bir programlama dili biliyorsanız, bu kısımda anlatılan kısımları daha hızlı bir şekilde kavrayabilirsiniz. Eğer C dilini orta seviyede biliyorsanız bu kısmı atlayabailirsiniz.

C

C Programlama Dili genel amaçlı orta seviyeli ve yapısal bir programlama dilidir. 1972 yılında Dennis Ritchie tarafından Bell Telefon Labaraturvarında tasarlanmıştır. C, özellikle sistem programlamada sembolik makine dili(Assembler) ile tercih edilmektedir. İşletim sistemleri, derleyiciler ve debug programları gibi aşağı seviyeli sistem programlarının yazılımında yoğun olarak C programlama dili kullanılır.

Bu dil ilk olarak bir programlama dili olarak düşünülmemişti ve özel bir amacı vardı: UNIX işletim sistemini tasarlamak (UNIX işletim sisteminin 1000 satırlık bölümü C ile yazılmıştır). Günümüzde Nesneye Yönelik programlama dilleri (C++, Java gibi) ve script dilleri (JavaScript, JavaApplet, PHP gibi) gibi programlama dilleri tamamen C tabanlıdır. Kısacası Standart C dilini (ANSI C) ogrenmekle bu dillerin tamamına iyi bir hazırlık yapmış olursunuz. Derlerimizde tamamen ANSI C konu edilmiştir.

Neden C?

  • C güçlü ve esnek bir dildir. C ile işletim sistemi yazabilir, kelime işlemciler oluşturabilir veya grafik çizebilirsiniz.
  • C taşınabilir bir dildir. Yani herhangi bir C kodu hiçibir değişikliğe uğramadan, veya çok az bir değişimle, başka bir derleyicide derlenebilir. Örneğin, Windows işletim sistemlerinde yazılan bir C kodu, Linux, UNIX veya VAX gibi işletim sistemlerinde de derlenebilir.
  • C yapısal bir dildir. C kodları fonksiyon olarak adlandıralan altprogramlardan oluşmuştur.

Kaynak Kodunun Derlenmesi

C kaynak kodları(programları) uzantısı .c olan dosyalarda saklanır ve derlenir. Bazı işletim sistemleri ile kullanılan C Derleyicileri ve bu derleyicilerde ilk.c dosyasının nasıl derlendiği Tablo 1.1 de verilmiştir.
Not: Eğer ismi geçen derleyicinin bir editörü varsa ilk.c bu editör de derlenebilir.

Tablo 1.1 : İşletim sistemleri, bazı derleyiciler ve derleme komutları

Işletim Sistemi Derleyici Komut Çalıştırma
MS-DOS / Windows Microsoft C cl ilk.c ilk.exe
Borland Turbo C tcc ilk.c ilk.exe
Borland C bcc ilk.c ilk.exe
Zortec C ztc ilk.c ilk.exe
UNIX Tabanında var cc ilk.c run ilk
Linux Tabanında var c ilk.c run ilk

 

Borland TurboC-2.01 derleyicisini Buradan indirebilirsiniz.

İlk C Programı

Program 1.1 de verilen C programı derlendikten sonra, ekrana ‘Merhaba Dünya!’ yazacaktır. Satır başlarına yerleştirilen 1:, 2: 3: … rakamlarının yazılmasına gerek yoktur. Bu rakamlar sadece programdan daha sonra program ile ilgili açıklama yapılırken, ilgili satirda bulunan kodlar izah edilirken, kullanılacaktır.

Program 1.1 : Derlendikten sonra ekrana Merhaba Dünya! yazar

1:  /* ilk.c programi */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:      printf("Merhaba Dünya!\n");
7:      return 0;
8:  }

 

ilk.c nin Borland Turbo C Derleyicisi ile derlenmesi ve çalıştırılması:

Editörde               -> Ctrl+F9
MS-DOS komut satırında -> tcc ilk.c [RETURN]
                          ilk.exe   [RETURN]

ilk.c nin çıktısı:

Merhaba Dünya!

ilk.c programı da verien 1. satırda /* ... */ ifadeleri görülmektedir. Bu ifadeler arasında yazılan herhangi bir metin, işlem vb. satırlar, derleyici tarafından işlenmez(görülmez). Yani /* */ ifadeleri açıklama operatörüdür. 2. satırda yazılı olan #include ifadesi, programda eklenecek olan başlık dosyanını işare eder. Bu örnekte verilen başlık dosyası (header file) stdio.h dir. Bu dosya standard giriş çıkış kütüphane dosyasıdır (STandarD-Input-Output). Bu tip dosyaların uzantısı .h dir. Bu dosyalar Başlık Dosyaları kısımlarında daha ayrıntılı olarak incelenecektir. 4. satırdaki main() ve 6. satırdaki printf() birer fonksiyondur. main() özel bir fonksiyondur ve programın yürütülmesine bu programdan başlanır. Dolayısıyla her C programında bir tane main() adlı fonksiyon olmalıdır. printf() ise standart kütüphane bulunan ekrana yazdırma fonksiyondur. stdio.h bu fonksiyon için kullanılmıştır. 7. satırdaki return 0 ifadesi programın sonlandığını göstermek için kullanılır. Çoğu zaman kullanılmasına gerek yoktur.

C Kodlarının Temel Özellikleri

Bir C programı aşağıda verilen özellikleri mutlaka taşımalıdır.

  • Her C programı main() fonksiyonunu içermelidir.
  • Satırın sonuna ; işareti konmalıdır.
  • Her fonksiyonun başlangıcı ve bitişi sırasıyla { ve } sembolleri ile belirlenir.
  • C dilinde yazılan kodlarda küçük-büyük harf ayrımı vardır (case sensitive). Örneğin A ile a derleyici tarafından farklı değerlendirilir.
  • Açıklama operatörü /* */ sembolleridir.
  • Değişken isimleri en fazla 32 karakterden oluşabilir. 32 karakterden uzun değişken isimlerinin ilk 32 karakteri değerlendirilir. Geriye kalan karakterler işleme tabi tutulmaz.
  • Değişken adları ingiliz alfabesinde bulunan karakterler (A-Z) veya (a-z) ile yazılmalıdır.
  • Değişken adları herhangi bir rakam ile başlayamaz. Ilk karakter bir harf olamalıdır.
  • Aşağıda verilen kelimeler C deyimleridir ve değişken ismi olarak kullanılamaz.
    auto      enum      short    volatile
    break     extern    signed   while
    case      float     sizeof
    char      for       static
    const     goto      struct
    continue  if        switch
    default   int       typedef
    do        long      union
    double    register  unsigned
    else      return    void

Kod Yazımı için Bazı Tavsiyeler

  • Program açıklamaları ve döküman hazırlama program yazıldıkça yapın! Bu unutulmaması gereken çok önemli husustur.
  • Değişken, sabit ve fonksiyon adları anlamlı kelimelerden seçilip yeterince uzun olmalıdır. Eğer bu isimler bir kaç kelimeden oluşacak ise, kelimeler alt çizgi ( _ ) ile ayrılmalıdır veya her kelime büyük harfle başlamalıdır. Örneğin:
     int son_alinan_bit;
     void KesmeSayisi();
     float OrtalamaDeger = 12.7786;
  • Sabitlerin bütün harflerini büyük harfle yazın. Örneğin:
     #define PI = 3.14;
     int STATUS 0x0379;
  • Her alt yapıya girerken TAB tuşunu kullanın. Bu okunabilirliği arrtıracaktır. Örneğin:
     for(i=0;i<10;i++)
     {
           for(j=0;j<i;j+=2)
           {
                 do{
                       k = i+j;
    
                   }while(k!=0);
           }
     }
  • Aritmetik operatörler ve atama operatörlerinden önce ve sonra boşluk karakteri kullanın. Bu, yazılan matematiksel ifadelerin daha iyi anlaşılmasını sağlayacaktır.Örneğin:
     Hmax = pow(Vo,2) / (2*g);
     Tf   = 2*Vo/g;
     Vy   = Vo - g*t;
     y    = Vo*t - (g*t*t)/2.0;
     z    = ( a*cos(x) + b*sin(x) )*acos(y);
  • Program bittikten sonra tekrar tekrar programınızı inceleyerek, programınızı daha iyi şekilde yazma yollarını arayın ve aynı fonksiyonları daha kısa algoritmalarla ve daha modüler şekilde elde etmeye çalışın. Programınızın anlaşılması için elinizden ne geliyorsa yapın. Bilginizi ve eserinizi başkalarına en iyi şekilde aktarın.

 

Ders2: Değişkenler ve Sabitler

Değişkenler bellekte bilginin saklandığı gözlere verilen sembolik adlardır. Her değişkenin tuttuğu değerin nasıl bir veri olduğunu gösteren bir tipi vardır. C dilinde temelde birkaç tane değişken tipi vardır. Bunlar Tablo 2.1 te listelenmiştir.

Tablo 2.1 : Değişken tipleri ve bellekte kapladıkları alanlar

Değişken tipi Açıklama Bellekte işgal ettiği boyut (byte)
char tek bir karakter için 1
int tamsayı için 2 yada 4
float tek duyarlı gerçel sayı için (6 basamak hassasiyet) 2 yada 4
double çift duyarlı gerçel sayı için (12 basamak hassasiyet) 4 yada 8

Fakat bazı özel niteleyiciler vardır ki bunlar yukarıdaki temel tiplerin önüne gelerek onların türevlerini oluşturur. Bunlar short, long, unsigned dır. Bu niteleyiciler sayesinde değişkenin bellekte kaplayacağı alan isteğe göre değiştirilebilir. Kısa (short), uzun (long), ve normal (int) tamsayı arasında yalnızca uzunluk farkı vardır. Eğer normal tamsayı 16 bit (2 byte) ise uzun tamsayı 32 bit uzunluğundadır. Kısa tamsayı 16 biti geçmeyecek uzunluktadır. Değişken tiplerinin bellekte kapladığı alan sizeof operatörü ile öğrenilebilir. Program 2.1 bu amaçla yazılmıştır.

Program 2.1 : Değişken tipleri ve türevlerinin bellekte kapladıkları alanlar

1:  /* sizeof operatörünün kullanımı */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:    printf( "\nchar           : %d byte", sizeof( char ));
7:    printf( "\nint            : %d byte", sizeof( int ));
8:    printf( "\nshort          : %d byte", sizeof( short ));
9:    printf( "\nlong           : %d byte", sizeof( long ));
10:   printf( "\nunsigned char  : %d byte", sizeof( unsigned char ));
11:   printf( "\nunsigned int   : %d byte", sizeof( unsigned int ));
12:   printf( "\nunsigned short : %d byte", sizeof( unsigned short ));
13:   printf( "\nunsigned long  : %d byte", sizeof( unsigned long ));
14:   printf( "\nfloat          : %d byte", sizeof( float ));
15:   printf( "\ndouble         : %d byte", sizeof( double ));
16:   printf( "\nlong double    : %d byte", sizeof( long double ));
17:
18: return 0;
19: }

 

Değişkenler ve Sabitlerin Bildirimi

Değişkenler ve Sabitler programın başında bulunmalıdır. Bazı uygulamalarda değişkenin bir başlangıç değerinin olması istenir. Böyle durumlarda değişken bildirilirken başlangıç değeri verilebilir. Örneğin:

      char isim='X', z;
      int  sayi=0, n=10;
      float toplam=0.0, sonuc=22.14;

Sabit bildirimi, başlangıç değeri verilen değişken bildirimi gibi yapılır. Ancak; veri tipinin önüne const anahtar sözcüğü koyulmalıdır. Örneğin:

      const float   PI = 3.142857;
      const double  NOT= 12345.8596235489;
      const int     EOF= -1;
      const char[] = "devam etmek için bir tuşa basın...";

gibi sabit bildirimleri geçerli olup bunların içerikleri program boyunca değiştirilemez. Yalnızca kullanılabilir. Genellikle, sabit olarak bildirilen değişken isimleri büyük harflerle, diğer değişken isimlerinin ise küçük harflerle yazılması(gösterilmesi) C programcıları tarafından geleneksel hale getirilmiştir.

Birçok C programında sabitler #define önişlemci komutu ile de tanımlandığını görebilirsiniz. Bu komutla sabit bildirimi, bir program parçasına ve makro fonksiyon tanımlaması yapılabilir. Bir program geliştirilirken simgesel sabitlerin kullanılması programın okunurluğunu arttır ve bazen gerekli de olabilir. Aşağıda verilen simgesel sabit bildirimleri geçerlidir. #define önişlemcisi ile makro fonksiyon tanımlama işlemi Fonksiyonlar bölümünde anlatılacaktır.

  #define MAX 100
  #define DATA 0x0378
  #define YARICAP 14.22

Değişken Bildirim Yerleri ve Türleri

Yerel(local) Bildirim

Yerel değişkenler kullanıldığı fonksiyon içerisinde bildirilir. Yalnızca bildirildiği fonksiyon içerisinde tanınır ve kullanılabilir.

    int topla(int a,int b)
    {
    /* yerel (local) değişken c nin bildirimi */
    int c;
    c = a + b;
    return c;
   }

Genel(general) Bildirim

Genel değişkenler bütün fonksiyonların dışında bildirilir. Bir değişken program boyunca sürekli olarak kullanılıyorsa genel olarak bildirilmelidir.

   #include <stdio.h>

   void karesi();

   /*
   ** m ve n global tip değişkendir.
   ** bu iki değişken tüm program boyunca kullanılmaktadır
   */
   int m,n;  

   main(){
     m=7;
     karesi();
     printf("%d nin karesi %d dir",m,n);
   }

  void karesi()
  {
    n = m*m;
  }

Tip Dönüşümleri

Bir formül içerisinde bir çok değişken veya sabit olabilir. Bu değişken ve sabitler birbirinden farklı tipte olursa, hesap sonucunun hangi tipte olacağı önemlidir. Bir bağıntıda ,çeriği dönüşüme uğrayan değişkenler eski içeriklerini korurlar. Dönüştürme işlemi için geçiçi bellek alanı kullanılır; dönüştürülen değer kullanıldıktan sonra o alan serbest bırakılır.

  char kr;
  int tam;
  long int ltam;
  unsigned int utam;
  short int stam;
  float f;
  double d;

bildirimlerine göre:

  bağıntı      sonuç tipi
  -------      ----------
  kr+5         int
  kr+5.0       double
  d+tam        double
  f+d-2        double
  utam-tam     unsigned
  ltam*tam     long
  tam/2        int
  tam/2.0      double

bir değişkenin sabit değerin veya bağıntının önüne tür (cast) yazılarak sonucun hangi tip çıkması istendiği söylenebilir. Genel yazım biçimi:

      (tür tipi)  bağıntı;

örneğin x int, a ve b float tipinde iki değişken olsun:

      int x=3;
      float a,b;
      ...
      a = x/2;
      b = (float) x/2;

işleminin sonucunda a değişkenine 1.0, b değişkenine 1.5 değeri aktarılır. yani x/2 ile x/2.0 aynı anlamda değildir.

Ders3: Operatörler

Operatörler, değişkenler veya sabitler üzerinde matematiksel ve karşılaştırma işlemlerini yapan simgelerdir.

Aritmetik Operatörler

Değişken veya sabitler üzerinde temel aritmetik işlemleri gerçekleyen operatörlerdir. Bunlar Tablo 3.1 de listelenmiştir.

Tablo 3.1 : Aritmetik Operatörler

Operator Açıklama Ornek Anlami
+ toplama x+y x ve y nin toplamı
- cikarma x-y x ve y nin farkı
* carpma x*y x ve y nin çarpımı
/ bolme x/y x ve y nin oranı
% artık bölme x%y x/y den kalan sayı

Atama Operatörleri

Bu operatörler bir değişkene , bir sabit eşitlemek için kullanılır.
Birleşik atama: bazı ifadelerde işlem operatörü ile atama operatörü birlikte kullanılarak, ifadeler daha kısa yazılabilir. Eğer ifade

          değişken = değişken [operatör] ifade;

şeklinde ise, daha kısa bir biçimde

          değişken [operatör]= ifade;

olarak yazılabilir. Bunlar Tablo 3.2 te listelenmiştir.

Tablo 3.2 : Atama Operatörleri

Operator Açıklama Ornek Anlamı
= atama x=7; x=7;
+= ekleyerek atama x+=3; x=x+3;
-= eksilterek atama x-=5; x=x-5;
*= çarparak atama x*=4; x=x*4;
/= bölerek atama x/=2; x=x/2;
%= bölüp, kalanını atama x%=9; x=x%9;
++ bir arrtırma x++; veya ++x; x=x+1;
-- bir azaltma x--; veya --x; x=x-1;

Karşılaştırma Operatörleri ve Mantıksal Operatörler

Sayısal değerleri veya karakterleri karşılaştırmak için kullanılır. Bunlar Tablo 3.3 de listelenmiştir.

Tablo 3.3 : Karşılaştırma Operatörleri ve Mantıksal Operatörler

Operator Açıklama Ornek Anlamı
> büyüktür x>y x, y den büyük mü?
< küçüktür x<y x, y den küçük mü?
== eşittir x==y x, y ye eşit mi?
>= büyük-eşittir x>=y x, y den büyük yada eşit mi?
<= küçük-eşittir x<=y x, y den küçük yada eşit mi?
!= eşit değil x!=y x, y den farklı mı?
&& mantıksal VE x>2 && x<y x 2 den büyük VE y den küçük mü?
|| mantıksal VEYA x>2 || x<y x 2 den büyük VEYA y den küçük mü?

Bit Düzeyinde Işlem Yapan Operatörler

Sayısal veya karakter değişkenlerin üzerinde bit düzeyinde mantıksal işlem yapan operatörlerdir. Bunlar Tablo 3.4 te listelenmiştir.

Tablo 3.4 : Bit düzeyinde işlem yapan operatörler

Operator Açıklama Ornek Sonucu
& ve 10 & 25 (00001010 & 00011001) 8 (00001000)
| veya 10 | 25 (00001010 | 00011001) 27 (00011011)
^ özel veya 10 ^ 25 (00001010 ^ 00011001) 19 (00010011)
~ değil ~10 (00001010) 245 (11110101)
>> sağa kaydırma 12 >> 3 (00001100 >> 3) 1 (00000001)
<< sola kaydırma 12 << 3 (00001100 << 3) 96 (01100000)

Program 3.1 : Aritmetik ve atama operatörlerinin kullanımı

1:  /* Aritmetik ve atama operatörlerinin kullanımı */
2:  #include <stdio.h>
3:
4:  main()
5:  {
6:     int x, y;  /* yerel değikenlerin bildirimi */
7:
8:     x = 1;   /*  x in başlangıç değeri  */
9:     y = 3;   /*  y nin başlangıç değeri */
10:
11:    printf(" x = %d ve y = %d,\n olarak veriliyor.", x, y, z);
12:
13:    x = x + y;
14:    printf("x <- x + y  atamsının sonucunda x %d dir\n", x);
15:
16:    x = 1;  /* x e tekrar 1 değeri atanıyor */
17:    x += y;
18:    printf("x += y  atamasının sonucunda x %d dir\n", x);
19:
20: return 0;
21: }

Ders4: Başlık Dosyaları

C dilinde bir program yazılırken, başlık dosyası (header file) olarak adlandırılan bir takım dosyalar #include önişlemcisi kullanılarak program içine koyulurlar. Çünkü kütüphanelerdeki birçok fonksiyon, başlık dosyaları içindeki bazı bildirimleri kullanırlar. Bu tür dosyaların uzantısı .h dir. Örneğin time.h gibi. ANSI C deki standart başlık dosyaları:
  assert.h    locale.h     stddef.h
  ctype.h     math.h       stdio.h
  errno.h     setjmp.h     stdlib.h
  float.h     signal.h     string.h
  limits.h    stdarg.h     time.h

Bir çok C derleyicisinde yukarıdakilere ek olarak tanımlanmış başlık dosyaları da vardır. Bunlar derleyicinin yardım kısmından veya derleyicinin kullanım kılavuzundan öğrenilebilir.

Örnek Başlık DosyasıBaşlık dosyaları genellikle include dizininin içinde saklanır. Turbo C derleyicisine ait stdio.h başlık dosyasının içeriğini görmek için tıklayın. Başlık dosyaları kullanıcı tarafından da oluşturulabilir. Program 4.1 buna bir örnektir. Bu programda "benimki.h" başlık dosyası programın başına ilave edilmiştir.

/* benimki.h */
int topla(int x,int y){
    return (x+y);
}

float ort(int x,int y){
   return (x+y)/2.0;
}

"benimk.h" başlık dosyası iki tane fonksiyon içermektedir. Fonksiyon kavramı daha sonra ayrıntılı olarak incelenecektir.

Program 4.1 : Başlık dosyası örneği

1:  #include <stdio.h>
2:  #include "benimki.h"
3:
4:  main()
5:  {
6:      int x,y,toplam;
7:      float ortalama;
8:      x = 10;
9:      y = 20;
10:     toplam   = topla(x,y);
11:     ortalama = ort(x,y);
12:     printf("%d ve %d nin toplamı %d, ortalaması %f dir\n",x,y,toplam,ortalama);
13: }

 

Program 4.1 in çalışması için, benimki.h ve Program 4.1 aynı klasörün içinde olmalıdır. Aksi takdirde 2. satırdaki ifadede benimki.h dosyasının tam yolu yazılmalıdır.

Ders5: Temel G/Ç Fonksiyonları

Temel giriş/çıkış fonksiyonları kullanılırken stdio.h başlık dosyası programın başına eklenmelidir. Bu fonsiyonlardan en çok kullanılanlar aşağıda verillmiştir. Fakat bunların dışında olan bir kaç fonksiyon daha vardır.

printf() Fonksiyonu

Standart C kütüphanesinin bir parçası olan printf() fonksiyonu, değişkenlerin içeriğini veya bit mesajı ekrana bir düzenle(formatla) standart çıkışa(stdout) yazmak için belki de en çok kullanılan fonksiyondur. Daha önce yazılan örnek programlarda printf() fonksiyonu kullanılmıştı. Şimdi bu fonsiyonun nasıl kullanıldığı açıklanacaktır.

Basit olarak eğer ekrana Hata oluştu!.. şeklinde bir mesaj yazdırmak için, printf fonksiyonu çağırmak ve fonksiyon içinde, çift tırnaklar arasına, bu iletiyi yazmak yeterli olacaktır. Yani:

      printf("Hata Oluştu!..");

Çoğu zaman ekrana, programda kullanılan bir değişkenin değeri yazdırılmak istenebilir. Örneğin ekranda bir alt satıra geçerek bir x değişkeninin sayısal değerini ekrana yazdırma işlemini gerçekleştirmek istediğinizi varsayalım. Bu durumda printf() fonksiyonun kullanımı şu şekilde olacaktır:

      printf("\nx in değeri %d dir",x);

x=12 için bu işlemin sonucunda ekrana şu ileti çıkacaktır:

      x in değeri 12 dir

Bu örnekte printf fonsiyonuna iki parametre aktarılmıştır. Birincisi ekranda gösterilecek ve çift tırnaklar arasına yazılan ifadeler, ikincisi ise ekranda sayısal değeri gösterilmek istenen değişken(x). Ayrıca bir alt satıra geçme işlemi \n ile gerçekleştirilmiştir. Daha genel bir ifade ile printf fonksiyonu iki kısımdan oluşur. Şöyle ki:

      printf("karakter dizisi formatı",değişkenler);

Burada, birinci parametre karakter dizisi formatı, değişkenler kısmı ise ikinci parametredir. karakter dizisi formatı üç kısımdan oluşmaktadır:

  • Düz metin(literal string): yazdırılmak istenen ileti.
  • Konrol karakterleri(escape squence): değişkenlerin ve sabitlerin nasıl yazılacağını belirtmek ve imlecin alt satıra geçirilmesi gibi bazı basit işlemlerin gerçekleştirilmesi için kullanılır. Bu karakterler Tablo 5.1 de listelenmiştir. 
  • Tip belirleyici(conversion specifier): % işaretinden oluşur(%d gibi). Ekrana yazdırılmak istenen değişkenin tipi, % işaretinden sonra belirtilir (Bkz. Tablo 5.2 ). Yani % işaretinin hemen ardına yazılan bir veya bir kaç karakter, ilgili değişken ve sabitin nasıl yazılacağını düzenleme bilgisidir. 

 

Tablo 5.1 : Kontrol karakterleri

Karakter Anlamı
\a Ses üretir(alert)
\b imleci bir sola kaydır(backspace)
\f Sayfa atla. Bir sonraki sayfanın başına geç(formfeed)
\n Bir alt satıra geç(newline)
\r Satır başı yap(carriage return)
\t Yatay TAB(Horizontal TAB)
\v Dikey TAB(vertical TAB)
\" Çift tırnak karakterini ekrana yaz
\' Tek tırnak karakterini ekrana yaz
\\ \ karakterini ekrana yaz
%% % karakterini ekrana yaz

Tablo 5.2 : Tip karakterleri

Tip Karakteri Anlamı Tip
%c tek bir karakter char
%d işaretli ondalık tamsayı int, short
%ld uzun işaretli ondalık tamsayı long
%u işaretsiz ondalık tamsayı unsigned int, unsigned short
%f Gerçel sayı float, double
%s karakter dizisi (string) char
%lu işaretsiz uzun tamsayı unsigned long

Tip karakterlerini kullanarak, not=12, pi=3.14 ve kr='A' değişkenleri printf() fonksiyonu ile ekrana yazdırılmak istensin. Bunun için:

      ...
       int not=12;
       float pi=3.14;
       char kr='A';
      ...
       printf("Not=%d , pi=%f ve kr=%c dir",not,pi,kr);
      ...

printf() fonksiyonu ile yazdırabilecek ifadeler için bir sınır yoktur. parametreler herhangi bir C deyimi olabilir. Örneğin x ve nin toplamı söyle yazılabilir:

      z = x + y;
      printf("%d",z);

Bu ifade şu şekilde de yazılabilir:

      z = x + y;
      printf("%d",x+y);

 

printf fonksiyonu kullanımı Program 5.1 te verilmiştir.

Program 5.1 : printf() fonksiyonunun kullanımı

1:  /* sayısal değerleri ekrana yazdırmak için printf fonksiyonunun kullanımı */
2:  #include <stdio.h>
3:
4:  /* global değişken tanımlamaları */
5:  int a = 2, b = 10, c = 50;
6:  float f = 1.05, g = 25.5, h = -0.1 ,yuzde;
7:
8:  main()
9:  {
10:      printf("\nTAB kullanılmadan yazılan tamsayılar : %d %d %d", a, b, c);
11:      printf("\nTAB kullanılarak yazılan tamsayılar  : \t%d \t%d \t%d", a, b, c);
12:
13:      printf("\nÜç reel sayının tek satırda  yazılması : %f\t%f\t%f", f, g, h);
14:      printf("\nÜç reel sayının üç satırda  yazılması: \n \n\t%f\n\t%f\n\t%f", f, g, h);
15:
16:      yuzde = (25/220)*100.0;
17:      printf("\n220 ün %%25 i %f dir", yuzde);
18:      printf("\n%f/%f işleminin sonucu = %f\n", g, f, g / f);
19:
20:      printf("\n program sonunda beep sesi çıkar...\a");
21:
22:  return 0;
23:  }
TAB kullanılmadan yazılan tamsayılar :  2 10 50
TAB kullanılarak yazılan tamsayılar  :        2       10      50
Üç reel sayının tek satırda  yazılması : 1.050000        25.500000        -0.100000
Üç reel sayının üç satırda  yazılması:
        1.050000
        25.500000
        -0.100000
220 nin %25 i 11.363636 dir
25.500000/1.050000 işleminin sonucu = 24.285715
program sonunda beep sesi çıkar...

 

Program 5.1 , printf() fonksiyonu ile değişkenlerin ekrana nasıl yazıldığını ve kontrol karakterlerinin kullanımını göstermektedir. 5. ve 6. satırda değişkenler global olarak bildirilmiştir. 10. ve 11. satırlarda üç tamsayının ekrana sırasıyla yanyana TABlı(\t) TABsız olarak yazdırılmıştır. 13. ve 14. satırlarda ise üç reel sayının yan yana ve alt alta kullanımı gösterilmiştir. 17. satırda yüzde değişkenine atanan değerin nasıl yazılacağı görülmektedir. 18. satırda g/f oranının başka bir değişkene aktarılmadan da yazdırılabileceğine dair bir örnektir. Program sonlanmadan önce beep sesinin duyulmasını 20. satırdaki \a kontrol karakteri sağlamıştır.

Bazen bir reel sayı ekrana sadece üç basmak hassasiyetle yazdırılmak istenebilir. Bunun için %f tip karakterinden önce hassasiyet(virgülden öce ve sonra) yazılır. Şöyle ki:

float x = 12.123548;
printf("%f in üç basamak hassasiyetli hali %5.3f dür.",x,x);

12.123548 in üç basamak hassasiyetli hali 12.124 dür.

puts() Fonksiyonu

#include <stdio.h>
puts( katar );

katar olarak belirtilen karakter topluluğunu ekrana yazdıktan sonra, imleci alt satıra geçirir. Örneğin:

puts("puts() fonksiyonunun gösterimi!");

şekinde kullanılırsa çıkış şöyle olacaktır.

puts() fonksiyonunun gösterimi!

puts() fonksiyonu Tablo 2.7 de verilen kontrol karakterleri ile kullanılabilir.

puts("Bu birinci satır...\nBu ikinci satır...");

Bu birinci satır...
Bu ikinci satır...

scanf() Fonksiyonu

Birçok programda ekrana verilerin yazılmasının yanı sıra klavyeden veri okunması gerekebilir. scanf() fonksiyonu bu amaçla kullanılan fonksiyondur. printf() gibi scanf() fonksiyonuda Tablo 5.1 ve Tablo 5.2 de verilen karakterleri kullanır. Örneğin klavyeden bir x tamsayısı

scanf("&d",&x);

satırını yazmak yeterli olacaktır. burada & işareti adres operatörü olarak adlandırılır ve Pointerler kısmında ayrıntılı olarak açıklanacaktır. Klavyeden iki farklı sayı okunmak istendiğinde scanf() fonksiyonu şöyle kullanılır:

scanf("%d %f",&x,&y);

veriler

16 1.568

yada

16        1.568

veya

16
1.568

şekilinde okunabilir. Program 5.2 te scanf() fonksiyonunun kullanımı gösterilmiştir.

Program 5.2 : scanf() fonksiyonun kullanımı

1:   /* scanf() fonksiyonu ile int, char ve float tipindeki verilerin okunması */
2:   #include <stdio.h>
3:
4:   main()
5:   {
6:       int   x;
8:       float y;
9:       char  kr;
10:
11:      printf("Bir tamsayı girin :");
12:      scanf("%d",&x);
13:      printf("Bir karakter girin :");
14:      scanf("%c",&kr);
15:      printf("Bir reel sayı girin :");
16:      scanf("%f",&y);
17:
18:      printf("tamsayı :%d\nkarakter :%c\nreel sayı :%f olarak girdin.");
19:
20:  return 0;
21:  }

gets() Fonksiyonu

Klavyeden bir karakter topluluğu, katar, okumak için kullanılır. Okuma işlemi yeni satır karakteriyle karşılaşılıncaya kadar sürer. puts()-gets() arsındaki ilişki, printf()- scanf() arasındaki gibidir. puts() ile ekrana bir katar yazdırılırken, gets() ile okunur. Örneğin:

  ...
  char ktr[10];
  puts("Bir şeyler yazın:");
  gets(ktr);
  ...

Yukarıdaki program parçası, klavyeden girilen karakterlerin, gets() fonksiyonu ile ktr katarına aktarmak için kullanılır. ktr[10] şeklindeki kullanım girilen katarın içerisinden ilk 10 karakteri değerlendir manasındadır. Bu kullanım daha sonra açıklanacaktır.

getchar() Fonksiyonu

Standart girişten bir karakter okur. Programı istenen bir yerde durdurup, bir karakter girinceye kadar bekletir.Örneğin:

  ...
  for(i=0;i<10;i++)
  {
    getchar();
    printf("%d\n",i);
  }
  ...

Yukarıdaki program parçası 0-9 arası sayıları sırasıyla ekranda göstermek için kullanılır. Fakat her rakamı yazdırılmadan önce klavyeden herhangi bir karakter girip ENTER tuşuna basılması beklenir. Bu bekleme getchar() fonksiyonu ile gerçekleştirilir.

Ders6: Fonksiyonlar (Altrogram)

C Programlama Dili fonksiyon olarak adlandırılan alt programların birleştirilmesi kavramına dayanır. Bir C programı bir yada daha çok fonksiyonun bir araya gelmesi ile oluşur. C Dilini öğrenmek için ilk önce fonksiyon oluşturmayı ve onların diğerleri ile birlikte kullanılmasını öğrenmek gerekir.Her fonksiyonun bir adı ve fonksiyona gelen değerleri gösteren argumanları(bağımsız değişkenleri) vardır. C dilinde hazırlanan bir fonksiyonun genel yapısı şöyledir: 

      FonksiyonTipi FonksiyonAdı(arguman listesi)
      argumanların tip bildirimleri
      {
        Yerel değişkenlerin bildirimi
        ...
        fonksiyon içindeki deyimler veya diğer fonksiyonlar
        ...
      }

Örnek fonksiyon : iki tamsayıyı toplayıp sonucu sonuc adlı değişkene aktarır.

  /* Bu fonksiyon iki tamsayıyı toplar ve sonucu sonuc değişkenine aktarır */
  int tamsayi_topla( int x, int y )
  {
     int sonuc;
     sonuc = x + y;
     return sonuc;
  }

Yukarıdaki program parçası şu şekilde de yazılabilir:

  /* Bu fonksiyon iki tamsayıyı toplar */
  int tamsayi_topla( int x, int y )
  {
     return (x+y);
  }

Her iki program parçasında da return (geri dönüş) deyimi kullanılmaktadır. Bu deyim C programlama dilinin anahtar sözcüklerinden biridir ve fonksiyon içerisinde sonucu, kendisini çağıran yere göndemek için kullanılır. Yani tamsay_topla() fonksiyonu herhangi bir programın içerisinde kullanıldığında, fonksiyonun üreteceği sonuç return deyiminden sonra belirtilen değişken veya işlem olacaktır. Örneğin: 

  ...
  int toplam;
  toplam = tamsayi_topla(1,2);
  printf("Toplam = %d dir",toplam);
  ...

şeklinde kullanılırsa, toplam değişkenine 1+2=3 değeri atanır. Fonksiyon kullanımı Program 6.1 nın üzerinde açıklanmıştır. 

Program 6.1 : tamsayi_topla(); fonksiyonunu ile basit bir fonksiyon uygulaması

1:  /* iki sayıyı topla ve sonucu ekranda göster */
2:  #include <stdio.h>
3:
4:  int tamsayi_topla( int x,int y );  /* fonksiyon prototipi */
5:
6: int main()
7: {
8:    int toplam;
9: /*
10:    fonksiyon çağırılıp, 5 ve 12 değerleri parametre olarak aktarılıyor.
11:    tamsayi_topla(5,12) = 5 + 12 değeri toplam değişkenine atanması.
12: */
13:    toplam = tamsayi_topla(5,12);
14:
15:    printf("5 ve 12 nin toplamı  %d dir.\n", toplam);
16
17: return 0;
18: }
19:
20: /* fonksiyon tanımlanması */
21: /* Bu fonksiyon iki tamsayıyı toplar ve sonucu sonuc değişkenine aktarır */
21:  int tamsayi_topla( int x, int y )
22:  {
23:     int sonuc;
24:     sonuc = x + y;
25:     return sonuc;
26:  }

 

Program 6.1 , basit bir fonksiyonun C programlama dilinde nasıl oluşturulduğunu ve kullanıldığını gösterir. 4. satırda kullanılacak olan fonksiyonun prototipi bildirilmektedir. Geleneksel olarak bütün fonksiyon kodları main() fonksiyonundan sonra bildirilir. (Gerçekte buna gerek yoktur. Fonksiyon bildirimleri main()den önce de tanımlanabilir.) Eğer geleneksel tercih yapılırsa, fonksiyonun adı main()den önce bildirilmelidir. Bu bildirime fonksiyon protipi(fonksiyon örneği) denir. 13. satırda toplam adlı tamsayı değişkenine tamsayi_topla() fonksiyonunun dönüş değeri, x + y değeri, atanır. 

Ana programdan, main() fonksiyonundan, isteğe göre birden çok fonksiyon çağırmak mümkündür. Bir fonksiyonun çağırılması demek, o fonksiyonun geri dönüş değerinin ana programda kullanılması demektir. Birden çok fonksiyonun main() tarafından nasıl çağrıldığını temsil eden blok diyagram Şekil 6.1 de gösterilmiştir. 

Ana programdan alt programların çağırılması 

Şekil 6.1 : Ana programdan fonksiyonların çağırılması. Fonksiyonu çağırmak için, fonksiyonun adını yazmak yeterlidir. 

Bir fonksiyonun her zaman geri dönüş değerinin olması gerekmez. Böyle fonksiyonların tipi void olarak belirtilmelidir. Bu tip fonksiyonlar başka bir yerde kullanılırken, herhangi bir değişkene atanması söz konusu değildir, çünkü geri dönüş değeri yoktur. Fakat void fonksiyonlara parametre aktarımı yapmak mümkündür. Örneğin Program 6.1 da kullanılan tamsayi_topla(): fonksiyonu void olarak şöyle bilidirilir: 

 /* x,y,z global değişken olmalıdır !... */
 void tamsayi_topla( int x,int y,int z )
 {
   z = x + y;
 }

Bu fonksiyon başka bir fonksiyonun içinde kullanılacaksa sadece isminin yazılması yeterli olacaktır. Mesela main() fonksiyonunda kullanmak istenirse:

 main()
 {
  ...
   tamsayi_topla(5,12,z);
   printf("5 ile 12 nin toplamı %d dir",z);
  ...
 }

şeklinde olacaktır. Program 6.2 'de, ne parametresi ne de geri dönüş değerine sahip tipi void olan mesaj_yaz() fonksiyonu ile, ekrana basit bir mesajın, fonksiyon kullanarak, çıkarılması gösterilmiştir. 

Program 6.2 : mesaj_yaz() fonksiyonunu ile ekrana mesaj verme

1:  /* void mesaj_yaz() ile ekrana mesaj yazar */
2:  #include <stdio.h>
3:
4:  void mesaj_yaz(void); /* fonksiyon prototipi */
5:
6:  main()
7:  {
8:     mesaj_yaz();  /* fonksiyonun çağırılması */
9:  }
10: /* fonksiyonun bildirimi */
11: void mesaj_yaz(void)
12: {
13:    puts("Merhaba...");
14: }

 

Program 6.2 'de 4. satırda void mesaj_yaz() fonksiyonunun prototipi bildirilmiştir. 8. satırda bu fonksiyonun sadece adı yazılmıştır. Derleyici bu satıra gelince hemen 11. satıra gidip puts() fonksiyonunu işleme koyar ve sonucu çağrıldığı yere, 8. satıra, gönderir. 

Bir fonksiyon istenilen yerde istenildiği kadar kullanılabilir. Program 6.3 de topla() fonksiyonu, ortalama() fonksiyonunun içinden çağırılmıştır. 

Program 6.3 : İki sayının toplamı ve ortalamasını fonksiyonlar kullanarak hesaplanması

1:   /* iki sayının toplamını ve ortalamasını hesaplar */
2:  #include <stdio.h>
3:
4:  int topla( int x,int y );
5:  float ortalama( int x, ,int y );
6:
7:  int x,y;  /* x ve y global olarak bildiriliyor */
8:
9:  main()
10: {
11:    puts("Toplamı ve ortalaması hesaplanacak iki sayı girin:");
12:    scanf("%d %d",&x,&y);
13:    printf( "\nToplamları : %d", topla(x,y) );
14:    printf( "\nOrtalaması : %f", ortalama(x,y) );
15: }
16:
17: /* iki sayının ortalamasını hesaplar */
18: float ortalama(x,y)
19: {
20:     float ort;
21:     ort = topla(x,y)/2.0;  /* topla(x,y) = x+y değeri çağırılıyor */
22:     return ort;
23: }
24:
25: /* iki sayının toplamını hesaplar */
26: int topla(x,y)
27: {
28:     return x+y;
29: }

 

Program 6.3 de, klavyeden girilen iki sayı 12. satırda okunmuştur. 13. ve 14. satırlarda fonksiyonlar sırasıyla çağırılmış ve sonuçları ekrana yazdırılmıştır. 21. satırda topla fonksiyounu, bir kez daha kullanılmıştır. 

Başlık dosyalarında da bolca olan makro fonksiyon tanımlaması #define önişlemci komutu kullanılarak yapılır. Örneğin aşağıdaki makro fonksiyonlar geçerlidir. 

  #define kare(x) (x)*(x)
  #define delta(a,b,c) (b)*(b)-4*(a)(c)
  #define yaz() puts("Devam etmek için bir tuşa basın...")
  #define PI 4*atan(1.0)

Bu şekilde tanımlanan fonksiyonların kullanımı, diğerleri gibidir. Yalnızca programın başında tanımlanır.

Hazırlayan Ömer Zafer ÖZGÖÇER

 

Yorum yapın

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Değiştir )

Twitter picture

You are commenting using your Twitter account. Log Out / Değiştir )

Facebook photo

You are commenting using your Facebook account. Log Out / Değiştir )

Connecting to %s

Takip Et

Get every new post delivered to your Inbox.