BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL bayramakgul@bartin.edu.tr http://bmyo.bartin.edu.tr/akgul
Bugünkü Konular Döngüler ve Akış Diyagramları C# ‘ta Döngü Tanımlama while döngüsü do-while döngüsü for döngüsü foreach döngüsü (listelerde ve koleksiyonlarda kullanılır. Daha sonra işlenecektir.) İç içe döngüler Döngülerde kullanılan yardımcı ifadeler break continue goto Sonsuz döngüler
İç içe döngüler Döngüleri bir biri içinde kullanabiliriz Çoğu programlarda bu durum gerekiyor. Örnek: çarpım tablosu Sütunlar +---+---+---+---+---+---+---+---+---+---+---+ | *| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| | 1| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| | 2| 2| 4| 6| 8| 10| 12| 14| 16| 18| 20| | 3| 3| 6| 9| 12| 15| 18| 21| 24| 27| 30| | 4| 4| 8| 12| 16| 20| 24| 28| 32| 36| 40| | 5| 5| 10| 15| 20| 25| 30| 35| 40| 45| 50| Satırlar
Çarpım Tablosunu Ekrana Yazdırma /* tablo başlığı yazdıralım*/ Console.WriteLine("+---+---+---+---+---+---+---+---+---+---+---+"); Console.Write("| * |"); for (int i = 1; i <= 10; i++) Console.Write("{0,3}|", i); Console.WriteLine("\n+---+---+---+---+---+---+---+---+---+---+---+"); /* Tabloda: i satırları, j sütunları ifade edecek */ { Console.Write("|{0,3}|", i); /* i için tablonun bir satırını yazdır*/ for (int j = 1; j <= 10; j++) Console.Write("{0,3}|", i * j); } Console.WriteLine(); // bir satır ekle /* Tablonun alt çizgisini yazdır*/
Faktöriyel hesaplama n! = 1*2*3* .. *n int fakt = 1; for (int i = 1; i <= n; i++) fakt *= i; Klavyeden girilen n sayısına kadar olan sayıların faktöriyelini ekrana yazdıran bir program yazalım. Örneğin n=6 için: 0!=1 => 1 1!=1 => 1 2!=2 => 1*2 3!=6 => 1*2*3 4!=24 => 1*2*3*4 5!=120 => 1*2*3*4*5 6!=720 => 1*2*3*4*5*6 …
Faktöriyel hesaplama n değeri:8 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 using System; class Program { static void Main() int n, fakt = 1; Console.Write("n değeri:"); int.TryParse(Console.ReadLine(), out n); for (int i = 0; i <= n; i++) fakt = 1; for (int j = 1; j <= i; j++) fakt *= j; } Console.WriteLine("{0}! = {1}", i, fakt); Console.ReadLine(); n değeri:8 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320
İç içe döngüler devam Aşağıdaki şekli yapacak kod int n; 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 … int n; Console.Write("n değeri:"); int.TryParse(Console.ReadLine(), out n); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) Console.Write(j + " "); Console.WriteLine(); }
Döngü içinde break kullanımı switch ifadesinde break kodunun bizi switch ifadesi dışına attığını görmüştük. Benzer bir şekilde, break döngü içinde kullanıldığın da bizi geçerli döngünün dışına atar.
break kullanımı Döngü deyimlerinin içerisindekiler çalıştırılırken, döngünün, koşuldan bağımsız kesin olarak bitirilmesi gerektiğinde break deyimi kullanılır. Örneğin 1/x hesaplama: double x; do { Console.Write("x değeri:"); double.TryParse(Console.ReadLine(), out x); if (x == 0) break; // girilen değer 0 ise çık! Console.WriteLine(1 / x); } while (true);
Bir sürü sayının toplamını hesaplama 0 girilene kadar girilen sayının toplama eklenmesi isteniyor. int sayı, toplam = 0; while (true) /* sonsuz döngü*/ { Console.Write("bir sayı gir (durmak için 0): "); int.TryParse(Console.ReadLine(), out sayı); if (sayı == 0) break; /* döngünün dışına çık */ toplam += sayı; } Console.Write("toplam=" + toplam); Normalde sonsuz döngü, ancak kullanıcı 0 girince döngü break tarafından sonlandırılacaktır.
Girilen n sayısının asal olup olmadığını kontrol etme - Kendisi ve 1’den başka böleni olmayan sayılar asal sayılardır. int n, i; Console.Write("Bir sayı giriniz: "); int.TryParse(Console.ReadLine(), out n); for (i = 2; i < n; i++) { if (n % i == 0) break; } if (i < n) Console.Write("{0} sayısı {1} sayısına bölünüyor", n, i); else Console.Write("{0} sayısı asaldır!",n);
break (devam) Bazen döngüyü bitirme koşulu olarak ta kullanılır. Girilen sayının küpünü hesaplama: int n; while (true) { Console.Write("bir sayı girin veya bitirmek için 0: "); int.TryParse(Console.ReadLine(), out n); if (n == 0) break; Console.WriteLine("n=" + n + ", n*n*n*=" + n * n * n); }
break (devam) Döngüler iç-içe kullanılmış ise break sadece içinde kullanılan döngünün kod bloğunun dışına çıkarır. for (…) { … while(…) break; // while den çıkar ama hala for döngüsünde }
continue continue döngünün gövdesinde kullanılan yerden sonraki kısmı atlar ve kontrolü döngünün koşul kısmına alır. int sayı, adet = 0, toplam = 0; while (adet < 10) { Console.Write("Sayı Gir:"); int.TryParse(Console.ReadLine(), out sayı); if (sayı <= 0) continue; // kalan kısmı atlar adet++; toplam += sayı; } Console.WriteLine("Toplam = " + toplam); Klavyeden girilen 10 tane pozitif tam sayının toplamını ekrana yazma: Girilen sayı sıfırdan küçük veya eşit ise adet bir arttırılmayacak ve sayı toplama eklenmeyecektir.
continue x ve y bir birinden farklı olmak şartıyla |x|+|y|=4 eşitliğini sağlayan tamsayı çiftlerini ekrana yazdıran program: -4,0 -3,-1 -3,1 -2,2 -1,-3 -1,3 0,-4 0,4 1,-3 1,3 2,-2 3,-1 3,1 4,0 int x, y; for (x = -4; x <= 4; x++) { for (y = -4; y <= 4; y++) if (x == y) continue; //x=y ise atla if (Math.Abs(x) + Math.Abs(y) == 4) Console.WriteLine(x + "," + y); }
goto Kontrolü keyfi olarak kodun içinde işaretlenmiş (etiketlenmiş) bir yere aktarmak için kullanılır. goto ifadesinin kullanımı katı bir şekilde istenmez. Kodu anlaşılmaz ve bakımı zor hale getirir. while (…){ … switch(…){ goto dongu_tamam; /* break burada bizi sadece*/ … /* switch ten çıkarabilir */ } /* switch-sonu */ } /*while-sonu */ dongu_tamam:
goto goto ifadesi C# programlama dilinde iyileştirilmiştir. goto ifadesi ile etiketlere, switch içinde ki case ve default durumlarına geçilebilir.
goto örnek: int a ; ... switch (a) { case 4: Console.Write("case 4'e geldi."); string b = Console.ReadLine(); Console.Write(b); break; case 5: Console.Write("case 5'ten case 4'e git"); goto case 4; default: Console.Write("default kısmı"); }
using System; class Program { static void Main() Random r = new Random(); int s = r.Next(1, 11); int i = 0, sayı; tekrarla: Console.Clear(); Console.Write("Kalan Tahmin sayısı: " + (5 - i)); Console.WriteLine("\n 1 ile 10 arasında bir sayı giriniz:"); int.TryParse(Console.ReadLine(), out sayı); i++; if (sayı == s) goto tebrikler; if (i == 5) goto bulamadınız; else goto tekrarla; tebrikler: Console.WriteLine("Tebrikler {0}. tahminde buldunuz.", i); goto son; bulamadınız: Console.WriteLine("Tahmin hakkınız bitti. Kaybettiniz!"); son: Console.WriteLine("Oyun Bitti!"); Console.ReadLine(); } goto ile oyun: Bilgisayarın 1 ile 10 aralığında rastgele tuttuğu bir sayıyı 5 tahminde bulmak için yazılmış kod:
Sonsuz Döngüler Sınırsız sayıda tekrar eden döngülerdir. Koşul sürekli olarak sağlanırsa döngü sonsuz döngü olmuş olur. while (true) { … } do { … } while (true); for (;;) { … } while (1 < 2) { … } do { … }while (1 == 1); for (;true;) { … }
Sonsuz döngülerden nasıl çıkılır? Peki bu tür döngülerden nasıl çıkabiliriz? Basitçe döngünün bir yerlerine “break” koyarak. int n; while (true) { Console.Write("bir sayı girin veya bitirmek için 0: "); int.TryParse(Console.ReadLine(), out n); if (n == 0) break; Console.WriteLine("n=" + n + ", n*n*n*=" + n * n * n); }
Dinlediğiniz için teşekkürler… Öğr. Gör. Bayram AKGÜL