[ Web Proxy ]
URL:
Viewing: https://tr.javascript.info/while-for [Back]  [Original]

Dngler: while ve for
TR

Bu ak-kaynakl projenin tm dnyada kullanlabilir olmasn istiyoruz.

Kendi dilinizde eviriye yardm edebilirsiniz!

    Javascript.info'da ara:
    Eitimde ara:
    Light themeDark theme
    DanskEnglishEspaolFranaisIndonesiaItalianoTrkeOzbek

    Dngler: while ve for

    ou zaman ayn bir sra ile tekrar yapma ihtiyac duyulabilirsiniz.

    rnein bir listede bulunan rnlerin sra ile ktsn almak. Veya ayn kodu 1-10a kadar olan saylar iin altrmak.

    Dng ayn kod paracnn birden fazla defa altrlmasna denir.

    while dngs

    while dngs aadaki gibi bir yazma sahiptir:

    while (koul) {
      // kod
      // veya dngnn gvdesi
    }

    koul doru iken(while), dng gvdesinde bulunan kod altrlr.

    rnein, aadaki kod i < 3 iken alr.

    let i = 0;
    while (i < 3) { // nce 0, sonra 1, sonra 2
      alert( i );
      i++;
    }

    Dngnn gvdesinde bulunan kodun her almasna tekerrr(iteration) denir. Yukardaki rnekte gvde 3 defa tekerrr etmitir.

    Eer i++ gibi bir kod olmasayd, teoride kod sonsuza kadar devam ederdi. Pratikte ise taraycnz bu kodun uzun sre almasn engeller, sunucu tabanl JavaScript yazdnzda ise bu ilem durdurulur.

    Sadece karlatrma deil, bir ifade veya deiken koul olabilir. While dngs tarafndan alnan tm ifadeler booleana dntrlr.

    rnein, while(i != 0 ) while(i)'de olabilir.

    let i = 3;
    while (i) {  // i 0 olduunda koul `yanl` olur ve dng biter.
      alert( i );
      i--;
    }
    Tek satr gvde varsa ssl paranteze gerek kalmaz.

    Eer dng gvdesi tek satr ise ssl parantezi yazmayabilirsiniz. {..}:

    let i = 3;
    while (i) alert(i--);

    dowhile dngs

    do..while dngs kullanarak koul kontroln sonda yapmak mmkndr.

    do {
      // dng gvdesi
    } while (condition);

    Dng nce gvdeyi altrr, sonra koul kontrol yapar ve eer doruysa tekrar dng gvdesini altrr.

    rnein:

    let i = 0;
    do {
      alert( i );
      i++;
    } while (i < 3);

    Bu ekilde dng yazm ok nadir olarak kullanlr. Kullanlmasnn en nemli amac en azndan bir defa ne olursa olsun gvdenin altrlma istenmesidir. Genelde while(..){} ekli tercih edilir.

    for dngs

    for dngs en fazla kullanlan dngdr.

    Aadaki ekilde kullanma sahiptir:

    for (bala; koul; adm) {
      // ... dng gvdesi ...
    }

    rnekler zerinden incenecek olursa. Aadaki dng alert(i) yi i 0 dan 3 olana kadar altrr.(3 dahil deil)

    for (let i = 0; i < 3; i++) { // shows 0, then 1, then 2
      alert(i);
    }

    Blm blm inceleyecek olursak

    blm
    bala i = 0 Dngye girildiinde alr.
    koul i < 3 Her tekerrrden nce alr, eer yanl ise dng durur.
    adm i++ Gvdenin tekerrr etmesinden sonra fakat kouldan nce alr
    gvde alert(i) koul doru olduu srece durmadan alr

    Genel dng algoritmas aadaki gibidir:

    almaya balar
     (if koul  gvdeyi altr ve adm altr.)
     (if koul  gvdeyi altr ve adm altr.)
     (if koul  gvdeyi altr ve adm altr.)
     ...

    Eer dngleri yeni gryorsanz, belki geri dnp bu olanlar srasyla kada yazarak takip ederseniz sizin iin daha iyi olacaktr.

    Yukardaki kodda tam olarak ne oluyor peki:

    // for (let i = 0; i < 3; i++) alert(i)
    
    // almaya bala
    let i = 0
    // if koul  gvdeyi altr ve adm altr
    if (i < 3) { alert(i); i++ }
    // if koul   gvdeyi altr ve adm altr
    if (i < 3) { alert(i); i++ }
    // if koul   gvdeyi altr ve adm altr
    if (i < 3) { alert(i); i++ }
    // ...bitir, nk imdi i=3
    Satr arasnda deiken tanmlama

    Saya deikeni olan i dngye girdiinde oluturulur. Buna satr aras deiken tanmlama denir. Bu deiken sadece dng ierisinde kullanlabilir.

    for (let i = 0; i < 3; i++) {
      alert(i); // 0, 1, 2
    }
    alert(i); // hata! byle bir deiken bulunamad.

    Deiken tanmlamak yerine var olan da kullanlabilir:

    let i = 0;
    
    for (i = 0; i < 3; i++) { // var olan deikeni kullan
      alert(i); // 0, 1, 2
    }
    
    alert(i); // 3, grnr halde nk deiken dngnn dnda tanmland.

    Baz blmlerin pas geilmesi

    for dngsnn her blm pas geilebilir.

    rnein balang blmne ihtiya yoksa pas geilebilir.

    rnein:

    let i = 0; // i'yi tanmlanp 0 deeri atand
    
    for (; i < 3; i++) { // "balang"'a ihtiya yok
      alert( i ); // 0, 1, 2
    }

    basamak bilgisini silmek de mmkn:

    let i = 0;
    
    for (; i < 3;) {
      alert( i++ );
    }

    Dng while(i<3) ile ayn oldu.

    Aslnda her eyi silebiliriz:

    for (;;) {
      // sonsuz dng
    }

    Dikkat ederseniz for dngs yazarken noktal virgller ; yazlmaldr, aksi halde yazm hatas verir.

    Dngy krma

    Normalde dngler koul yanl olduunda biter.

    Fakat baz durumlarda bu dng krlabilir ( break ).

    rnein, kullancdan bir dizi say girmesini istediniz eer bo bir deer girerse dngy krabilirsiniz.

    let toplam = 0;
    
    while (true) {
    
      let deger = +prompt("Bir say giriniz", '');
    
      if (!deger) break; // (*)
    
      toplam += deger;
    
    }
    alert( 'Toplam: ' + toplam );

    break talimat (*) satrnda grld zere. Eer kullanc bo deer girerse dorudan dng durur ve dngden sonraki ilk satra atlar. Yani alert alr.

    Sonsuz dng + break birlikte kullanldnda balangta koul kontrol edilmese de olur ama dng gvdesinde veya sonunda kontrol edilmesi gerekir denen dngler iin gzel bir birliktelik oluturur. Bu dng ierisinde birok defa koul kullanlarak dng krlabilir.

    Bir sonraki tekerrre geme

    continue, break in daha hafif versiyonudur. Dngy tamamen krmaz da zorla bir sonraki tekerrre geer(tabi koul salanyorsa)

    O anda tekrar eden deer ile iimiz bitti ve bir sonraki tekrar gemek istendiinde continue kullanlr.

    for (let i = 0; i < 10; i++) {
    
      // Eer 2'ye blnebiliyorsa bir sonraki adma atlar.
      if (i % 2 == 0) continue;
    
      alert(i); // ekranda 1, 3, 5, 7, 9 deerleri gsterilir.
    }

    i nin ift deerleri iin dng gvdesi durdurulur, sonraki adma geilir. Bundan dolay alert sadece tek deerler iin alr.

    continue talimat dng saysnn azalmasna yardmc olur.

    Tek deerler gsteren dng aadaki gibi de yazlabilir:

    for (let i = 0; i < 10; i++) {
    
      if (i % 2) {
        alert( i );
      }
    
    }

    Teknik asndan birbiri ile ayndrlar. Her zaman continue blounun yerine if kullanabiliriz.

    Tabi bunun yan etkisi dng gvdesi iinde bir tane daha if kullanarak okunabilirlii drmektir.

    if yerine ? kullanlyorsa sa tarafa continue/break yazlmaz.

    break/continute talimatlar '?' ile kullanlamazlar

    rnein:

    if (i > 5) {
      alert(i);
    } else {
      continue;
    }

    Yukardaki dng ? ile yazlacak olursa:

    (i > 5) ? alert(i) : continue; // `continue` burada kullanlamaz!!!

    sonrasnda almay durdurur. Byle kodlar yazm hatas verir.

    Bu da '?' iaretini if yerine kullanmamak iin ayr bir neden.

    break/continue iin etiket tanmlanmas ( Label )

    Bazen birden fazla dng iinden tek bir break ile klma ihtiyac duyulabilir. rnein aadaki kodda dng i ve j kordinatlarn ekranda gsterir:

    for (let i = 0; i < 3; i++) {
    
      for (let j = 0; j < 3; j++) {
    
        let deger = prompt(`Kordinattaki deer (${i},${j})`, '');
    
        // Burada dngden kmak istersem ne yapmalym?
    
      }
    }
    
    alert('Bitti!');

    Eer kullanc iptale basarsa dng iptal edilmelidir.

    Normalde ierideki dng iin degere deer atadktan sonra duruma gre iteki dng krlabilir. Fakat bu yeterli deildir. Bu gibi durumlarda Labels veya etiket ile sorun zlebilir.

    etiket dngden nce bir kolon ile dngy tanmlamak iin kullanlr.

    etiketAdi: for (...) {
      ...
    }

    break <etiketAdi> cmlesi bu etiketin olduu yeri krar.

    Aadaki gibi:

    ust_dongu: for (let i = 0; i < 3; i++) {
    
      for (let j = 0; j < 3; j++) {
    
        let giris = prompt(`Kordinattaki deer (${i},${j})`, '');
    
        // Eer iptal edildi veya bo bir deer girildiyse dardaki dngy de kr.
        if (!giris) break ust_dongu; // (*)
    
        // deer ile bir eyler yap.
      }
    }
    alert('Bitti!');

    Yukardaki kodda break ust_dongu admna gelirse ste doru ust_dongu aranr ve bulunduu yerde krlr.

    Bylece kontrol dorudan (*), alert('Bitti!')ye geer.

    Etiketi baka bir satra geirmekte mmkndr.

    ust_dongu:
    for (let i = 0; i < 3; i++) { ... }

    continue talimat da etiket ile kullanlabilir. Bu durumda etiketin yazl olduu yere atlar.

    Etiketler goto deildir.

    Etiketler ile kodun herhangi bir yerine atlamak mmkn deildir.

    rnein aadaki kod almaz.

    break etiket;  // etikete atlar deil mi?.
    
    etiket: for (...)

    break/continue sadece dngnn ierisinde alabilir, ve doal olarak etiketler de st tarafa yazlmaldrlar.

    zet

    Bu konuda 3 farkl dng ilendi:

    • while Her tekerrrden nce koul kontrol edilir
    • do..while Koul tekerrrden sonra kontrol edilir.
    • for (;;) Her tekerrrden nce koul kontrol edilir. Farkl seenekler mevcuttur.

    Sonsuz dng yapmak iin genelde while(true) kullanlr. Byle dngler de dierleri gibi break talimatyla krlabilir.

    Eer o anki tekerrr ile iimiz bitti ve bir sonrakine gemek istiyorsanz continue kullanmanz lazm.

    break/continue ile dngden nce yazlan etikete atlamak veya st dngy krmak mmkndr.

    Grevler

    nem: 3

    Aadaki kodda en son uyarda ekrana ne yazar? Neden?

    What is the last value alerted by this code? Why?

    let i = 3;
    
    while (i) {
      alert( i-- );
    }
    zm

    Cevap: 1.

    let i = 3;
    
    while (i) {
      alert( i-- );
    }

    Her defasnda dng i dolaysyla 1 azalr. while(i) koulu i=0 olduunda sonlanr.

    Dng aadaki gibi iler:

    let i = 3;
    
    alert(i--); //  3 gsterir, i 2'ye iner.
    
    alert(i--) // 2 gsterir, i 1'e iner.
    
    alert(i--) // 1 gsterir, i 0'a iner.
    
    // bitti `while(i)` koulu tekrar kontrol edildi ve i = 0 olduundan dngden kld.
    nem: 4

    Her dng iin ekranda gsterilecek deerler nelerdir? Bu deerleri yazn ve sonra cevap ile karlatrn.

    Her iki dngde de alert ayn deerleri mi gsterir?

    Both loops alert same values or not?

    1. nden eklemeli ++i:

      let i = 0;
      while (++i < 5) alert( i );
    2. Sonradan ekelemeli form i++

      let i = 0;
      while (i++ < 5) alert( i );
    zm

    The task demonstrates how postfix/prefix forms can lead to different results when used in comparisons.

    1. From 1 to 4

      let i = 0;
      while (++i < 5) alert( i );

      The first value is i = 1, because ++i first increments i and then returns the new value. So the first comparison is 1 < 5 and the alert shows 1.

      Then follow 2, 3, 4 the values show up one after another. The comparison always uses the incremented value, because ++ is before the variable.

      Finally, i = 4 is incremented to 5, the comparison while(5 < 5) fails, and the loop stops. So 5 is not shown.

    2. From 1 to 5

      let i = 0;
      while (i++ < 5) alert( i );

      The first value is again i = 1. The postfix form of i++ increments i and then returns the old value, so the comparison i++ < 5 will use i = 0 (contrary to ++i < 5).

      But the alert call is separate. Its another statement which executes after the increment and the comparison. So it gets the current i = 1.

      Then follow 2, 3, 4

      Lets stop on i = 4. The prefix form ++i would increment it and use 5 in the comparison. But here we have the postfix form i++. So it increments i to 5, but returns the old value. Hence the comparison is actually while(4 < 5) true, and the control goes on to alert.

      The value i = 5 is the last one, because on the next step while(5 < 5) is false.

    nem: 4

    Her bir tekerrr iin grnecek sonular bir yere yazn. Yazdklarnz cevap ile karlatrn.

    Dngler ekrana ayn uyarlar m verir?

    1. nden Eklemeli

      for (let i = 0; i < 5; i++) alert( i );
    2. Sonradan Eklemeli

      for (let i = 0; i < 5; ++i) alert( i );
    zm

    Cevap: Her iki durum iin de 0 dan 4e kadardr

    for (let i = 0; i < 5; ++i) alert( i );
    
    for (let i = 0; i < 5; i++) alert( i );

    Bu sonu dorudan for algoritmasna bakarak kartlabilir:

    1. Balangta ncelikle i = 0 balat.
    2. Koulu kontrol et i < 5
    3. Eer doru dnyorsa uyary gster alert(i) ve sonra i++

    Artrma i++ koul kontrolnden tamamen ayr bir olaydr(2). Sadece koulacak ayr bir cmledir.

    Artrmdan dnen deer burada kullanlmad, bundan dolay i++ ile ++i arasnda bir fark yoktur.

    nem: 5

    for dngs kullanarak 2 den 10 a kadar olan ift saylarn ktsn yazdrn.

    Demoyu altr

    zm
    for (let i = 2; i <= 10; i++) {
      if (i % 2 == 0) {
        alert( i );
      }
    }

    modl operatr % kullanarak kalan deerin ift mi yoksa tek mi olduunu kontrol edip uyar verebilirsiniz.

    nem: 5

    Aadaki kodun davran deimeyecek ekilde while dngsne evirin.

    for (let i = 0; i < 3; i++) {
      alert( `number ${i}!` );
    }
    zm
    let i = 0;
    while (i < 3) {
      alert( `number ${i}!` );
      i++;
    }
    nem: 5

    Kullancya her defasnda 100den byk bir say girmesi iin prompt ile veri girmesini isteyin. Eer farkl bir deer girerse tekrardan deer girmesi talebinde bulunun.

    Kullanc 100 den byk bir say veya bo satra onay verene kadar dngye devam edilmelidir.

    Burada kullancnn sadece saysal deerler gireceini farzedin. Ayrca saysal deerleri kontrol iin bir kod yazmak ile uramayn.

    Demoyu altr

    zm
    let sayi;
    
    do {
      sayi = prompt("100'den byk bir say giriniz", 0);
    } while (sayi <= 100 && sayi);

    do..while ile her iki koul da doru olana kadar kontrol edin:

    1. sayi <=100 girilen deerin hala 100 den byk olmadn gsterir.
    2. && sayi sayi null veya bo bir deer olduunda false dnderir. Tabi while dngs de burada sona erer.

    NOT: Eer sayi null ise num<=100 true olur. Yani ikinci kontrol olmadan kullanc IPTAL tuuna bassa bile dng durmayacaktr. ki koul da gereklidir.

    nem: 3

    1 den byk olup 1 veya kendisi haricinde hibir sayya kalansz blnemeyen saylara asal say denir.

    rnein 5 bir asal saydr. nk 2,3 ve 4 e kalansz blnemez.

    2 den ne kadar olan asal saylar bulan kodu yaznz.

    rnein n = 10 iin sonu 2,3,5,7 olacaktr.

    NOT: Kod her trl n deeri iin almaldr, sabit bir say deildir.

    zm

    There are many algorithms for this task.

    Lets use a nested loop:

    For each i in the interval {
      check if i has a divisor from 1..i
      if yes => the value is not a prime
      if no => the value is a prime, show it
    }

    The code using a label:

    let n = 10;
    
    nextPrime:
    for (let i = 2; i <= n; i++) { // for each i...
    
      for (let j = 2; j < i; j++) { // look for a divisor..
        if (i % j == 0) continue nextPrime; // not a prime, go next i
      }
    
      alert( i ); // a prime
    }

    Theres a lot of space to opimize it. For instance, we could look for the divisors from 2 to square root of i. But anyway, if we want to be really efficient for large intervals, we need to change the approach and rely on advanced maths and complex algorithms like Quadratic sieve, General number field sieve etc.

    Eitim haritas

    Yorumlar

    yorum yapmadan nce ltfen okuyun...
    • Eer gelitirme ile alakal bir neriniz var ise yorum yerine github konusu gnderiniz.
    • Eer makalede bir yeri anlamadysanz ltfen belirtiniz.
    • Koda birka satr eklemek iin <code> kullannz, birka satr eklemek iin ise <pre> kullann. Eer 10 satrdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)

    Web Proxy Viewer  |  New URL  |  Original Page