do while etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
do while etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

30 Ağustos 2012 Perşembe

Döngüler

Döngüler iki türlüdür: while ve for döngüleri. Bunların da farklı şekillerde kullanımı vardır. While'ı inceleyerek başlayalım.

While

Bir ifade doğru olduğu sürece döngü çalışmaya devam eder. Kod bloğunun sonuna kadar gider ve ardından tekrar kontrol eder. Eğer doğru ise devam eder, değil ise döngü dışına çıkar. Şu şekilde kullanılır;


1
2
3
while(kosul){
     yapilacaklar
}

Aynen if deyiminde olduğu gibi, burada da koşul true veya false değeri döndüren bir ifade olmalıdır. Yukarıdaki yapıda, önce koşul kontrol edilir, ardından eğer koşul doğru ise yapılacaklar kısmı çalıştırılır. Yani, bu döngüdeki kodlarımızın hiç çalışmama ihtimali vardır.

Eğer kodlarımızın en az bir defa çalışmasını istiyorsak, bir do-while döngüsü yaratmamız gerekir. Bu şekilde, koşulun durumu ne olursa olsun, kod en az bir defa çalışır.


1
2
3
4
5
do
{
 yapılacaklar
}
while(kosul);

Gördüğünüz gibi, do'dan sonra noktalı virgül filan yok. While'dan sonra normalde yok iken, bu durumda var. Zaten yukarıdaki yapıyı şu şekilde de yazabilirdik, çünkü Java'da boşlukların önemi yok:


1
2
3
do{
 yapılacaklar
}while(kosul);

Bu döngüden de istediğimiz zaman çıkabilmek için break ifadesini kullanabiliriz. Kullanımı yaratıcılığımıza bağlı ama şu şekilde yapabiliriz:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int a = 0;
while(true){
 System.out.println("Döngüdeyiz: "+a);
 a++;
 if(a>5){
  break;
 }
 
}
System.out.println("Döngüde değiliz.");

Tabi ki buradaki örneği break kullanmak için yaptık. Aslında aynı şeyi yapan daha kısa bir kod yazabilirdik.


1
2
3
4
5
6
int a = 0;
while(a<=5){
 System.out.println("Döngüdeyiz: "+a);
 a++;
}
System.out.println("Döngüde değiliz.");

a<=5 dedik çünkü yukarıdaki kod, a 5 olana kadar çalışıyor. Aynı şeyi bu şekilde de elde edebiliyoruz.

For

For döngüsü genelde bir dizinin elemanlarını sıralarken vs. kullanılır. Ama bu tek kullanım alanı değildir tabi ki. Kısaca kullanımı şu şekildedir;


1
2
3
for(int i = 0;i<10;i++){
   System.out.println(i);
}

for ve yanındaki parantezi açıklayacak olursak;
int i = 0 dediğimiz yerde, döngüyü sürdürmek için gerekli değişkeni tanımlıyoruz. Burada tanımladığımız değişkenin etki alanı sadece döngü içidir. Yani, döngünün dışında bir i değişkenimiz yok.
i<10 verdiğimiz yerde de, döngünün bitmesi için bir koşul belirtiyoruz. Döngüyü kontrol için i değişkeni tanımladığımız için, i ile ilgili bir şey olması gerekiyor.
i++ ise i değişkenini her döngü sonunda bir sayı arttırmayı sağlar. Eğer bu şekilde bir şey yazmazsak, döngüden çıkamayız (Tabi ki döngünün içindeki yerde i'yi arttırmadığımızı varsayıyoruz).

Tabi ki yukarıdaki sadece bir örnektir. Mesela i'yi 100 olarak tanımlayıp i>0 deyip, i-- da diyebilirdik. Aynı şekilde, şunu da yapabilirdik;


1
2
3
for(int i = 0; i<10;i+=2){
 System.out.println(i);
}

Burada da i'yi ikişer arttırıyoruz.

For döngüsünün özel bir tipi vardır. Kimi yerlerde buna for-each döngüsü de denir.  Bu döngünün tek amacı, dizilerin değerlerini sıralamaktır. Öyle ya da böyle, ne kadar ertelersek erteleyelim, dizilerle ilgilenmemiz gerekeceği için, işimizi kolaylaştıracak şu yapıyı bilmekte yarar var;


1
2
3
4
int[] dizi = {1,6,7,9,5,3,8,0,3465,2};
for(int i:dizi){
 System.out.println(i);
}

İlk satırda bir dizi tanımladık. Dizi tanımlarken [ ve ] kullanılır. Farklı şekillerde dizi tanımlanabilir. Şu anda konumuz değil :)
İkinci satırda, gördüğünüz üzere daha kısa şeyler yazarak bir üst örnekle de kurabileceğimiz döngüyü kurduk.
Burada sürekli i kullanmam o harfin zorunlu olduğu manasına gelmesin tabi ki. Yani aslında ikinci satır şudur;


1
2
for(degiskenTip degeri:diziAdi){
}

For ve while ile şöyle bir güzellik yapabiliyoruz kendimize; Konsol programlarımızın sürekli çalışmasını sağlayabiliyoruz. Yazdığımız (veya yazmaya çalıştığımız) tüm programlar, sadece bir defa istediğimiz işlemi yapıp kapanıyordu. Ama istediğimiz şey bunun biraz daha ötesiydi, biz kapatana kadar çalışsın.

Bunun için sonsuz bir döngü yaratmak gerekir. Bu da gayet kolaydır. Programınızı yazın ve hatasız çalıştığından emin olun. Daha sonra da kodlarınızı sonsuz bir döngünün (yani aşağıdaki örneklerden birinin) içine yazın.


for(;;){
 kodlarınız  
}

veya

while(true){
 kodlarınız 
}

Şu anda sürekli devam eden bir programımız var. Peki, eğer köşedeki çarpıya basmadan programın biz istediğimizde kapanmasını istersek ne olacak?

Böyle bir durumda, sınırsız döngünün içinde bir yerde (bu kodlarınızın arasında da olabilir) kullanıcıdan bir girdi alırsınız ve girdiye göre çıkış işlemini başlatırsınız.

Mesela kullanıcı K yazıp ENTER tuşuna basınca program döngüyü terk etsin ve çıkış işlemini yapsın:


String kullaniciGirdisi="";
if(kullaniciGirdisi.equals("K")){
 System.exit(0);
}

Burada kullanıcıdan nasıl girdi edeceğimiz yazmıyor. Sadece kullaniciGirdisi değişkenine, kullanıcı girdisinin atandığını varsayıyoruz.
if içindeki kodlar, değişkenimizi K harfi ile karşılaştırıyor. Karşılaştırmak için normalde == kullanırdık ama Stringler için stringDegisken.equals("string" veya stringNesne) kullanırız.

System.exit(0) ifadesi, sondaki 0 dışında kendini açıklıyor zaten. Sıfır ise, çıkış kodudur. İstediğimiz değeri oraya koyabiliriz ve sıfır dışındaki her biri, bir hatadan dolayı çıkışı simgeler. Ama şu anda, kullanıcı istediği için (hata olmadan) bir çıkış gerçekleştirmeye çalıştığımız için, 0 kullanıyoruz.

Her zamanki gibi, sorular veya yorumlar için açığım :)
Devamını oku...

28 Ağustos 2012 Salı

Koşul İfadeleri

Merhaba.

Bu yazıda, programcılığın en temel konularından birini inceleyeceğiz. İşe yarar programlar yaratabilmemiz için gerekli en temel şey, programın akışını kontrol edebilmektir. Çünkü bir kullanıcının programımızla ne yapacağını bilemeyiz asla. Örneğin, basit bir hesap makinesinde bile, bölme işleminde mesela, kullanıcının sıfır girmeyeceğini bilemeyeceğimiz için, önlem almak zorundayız. Önlem almanın bir yolu, koşul ifadesi kullanmaktır. Yani, şöyle deriz: "Eğer bölen sayı sıfır değilse, devam et ve bölme işlemini yap. Aksi halde kullanıcıyı uyar ve tekrar değer girmesini iste." Yada kullanıcıya seçim yapma hakkı da verebiliriz. Yazdığı kelimeye göre işlem yapan bir programı da seçim ifadelerini kullanarak yapabiliriz.

Koşul ifadeleri, if ve switch'tir. Her ikisinin de farklı durumlarda birbirinden üstün olduğu yerler vardır, ama birbirlerinin yerine de kullanılabilirler.

If ve If-Else

If ifadesi İngilizce'de "eğer" manasına gelir. "Eğer sayı 3'ten büyükse sayıyı 5'e böl" ifadesinin 'Javaca'sı ise şudur;


if(sayi>3)
sayi/5;

Dikkatinizi çekmiş olmalı, if ifadesinin bitiminde diğer ifadelerde yaptığımız gibi noktalı virgül koymuyoruz.
Her ne kadar yukarıdaki kullanım yanlış değilse de, karmaşayı engellemek için if'ten sonraki kısmı süslü parantezlere almak daha uygun ve sorunsuz bir yöntem olacaktır.



if(sayi>3){
sayi/5;
}

Yukarıdaki kodda, program koşul doğru ise süslü parantezler içindeki ifadeyi çalıştıracak, değilse çalıştırmadan devam edecektir. Bu haliyle biraz eksiktir, çünkü koşul yanlışsa bunu kullanıcıya bildirmek isteyebilir veya tamamen farklı bir kod çalıştırmak isteyebiliriz. Bunun için de, else ifadesini kullanmamız gerekir:

int sayi = 1;
if(sayi>3){
System.out.println("Sayı büyük.");
}else{
System.out.println("Sayı küçük");
}

if kod bloklarını iç içe kullanarak daha karmaşık koşulları devreye sokabiliriz. Burada dikkat edilmesi gereken çok önemli bir durum vardır. Hangi if'in hangi else'e ait olduğunu bilmek. Süslü parantezleri kullanmanın avantajını burada da görürüz. Özellikle de if'lerden bir veya birden fazlası bir else ifadesi içermiyorsa.
if-else-if-else şeklinde devam eden kodlar da yazmak mümkündür. Bu durumda program doğru koşulu bulduğu yere kadar ilerler ve sadece doğru olan kodu çalıştırır (Beklendiği gibi). Her ne kadar böyle bir merdiven oluşturmak yanlış değilse de, switch ifadesi varken bunu yapmak işleri karmaşıklaştırmaktan başka bir şey değildir.

Switch

Çok yollu dallanma ifadesidir. Bir ifadenin değerine göre programı dallandırır. Bunu if-else-if merdivenine alternatif olarak düşünebiliriz. Hatta bana kalırsa daha mantıklı bir yol. Basit bir örnek verelim:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
int i = 3;
switch(i){
case 0:
 System.out.println("Sayı 0");
 break;
case 1:
 System.out.println("Sayı 1");
 break;
case 2:
 System.out.println("Sayı 2");
 break;
case 3:
 System.out.println("Sayı 3");
 break;
default:
 System.out.println("Sayı 3'ten büyük.);
}

i değişkeninin değerini değiştirerek sonuçları görebilirsiniz.
Bana göre burada dikkat çekebilecek noktalar;

  1. case 0 ifadelerinden sonra noktalı virgül değil, iki nokta (:) kullanılmış.
  2. switch ifadesinden sonra parantez içinde değerlendirmek istediğimiz değişken (veya duruma göre ifade) yazılmış.
  3. Her case ifadesi break; ile bitiyor.
  4. default: isimli bir satırımız var.
  5. default ifadesinde break; yok.
Kodu çalıştırın. Burada uzun uzun anlatacağım birçok şeyi aslında kodda değişiklikler yaparak görebiliriz. Mesela, break; ifadesini yazmak zorunlu mu? Kodu case ifadesinin alt satırına değil de karşısına yazmak bir şey değiştirir mi? default ifadesinin bitişinde break; yazmak ne değiştirir? 

Bunlardan birkaçını yanıtlayayım. 
Öncelikle, break; ifadesi zorunlu değildir. Ama break ifadesini eklemezsek diğer case'ler de değerlendirilecektir. Yukarıdaki örnekte i'i 1 yapıp case 1'deki break ifadesini kaldırırsak, diğerleri doğru olmadığı için, case 1'i ve default'u çalıştıracaktır.

default ifadesinin ne işe yaradığını i değişkenini 4 yaparak görebiliriz. Bu ifade, aslında her koşulda çalışacak bir ifadedir. Bunu, break ifadesini kaldırdığımızda gördük zaten. Yani break; ifadesini kullanmazsak, default da çalıştırılacaktır. Böyle bir durum gerektirecek program yazdığınızda, default ifadesini boş bırakabilirsiniz veya hiç yazmayabilirsiniz de.

Switch ifadelerinde dikkat edilecek diğer bir konu, case'lerin aynı değeri alamayacak olmasıdır. Yani iki tane case 0 olamaz. 

Switch ifadelerinde switch'in yanındaki parantezlere verdiğimiz değişken, byte, short, int veya char tipinde olmalıdır. Ama eğer JDK 7 ve sonraki sürümleri kullanıyorsanız, String tipini de kullanabilirsiniz.
String tipini kullanırken dikkat edilecek şey ise, case'den sonraki ifadeleri çift tırnak içinde yazmak gerektiğidir. Yukarıdaki örneği String tipi ile yapalım:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
String i = "üç";
switch(i){
case "sıfır":
 System.out.println("Sayı 0");
 break;
case "bir":
 System.out.println("Sayı 1");
 break;
case "iki":
 System.out.println("Sayı 2");
 break;
case "üç":
 System.out.println("Sayı 3");
 break;
default:
 System.out.println("Sayı üçten büyük.");
}

Şimdi operatörleri ve koşul ifadelerini öğrendiğimize göre kendimize bir problem bulup onu çözecek bir program yazabiliriz.

Problem - 1:
Bir n sayımız olsun (int tipinde). Bunun 34 ile olan mutlak farkını bulalım. Eğer n, 34'ten büyük ise, mutlak değeri iki ile çarpalım.

Problem - 2:
Gün içerisinde uyuyoruz, çalışıyoruz ve dinleniyoruz. Saat 0-8 arası uyuyalım, 8-19 arası çalışalım ve geri kalan vakitlerde de dinlenelim. Bir de çocuğumuz olsun. Eğer o ağlıyorsa, uyumamız veya dinlenmemiz mümkün olmasıın. Tabi ki burada saat integer (int) tipinde bir değişken ve 0-23 arası değer alıyor. Çocuk ise, boolean tipinde bir değişken oluyor. Çalışma, uyuma ve dinlenmeyi veya bunlardan birini yapamamayı (Uyuyamıyoruz) da ekrana yazdırıyoruz :)

Problemlerin çözümü, while ve for döngülerinin anlatılacağı yazıdan sonra :)
Devamını oku...