İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
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.İki tür koşul deyimi vardır.Bunlar:
1)if deyimi
2)switch-case deyimi IF DEYİMİ
IF deyimi C dilinde en önemli kontrol deyimidir. Genel kullanım biçimi şöyledir:
if(ifade) {
deyim1;
} else {
deyim2;
}
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) deyim1;
deyim2;
else deyim3;
Yukarıdaki örnek düzgün çalışmaz.Çünkü bloklama yapmak gerekir diğer tüm deyimlerde olduğu gibi.
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
Bu örneğin doğrusu şöyle olmalıdır:
if(ifade) {
deyim1;
deyim2;
} else
deyim3;
Eğer deyim3 ün yanında bir de deyim4 olsaydı deyim3 ü de bloklama yapmak gerekecekti
if(ifade) {
Deyim1;
Deyim2;
} else {
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
Deyim1;
Deyim2;
Deyim4;
Deyim5;
Deyim6;
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
Bazen if tek başına kullanılır else olmayabilir.
Örnek:
if(ifade) {
Deyim1;
Deyim2;
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.
Örnek:
#include<stdio.h>
int main() {
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);
return 0;
}
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.
Örnek:
if(ifade1)
if(ifade2) deyim1;
else deyim2;
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 else deyimini ifade1 in olduğu if e bağlamak isteseydik {,} kullanıp bloklama yapmamız gerekecekti.
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
Örnek:
if(ifade1) {
if(ifade2) deyim1;
} else deyim2;
deyim3;
Bu örnekte else 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>: deyim1;
case<seçenek2>: deyim2;
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.
Örnek:
#include<stdio.h>
int main() {
int a;
printf("1 sayi gir");
scanf("%d",&a);
switch(a) {
case 1: printf("bir");
case 2: printf("iki");
default: printf("olmadi");
}
return 0;
}
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ı.
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
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:
#include<stdio.h>
int main() {
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;
}
return 0;
}
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.
#include<stdio.h>
/*switch-case kullanarak hesap makinesi*/
int main() {
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);
}
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
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) Deyim1;
Deyim2;
Burada sadece deyim1 while döngüsünün içindedir, deyim2 döngünün dışıdadır.
while(ifade) {
Deyim1;
Deyim2;
}
Deyim(3);
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
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) Deyim1;
Deyim4;
else
Deyim2;
Deyim3;
Burada if döngü içindedir yani deyim1 ve deyim2 döngü içindedir, deyim3 döngüye dahil değildir.
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:
İfade1
İfade2
Deyim1
Deyim2
Deyim3
Deyim4
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
do
deyim;
while(ifade);
do
deyim1;
deyim2;
while(ifade);
deyim3;
Burada deyim2 ve deyim3 döngü dışındadır yalnızca deyim1 döngüye dahildir.
do {
deyim1;
deyim2;
}
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.İfadelerden sonra parantez kapatılır, noktalı virgül koyulmaz.Genel olarak şöyle kullanılır:
for(ifade1;ifade2;ifade3) Deyim1;
Eğer birden fazla deyim kullanılmak isteniyorsa bloklama yapılmalıdır.
for(ifade1;ifade2;ifade3) {
Deyim1;
Deyim2;
}
İ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.
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
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.
#include<stdio.h>
int main() {
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.
Örnek:
#include<stdio.h>
int main() {
int c;
for (c=2;c<51;c=c+2) printf(“%d\n”,c);
return 0;
}
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
Bu örneğin akış şeması:
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.
Örnek:
/*1’den 100’e kadar olan tamsayıların toplamı*/
#include<stdio.h>
int main() {
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);
return 0;
}
C=2
C<51
printf(“%d\n”, c);
c=c+2;
Çıkış
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
Örnek:
/*Girilen sayının faktöriyelini hesaplama programı*/
#include<stdio.h>
int main() {
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);
return 0;
}
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.
Örnek:
#include<stdio.h>
int main() {
int a;
for(a=25;a>13;--a) {
if(a==17) break;
printf(“a nin simdiki degeri = %d\n”, a);
}
return 0;
}
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ı.
İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu
Adres: İTÜ Ayazağa Yerleşkesi - Elektrik/Elektronik Fakültesi Telefon :+90 (212) 285 36 80 - E-posta: ieeesb@itu.edu.tr
www.ieee.itu.edu.tr
CONTINUE KOMUTU
Continue komutunun özelliği derleyicinin continue’nun gösterdiği değeri atlayıp devam etmesini sağlamaktır.
Örnek:
#include<stdio.h>
int main() {
int a;
a=17;
while(0<a && a<=17) {
--a;
if(a==8) continue;
printf("simdiki deger = %d\n",a);
}
return 0;
}
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