Ders 3 - Altan MESUT - Trakya Üniversitesi

Download Report

Transcript Ders 3 - Altan MESUT - Trakya Üniversitesi

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 ) {
Başlangıç
Bitiş
Artım
...
Değeri
Değeri
Değeri
}
Döngüde kontrol amaçlı kullanılan değişken
Örn: 1 ile 100 arasındaki tam sayıları görüntüleme:
for ( int i = 1 ; i <= 100 ; i = i + 1 )
i++ yada i+=1
{ i değişkeni döngü dışında geçerli olmayacaktır
yazılabilir.
Console.WriteLine(i);
}
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)
{
Döngüde tek komut yer aldığı
toplam += i; için { ve } (blok başı ve sonu
simgeleri) kullanılmayabilirdi.
}
Console.WriteLine("Toplam = " +
toplam);
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
f=1
sayı
i,2,sayı,1
Döngü sayısı belli ise akış
şemalarında for döngüsü
kullanımına benzer bir içerik
yazıyoruz:
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
Dur
for (i = 2; i <= sayi; i++)
WHILE Döngüsü
koşul doğru olduğu
while ( koşul ) { Verilen
sürece döngü devam eder.
...
if ( koşul ) break;
...
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(); ReadKey alt satıra almadığı için gerekli
if (i == '5') Environment.Exit(0);
} while (i < '1' || i > '5');
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
sayi=i
Evet
Sayı asal
Bu döngünün daha az adımda
çalışması sağlanabilir mi?
Hayır
Sayı asal
değil
Dur
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.
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
Evet
i=i+1
sayı>=0
Hayır
Evet
adet=adet+1
sayı
Evet
sayı>=0
i<15
Hayır
adet
Dur
i
adet
Dur
adet=adet+1
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
i=1, eb=0
sayı
sayı
Evet
i=i+1
sayı>eb
Hayır
Evet
i<10
eb
Dur
Programı
sonraki slaytta
i,1,10,1
Evet
eb=sayı
sayı>eb
Hayır
i
eb
Dur
eb=sayı
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
1. 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.
2. 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
3. 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.
4. 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.