Sehitler Ölmez C program dili öğrenmek isteyenler
hack, Program, Oyun, Ceptelefonu, Ogame, crack, serial, donanım
Eylül 07, 2008, 08:10:12 ÖÖ *
Program, Oyun, Crack, Serial, Msn Hack, Hacking ve güvenlik portalına hoşgeldiniz.. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz
 


Sayfa: [1] 2   Aşağı git
Yazdır
Gönderen Konu: C program dili öğrenmek isteyenler  (Okunma Sayısı 2039 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
Asil_Turk
Teğmen
*

Rep Puanı : 2


Offline Offline

Konu Sayısı : 6 Mesaj Sayısı: 50

ÖNCE VATAN


« : Ekim 06, 2007, 04:28:00 ÖS »

Tarihçe
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 (Asembler) 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.
C'nin yayılması ve gelişmesi, büyük bir bölümü C dili ile yazılan UNIX işletim sisteminin popüler olmasıyla başlamıştır. C Programlama Dili, hemen her alanda kullanılmaktadır. Günümüzde nesneye Yönelik programlama dilleri (C++, Java) ve script dilleri (JavaScript, JavaApplet, PHP) gibi programlama dilleri tamamen C tabanlıdır. Kısacası Standart C (ANSI C) dilini ögrenmekle bu dillerin tamamına iyi bir hazırlık yapmış olursunuz. Bu yüzden derslerimizde ağırlıklı olarak 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, iyi bir yazılım geliştirme ortamına sahiptir.
•   C, özel komut ve veri tipi tanımlamasına izin verir.
•   C taşınabilir bir dildir. Yani herhangi bir C kodu hiçbir 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.
•   C++, Java, JavaScript, JavaApplet, PHP, C#, ... gibi dillerin temelinde C vardır.

İlk C Programı
Program 1.1 de verilen C programı derlendikten sonra, ekrana 'Merhaba Dünya!' yazısını basan yalın bir C programıdır. Satır başlarına yerleştirilen 1:, 2: 3: ... rakamlarının yazılmasına gerek yoktur. Bu rakamlar sadece daha sonra program ile ilgili açıklama yapılırken, ilgili satırda bulunan kodlar izah edilirken kullanılacaktır.
Program 1.1: Derlendikten sonra ekrana Merhaba Dünya! yazar

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

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 programının komut satırında nasıl derleneceği Tablo 1.1'de verilmiştir. 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ı
İşletim Sistemi   Derleyici   Derleme   Çalıştırma
MS-DOS / Windows   Microsoft C   cl ilk.c   ilk.exe
   Borland Turbo C Web
tcc ilk.c   ilk.exe
   Borland C   bcc ilk.c   ilk.exe
   Zortec C   ztc ilk.c   ilk.exe
   GCC (GNU Compiler Collection) for Windows Web
gcc ilk.c -o ilk.exe   ilk.exe
UNIX / Linux   GCC (GNU Compiler Collection) Web
gcc ilk.c -o ilk   run ilk veya ./ilk veya ilk
ilk.c nin Borland Turbo C ve GCC Programları ile derlenmesi ve çalıştırılması:
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc ilk.c
C:\TC> ilk.exe   ş gcc ilk.c -o ilk
ş ./ilk
 NOT
Turbo C Editör ortamında derlenirken CTRL + F9 kısayol tuşlarını kullanabilirsiniz.
ilk.c nin çıktısı:
ÇIKTI

  Merhaba Dünya!
ilk.c programında, 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 (değerlendirilmez). Yani /* */ ifadeleri açıklama operatörüdür.
 NOT
Açıklama operatörü olarak C++ tarzı iki-bölü (//) de kullanılmaktadır. Günümüzde birçok C derleyicisi // operatörünü desteklemektedir. Bu operatörü kullanmadan önce derleyicinizin bu operatörü desteklediğinden emin olun.
 /*
    Bu satırlar derleyici tarafından
    değerlendirilmez. Ayrıca programın           C tarzı
    çalışma hızını da değiştirmez.
 */

 // Bu satırlar derleyici tarafından
 // değerlendirilmez. Ayrıca programın           C++ tarzı
 // çalışma hızını da değiştirmez.

2. satırda yazılı olan #include deyimi, programda eklenecek olan başlık dosyanını işaret eder. Bu örnekte verilen başlık dosyası (header file) stdio.h dir. #include <stdio.h> ifadesi stdio.h dosyasının derleme işlemine dahil edileceğini anlatır[2]. Bu dosyalar Ders 20: C Makroları kısımlarında tekrar 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 (bkz. Ders 5: Temel G/Ç Fonksiyonları). stdio.h bu fonksiyon için kullanılmıştır.
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 dahil edilir. C kütüphanesinde bulunan birçok fonksiyon, başlık dosyaları içindeki bazı bildirimleri kullanır. Bu tür dosyaların uzantısı .h dir. ANSI C deki standart başlık dosyaları şunlardır:
  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. Ayrıca Bakınız: Ders20: C Makroları
ilk.c programında kullanılan başlık dosyası stdio.h, #include <stdio.h> ifadesi ile derleme işlemine dahil edilmiştir. stdio.h standard giriş/çıkış (STandarD-Input-Output) kütüphane fonksiyonları için bazı bildirimleri barındıran bir dosyasıdır. Programda kullanılan printf() fonksiyonunu kullanmadan önce bu başlık dosyası programın başına mutlaka ilave edilmelidir. Aksi halde derleme esnasında undefined reference to _printf şeklinde bir hata mesajı ile karşılaşılır.

C Kodlarının Temel Özellikleri
Bir C programı aşağıda verilen özellikleri mutlaka taşımalıdır.
•   Yazılımda kullanılacak olan her fonksiyon için ilgili başlık dosyası programın başına ileve edilmedlidir.
•   Her C programı main() fonksiyonunu içermelidir.
•   Program içinde kullanılacak olan değişkenler ve sabitler mutlaka tanımlanmalıdır.
•   Satırın sonuna ; işareti konmalıdır.
•   Her bloğun ve fonksiyonun başlangıcı ve bitişi sırasıyla { ve } sembolleridir.
•   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.

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;
•    const int STATUS=0x0379;
•   Her alt yapıya girerken birkaç boşluk veya 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:
•    h_max = 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) )*log( fabs(y) );
•   Program bittikten sonra tekrar tekrar programınızı inceleyerek, programınızı daha iyi şekilde yazma yollarını arayın ve aynı fonsiyonları 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. Giriş
Orta ve yüksek seviyeli dillerin hepsinde değişken kavramı bulunmaktadır. Değişkenler bellekte bilginin saklandığı gözlere verilen sembolik adlardır. Bir C programında, bir değişken tanımlandığında bu değişken için bellekte bir yer ayrılı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[1], [3]. Bunlar Tablo 2.1'de 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: /* 02prg01.c : sizeof operatörünün kullanımı */
 2:
 3: #include <stdio.h>
 4:
 5: main()
 6: {
 7:   printf( "\nchar           : %d byte", sizeof( char ));
 8:   printf( "\nint            : %d byte", sizeof( int ));
 9:   printf( "\nshort          : %d byte", sizeof( short ));
10:   printf( "\nlong           : %d byte", sizeof( long ));
11:   printf( "\nunsigned char  : %d byte", sizeof( unsigned char ));
12:   printf( "\nunsigned int   : %d byte", sizeof( unsigned int ));
13:   printf( "\nunsigned short : %d byte", sizeof( unsigned short ));
14:   printf( "\nunsigned long  : %d byte", sizeof( unsigned long ));
15:   printf( "\nfloat          : %d byte", sizeof( float ));
16:   printf( "\ndouble         : %d byte", sizeof( double ));
17:   printf( "\nlong double    : %d byte", sizeof( long double ));
18:
19:   return 0;
20: }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 02prg01.c
C:\TC> 02prg01   ş gcc 02prg01.c -o 02prg01
ş ./02prg01
ÇIKTI
Turbo C   GCC
char           : 1 byte
int            : 2 byte
short          : 2 byte
long           : 4 byte
unsigned char  : 1 byte
unsigned int   : 2 byte
unsigned short : 2 byte
unsigned long  : 4 byte
float          : 4 byte
double         : 8 byte
long double    : 10 byte   char           : 1 byte
int            : 4 byte
short          : 2 byte
long           : 4 byte
unsigned char  : 1 byte
unsigned int   : 4 byte
unsigned short : 2 byte
unsigned long  : 4 byte
float          : 4 byte
double         : 8 byte
long double    : 12 byte
Değişkenler için Kurallar
•   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) yada rakamlar (0-9) 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 ANSI C 'nin anahtar kelimeleridir (key words) ve değişken ismi olarak kullanılamaz.
•      auto      double   int       struct
•      break     else     long      switch
•      case      enum     register  typedef
•      char      extern   return    union
•      const     float    short     unsigned
•      continue  for      signed    void
•      default   goto     sizeof    volatile
•      do        if       static    while
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 gelmiş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ır ve bazen gerekli de olabilir. Aşağıda verilen simgesel sabit bildirimleri geçerlidir. #define önişlemcisi ile makro fonksiyon tanımalama işlemi Ders20: C Makroları 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, iç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 veya takı (cast) yazılarak sonucun hangi tip çıkması istendiği söylenebilir. Genel yazım biçimi:
      (tür tipi)  bağıntı;
 NOT
Tamsayılar arası bölme kesme hatalarına (truncation error) neden olur. Bunun anlamı iki tamsayının oranı yine bir tamsayıdır.
örneğin: 4/2=2; ama 3/2=1 (1.5 değil).
x int, a ve b float tipinde iki değişken olsun:
      int x=9;
      float a,b,c;
      ...
      a = x/4;
      b = x/4.0;
      c = (float) x/4;
işleminin sonucunda a değişkenine 2.0, b ve c değişkenlerine 2.25 değeri aktarılır. Yani 9/4 ile 9/4.0 farklı anlamdadır. Giriş
Operatörler, değişkenler veya sabitler üzerinde matematiksel ve karşılaştırma işlemlerini yapan simgelerdir. Bazı kitaplarında operatör yerine işlemci kelimesi de kullanılmaktadır. Derslerimiz boyunca bu iki ismi biribiri yerine kullanabiliriz. ANSI C'de dört tip operatör tanımlıdır.

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
Operatör   Açıklama   Örnek   Anlamı
+   toplama   x+y   x ve y nin toplamı
-   çıkarma   x-y   x ve y nin farkı
*   carpma   x*y   x ve y nin çarpımı
/   bölme   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. Bu operatörler Tablo 3.2'de listelenmiştir.
Tablo 3.2: Atama Operatörleri
Operatör   Açıklama   Örnek   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 arttırma   x++ veya ++x   x=x+1
--   bir azaltma   x-- veya --x   x=x-1

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

 1: /* 03prg01.c: Aritmetik ve atama operatorlerinin kullanimi */
 2:
 3: #include <stdio.h>
 4:
 5: main()
 6: {
 7:     int x, y;  /* yerel degikenlerin bildirimi */
 8:
 9:     x = 1;   /*  x in baslangic degeri  */
10:     y = 3;   /*  y nin baslangic degeri */
11:
12:     printf(" x = %d ve y = %d, olarak veriliyor.\n", x, y);
13:
14:     x = x + y;
15:     printf("x <- x + y  atamsinin sonucunda x=%d dir\n", x);
16:
17:     x = 1;  /* x e tekrar 1 degeri ataniyor */
18:     x += y;
19:     printf("x += y  atamasinin sonucunda x=%d dir\n", x);
20:
21:  return 0;
22: }
Bu program, x = x + y ataması ile x += y atamasın aynı anlamda olduğu gösterir. 9. ve 10. satırlarda x ve y değişkenlerine başlangıç değerleri atanmıştır. Bu değerler 12. satırda ekrana Ders 5: Temel G/Ç Fonksiyonları ayrıntılı olarak işlenecek olan printf() fonksiyonu ile ekrana yazdırılmıştır. 14. ve 18. satırdaki ifadeler ekrana yazdırıldığında sonucun değişmediği görülür.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 03prg01.c
C:\TC> 03prg01   ş gcc 03prg01.c -o 03prg01
ş ./03prg01
ÇIKTI

x = 1 ve y = 3, olarak veriliyor.
x <- x + y  atamsinin sonucunda x=4 dir
x += y  atamasinin sonucunda x=4 dir
Karşılaştırma Operatörleri ve Mantıksal Operatörler
Tablo 3.3'de listelenen bu operatörler, sayısal değerleri veya karakterleri karşılaştırmak için kullanılır. Bu operatörlerin kullanımı Ders 7: Karşılaştırma Deyimleri kısmında gösterilecektir.
Tablo 3.3: Karşılaştırma Operatörleri ve Mantıksal Operatörler
Operatör   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 İş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
Operatör   Açıklama   Örnek   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)
Bit düzeyinde işlem yapan operatörler C dilinde sıkça kullanılmakatadır. Örneğin Ders 4: Kütüphane Fonksiyonları kısmında görülecek olan ctype.h kütphanesinde tanımlı toascii(c) makro fonksiyonu, c sayısı ile verilen ASCII koda sahip karakteri verir. Bu fonksiyon aslında Program 3.2'deki işlemi yapmakatadır.
Program 3.2: Bit düzeyinde VE işlemi

 1: /* 03prg02.c:
 2:    Bir tamsayının ASCII karakter kod karşılığının bulunması.
 3:    (ctype.h kütüphanesinde tanımlanan toascii(c) makrosuna ait kod) */
 4:
 5: #include <stdio.h>
 6:
 7: int  c=65;  /* gloabal değişken bildirimi */
 8: char kr;
 9:
10: void main()
11: {
12:    kr = c & 0x7f;  /* kr = c & 127 */
13:    printf("%d sayisinin ASCII karsiligi %c\n",c,kr);
14: }
12. satırda kr değişkenine kr = 65 & 127 (01000001 & 01111111) işlemi kr = 65 (01000001) değeri atanmaktadır ve bu 'A' karakteridir. Eğer c>127 olursa 12. satırdaki işlemle bu sayı maskelencektir. Örneğin c=163 olduğunda kr=163 & 127 (10100011 & 01111111) = 35 (00100011) işlemiyle kr değişkenine 35 sayısına karşılık gelen '#' karakteri atanır. Oysa kr=c ataması yapılsaydı: k=163 (10100011) = 'ú'. Öyle ise 13. satırdaki işlemle kr = c & 127 = c-128 ataması gerçekleştirilmektedir.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 03prg02.c
C:\TC> 03prg02   ş gcc 03prg02.c -o 03prg02
ş ./03prg02
ÇIKTI

65 sayisinin ASCII karsiligi A


Logged
Asil_Turk'in Imzasi

VATAN İÇİN KAN DÖKMEK GEREKİRSE DÜNYANIN ŞAH DAMARINI KESERİM!!!
Asil_Turk
Teğmen
*

Rep Puanı : 2


Offline Offline

Konu Sayısı : 6 Mesaj Sayısı: 50

ÖNCE VATAN


« Yanıtla #1 : Ekim 06, 2007, 04:29:47 ÖS »

Giriş
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. Genel yazım biçimi:
      int printf(const char *format,...);
Basit olarak eğer ekrana Hata oluştu!.. şeklinde bir mesaj yazırmak için, printf fonksiyonu çağırmak ve fonsiyon 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 x tamsayı değişkeninin sayısal değerini ekrana yazdırmak istediğimizi 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.
*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 4.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 4.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 4.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 4.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() fonsiyonu ile ekrana yazıdı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 y nin toplamı söyle yazılabilir:
      z = x + y;
      printf("%d",z);
Bu ifade şu şekilde de yazılabilir:
      printf("%d",x+y);
printf fonksiyonu kullanımı Program 4.1'de verilmiştir.
Program 4.1: printf() fonksiyonunun kullanımı

 1:  /* 04prg01.c: sayısal değerleri ekrana yazdırmak için printf fonksiyonunun kullanımı */
 2:
 3:  #include <stdio.h>;
 4:   
 5:  /* global değişken tanımlamaları */
 6:  int   a = 2,    b = 10,   c = 50;
 7:  float f = 1.05, g = 25.5, h = -0.1 ,yuzde;
 8:
 9:  main()
10:  {
11:     printf("3 tamsayi       : %d %d %d\n", a, b, c);
12:     printf("3 tamsayi [TAB] : %d \t%d \t%d\n", a, b, c);
13:
14:     printf("\n");
15:
16:     printf("3 reel sayi (yanyana) : %f %f %f\n", f, g, h);
17:     printf("3 reel sayi (altalta) : \n%f\n%f\n%f\n\n", f, g, h);
18:
19:     yuzde = 220 * 25/100.0;
20:     printf("220 nin %%25 i %f dir\n", yuzde);
21:     printf("%f/%f isleminin sonucu = %f\n", g, f, g / f);
22:
23:     printf("\nprogram sonunda beep sesi cikar...\a");
24:
25:     return 0;
26: }
Program 4.1, printf() fonksiyonu ile değişkenlerin ekrana nasıl yazıldığını göstermektedir. 6. ve 7. satırlarda değişkenler global olarak bildirilmiştir. Program içinde \t, \n ve \a kontrol karakterlerinin nasıl kullanıldığı çok açıktır.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 04prg01.c
C:\TC> 04prg01   ş gcc 04prg01.c -o 04prg01
ş ./04prg01
ÇIKTI

3 tamsayi       : 2 10 50
3 tamsayi [TAB] : 2     10      50

3 reel sayi (yanyana) : 1.050000 25.500000 -0.100000
3 reel sayi (altalta) :
1.050000
25.500000
-0.100000

220 nin %25 i 55.000000 dir
25.500000/1.050000 isleminin sonucu = 24.285715

program sonunda beep sesi cikar...
printf fonksiyonunun geri dönüş değeri int tipindedir. Bu geri dönüş değeri çıktının bayt sayısıdır. Yani, printf fonksiyonu, *format ile tanımlanmış karakter topluluğunun kaç bayt olduğu hesaplar[6]. Program 4.2, printf'in bu yönünüde ortaya çıkaran bir programdır.
Program 4.2: printf() fonksiyonunun kullanımı

 1: /* 04prg02.c: printf fonksiyonunun geri dönüş değerini gösterir */
 2:
 3: #include <stdio.h>
 4:
 5: main()
 6: {
 7:    int karSay;
 8:    int sayi = 1234;
 9:
10:    karSay = printf("Ugurlu sayim = %d\n",sayi);
11:    printf("Katarin uzunlugu : %d dir",karSay);
12: }
10. satırdaki işlemle, hem ekrana Ugurlu sayim = 1234 iletisi bastırılmakta, hem de karSay değişkenine bu iletinin uzunluğu atanmaktadır. Ekrana basılan katarın uzunluğu (\n karakteri dahil) 20 dir.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 04prg02.c
C:\TC> 04prg02   ş gcc 04prg02.c -o 04prg02
ş ./04prg02
ÇIKTI

Ugurlu sayim = 1234
Katarin uzunlugu : 20 dir
puts() Fonksiyonu
       puts(*string);
*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 4.1 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 4.1 ve Tablo 4.2'de verilen karakterleri kullanır. Örneğin klaveden bir x tamsayısı okumak için:
     scanf("%d",&x);
satırını yazmak yeterli olacaktır. Burada & işareti adres operatörü olarak adlandırılır ve Ders 10: Pointerler kısmında ayıntılı olarak açıklanacaktır. Klavyeden iki farklı sayı okunmak istendiğnde scanf() fonksiyonu şöyle kullanılır:
     scanf("%d %f",&x,&y);
veriler klavyeden
16 1.568
yada
16        1.568
veya
16
1.568
şekilinde girilebilir. Program 4.3'de scanf() fonsiyonunun kullanımı gösterilmiştir.
Program 4.3: scanf() fonksiyonun kullanımı

 1:  /* 04prg03.c: scanf() fonksiyonu ile int, char ve float tipindeki verilerin okunması */
 2:
 3:  #include <stdio.h>
 4:
 5:  main()
 6:  {
 7:     int   x;
 8:     float y;
 9:     char  c;
10:
11:     printf("Bir tamsayi girin  : "); scanf("%d",&x);
12:     printf("Bir karakter girin : "); scanf("%s",&c);
13:     printf("Bir reel sayi girin: "); scanf("%f",&y);
14:     
15:     printf("\n\ttamsayi   : %d",x);
16:     printf("\n\tkarakter  : %c",c);
17:     printf("\n\treel sayi : %f\n",y);
18:
19:     puts("girdin.");
20:     puts("Bye.");
21:  }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 04prg03.c
C:\TC> 04prg03   ş gcc 04prg03.c -o 04prg03
ş ./04prg03
ÇIKTI

Bir tamsayi girin  : 236
Bir karakter girin : H
Bir reel sayi girin: 177.778

        tamsayi   : 236
        karakter  : H
        reel sayi : 177.778000
girdin.
Bye.
gets() Fonksiyonu
Klavyeden bir karakter topluluğu (katar) okumak için kullanılır. Okuma işlemi yeni satır karakteriyle(\n) karşılası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ı, klavden 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 dudurup, bir karakater 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.
Formatlı Çıktı
Bundan önceki kısımlarda kullanılan programlardaki değişkenler serbest formatta (derleyicinin belirlediği format) yazılmıştır. Bazen giriş ve çıkışın formatı kullanıcı tarafından belirlenmesi gerekebilir. Bu işlem:
Tamsayılarda %d yerine %wd
Reel sayılarda %f yerine %w.kf
Stringlerde %s yerine %ws
biçimindeki kullanım ile sağlanır. Burada w yazılacak olan sayının alan genişliği olarak adlandırılır. Reel bir değişken ekrana yazılacaksa, değişkenin virgülden sonra kaç basamağının yazdırılacağı k sayısı ile belirlenir (w>k+2 olmalı).
     int i=583,j=1453;

     printf("%d %d\n",i,j);
     printf("%5d %8d\n",i,j);
program parçası çalıştırıldığında aşağıdaki sonuç gözlenir:
583 1453
  583     1453
Birinci satır serbest formatta ikinci satır ise formatlı yazılmıştır. i değişkeninin tuttuğu 583 sayısı %5d formatıyla yazdırılınca, bu sayı için 5 alan genişliği tanımlanır arakasından sağdan başlayarak sayı bu alana yazılır. Yani:
12345
-----
  583
Benzer olarak ikinci sayıda
12345678
--------
    1453
Reel sayılarda iş biraz daha karışık. Örneğin:
     int x=123.456;

     printf("%f\n",x);
     printf("%8.2f\n",x);
program parçası çalıştırıldığında aşağıdaki sonuç gözlenir:
123.456001
  123.46
Birinci satır serbest formatta ikinci satır ise formatlı yazılmıştır. İkinci satırda x değişkeni için ayrılan alan genişliği 8 ve noktadan sonra 2 basamağa kadar hassasiyet önemsenmiştir. Dikkat edilirse noktadan sonra sayı uygun bir şekilde yuvarlanmış ve sayı sağa dayalı olarak yazılmıştır. Formatı ayrıntılı olarak incelersek:
12345678
--------
  123.46
Program 4.4: printf() in formatlı kullanımı

 1: /* 04prg04.c: Formatlı çıktı */
 2:
 3: #include <stdio.h>
 4:
 5: main()
 6: {
 7:    float x     = 7324.25;
 8:    int   i     = 1299;
 9:    char  c[15] = "Merhaba C";
10:
11:    printf("%10.5f\n",x);
12:    printf("%10d\n"  ,i);
13:    printf("%10s\n"  ,c);
14: }
15:
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 04prg04.c
C:\TC> 04prg04   ş gcc 04prg04.c -o 04prg04
ş ./04prg04
ÇIKTI

7324.25000
      1299
 Merhaba C
Logged
Asil_Turk'in Imzasi

VATAN İÇİN KAN DÖKMEK GEREKİRSE DÜNYANIN ŞAH DAMARINI KESERİM!!!
Asil_Turk
Teğmen
*

Rep Puanı : 2


Offline Offline

Konu Sayısı : 6 Mesaj Sayısı: 50

ÖNCE VATAN


« Yanıtla #2 : Ekim 06, 2007, 04:31:26 ÖS »

Giriş
Bu kısımda C Programlama Dili'nde sıkça kullanılan kütüphane fonksiyonlarının bazıları liste halinde sunulmuştur. Kütüphane fonksiyonu C dilinde önceden tanımlanmış hazır fonksiyonlarıdır. C dilinde birçok iş bu fonksiyonlarla yapılabilmektedir. Aslında her iş için bir fonksiyon bulmak olası. Bütün kütüphane fonksiyonlarının tamamı buradakilerden çok daha fazladır.
 NOT
Her kütüphane fonksiyonu bir başlık dosyasında tanımlanmıştır. Bu yüzden bir kütüphane fonksiyonunu kullanmadan önce, onun hangi başlık dosyası ile kullanılması gerektiğini bilmelisiniz.
Matematiksel Fonksiyonlar (math.h)
Matematiksel fonksiyonların tipleri double dır. Bu fonksiyonlardan biri program içinde kullanılacaksa math.h başlık dosyası program içine eklenmelidir. En çok kullanılan matematiksel fonksiyonlar Tablo 5.1'de listelenmiştir.
Tablo 5.1: math.h kütüphanesinde tanımlı bazı fonksiyonlar
Fonksiyon Bildirimi   Açıklama   Örnek   Sonuç
int abs(int x);   x tamsayısının mutlak değerini hesaplar   abs(-4)   4
double fabs(double x);   x gerçel sayısının mutlak değerini hesaplar   fabs(-4.0)   4.000000
double floor(double x);   x'e (x'den büyük) en yakın tamsayıyı gönderir   abs(-2.7)   3.000000
double ceil(double x);   x'e (x'den küçük) en yakın tamsayıyı gönderir   abs(5.6)   5.000000
double sqrt(double x);   pozitif x sayısının karekökünü hesaplar   sqrt(4.0)   2.000000
double pow(double x, double y);   x^y (xy) değerini hesaplar   pow(2.0,3.0)   8.000000
double log(double x);   pozitif x sayısının doğal logaritmasını hesaplar, ln(x)   log(4.0)   1.386294
double log10(double x);   pozitif x sayısının 10 tabanındaki logaritmasını hesaplar   log10(4.0)   0.602060
double sin(double x);   radyan cinsinden girilien x sayısının sinüs değerini hesaplar   sin(3.14)   0.001593
double cos(double x);   radyan cinsinden girilien x sayısının kosinüs değerini hesaplar   cos(3.14)   -0.999999
double tan(double x);   radyan cinsinden girilien x sayısının tanjant değerini hesaplar   tan(3.14)   -0.001593
double asin(double x);   sinüs değeri x olan açıyı gönderir. Açı -pi/2 ile pi/2 arasındadır.   asin(0.5)   0.523599
double acos(double x);   cosinüs değeri x olan açıyı gönderir. Açı -pi/2 ile pi/2 arasındadır.   acos(0.5)   1.047198
double atan(double x);   tanjant değeri x olan açıyı gönderir. Açı -pi/2 ile pi/2 arasındadır.   atan(0.5)   0.463648
 NOT
Bir programda math.h kütüphanesi kullanılacakca, GCC derleyicisi -lm seçeneği ile birlikte kullanılmalıdır.
Örneğin test.c içinde math.h'i kullanıyorsa derleme:
    gcc -lm test.c -o test
şeklinde yapılmalıdır. Aksi halde bir hata mesajı ile karşılaşılır.
Trigonometrik (sin, cos, tan) fonksiyonlar kendisine parametre olarak gelen değeri radyan olarak kabul eder ve sonucu hesaplar. Eğer açılar derece cinsinden hesaplanması gerekiyorsa şu dönüşüm kullanılmalıdır:
   radyan = (3.141593/180.0)*derece;
Program 5.1: sin(), cos(), and tan() fonksiyonlarının kullanımı

 1: /* 05prg01.c: 30 dercelik bir açının sinüs, kosinüs ve tanjant değerleri */
 2:
 3: #include <stdio.h>
 4: #include <math.h>
 5:
 6: #define PI     3.141593
 7: #define CARPAN PI/180.0
 8:
 9: void main()
10: {
11:    double x;
12:
13:    x  = 30.0;      /* 30 derece !   */
14:    x *= CARPAN;    /* radyana çevir */
15:
16:    printf("30 derecenin sinusu   : %f\n", sin(x));
17:    printf("30 derecenin kosinusu : %f\n", cos(x));
18:    printf("30 derecenin tanjanti : %f\n", tan(x));
19: }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 05prg01.c
C:\TC> 05prg01   ş gcc -lm 06prg01.c -o 05prg01
ş ./05prg01
ÇIKTI

30 derecenin sinusu   : 0.500000
30 derecenin kosinusu : 0.866025
30 derecenin tanjanti : 0.577350
Standart Fonksiyonlar (stdlib.h)
Tablo 5.2: stdlib.h kütüphanesinde tanımlı bazı fonksiyonlar
Fonksiyon Bildirimi   Açıklama   Örnek   Sonuç
int atoi(const char *s);   Bir katarı tamsayıya çevirir   atof("-12345")   -12345
long atol(const char *s);   Bir katarı uzun tamsayıya çevirir   atof("1234567890")   1234567890
double atof(const char *s);   Bir katarı reel sayıya çevirir   atof("-123.546")   -123.456
void exit(int durum);   Programı sonlandırarak kontrolü işletim sistemine geri verir.   exit(0)   -
int rand(void);   0 ile RAND_MAX arasında rastgele sayı üretir.
RAND_MAX, stdlib.h içinde tanımlanmış bir sembolik sabittir   rand()   504851
max(a,b)   stdlib.h'de tanımlanmış iki sayıdan en büyüğünü bulan makro fonksiyon   max(5,9)   9
min(a,b)   stdlib.h'de tanımlanmış iki sayıdan en küçüğünü bulan makro fonksiyon   min(5,9)   5
void *malloc(unsigned boyut);   Bellekte boyut ile belirtilen sayıda bayt kadar yer tahsis eder   p=malloc(sizeof(int)*5)   ?
void free(void *ptr);   malloc ile ayrılan bellek bölgesini boşaltır   free(p)   -
Program 5.2: rand() fonksiyonuun kullanımı

 1: /* 05prg02.c:
 2:    (a) 0-100 arasında 10 tane rasgele sayı üretir
 3:    (b) 0-1   arasında 10 tane rasgele sayı üretir */
 4:
 5: #include <stdio.h>
 6: #include <stdlib.h>
 7:
 8: void main()
 9: {
10:    int   i,ri;
11:    float rf;
12:
13:    /* randomize(); Turbo C için */
14:
15:    for(i=0;i<10;i++)
16:    {
17:       ri = rand() % 100;             /* 0-100 arası tamsayı   */
18:       rf = (float) rand()/RAND_MAX;  /* 0-1   arası reel sayı */
19:       printf("%d\t%f\n",ri,rf);
20:    }
21:    puts("\n20 tane rasgele sayi urettim...");
22: }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 05prg02.c
C:\TC> 05prg02   ş gcc 05prg02.c -o 05prg02
ş ./05prg02
ÇIKTI

57      0.928434
10      0.204596
36      0.638691
18      0.682974
90      0.790521
73      0.090518
16      0.118015
46      0.250557
4       0.593158
36      0.437132

20 tane rasgele sayı ürettim...
Karakter Üzerinde İşlem Yapan Fonksiyonlar (ctype.h)
Tablo 5.3: ctype.h Kütüphanesinde tanımlı fonksiyonlar
Fonksiyon Bildirimi   Açıklama   Örnek   Sonuç
isalpha(c)   c bir harf ise 0 dan farklı, değilse 0 gönderir   isalpha('a')   8
isalnum(c)   c A-Z, a-z veya 0-9 arasında ise 0 dan farklı, değilse 0 gönderir   isalnum('a')   1
isascii(c)   c bir ASCII karakter ise 0 dan farklı, değilse 0 gönderir   isascii('a')   1
isdigit(c)   c bir rakam ise 0 dan farklı, değilse 0 gönderir   isdigit('4')   2
islower(c)   c a-z arasında ise 0 dan farklı, değilse 0 gönderir   islower('P')   0
isupper(c)   c A-Z arasında ise 0 dan farklı, değilse 0 gönderir   islower('P')   4
toascii(c)   c sayısı ile verilen ASCII koda sahip karakteri elde eden makro   toascii(65)   A
tolower(c)   c karakterini küçük harfe çevirir   tolower('D')   d
toupper(c)   c karakterini büyük harfe çevirir   toupper('b')   B
Program 5.3: ctype.h kütüphansinde bulunan bazı makroların kullanımı

 1: /* 05prg03.c:
 2:    ASCII kodaları 32-127 arasında olan karakterler üzerinde
 3:    ctype.h kütüphanesinde tanımlı bazı makroların kullanımı */
 4:
 5: #include <stdio.h>
 6: #include <ctype.h>
 7:
 8: void main(void)
 9: {
10:    int  i;
11:    char c;
12:
13:    for(i=32;i<127;i++)
14:    {
15:      c = toascii(i);
16:      printf("%d\t%c  %c  %d  %d\n",i,c,tolower(c),isalpha(c),isdigit(c));
17:    }
18: }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 05prg02.c
C:\TC> 05prg02   ş gcc 05prg02.c -o 05prg02
ş ./05prg02
ÇIKTI

32         0  0
33   !  !  0  0
34   "  "  0  0
35   #  #  0  0
36   ş  ş  0  0
37   %  %  0  0
...
47   /  /  0  0
48   0  0  0  2
49   1  1  0  2
50   2  2  0  2
...
65   A  a  4  0
66   B  b  4  0
...
97   a  a  8  0
98   b  b  8  0
...
122   z  z  8  0
123   {  {  0  0
124   |  |  0  0
125   }  }  0  0
126   ~  ~  0  0
Giriş
C dilinde if, switch ve ? olmak üzere üç tip karşılaştırma işlemi yapılır. Ancak ? bir operatördür. if karşılaştırma deyimi ile, diğer programlarda olduğu gibi if-else yapısı kurulabilir. switch deyimi, bir değişkenin içeriğine göre program akışını yönlendirme işlemini yapar[1].
if, if-else Yapısı
Bu deyimler koşullu işlem yapma deyimidir. if ve else tek bir karşılaştırma deyimi olup else kullanımı isteğe bağlıdır. Eğer bu koşul olumlu ise if den sonraki bölüm yürütülür ve else den sonraki bölüm atlanır. Koşul olumsuz ise if den sonraki küme atlanır ve eğer varsa, else den sonraki kümedeki işlemler gerçekleştirilir.
     if(koşul)
     {
       ...                     
        deyimler; (küme)
       ...                   
     }
Program 6.1'de basit olarak if deyiminin kullanımı gösterilmiştir. Programda bu deyim kullanılırken kümenin başlangıcı ve bitişini gösteren, küme parantezleri kullanılmamıştır. Eğer if deyiminden sonra icra edilecek deyimler tek satırdan oluşuyorsa, bu işaretlerin kullanılmasına gerek yoktur. Yada if deyimden sonra { ve } işaretleri kullanılmamışsa, bu deyimi takip eden sadece ilk satır işleme konur.
Program 6.1: if deyiminin kullanımı

 1: /* 06prg01.c: if deyiminin kullanımı */
 2:
 3: #include <stdio.h>
 4:
 5: int x, y; /* global değişkenler */
 6:
 7: void main()
 8: {
 9:       printf("x degeri: ");
10:       scanf("%d",&x);
11:       printf("y degeri: ");
12:       scanf("%d", &y);
13:
14:       /* değerleri karşılaştır ve sonucu ekrena yaz */
15:
16:       if (x == y)
17:           printf("x, y ye esit\n");
18:
19:       if (x > y)
20:           printf("x, y den buyuk\n");
21:
22:       if (x < y)
23:           printf("x, y den kucuk\n");
24: }
5. satırında global olarak bildirilen x ve y tamsayı değişkenleri, 10. ve 12. satırlarda scanf fonksiyonu ile klavyeden okutulmuştur. 16., 19. ve 22. satırlarda kullanılan if deyimlerindeki koşul ifadeleri (Bkz Tablo 3.3) ile x, y sayıları karşılaştırılmış ve sonuç ekrana uygun bir biçimde gösterilmiştir. if deyimlerinden sonra { ve } karakterlerinin kullanılmadığına dikkat edin. Eğer bu şekilde kullanılırsa, sadece bu deyimlerden sonra gelen ilk satır işleme konur.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 06prg01.c
C:\TC> 06prg01   ş gcc 06prg01.c -o 06prg01
ş ./06prg01
ÇIKTI

x degeri: 3
y degeri: 8
x, y den kucuk
if deyiminin else ile birlikte kullanımı şu şekildedir:
     if(koşul){
        ...
        deyimler; (küme1)     
        ...
     }
   
     else{
        ...
        deyimler; (küme2)
        ...
     }
Bu yaoının kullanılmasına dair bir örnek. Bir yıl içinde Şubat ayı 29 gün olursa o yıl artık yıl olarak adlandırılır. Artık yıl peryodik olarak 4 yılda bir gelir. Genel kanı "bir yıl 4 ile tam bölünebirse o yıl artık yıldır" şeklindedir. Fakat 1996 artık yıl iken 1800 artık yıl değildir. Genel sorgulama söyle olmalıdır: Eğer bir yıl
•   4 ile tam bölünüyorsa VE 100'e tam bölünmüyorsa VEYA
•   400 'e tam bölünüryorsa
o yıl artık yıldır. Bir yılın artık yıl olup olmadığı aşağıdaki gibi bir if deyimi ile kontrol edilebilir:
   if( yil%4==0 && yil%100!=0 || yil%400==0 ) ... yil artık yıl dır
Dikkate edilirse koşul, birden çok koşul birlikte kullanılarak, mantıksal operatörlerle birleştirilmişitir. Program 6.2, klavyeden girilen bir yılın artık yıl olup olmadığnı sınayan basit bir programdır. Bu kontrol if-else yapısı ile yapılmıştır.
Program 6.2: if-else deyiminin kullanımı

 1: /* 06prg02.c: Bir yılın artık yil olup olmadığını sınar. */
 2:
 3: #include <stdio.h>
 4:
 5: void main()
 6: {
 7:   int yil;
 8:
 9:   printf("Bir yil girin: ");
10:   scanf("%d",&yil);
11:
12:   if( yil % 4 == 0 && yil % 100 != 0 || yil % 400 == 0 )
13:        printf("%d artik yil\n",yil);
14:
15:   else
16:       printf("%d artik yil degil\n",yil);
17:
18: }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 06prg02.c
C:\TC> 06prg02   ş gcc 06prg02.c -o 06prg02
ş ./06prg02
ÇIKTI

Bir yil girin: 1996
1996 artik yil
Eğer program içinde kullanılacak koşulların sayısı 2 den çok ise aşağıdaki yapı kullanılır:
      if(koşul_1)
      {
        ...
        deyimler; (küme_1)           
        ...
      }
   
      else if(koşul_2)
      {
        ...
        deyimler; (küme_2)
        ...
      }
      .
      .
      .
      else if(koşul_n-1)
      {
        ...
        deyimler; (küme_n-1)
        ...
      }
      else
      {
        ...
        deyimler; (küme_n)
        ...
      }
Program 6.3 ikinci dereceden bir polinomun köklerini hesaplamaktadır. Programda delta değerinin 0 dan küçük olması durumda köklerin karmaşık sayıya dönüşeceğide göz önüne alınmıştır. Bu program if, else if ve else yapısı göstermek için oldukça iyi ve klasik bir örnektir.
Program 6.3: if, else if, else yapısı

 1:  /* 06prg03.c:
 2:     ax^2 + bx + c = 0 denkleminin (karmaşık sayılı kökler dahil) çözümü */
 3:
 4: #include <stdio.h>
 5: #include <math.h>   /* sqrt için */
 6:   
 7:
 8: void main(void)
 9: {
10:     float a,b,c,delta,x1,x2,x,kok_delta;
11:
12:     printf("a, b, c degerlerini girin:\n");
13:     scanf("%f %f %f",&a,&b,&c);
14:
15:     delta = b*b - 4*a*c;
16:
17:     if( delta > 0.0 )
18:     {
19:        x1 = ( -b + sqrt(delta) )/( 2*a );
20:        x2 = ( -b - sqrt(delta) )/( 2*a );
21:
22:        printf("\nReel kokler :");
23:        printf("\nx1 = %f ve x2 = %f",x1,x2);
24:     }
25:
26:     else if( delta < 0.0 )
27:     {
28:        kok_delta = ( sqrt(-delta) ) / (2*a);
29:        x = -0.5*b/a;
30:
31:        printf("\nKarmasik kokler :");
32:        printf("\nx1 = %f + %fi  ve  x2 = %f - %fi",x,kok_delta,x,kok_delta);
33:     }
34:
35:     else
36:     {
37:        x = -0.5*b/a;
38:
39:        printf("\nKokler eşit :");
40:        printf("\nx1 = x2 = %f",x);
41:     }
42:
43:  } /* main */
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 06prg03.c
C:\TC> 06prg03   ş gcc -lm 06prg01.c -o 06prg03
ş ./06prg03
ÇIKTI

a, b, c degerlerini girin:
1.  1.  1.

Karmasik kokler :
x1 = -0.500000 + 0.866025i  ve  x2 = -0.500000 - 0.866025i
switch - case Yapısı
Bu deyim bir değişkenin içeriğine bakarak, programın akışını bir çok seçenekten birine yönlendiren bir deyimdir. case (durum) deyiminden sonra değişkenin durumu yazılır ve takip eden gelen satırlar (deyimler) işlenir. Bütün durumların aksi söz konu olduğunda gerçekleştirilmesi istenen deyimler default deyiminden sonraki kısımda bildirilir. Genel yazım biçimi:
      switch(değişken)
      {
           case sabit_1:
              ...
              deyimler;
               ...
           case sabit_2:
               ...
               deyimler;
               ...
           .
           .
           .
           case sabit_n:
               ...
               deyimler;
               ...
           default:
               ...
               hata deyimleri veya varsayılan deyimler;
               ...
      }
Program Program 6.4'te switch deyiminin basit bir kullanımı gösterilmiştir.
Program 6.4: switch-case yapısının kullanımı

 1:  /* 06prg04.c: switch - case yapısının kullanımı */
 2:
 3:  #include <stdio.h>
 4:
 5:  void main(void)
 6:  {
 7:     char kr;
 8:
 9:     printf("Lutfen bir karakter girin\n");
10:
11:     kr = getchar(); /* tek bir karakterin okunması */
12:
13:     switch (kr)
14:     {
15:        case 'a':
16:           printf("a harfine bastiniz\n");
17:        case 'b':
18:           printf("b harfine bastiniz\n");
19:        default:
20:           printf("a veya b ye basmadiniz\n");
21:     }
22:
23:  }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 06prg04.c
C:\TC> 06prg04   ş gcc 06prg04.c -o 06prg04
ş ./06prg04
ÇIKTI

Lutfen bir karakter girin
a
a harfine bastiniz
b harfine bastiniz
a veya b ye basmadiniz
ÇIKTI

Lutfen bir karakter girin
b
b harfine bastiniz
a veya b ye basmadiniz
ÇIKTI

 
Lutfen bir karakter girin
k
a veya b ye basmadiniz
ÇIKTI

Lütfen bir karakter girin
c
a veya b ye basmadiniz
Programda, klavyeden okunan tek bir karakter değişkenin içeriğine bakılıp uygun dallanmalar yaptırılmıştır. 11. satırda değişken getchar() fonksiyonu ile okutulmuştur. Eğer 'a' veya 'b' karakterlerinden biri girilirse, ekrana bu harflerin girildiğine dair mesaj yazılacak, aksi takdirde bu karakterin dışında bir karakterin giriş olarak kullanıldığı gösteren bir mesaj yazılacaktır. Örneğin 'c' karakteri klavyeden girilmiş ise a veya b ye basmadiniz gibi. Fakat 'a' karakterleri girildiğinde ekrana her üç durumda yazdırılmaktadır. Bunun sebebi, case 'a': durumunda sırasıyla 16, 18 ve 20. satırların işleme konmasıdır. Bunu engellemek için 16. satırdan sonra programın başka bir yere yönlendirilmesi gerekir. Bu yönlendirme, bir sonraki derste anlatılacak olan break deyimi ile yapılır. Derleyici bu deyim ile karşılaştığında, bulunduğu yapının içinden koşulsuz olarak ayrılır ve takip eden işleme başlar[1].
Program 6.4'te case 'a': durumu için 16, 18 ve 20. satırlar da işleme konumuştu. Eğer klavyeden 'a' karakterini girip ekrana sadece a harfine bastiniz iletisi yazdırılmak isteniyorsa, 20. satıra break deyimi ilave edilmelidir. break deyiminin kullanımı Program 6.5'te gösterilmiştir.
Program 6.5: switch-case yapısı ve break kullanımı

 1:  /* 06prg05.c: switch - case yapısı ve break kullanımı */
 2:
 3:  #include <stdio.h>
 4:
 5:  void main(void)
 6:  {
 7:      char kr;
 8:
 9:      printf("Lutfen bir karakter girin\n");
10:
11:      kr = getchar(); /* tek bir karakterin okunması */
12:
13:      switch (kr)
14:      {
15:        case 'a':
16:           printf("a harfine bastiniz\n");break;
17:        case 'b':
18:           printf("b harfine bastiniz\n");break;
19:        default:
20:           printf("a veya b ye basmadiniz\n");break;
21:      }
22:
23:  }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 06prg05.c
C:\TC> 06prg05   ş gcc 06prg05.c -o 06prg05
ş ./06prg05
ÇIKTI

Lutfen bir karakter girin
a
a harfine bastiniz
Program 6.6 switch-case yapısın farklı bir kullanımı ile ilgili bir örnektir. Programda, önce iki sayı isteniyor ardından yapılan seçimle bu sayıların toplamı yada çarpımı ekrana yazdırılıyor.
Program 6.6: switch-case yapısı ve break kullanımı

 1:  /* 06prg06.c: switch-case yapısı */
 2:
 3:  #include <stdio.h>
 4:  #include <stdlib.h>
 5:
 6:  int menu(void);
 7:  int topla(int,int);
 8:  int carp(int,int);
 9:
10:  void main(void)
11:  {
12:       int  x,y,sonuc,sec;
13:
14:       printf("Iki tam sayi girin: ");
15:       scanf("%d,%d",&x,&y);
16:
17:       printf("Seciminiz: [1] topla, [2] carp, [3] cikis\n");
18:       scanf("%d",&sec);
19:
20:       switch( sec )
21:       {
22:          case 1:
23:                 sonuc = x+y;
24:                 printf("Toplamlari : %d\n",sonuc);
25:                 break;
26:          case 2:
27:                 sonuc = x*y;
28:                 printf("carpimlari : %d\n",sonuc);
29:                 break;
30:          case 3:
31:                 printf("Program sonu...\n");
32:                 exit(0);
33:         default:
34:                 printf("Yanlis secim !...\n\n\a");
35:      }
36:  }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 06prg06.c
C:\TC> 06prg06   ş gcc 06prg06.c -o 06prg06
ş ./06prg06
ÇIKTI

Iki tam sayi girin: 5,9
Seciminiz: [1] topla, [2] carp, [3] cikis
2
carpimlari : 45
ÇIKTI

Iki tam sayi girin: 1,8
Seciminiz: [1] topla, [2] carp, [3] cikis
7
Yanlis secim !...
? Karşılaştırma Operatörü
C dilinde if-else karşılaştırma deyiminin yaptığı işi sınırlı olarak yapan bir operatördür. Genel yazım biçimi:
      (koşul) ? deyim1 : deyim2;
İlk önce koşul sınanır. Eğer koşul olumluysa (1 ise) deyim1 aksi takdirde deyim2 değerlendirilir. deyim1 ve deyim2 de atama işlemi yapılamaz. Ancak koşul deyiminde atama işlemi yapılabilir. deyim1 ve deyim2 yerine fonksiyon da kullanılabilir. Aşağıda bu deyimin kullanımına ait örnekler verilmiştir.
      x = ( a > b ) ? a : b;
Yukarıdaki ifadede koşul a'nın b'den büyük olmasıdır. Eğer olumluysa x adlı değişkene a, değilse b değeri atanır. Bu şekilde kullanım if-else yapısı ile kurulmak istenirse:
      if( a > b )  x = a;
      else         x = b;
şeklinde olacaktır. Program 6.7 ? karşılaştırma operatörünün basit bir kullanımını göstermektedir.
Program 6.7: ? ve if kullanımı

 1:  /* 06prg07.c: ? ve if-else yapısının kullanımı */
 2:
 3:  #include <stdio.h>
 4:
 5:  void main(void)
 6:  {
 7:     int x,y,z;
 8:
 9:     printf("x : ");scanf("%d",&x); /* x okunuyor */
10:     printf("y : ");scanf("%d",&y); /* y okunuyor */
11:
12:       if( x )                      /* x 0 dan farklı mı? */
13:         z = ( y > x ) ? x*y : x+y; /* y>x ise z=x*y, değilse z=x+y */
14:       else
15:         z = 0;
16:
17:     printf("z = %d",z);
18:  }
12. satırdaki if deyimindeki koşul biraz farklıdır. Genel olarak koşul bu şekilde bildirilirse, koşulun 0 dan farklı olup olmadığı sınanır. Yani if( x ) ile if( x!=0 ) aynı anlamdadır. Bu kullanım çok yagındır. Eğer x 0 dan farklı ise koşul olumlu olarak değerlendirilecektir. 13. satırda ? ile bir sınama yapılmaktadır. Eğer y, x den büyük ise z değişkenine x*y, aksi takdirde x+y değeri atanmaktadır. Eğer x=0 ise z değişkenine 0 değeri atanmaktadır.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 06prg07.c
C:\TC> 06prg07   ş gcc 06prg07.c -o 06prg07
ş ./06prg07
ÇIKTI

x : -5
y : 8
z = -40
Bu operatör birçok durumda okunabilirliği kuvvetlendirmek için tercih edilir. Örneğin:
Program 6.8: ? operatörünün kullanımı

 1: /* 06prg08.c: ? operatoru */
 2:
 3: #include <stdio.h>
 4:
 5: main()
 6: {
 7:    int k;
 8:
 9:    for(k=0;k<100;k++)
10:      printf("%3d%c",k,(k % 10 == 9) ? '\n':' ');
11: }
10. satırdaki %d formatına karşılık gelen parametre k dır. %c formatına karşılık gelen karakter ise (k % 10 == 9) ifadesinin sonucuna göre '\n' ya da
' ' (boşluk) olmaktadır. Her 10 sayıda bir bu ifadenin sonucu doğru olacağına göre imleç aşağıdaki satıra geçecektir [2].
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 06prg08.c
C:\TC> 06prg08   ş gcc 06prg08.c -o 06prg08
ş ./06prg08
ÇIKTI

  0   1   2   3   4   5   6   7   8   9
 10  11  12  13  14  15  16  17  18  19
 20  21  22  23  24  25  26  27  28  29
 30  31  32  33  34  35  36  37  38  39
 40  41  42  43  44  45  46  47  48  49
 50  51  52  53  54  55  56  57  58  59
 60  61  62  63  64  65  66  67  68  69
 70  71  72  73  74  75  76  77  78  79
 80  81  82  83  84  85  86  87  88  89
 90  91  92  93  94  95  96  97  98  99


Logged
Asil_Turk'in Imzasi

VATAN İÇİN KAN DÖKMEK GEREKİRSE DÜNYANIN ŞAH DAMARINI KESERİM!!!
Asil_Turk
Teğmen
*

Rep Puanı : 2


Offline Offline

Konu Sayısı : 6 Mesaj Sayısı: 50

ÖNCE VATAN


« Yanıtla #3 : Ekim 06, 2007, 04:32:31 ÖS »

Giriş
Döngü deyimleri bir kümenin belli bir koşul altında yinelenmesi için kullanılır. while, do...while ve for olmak üzere üç tip döngü deyimi vardır. C de diğer programlama dillerinde olduğu gibi, bu deyimlerle istenildiği kadar iç-içe döngü yapısı kullanılabilir [1].
while Döngüsü
Tekrarlama deyimidir. Bir küme ya da deyim while kullanılarak bir çok kez yinelenebilir. Yinelenmesi için koşul sınaması çevrim başında yapılır. Koşul olumlu olduğu sürece çevrim yinelenir. İki veya daha çok koşul mantıksal operatörler birleştirilerek verilebilir. Bu deyimin kullanımı Program 7.1 de gösterilmiştir. Genel yazım biçimi:
      while(koşul)
      {
       ...
        döngüdeki deyimler; [küme]
       ...
      }
Program 7.1: while döngüsü

 1: /* 07prg01.c: while döngüsü */
 2:
 3: #include <stdio.h>
 4:
 5: void main(void)
 6: {
 7:    int x=0;
 8:
 9:    while(x <= 10)
10:       printf("%d\n",x++);
11: }
Program 7.1, 0-10 arasındaki sayıları ekrana yazdırmaktır. 9. satırdaki while deyiminden sonra { işareti kullanılmamıştır. Bu durumda, sadece takip eden satır (10. satır) döngünün içine dahil edilir.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 07prg01.c
C:\TC> 07prg01   ş gcc 07prg01.c -o 07prg01
ş ./07prg01
ÇIKTI

0
1
2
3
4
5
6
7
8
9
10
do ... while Döngüsü
Bu deyimin while deyiminden farkı, koşulun döngü sonunda sınanmasıdır. Yani koşul sınanmadan çevrime girilir ve döngü kümesi en az bir kez yürütülür. Koşul olumsuz ise döngüden sonraki satıra geçilir. Bu deyimin kullanımı Program 7.2 de gösterilmiştir. Genel yazım biçimi:
      do{
         ...
         döngüdeki deyimler;
         ...
      }while(koşul);
Program 7.2: do-while döngüsü

 1: /* 07prg02.c: do-while yapısı */
 2:
 3: #include <stdio.h>
 4:
 5: void main(void)
 6: {
 7:    int sayi;
 8:
 9:    do
10:    {
11:       printf("Bir sayi girin : ");
12:       scanf("%d",&sayi);
13:       printf("iki kati       : %d\n",2*sayi);
14:
15:    }while( sayi>0 );   /* koşul */
16:
17:    puts("Cevrim sona erdi.");
18: }
15. satırdaki koşul olumlu olduğu sürece (sayi>0 olduğu sürece), klavyeden yeni bir değer 12. satırda okunur. Aksi takdirde (sayi<=0 ise) çevrimin sona erdiğine dair mesaj 17. satırdaki puts fonksiyonu ile verilir.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 07prg02.c
C:\TC> 07prg02   ş gcc 07prg02.c -o 07prg02
ş ./07prg02
ÇIKTI
ÇIKTI

Bir sayi girin : 1
iki kati       : 2
Bir sayi girin : 3
iki kati       : 6
Bir sayi girin : 4
iki kati       : 8
Bir sayi girin : -3
iki kati       : -6
Cevrim sona erdi.
for Döngüsü
Bu deyim, diğer döngü deyimleri gibi bir öbeği bir çok kez tekrarlamakta kullanılır. Koşul sınaması while da olduğu gibi döngüye girmeden yapılır. Bu döngü deyimin içinde diğerlerinden farklı olarak başlangıç değeri ve döngü sayacına sahip olmasıdır. Bu deyimin kullanımı Program 7.3 de gösterilmiştir Genel yazım biçimi:
      for( başlangıç ; koşul ; artım )
      {
       ...
        döngüdeki deyimler;
       ...
      }
Program 7.3: for döngüsü

 1:  /* 07prg03.c:
 2:     for döngüsü ile faktoriyel hesabı. n!=1*2*3...n şeklinde tanımlanır. */
 3:
 4:  #include <stdio.h>
 5:
 6:  void main()
 7:  {
 8:       long int i,n,faktor;
 9:
10:       printf("Faktoriyeli hesaplanacak sayi girin : ");
11:       scanf("%ld",&n);
12:
13:       faktor=1;
14:       for(i=1;i<=n;i++)
15:       {
16:          faktor *= i;     /* n! = 1 x 2 x 3 x ... x n */
17:       }
18:
19:       printf("%ld! = %ld\n",n,faktor);
20:  }
Program da faktoriyel hesabı 16. satırda gerçekleştirilmiştir. n ve faktor tamsayı değişkenkeri long tipinde bildirilmiştir. Çünkü faktoriyel değeri 4 bayt büyüklüğünde bir tamsayı olabilir.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 07prg03.c
C:\TC> 07prg03   ş gcc 07prg03.c -o 07prg03
ş ./07prg03
ÇIKTI

Faktoriyeli hesaplanacak sayi girin : 4
4! = 24
printf fonksiyonu ile desimal(taban-10) sayılarıların nasıl yazdırılacağı bundan önceki kısımlarda gösterilmişti. Program 7.4'te 0-15 arası desimal sayıların Oktal(taban-8) ve Heksadesimal(taban-16) karşılıkları ile printf kullanılarak yazdırılması gösterilmiştir.
Program 7.4: Sayı sistemi

 1:  /* 07prg04.c: Sayı sistdemi:
 2:     %d : desimal     10 tabanındaki sayı
 3:     %o : oktal        8 tabanındaki sayı
 4:     %x : hexadesimal 16 tabanındaki sayı (küçük harf)
 5:     %X : hexadesimal 16 tabanındaki sayı (büyük harf) */
 6:
 7:  #include <stdio.h>
 8:
 9:  main()
10:  {
11:     int i;
12:
13:     for (i=0; i<16; i++)
14:       printf("%2d  %2o  %x  %X\n", i,i,i,i);
15:  }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 07prg04.c
C:\TC> 07prg04   ş gcc 07prg04.c -o 07prg04
ş ./07prg04
ÇIKTI

 0   0  0  0
 1   1  1  1
 2   2  2  2
 3   3  3  3
 4   4  4  4
 5   5  5  5
 6   6  6  6
 7   7  7  7
 8  10  8  8
 9  11  9  9
10  12  a  A
11  13  b  B
12  14  c  C
13  15  d  D
14  16  e  E
15  17  f  F
Bir program içinde birbiri içine geçmiş birden çok döngü de kullanılabilir. Bu durumda (bütün programlama dillerinde olduğu gibi) önce içteki döngü, daha sonra dıştaki döngü icra edilir.
Üç basamaklı, basamaklarının küpleri toplamı kendisine eşit olan tam sayılara Armstrong sayı denir. Örneğin: 371 bir Armstrong sayıdır çünkü 3^3 + 7^3 + 1^3 = 371. Program 7.5'de iç içe geçmiş üç for döngüsü ile bütün Armstrong sayıları bulup ekrana yazar. İnceleyiniz.
Program 7.5: iç-içe for döngüleri

 1: /* 07prg05.c:
 2:    Üç basamaklı, basamaklarının küpleri toplamı kendisine eşit olan tam
 3:    sayılara  Armstrong sayı denir. Örneğin: 371 = 3^3 + 7^3 + 1^3.
 4:    Bu program İç-içe geçmiş 3 döngü ile bütün Aramstrong sayıları bulur. */
 5:
 6: #include <stdio.h>
 7:
 8: main()
 9: {
10:    int a,b,c,kup,sayi,k=1;
11:
12:    for(a=1;a<=9;a++) 
13:    for(b=0;b<=9;b++)
14:    for(c=0;c<=9;c++)
15:    {
16:        sayi = 100*a + 10*b + c;       /* sayi = abc (üç basamaklı) */
17:        kup  = a*a*a + b*b*b + c*c*c;  /* kup  = a^3+b^3+c^3        */
18:
19:        if( sayi==kup ) printf("%d. %d\n",k++,sayi);
20:    }
21:
22: }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 07prg05.c
C:\TC> 07prg05   ş gcc 07prg05.c -o 07prg05
ş ./07prg05
ÇIKTI

1. 153
2. 370
3. 371
4. 407
Sonsuz Döngü
Bir döngü işlemini sonsuz kere tekrarlarsa bu döngü sonzuz döngü olarak adlandırılır. Böyle bir döngü için, koşul çok önemlidir. Örneğin while döngüsü için:
          ...
          while(1)
          {
             printf("Sonsuz döngü içindeyim...\n");
          }
          ...
yada
          ...
          while(7>3)
          {
             printf("Sonsuz döngü içindeyim...\n");
          }
          ...
Her iki durumda da çevrimler, sonsuz döngü durumundadır. Çünkü while(1) ve while(7>3) ifadelerdeki koşullar daima olumludur. Bu durumda çevrim sonsuz döngüye girer.
for döngüsünde, başlangıç, koşul ve artım parametrelerinden herhangi birini kullanmak isteğe bağlıdır. Her hangi biri verilmediğinde döngünün nasıl davranacağı iyi yorumlanmalıdır. Örneğin for döngüsünün hiçbir parametresi verilmezse, döngü sonsuz çevrime girer. Yani:
          for(;Göz kırpan
              printf("Sonsuz döngü içindeyim...\n");
gibi.
break Deyimi
Bir C programında, bir işlem gerçekleştirilirken, işlemin sona erdirilmesi bu deyim ile yapılır. Örneğin, döngü deyimleri içindekiler yürütülürken, çevrimin, koşuldan bağımsız kesin olarak sonlanması gerektiğinde bu deyim kullanılır. Örneğin:
          ...
          do{
              scanf("%d",&x);

              if(x==0) break;

              printf("%f",1.0/x);

          }while(1);
          ...
Yukarıdaki program parçasında, do ... while döngüsündeki koşul daima olumludur. Bu durumda döngü sonsuzdur. Fakat döngü içinde if deyimindeki koşul gerçekleşirse, döngü koşuluna bakılmaksızın terkedilir. Bu işlemi sağlayan break deyimidir.
Program 7.6 klavyeden girilen sayı pozitif olduğu sürece sayının faktoriyelini hesaplar. Sayı negatif olduğunda döngü break ile sonlandırılır. Inceleyiniz.
Program 7.6: break deyiminin kullanımı

 1: /* 07prg06.c: n>=0 olduğu sürece n! li hesaplar */
 2:
 3: #include <stdio.h>
 4:
 5: void main()
 6: {
 7:    long int i,n,faktor;
 8:
 9:    do{
10:        printf("Faktoriyeli hesaplanacak sayi girin : ");
11:        scanf("%ld",&n);
12:
13:        if(n<0) break; /* döngüyü sonlandır */
14:
15:        faktor=1;
16:        for(i=1;i<=n;i++)
17:        faktor *= i; /* n!= 1 x 2 x 3 x ... x n */
18:
19:        printf("%ld! = %ld\n",n,faktor);
20:
21:    }while(n>=0);
22:
23: }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 07prg06.c
C:\TC> 07prg06   ş gcc 07prg06.c -o 07prg06
ş ./07prg06
ÇIKTI

Faktoriyeli hesaplanacak sayi girin : 2
2! = 2
Faktoriyeli hesaplanacak sayi girin : 3
3! = 6
Faktoriyeli hesaplanacak sayi girin : 5
5! = 120
Faktoriyeli hesaplanacak sayi girin : 9
9! = 362880
Faktoriyeli hesaplanacak sayi girin : 0
0! = 1
Faktoriyeli hesaplanacak sayi girin : -4
continue Deyimi
Bir döngü içerisinde continue deyimi ile karşılaşılırsa, ondan sonra gelen deyimler atlanır ve döngü bir sonraki çevrime girer. Örneğin:
          ...
          for(x=-50;i<=50;x++)
          {
              if(x<0) continue;     /* x<0 ise alttaki satırı atla */
              printf("%d %f",x,sqrt(x));
          }
          ...
Program parçasının çıktısı:
         0   0.000000
         1   1.000000
         2   1.414213
         3   1.732050
         .   .
         .   .
         .   .
         50  7.071067
Program 7.7, x, y'den farklı olmak üzere |x|+|y|<=3 eşitsizliğini sağlayan tamsayı çiftlerini bulup ekrana yazar. Bu eşitsizliği sağlayan toplam 22 çift vardır. Programda, her bir çift parantez içinde yazdırılmıştır. İnceleyiniz.
Program 7.7: continue deyiminin kullanımı

 1: /* 07prg07.c:
 2:    x, y'den farklı olmak üzere |x|+|y|<=3 eşitsizliğini sağlayan
 3:    tamsayı çiftlerini ekrana yazar */
 4:
 5: #include <stdio.h>
 6:
 7: main()
 8: {
 9:    int x,y,k=1;
10:
11:    for (x=-3;x<=3;x++)
12:    for (y=-3;y<=3;y++)
13:    {
14:       if(x==y) continue; /* x=y ise alt satırı atla */
15:
16:       if( abs(x)+abs(y)<=3 )
17:         printf("%2d. (%2d,%2d)\n",k++,x,y);
18:    }
19:
20: }
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 07prg07.c
C:\TC> 07prg07   ş gcc 07prg07.c -o 07prg07
ş ./07prg07
ÇIKTI

 1. (-3, 0)
 2. (-2,-1)
 3. (-2, 0)
 4. (-2, 1)
 5. (-1,-2)
 6. (-1, 0)
 7. (-1, 1)
 8. (-1, 2)
 9. ( 0,-3)
10. ( 0,-2)
11. ( 0,-1)
12. ( 0, 1)
13. ( 0, 2)
14. ( 0, 3)
15. ( 1,-2)
16. ( 1,-1)
17. ( 1, 0)
18. ( 1, 2)
19. ( 2,-1)
20. ( 2, 0)
21. ( 2, 1)
22. ( 3, 0)


Logged
Asil_Turk'in Imzasi

VATAN İÇİN KAN DÖKMEK GEREKİRSE DÜNYANIN ŞAH DAMARINI KESERİM!!!
Asil_Turk
Teğmen
*

Rep Puanı : 2


Offline Offline

Konu Sayısı : 6 Mesaj Sayısı: 50

ÖNCE VATAN


« Yanıtla #4 : Ekim 06, 2007, 04:33:34 ÖS »

Giriş
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. Bundan sonraki derslerde fonksiyonlar kullanılacaktır.
Fonksiyon Kavramı
Fonksiyon, belirli sayıda verileri kullanarak bunları işleyen ve bir sonuç üreten komut grubudur. Her fonksiyonun bir adı ve fonksiyona gelen değerleri gösteren argumanları (bağımsız değişkenleri) vardır. Genel olarak bir fonksiyon Şekil 8.1'deki gibi bir kutu ile temsil edilir:
 

Şekil 8.1:Bir fonksiyonun kutu gösterimi
Fonksiyonların girdilerine parametreler yada argumanlar denir. Bir fonksiyon bu parametreleri alıp bir işleme tabi tutar ve bir değer hesaplar. Bu değer çıktı, geri dönüş değeri (return value) olarak adlandırılır. Unutmayın ki, bir fonksiyonun kaç girişi olursa olsun sadece bir çıkışı vardır. Aşağıda bir ve iki girişli iki fonksiyonun kutu gösterimi verilmiştir.
Tek parametreli sqrt(x) fonksiyonu:
 
        İki parametreli F(x,y) = x*x + x*y fonksiyonu:
 


C Programlama Dili, kullanıcısına bu türden fonksiyon yazmasına izin verir. C dilinde hazırlanan bir fonksiyonun genel yapısı şöyledir:
      FonksiyonTipi FonksiyonAdı(argüman listesi)
      argumanların tip bildirimleri
      {
        Yerel değişkenlerin bildirimi                     
        ...
        fonksiyon içindeki deyimler veya diğer fonksiyonlar
        ...
        return geri dönüş değeri;
      }
Örneğin iki sayının toplamının hesaplayacak bir fonksiyon şöyle tanımlanabilir:
    int topla(x,y)           /* klasik biçim */
    int x,y
    {
       int sonuc;
       sonuc = x + y;
       return sonuc;
    }
veya
    int topla(int x,int y)   /* modern biçim */
    {
       int sonuc;
       sonuc = x + y;
       return sonuc;
    }
veya
    int topla(int x,int y)   /* modern biçim */
    {
       return (x+y);
    }
Bu örnekte, fonksiyonun kimlik kartı! ve kutu gösterimi şöyledir:
•   Fonksiyon tipi: int
•   Fonksiyon adı : topla
•   parametreler : x ve y
•   geri dönüş değeri: x+y    

Her üç 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 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 fonksiyon:
    ...
    int t;
    ...
    t = topla(9,6);
    ...
şeklinde kullanılırsa, t değişkenine 9+6=15 değeri atanır. topla() fonksiyonunun kullanımı Program 8.1'in üzerinde açıklanmıştır.
Fonksiyon Bildirimi
Bir fonksiyonun bildirimi iki türlü yapılır:
1.   Ana programdan önce:
2.   ...
3.   int topla(int x,int y)      /* fonksiyon */
4.   {
5.     ...
6.   }
7.   ...
8.   main()
9.   {
10.     ...
11.   }
12.   Ana programdan sonra: Bu durumda fonksiyon örneği (function prototype) ana programdan önce bildirilmelidir.
13.   ...
14.   int topla(int x,int y);  /* fonksiyon prototipi */
15.   ...
16.   main()
17.   {
18.     ...
19.   }
20.   ...
21.   int topla(int x,int y)      /* fonksiyon */
22.   {
23.     ...
24.   }
Bir C programı içinde, yazmış olduğunuz fonksiyonlar genellikle bu iki tipte kullanılır. İkinci kullanımda fonksiyon prototipi mutlaka bildirilmelidir. Aksi halde bir hata mesajı ile karşılaşılır. Fonksiyon prototipinde arguman isimlerinin yazılması zorunlu değildir. Sadece arguman tiplerini belirtmek de yeterlidir. Yukarıdaki topla fonksiyona ait prototip:
     int topla(int x,int y);
şekinde yazılabileği gibi
     int topla(int,int);
şeklinde de yazılabilir.
Buraya kadar anlatılanlar Program 8.1 üzeride özetlenmiştir.
Program 8.1: topla fonksiyonunun ana programda kullanılması

 1: /* 08prg01.c: iki sayıyı toplar ve sonucu ekranda gösterir */
 2:
 3: #include <stdio.h>
 4: 
 5: int topla( int x,int y );  /*** fonksiyon prototipi ***/
 6:
 7: void main(void)
 8: {
 9:     int toplam,a,b;
10:
11:     printf("Iki sayi girin : ");
12:     scanf("%d %d",&a,&b);
13:
14:    /*  fonksiyon çağırılıp, a ve b değerleri parametre olarak aktarılıyor.
15:        topla(a,b) = a + b değeri toplam değişkenine atanması */
16:     toplam = topla(a,b);
17: 
18:     printf("%d ve %d nin toplami  %d dir.\n", a,b,toplam);
19: }
20:
21:  /*** fonksiyon tanımlanması ***/
22:
23:  /* Bu fonksiyon iki tamsayıyı toplar */
24:  int topla( int x, int y )
25:  {
26:     int sonuc;
27:     sonuc = x + y;
28:     return sonuc;
29:  }
topla fonksiyonun prototipi 5. satırda, kendisi 23-29. satırlarda bildirilmiştir. Klavyeden okunan a ve b değişkenleri fonksiyonuna parametre olarak aktarılmıştır. Bu değişkenlerin isimleri ile topla fonksiyonunda kullanılan değişkenlerin (x ve y) isimleri aynı olması zorunlu değildir. Burara a ve b değişkenleri sırasıyla x ve y değişkenleri yerine konmuştur. 13. satırda toplam adlı tamsayı değişkenine topla fonksiyonunun dönüş değeri (a + b değeri) atanmıştır.
DERLEME ve ÇALIŞTIRMA
MS DOS (Turbo C)   Linux (GCC)
C:\TC> tcc 08prg01.c
C:\TC> 08prg01   ş gcc 08prg01.c -o 08prg01
ş ./08prg01
ÇIKTI

Iki sayi girin : 5 12
5 ve 12 nin toplami  17 dir.
Geri Dönüş Değerleri
return anahtar sözcüğünün iki önemli işlevi vardır:
1.   fonksiyonun geri dönüş değerini oluşturur
2.   fonksiyonu sonlandırır
Bu deyiminden sonra bir değişken, işlem, sabit veya başka bir fonksiyon yazılabilir. Örneğin:
    return (a+b/c);        /* parantez kullanmak zorunlu değildir */
    return 10;             /* değişken kullanmak mecbur değil */
    return topla(a,b)/2.0; /* önce topla fonksiyonu çalışır */
Bir fonksiyonda birden çok geri dönüş değeri kullanılabilir. Fakat, ilk karşılaşılan return deyiminden sonra fonksiyon sonlananır ve çağrılan yere bu değer gönderilir. Örneğin aşağıdaki harf fonksiyonunda beş tane return deyimi kullanılmıştır.
     char harf(int not)
     {
        if( not>=0  && not<50 ) return 'F';
        if( not>=50 && not<70 ) return 'D';
        if( not>=70 && not<80 ) return 'C';
        if( not>=80 && not<90 ) return 'B';
        if( not>=90           ) return 'A';
     }
Bu fonksiyon kendisine parametre olarak gelen 0-100 arasındaki bir notun harf karşılığını gönderir. Aslında geri gönderilen değer bir tanedir. Eğer bu fonksiyon aşağıdaki gibi çağrılırsa:
     char harfim;
     ...
     harfim = harf(78);
     ...
harfim değişkenine 'C' değeri (karakteri) atanır.
Program 8.2'de bildirilen artik_yil fonksiyonu kendisin