PROGRAMLAMA DİLLERİNE GİRİŞ Ders 3: 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 ) { Console.WriteLine(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ı bulan program static void Main(string[] args) { int i, toplam = 0; for (i = 1; i <= 100; i += 1) toplam += i; } Console.WriteLine("Toplam = " + toplam); Döngüde tek komut yer aldığı için { ve } (blok başı ve sonu simgeleri) kullanılmayabilirdi. i değişkeni for döngüsü öncesinde tanımlandığı için for döngüsüne ait bloğun dışında da kullanılabilir.
Faktöriyel Hesabı Programı static void Main(string[] args) { int sayi, f = 1, i; Console.Write("Faktöriyeli bulunacak sayı? "); sayi = Convert.ToInt32(Console.ReadLine()); for (i = 2; i <= sayi; i++) f = f * i; Console.WriteLine(sayi + "! = " + f); } Döngüde tek komut yer aldığı için { ve } (blok başı ve sonu simgeleri) kullanılmadı.
Faktöriyel Hesabının Akış Şeması Başla Döngü sayısı belli ise akış şemalarında for döngüsü kullanımına benzer bir içerik yazıyoruz: f=1 sayı i,2,sayı,1 i, 2, sayı, 1 f=f*i i Döngü Değişkeni Başlangıç değeri Bitiş değeri Artım değeri f for (i = 2; i <= sayi; i++) Dur
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’da 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; Console.WriteLine("1) Toplama, 2) Çıkarma, 3) Çarpma, 4) Bölme, 5) Çıkış"); do { Console.Write("İşlemi seçin [1-5]: "); i = Console.ReadKey().KeyChar; Console.WriteLine(); if (i == '5') Environment.Exit(0); } while (i < '1' || i > '5'); ReadKey alt satıra almadığı için gerekli NOT: Geçen hafta 4 işlem programında GoTo kullanmak yerine bu kodu kullanabilirdik.
Girilen sayının asal olup olmadığını bulan akış şeması Kullanıcının girdiği sayının 2’den büyük ve sayı-1’den küçük olan tüm sayılara tam bölünüp bölünmediği kontrol edilir. Başla sayı Döngü içinde verdiğimiz sayi%i=0 (sayi mod i = 0) koşulu sağlandı ise asal olmadığı kesinleştiğinden, diğer sayılar için kontrol yapılmadan döngüden çıkılır. i,2,sayı-1,1 sayi%i=0 Evet Eğer i değişkeni sayi-1'i geçip sayi değerine ulaştıysa döngü sonuna kadar gidilmiş ve hiç bölen bulunamamış, yani sayı asal anlamına gelir. Hayır i 1) sayi-1 yerine sayi/2’ye kadar kontrol edilebilir (2 kat daha hızlı) 2) Sayının kareköküne kadar kontrol edilmesi de yeterli olur (bir sayı karekökünden büyük bir sayıya tam bölünebilir, ama o bölümün sonucu karekökünden küçük olacağı için, kareköke kadar bölen olup olmadığını kontrol etmek yeterlidir) Bu döngünün daha az adımda çalışması sağlanabilir mi? sayi=i Evet Sayı asal Hayır Sayı asal değil Bir sayı yarısından büyük bir sayıya tam bölünemeyeceği için sayi-1 yerine sayi/2 ye kadar döngü daha mantıklı olacaktır. Dur
WHILE ile Asal Sayı Bulma static void Main(string[] args) { int sayi, i = 2; Console.Write("Sayıyı giriniz : "); sayi = Convert.ToInt32(Console.ReadLine()); while (i <= sayi/2) { if (sayi % i == 0) break; // bölen bulundu i++; } if (i >= sayi/2) Console.Write("Sayı asal\n"); else Console.Write("Sayı asal değil\n"); Döngü sayısı belli olduğuna göre FOR döngüsü kullanmak daha mantıklı olur
FOR ile Asal Sayı Bulma static void Main(string[] args) { int sayi, i; Console.Write("Sayıyı giriniz : "); sayi = Convert.ToInt32(Console.ReadLine()); for (i = 2; i <= sayi/2; i++) { if (sayi % i == 0) break; // bölen bulundu } if (i >= sayi/2) Console.Write("Sayı asal\n"); else Console.Write("Sayı asal değil\n");
GOTO ile Asal Sayı Bulma static void Main(string[] args) { int sayi, i = 2; Console.Write("Sayıyı giriniz : "); sayi = Convert.ToInt32(Console.ReadLine()); döngü: if (sayi % i == 0) goto son; // bölen bulundu if (i <= sayi/2) { i++; goto döngü; } son: if (i >= sayi/2) Console.Write("Sayı asal\n"); else Console.Write("Sayı asal değil\n"); } Görüldüğü gibi GOTO ile de döngü kurulabilir ama yapılmaması tavsiye edilir
Girilen 15 sayıdan pozitif olanların adedini bulup görüntüleyen akış şemaları IF…GOTO FOR Döngüsü Başla Başla i=1, adet = 0 adet = 0 sayı i,1,15,1 sayı>=0 Evet sayı i=i+1 adet=adet+1 sayı>=0 Hayır Evet adet=adet+1 Evet i<15 Hayır i adet adet Dur Dur
Girilen 15 sayıdan pozitif olanların adedini bulup görüntüleyen program static void Main(string[] args) { int sayi, adet = 0; for (int i = 1; i <= 15; i++) Console.Write(i + ". sayı : "); sayi = Int32.Parse(Console.ReadLine()); if (sayi >= 0) adet++; } Console.Write("Pozitif adedi = " + adet);
Girilen 15 sayıdan pozitif olanların adedini bulup görüntüleyen program static void Main(string[] args) { int sayi, i = 1, adet = 0; döngü: Console.Write(i + ". sayı : "); sayi = Int32.Parse(Console.ReadLine()); if (sayi >= 0) adet++; if (i < 15) { i++; goto döngü; } Console.Write("Pozitif adedi = " + adet); } Sonraki derslerimizde tekrar etmesi gereken işlemleri bu şekilde IF…GOTO ile değil, FOR ve WHILE döngü ifadeleri ile yapacağız.
Girilen 10 sayıdan en büyüğünü bulan ve görüntüleyen akış şeması Kontrol İfadesiyle Döngü İfadesiyle Başla Başla Programı ödev olarak verilmişti Programı sonraki slaytta i=1, eb=0 i,1,10,1 sayı sayı sayı>eb Evet sayı>eb Evet i=i+1 eb=sayı eb=sayı Hayır Hayır Evet i<10 i eb eb Dur Dur
Girilen 10 sayıdan en büyüğünü bulan ve görüntüleyen program static void Main(string[] args) { int sayi, eb = 0; for (int i = 1; i <= 10; i++) Console.Write(i +". sayı : "); sayi = Int32.Parse(Console.ReadLine()); if (sayi > eb) eb = sayi; } Console.Write("En büyük sayı = " + eb); Kullanıcı tüm sayıları negatif girerse ne olur?
50 öğrencinin notlarının ortalamasını bulan akış şeması Başla toplam = 0 i,1,50,1 not toplam=toplam+not i ortalama=toplam/50 ortalama Dur
50 öğrencinin notlarının ortalamasını hesaplayıp görüntüleyen program static void Main(string[] args) { int notu, ortalama, toplam = 0; for (int i = 1; i <= 50; i++) Console.Write(i + ". not : "); notu = Convert.ToInt32(Console.ReadLine()); toplam += notu; } ortalama = toplam / 50; Console.Write("Notların ortalaması = " + ortalama); ortalama değişkeni olmasaydı: Console.Write("Notların ortalaması = " + toplam/50);
Ödevler Sayının yarısına kadar değil, daha da az sayıda döngü adımı ile asal sayı bulabilen bir yöntem bulun. 1 ile 1000 arasındaki asal ve mükemmel sayıları bulan ve ekranda görüntüleyen programı yazın. (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. 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.