Programın Akışının Denetimi Bir program komutların yazıldığı sırada akar. Ama çoğunlukla, bu akışı yönlendirmek gerekir. Bu iş için denetim yapılarını kullanırız. Bunlar iki gruba ayrılabilir: Yönlendiriciler ve Döngüler. Bilgisayarların karmaşık işleri yapmasını sağlayan bu yapılar 6 tanedir: 1. Blok 2. while döngüsü 3. do... while döngüsü 4. for döngüsü 5.if yönlendirmesi 6. switch yönlendirmesi Bu yapıların her birisi tek bir deyim olarak düşünülür, ama gerçekte herbiri birden çok deyim içeren birer yapıdır. BLOK Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir: deyimler blok u içindeki deyimler istenildiği sayıda java deyimlerinden oluşur. Hiç deyim içermeyen bloklara boş blok denir. İç-içe bloklarda olabilir. Deyimler, basit java deyimleri olabileceği gibi, yapısal deyimlerde olabilir. ÖRNEKLER: System.out.println( Lefkoşa başkenttir. ); //bu blok x ve y değşkenlerinin yerlerini değiştirir. int yedek; //geçiçi değişken yedek= x;// x değerini yedek adresine al x=y; // y değerini x adresine al BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 1
y=yedek; //yedek değerini y nin adresine al Blok içinde bildirimi yapılan bir değişken, o blok için bir yerel değişkendir. Yerel değişkene blok dışından erişilemez. Blokun işi bitince, yerel değişkene ayrılan adres yok olur. Bu nedenle, bir değişkenin erişilebilirlik bölgesi (scope) o değişkenin tanımladığı bloktur. WHILE DÖNGÜSÜ Bir yada bir grup deyimin, belli bir koşul sağlandığı sürece takrarlanması için kullanılan vir denetim yapısıdır. Söz dizimi: while (mantıksal_deyim) deyim deyim sayısı birden çoksa, onları bir blok içine alırız: while (mantıksal_deyim) deyimler mantıksal_deyim True (doğru) ise deyim ya da blok içindeki deyimler yürütülür. Sonra program akışı while in başına döner ve tekrar mantıksal_deyim i denetler. mantıksal_deyim doğru ise deyim ya da blok içindeki deyimler yeniden yürütülür. Bu döngü, mantıksal_deyim False (yanlış) değerini alana kadar yinelenir. Dolayısıyla, yinelenen deyim(ler) in, mantıksal_deyim in değerini sonlu sayıda yineleme sonunda değiştirmesi gerekir. Aksi halde, sonsuz döngü dediğimiz olgu ortaya çıkar: Söz konusu deyim(ler), kesintisiz (programın koşması durdurulmazsa sonsuza kadar) devam eder. Buna sonsuz döngü denir. Örnekler Aşağıdaki döngü 1, 2, 3, 4, 5 sayılarını yazar: int number; // Yazılacak sayıları tutacak değişken number = 1; // değişkene verilen ilk değer: 1. while ( number < 6 ) // mantıksal_deyim System.out.println(number); number = number + 1; // sonraki sayıyı al BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 2
System.out.println("Done!"); Aşağıdaki program 5! = 1*2*3*4*5*6 çarpansal (faktöryel) değerini bulur ve yazar: int n = 6, faktoryel = 1; while ( n >= 1) faktoryel *= n; n-- ; System.out.println ( 6! = + faktoryel); do..while.. döngüsü Bir mantıksal deyim sağlanana kadar belli deyim(ler)in tekrarlanmasını sağlayan denetim yapısıdır. Sözdizimi şöyledir: İşlenecek deyim tek ise sözdizimi şöyledir: do deyim while ( mantıksal_deyim ); İşlenecek deyim birden çok ise, o deyimler bir blok içine yazılır: Örnekler do deyimler while ( mantıksal_deyim ); /* Program: DoWhile01 */ public class DoWhile01 public static void main (String args[]) int m = 1; do System.out.println("m = m+1 yapıyor " + m); x++; while (m <= 10); /* Program: DoWhile02 */ public class DoWhile02 public static void main (String args[]) int n = 1, toplam = 0; do BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 3
toplam += n ; while (n <= 100); System.out.println("100 e kadar tamsayıların toplamı = " + toplam); İpucu Soru: while döngüsü ile do-while döngüsü arasındaki fark nedir? Yanıt: while döngüsü önce mantıksal deyimi denetler. Doğru ise döngü deyimlerini koşturur; değilse while den sonraki deyime geçer. Do-while döngüsünde ise, döngü deyim(ler)i enaz bir kez koşturulur, sonra mantıksal_deyim denetlenir. Yanlış ise deyim(ler) tekrar eder; doğru ise tekrarlama biter ve do-while in altındaki deyime geçer. For döngüsü İstenen deyim(ler)in kaç kez tekrarlanacağı biliniyorsa, for döngü yapısını kullanmak kolaydır. Tekrarlanacak deyim tek ise sözdizimi şöyledir: for ( sayacın_ilk_değeri; tekrarlama_koşulu; sayaç_değerinin_değişimi ) deyim Tekrarlanacak deyimler birden çoksa, onlar bir blok içine alınır, sözdizimi şöyle olur: for ( Örnekler: deyimler sayacın_ilk_değeri; tekrarlama_koşulu; sayaç_değerinin_değişimi ) /* Program: For01.java */ public class For01 public static void main(string args[]) int i; int sum = 0 ; for (i=1; i <=100; i++) sum = sum + i; System.out.println(sum); BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 4
// main sonu // class sonu sayac bir değişkendir. int vb sayılabilir bir veri tipinden olmalıdır. sayacın_ilk_değeri o değişkene başlangıç değerini atayan bir java deyimidir. Örneğin, yukarıdaki programda int i = 1 deyimi, i sayacına ilk değer olarak 1 sayısını atayan bir deyimdir. Sayacın tipine uyan her atama geçerlidir. tekrarlama_koşulu bir mantıksal_deyim olmalıdır. i <= 1 deyimi, i sayacı için döngü süresince sağlanması gereken mantıksal koşuldur. Bu koşul sağlanmaz olduğu anda döngü sona erecektir. i++ deyimi, döngünün her adımında i sayacının nasıl değişeceğini belirler. Sayacın ilk değerinden son değerine gidişini sağlayan herhangi bir java deyimi geçerlidir. for (sayacın_ilk_değeri; tekrarlama_koşulu; sayaç_değerinin_değişimi) ifadesinde, ( ) içindeki deyimlerden birisi, ikisi veya her üçü de boş olabilir. Boş ise, bu deyimin daima True değerine sahip olduğu varsayılır. Dolayısyla, bu durumda sonsuz döngüye girilir. Örneğin for (;;) deyimi sonsuz döngüdür. Bu döngü ancak break deyimi ile kesilebilir. Bu deyim while (true) deyimine denktir. BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 5
/* Program: For02.java */ public class For02 public static void main(string args[]) int sum = 0 ; for (int i=1; i <=100; i++) sum = sum + i; System.out.println(sum); // main sonu // class sonu İpucu: Soru: For01.java ile For02.java arasındaki fark nedir? Yanıt: For01.java programında i değişkeni main metodunun bir yerel değişkenidir. main içindeki her deyim onu görebilir ve kullanabilir. Gerçekten, for denetim yapısı, kendi dışında bildirimi yapılan i değişkenini tanımakta ve kullanabilmektedir. For02.java programında i değişkeni for denetim yapısının bir yerel değişkenidir. Yalnızca bu yapı içinde tanınır ve kullanılabilir. main veya class içindeki başka deyimler bunu göremez ve kullanamaz. Böyle olduğunu görmek için, örneğin, for döngüsünden sonra System.out.println(i); deyimini koyunuz. Programınızın derlenemediğini göreceksiniz. /* Program: For03.java Bu program derlenemez; çünkü i değişkeni for yapısının bir yerel değşkenidir, main metodu onu göremez BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 6
*/ public class For03 public static void main(string args[]) int sum = 0 ; for (int i=1; i <=100; i++) sum = sum + i; System.out.println(sum); System.out.println(i); // main sonu // class sonu Sayaç değişkenleri int tipinden seçilmek zorunda değildir. Sıralanmış her veri tipinden sayaç değişkeni seçilebilir. Char kümesi sıralanmış bir veri tipidir. Aşağıdaki program bu kümeden seçilen bir sayaç kullanmaktadır: /* Program For04.java */ // Bu döngü alfabenin büyük harflerini tek satıra yazar char ch; // sayaç değişkeni // one of the letters to be printed. for ( char ch = 'A'; ch <= 'Z'; ch++ ) System.out.print(ch); System.out.println(); Yönlendiriciler Program akışını, belli mantıksal koşullara göre istenen yöne saptıran denetim yapılarıdır. Bunlar da kendi içinde üçe ayrılır: if, if-else ve case yapıları. if yönlendirmesi Bazı deyimlerin işlemesini, ancak belirli bir koşulların sağlanması durumunda isteyebiliriz. Bu durumda if yönlendirmesini kullanırız. Bu yönlendirmenin sözdizimi şöyledir: BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 7
if ( mantıksal_deyim ) deyim-1 Eğer mantıksal_deyim true değerini alıyorsa deyim-1 işlenir ve program if denetiminden sonraki deyimi işlemeye başlar. Eğer mantıksal_deyim false değerini alıyorsa deyim(ler)-1 işlenmeden atlanır ve program if denetiminden sonraki deyimi işlemeye başlar. if-else yönlendirmesi Bazı durumlarda, belirli bir koşulun sağlanması durumunda ona bağlı bir deyimin, aksi halde başka bir deyimin işlemesi istenebilir. Başka bir deyişle, bir koşulun sağlanıp sağlanmamasına bağlı olarak, iki seçenekten birisini mutlaka yaptırmak gerekir. Bu durumda, if-else yapısını kullanırız. Bu yapının sözdizimi şöyledir: if ( mantıksal_deyim ) deyim-1 else deyim-2 Eğer işlenecek deyim birden çok ise, bunlar bir blok içine alınabilir: if ( mantıksal_deyim ) deyimler-1 else deyimler-2 Eğer mantıksal_deyim true değerini alıyorsa deyim(ler)-1 işlenir ve program if denetiminden sonraki deyimi işlemeye başlar. Eğer mantıksal_deyim false değerini alıyorsa deyim(ler)-1 işlenmeden atlanır ve deyim(ler)-2 işlenir. Sonra, program if denetiminden sonraki deyimi işlemeye başlar. Örnekler if ( ısı < 10) System.out.println("Hava soğuktur."); BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 8
else if (ısı < 20) System.out.println("Hava ılıktır."); else System.out.println("Hava sıcaktır."); /* Program IfElse01.java */ public class IfElse01 public static void main ( String[] args ) int n = 18 ; if ( n % 3 == 0 ) System.out.println (n + " sayısı 3 ile tam bölünür."); else System.out.println (n + " sayısı 3 ile tam bölünmez."); // main sonu // class sonu /* Program IfElse02.java */ public class IfElse02 public static void main(string[] args) int puan = 76; char karne; if (puan >= 90) karne = 'A'; else if (puan >= 80) karne = 'B'; else if (puan >= 70) karne = 'C'; BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 9
else if (puan >= 60) karne = 'D'; else karne = 'F'; System.out.println("Karne Notu = " + karne); switch-case denetim yapısı Program akışı birden çok koşula bağlı olarak farklı seçeneklerden birisine yönlendirilecekse, iç-içe ifelse denetimi yerine switch-case denetimi daha kolay olur. Bunun için, int ya da char tiplerinden bir seçici değişken ya da ifade (formül) kullanılır. Seçici değişkenin ya da ifadenin alacağı sabit değerlere göre program akışı istenen seçeneğe saptırılır. Sözdizimi şöyledir: switch ( seçici_değişken veya ifade ) case sabit-1: deyim-1 break; case sabit-2: deyim-2 break;.. // ( diğer haller). case sabit-n: deyim-n break; default: // isteğe bağlıdır BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 10
deyim-(n+1) // switch sonu Örnekler: /* Program SwitchCase01.java */ public class SwitchCase01 public static void main(string[] args) int ay = 8; switch (ay) case 1: System.out.println("Ocak"); break; case 2: System.out.println("Şubat"); break; case 3: System.out.println("Mart"); break; case 4: System.out.println("Nisan"); break; case 5: System.out.println("Mayıs"); break; case 6: System.out.println("Haziran"); break; case 7: System.out.println("Temmuz"); break; case 8: System.out.println("Ağustos"); break; case 9: System.out.println("Eylül"); break; case 10: System.out.println("Ekim"); break; case 11: System.out.println("Kasım"); break; case 12: System.out.println("Aralık"); break; /* SwitchCase03.java */ class SwitchCase03 public static void main ( String[] args ) char ch = 'k' ; switch (ch) case 'k': System.out.println("Küçük 'k' harfi girdiniz. "); BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 11
break; case 'K': System.out.println("Büyük 'K' harfi girdiniz. "); break; default : System.out.println("Büyük veya küçük 'K' harfi girmediniz. "); // switch sonu // main sonu // class sonu BÖLÜM2:Programın Akışının Denetimi-- Belma SIRDAŞ 12