Döngüler – I

Programlama dillerinde en sık kullanılan yapılardan birisi de döngülerdir. Döngüler belirli bir mantığı, belirli bir şart altında, belirli bir sayıda tekrar etmek için kullanılmaktadır. Durum olarak örnek vermek gerekirse aşağıdaki maddeleri düşünebiliriz

  • 1’den 100’e kadar olan sayıları ekrana yazdırmak
  • Bir e-posta listesindeki herkese gönderim yapmak
  • Bir hesapta oluşmakta olan tüm artı ve eksi hareketleri toplayıp sonucu yazdırmak
  • Bir kitaplıktaki tüm kitapların yazarlarının arasından ismi A ile başlayanları ekranda listelemek
  • Rehberdeki herkese bayram mesajı atmak
  • Turnikeden her geçen kişi için kimlik doğrulaması yapmak

Bütün bu durumlar bir şartta sonlanan, belirli sayıda tekrar eden ve bu tekrarlar içerisinde belirli bir fonksiyonu yerine getiren senaryoları göstermektedir. Bu tarz durumları javada döngüler sayesinde yönetebilmekteyiz.

Javada farklı döngü tipleriyle bu iterasyon ihtiyaçları giderilebilmektedir. Sırasıyla bu döngü tiplerini incelemeye geçelim.

For döngüsü

For döngüsü javada yazılmış programın bir parçasını, duruma göre bir veya birden çok defa koşturmak için kullanılan bir döngüdür. İterasyon sayısı belirli olduğunda kullanıma uygundur. Yani tekrar etmesini istediğimiz durumun sayısal anlamda belirli bir limiti varsa bu döngüye başvururuz.

Bu döngünün sözdizimine bir göz atalım.

for(başlangıç;bitiş;iterasyon) {  
   //Çalışacak kod bloğu
}

Bu bloğu farazi bir örnek ile açıklayalım. Diyelim ki bir sınavda soruları dağıtmakla görevlisiniz. Büyük bir sınav salonu olduğunu hayal edelim. Bu büyük salonda size düşen görev ise, 5. sıradan başlayıp 10. sıraya kadar olan adaylara sınav kağıdı vermek olsun. Bu durumda yukarıdaki kod bloğunu düşünürsek durumu konuşma diline yaklaştırarak şöyle ifade edebiliriz.

for(/*5.sıra*/;/*10.sıra*/;/*Sırayı arttır*/) {  
   //Bulunulan sıraya soruları dağıt
}

Özetle; 5. sıradan başla, kağıtları dağıt, sonraki sıraya geç. Sonraki sıraya kağıtları dağıt ve sonraki sıraya geç. Eğer devam eden bu döngüde 10. sıradaysak kağıtları dağıt ve sonraki sıraya geçme.

Şimdi bu örneği uygulamaya koyalım. Bu yazımız için oluşturacağımız projemizin ismi 05 – Loops olacak. Her zamanki gibi TestClass sınıfımızı oluşturuyoruz.

İlk örnek olarak 1 ile 10 arasında sayıları ekrana yazdıran bir method yazacağız. Methodumuzun ismini forLoopCounter() olarak belirledik. Daha sonra değineceğimiz bir sebeple, bu methodumuzun imzasında static anahtar sözcüğü bulunacaktır. Bu konuya takılmadan devam edelim. Methodumuz şu şekilde olacaktır.

private static void forLoopCounter() {

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

}

Kodu incelediğimizde görürüz ki döngü kontrolü i ismindeki int değişken üzerinden sağlanmaktadır. i değişkeni 1 değeri ile döngüyü başlatır. Bitiş şartı ise i değişkeninin değerinin 10’dan büyük olmasıdır. Diğer bir ifade ile döngü i’nin değeri 10’dan küçük ve eşit olduğu sürece tekrar eder. Döngü tanımında görürüz ki her iterasyonda i değeri 1 artar. Bunun da ++ operatörü ile sağlandığını görürüz. Konuyu kavramak için sınav kağıdı dağıtma örneği ile bu durumu örtüştürmeye çalışalım.

Bu kodu çalıştırdığımızda şu şekilde bir çıktı elde ederiz.

1
2
3
4
5
6
7
8
9
10

Böylece ilk döngü örneğimizi yazmış olduk. Bu methodu main içerisinden çağırarak çalışmasını sağlayalım ve aynı çıktıyı gözlemleyelim.

For döngüsü ile ilgili ek olarak bir de dizi örneği yapalım. Örneğimizde döngünün bitişini sabit şekilde değil de, dizinin uzunluğuna göre belirleyeceğiz. Amacımız bir String dizisi içerisindeki tüm metinleri ekrana yazdırmak. Bunun için kurgulayacağımız methoda forLoopListing() ismini vereceğiz. Methodumuz aşağıdaki gibi olacaktır.

	private static void forLoopListing() {

		String[] nameList = {
				"Gloves", 
				"Steering wheel", 
				"Blankets", 
				"Drink", 
				"Iceman"
			};
		
		for (int i = 0; i < nameList.length; i++) {
			System.out.println(nameList[i]);
		}
	}
	

Örneğimizde, öncelikle nameList isimli String dizisi değişkenimize değinmek istiyorum. Daha evvel böyle bir tanımlama yapmamıştık. Veri tipini belirten anahtar sözcük (String) veya sınıfın(BenimSınıfım[]) yanındaki köşeli parantezler, tanımı yapılan değişkenin bir dizi olduğunu belirtir. Bir dizi tanımı new anahtar sözcüğü kullanılarak da yapılabilir. Ancak buradaki tanım şekli köşeli parantezleri kullanarak dizinin elemanlarını direkt olarak değişkene atamak şeklindedir. Lütfen bu sözdizimine takılmadan örneğimize odaklanalım. İlerleyen bölümlerde dizilere tekrar değineceğiz.

Bu döngümüzde yapmak istediğimiz şey ise döngünün bitişini belirli bir sayı ile sınırlandırmadan, dinamik olarak oluşturmaktadır. Tanımını yaptığımız dizinin içerisine bir eleman ekleyerek veya bir eleman çıkararak onun boyutunu değiştirebiliriz. Ancak döngü bitişi dizinin uzunluğu (length) ile sınırlandırıldığı için, döngümüzün kodu değişmeyecektir. Bu kodu çalıştırdığımızda şöyle bir çıktı ederiz.

Gloves
Steering wheel
Blankets
Drink
Iceman

Bu dizi içerisine bir ekleme yaparak veya bir elemanı silerek kodu tekrar çalıştıralım. Sonrasında çıktıyı gözlemleyelim. Döngü tanımında kullandığımız bitiş şartının dinamik çalışma şeklinin etkisini böylece daha iyi gözlemleyebileceğiz.

Dizilere değinmişken başka bir dizi ve başka bir döngü örneğini de gündemimize alalım. Yukarıdaki örneğimizde dizinin ilk (indeks:0) elemanından başlayıp, sonuna kadar gitmiştik. Ayrıca dizinin istediğimiz bir indeksinden başlayıp, istediğimiz bir indeksine kadar da gidebilirdik. Bu durumlardan genel olarak bir listenin/dizinin tamamını dolaşmak yaygın olandır. Bu yaygın durumu farklı bir sözdizimle, daha kısa şekilde ifade edebilmekteyiz. Örneğimizi çalışmak üzere forLoopEach() isminde bir method yazarak ilerleyeceğiz.

private static void forLoopEach() {

	String[] radioMessages = new String[4];
	radioMessages[0] = "Leave me alone! I know what I'm doing.";
	radioMessages[1] = "SMOOOOOOOTH OPPERATOOOOOOOR!";
	radioMessages[2] = "All the time you have to leave the space";
	radioMessages[3] = "You mean like, forever?";
	
	for (String radioMessage: radioMessages) {
		System.out.println(radioMessage);
	}
}

Burada radioMessages isminde bir String dizisi tanımı görmekteyiz. Bu defa new anahtar sözcüğü ile tanım yapıldığını görüyoruz. Dizinin eleman sayısını 4 olarak görüyoruz. Alt satırlarda ise 4 elemanlı dizi için ilk indeks(0) ile başlayıp, son indeks(3) ile sonlanan değer atamalarını görüyoruz. Öncekinden farklı olarak atamalar tek tek yapılmış durumda.

Buradaki for döngüsü tanımı diğer örnekler dikkate alındığında biraz daha sıra dışı gözüküyor. Bu for satırını sağdan sola okumak, konuyu anlamamızı kolaylaştıracaktır. Konuşma diline yaklaştırarak döngüyü şöyle okuyabiliriz: “Elimizde radioMessages isminde bir değişken vardır ki içerisinde birden fazla aynı tipte eleman barındırır. Bu elemanların tipinin String olduğunu bilmekteyiz. Bu dizi/liste üzerinde bir iterasyon uyguladığımızda her iterasyonda elimizde olacak değişkenin ismi radioMessage olsun.” Böylece indeks yapısından kurtulup içerikle doğrudan ilgilenmiş oluyoruz. Her iterasyonda radioMessage değişkenini ekrana yazdırdığımızı, koddan gözlemleyebiliyoruz. Bu isimlendirme genel olarak kullanılan bir yöntemdir. Değişkenin ismini rm de yapabilirsiniz. Sözdizim olarak hiçbir engel yoktur.

Bu kodu çalıştırdığımızda ise şöyle bir çıktı elde ederiz.

Leave me alone! I know what I'm doing.
SMOOOOOOOTH OPPERATOOOOOOOR!
All the time you have to leave the space
You mean like, forever?

Döngülerle ilgili olarak yazımızın ilk kısmını burada bitiriyoruz. İkinci kısımda farklı döngü tiplerini inceleyeceğiz. Bu yazımızda oluşturduğumuzun kodun tamamına aşağıdan ulaşabilirsiniz. Bir sonraki yazımızda görüşmek üzere.

public class TestClass {

	public static void main(String[] args) {

		forLoopCounter();
		forLoopListing();
		forLoopEach();

	}

	private static void forLoopCounter() {

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

	private static void forLoopListing() {

		String[] nameList = {
				"Gloves", 
				"Steering wheel", 
				"Blankets", 
				"Drink", 
				"Iceman"
			};
		
		for (int i = 0; i < nameList.length; i++) {
			System.out.println(nameList[i]);
		}
	}
	
	private static void forLoopEach() {

		String[] radioMessages = new String[4];
		radioMessages[0] = "Leave me alone! I know what I'm doing.";
		radioMessages[1] = "SMOOOOOOOTH OPPERATOOOOOOOR!";
		radioMessages[2] = "All the time you have to leave the space";
		radioMessages[3] = "You mean like, forever?";
		
		for (String radioMessage: radioMessages) {
			System.out.println(radioMessage);
		}
	}
}

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir