C Dili - 3. Konu


Başlamadan önce: Birçok derleyici, burada kullandığımız "printf" konusunda size uyarı verebilir, hatta belki programınızın derlenmesine mani olabilir.
Şayet printf konusunda bir uyarı alıyorsanız, bu örnek programları derlemeden önce, programın başında boş bir satıra
#include <stdio.h>

komutu koyunuz.. Bunu koyarsanız, derleyici "stdio.h" dosyasını okuyup, printf'in ne olduğunu öğrenecek ve size artık uyarı vermeyecektir.

'WHILE' DÖNGÜSÜ

C dilinde, birçok tip döngü vardır. While döngüsü, herhangi bir test (karşılaştırma), doğru kaldığı surece, bir program parcasini tekrarlar. Bu testin sonucu yanlış çıkarsa, while döngüsü sona erer, ve program normal akışına devam eder.

main()  /* while döngüsünün bir örneği */
{
int count;
count = 0;
while (count<6)
{
printf("count'un değeri: %d oldu. \n",count);
count = count + 1;
}
}

Bu programda, count isimli bir değişkeni tanımlıyoruz, ve sıfıra eşitliyoruz. while döngüsünün kullanımı, göründüğü gibi 'while' sözcüğü, ve parantez içinde bir kontrolden olusur. Parantezlerin içindeki deyim doğru kaldığı surece bu program tekrarlar. Bu programda, değişkenin değeri teker teker arttırıldığından, eninde sonunda değeri altıya varacaktır, ve bu durumda program döngüden çıkacaktır.

Parantezlerin içinde yer alan deyimleri, bundan sonraki konuda işleyeceğiz. O zamana kadar, bunların düşündüğünüz şeyleri yaptığını kabul ediniz.

Birkaç önemli nokta:

  1. Şayet 'count' un başlangıç değeri 5 den buyuk bir şeye atanmış olsa idi, dongünün içindekiler hiç yapılmayacaktı.
  2. Eğer 'count = count + 1' komutu ile değerini bir arttırmasa idik, bu program hiç durmazdı.
  3. Son olarak, eğer döngüde tek bir komut varsa, küme işaretlerine gerek yoktur.

C Dilinde Karşılaştırmalar

while döngüsünde,   parantez içinde (count < 6)  gibi birşey vardı.  Bunun doğru olması,  count değişkeninin değerine bağlıydı: 6 dan küçükse, "doğru" , 6 veya daha büyükse "yanlış" olarak algılanacaktır.

Peki C dili için "doğru" ve "yanlış" nedir?  C dilinde "Doğru", sıfır Hariç herhangi bir rakam döndüren bir işlemdir!  
C dilinde yanlış ise, sıfır değeri döndüren bir işlemdir.  Yani,  -5000, -1,  15, 1,100 gibi değerler döndüren bir işlem, "doğru" , ama 0 döndüren bir işlem "yanlış" olarak algılanmaktadır.

Birkaç Örnek Daha:

main()
{
    int donkey=0;
    int water=10;
    while (donkey < water) {
       printf("donkey henüz water dan küçük:  water: %d  donkey: %d \n", water, donkey);
donkey = donkey + 1;
    }
}

main()
{
int full=10;
while (full) {
printf("Full hala sıfırdan büyük..\n");
full = full-1;
}
}

Bu son örnekte, "full" değişkeni sıfır değerine ulaşınca, döngü sona erecektir.
Hatırlarsanız C dilinde sıfır değeri, "Yanlış" ı sembolize etmektedir.

DO-WHILE DÖNGÜSÜ

Buna benzeyen bir başka komut ise, 'do-while' komutudur. Şu program, daha
önce gördüğümüz programa çok benzer:

main()  /* Do-While döngüsü örneği */
{
int i;
i=0;
do
{ printf("I nın değeri simdi: %d oldu.\n",i);
i = i + 1;
} while (i<5);
}

Yegane farkın, döngünün bir 'do' komutu ile yapılması ve denkliğin
kontrolünün sona bırakılmasıdır. Bu durumda, parantezlerin arasında deyim
doğru kaldığı surece, döngü tekrarlanır.

Burada önemli noktalar: Kontrol, döngünün sonunda yapıldığından, küme
işaretlerinin arasındaki deyimler daima en az bir kere işlenir. Ayrıca
yine, şayet i nin değeri değişmez ise, program döngüden çıkmaz. Son olarak,
şayet döngünün içinde bir tek komut varsa, küme işaretlerine gerek yoktur.

Ayrıca, dilediğiniz miktarda döngüyü iç içe de koymanız mümkündür. Örneğin:

main() // Bu çok karışık bir örnektir!
{
    int a,b;
    a=5;
    while (a>0) {
        b=2;
        while (b>0) {
            printf("a=%d ve b=%d\n",a,b);
            b=b-1;
        }
       a=a-1;
      }
}


FOR DÖNGÜSÜ

For döngüsü, yeni bir şey değildir. Sadece, 'while' döngüsünün bir başka şeklidir:

main()  /* Bir for döngüsü */
{
int index;
for(index=0;index<6;index = index + 1)
printf("index'in Değeri simdi %d oldu.\n",index);
}

'For' döngüsü, üç parçadan oluşmuştur. Her kesim birbirinden ; ile ayrılır. İlk kesimi, başlangıç kesimi (initialization) dir. Burada bulunan işlemler, döngü baslamadan önce, ve bir kere yapılır. Aslında buraya yazılacak şeyler için bir sınır yoktur, fakat basit tutmakta fayda vardır. Bu kesime birden fazla islem yazılabilir, bunları da birbirinden ',' virgül ile ayırmak gerekir.

İkinci kesimde, "index<6" diyen parçada, bu döngünün her turunda kontrol edilmesi gereken deyim yer alır. Bu deyim doğru olduğu surece, döngü devam eder. Doğru yada yanlış sonuç veren herhangi bir deyim, bu kesimde yer alabilir.

Üçüncü kesimde yer alan işlemler ise, yine döngünün her turunda yapılır, fakat işleme başlaması, döngünün içinde yer alan komutların işlenmesinden sonra yapılır.

Yani genel formatı:     
   for (döngüye başlamadan önce bir kere yapılacak işler ;  doğru olup olmadığı kontrol edilecek şey ;  döngünün her dönüşünde yapılacak işler)

'for' komutundan sonra, ya tek bir komut gelir, yada küme işaretleri içinde, bir komut bloku. Tek komut koyarsanız, sadece o komut tekrarlanır.  {} işaretleri arasına komut bloku koyarsanız, for döngüsü sürdüğü sürece hepsi tekrarlanır.

C de hemen her yerde, tek bir komut yerine, { ve } kullanarak bir komut bloku koymanız mümkündür.


main()
{
    int g;
    for (g=10; g>0 ; g=g-1) 
       printf("G gittikçe azalıyor. Şimdi: %d oldu! \n",g);
}
Bu örnekte "g" değişkeni önce 10 değerine atanıyor, sonra değeri birer birer azaltılıyor. Değeri sıfıra ulaşınca döngüden çıkılıyor.


main()
{
    int say;
    for (say=100; say<200 ; say = say + 10) 
       printf("Say 10'ar 10'ar artıyor! Şimdi değeri %d oldu \n",say);
}
Bu örnekte "say" değişkeni 10'ar 10'ar artacaktır.


BREAK ve CONTINUE

main()
{
int xx;

printf("* * * Birinci döngü... * * * \n");
for (xx=5;xx<15; xx=xx+1)
{
if (xx==8)
break;
printf("Break dongusunun icinde, xx in Değeri simdi %d\n",xx);
}
printf("* * * İkinci döngü... * * * \n");
for (xx=5;xx<15;xx=xx+1)
{
if (xx==8)
continue;
printf("Continue dongusunun icinde, xx in Değeri simdi %d\n",xx);
}
}

Bu programda gördüğünüz gibi, şayet xx in değeri 8 e eşit ise, break isimli komutu çağıran bir if komutu görüyorsunuz. Break komutu, bizi döngüden çıkarıp, programı döngünün hemen altındaki satırdan devam etmesini sağlar.

Bu komut, örneğin döngünün içinde hesaplanan bir değere göre, döngüden çıkmak istediğinizde çok ise yarar. Örnekte, xx in değeri sekize ulaşınca, program döngüden çıkar, ve ekrana yazılmış en son değer, yedi olur.

Programın ikinci parçasındaki döngüde ise, Continue komutunu görüyoruz.
Burada ise, değer 8 e ulaşınca, program döngüden çıkmaz, fakat program döngünün en son satırına atlayıp, aradaki printf satirini işlemez.

IF KOMUTU

If komutu bilgisayarın en önemli yeteneklerinden birini kullanmasını sağlar: Karar verme yeteneği!

main()
{
    int g = 10;

    if (g > 10) 
       printf("g'nin değeri 10 dan fazla..\n",);
    if (g < 10) 
       printf("g'nin değeri 10 dan az..\n",);
    if (g == 10) 
       printf("g'nin değeri tam 10..\n",);
}
Bu programı çalıştırınca 3 tane "if" satırından sadece birine ait olan "printf" çalışacaktır. Şu hali ile kullanırsanız, sadece en sondaki printf çalışacak, diger ikisi çalıştırılmayacaktır. Yani ekrana sadece "g'nin değeri tam 10" yazacaktır.
Bu örneği derleyip çalıştırın, sonra "int g = 10" satırındaki 10 rakamını farklı rakamlarla değiştirip hangi printf'in çalıştığına bakın..

IF-ELSE:

main()
{
    int hmm = 10;

    if (hmm > 10) 
       printf("hmm'in değeri 10 dan fazla..\n",);
    else  
       printf("hmm'in değeri 10 dan az veya tam 10!.\n",);
}
Burada, else komutunu goruyoruz -- yani if şartı doğru değilse, else te yer alan şeyler yapılır..
Bu programda "hmm" değişkeni tam 10 olduğundan, if şartı doğru olmayacak ve ikinci kısımda yer alan "hmm ın değeri 10 dan az veya tam 10" yazısı çıkacaktır.
/* Bu, if-else komutunun bir örneğidir */
main()
{
int data;
for (data=0; data<10; data = data + 1)
{
if (data==2) // dikkat: 2 tane eşit işareti var!
printf("Data simdi ikiye esit.\n");

if (data<5)
printf("Data simdi %d. Bu da, 5 den azdir. \n",data);
else
printf("Data simdi %d. Bu da, 4 den buyuktur.\n",data);
}
}

Bu programda, ilk önce, icinde iki tane if komutu olan bir for döngüsü görünüyor. Bu döngünün on kere tekrarlanacağını sanırım sezdiniz?

İlk if satırına bakin: "if" kelimesi ile başlıyor, ve sonra bir parantez içinde, şartı görülüyor. Şayet bu parantezin içindeki işlemin sonucu doğru (evet) ise, if'den hemen sonra gelen satir islenir. Şayet cevap yanlış ise, if'den sonra gelen komut, atlanır. Burada da, tek bir komut, küme işaretleri ile, bir komut bloku haline getirilebilir.

Burada data==2 işlemi, data değişkeninin değerinin ikiye eşit olup olmadığını kontrol eder. (Dikkat!  data = 2 yazarsanız, tümüyle ayrı bir şey gerçekleşir! Data'ya atama yaparsınız; değeri değişir.)

İkinci "if", yine birincisine benziyor. Fakat, ek olarak "else" isimli bir kesimi de içeriyor. Bu da, şayet parantezlerin içindeki islem doğru (EVET) sonuç verirse, "if" den sonra gelen satır işlenecektir, şayet yanlış (HAYIR) sonucu verirse, "else" den sonra gelen komut işlenecektir. Bu nedenle, iki satırdan biri mutlaka işlenecektir.

Karşılaştırmalar:

C de kullanılan temel karşılaştırma işaretleri, ve birer örnek şunlardır:
>     daha büyük            5 > 4  DOĞRU
< daha küçük 4 < 5 DOĞRU
>= büyük ya da eşit 4 >= 4 DOĞRU
<= küçük ya da eşit 3 <= 4 DOĞRU
== eşit 5 == 5 DOĞRU
!= eşit değil 5 != 4 DOĞRU


if...else...if..else..vs!

Bazı durumlarda birçok şeyi karşılaştırmak gerekebilir, ve bulunan değere göre sadece BİR tanesi yapılsın istersiniz..
Bunun için if else lerden sonra yeni bir if başlatmak mümkündür:

main () {
   int a = 100; 

if( a == 10 ) { printf("A nın değeri tam 10 \n" ); } else if( a == 20 ) { printf("A nın değeri tam 20\n" ); } else if( a == 30 ) { printf("A nın değeri tam 30\n" ); } else { /* if none of the conditions is true */ printf("A nın değeri 10,20 veya 30 değil :( \n" ); }

// alttaki satır HER durumda çalışacaktır: printf
("A nın değeri tam olarak: %d dır \n", a ); }


SWITCH

main()
{
int kamyon;
for (kamyon = 3; kamyon<13; kamyon = kamyon + 1)
{
switch (kamyon)
{
case 3: printf("Değeri simdi uc.\n");
break;
case 4: printf("Değeri simdi dort.\n");
break;
case 5:
case 6:
case 7:
case 8: printf("Değeri simdi 5 le 8 arasında.\n");
break;
case 11:printf("Değeri simdi onbir.\n");
break;
default:printf("tanımsız değerlerden biri.\n");
break;
} // switch komutu bitti
} // for dongusu bitti
} // aa, program bitti! :)

Şimdiye kadar gördüğümüz en buyuk komut olan "switch", aslında kullanımı kolaydır. İlk önce, "switch" kelimesi ile baslar. Bunun arkasından, parantez içinde bir deyim gelir. Bundan sonra, dilediğiniz kadar 'case' komutları, küme işaretleri arasında yer alır. Her Değeri sembolize eden 'case' satırları, değişkenin Değeri, iki nokta üst üste, ve bununla ilgili komutlardan oluşur.

Bizim örneğimizde, "kamyon" değişkeninin Değeri 3 olduğunda, printf satiri, 'Değeri simdi uc' satirinin ekrana yazılmasını, sağlar. Daha sonra yer alan 'break' komutu ise, switch in içinde yer alan diğer komutları islenmeden, switch den çıkılmasını sağlar.

Bir giriş noktası bulunduktan sonra, satırlar bir 'break' komutuna rastlayıncaya kadar, yada switch'in son küme işaretine varıncaya kadar komutlar sıradan islenir.

"Kamyon" un Değeri 5 e eşit ise, program, case 5,6,7 den geçerek 8'de bulunan printf ve break komutlarını isler. Break komutu da, programı son küme işaretine getirir. Şayet değişkenin bir Değerine karşılık gelen bir case yoksa, 'default:' isimli seçenek seçilir.

GOTO KOMUTU

main()
{
goto leave
printf("Bu satir hiç yazılmayacak.\n");
leave:
printf("Program bitti bile.. \n");
}

Goto komutunu kullanmak için, "goto" isminin yanına, atlamak istediğiniz yerin sembolik ismini yazmanız yeterlidir. "goto" ile bir döngünün icine atlamanıza izin yoktur, fakat bir döngünün dışına atlayabilirsiniz. Ayrıca bir fonksiyondan ötekine de "goto" ile geçemezsiniz.

Bazı kişiler, goto nun hiçbir yerde kullanılmaması gerektiğini belirtiyorlar. Şayet, goto kullanımı ile, diğer metotlara göre daha anlaşılır bir program oluşacaksa, goto yu kullanmaktan çekinmeyin.

SONUNDA - ISE YARAYAN BIR PROGRAM

main()  /* Santigrad'dan Fahrenheite */
{
int count; /* for degiskeni */
int fahr; /* fahrenheit Değerini tutar */
int cen; /* Santigrat Değerini tutar */
printf("Santigrad -> Fahrenheit karşılık tablosu\n\n");
for (count=-2;count<=12;count=count+1)
{
cen = 10 * count;
fahr = 32 + (cen * 9) / 5;
printf(" C = %4d F = %4d ",cen,fahr);
if (cen == 0)
printf(" Suyun donma noktasi");
if (cen == 100)
printf(" Suyun kaynama noktasi");
printf("\n");
}
}

Bu program, santigrat ve fahrenheit derecelerin tablosunu yaratmaktadır.
Birden fazla değişken kullanılan ilk programımızdır bu. değişken
tanımında, üç ayrı satir kullanılması sayesinde, değişkenlerin yanina ne
ise yaradıklarını da yazabiliriz.

printf satırlarında gördüğünüz %4d sözcüğü, normal %d gibidir, ama ekranda her bir rakama 4 hane yer ayarlamasını sağlar.
Bu sayede, kısa rakamların başına boşluklar konur ve oluşturulan tablo güzel görünür..

ÖDEV

  1. Birden yüze kadar olan sayıları ekrana döken bir program yazınız.
  2. Programı değiştirip, sayıları ikişer ikişer atlayarak ekrana dökmesini sağlayınız.
  3. 2. ödevdeki programı değiştirip, sadece 50 den büyük sayıları (ikişer ikişer) ekrana dökmesini sağlayınız.

Dördüncü Konuya Gider >