while döngüleri
Aynı kodun tekrar yürütülmesine izin veren yapılardır. Tekrarlama yapıları Aynı kodun tekrar yürütülmesine izin veren yapılardır. Bu belli deyimleri belli bir biçimde birden fazla kez yürütebilirsiniz anlamındadır. Deyimler bazı şartlar doğru olarak kaldığı sürece yürütülür. “döngüler” olarak da bilinirler Bazen “tekrarlayıcılar” olarak ta söz edilirler. 09.04.2019
while tekrar yapısı { do this (again and again...) } Bazı şartlar doğru olduğu sürece işler gerçekleştirilecektir. Örneğin: (programımsı şekilde) while (something is true) { do this (again and again...) } while (birşeyler doğruysa) { bunu tekrarla (tekrar ve tekrar...) Test edilen şartlar pek çok farklı durum alabilir. 09.04.2019
While Döngüsünün Bölümleri Her while döngüsü her zaman üç temel öge içerir: Ateşleme: değişkenlerinizi başlangıç durumuna getirme Test Etme: bazı bilinen durumlara karşı test etme Güncelleme: test edilen değişkenin güncellenmesi 09.04.2019
Basit While Döngüsü OUTPUT: ÇIKTI: Index: 1 Index: 2 Index: 3 Index: 4 Index: 5 Index: 6 Index: 7 Index: 8 Index: 9 Index: 10 #include <stdio.h> #define MAX 10 main () { int index =1; while (index <= MAX) { printf ("Index: %d\n", index); index = index + 1; } Ateşleme 1. Priming 2. Test Condition Durum testi 3. Update Güncelleme 09.04.2019
While Döngüsü Akış Diyagramı Ateşleme Index=1’e ayarla 1. Priming Set index=1 2. Test index <= 10 Doğru TRUE 3a. print index 3b. Update index = index + 1; İndexi yaz index=index+1 olarak güncelle FALSE Yanlış 09.04.2019
Sonsuz Döngü Sonsuz Döngü: Hiçbir zaman sonlanmayan bir döngü. Genel olarak, bundan sakınmak istersiniz! Buna rağmen belli bir amaçla sonsuz döngü oluşturmak isteyeceğiniz özel durumlar vardır. Yaygın sınav soruları: Bir kod parçası verilir, kod içindeki hatayı belirlemeniz istenir. Sonsuz döngüleri belirlemeye ihtiyaç duyabilirsiniz. 09.04.2019
Sonsuz Döngü Örnek #1 #include <stdio.h> #define MAX 10 main () { int index =1; while (index <= MAX) printf ("Index: %d\n", index); } Index: 1 … [forever] ... [sonsuza dek] Here, I have deleted part 3: the index = index + 1 statement. Burada, 3. Bölümü sildim; index=index+1 deyimini 09.04.2019
test şartını değiştirdim Sonsuz Döngü, Örnek #2 #include <stdio.h> /*no MAX here*/ main () { int index = 1; while (index > 0) printf ("Index: %d\n", index); index = index + 1; } Index: 1 Index: 2 Index: 3 Index: 4 Index: 5 … [forever] ... [sonsuza dek] Burada, 2. Bölümü: test şartını değiştirdim 09.04.2019
Sayıcı-kontrollü tekrarlar Basitçe bir deyimi veya bir deyim grubunu tekrar etmeyi ne zaman durduracağınızı söylemesi için bir sayıcı kullanmayı ifade eder. Daha önceki örnekler sayıcı kontrollü tekrarlardı. 09.04.2019
Sayıcı (tekrarlayıcı olarakta bilinir) Programınızın bir deyimler bloğunu kaç kere tekrarlayacağını sayan bir değişkendir. Kullanılmadan önce başlangıç durumuna getirilmelidir Bir sayıcıyı tekrarlama kodunu girmeden hemen önce başlangıç durumuna getirin (“Yakınlık Prensibi”) Tekrarlama tipine bağlı olarak genellikle bir 1 veya 0’dır Eğer başlangıç durumuna getirilmezse, bir “çöp” değeri elde ederiz genellikle mantıksal hatalarla sonuçlanır 09.04.2019
Tekrarlama Bir tekrarlama yapısı kullanır Yürütülecek kodun tekrarlanması işlemidir. “Bir tekrarlama” aynı zamanda tekrarlanacak kod boyunca bir atlama veya bir uçuş anlamına da gelir. 09.04.2019
Daha ince bir örnek #define ITEMS_TO_BUY 10 int iItemsBought = 0 ; /* yeterince alana kadar zaman satın almaya devam */ while ( iItemsBought < ITEMS_TO_BUY ) { /* bir parça alırken işlenecek kod */ /* sayıcımızı artırmayı unutmayın! Aksi taktirde sonsuza dek dörer */ iItemsBought = iItemsBought + 1; } /* end while itemsbought... */ /* while itemsbought sonu... */ /* while’dan çıktıktan sonra yürütülecek bir sonraki komut */ 09.04.2019
Çıkış Bir tekrarlama yapısında çıkış için kullanılan genel terim Bir tekrarlama yapısından çıkmak için kullanılan bir deyim DEĞİLDİR Başka durumlardaki kodlardan çıkmak için de kullanılabilir Bir programdan çıkış Bir fonksiyondan çıkış Bu son iki durumda bir çıkışa zorlamak genellikle kod yürütmesini durdurmak için kötü bir yoldur. 09.04.2019
bir başka örnek #define STUDENTS_ENROLLED_COUNT 50 int iStudentsPresentInClassCount = 0, iCurrentStudentIsHere = 0, iStudentIndex; iStudentIndex = 1; /* init here to make sure */ /* emin olmak için burda başlat */ while ( iStudentIndex <= STUDENTS_ENROLLED_COUNT ) { /* code to count attendance */ /* mevcut sayısını sayma için kod */ iCurrentStudentIsHere = 0 ; /* init to not here */ /* burada başlatmayın */ printf( “Enter 1 if student is here\n” ); scanf( “%d”, &iCurrentStudentIsHere); if ( iCurrentStudentIsHere== 1 ) iStudentsPresentInClassCount = iStudentsPresentInClassCount + 1; /* don't forget to increment our counter! */ /* sayıcımızı artırmayı unutmayın! */ iStudentIndex = iStudentIndex + 1; } /* end while */ /* while sonu */ 09.04.2019
bir başka örnek, devam if ( iStudentsPresentInClassCount < /*while’dan çıktıktan sonra yürütülecek kod */ if ( iStudentsPresentInClassCount < STUDENTS_ENROLLED_COUNT ) { /* mevcut sayısını almaya başla */ /* sürpriz quizler vermeye başla */ } 09.04.2019
Nöbetçi-kontrollü tekrarlar Bir önceki örnekte eğer kullanıcının programın ne zaman sonlanacağına karar vermesini istiyorsak ne olacak? Bir nöbetçi kullan 09.04.2019
Veri girişini sonlandıran sinyallerdir Nöbetçiler Veri girişini sonlandıran sinyallerdir Sinyal değeri, taklit değer, veya bayrak değeri olarakta bilinir Belirsiz tekrar olarakta bilinir çünkü kodun gerçekleştireceği döngü sayısı döngüden önce bilinmemektedir 09.04.2019
Nöbetçiler kullanmak Nasıl kullanılırlar? Programcı asla normal veriye karşılık gelemeyecek bir değer alır Kullanıcı normal veriyi girer ve sonra bittiğinde, olağan olmayan değeri alır Döngü olağan olmayan değeri görünce döngüyü durduracaktır 09.04.2019
Nöbetçiler kullanmada geri sayım Örneğin, insanlar için yaş değeri giriyorsak, nöbetçi olarak -1 alabiliriz Hiç kimsenin -1 yaşında olması beklenmez Kullanıcıya döngünün her tekrarında nöbetçi değerini hatırlatmak iyi bir pratiktir Örneğin, printf(“Hali hazırdaki kişinin yaşını veya sonlandırmak için -1 girin\n”); sonraki değer girişi (nöbetçi olabilir) 09.04.2019
İyi Programlama tavsiyeleri Öyle bir nöbetçi değeri alın ki KESİNLİKLE normal veri ile karıştırılmasın Her tekrarda kullanıcıya nöbetçi değerini hatırlatın Y2K benzeri problem Programcılar genellikle döngüleri sonlandırmada nöbetçi olarak 9999 kullanırdı 9 Eylül 1999’da (bazen 9999 olarak kısaltılır), programların beklenenden daha önce yürütmeyi hatalı olarak durdurabileceğinden kaygılandılar. Döngülerde, döngü içinde ihtiyaç duyulmayan komutları DIŞARIDA tutun. 09.04.2019
Yukardan-aşağı, adım-yoluyla arıtma Kod geliştirme tekniği Çok genel şekilde algoritmayı temsil eden sözde program ile başlar Algoritmayı her yeniden açıklanış adımında daha detaylı/özel alır (herbir arıtma) Problem bir kez sözde programda yeterli derecede detaylandırıldığında programlamaya başlanabilir. Her bir adım aynı algoritmanın yalnızca biraz daha detaylandırılmış tanımıdır 09.04.2019
Yukardan-aşağı, adım-yolu örnek En üstteki analiz Ders quizindeki ortalamayı belirle İlk arıtma (en üsttekini kısımlara ayırma) Değişkenleri başlangıç durumuna getir Girdi, toplam ve not sayısının sayımı Sınıf ortalamasını hesapla ve yaz 09.04.2019
Yukarıdan-aşağıya örnek, geri sayım İkinci arıtma gereken özel değişkenleri listeler total (toplam) başlangıç değerini 0 olarak belirle counter (sayıcı) başlangıç değerini 0 olarak belirle İlk arıtmanın ara adımını daha detaylı olarak kısımlara ayırma, ör: ilk notu gir kullanıcı nöbetçiyi girmediği sürece notu toplama ekle not sayıcısına bir ekle sonraki notu gir (nöbetçi olabilir) 09.04.2019
Yukarıdan-aşağıya örnek, geri sayım İkinci arıtma geri sayımı İlk arıtmanın son adımı aşağıdaki gibi kısımlara ayrılabilir: Sayıcı 0’a eşit değilse ortalamayı toplam bölü sayıcı olarak ata ortalamayı yaz eşitse “hiç not değeri girilmedi” yaz Bir kez yeterli detay oldu mu, planı ve böylece kodu görmek kolaydır 09.04.2019
do/while tekrar yapısı while yapısıyla benzerdir Fakat şartı en yukarda test etmek yerine döngünün sonunda test eder Bir döngünün EN AZ BİR KEZ yürütülmesinin istiyorsanız kullanılır 09.04.2019
do/while sözde programı { something } while (condition) ; Sağ kırlangıç parantezden hemen sonra bir açıklama yerleştirmeye istisnadır, buna rağmen noktalı virgülden sonra hala açıklama yapmamız gerekir. 09.04.2019
printf( “%d “, iCounter ); iCounter = iCounter + 1; do/while örneği int iCounter = 1; do { printf( “%d “, iCounter ); iCounter = iCounter + 1; } while ( iCounter <= 10 ) ; Sondaki noktalı virgüle dikkat edin 09.04.2019
do while döngüsü akış diyagramı 1. Ateşleme Index=1 atayın 1. Priming Set index=1 2a. İndexi yaz 2b. İndex=index+1 olarak güncelleyin 2a. print index 2b. Update index = index + 1; TRUE 3. Test index <= 10 3. İndexi test et <=10 mu? FALSE 09.04.2019
Notlar Her zamanki while döngüsü ile karışmaması için her zaman parantezler kullanın 09.04.2019
C bazı genel çalışmalar için kısaltmaları destekler Atama operatörleri Kısayollar C bazı genel çalışmalar için kısaltmaları destekler Atama operatörleri Arttırma/azaltma çalışmaları 09.04.2019
Temel ikili operatörler için kısaltmalar sağlanır Atama Operatörleri Temel ikili operatörler için kısaltmalar sağlanır Ekleme Çıkarma Çarpma Bölme Modül alma (%) 09.04.2019
Ekleme Atama Operatörü Yazma yerine iCount = iCount + 1; Yazabilirsiniz iCount += 1 ; Sağ taraftaki ifadenin değerini sol taraftakine ekler ve yeni toplamı sol taraftakinde depolar 09.04.2019
Çıkarma Atama Operatörü Yazmak yerine iCount = iCount - 1; Yazabilirsiniz iCount -= 1 ; Sağ taraftaki ifadenin değerini sol taraftakinden çıkarır ve yeni toplamı soldaki değişkende depolar 09.04.2019
Çarpma Atama Operatörü Yazmak yerine iCount = iCount * 2; Yazabilirsiniz iCount *= 2; Sol taraftaki değişkenin değerini sağ taraftaki değişkenin değeriyle çarpar ve yeni toplamı sol taraftaki değişkende depolar 09.04.2019
Bölme Atama Operatörü Yazmak yerine iCount = iCount / 2; Yzabilirsiniz Soldaki değişkeni sağdaki ifadenin değerine böler ve yeni toplamı soldaki değişkende depolar. 09.04.2019
Modül Alma Atama Operatörü Yazmak yerine iSeconds = iSeconds % 60; Yazabilirsiniz iSeconds %= 60; Soldaki değişkenin sağdaki ifadenin değerine bölümünden kalanı alır ve yeni toplamı soldaki değişkende depolar. 09.04.2019
Örnekler Assigns Meaning Sample Initial Value Operator 3 to c Farzadelim ki int c = 10 3 to c c = c % 7; c %= 7; 10 %= 2 to c c = c / 5; c /= 5; /= 60 to c c = c * 6; c *= 6; *= 7 to c c = c – 3; c -= 3; -= 17 to c c = c + 7; c += 7; += Assigns Meaning Sample Initial Value Operator 09.04.2019
Arttırma ve Azaltma Operatörleri C birli atama operatörleri ++ ve azaltma operatörü -- ‘yi sağlar. Arttırma operatörleri 1 ekler Azaltma operatörleri 1 azaltır Bazı deyimler için kısa yoldan bile daha fazlası Diğer ilişkilendirme operatörleri için değil (*, /, %) 09.04.2019
iCount++ ; or ++iCount ; Arttırma Operatörü ++ Yazmak yerine iCount = iCount + 1; or iCount += 1; Yazabilirsiniz iCount++ ; or ++iCount ; İki yeni tercih olarak bilinen ileri-atama ve ön-atama arasında ayırt etmesi güç fark 09.04.2019
printf( “%d\n”, iCount++ ); İleri-atama ++ operatörü değişkenden sonradır Değişkenin, bulunduğu deyimde başlangıç değerinin kullanılmasına sebep olur VE DAHA SONRA değişkene 1 ekler Örneğin, int iCount = 5; printf( “%d\n”, iCount++ ); 5 yazacaktır... Fakat icount deyimden sonra 6 değerini alır 09.04.2019
printf( “%d\n”, ++iCount); ön-atama ++ operatörü değişkenden öncedir Bulunduğu deyimde kullanılmadan ÖNCE değişkenin başlangıç değerine 1 ekler Örneğin, int iCount = 5; printf( “%d\n”, ++iCount); 6 yazacaktır.. Ve icount deyimden sonra 6 değerini alır 09.04.2019
Daha fazla örnek ++ ileri-attırma ön-attırma int iTotal = 0; int iCount = 5; iTotal = iCount++ * 2; printf( “%d\n”, iTotal); printf( “%d\n”, iCount); iTotal için 10 yazacaktır ve sonra iCount için 6 iTotal = ++iCount * 2; iTotal için 12 yazacaktır ve sonra iCount için 6 09.04.2019
iCount-- ; or --iCount ; Azaltma Operatörü -- Yazım/çalışma olarak arttırma ile benzerdir Yazmak yerine iCount = iCount - 1; or iCount -= 1; Yazabilirsiniz iCount-- ; or --iCount ; İki yeni tercih olarak bilinen ileri-azaltma ve ön-azaltma arasında ayırt etmesi güç fark 09.04.2019
printf( “%d\n”, iCount-- ); İleri-azaltma -- operatörü değişkenden sonradır Değişkenin, kullanıldığı deyimde başlangıç değerinin kullanılmasına sebep olur VE DAHA SONRA değişkenden 1 çıkarır Örneğin, int iCount = 5; printf( “%d\n”, iCount-- ); 5 yazacaktır... Fakat iCount deyimden sonra 4 olacaktır 09.04.2019
printf( “%d\n”, --iCount); Ön-azaltma -- operatörü değişkenden öncedir Bulunduğu deyimde kullanılmadan ÖNCE değişkenin başlangıç değerini 1 azaltır Örneğin, int iCount = 5; printf( “%d\n”, --iCount); 4 yazacaktır.. Ve iCount deyimden sonra 4 olacaktır 09.04.2019
Daha fazla örnek ++ ileri-azaltma ön-azaltma int iTotal = 0; int iCount = 5; iTotal = iCount-- * 2; printf( “%d\n”, iTotal); printf( “%d\n”, iCount); iTotal için 10 yazacaktır ve daha sonra iCount için 4 iTotal = --iCount * 2; iTotal için 8 yazar ve iCount için 4 09.04.2019
Explanation Sample Operator Özet Tablosu Subtract 1 from c THEN use new value of c in expression c’den 1 çıkart ve SONRA yeni değeri bir deyimde kullan --c -- Use value of c in expression THEN subtract 1 from c c değerini bir deyimde kullan ve SONRA c’den 1 çıkart. c-- Add 1 to c THEN use the new value of c in expression c’ye 1 ekle ve SONRA c’nin yeni değerini bir deyimde kullan ++c ++ Use value of c in expression THEN add 1 to c c değerini bir deyimde kullan ve SONRA c’ye 1 ekle c++ Explanation Sample Operator 09.04.2019
Notlar Bu farkı görmeniz önemlidir. Benzettiğiniz her iki kod şeklinde de örnekler göreceksiniz. İşleri kolaylaştırmak için, yalnızca bu ders için, yalnızca ileri arttırma/azaltmalara ihtiyaç duyduğunuzdan emin olmaya çalışacağım. 09.04.2019
Uyarılar iTotal = iCount++ + ++iCount; [Of !] iTotal = (x + y)++ ; Önceliğin ANSI standartlarına dayalı olduğu yerlerde bazen karışıktır bu yüzden arttırma ve azaltma operatörlerini bir deyim içinde aynı değişken üzerinde bir kereden fazla kullanmayın iTotal = iCount++ + ++iCount; [Of !] Daha büyük deyimlerde işleyemezi ör: iTotal = (x + y)++ ; Aynı zamanda şartları test ederken veya kontrol döngülerinde kullanmak iyi bir fikir değildir if (x++ == 188 && x++ == 189) [ugh!] { } 09.04.2019
İyi Programlama Pratikleri Birli operatörleri arada boşluk bırakmaksızın doğrudan işlenenlerinin yanına yerleştirin 09.04.2019