Döngü Yapıları-3

Download Report

Transcript Döngü Yapıları-3

BPR152 ALGORİTMA VE
PROGRAMLAMA - II
Öğr. Gör. Bayram AKGÜL
[email protected]
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
2
İç 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
Satırlar
+---+---+---+---+---+---+---+---+---+---+---+
| *| 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|
+---+---+---+---+---+---+---+---+---+---+---+
3
Ç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 */
for (int i = 1; i <= 10; i++)
{
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*/
Console.WriteLine("+---+---+---+---+---+---+---+---+---+---+---+");
4
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
2!=2
3!=6
4!=24
5!=120
6!=720
…
=>
=>
=>
=>
=>
=>
=>
1
1
1*2
1*2*3
1*2*3*4
1*2*3*4*5
1*2*3*4*5*6
5
Faktöriyel hesaplama
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);
}
n değeri:8
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
Console.ReadLine();
}
}
6
İç içe döngüler devam
• Aşağıdaki şekli yapacak kod
1
1
1
1
1
…
2
2 3
2 3 4
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();
}
7
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.
8
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);
9
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;
toplam += sayı;
/* döngünün dışına çık */
}
Console.Write("toplam=" + toplam);
• Normalde sonsuz döngü, ancak kullanıcı 0 girince
döngü break tarafından sonlandırılacaktır.
10
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);
11
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);
}
12
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
…
}
…
…
}
13
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.
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.
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);
14
continue
• x ve y bir birinden farklı olmak şartıyla
|x|+|y|=4 eşitliğini sağlayan tamsayı
-4,0
çiftlerini ekrana yazdıran program:
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);
}
}
-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
15
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:
…
16
goto
• goto ifadesi C# programlama dilinde
iyileştirilmiştir.
• goto ifadesi ile etiketlere, switch içinde ki
case ve default durumlarına geçilebilir.
17
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ı");
break;
}
18
goto ile oyun:
• Bilgisayarın 1 ile
10 aralığında
rastgele tuttuğu
bir sayıyı 5
tahminde bulmak
için yazılmış kod:
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();
}
}
19
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
{
for (;true;)
{
…
}
…
}while (1 == 1);
20
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);
}
21
DINLEDIĞINIZ IÇIN
TEŞEKKÜRLER…
Öğr. Gör. Bayram AKGÜL
22