ELN1001 – BİLGİSAYAR PROGRAMLAMA I Tekrarlamalar - Döngüler Dallanmalar Tekrarlama - Döngü Pekçok program tekrarlama veya döngü mantığını içermektedir. Döngü, döngü devam koşulu sağlandığı sürece programın tekrar tekrar bir veya daha fazla program satırını işletmesidir. Şu ana kadar iki tipte tekrarlama mantığı üzerinde durulmuştur: Sayaç kontrollü tekrarlama Sonlandırıcı kontrollü tekrarlama 1 Sayaç kontrollü tekrarlama Zaman zaman kesin tekrarlama olarak da adlandırılır. Bunun sebebi, döngünün tekrarlama sayısının önceden biliniyor olmasıdır. Tekrarların sayısını tutmak için kullanılan değişkene kontrol değişkeni adı verilir. Kontrol değişkeni (genellikle) ilgili satırlar grubu işletildikten sonra bir arttırılır. Kontrol değişkeni, baştan belirlenmiş değere geldiği zaman, döngüden çıkılır ve döngüden sonraki satırdan program çalışmaya devam eder. Sonlandırıcı kontrollü tekrarlama Kaç tekrar yapacağı önceden bilinmediği durum için Döngü, her tekrar için çalıştıracağı satır veya satırları içerir. Sonlandırıcı, tekrarları sona erdirmek için kullanılır. Sonlandırıcı, gereken tüm bilgiler girildikten sonra girilmelidir. Sonlandırıcı, giriş bilgileri kümesinde yer alan bilgilerden kesinlikle farklı olmalıdır. 2 Sayaç kontrollü döngü Sayaç kontrollü döngü şu elemanlara ihtiyaç duyar: Kontrol değişkeninin (veya döngü sayacının) adı Kontrol değişkeninin ilk değeri Her tekrarda kontrol değişkenin arttırılması (veya azaltılması) Kontrol ifadesinin koşulu yanlış yapacak nihai değeri Sayaç Kontrollü Tekrarlama - Örnek #include “stdio.h” /* main fonksiyonuyla program çalışmaya başlar */ int main(void) { int sayac = 1; /* sayacı tanımla ve ilk değer ata */ while (sayac <= 10) { /* Tekrarlama koşulu */ printf(“%d\n”,sayac); /* Sayac değerini ekrana yazdır */ ++sayac; /* sayacı arttır */ } /* while döngüsü sonu */ return 0; /* Programın başarıyla tamamlandığını raporla */ 1 2 3 4 5 6 7 8 9 10 } 3 Sayaç Kontrollü Tekrarlama Kontrol değişkeni veri tipini tamsayı olarak seçmek, birçok hatayı engelleyecektir. Her kontrol ifadesi bloğunda gereken satırbaşı boşluklarının bırakılması programların anlaşılabilirliğini arttıracaktır. Kontrol ifadelerinden önce ve sonra birer satır boşluk bırakılması, kontrol bloklarının ayırt edilmesini kolaylaştıracaktır. Yazım esnasında bırakılmış satır arası ve satırbaşı boşlukları, programa iki boyutlu bir görüntü sağlayabilecek ve anlaşılabilirliğini ciddi şekilde kolaylaştıracaktır. İçiçe oluşturulmuş çok sayıda döngü, anlaşılabilirliği zorlaştıracaktır, Genel kural olarak, iç içe üç döngüden fazla döngü kullanılmamasına dikkat edilmelidir. for tekrarlama ifadesi for ifadesi, tek başına tüm sayaç kontrollü tekrarlama detaylarını tutmaktadır. for ifadesi çalışmaya başladığında: kontrol değişkenine bir ilk değer atar. döngü devam koşulu test edilir. kontrol değişkeninde ihtiyaç duyulan değişiklik gerçekleştirilir. test koşulu doğru olduğu sürece, ifade içindeki kod bloğu çalıştırılır. test koşulu bozulur bozulmaz for döngüsünde çıkılarak bir sonraki kod satırından devam edilir. 4 for tekrarlama ifadesi while döngüsü for döngüsü #include “stdio.h” #include “stdio.h” int main(void) { int sayac = 1; int main(void) { int sayac; while (sayac <= 10) { printf(“%d\n”,sayac); sayac++; } for (sayac=1; sayac <= 10; sayac++) { printf(“%d\n”,sayac); } return 0; return 0; } } Kontrol değişkeni gereken ‘;’ gereken ‘;’ for (sayac=1; sayac <= 10; sayac++) for anahtar kelimesi Kontrol değişkeni ilk değer atama Döngü devam koşulu Kontrol değişkeni değer değişimi for tekrarlama ifadesi Kontrol değişkenine ilk değer atama, döngü devam koşulu ve kontrol değişkeni değişimi, sayılar yerine aritmetik ifadeler de içerebilir. for (j = x; j <= 4*x*y; j += y / x) x yerine 2, y yerine 10 koyarak ifade for (j = 2; j <= 80; j += 5) Değişiklik negatif de olabilir, bu durumda aşağıya doğru sayma gerçekleştirilir. Eğer, döngü devam koşulu başlangıçta yanlışsa, döngünün blok kısmındaki satırlar hiç işletilmez. Yürütme, döngüden sonraki satırla devam eder. Kontrol değişkeni, sıklıkla blok satırlarında kullanılır, fakat kullanılmak zorunda değildir. for akış diyagramı, while akış diyagramı ile benzerdir. 5 for tekrarlama ifadesi - Örnek Problem: 2’den 100’e kadar olan çift sayıların toplamı #include<stdio.h> Toplamı tanımla ve ilk değerini sıfırla sayı adında kontrol değişkenini tanımla int main(void) { int toplam = 0; int sayi; sayı ilk değerini 2 yap, sayı değerini her tekrarda 2 arttır, sayı değeri 100’e eşit ve küçük olduğu sürece kod bloğunu işlet sayıyı toplama ekle for (sayi = 2; sayi <= 100; sayi += 2) { toplam += sayi; } toplamı ekrana yazdır printf(“Toplam = %d”,toplam); fonksiyondan çık return 0; } do…while tekrarlama ifadesi while tekrarlama ifadesine çok benzerdir. while tekrarlama ifadesinde döngü devam koşulu, döngü bloğundaki kod satırları işletilmeden test edilir. Koşul sağlanmıyorsa bloktaki kodlar çalıştırılmadan döngüden çıkılır. do…while tekrarlama ifadesinde döngü devam koşulu, döngü bloğundaki kod satırları gerçekleştirildikten sonra test edilir. Böylece, kod bloğunun en az bir kere çalıştırılması garanti edilir. Tekrarlama ifadelerinin tümünde, sonsuz döngü oluşmaması için, koşulun nihai olarak bozulması garanti edilmelidir. 6 do…while tekrarlama ifadesi - Örnek while döngüsü do…while döngüsü #include “stdio.h” #include “stdio.h” int main(void) { int sayac = 1; int main(void) { int sayac = 0; do { printf(“%d\n”,sayac); ++sayac; } while (sayac <= 10) while (sayac <= 10) { printf(“%d\n”,sayac); ++sayac; } return 0; return 0; } } do…while tekrarlama ifadesi – Akış Diyagramları do…while while Kod bloğu Koşul Doğru Kod bloğu Doğru Koşul Yanlış Yanlış 7 switch…case çoklu seçim ifadesi Bir algoritma, bir değişkenin ve ifadenin alabileceği farlı değerlere göre, farklı kod satırlarının işletilmesini gerektiren bir kararlar dizisini içerebilir. Buna çoklu seçim adı verilmektedir. C programlama dili bu çoklu seçim meselesinde kullanılmak üzere switch…case ifadesini sağlamıştır. Switch…case ifadesi, bir dizi case ile etiketlenmiş değerler dizisini ve seçime bağlı olarak default durumunu içerir. switch…case ifadesi - Örnek Problem: Mevcudu bilinmeyen bir sınıfın başarı durumu çıkarılmak istenmektedir. Buna göre kullanıcı klavyeden harf notlarını girecek ve işlem sonunda, hangi harf notunu kaç öğrencinin aldığı raporlanacaktır. Geçerli harf notları A,a,B,b,C,c,D,d,F,f’dir. Geçerli bir harf notu girilmediği takdirde, kullanıcı uyarılacak ve notu yeniden girmesi istenecektir. 8 switch…case ifadesi – Örnek problem Sahte kod Girilen notları tutacak değişkeni tanımla A, B, C, D, F notlarının sayısını tutmak için ayrı ayrı değişkenler tanımla Ekrana kullanıcının harf notlarını girmeye başlaması için uyarı bastırın Ekrana, kullanıcının girişi sonlandırmak için gereken sonlandırıcıyı bastırın Girilen not sonlandırıcı olmadığı sürece aşağıdaki kod bloğunu işlet notun değerine göre gerekeni yap ‘A’ durumu: ‘a’ durumu: A notlarının sayısını arttır (switch) döngüden çık ‘B’ durumu: ‘b’ durumu: B notlarının sayısını arttır (switch) döngüden çık switch…case ifadesi – Örnek problem Sahte kod ‘C’ durumu: ‘c’ durumu: C notlarının sayısını arttır (switch) döngüden çık ‘D’ durumu: ‘d’ durumu: D notlarının sayısını arttır (switch) döngüden çık ‘F’ durumu: ‘f’ durumu: F notlarının sayısını arttır (switch) döngüden çık default: (hiçbiri değilse) girilen notun geçerli not olmadığını söyleyip, geçerli not girmesini iste (switch) döngüden çık Sonuçları ekrana bastırın 9 switch…case ifadesi – Örnek problem Akış diyagramı Başla Girilen not değişkenini tanımla Not sayısı tutucu değişkenlerini tanımla Kullanıcıdan not girişi yapmasını iste Ekrana uyarıyla sonlandırıcı tanımlamasını yazdır Evet A notlarının sayısını ekrana bastır B notlarının sayısını ekrana bastır C notlarının sayısını ekrana bastır D notlarının sayısını ekrana bastır F notlarının sayısını ekrana bastır Girilen not sonlandırıcı mı? Hayır Girilen not A veya a? Evet A not tutucusunu 1 arttır Hayır Girilen not B veya b? Evet B not tutucusunu 1 arttır Hayır switch…case ifadesi – Örnek problem Akış diyagramı Girilen not C veya c? Evet C not tutucusunu 1 arttır Hayır Girilen not D veya d? Evet D not tutucusunu 1 arttır Hayır Girilen not F veya f? Evet F not tutucusunu 1 arttır Hayır Geçerli not girmesi için kullanıcıyı uyar Bitir 10 switch…case ifadesi – Örnek problem Program Kodları #include <stdio.h> int main(void) { int not; int aSayisi, bSayisi, cSayisi, dSayisi, fSayisi; aSayisi = bSayisi = cSayisi = dSayisi = fSayisi = 0; printf(“Notları giriniz.\nSonlandırmak için EOF karakterini giriniz.\n”); while ( (not = getchar() ) != EOF) { switch (not) { case ‘A’: case ‘a’: aSayisi++; break; case ‘B’: case ‘b’: bSayisi = bSayisi++; break; case ‘C’: case ‘c’: cSayisi = cSayisi++; break; switch…case ifadesi – Örnek problem Program Kodları case ‘D’: case ‘d’: aSayisi++; break; case ‘F’: case ‘f’: bSayisi = bSayisi++; break; default: printf(“Geçersiz not girdiniz.\nYeniden giriş yapınız.\n”); break; } } printf(“Not toplamları:\n”); printf(“A: %d”, aSayisi); printf(“B: %d”, bSayisi); printf(“C: %d”, cSayisi); printf(“D: %d”, dSayisi); printf(“F: %d”, fSayisi); return 0; } 11 break ifadesi break ve continue ifadeleri akışın kontrolünü değiştirmek için kullanılır. break ifadesi, kullanıldığı while, do…while, for veya switch ifadesinden ani çıkış yapmak için kullanılır. Yürütme, ifadeden hemen sonra gelen satırla devam eder. break ifadesinin genel kullanımı bir döngüden erken çıkış veya switch ifadesinin kalan kısımlarını atlama amaçlıdır. continue ifadesi continue ifadesi, kullanıldığı while, do…while, for veya switch ifadesinde içinde kendinden sonraki satırları atlayarak, döngünün koşul satırına ilerler. 12 break - Örnek continue break #include <stdio.h> #include <stdio.h> int main(void) { int x; int main(void) { int x; for (x = 1; x <= 10;x++) { for (x = 1; x <= 10;x++) { if (x == 5) { break; } if (x == 5) { continue; } printf(“%-3d”,x); } printf(“%d. adımda döngünün dışına çıkıldı”,x); printf(“%-3d”,x); } return 0; return 0; } } 1 2 3 4 5. Adımda döngünün dışına çıkıldı 1 2 3 4 6 7 8 9 10 Problem1: Kusursuz Sayılar 1 dahil kendisi hariç olmak üzere tüm çarpanlarının toplamı kendisine eşit olan sayılara kusursuz sayı adı verilmektedir. Örneğin 6 sayısı, çarpanları 1 + 2 + 3 = 6’dır ve mükemmel sayıdır. Üst fonksiyon tarafından gönderilen değişkenin değerinin kusursuz sayı olup olmadığını belirleyen bir kusursuz_sayi fonksiyonu yazınız. Bu fonksiyonu 1’den 1000’e kadar olan sayılar içindeki kusursuz sayıları bulan bir ana fonksiyonun içinden çağırınız. Bulunan sayıları ekrana bastırınız. 13 Problem 1: Sahte kod ANA FONKSİYON sayacı tanıt ve ilk değerini sıfırla sayac 1000’den küçük veya eşit olduğu sürece aşağıdaki kodu tekrarla kusursuz_sayi fonksiyonunu çağır fonksiyondan dönen değeri al eğer fonksiyondan dönen değer 1 ise (yani sayı kusursuz sayı ise) sayıyı ekrana bastır sayacı bir arttır programdan çık KUSURSUZ_SAYI FONKSİYONU sayi değişkenini tanıt ve üst fonksiyondan gelen değeri bu değişkene yükle bölen değişkenini tanıt ve ilk değerini 1’ eşitle bölenler_toplamı değişkenini tanıt ve ilk değerini sıfırla bölen değişkeni sayi değişkeninin değerinden küçük olduğu sürece aşağıdaki kodu tekrarla sayiyi bölene bölerek kalanı belirle eğer kalan 0 ise bölenler_toplamı değişkenine böleni ekle böleni 1 arttır eğer bölenler_toplamı sayıya eşitse üst fonksiyona 1 döndür ve fonksiyondan çık değilse üst fonksiyona 0 döndür ve fonksiyondan çık Problem 2: Asal Sayılar Bir sayı yalnızca kendisine ve 1’e bölünüyorsa o sayıya asal sayı adı verilmektedir. Örneğin 2,3,5 ve 7 asal sayıdır ancak 4,6,8,9 değildir. Üst fonksiyon tarafından gönderilen değişkenin değerinin asal sayı olup olmadığını belirleyen bir asal_sayi fonksiyonu yazınız. 1’den 1000’e kadar olan sayılar içindeki asal sayıları bulan bir ana fonksiyon yazınız. Bulunan asal sayıları ekrana bastırınız. 14 Problem 2: Sahte kod ANA FONKSİYON sayacı tanıt ve ilk değerini sıfırla sayac 1000’den küçük veya eşit olduğu sürece aşağıdaki kodu tekrarla asal_sayi fonksiyonunu çağır fonksiyondan dönen değeri al eğer fonksiyondan dönen değer 1 ise (yani sayı asal sayı ise) sayıyı ekrana bastır sayacı bir arttır programdan çık ASAL_SAYI FONKSİYONU sayi değişkenini tanıt ve üst fonksiyondan gelen değeri bu değişkene yükle bölen değişkenini tanıt ve ilk değerini 2’ye eşitle bölen değişkeni sayi değişkeninin değerinden küçük olduğu sürece aşağıdaki kodu tekrarla sayiyi bölene bölerek kalanı belirle eğer kalan 0 ise ust fonksiyona 0 döndür ve fonksiyondan çık böleni 1 arttır üst fonksiyona 1 döndür ve fonksiyondan çık SORULAR? 15