BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği
Döngüler Belirli bir sayıda ya da belirli bir koşul sağlanana kadar arka arkaya yapılması gereken işlemler için döngüler kullanılır. Böylece bilgisayarın sürekli yapacağı işlemler için aynı komutları tekrar tekrar yazmak zorunda kalmayız. IF ve GOTO komutlarının birlikte kullanımı ile de döngü kurulabilir, fakat en doğru yol belirli bir sayıda işlem yapmak için FOR, belirli bir koşul sağlanana kadar işleme devam etmek için ise WHILE döngülerini kullanmaktır.
FOR Döngüsü for ( int i = A ; i <= B ; i = i + C ) { ... } Örn: 1 ile 100 arasındaki tam sayıları görüntüleme: for ( int i = 1 ; i <= 100 ; i = i + 1 ) { printf("%d\n", i); Başlangıç Değeri Bitiş Değeri Artım Değeri Döngüde kontrol amaçlı kullanılan değişken i değişkeni döngü dışında geçerli olmayacaktır i++ yada i+=1 yazılabilir. 100’den 1’e görüntüleme: for (i = 100 ; i >= 1 ; i--)
1 ile 100 arasındaki sayıların toplamını hesaplayıp görüntüleyen program main() { int toplam = 0; for (int i = 1; i <= 100; i += 1) toplam += i; } printf("Toplam = %d", toplam); i değişkeninin for döngüsü içinde tanımlanması C++ dilinde mümkündür. Program kodunuz cpp değil de c uzantılı kaydedildi ise derleme C dilinde yapılacak ve hata verecektir. Döngüde tek komut yer aldığı için { ve } (blok başı ve sonu simgeleri) kullanılmayabilirdi.
Girilen 15 sayıdan pozitif olanların adedini bulup görüntüleyen program main() // AKIŞ ŞEMASI: HAFTA 2, ÖRNEK 7 { int sayi, adet = 0; for (int i = 1; i <= 15; i++) printf("%d. sayi : ", i); scanf("%d", &sayi); if (sayi >= 0) adet++; } printf("Pozitif adedi = %d", adet);
Girilen 10 sayıdan en büyüğünü bulan ve görüntüleyen program main() // AKIŞ ŞEMASI: HAFTA 2, ÖRNEK 14 { int sayi, eb = 0; for (int i = 1; i <= 10; i++) printf("%d. sayi : ", i); scanf("%d", &sayi); if (sayi > eb) eb = sayi; } printf("En buyuk sayi = %d", eb); Kullanıcı tüm sayıları negatif girerse ne olur?
50 öğrencinin notlarının ortalamasını hesaplayıp görüntüleyen program main() // AKIŞ ŞEMASI: HAFTA 2, ÖRNEK 8 { int notu, ort, toplam = 0; for (int i = 1; i <= 50; i++) printf("%d. not : ", i); scanf("%d", ¬u); toplam += notu; } ort = toplam / 50; printf("Notlarin ortalamasi = %d", ort); "ort" değişkeni olmasaydı: printf("Notlarin ortalamasi = %d", toplam / 50);
Faktöriyel Programı main() // AKIŞ ŞEMASI: HAFTA 2, ÖRNEK 9 { int sayi, fakt, i; printf("Faktoriyeli bulunacak sayi:"); scanf("%d", &sayi); fakt = 1; for (i = 2; i <= sayi; i++) fakt = fakt * i; printf("%d! = %d", sayi, fakt); }
Verilen koşul doğru olduğu sürece döngü devam eder. WHILE Döngüsü while ( koşul ) { ... if ( koşul ) break; } Verilen koşul doğru olduğu sürece döngü devam eder. Döngüden çıkmak için döngü içinde break ifadesi kullanılabilir (hem FOR hem de WHILE için geçerli). Eğer break bir if koşulu içinde kullanılmadıysa döngü bloğu içinde o satırın altındaki tüm satırlar gereksiz olacaktır.
WHILE ile Faktöriyel Programı main() // AKIŞ ŞEMASI: HAFTA 2, ÖRNEK 9 { int sayi, fakt = 1, i = 2; printf("Faktoriyeli bulunacak sayi:"); scanf("%d", &sayi); while (i <= sayi) { fakt = fakt * i; i++; } printf("%d! = %d", sayi, fakt); Döngü sayısı belli olduğuna göre FOR döngüsü kullanmak daha mantıklıydı. for (i = 2; i <= sayi; i++)
Koşulu döngü sonunda vermek Eğer döngüye koşul aranmadan girilmesi istenirse, döngünün sonunda da koşul kontrolü yapılabilir: do { ... } while ( koşul );
Kullanıcı hatalı giriş yaptığı sürece tekrar giriş istenmesi döngüsü char i; printf("1) Toplama, 2) Cikarma, "); printf("3) Carpma, 4) Bolme, 5) Cikis"); do { printf("Islemi seçin [1-5]: "); i = getchar(); if (i == '5') exit(0); } while (i < '1' || i > '5'); NOT: Geçen hafta 4 işlem programında GoTo kullanmak yerine bu kodu kullanabilirdik.
WHILE ile Asal Sayı Bulma main() { int sayi, i = 2; printf("Sayiyi giriniz : "); scanf("%d", &sayi); while (i <= sayi/2) { if (sayi % i == 0) break; // bölen bulundu i++; } if (i > sayi/2) printf("Sayi asal\n"); else printf("Sayi asal degil\n"); Bu programda kullanıcının girdiği sayının 2’den büyük ve sayı/2’den küçük olan tüm sayılara tam bölünüp bölünmediği kontrol edilir.
FOR ile Asal Sayı Bulma main() { int sayi, i; printf("Sayiyi giriniz : "); scanf("%d", &sayi); for (i = 2; i <= sayi/2; i++) { if (sayi % i == 0) break; // bölen bulundu } if (i > sayi/2) printf("Sayi asal\n"); else printf("Sayi asal degil\n");
GOTO ile Asal Sayı Bulma main() { int sayi, i = 2; printf("Sayiyi giriniz : "); scanf("%d", &sayi); dongu: if (sayi % i == 0) goto son; // bölen bulundu if (i <= sayi/2) { i++; goto dongu; } son: if (i > sayi/2) printf("Sayi asal\n"); else printf("Sayi asal degil\n"); } 2. hafta "Kontrol İfadesiyle" ibaresi ile verilen akış şemaları GOTO ile döngü kurmanın örnekleriydi. Fakat GOTO yerine FOR yada WHILE kullanmak daha geçerli çözümdür.
Ödevler Daha az sayıda döngü adımı ile asal sayı bulabilen bir algoritma geliştiriniz. 1 ile 1000 arasındaki asal ve mükemmel sayıları bulan ve ekranda görüntüleyen programı yazınız. (Mükemmel sayı: bölenlerinin toplamı kendisine eşit olan sayı... 28 = 1+2+4+7+14).
Ödevler Kullanıcıdan 2 sayı alıp bu sayıların en büyük ortak bölenini ve en küçük ortak katını bulan programı yazınız. Fibonacci serisi 0 ve 1 ile başlayıp, bir elemanın değerinin kendisinden önceki iki elemanın toplanması ile oluşturulduğu bir seridir: Kullanıcının klavyeden girdiği sayıda Fibonacci serisi elemanını gösteren programı yazınız.