C Dili - 3. Konu
'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ırma
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, "dogru" , 6 veya daha büyükse "yanlış" olarak algılanacaktır. Peki C dili için "dogru" 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;
}
}
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 islenir. 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()
{
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 ; sıfır 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, bir komut bloku koymanız mümkündür.
IF KOMUTU
/* Bu, if-else komutunun bir örneğidir */
main()
{
int data;
for (data=0; data<10; data = data + 1)
{
if (data==2)
printf("Data simdi %d ye esit.\n",data);
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ğı,
açık bir şekilde görülüyor.
İ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!)
IF-ELSE
İ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 satir islenecektir, şayet yanlış (HAYIR) sonucu verirse, "else" den sonra gelen komut islenecektir. Bu nedenle, iki satırdan biri mutlaka islenecektir.
Karşılaştırmalar:> 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
BREAK ve CONTINUE
main()
{
int xx;
for (xx=5;xx<15; xx=xx+1)
{
if (xx==8)
break;
printf("Break dongusunun icinde, xx in Değeri simdi %d\n",xx);
}
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 islemez.
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;
}
}
}
Ş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:
}
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.
ÖDEV