PROGRAM AKIŞ DENETİMİ Program akış denetimi konusu temel olarak 2 e ayrılır. Bunlar; 1)Koşul Deyimleri 2)Döngü Deyimleri KOŞUL DEYİMLERİ Koşul deyimleri temel olarak programı kontrol etmeye yararlar. Bunlara kontrol deyimleri de denir.iki tür koşul deyimi vardır.bunlar: IF DEYİMİ 1)if deyimi 2)switch-case deyimi IF deyimi C dilinde en önemli kontrol deyimidir. Genel kullanım biçimi şöyledir: if(ifade) Deyim1 ve deyim2 birer yalın deyim olabileceği gibi başka bir kontrol deyimi de olabilir. İf deyiminin çalışma mekanizmasını anlamak istersek şunları bilmeliyiz. derleyici önce if deyiminin içindeki ifadeyi hesaplar ve bunun sayısal değerini çıkarır. Sayısal değer 0 dan farklı bir değer çıkarsa mantıksal doğru olarak kabul edilir ve deyim1 icra edilir. Eğer sayısal değer 0 çıkarsa ki bu mantıksal yanlış demektir, derleyici deyim1 i atlar ve deyim2 e geçer. if(ifade) deyim3; Yukarıdaki örnek düzgün çalışmaz.çünkü bloklama yapmak gerekir diğer tüm deyimlerde olduğu gibi.
Bu örneğin doğrusu şöyle olmalıdır: if(ifade) deyim3; Eğer deyim3 ün yanında bir de deyim4 olsaydı deyim3 ü de bloklama yapmak gerekecekti if(ifade) Deyim4; Deyim5; Deyim6; Yukarıdaki örnekte eğer ifade doğru çıkarsa sırasıyla deyim1, deyim2, deyim 6 uygulanacak.eğer yanlış çıkarsa deyim4, deyim5 ve deyim6 icra edilecek. Son örneğin akış şemasını çizmek istersek: ifade Deyim4; Deyim5; Deyim6;
Bazen if tek başına kullanılır olmayabilir. if(ifade) Deyim3; Deyim4; Eğer ifade doğruysa deyim1 deyim2 deyim3 deyim4 yapılır eğer yanlışsa sadece deyim4 yürütülür. int a,b; printf("iki sayi giriniz"); scanf("%d%d",&a,&b); if(a<=5) printf("toplamlari=%d\n",a+b); printf("carpimlari%d\n", a*b); printf("farklari=%d\n",a-b); Bu örnekte a 5 e eşit veya küçük olduğu sürece derleyici hem toplamlarını hem çarpımlarını hemde farklarını hesaplayıp ekrana yazdırır, sayı 5 ten büyükse sadece farklarını ekrana yazdıracaktır. İç içe if de sık karşımıza çıkan bir uygulamadır. if(ifade1) if(ifade2) deyim3; Bu örnekte ifade 1 doğruysa derleyici ikinci if e geçer eğer ifade2 de doğruysa deyim1 ve deyim3 ü yürütür; eğer ifade2 yanlış çıkarsa deyim2 ve deyim3 yürütülür.en başta ifade1 yanlış çıksaydı derleyici deyim3 e atlayacaktı.eğer deyimini ifade1 in olduğu if e bağlamak isteseydik, kullanıp bloklama yapmamız gerekecekti.
if(ifade1) if(ifade2) deyim3; Bu örnekte birinci if e aittir. SWITCH CASE DEYİMİ if deyimi mantıksal doğru ve mantıksal yanlış olarak iki seçeneğe sahipken switch-case deyimi bize bir ifadenin çeşitli değerleri için farklı işlemler yapmayı sağlamaktadır. Genel kullanım biçimi şöyledir: switch(ifade) case<seçenek1>: case<seçenek2>: case<seçenek3>: deyim3; case<seçenek4>: deyim4;. default: deyim; Ana çalışma mantığı şöyledir: Derleyici switch in içindeki ifadenin değerini hesaplar, son case leri sıra sıra gezer, bu değer eşit bir case değeri bulursa o case in deyimini yürütür, eğer bulamazsa default un deyimini uygular. int a; printf("1 sayi gir"); scanf("%d",&a); switch(a) case 1: printf("bir"); case 2: printf("iki"); default: printf("olmadi"); Eğer a yerine 1 girersek ekrana bir iki olmadi yazılacak.2 girseydik ekrana iki ve olmadi başka bir değerde ise sadece olmadi yazacaktı.
Switch-case de break komutuda sık sık karşımıza çıkar.break döngüden çıkmayı sağlayan komuttur.yukarıdaki örneği break ile yazarsak: int a; printf("1 sayi gir"); scanf("%d",&a); switch(a) case 1: printf("bir");break; case 2: printf("iki");break; default: printf("olmadi");break; Bu sefer a yerine 1 yazarsak ekrana sadece 1 yazılacak. Çünkü derleyici break komutunu görünce o döngüyü sonlandırır. /*switch-case kullanarak hesap makinesi*/ int a,b,c; char islem; printf("islemi sonra sayilari giriniz"); scanf("%c%d%d",&islem,&a,&b); switch(islem) case '+': c=a+b;break; case '-': c=a-b;break; case '*': c=a*b;break; case '/': c=a/b;break; default : printf("düzgün islem giriniz."); printf("%d", c); while(1);
GENEL OLARAK DÖNGÜLER VE DÖNGÜ DEYİMLERİ Döngüler, temel olarak programın belli bir bölümünün tekrarlı olarak uygulanmasını sağlarlar. C de döngüler yalın ve esnek olarak tasarlanmıştır. Programın çalışma zamanının çoğunu döngü yapılarına harcadığını düşünürsek, C için döngülerin önemi bir kez daha ortaya çıkmış olur. Döngüleri koşul verip döngüyü koşul doğru olduğu sürece devam ettirmek, tekrarlama yapmak ve bunların türevleri pek çok işte kullanabiliriz. Bu nedenle bize büyük kolaylık sağlarlar. Döngüler temel olarak 2 bölüme ayrılır. 1-While döngüleri 2-For döngüleri While döngüleri, bir koşula bağlı olarak çalışırlar, for döngüleri ise belli bir sayıda yineleme yapmak amacıyla kullanılırlar. Şimdi bu döngülerden daha detaylı bahsedelim. While Döngüleri While döngüleri de koşul kontrolünün başta ve sonda yapıldığı döngüler olarak 2 başlığa ayrılır. Kontrolün başta yapıldığı döngülerde anahtar sözcük olarak while kullanılırken, kontolün sonda yapıldığı döngülerde do-while deyimi kullanılır. Kontrolün Başta Yapıldığı while Döngüleri Bu tip while döngülerde anahtar deyim olarak while deyimini kullanırız. While deyiminin belirttiği koşul geçerli olduğu sürece döngü devam eder, koşul geçerliliğini kaybedince, derleyici döngüden çıkar.yani while kullanılarak belirtilen ifade 0 farklıysa ifade doğru sayılır ve işlemler yürür, eğer bilgisayar 0 olarak okursa ifade yanlış değeri kazanır bu derleyicinin döngüden çıkmasına neden olur. Basit akış şeması: while(ifade) /*ifadeden sonra ; konulmadığına dikkat ediniz.*/ deyim; While bir anahtar sözcüktür ve C anahtar sözcüklerden sonra parantezlerin içinde bir ifade ister. while(ifade) Burada sadece deyim1 while döngüsünün içindedir, deyim2 döngünün dışıdadır. while(ifade) Deyim(3);
Burada deyim1 ve deyim2 döngüye dahilken deyim3 döngü dışındadır, yani örneklerden de anlaşılacağı gibi döngü içinde 1 den fazla deyim varsa deyimleri döngü içine sokmak için, parantezlerini kullanmak gerekir. while(ifade1) if(ifade2) Deyim4; Deyim3; Burada if döngü içindedir yani deyim1 ve deyim2 döngü içindedir, deyim3 döngüye dahil değildir. İfade1 İfade2 Deyim1 Deyim2 Deyim3 Deyim4 Son örneğin akış diyagramı Kontrolün Sonda Yapıldığı while Döngüleri Bu tip döngülerde anahtar sözcük olarak do ve while deyimleri kullanılır.while ın içindeki koşul doğru olduğu sürece işlem devam eder ama sadece while ın kullanıldığı döngüden bir farkı vardır.o da koşul bir kereliğine yanlış olunca da işlemin yürümesidir.çünkü derleyici ilk olarak işlemi yapar daha sonra koşulu sağlayıp sağlamadığına bakar.böyle olunca da deyimler en az bir kere işlem görmüş olur.do döngü başında, while döngü sonunda kullanılır.tek deyim için, kullanmaya gerek yokken birden çok deyim için bloklamaya gerek vardır.önemli bir farkı da while dan sonra ; kullanılmasıdır.basit olarak akış şeması şöyledir:
do deyim; while(ifade); do while(ifade); deyim3; Burada deyim2 ve deyim3 döngü dışındadır yalnızca deyim1 döngüye dahildir. do while(ifade); deyim3; Burada deyim1 ve deyim2 döngüye dahilken deyim3 döngü dışıdır. For Döngüleri For döngüleri deyimleri yinelemeye yarar. Diğer anahtar sözcükler while, if gibi yanında parantezler içinde ifadeler vardır.ifadelerden sonra parantez kapatılır, noktalı virgül koyulmaz.genel olarak şöyle kullanılır: for(ifade1;ifade2;ifade3) Eğer birden fazla deyim kullanılmak isteniyorsa bloklama yapılmalıdır. for(ifade1;ifade2;ifade3) İfade1: Derleyici ifade1 i döngüye girdiği zaman yalnızca bir kez yapar. Başlangıç adımıdır. Genellikle değişkenlere bir ilk değer atamak için kullanılır. İfade2: Aynı while deyiminde olduğu gibi bir koşul belirtir. Derleyici koşula uyulduğu sürece döngüyü devam ettirir. Bir başka deyişle, ifade2 nin sayısal değeri 0 dışı olduğu sürece döngü devam eder.eğer, ifade2 belirtilmez veya her zaman doğru seçilirse, döngü sonsuz olur. İfade3: Bu kısım döngü değişkenine işlem yapmak için kullanılır. Genellikle bir artırmak(++a) veya bir azaltmak (--a) için kullanılır.
Basit olarak for ifadelerini birleştirirsek: for(ilk değer; koşul; artırma/azaltma) gibi bir kısayol karşımıza çıkar. Örneğin: for(k=1;k<=5;++k) Ayrıca ifade1 yalnızca bir kez işlem gördüğü için for ifadelerinin içine yazılmayıp önceden de belirtilebilir. a=20; for(;a>15;--a) gibi. Daha başka kullanım şekilleri de vardır.örneğin parantezlerin için hem ifade1 hemde ifade3 olmayabilir. b=30 for(;b>25;) printf( %d\n,b) --b; Yukarıdaki örnekte olduğu gibi ifade1 ve ifade3 başka yerlerde kullanılabilir.buradan çıkarılacak bir sonuç da 1. ve 3. ifadeleri olmayan for döngüleri while döngüleriyle eşdeğerdir. for( ; ifade ; ) = while(ifade) For döngüsünün 3 kısmı bile boş olabilir.bu tip döngüler sonsuz döngü sağlama amacıyla kullanılır. for(;;) Şimdi de bir for örneği içinde for döngüsünün akış şemasını açıklayalım. int c; for (c=2;c<51;c=c+2) printf( %d\n,c);
Bu örneğin akış şeması: C=2 C<51 printf( %d\n, c); Çıkış c=c+2; For deyiminin akış şeması For döngüsünde ; ler arasını virgüllerle ayırabiliriz.örneğin; for(a=5,b=0,c=20;b<50;++b,a=a-3) Bu örnekte a=5, b=0, c=20 ifade1; b<50 ifade2; ++b,a=a-3 de ifade 3 yerine geçer. /*1 den 100 e kadar olan tamsayıların toplamı*/ int a,toplam; for(a=0,toplam=0;a<=100;toplam += a, ++a) ; /*for döngüsünün deyim kısmı boş olmasına rağmen program çalıştı.*/ printf( toplam = %d, toplam);
/*Girilen sayının faktöriyelini hesaplama programı*/ int a,fact; printf( bir sayi giriniz ); scanf( %d,&a); for(fact=1;a>0;--a) fact=fact*a; printf( bu sayinin faktoriyeli = %d, fact); 2 Anahtar Sözcük Break ve Continue Döngülerin işleyişinde 2 anahtar sözcük daha vardır.bunlar break ve continue komutlarıdır.bu komutlar while, for, switch döngülerinde kullanılır. BREAK KOMUTU Basitçe break deyiminin işlevi, derleyicinin döngüden çıkmasını sağlayıp döngü dışındaki ilk deyimle devam etmesini sağlamaktır.bu komut döngüde istemediğimiz bir değer olunca çıkmamıza yarar. int a; for(a=25;a>13;--a) if(a==17) break; printf( a nin simdiki degeri = %d\n, a); Bu örnekte derleyici for döngüsünün içinde sayıyı 25 ten başlayarak azaltıp 13 e kadar yazacakken, 17 e gelince break komutuyla karşılaştı ve döngüden çıktı.
CONTINUE KOMUTU Continue komutunun özelliği derleyicinin continue nun gösterdiği değeri atlayıp devam etmesini sağlamaktır. int a; a=17; while(0<a && a<=17) --a; if(a==8) continue; printf("simdiki deger = %d\n",a); Bu örnekte derleyici 17 den başlayıp 0 a doğru giderken 8 e gelince continue ile karşılaşınca 8 i ekrana yazdırmadı; ama 0 a kadar yazdırmaya devam etti. Burak Ataman atamanburak@msn.com İTÜ IEEE Bilişim Komitesi