JavaScript Temelleri

Bölüm 2

Temel Bilgiler

2.13 - Döngüler

Bölüm 2 Sayfa 15

2.13.1 - Döngülerin Tanıtımı

Döngüler,işlemlerin sürekli olarak tekrar edilidiği işlem bloklarıdır. Bilgisayar programları, döngü bloklarının içindeki işlemleri sıra ile çalıştırırlar ve yeniden döngü başına dönerek aynı işlemleri tekrar ederler. Bu nedenle döngülere, tekrarlı işlemler adı da verilir. Bir döngü bloğuna giren program kontrolünün, döngü bloğundan çıkabilmesi için bir yöntem bulunması gerekir. Aksi halde, program kontrolü sonsuza kadar döngü bloğundan çıkamaz. Bu duruma sonsuz döngü adı verilir. Program kontrolünün döngü bloğundan çıkabilmesi için, belirli bir mantıksal kontrolün döngü bloğuna yerleştirilmesi gerekir. Bu mantıksal ifadenin sonucu gerçek olduğunda, program kontrolü döngü bloğundan çıkar.

Bir döngü bloğunun tüm işlemlerinin tamamlanarak yeniden başa dönülmesine bir iterasyon adı verilir. İteratif işlemlerden çıkılabilmesi için, döngü sayacı olarak adlandırılan bir tamsayı değişkeninin her iterasyonda bir tamsayı artımı sağlanır. Bu sayaçtan yararlanılarak belirli bir iterasyon sayısından sonra iteratif işlem sona erdirilebilir. Programın niteliğine göre döngüyü sonlandırabilecek başka mantıksal kontroller de tasarlanabilir.

Döngü işlemleri, bilgisayarların en güçlü işlevlerinden biridir. İnsanlar için sıkıcı ve belirli bir sayıdan sonra olanaksız sayılabilecek sayıda işlemi sorunsuzca yerine getirebilirler. Sadece iyi programları gerekir. Bu konuda, henüz bilgisayarlar kullanılmadan, İkinci Dünya Savaşı sırasında, Alman Ordusu, V2A füzelerinin atış cetvellerini, Peenemünde 'de bir salona yerleştirilen çok sayıda üniversite öğrencisine Facit makineler kullanarak yaptırmıştır. Aynı işlemi, günümüzde bir ev bilgisayarı kısa sürede tamamlayabilir.

JavaScript programlama dili, modern bilgisayar dillerinde olan döngü sistemlerinin çoğunu içermektedir. Bu bakımdan, çağının ilerisinde bir programlama dilidir. Fakat, ironik olarak, bu olanaklardan pek azı gerçek hayatta kullanılır. Karşılaşılan problemlerin çoğu, biraz sonra inceleyeceğimiz for... döngüleri ile çözülebilir. Bu nedenle, diğer döngü sistemlerine pek az gereksinme duyulur. Buna rağmen, döngü problemleri her türlü döngü sistemi ile çözülebilir. Hangi sistemin kullanılacağı, programcının kişisel zevkine bağlıdır.

Döngü sayaçları, eski bir Fortran geleneğinde kayanklanan bir alışkanlıka, i,j,k,l,n,m,o karakterleri ile i den başlanarak kullanılır. JavaScript programlama dili için bu gereksinme olmamamsına karşın, programcılar döngü sayaç karakterlerini genellikle bu geleneğe uygun olacak şekilde seçerler çünkü programcıların bu karakterlere alışkın olduları için yazılımlarda bu karakterleri ararlar ve alışkın oldukları yazılım şeklini gördüklerinde yazılanları kısa sürede ve doğru olarak algılarlar.

Döngüler en iyi dizilerle çalışır. Henüz dizileri incelemediğimiz için, döngülerin güçlü yönlerini farkedemeyebiliriz. Ama gerçekten güçlü araçlardır. Dizilerin incelenmesinde, döngü araçlarını kullanacak ve nekadar yararlı ve işlevsel olduklarını görebileceğiz. Bu bölümde sadece döngü mekanizmalarını inceleyeceğiz.

2.13.2 - for Döngüleri

İlk inceleyeceğimiz döngü tipi olan for döngüleri, önceden belirtilen sayıda iterasyon yapılan en basit fakat en çok kullanılan bir döngü türüdür. Yazılımı temel olarak,

for(Başlık Bilgileri) Çalıştırılacak Bildirim
		

şeklindedir.

Döngülerde çalıştırılacak bildirimler daima birden çoktur. Bu yüzden bildirimler bir blok içine alınır. Yazılım bu durumda, genel olarak,

for(Başlık Bilgileri) {
Bildirim 1;
Bildirim 2;
...
Bildirim n;
}
		

şeklinde uygulanır.

Başlık Bilgileri, hepsine kuramsal olarak isteğe bağlı, pratik olarak da uygulamalarda daima hepsi kullanılan, üç bildirim veya ifadeden oluşur. Bunlar

([Döngü Sayacı (veya Sayaçlarının) Başlangıç Değerlerine Getirilmesi];[Döngü Sayacının Maksimum Değeri;][Döngü Sayacının (veya Sayaçlarının) Arttırım (veya Eksiltme) Değeri (Değerleri))
		

şekllindedir. Çoğunlukla rastlanmayacağına rağmen, salt bilgi için, iki sayaçlı bir for döngüsünün başlık kısmı aşağıda olduğu gibi uygulanabilir,

for (i = 0, j = 0; i < iMax; i++, j++ )
		

Burada dikkat edilecek noktalar, her terimde değişkenlerin arasının birer noktalı virgül ile ayrıldığı, ilk iki terimin birer ifade sonlandırıcısı ile tamamlanmasına karşın, son terimin doğrudan doğruya parantezin kapanması ile sonlandığıdır. Ayrıca döngünün iki sayacı (i ve j) olmasına karşın, maksimum döngü sayısı tek olabileceği için, sadece döngü sayçalrından birisinin maksimumu ile belirlenebileceğine de dikkat edilmelidir. Pratikte birden çok sayaçlı döngüler hemen hemen hiç yok gibidir. Genel olarak döngü sayacı sadece bir tanedir ve pratikte bir for döngüsünün başlığı aşağıda olduğu gibi düzenlenir :

for (i = 0; i < iMAX; i++)
		

Döngülerde, döngü sayacının sadece döngü sayacı amacı ile kullanılması gereğini gözönüne alan JavaScript yorumlayıcısı, programcılara, döngü sayacının döngü başlığında tanıtılması ile birlikte başlangıç değerinin belirtilmesi olanağını sağlamıştır. Bu olanağın da kullanılması ile döngü başlığı,

		for (var i = 0; i < iMAX; i++)
		

şekline ulaşır. Bu düzenleme, uygulamalarda yeğ tutulan bir yazılımdır. Klasik bir for dongüsü, JavaScript kodları aşağıda görülen bir uygulamada verilmiştir:

function forDöngüsü {
var s = 0;

for (var i = 0; i < 5; i++) {
s = s + i;
}

bilgiYaz(s , 'b2.13.2-uyg-1-sonuç-1');
}
		

Bu programın sonucu:

s =

olacaktır.

Yukarıdaki örnekte de görüldüğü gibi, for döngülerinde, döngü kontrolü döngü başında yapılmaktadır. İterasyon sayısı önceden bellidir ve belirsiz bir olay yoktur. Döngü sayacı maksimum değere erişince, program kontrolü döngü gövdesine girmeyerek bir sonraki bildirime geçer. Bu döngü yapılanması, uygulamalarda duyulan döngü gereksinmesinin büyük bir kısmını karşılamaktadır.

2.13.3 - while Döngüleri

İkinci incelenecek JavaScript döngü yapılanması, while döngüleridir. Bu tür döngülerde döngü sayacının değeri, döngüün başında kontrol edilir. Kontrol ifadesinin sonucu true ise kontrol döngü gövdesine girer, bloktaki tüm bildirimleri çalıştırır ve yeniden blok başına dönerek kontrol ifadesini yeniden değerlendirir. Bu değer yeniden true ise yeniden döngü gövdesine girer. Aksi halde bir sonraki bildirime geçer. Döngü sayacının değerinin değişmesi için gerekli ifadenin, döngü gövdesinde belirtilmesi gerekir. Yazılımı,

while (Kontrol İfadesi) {
Bildirim 1;
Bildirim 2;
...
Bildirim n;
}
		

şeklindedir.

Yazılımı basit olmasına karşın, while döngüleri uygulamada çok karmaşık döngü yapılanmaları oluşturabilirler. Döngü gövdesindeki bildirimlerin birinin, döngü sayacının değerinin değiştirilmesini ve bu şekilde, sonlu bir iterasyon sayısı sonunda kontrol ifadesinin değerinin false olmasını sağlaması gerekir.

Kontrol fadesinin, döngü sayacının sayısı ile değerlendiği bir while döngüsünde döngü sonunun öngörülmesi göreli olarak kolaydır. Aşağıda JavaScript kodları görülen bir uygulamada, klasik bir while döngüsü görülmektedir.

var i = 0, s = 0, iMAX = 5;
			
while (i < iMAX) {
s +=  i;
i++;
}

bilgiYaz(s ,'b2.13.3-uyg-1-sonuç-1');
		

Bu programın sonucu:

s =

olmaktadır.

Yukarıdaki örnekten de görülebileceği gibi, while döngülerinde, döngü çıkış mekanizması, döngü sayısına bağlı olduğunda, döngü çıkışıının öngörülmesi, for döngüleri ile kıyaslanacak kadar basittir. Fakat, bazı durumlarda döngü çıkış ifadesinin değerlendirilmesi karmaşık bir yapıda olabilie ve bu durumda döngü çıkışının gerçekleşip gerçekleşmeyeceğinin öngörülmesi kolay olmayabilir. Bu durumda, bir güvenlik önlemi olarak, gereçekleşen iterasyon sayını kontrol eden ikinci bir döngü sayacının kullanılarak bu sayacın maksimum döngü sayını ayrıca sınırlaması sağlamalıdır. Bu şekilde, sonsuz döngüye girilmesi olasılığı elimine edilmiş olacaktır. Aşağıda JavaScript kodları verilmiş olan uygulama, bu durumu açıklamaktadır:

function f(x) {
return (x * x * x + 5 * x * x + 7 * x)/ (5 * x * x - 21 * x + 44);
} 

function inceleme() {

var i = 0, a = 10, iMAX = 50;
			
while (f(a) < 0 && i < iMAX) {
a /=  2;
i++;
}

bilgiYaz('f(x) = '  + a , 'b2.13.3-uyg-2-sonuç-1');
		
if (i < iMAX) {

bilgiYaz('Gerçekleşen Iterasyon Sayısı ='  + i, 'b2.13.2-uyg-2-sonuç-2');

}

else {

bilgiYaz('Maksimum Iterasyon Sayısı Aşıldı !', 'b2.13.2-uyg-2-sonuç-3');

}
}
		

Bu programın sonucu:

Yukarıdaki uygulama, bir fonksiyonun köklerinin araştırılması için bir ön sondaj çalışmasıdır. Buradaki while döngüsünün kontrol ifadesi iki mantıksal ifadenin birleştirilmesinden oluşmaktadır. Daha önce 2.9.1 bölümünde && (AND) mantıksal işlemcisinin işleyişi incelenirken, bu işlemcinin iki işleneni olduğu ve ifadenin true olması için, her iki işlenenin de true olması gerektiği belirtilmişti. Sol işlenen, fonksiyonun aldığı değerin negatif olması ile false olacaktır. Fonksiyonun alacağı değerlerin başlangıçta (à priori) saptanması olanağı yoktur. Eğer döngü, salt bu işlenin sonucu ile kontrol edilseydi, kontrolün hiçbir zaman false olmaması, dolayısı ile sonsuz döngüye girilmesinin her an olası olduğu bir durumla karşı karşıya kalınabilirdi. Bunun önlenmesi için, döngü sayısını daha öngörülebilir bir şekilde kontrol edebilen başka bir döngü sayacının kullanılması gerekmiştir. Bu döngü sayacı, klasik bir arttırımlı (incremental) sayaçtır. Belirli bir sayıya ulaştığında döngü kesilmekte, böylece, alacağı değer önceden kestirilemeyen fonksiyon değeri kontrolüne ek olarak, daha kontrollü bir döngü sonlandırıcısı eklenerek, sonsuz döngüye girme olasılığı tamamen ortadan kaldırılmış olmaktadır.

while Döngülerinde, döngü kontrolü, döngü başında yapıldığı için, program kontrolü, döngüye hiç girmeyebilir. Bu da mantıksal program akışı kontrolünde büyük avantaj sağlar. Bu nedenle, while döngüleri, for döngülerinden sonra, kullanıcıların en çok tercih ettikleri ikinci döngü yapılanmasıdır.

Valid XHTML 1.1