Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

C Notları

Başlatan XX_CİHAN_XX, 04 Temmuz 2006, 12:31:21

XX_CİHAN_XX

C DİLİ KULLANARAK
BİLGİSAYAR PROGRAMLAMA








Hüseyin PEKTAŞ



Bu doküman KOÜ Elektronik ve Haberleşme Mühendisliği Bölümü'ndeki Bilgisayar ve Yazılım I-II derslerine ait notlarını içerir. Dökümanda büyük oranda anlatım eksikliği vardır. Nu nedenle tek başına bi kaynak olarak kullanılamaz. Ancak programlamayı öğrenmek isteyenlerin konu/deyimleri hangi sırada takip etmelerini söyler.
Tüm hakları yazara aittir. Üzerinde değişiklik yapmamak ve alınan tüm kopyalarda bu sayfayı bulundurmak koşuluyla bu döküman izinsiz  olarak kullanılabilir.



Sürümler : Ekim 1996,  Ekim 1998





GiRiŞ

Bilgisayar, verileri saklayan , bunlar üzerinde çok hızlı işlem yapan ve istenen verileri sunan bir aygıttır.
Donanım (hardware) ve yazılım(software) diye iki bölüme ayrlır. Donanım bilgisayarın fiziksel bileşenleridir. Yazılım ise donanımı oluşturan bileşenlerin çalışmasını ve işlevlerini yerine getirmesini sağlayan programlardır.

    İşlemci

 
   Denetim  Aritmetik      Girdi
   Birimi        Mantık      Çıktı
           Birimi      Ana Bellek
               Yan Bellek


Girdi birimleri : Veri ve program girilmesini sağlar.   Klavye, fare, kart okuyucu ...
Çıktı birimleri : İstenen verilerin kullanıcıya sunulduğu ortam. Ekran, yazıcı...
Ana Bellek      : Programların ve işlenen verilerin geçici olarak saklandığı birim.
Yan bellek      : Bilgilerin (veri, program) kalıcı olarak saklandığı ortamlar. Disket, disk, manyetik  şerit.

 Bilgisayar broşuründe olan kavramlar,  bit, byte, ... RAM, ROM...

   Bu günkü anlamda ilk bilgisayar ENIAC [Electronic Numeric integrator and computer]
               30 ton, kablolar ile programlama
   1842, Charles Babbag , analitik makine tasarlıyor. Programlanabilir bir cihaz Öncesi Hesap Makinesi. Ada Agusta programcısı.


Bilgisayarlar :
1.    Kusak  39 - 58 Vakum tüp ile çalışıyor
2.    Kusak  58 - 64 Transistör
3.    Kusak  64 - 75 Entegre
4.    Kusak  75 - ---  Yüksek ölçekli entegre



   Micro computer ( PC )         ( bu gün 50 - MIPS)
   Workstation
   Mini Computer
   Main Frame         (50 lerde 50 IPS)
   Super Computer
Bilgisayarın yapısı
   Bellek (...., birimi byte        bit)
   CPU    ( Bilgiyi işleyen kısım bellekten okur - yazar)
   Denetim Birimi ( Hangi işlem, ne zaman yapılacak, belirler (gerekli işaretleri üretir))
   Giriş/Çıkış     : klavye (veya benzer)
      : ekran (veya benzer)
   İkincil ( yardımcı ) bellek (Kütük olarak saklı bilgiler.)
   Hardware - Software

   Bilgisayarlar kendisine sorulan sorulara hemen cevap veren, bir sürü problemi çözen bir aygıt değildir.  Bilgisayarda yapılan her tür iş, ilk önce insan aklının süzgecinden geçiyor, insanlar tarafından etraflıca tasarlanıyor, planlanıp programlanıyor [1].

ilk yapılan bilgisayarın karşına geçip hemen
en eski soruyu sormuşlar "Tanrı var mı".
Bilgisayar kısa bir düşünmeden sonra "Evet artık var".

Bu nedenle, önce bilgisayara problemin çözümü öğretilmelidir. Fakat bunun için bizim problemi çözmemiz gerekir.  Ve daha sonra bir programlama dili ile bu çözüm bilgisayara aktarılmalıdır.





1-   Problem Çözme ve Algoritmalar
1.1  Problem Çözme
   Problem çözmede, soruna hemen girişmek yerine, dikkatli ve sistematik yaklaşım ilke olmalıdır.  Problem iyice anlaşılmalı ve mümkün olduğu kadar küçük parçalara ayırılmaladır.
Descartes tarafından "Discourse on Method" isimli kitabında anlatılan problem çözme teknikleri;[2]

1. Doğruluğu kesin olarak kanıtlanmadıkça, hiçbir şeyi doğru olarak kabul etmeyin; tahmin ve önyargılardan kaçının.
2. Karşılaştığınız her güçlüğü mümkün olduğu kadar çok parçaya bölün.
3. Düzenli bir biçimde düşünün; anlaşılması en kolay olan şeylerle başlayıp yavaş yavaş daha zor ve karmaşık olanlara doğru ilerleyiniz.
4. Olaya bakışınız çok genel, hazırladığınız ayrıntılı liste ise hiçbir şeyi dışarıda bırakmayacak kadar kusursuz ve eksiksiz olsun.

1.2  Algoritmalar
   Belirli bir görevi yerine getiren sonlu sayıdaki işlemler dizisidir.
İ.S. 9.yy da İranlı Musaoğlu Horzumlu Mehmet
(Alharezmi adını araplar takmıştır) problemlerin çözümü için genel kurallar oluşturdu.  Algoritma Alharezmi'nin Latince okunuşu.
Her algoritma aşağıdaki kriterleri sağlamalıdır.
1. Girdi: Sıfır veya daha fazla değer dışarıdan verilmeli.
2. Çıktı: En azından bir değer üretilmeli.
3. Açıklık: Her işlem (komut) açık olmalı ve farklı anlamlar içermemeli.
4. Sonluluk: Her türlü olasılık için algoritma sonlu adımda bitmeli.
5. Etkinlik: Her komut kişinin kalem ve kağıt ile yürütebileceği kadar basit olmalıdır.
Not: Bir program için 4. özellik geçerli değil. işletim sistemleri gibi program sonsuza dek çalışırlar .

Örnek 1.2.1 : 1'den 100'e kadar olan sayıların toplamını veren algoritma.
1. Toplam T, sayılar da i diye çağırılsın.
2. Başlangıçta T'nin değeri 0 ve i'nin değeri 1 olsun.
3. i'nin değerini T'ye ekle.
4. i'nin değerini 1 arttır.
5. Eğer i'nin değeri 100'den büyük değil ise 3. adıma git.
6. T'nin değerini yaz.
   Algoritmaların yazım dili değişik olabilir. Günlük konuşma diline yakın bir dil olabileceği gibi simgelere dayalı da olabilir.  Akış şeması eskiden beri kullanıla gelen bir yapıdır. Algoritmayı yazarken farklı anlamlar taşıyan değişik şekildeki kutulardan yararlanılır.  Yine aynı amaç için kullanılan programlama diline yakın bir (sözde kod = pseudo code) dil , bu kendimize özgü de olabilir, kullanılabilir.

Aynı algoritmayı aşağıdaki gibi yazabiliriz.
1. T=0 ve i=0
2. i'nin değerini T'ye ekle.
3. i'yi 1 arttır.
4. i<101  ise  2.adıma git.
5. T'nin değerini yaz.

Algoritmayı bir de akış şeması ile gerçekleyelim.

   T=0
   İ=0

  İ'nin Değrini T'ye ekle

         İ'yi bir arttır


            İ<101

   
      T'yi yaz

Örnek 1.2.2 : ax2+bx+c=0 tipi bir denklemin köklerini veren algoritma.
Girdi : a, b ve c katsayıları       Çıktı : denklemin kökleri
1. a, b ve c katsayılarını al.
2. D = b2-4ac değerini hesapla.
3. D<0 ise gerçel kök yok.  7. adıma git.
4.  
5 .  
6.   değerlerini yaz.
7. Dur.
Döngü Gösterimi
Tekrarlanan adımlar
n.    Koşul sağlandığı sürece
   n.1 ...
   n.2 ...          tekrarlanan adımlar
      n.3 ...

Örnek 1.2.3 : İki tamsayının çarpma işlemini sadece toplama işlemi kullanarak gerçekleyin.
Girdi : iki tamsayı
Çıktı : sayıların çarpımı
1.    a ve b sayılarını oku
2.    c =0
3.    b>0 olduğu sürece tekrarla
   .3.1. c=c + a
    3.2. b = b-1
4.  c değerini yaz ve dur

Örnek 1.2.4 : Bir tamsayının faktoriyelini hesaplayınız.
Girdi : Bir tamsayı
Çıktı : sayının faktoriyel
İlgili formul: Faktoriyel(n)=1*2*...*n
1.    n değerini oku
2.    F=1
3.    n >1 olduğu sürece tekrarla
   .3.1. F=F*n
    3.2. n= n-1
4.    F değerini yaz
Örnek 1.2.5 : İki tamsayının bölme işlemini sadece çıkarma işlemi kullanarak gerçekleyin. Bölüm ve kalanın ne olduğu bulunacak.
1. a ve b değerlerini oku
2. m=0
3. a>=b olduğu sürece tekrarla
3.1    a=a-b
3.2     m = m + 1
4. kalan a ve bölüm m 'yi yaz

Örnek 1.2.6 :  100 tane sayıyı okuyup, ortalamasını bul
1.    T=0,   i=0
2.    i<101 olduğu sürece tekrarla
2.1      m değerini oku
2.2     T = T + m
2.3     i = i + 1
3.    T = T / 100
4.    Ortalama T ‘yi yaz
5.    Dur

Örnek 1.2.7 : Bir sınava giren öğrencilerin not ortalamasının hesaplanması
1.    Tüm sınav kağıtlarını inceleyip notların toplamını hesapla
2.    Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hesapla
3.    Ortalamayı yaz.

1.    Notların toplamını ve incelenen sınav kağıdı sayısını sıfır kabul et
2.    Sıradaki sınav kağıdının notunu notların toplamına ekle
3.    İncelenen sınav kağıdı sayısını Bir arttır
4.    İncelenecek sınav kağıdı var ise 2. Adıma git
5.    Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hasapla
6.    Ortalamayı yaz

1.    Notların toplamını ve incelenen sınav kağıdı sayısını sıfır kabul et
2.    Her bir sınav kağıdı için
2.1.    Sıradaki sınav kağıdının notunu notların toplamına ekle
2.2.    İncelenen sınav kağıdı sayısını bir arttır
3.    Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hesapla
4.    Ortalamayı yaz








Koşul Gösterimi

n.    Koşul doğru ise
   n.D.1
   n.D.2      doğru olduğunda işlenen adımlar
   n.D.3
aksi halde
   n.Y.1
   n.Y.2      yanlış olduğunda işlenen adımlar
   n.Y.3

Kök bulma örneğinde 3. Adımı tekrar yazarsak
3.    D>=0 ise
   3.D.1    
3.D.2  
aksi halde
   3.Y.1  Reel kök yoktur


Sorular:
* Girilen üç sayıdan en büyüğünü bulan algoritmayı yazınız.
* Tamsayılarda üs alma işlemini gerçekleştiren algoritmayı yazınız ( ab ).
*  1-100 arasında tutulan bir sayıyı tahmin eden algoritmayı yazınız.

Örnek 1.2.8 : Aracın otopark ücretinin hesaplanması. Araçların en fazla 24 saat kaldığını varsayın.
   0 - 2 saat   150 bin
   2 - 8 saat   300 bin
   8-24 saat   500 bin


1.    Aracın kaç saat kaldığını öğren ( t olsun ).
2.    t <= 2 ise
     2.D.1. ücret = 150 bin
Aksi halde
     2.Y.1. t<=8 ise
               2.Y.1.D.1. ücret = 300 bin
     Aksi halde
               2.Y.1.Y.1. ücret = 500 bin

3.    ücreti yaz
4.    Dur

Örnek 1.2.9: Sınavdaki en büyük notun bulan algoritma.

1.    En büyük = ilk sınav kağıdındaki not   (ya da olabilecek en düşük değer kabul edilebilir).
2.    İncelenecek sınav kağıdı var ise
2.1    Sınav kağıdındaki not > En büyük ise En büyük = Sınav kağıdındaki not

3.    En büyük değerini yaz.
4.    Dur


Algoritmanın yazımı daha simgesel olabilir.  Ni  i. Öğrencinin notu olsun.

1.    EB = N1
2.    i = 2
3.    İncelenecek sınav kağıdı var ise
3.1    Ni>EB => EB = Ni
3.2    i = i + 1

4.    EB' yi yaz.
5.    Dur



Örnek 1.2.10 : Programın C dili ile yazılıp çalışır hale getirilmesi.


1.    Programı bilgisayara gir
2.    Kaynak dosya olarak kaydet
3.    Kaynak dosyayı derle ( compile)
4.    Derleme sonucunda hata var ise
4.1      Hataları düzelt
4.2      3. Adıma git
5.    Oluşan amaç dosyasına diğer dosyaları bağla (link)
6.    Bağlama sonucunda hata var ise
6.1.    Hataları düzelt
6.2.    Hatalar kaynak dosya ile ilgili ise 2. adıma aksi halde 5. adıma git
7.    Program çalıştırılmaya hazır
2-   Programlamaya Giriş

Program : Belirli bir problemi çözmek için bir bilgisayar dili kullanılarak yazılmış deyimler dizisi.
Önceki bölümde bir problemin çözümü ile ilgili teknikler sunmuştuk.  Bir problemi bilgisayar ile çözmek için geliştireceğimiz programın yazımında izleyeceğimiz adımlar:

i) Problemin ne olduğunu kavra. Çözüm için gereksinimleri belirle.
ii) Problemin girdilerini, çıktılarını ve diğer kısıtlama ve gereksinimleri belirle ( bilgilerin giriş ve çıkış biçimlerinin nasıl olacağına kadar).
iii) Problemin çözümünü veren algoritmayı yaz.
iv) Algoritmayı bir programla dili ile yaz.
v) Programın doğru çalışıp çalışmadığını test et. Bu testi değişik veriler (girdiler) için tekrarla.


2.1  İlk Program Örneği
#include <stdio.h>                      Kullanılan işlevler ile ilgili başlık dosyası
main()
{
   int i ;                            Değişken tanımı
   scanf("%d",&i);          Programın gövdesi
   i:=i*i;
   printf("%d",i);
}

BCPL    B (1967 Ken Thompson)   C (Denis Ritchie unix i yazmak için)
az sayıda saklı sözcük
kısa ve etkin program
çok sayıda işleç
assembler e yakın kod
taşınabilir kod   kullanıcıya bırakılan kontroller (dizinin boyutu gibi )
düşük okunabilirlik

   source   ----->    compiler   ----->    object    ----->  link
    kaynak             derleyeci               amaç              bağlama
kaynak kod : C dili ile yazılmış olan program.
derleyeci      : Kaynak kodu makina koduna çevirir
amaç kodu   : Kaynak kodun makina dilindeki karşılığı  
bağlama       : Birden fazla amaç kodu dosyasının tek dosyada birleştirilmesi
2.2  Veri Tipleri  

Veri tiplerini vermeden önce yazılan bir programın geçtiği aşamalara göz atalım.

2.2.1  Int Tip
Integer = Tamsayı
Tamsayıları içerir. Bellekte 2 Byte tutar.
5 , -19 , 25000 gibi
Minimum   : -231     = -32768
Maksimum :  231-1   =  32767

2.2.2  Gerçel Tipler (Float, Double)
Gerçel sayıları içerirler.
float    : Bellekte 4 Byte yer tutar. 3.4E-38 ile 3.4E+38 aralığında değer alır. Hassasiyet 7-8 basamaktır.
double :  Bellekte 8 Byte ter tutar. 1.7E-308 ile 1.7E308 aralığında değer alır. Hassasiyet 15-16 basamaktır.

218.1 , -5.2 , 4.0

Bilimsel gösterim biçimi   2.5*103  = 2.5E3                                        2.5*10-3  = 2.5E-3

2.2.3  Char  Tip
Char : Karakter   : Alfanumerik karakterleri içerir.
'5' , '*' , 'K'

2.3  Sabitler (CONST)

#include <stdio.h>
main()
{
const float PI=3.14;                                                Tanımlama kısmı
float   r, Alan;
scanf("%f",r);
alan := PI*r*r;                                  
printf(('Alan = %f', alan);    
}
CONST (sabit) : Değeri programın çalışması boyunca değiştirilemez. Kullanım biçimi
const tip Belirleyici=değeri;
const  float PI=3.14;
Tip belirtilmez ise tamsayı kabul edilir.

2.4  Değişkenler
Değeri programın çalışması boyunca değiştirilekir. Kullanım biçimi:
Tip Belirleyici [,Belirleyici]  ;
int i;
float alan;

2.5  Belirleyiciler (Identifier)
Bileşenlere isim verme.  (Sabit, değişken, altprogram, etiket,  tipler (kullanıcı tanımlı)).

2.5.1  Kısıtlamalar
. İlk karakteri rakam olamaz
. Sadece harfler, rakamlar ve _ (underscore) karakterinin birleşiminden oluşabilir.
. C diline ait saklı (reserved) sözcükler kullanılamaz.
. En fazla 31 karakter olabilir.
. Küçük - büyük harf ayırımı vardır.

2.5.2  isimlerin Seçimi
. Belirleyicinin kullanım amacına uygun anlamlı isim seçin. (Hungarian notation)
. Ne fazla kısa ne de fazla uzun olsun. 3 - 10 karakter uzunluğunda olmasını alışkanlı edinin.
2.6  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


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
}

2.7  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;
}


2.8  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, <parametreler>)
<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 2.8.1 : Yarıçapı belli dairenin alanını hesaplayan programı yazınız. (ilk yazılan program)
#include <stdio.h>
main()
{
const float PI=3.14;                                                
float   r, alan;
r = 7;
alan := PI*r*r;                                  
printf(('Alan = %f', alan);    
}

Örnek 2.8.2 : En fazla dört basamak olabilen sayının basamak değerlerini yazdır. % ve / işlemlerinin  kullanımı.
#include <stdio.h>
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 2.8.3: 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
Algoritma :
1. a, b ve c katsayılarını oku.
2. Delta=  değerini hesapla.
3. x1 ve x2 değerlerini hesapla.
4. Kökleri yaz.

Programın kodlanması:

#include <stdio.h>             /* printf işlevi için */
#include <math.h>             /* 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

2.9  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, <değişkenler>)

Girilen karakterler <kontrol> 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 2.9.1:  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);
}

2.10 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 )








3 -  Döngü ve Koşul Deyimleri

   Programlar (algoritmalar) üç temel blok kullanılarak gerçekleştirilebilirler. Bunlar; ardarda, bir koşula bağlı olarak ve sonlu sayıda yineleme (döngü) dir.

3.1  Koşul Deyimleri

   Birkaç seçenekten birini seçmek veya bir deyimin bir koşula bağlı olarak işlemek için kulanılır.


3.1.1  if-then-else Deyimi

   if (<mantıksal ifade>)
        blok_doğru;
   else      
        blok_yanlış;   

Mantıksal ifade doğru ise blok_doğru, yanlış ise else sözcüğünden sonraki blok_yanlış yürütülür. else kısmı seçimlidir, gerekmiyorsa kullanılmayabilir.


Örnek 3.1. 1.1  Girilen sayının tek/çift olduğunu yazan program
#include <stdio.h>
main()
{
  int i;
  scanf("%d", &i);
  if ( i % 2 == 1)
     printf("Tek");
  else
      printf("Çift");
}

Bileşik (Compound) Deyimler

{ ve  } karakterleri ile sınırlandırılmış bir dizi deyimden oluşur.
{
    i = 5;
    j = i/2;
    k = i+1;
}  

Eğer bloklarda  birden fazla deyim kullanmak gerektiğinde bileşik deyim kullanılır.

   if (yil % 4 == 0)       {
      subat =29;
      gunyil = 366;
        }   
   else     {
      subat =28;
      gunyil = 365;
        }
Örnek 3.1.1.2 : İkinci dereceden denklemin köklerinin bulunması.    

   if (delta<0)
         printf("Gerçel kök yoktur.\n");
   else
        {
             x1 = (-b + sqrt(delta)) / (2 * a);
                    x2 = (-b - sqrt(delta)) / (2 * a);
                 printf("Birinci kök = %f\n" , x1);
                  printf("ikinci kök  = %f\n" , x2);
        }


Örnek 3. 1.1.3 : Klavyeden girilen karakterin rakam olduğunun tesbiti.

   char c;
   c = getch();
   if ((c>='0') && (c<='9')
        printf("Rakam girdiniz.");


Örnek 3. 1.1.4 : Girilen üç sayıdan en küçüğünün bulunması (İçiçe IF kullanımı).

   scanf("%d%d%d", &s1, &s2, &s3);
   if ((s1<s2) && (s1<s3))
              ek =s1;
   else
       if (s2<s3)
           ek =s2;
       else
           ek = s3;
   printf('En küçük olanı = %f", ek);

II. yol :
   scanf("%d%d%d", &s1, &s2, &s3);
   ek = s1;
   if (ek>s2)
              ek =s2;
   if (ek>s3)
        ek =s3;
   printf('En küçük olanı = %f", ek);











Örnek 3. 1.1.5:  Fonksiyonun girilen t değeri için aldığı değeri hesaplayıp yazan program.




main()
{
 float y, x;

 printf("x değerini giriniz");
 scanf("%f", &x);
 if (x > -1  && x<2)
     y = 2/3 * (x + 1);
 else
  if (x>2 && x<=3)
     y = 2;
  else
    y = 0;

 printf("Fonksiyonun değeri = &f", y);
}
   





Örnek 3. 1.1.6: Vergi iadesini hesaplan programı yazınız. (elseif  yapısı)
(0-60 bin : %10, 60-120 bin : %,120-200 bin : %12,>200 bin : %5)

main()
{
 float fat_top, vergi_iade;
 printf("Fatura toplamlarını giriniz ");
 scanf("%f", &fat_top);
 if (fat_top < 60000)
    vergi_iade = fat_top * 0.10;
 else if (fat_top < 120000)
    vergi_iade = 6000 + (fat_top - 60000) * 0.20;
 else if(fat_top < 200000)
    vergi_iade = 18000 + (fat_top - 120000) * 0.12;
 else
    vergi_iade = 27600 + (fat_top - 200000) * 0.05;

 printf("Ödenecek vergi iadesi = %f\n", vergi_iade);

}


Örnek 3. 1.1.7: Girilen tarihteki günün adını veren programı yazınız.

#include <studio.h>
main ( )
{
  int gun, ay, yıl ;
 long gt ;
 printf("Tarihi gir") ; scanf ( "%d %d %d ",&gun)

/* oncekı yıllardakı gun sayısını hesapla */

 gt=( yıl*1)*365 + yıl/4;

/* bu yildaki aylardaki gunleri ekle */

if (ay==2)
   gt = gt + 31 ;
else if (ay ==3)
   gt = gt + 31 + 28 ;
else if (ay ==4)
   gt = gt + 31 + 28 +31;
else if (ay ==5)
   gt = gt + 31 + 28 +31+ 30 ;
else if (ay ==6)
   gt = gt + 31 + 28 +31+ 30 +31;
else if (ay ==7)
   gt = gt + 31 + 28 +31+ 30 +31+ 30 ;
else if (ay ==8)
   gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31 ;
else if (ay ==9)
   gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 ;
else if (ay ==10)
   gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31;
else if (ay ==11)
   gt = gt  + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 ;
else if (ay ==12)
   gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 +31;

/*Bu ayı ekle */
gt = gt+ gun;
if(yıl%4==0 && ay>2),
   gt =gt+1;
gt=gt %7,
if(gt==1)
printf("Pazar");
else if(gt==2)
printf("Pazartesi");
else if(gt==3)
printf("Salı");
else if(gt==4)
printf("Carsamba");
else if(gt==5)
printf("Persembe");
else if(gt==6)
printf("Cuma");
else if(gt==7)
printf("Cumartesi");
}


3.1.2  switch Deyimi

   switch(<seçici>) {
      case seçenek1 : Deyim;                                        
      case seçenek2 : Deyim;                                    
          .
          .      
          .
      default :     Deyim;
   }

Seçicinin aldığı değere eşit seçeneğin olup olmadığına bakar. Var ise o noktadan sonraki deyimler yürütülür. switch deyiminin sonuna gelindiğinde veya break deyimi ile karşılaşıldığında yürütme işlemi durur ve programın akışı switch deyimini izleyen deyim ile devam eder.    

switch(i) {
  case 1 : printf("Bir");
  case 2 : printf("İki");
  default : printf("Hiçbiri");
}

i=1 ise çıkış  BirİkiHiçbiri
i=2 ise çıkış  İkiHiçbiri

Sorunu ortadan kaldırma için her durum için break deyimi eklenmeli.

   . Seçici Ordinal tiplerden biri olmalıdır (Ordinal tip: tüm değerleri listelenebilinen          veri tipleri - integer, char).
   . Seçici ile seçenekler aynı tipte olmalıdır.
   . default kısmı seçimliktir. Seçeneklerin hiçbiri uygun değil ise yürütülür.



#include <stdio.h>
main()
{
 char islem;
 int s1, s2, s3;
 printf("Önce işlemi sonra sayıları girin ");
 scanf("%c%d%d",&islem, &s1, &s2);
 switch (islem) {
    case '+' : s3 = s1 + s2; break;
    case '-' : s3 = s1 - s2; break;
    case '*' : s3 = s1 * s2; break;
    case '/' : s3 = s1 / s2; break;
    default : printf ("Hatalı işlem");   
 }
 printf("\nSonuç = %d",s3);
}

Örnek 3.1.2.1: Mevsimleri yaz.

   scanf("%d", &ay);
   switch (ay) {
      case 3:
      case 4:
      case 5: printf("ilkbahar"); break;
      case 6:
      case 7:
      case 8: printf("yaz"); break;
      case 9:
      case 10:
      case 11: printf("sonbahar"); break;
      case 12:
      case 1:
      case 2: printf("kış"); break;
   }            
switch deyimi yerine if deyimi kullanılabilir. Ancak switch deyimi programı daha okunabilir kıldığı için gerekli olduğu durumlarda kullanılmalıdır.

Örnek 3.1.2.2 : 16'lık sistemdeki rakamın 10'luk sistemdeki karşılığı (char tipinin sayı gibi davranışı).
switch(c) {
  case '0':
  case '1':
  . . .
  case '9': i = c - '0'; break;
  case 'a':
  case 'A': i = 10; break;
  . . .
  case 'f':
  case 'F': i = 15; break;
}


Örnek 3.1.2.3: Sınav notunu harfe dönüştüren programı yazınız.
( >=90 :AA, 85-89:BA, 80-84:BB, 75-79:CB, 70-74:CC, 60-69:D, <60 :F )

Örnek 3.1.2.4: Belirtilen tarihin hangi güne denk geldiğini bulan programı yazınız.
else if yapısı yerine switch kullanarak

3.2  Döngü Deyimleri (Yineli)

   Bir ya da birden fazla deyimin tekrar edilemesini sağlarlar. C dilinde while, for ve do-while deyimleri döngü işlevini saşlar. Tekrar edilen deyimlere döngü gövdesi denir.
    

3.2.1  while Deyimi

   while <mantıksal ifade>
      Deyim

   Mantıksal ifade doğru olduğu sürece Deyim yürütülür. Eğer yanlış ise kontrol bir sonraki deyime geçer.




Örnek 3.2.1.1 :  1'den 100'e kadar olan sayıların toplamı.

1.    i =1
2.    j = 0
3.    i < 101 olduğu sürece
3.1       j = j + i
3.2       i = i + 1
4. Toplam j ‘ yi yaz
      main()
   {
       int i, j;
       i =1;
       j = 0;      
       while (i<101) {
              j =j+i;
              i =i+1
       }
        printf("Toplam = %d",j);
   }



Örnek 3.2.1.2: Toplama ve çarpma kullanarak çarpma işmeini gerçekleyiniz.
1.    a ve b sayılarını oku
2.    c =0
3.    b>0 olduğu sürece tekrarla
   .3.1. c=c + a
    3.2. b = b-1
4.  c değerini yaz ve dur   main()
{
 int a, b, c;
 printf ("iki sayıyı giriniz ");  scanf("%d%d", &a, &b);
 c = 0;
 while (b > 0) {
   c = c + a;
   b = b - 1;
 }
 printf("Sonuç = &d\n", c);
}


Örnek 3.2.1.3: Girilen sayının faktoriyelini hesaplayan programı yazınız.
1.    n değerini oku
2.    F=1
3.    n >1 olduğu sürece tekrarla
   .3.1. F=F*n
    3.2. n= n-1
4.    F değerini yaz   main()
{
 int n;
 long f;
 printf ("sayıyı giriniz ");  scanf("%d", &n);
 f = 1;
 while (n > 1) {
   f = f * n;
   n = n - 1;
 }
 printf("Sonuç = &d\n", f);
}

Örnek 3.2.1.4: Klavyeden girilen sayıları oku. Sayıların toplamı 21'den büyük veya eşit olduğu zaman dur.
   main()
   {
        int i, j = 0;
        while (j<21) {
      scanf("%d",&i);
      j =j+i;
         }
        printf("Toplam = %d",j);
   }
Örnek 3.2.1.5: 1993 yılı itibarı ile ülke nüfüsu 60 milyondur. Yıllık nüfüs artış oranı %2.3 tür. Sonraki 10 yılda ülke nüfüsunu yıllara göre listeleyen program.

/* Nufus Tablosu  */
#include <stdio.h>
main()
{
 int       i;   /* sayac */
 int     yil;   /* yillar */
 float nufus;   /* nufus miktari */
 float artis;   /* artis orani */

 artis = 0.023;
 yil = 1993;
 nufus = 60000000;
 printf("%d - %10.0f\n",yil,nufus);
 i = 1;
 while (i < 11)
   {
     nufus = nufus * (1 + artis);
     printf("%d - %10.0f\n",yil + i,nufus);
     i = i + 1;
   }
}

Örnek 3.2.1.6 : Girilen tamsayının mükemmel sayı olup olmadığının söyleyen programı yazınız.
(mükemmel sayı = tam bölenlerin toplamı sayının kendisine eşit)

Örnek 3.2.1.7 : Girilen tamsayının kaç basamaktan oluıştuğunu söyleyen programı yazınız.

Örnek 3.2.1.8 : Girilen tamsayı içerisinde kaç tane 1 olduğunu söyleyen programı yazınız.

Örnek 3.2.1.9: Girilen tamsayının son üç basamağını yuvarlayan programı yazınız.
son üç basamağı >=500 > 1000 e, <500 ise 0 a yuvarlayacak
(2560  3000, 2490  2000 )

Örnek 3.2.1.10: Sınavın ortalamasını hesaplayan programı yazınız.
1.    Durum : sınava giren öğrenci sayısı belli

main()
{
 int i, ogr_say, not_top, not;
 float ort;
 not_top = 0;
 i = 0;
 printf("Öğrenci sayısını giriniz "); scanf("%d", &ogr_say);
 while (i < ogr_say) {
   printf"Sıradaki öğrencinin notu  = "); scanf("%d", &not);
   not_top = not_top + not;
   i = i + 1;
  }
  ort = float (not_top) / ogr_say;
  printf("Ortalama = &f\n", ort);  
}
2.    Durum : sınava giren öğrenci sayısı belli değil

Bu durumda girişin bittiğini gösterir bir bilgiye (işarete) ihtiyaç vardır. Sınav notu için 0 dan küçük bir değer girildiğinde girme işleminin sona erdiğinin varsayalım.

ogr_say = 0;
printf"Sıradaki öğrencinin notu  = "); scanf("%d", &not);
while (not >= 0) {
   not_top = not_top + not;
   ogr_say = ogr_say + 1;
printf"Sıradaki öğrencinin notu  = "); scanf("%d", &not);
}


3.2.2  For Deyimi

 for (ifade1 ; ifade2 ; ifade3 )
     ifade;

 ifade2 doğru ( veya farklı 0) olduğu sürece ifade yürütülür (bitiş koşulu).
 Döngünün ilk adımından önce ifade1 yürütülür ( başlangıç adımı).
 Döngünün her adımında ifade3 yürütülür (artış miktarı).

 for (i = 1; i < 5; i++)
     printf("%d ",i);


 ifade1, ifade2 ve ifade3 seçimliktir. ifade2 belirtilmez ise herzaman
doğru olduğu ( == 1 ) kabul edilir. Yani sonsuz döngü oluşur.

 for (i = 1; ; i++)
     printf("%d ",i);


Örnek 3.2.2.1:  1'den 100'e kadar olan sayıların toplamı.

   j =0;
   for (i=1; i<=100; i=i+1)
                     j =j+i;
   printf("Toplam %d",j);    


Örnek 3.2.2.2:  Girilen sayının faktöriyelini bulunuz.

   
       fact =1;
       for (j=1; j<=i; j++)
      fact =fact*j;
       printf("Faktöriyel  =%f",fact);   
   }




Örnek 3.2.2.3:  Çarpım tablosu. (içi içe döngüler)

   main()
   {
       int i,j;
       for (i=1; i<=10; i++) {
            for (j =1; j<=10; j++)
      printf("%4.0d",i*j);   
            printf("\n");   
       }   
   }


Örnek 3.2.2.4:   ? işlevini çiziniz(0-8 noktaları arasında).


3.2.3  do-while Deyimi

   Bir koşul doğru olana kadar döngü yürütülür.

   do
        Deyim
   while (<mantıksal ifade>)

   Mantıksal ifade doğru olduğu sürece döngü tekrar edilir. Yanlış olduğunda while sözcüğünden
sonraki deyim yürütülür.    

5 sayısı girilene kadar oku

   do
       scanf("%d",&i);
   while (i!=5);

   i =1;
   do {
       printf("%d",i*i);
       i =i+1;
   } while (i<=10);


Örnek 3.2.3.1: Sadece +, - kullanarak * işlemini gerçekleştirme.

main()
{
  int a, b;
  int c;
  scanf("%d%d", &a, &b);
  c = 0;
  do {
     c = c + a;
     b = b - 1;
  } while (b>0);
  printf("%d\n", c);
}
Karşılaştırma
    while : Koşul başlangıçta test ediliyor. Döngü sıfır veya daha fazla yürütülüyor.
    do-while : Koşul sonda test ediliyor. Döngüye en az bir defa kesin giriliyor.

Örnek 3.2.3.2: 0 - 100 arasında tutulan sayının tahmini.
main()
{
 int       tahmin;   /*  tahminimiz  */
 int          min;   /*  Tahminin alt siniri  */
 int          max;   /*  Tahminin ust siniri  */
 char       cevap;   /*  Kullanicinin cevabi  */
 min = 0;   max = 100;
 do {
   tahmin = (max - min) / 2 + min;
   printf("Tahminim %d\n",tahmin);
   printf("Buyuk / Kucuk / Esit ");
   scanf("%c",&cevap);
   if (cevap == 'B')
      max = tahmin - 1;
    else
       if (cevap == 'K')
         min = tahmin + 1;
 } while (cevap != 'E');
}
Örnek 3.2.3.3: Sin(x) fonksiyonun belli bie x için değerini seri açılımı ile hesaplayınız. Serinin ilk 10 terimini kullanınız.  n tek sayı.
main()
{
 float    x;        /* fonksiyonun hesaplanacağı değer */
 float sinx;        /*  sin(x) in değeri */
 float   xt;        /* eklenen terimin payı */
 float fakt;        /* eklenen terimin paydası, faktoriyel */
 int isaret;        /* terimin +/- olmasını sağlar */
 int      i;
 clrscr();
 printf("Hesaplanacak değer : ");
 scanf("%f",&x);
 sinx = x;
 isaret = -1;
 fakt = 1;
 xt = x;
 for (i = 2; i<=10; i++) {
     xt = xt * x * x;
     fakt = fakt * (2 * i - 2) * (2 * i - 1);
     sinx = sinx + isaret * xt / fakt;
     isaret = -isaret;
 }
 printf("Değeri = %f\n",sinx);
}
Örnek 3.2.3.4 : Aynı örneği belli sayıda terim için değil, sonucu 4 basamak hassasiyetle hesaplayınız.
4 -  İşlevler

   Problem çözmenin ilkelerinden biri problemi mümkün olduğu kadar çok parçaya bölmek idi. Daha sonra bu parçalar bağımsız olarak düşünülüp çözümleri elde edilebilir. C'de bu bölme işlemi işlev kullanarak yapılır.
   Belli bir işi gerçekleştiren program deyimlerinin karmaşık programları düzenlemek ve basitleştirmek için programın bir birimi olarak gruplandırılması.

(işlev kullanmanın temel nedenleri : divide and conquer ,  software reusability )

Örnek 4.1 : Bir tamsayının faktöriyelini hesaplayan işlev

main()
{
 int i;
 prinf("Sayıyı giriniz "); scanf("%d", &i);
 printf("%d\n", fakt(i));
}   long fakt ( int n)
{
 int j;  
 long f = 1;
 for ( j = 2; j < =n; j = j  + 1),
      f = f * j;
 return f;
 }


Örnek 4.2 : Bir tamsayının kübünü veren işlev
#include <stdio.h>
main()
{
int sayi;
int kub(int); /* işlevin prototipi */

printf("sayıyı gir ");
scanf("%d", &sayi);

printf("Kübü = %d\n", kub(sayi));
}

int kub(int i)
{  return i*i*i; }


İşlevin tanımlanma biçimi

  dönüş_tipi işlev_adı(parametreler)
  {
    yerel tanımlamalar
    deyimler
  }

dönüş_tipi: Eğer işlev bir değer geri gönderecek ise değerin tipini belirtir. Belirtilmez ise Int kabul edilir. Eğer       işlev değer göndermeyecek ise dönüş_tipi yerine void yazılır.

işlev_adı: İşlev çağırılırken kullanılacak ad (belirleyici).

parametreler: İşlev için gerekli değerleri içerir. Her parametre değişken tanımlar gibi tanımlanır. Herbirinin        arasında ',' kullanmak gerekir.
yerel tanımlamalar:  Bu işleve özgü(değişken,sabit) tanımlamalar.


Eğer işlev bir değer gönderecek ise bu return deyimi ile yapılır.

     return değer;


İşlevin Prototipi
Tanımlana bir işlevin ana modül içerisinde prototipinin yazılması gerekir. Prototip ile işlevin dönüş değeri ve aldığı parametrelerin tipleri tanımlanır. Bu bilgiye göre C derleyecisi işlev çağırıldığında değerlerin uygun olduğunu sınar.
int kub(int)         kub işlevi int bir değeri alır ve yine int bir değer üretir.

Örnek 4.3 : Üç sayıdan en büyüğünü veren işlev.
Girdi : üç tane tamsayı
Çıktı : girdilerin en büyüğü

int max(int s1, int s2, int s3)
{
if (s1>s2 && s1>s2)
   return s1;
else
   if (s2>s3)
      return s2;
   else
      return s3;
}

Bu işlevi kullanan bir program
#include <stdio.h>
main()
{
int max(int, int, int);
clrscr();
printf("%d \n", max(1,2,3));
printf("%d \n", max(14,8,12));
printf("%d \n", max(1,6123,3123));
}
...
işlevin tanım bloğu
...


Örnek 4.4: Üs alma işlevini gerçekleyen işlev (üs bilgisi tamsayı).
Girdi : taban ve üs değeri
Çıktı : tabanın üs. kuvveti
float us (float a, int  b)
{
   int i;
   float r;

   r = 1;
   for (i = 1; i<=b; i++)
       r = r * a;
    return  r;
}

Fonksiyonun program içinden çağırılışı
   d = us(2,3);
   d = us(a, 4);
   d = d * us(3,4);      

Üs alma işlemini gerçeklemenin diğer yolu

ab = eblna  = Exp(b * Ln(a))
Exp(x : Real) : Real       ex
Ln(x : Real) : Real         Ln(x)

float us (float a, float  b)
{
   if (a>0)
       return= exp( b * log (a ));
   else
       return= -1;
}



Genel değişken (global): Her yerde (main ve diğer işlevler) geçerlidir, değerine erişilebilir.
         Programın en başında, main işlevinin dışında tanımlanır.
Yerel değişken (local): Sadece tanımlandığı modülde geçerlidir, değerine erişilebilir.
         Modül içinde tanımlanır.


int a;   /*tüm işlevlerden değerine erişilebilir, değeri değiştirilebilir.  (global) */

main()
{
  int b;  /* sadece main işlevi içerisinden erişilebilir  (local ) */
  ...
}

islev1(...);
{
  int b;   /* sadece islev1 işlevi içerisinden erişilebilir. main işlevindeki değişkendan bağımsızdır  (local ) */
  int c;   /* sadece islev1 işlevi içerisinden erişilebilir  (local ) */
  ...
}








Örnek 4.5  : 8 bit olarak girilen bir sayıya eşlenik (parity) bitini ekleyen programı yazınız (çift eşlenik)
Eşlenik biti en düşük anlamlı bit olarak eklenecektir.

Algoritma
   1. Sayıyı oku.
   2. Sayıdaki birlerin sayısını bul.
   3. Birlerin sayısı tek ise 1, çift ise 0 ekle.

Programı yazarken 2. ve 3. adımlar işlev olarak yazılacaktır.

/* Eşlenik biti ekleme */
int bulbir ( int );
int eklebir ( int , int );

main()
{
 int girsayi, birler;

 clrscr();
 scanf("%d", &girsayi);
 birler = bulbir(girsayi);
 girsayi = eklebir(birler, girsayi);
 printf("%d\n", girsayi);
}

int bulbir ( int sayi)
{
  int kacbir = 0;
  while (sayi>0) {
      kacbir = kacbir + (sayi % 2 );
      sayi = sayi / 2;
  }
  return kacbir;
} /* BulBir */

int eklebir ( int birler, int sayi)
{
  return (2 * sayi + (birler % 2));
} /* Eklebir */


* Karşı taraf için gereken algoritmayı yaz (sayı doğru mu, doğru ise değeri).   

Örnek 4.6  : A işyerindeki bir personelin hangi dilimden gelir vergisi ödeyeceğini (yüzdesini) belirten fonksiyonu yazınız.

Girdi : personelin birikmiş vergi matrahı
Çıktı : Kesinti yüzdesi
İlgili bilgi :  0-20 Milyon %25,  20-40 Milyon %30, 40-80 Milyon %35,  80-160 Milyon %40
                >180 Milyon %45

int  v_oran ( float bvd);
{
  int i;
   if (bvd < 20000000)
       i = 25;
   else if  (bvd < 40000000)
       i = 30;
   else if  (bvd < 80000000)
       i =  35;
    else  if  (bvd < 160000000)
        i =  40;
    else
        i = 45;
    return i;
}
Örnek 4.7  :  Gelir vergisi matrahı ve önceki aylara ait birikmiş vergi matrahı belli bir personelin gelir vergisini hesaplayan fonksiyonu yazınız.
       Vergi := Gelir vergisi matrahı * Vergi oranı
Not : Eğer personel bu ay dilim değiştiriyorsa gelir vergisi gerektiği şekilde eski ve yeni dilime paylaştırılarak kesinti hesaplanmalıdır.

Örnek 4.8 : Girilen harfi büyük harfe dönüştüren fonksiyon
Girdi : karakter
Çıktı : karakter ( girdi harf ise büyük harfe dönüştürülmüş)

char  buyuk(char c);
{
   if (c >= 'a'  && c <= 'z')
       return c - 32;
   else
       return c;
}

Örnek 4.9:
Girdi : iki sayı ve aralarındaki işlem
Çıktı: iki sayı arasındaki işlemin sonucu

int calculate(char islem, int a, ibt b, int c)
{
  int s;
   switch( islem )
       case '+' : s = a + b ; break;
       case '-' : s = a - b ; break;
       case '*' : s = a * b ; break;
       case '/' : s = a / b ; break;
      default : s = 0;
  }
  return s;
}

Çağırma biçimi
    a = calculate ('+',4,8');
    a = calculate ('/', 4,2) * calculate ('*', 2,2);




Örnek 4.10:  Bir işlevin köklerinden birini Newton yönetimi ile bulan prg. ( x2-2 )

#include <stdio.h>
#include <math.h>

double fn(double);
double fnt(double);

main()
{
double x,x0;
double hata;


hata = 0.0001;        /* izin verilen hata */
x = 8;                     /* başlangıç değeri */
do {
  x0 = x;
  x = x0 - fn(x0)/fnt(x0);
} while (fabs(x-x0)>hata);

printf ("Sonuç = %f\n", x);
printf ("f(x)  = %f\n", fn(x));
}

double fn(double x) /* işlevin değeri */
{
return x*x-2;
}

double fnt(double x)  /* işlevin türevinin değeri */
{
 return 2*x;
}


Örnek :4.11:  İki sayının ortak katlarının en küçüğünü veren işlevi yazınız.

#include <stdio.h>
long okek(long, long);
main()
{
 long i, j;
 clrscr();
 printf("İki tamsayı giriniz :");
 scanf("%ld%ld", &i, &j);
 printf("sayıların okeki = %ld \n" okek(i, j));
 
}

long okek(long p, long q)
/* p < q olmali. Degil ise yerlerini değiştir. */
{
 long i, k;
 if (p>q) {
     i=p;
     p=q;
     q=i;
 }

 /* p nin öyle bir katını bul ki q sayısına tam bölünsün
    2 sayısından itibaren taranmaya başlanabilir fakat
    p/q yeterli
 */

 i = q / p;
 do {
   k = p*i;
   i = i+1;
 } while ( k % q != 0);
 return k;


Örnek :4.12: İstenen sayıdaki asal sayıyı listeleyen programı yazınız.

#include <stdio.h>

int asal(int);
main()
{
 int i ;    /* asal olup olmadığı sınanacak sayılar */
 int kac; /* ilk kaç asal sayının listeleneceği bilgisi */
 int j;      /* listelenen asal sayıların adetini tutar */

 clrscr();
 printf("ilk kaç asal sayı listelenecek : ");
 scanf("%d", &kac);


 /* for deyiminde ifade3 kısmında döngü değişkeni yerine
    farklı bir değişkenin değeri değiştiriliyor. Döngü değişkeni
    ide incelenen sayı asal ise arttırılıyor
 */

 i = 2;
 for (j = 1; j<=kac;i++)
     if (asal(i)) {
        printf("%d \n", i);
        j++;
     }
}
int asal(int n)
/* sayı asal ise 1 değilk ise 0 değerini alır */
{
       int i;
       if (n % 2 == 0)
               return (n==2);
       if (n % 3 == 0)
               return (n==3);
       if (n % 5 == 0)
               return (n==5);
       for (i=7; i*i <= n; i+=2)
               if (n % i == 0)
                       return 0;
       return 1;
}


Örnek :4.13: Belirtilen tarihteki ayın kaç gün sürdüğünü veren işlevi yazınız.
Girdi : Ay ve yıl
Çıktı : Aydaki gün sayısı

int aydakigun(int ay, int yil)
{
 int i;
 switch (ay) {
     case 1:
     case 3:
     case 5:
     case 7:
     case 8:
     case 10:
     case 12 : i = 31;break;
     case 2 :
             if (yil % 4 == 0)
                i = 29;
             else
                i = 28;
             break;
     default : i = 30;
 }
 return i;
}


Örnek :4.14: Önümüzdeki yılda Ramazan Bayramı nın hangi tarihte kutlanacağını hesaplayan programı yazınız. Bu yılki tarih klavyeden gün ay ve yıl olarak okunacakır.
Girdi: Bu yıl kutlanılan tarih
Çıktı : Sonraki tarih

#include <stdio.h>

int aydakigun(int, int);

main()
{
 int gun,ay, yil;
 int i, j ;

 clrscr();
 printf("Bu yılki tarihi giriniz (G A Y) : ");
 scanf("%d %d %d",&gun, &ay, &yil);
 yil = yil + 1;
 gun = gun - 11;
 if (gun < 1 ) {
    ay = ay - 1;
    if (ay < 1 ) {
       ay = 12;
       yil = yil - 1 ;
    }
    gun = gun + aydakigun(ay, yil);
 }
 printf("\nGelecek bayram = %d/%d/%d\n",gun,ay,yil);
}


Örnek :4.15: Girilen bir tamsayının basamaklarının sırasının tersinin oluşturduğu sayıyı veren işlevi yazınız.
#include <stdio.h>
long tersi(long);
main()
{
 long s;
 clrscr();
 printf("Sayıyı giriniz : ");
 scanf("%ld", &s);
 printf("Basamaklarının ters çevirilmişi  = %ld \n", tersi(s));
}

long tersi(long k)
{
 long a, b;
 a = 0;
 while (k>0) {
    b = k % 10;
    a = a * 10 + b;
    k = k / 10;
 }
 return a;
}

4.2 Özyineleme (Recursive) İşlevler

   Kendini çağıran fonksiyonlardır.

Örnek 4.2.1: Faktoriyel hesabı

long fakt(long i)
/* fakt = i! */
{
 if (i<2)
    return 1;
 else
    return i*fakt(i-1);
}

Örneğin n=4 için fonksiyonun kendisini çağırdığı satır şöyledir:
      4 * fakt(3),  3 * fakt(2),  2 * Fakt(1)
24 = 4 *   6  <--  3 *   2  <
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.