C Programlamaya bir bakış PDF Yazdır ePosta
Levent Türnüklü tarafından yazıldı   
Pazartesi, 09 Şubat 2009 19:22

  C Dilinin Kısa Tarihi

         UNIX işletim sistemi ile C programlama dili birbiriyle yakından ilişkilidir.Tarihleri 70'lerin başında başlar.İlginç olan şey de,AT&T Bell Laboratuvarlarından Ken Thompson tarafından yazılan bir bilgisayar oyun programından kaynaklanmaktadır.Thompson programını bir PDP_7 bilgisayarına uyarlamak istediğinde,bu küçük makina hakkında çok şey öğrendi,ancak işletim sistemini  pek beğenmedi.Bunun üzerine o zamanlar daha büyük bir makinada kullanılan MULTICS işletim sisteminin basitleştirilmiş ve değiştirilmiş bir uyarlamasını yazmaya karar veridi.Daha sonra,Dennis M. Ritche de ona katıldı ve Brain W. Kernighan tarafından UNICS (Uniplexed information and computing service(Birleştirilmiş Bilgi ve Hesaplama Hizmeti)) adı verilen işletim sisteminin ilk uyarlaması doğdu.Bu üç kişi C ve Unix'in tarihinde en önemli rolü oynadılar.Başlangıçta,Thompson,daha önceleri 1967 civarında geliştirilen BCPL adlı dilden etkilenerek B dilini tasarladı.Bundan sonra, Ritchie UNİX'i daha kolay bir şekilde yazma amacıyla C adında yeni bir dil tasarladılar.1973 yılında ise Ritchie ve Thompson C'yi kullanarak UNİX'i yeni baştan yazdılar.Sonuç o kadar iyiydi ki,1983'te ACM'in Turing Ödülü'nü almaya hak kazandılar.

C'de Program Geliştirme Ortamları 

C' de program yazabilmek için basit anlamda bir derleyici ve editor yeter. Kodlar ASCII metin dosyası formatında yazılır. Yazılan kodlar derlenir ve çalıştırılabilir dosya oluşur. Günümüzde C programlama dili ile ilgili birçok geliştirme ortamı bulunmaktadır. Bunlardan başlıcaları aşağıdaki gibidir.

 

1. Turbo C : Editör ve derleyici iç içedir. Borland firması tarafından geliştirildi. MS DOS ve Windows (NT, 95, 98, ME, 2000, XP, 2003) işletim sistemlerinde   çalışmaktadır. 

2. UNIX / Linux Editörleri : Burada herhangi bir editörde (vi, pico, emacs vb) kod yazılır. Emacs editöründe C komutları ve ifadeleri renkli olarak gözükür. Menülerden komut satırında yapılan işlemler yazılabilir. Aşağıdaki ilk satırda Linux ortamında GNU C derleyicisi olan gcc (http://gcc.gnu.org) ile program derlenir ve ikinci satırda derlenen program çalıştırılır.gcc merhaba.c -o merhaba
./merhaba
 

3. Borland C Builder : Borland firması tarafından geliştirilmektedir. Hazır bileşen ve nesnelerin olduğu bir geliştirme ortamıdır. MS Windows işletim sistemlerinde çalışmaktadır.

4. Kylix : Borland firması tarafından geliştirilmekte ve Linux işletim sistemlerinde çalışmaktadır. Delphi ve C Builder benzeri bir geliştirme ortamıdır.

 5. MS Visual C++ : Microsoft firması tarafından geliştirildi. MS Visual Stuido 6.0 paketi ile beraber gelmektedir. Windows işletim sistemlerinde çalışmaktadır.

6. Dev C++ : Bloodshed tarafından geliştirilmektedir. Windows işletim sistemlerinde çalışmaktadır. http://www.bloodshed.net/download.html adresinden ücretsiz olarak indirilebilir.yada buraya tıklayarak indirebilirsiniz.

Derleyiciler hakkında küçük düzeltmeler

     Eğer TcWin45 derleyicisi kullamaya karar verdiyseniz(okul labaratuvarlarında kullanılan) kurulumda yapılması gereken bir iki düzeltmeye ihtiyaç duyacaksınız.TcWin45 derleyicisini buradan indirebilirsiniz.

    Öncelile Bın dosayası içinden Tcw dosyasını çalıştırmalısınız,daha sonraki aşamada karşınıza çıkan ekranda options bölümünden project kısmını seçmelisiniz.

Project kısmının içinde include ve library kısmındaki adresleri bilgisayarın içindeki TCW klasöründeki adresleri ile değiştirmeliyiz.

lib ve include dosyasının adresini kopyalayıp project bölümündeki adresi kutucuğuna yapıştırmalıyız.

 

İlk program

Yazacağımız kodları Turbo C ve dev C++ derleyicelerindeki farklılıkları göstererek vermeye çalışacağım.

 

Bir C Programının Genel Yapısı

 

başlık dosyaları. Kullanılan deyimler ile ilgili

main()

{

                sabitler ;                                sabitlerin tanımlama bölümü

                değişkenler;          değişkenleri tanımlama bölümü

                deyimler;              Program gövdesi

}

 

Evet şimdi biraz kod yazmaya başlayalım...

#include

 Bir C  programlama dilinde, program başında diyez ('#') işareti ile başlayan satırlar geçekte C  diline ait olmayıp ön işlemci dilidir. Bu yüzden derleme işlemleri iki adımda yapılır

Bu önişlemci verilen dosyanın içeriğini, kullanıldığı yerde kaynak dosyasının içine ekler. Çoğunlukla derleyiciye ait komut kütüphanelerinde bulunan fonksiyonların prototiplerinin ve diğer çeşitli tanımlamaların bulunlunduğu (h uzantılı) başlık dosyalarının programa dahil edilmesinde kullanılır.

#include önişlemcisi ile kullanılan standart input output (genel giriş çıkış) ifadesinin kısaltılmış şeklidir.stdio.h bir kütüphanedir basit giriş çıkış komutlarının kullanılması için yazılması zorunlu olan kısımdır. C dilinde çalışma yapabilmek için çaşitli kütüphaneleri kullanmamız zorunludur.Örneğin, matematiksel işlemleri yapabilmek için maths.h kütüphanesi ,sistem saatini kullanmayı istiyorsak Time.h, grafiksel işlemler yapmak istersek graphics.h kütüphaneleri kodlarımızı yazmadan önce derleyiciye çağırmalıyız.Çünkü yazdığımız kodlar sadece gerekli kütüphaneler kullandığı zaman anlamlı ifadeler halini almaktadır, aksi halde derleyici tanımlanlayan ifade diyerek bizi uyaracaktır.

main()---> bu satır bize ana fonksiyonun kullanıldığı kısımdır. C dili ile bilinilmesi gereken önemli noktalardan biriside C dili bütünüyle fonksiyonlardan oluşan bir dildir.en basit işlemleri yaptığımız kısım bile ana fonksiyon olarak adlandırılır,bilgisayar ilk bu fonksiyonu çalıştırmaya başlar, bu fonksiyonda eğer diğer fonksiyonlar çağırılmışsa onlara gider ve en son yine bu fonksiyonda program tamamlanılır.

{ ---> satırı ana fonksiyonun yada programının başladığını göstermektedir.Bu ifade Pascal programlama dilinde Begin komutuyla aynı anlama gelmektedir.

printf --->satırında ki  komut ekrana çıktı veren komutur.Pascalda kullanılan writeln komutuyla aynı anlamdadır.

 Matematiksel ifadeler

Matematiksel ifadeleri günlük hayattaki biçimde bilgisayarda yazamadığımız için belli bir kurallar uymamız gerekir.  Kullandığımız matematiksel işlemler ve anlamları şöyledir:

+ , - , * , /         toplama, çıkarma, çarpma,  bölme

%   tamsayı bölme sonucundaki kalanı verir (modulus)

7. / 2   ---> 3.5         (nokta sayının gerçel yorumlanmasını sağlar)

7 / 2    ---> 3             (sayılar int kabul edilip sonuçta int tipine dönüştürülür)

7 % 2  ---> 1

2 % 7  ---> 2

2 / 7    ---> 0

Matematiksel ifadeler hesaplanırken izlenen adımlar:

1. Önce parantez içindeki ifadeler hesaplanır. İçiçe parantezler var ise hesaplamaya en içteki parantezden başlanır.

2. ilk önce * , /  ve % işlemleri daha sonra + ve - işlemleri yapılır.

3.    Öncelik sırası aynı olan işlemlerde hesaplama soldan sağa doğru yapılır.                   5./2*3   -->  7.5

  Atama Deyimi (Assignment)

Bir değişkene bir değer(sabit, değişken, ifade) vermek.

DeğişkenAdı = değer;

x = 8 ;

y = x + 15 ;

y = (8 - x) / (2 - x) ;

 

Örnek 2.7.1:   5x2+2 fonksiyonunun x=4.8 noktasındaki değerini

main()

{

   float x, y ;

   x = 4.8;

   y = 5 * x * x + 2;

}

 

Örnek 2.7.2:  Vize ve final notlarınından geçme notu

main()

{

  float vize, final, ort;

  vize = 50;

  final = 60;

  ort = vize * 0.4 + final * 0.6;

}

 

Örnek 2.7.3:  1998 yılına kadar geçen gün sayısı

main()

{

  float gun;

  int yil = 1996;

  gun = 365 * (yil - 1);

  gun = gun + (yil -1 ) / 4;

}

    printf  işlevi

Program içinde istenen değerleri çıktı birimlerine göndermek için kullanılır.  Normal kullanımında çıktı birimi olarak ekran kabul edilir. Kullanım biçimi:

 

  prinf( kontrol, )

ile belirtilen bilgiye göre parametreleri yazar. Kontrol metini iki kısımdan oluşur.

     o  sıradan karakterler: doğrudan yazılırlar.

     o  dönüşüm/biçim belirleyici karakterler: Değerlerin nasıl yazılacağı bildirilir.

 

  printf(" sonuç =  %d", k);

                             ---  integer değer yazılacaktır

              ---------          ekrana aynen aktarılır

 

Dönüşüm belirlemek için önce % karakteri ve ardından dönüşümün nasıl

olacağını belirten karakter verilir. Bu karakterlerden bazıları:

 

         d : decimal (integer)

         u : unsigned decimal

         c : char (tek karakter)

         s : string

         e : float/double sayıyı bilimsel gösterimde yaz

         f : float/double sayıyı [-] mmm.nnnnn biçiminde yaz

        ld : long integer

        lu : unsigned long integer

        Le,Lf : long double

 

ESC dizileri : \n  : satır başı,   \a : zil   , \t : tab,  \b : bir karakter geri

  

program parçası                        ekranda görünen / imleçin konumu

i = 5 ;

printf("%d",i) ;                           5

printf("'i=%d",i) ;                      i=5

printf("i=") ;

printf("%d",i) ;                           i=5 -

 

printf("i=\n") ;                             i=

printf("%d",i) ;                           5     alt satıra geçer

                                                   

printf('i=%d\n",i) ;                         i=5  alt satıra geçer

 

printf("%d  -  %d",i, 5*i);                5  -  25

   

Biçimli yazdırma

% karakteri ile dönüşüm karakteri arasına aşağıdaki karakterler de kullanılabilir.

 

        -  : sola dayalı yaz

        m  : yazılacak değer için ayırılan alan

        n  : değerin kaç karekteri yazılacağı

 

    s = "ABCDEF"

   printf("%10s  ",s);                     . . . . A B C D E F

                                        

   printf("%10.3s  ",s);                 . . . . . . . A B C

 

x = 128.5 ;                                             

printf("%7.2f",x) ;                                 # 128.50

                   

x = 85.47 ;                                          

printf("%6.3f",x) ;                                85.470

 

printf("%6.1f",x) ;                               ## 85.5                                                   

 

Örnek  : Yarıçapı belli dairenin alanını hesaplayan programı yazınız. (ilk yazılan program)

#include 

main()

{

const float PI=3.14;                                               

float   r, alan;

r = 7;

alan := PI*r*r;                                  

printf("Alan = %f", alan);   

}

 

Örnek  : En fazla dört basamak olabilen sayının basamak değerlerini yazdır. % ve / işlemlerinin  kullanımı.

#include

main()

{

  int i,y;

    

       y=1985;

       i= y / 1000;

       printf("%d",i);

       y= y-i*1000;

       i= y / 100;

       printf(" %d",i);

       y = y-i*100;

       i= y / 10;

       printf(" %d",i);

       y = y-i*10;

       printf(" %d\n",y);

       i = 1985;

       printf("%d ",i / 1000);

       printf("%d ",(i / 100) % 10);

       printf("%d ",(i / 10) % 10);

       printf("%d\n",i  % 10);   

}

 

Örnek: ax2+bx+c=0 tipi bir denklemin köklerini veren programı yazınız.

Girdi : a, b ve c katsayıları

Çıktı : denklemim kökleri.

 

Programın kodlanması:

 

#include              /* printf işlevi için */

#include              /* sqrt işlevi için     */

main()

{

   float a, b, c;

   float x1, x2;

   float d;

 

   a = 1;

   b = -3;

   c = 2;

   d = b * b - 4 * a * c;

   x1 = (-b + sqrt(d)) / (2 * a);

   x2 = (-b - sqrt(d)) / (2 * a);

 

   printf("Kökler = %f ,  %f",x1, x2);

 }

C dilinde karekök almak için bir deyim yoktur. Örnekte bunu yerine getiren C diline eklenmiş olan sqrt() fonksiyonu kullanılmştır.  Aşağıda buna benzer artık C derleyecilerinde  standart olmuş bazı fonksiyonlar verilmiştir. Bu işlevler math.h başlık dosyasında tanımlıdır.

Fonksiyon                x ,y             Sonuç

abs(x)                        int                  int                        x'in mutlak değeri                       

fabs(x)                      double          double                x'in mutlak değeri                       

pow(x, y)                  double          double                xy                                                   

sqrt(x)                        double          double                x'in karekökü                               

exp(x)                        double          double               ex değeri                                        

log(x)                         double          double               ln(x) değeri                                    

log10(x)                    double          double               log10(x) değeri                              

ceil(x)                        double          double                x ten büyük ilk tamsayı            

floor(x)                      double          double                x ten küçük ilk tamsayı

  

Örnekler:

ceil(5)                        5

ceil(5.2)                     6

ceil(-5.2)                    -5

floor(5)                      5

floor(5.2)                  5

floor(-5.2)                 -6

 scanf  İşlevi

Klavyeden veri okumak için kullanılır. Yapı olarak printf işlevi ile hemen hemen aynıdır. Kullanım biçimi:

 

  scanf( kontrol, )

 

Girilen karakterler metininde belirtilen biçimlere göre değişkenlere aktarılır.

Değişkenler işaretçi tipinde olmalıdır. Yani parametre olarak değişkenin adresi gönderilmelidir.

Ayırıcılar  boşluk, tab, enter

 

  scanf("%f %f %f ", &a, &b, &c);

 

  scanf işlevinin değeri

      0 ise hiçbir değişkene değer atanmamış

     >0 ise başarılı bir şekilde değer atanan değişken sayısı

int a,b,c;

float m,n;

scanf("%d", &a);                  Klavyeden tamsayı okur. Girilen değer a değişkenine aktarılır.

scanf("%d %d",&a,&b)        Klavyeden girilen ilk değer a değişkenine, ikinci değer b değişkenine aktarılır.

scanf("%f %d", &m, &a);     Klavyeden ilki gerçel, ikincisi tamsayı olmak üzere iki değer okur.

 

İkinci dereceden denklem çözümünün yapıldığı örnekte katsayıları klavyeden okutmak istersek

 

scanf("%f %f %f ", &a, &b, &c);

 

Farklı kullanıcı arayüzünde yazarsak

 

printf(“Katsayıları sırasıyla giriniz (a  b  c) :” );   scanf("%f %f %f ", &a, &b, &c);

 

printf(“a katsayısını giriniz : “);  scanf(“%f”, &a);

printf(“b katsayısını giriniz : “);  scanf(“%f”, &b);

printf(“c katsayısını giriniz : “);  scanf(“%f”, &c);

 

Örnek :  Vize ve final notlarınından ortalamayı hesaplayan programda değerlerin klavyeden okunmuş hali.

main()

{

  float vize, final, ort;

  printf(“Vize notunu giriniz “);  scanf(“%f”, &vize);

  printf(“Final notunu giriniz “);  scanf(“%f”, &final);

  ort = vize * 0.4 + final * 0.6;

  printf(“Ortalaması = &f\n”, ort);

}

 

 Mantıksal ifadeler

Sonucu Doğru  veya Yanlış olan ifadelerdir.  Sonuç sıfır ise yanlış aksi halde doğru kabul edilir.

İlişkisel işleçler(operatör) : iki değer arasındaki ilişkiyi test etmek için kullanılır.

                işleç        anlamı

                >             büyük

                >=           büyük - eşit

                ==           eşit

                <             küçük

                <=           küçük - eşit

                !=            eşit değil

                                 

                x=8,  y=5 için

                x > y       Doğru

                x < y       Yanlış

                x !=y      Doğru

 

Mantıksal işleçler : İki mantıksal ifade arasındaki ilişki üzerindeki ilişkide kullanılır.

!       DEĞİL  (NOT)

&&  VE         (AND)

||       VEYA   (OR)

 

                (X>0) && (X>Y)       

(X>0) || (Y>0)

 

İfadelerde işleçlerin yürütülme sırası

                   işleç                                                                    Önceliği

                   (  )                                                                       en yüksek (ilk yürütülür)

                   !                                                                                                        

                   *, /, %

                   +, -

                   <, <=,  >=,>

                   ==, !=

                   &&, ||

                   =                                                                         en düşük (son yürütülür) 

= işleci sağdan sola, diğerleri soldan sağa doğru yürütülür.

Görüldüğü gibi ifadelerde  matematiksel ve mantıksal işlemler bittikten sonra ilişki test edilir.

                X=50, Y=80, Z=45 için

                ( ( X / 4 + Y / 4 + Z / 2 ) >= 50  ) && ( Z >= 50 )

 

2-ifade yazdırma

      Şimdi istediğimiz bir değeri ekrana yazdırma işlemini gerçekleştireceğiz.Bu işlemi gerçekleştirirken Dev C++ derleyici kullanacağım,çünkü eğer dev C derleyici kullanıyorsanız ekranınız işlem çıktısını görüntülemeden kapandığını farkedeceksiniz.Bu problemin kısa çözümünü ifade etmeye çalışacağım.

 

 İnclude  ----> Bu satır dikkat edeceğiniz gibi bir önceki örneğimizden farklı olarak karşımızda.Farklı olmasının sebebi bu program dev C derleyicisinde hazırlandı,diğer derleyici Tcwin45 derleyicisinde hazırlanmıştı.Dev c derleyicisi bi işlemi yaptıktan sonra en son işlemi gösterir ama bizim göremeyeceğimiz hızda ekranı program sonlandı diye kapatır.Fakat bu işlem o kadar hızlı gerçeklerşir ki bize program çalışmadı izlenimi verebilir.Biz bu prolemi yine makinayı kullanarak aşabiliriz.Eğer işlem bittikten sonra herhangi bi tuşa basana kadar programı sonlandırma dersek derleyici istediğimiz işlemi yapmış olur ve ekran açık kalır her hangi bir işlemden sonra çıktıyı bir tuşa basana kadar görmüş oluruz.

         Herhangi bi işlemi bu şekilde kullanabilmek için getch() komutunu programın sonunda kullanabiliriz ve getch() komutunun derleyicide bi anlam ifade etmesi için conio.h kütüphanesini çağırmamız gerekiyor.

İnt x ----> Bu yapı klasik  değişken ifadesidir,pascaldan en önemli farkı programın içinde yazılması.İfadenin int olması sayısal bir değer olduğunu gösterir.Bunlarla ilgili ayrıntı Nevcihan Hocamız itinayla gösterecektir zaten.

\n -----> İfadesi program işlenirken bu karakterin olduğu yer her neresi olursa olsun fakat printf("%d"); basit yapısı halinde olmalı program yazacağı ifadeyi yada imleci bir alt satıra indirmek için kullanılır,bu ifade cümlenin başındada sonundada ihtiyaca göre kullanılır.

aynı tarzda \t imleci bir tab boyunda ileri atarak yazmaya devam eder,bu örnekleri çoğaltabiliriz.

\n -------> Yeni satır             \f -----> sayfa ilerletme            \" ------> çift tırnak

\b -------->Geri alma             \v ----->dikey durak                \? ------> soru işareti

\r --------> Satır başı             \a ------>zil (ses modu)            \\ ------> ters bölü

\t -------->durak(tab)           \ ' ------>tek tırnak                  \0 -------> boş karakter

\ddd ----->sekizli kodu ddd olan karakter    örnek: '\101' sekizli kodu '101' olan A harfini yazar.

\xhhh ----->onaltılı kodu hhh  karakter       örnek: '\x041' onaltılı kodu '041' olan A harfini yazar.

 

     Bu makalemizin sonuna geldik,döngüler ve dosyalama ile ilgili konular internet üzerinde bir hayli fazla olduğu için tam anlamıyla o konuya girmedik fakat onlarala ilgili ilginç yönleri anlatan makaleler önümüzdeki günlerde hazırlanacaktır...

     Birazcık olsun katkımız olduysa ne mutlu bizlere....görüşmek üzere....

Konu ile ilgili düşüncelerini, aklınıza takılanları ve sorularınızı BURADAN paylaşabilirsiniz...

Yazar : Levent Türnüklü
Son Güncelleme: Perşembe, 05 Mart 2009 23:39