Giriş Döngüler - Loops Bir ifade kümesinin tekrarlanması, yani birden fazla çalıştırılması işlemine döngü (loop) dendiği programlamaya giriş kısmında belirtilmişti. Bu derste döngülerin C programlama dilinde nasıl kurulacağı incelenecektir. ENF102 Jeoloji 2/47 Sayaç (counter) Kontrollü Döngüler Sayaç kontrollü bir döngüdeki temel öğeler Yapılacak tekrar miktarının bilindiği durumlarda döngü bir sayaç kullanarak tasarlanabilir. Sayaç aslında tekrar edilme işleminin ne kadar yapıldığını tutan bir değişkendir. ENF102 Jeoloji 3/47 Yukarıda da söylendiği gibi bir sayaç değişkeni olmalıdır. Bu değişken döngü sayacı (loop counter) olarak bilinir. Döngü sayacına bir atama ifadesiyle ilk değer verilir. Döngü sayacının değerinin sınır değere gelip gelmediği kontrol edilir. Döngünün gövdesinin her çalışmasından sonra, sayacın değeri artırma ya da eksiltme işlemi ile değiştirilir. ENF102 Jeoloji 4/47 GOTO Komutu Ekrana 10 defa programcının adını yazan algoritmayı-akış diyagramını ve C programını yazınız. int sayac; sayac=<başlangıç değeri>; BASLA <komut 1>; <komut 2>; <komut N>; sayac=sayac+ - <adım miktarı>; if (sayac > < >= <= = <bitiş değeri> ) goto BASLA; ENF102 Jeoloji 5/47 E BAŞLA Sayac=1 Veli Sayac=Sayac +1 Sayac 10 H DUR 1- BAŞLA 2- Sayac=1 3- YAZ Veli" 4- Sayac=Sayac+1 5- EĞER Sayac 10 ĐSE GĐT Adım 3 6- DUR ENF102 Jeoloji 6/47 ENF-102 Jeoloji 2011 1
C KODU FAKAT int sayac; sayac=1; /*sayac değişkenin ilk değeri veriliyor*/ BASLA printf( Veli\n ); sayac=sayac+1;/*sayac değişkeni 1 arttırılıyor*/ if(sayac <= 10 ) /*sınır değer ile karşılaştırılıyor*/ goto BASLA; ENF102 Jeoloji 7/47 go to komutu programların yapısallığını ve okunabilirliliğini azalttığı için pek tavsiye edilmez. Bu yüzden üzerinde ayrıntılı olarak durulmayacaktır. Zaten bu deyimi yeni öğreneceğiniz deyimlerden sonra kullanmak zorunda kalmayacaksınız. Bundan sonraki bütün örnek programlarda C programlama dilinin kendine has döngü yapılarını kullanılacaktır. ENF102 Jeoloji 8/47 while Döngüsü while ifadesinin yapısı Döngü oluşturmanın C dilinde birkaç değişik yolu vardır. Bunlardan en temeli while dongüsüdür. Bilindiği üzere Đngilizce "while" kelimesinin Türkçe karşılığı "-iken", "olduğu sürece" anlamlarına gelmektedir. Diğer deyimlerle yaratılabilen bir döngü, while kullanılarak da yaratılabilir. ENF102 Jeoloji 9/47 while ( koşul durum) Burada koşul durum mantıksal sonucu olan bir ifadedir. Koşul Durum değeri doğru olduğu sürece döngü içindeki komut ya da komutlar tekrarlanır. Eğer while deyiminden hemen sonra blok açılmamışsa kendisinden sonra gelen ilk (;) noktalı virgüle kadar olan yer döngü içi olarak kabul edilir. Elbette blok açılmışsa döngü içi, bloğun kendisi olacaktır. Koşul durum un değeri yanlış olduğunda tekrarlama işlemi sona erecektir. ENF102 Jeoloji 10/47 Eğer while ifadesine başlamadan önce koşulun değeri yanlış (0) ise, döngünün içi hiç çalıştırılmayacaktır. Eğer koşulun değeri sıfırdan farklı ise ifade bir kere çalıştırıldıktan sonra, while'ın başına geri dönülür ve koşul durum değerine tekrar bakılır. Döngü içine girilip girilmeyeceği bu sonuca bağlıdır. ENF102 Jeoloji 11/47 Eğer koşul durum değeri hiç bir zaman yanlış (0) olmazsa, program akışı döngü dışına çıkamayacağı için döngü içindeki komutlar sürekli tekrar edilecektir. Bu olay sonsuz döngü (infinite loop) olarak bilinir. Döngü içinde birden fazla komut tekrar edilecekse blok açılmalıdır. while ( koşul durum) komut 1; komut 2; komut N; ENF102 Jeoloji 12/47 ENF-102 Jeoloji 2011 2
while ifadesinin çalışma mantığı ÖRNEK KOD h e int sayac=1; while(sayac<=10) printf( Veli\n ); sayac=sayac+1; ENF102 Jeoloji 13/47 ENF102 Jeoloji 14/47 ÖRNEK 1 x=9; while (x>1) printf ( %d \n, x); x=x-1; ÖRNEK 2 x=5; while (x<5) printf ( %d \n, x); x=x-1; Bu örnek, bir atama ifadesi ve bir while döngüsünden oluşur. while döngüsünün çalışması parantez içerisindeki x>1 koşuluna bağlıdır. x değişkeninin ilk değeri 9 olarak belirlenmiştir. 9 değeri, 1'den büyük olduğundan sonuç doğru olacaktır. Böylece while döngüsünün içine girilir. Döngü içindeki ilk ifade olan printf("%d \n",x); çalıştırılır ve ekranax değişkeninin değeriyazdırılmış olur. Sonra döngü içindeki komutlardan sıra x = x - 1; işlemine gelir. x değişkeninin değeri 1 azaltılarak x e geri atanır. Program işleyişinde sıra blok kapama işaretine ( ) geldiğinde programakışı while satırınayönlendirilir. Bu örnekte programcı döngünün çalışma koşulunu yanlış yazmıştır. x değişkeninin ilk değeri 5 tir. 5 değeri, 5 den küçük olmayacağından sonuç yanlış olacaktır. ENF102 Jeoloji 15/47 ENF102 Jeoloji 16/47 ÖRNEK 3 x=5; while (x<=5) printf ( %d \n, x); x=x-1; Gözcü Kontrollü Döngüler (Sentinel Controlled Loops) Bu yazımda programcı döngünün çalışma koşulunu değiştirmiştir. x değişkeninin ilk değeri 5 olduğundan koşul sağlanacak ve döngü içine girilecektir. Fakat döngü içerisinde x değişkeni sürekli 1 azaldığından koşul sonucu asla yanlış olmaz. Hesaplanan bütün x değerleri her zaman 5 den küçük olacaktır. Bu kod parçası sonsuz döngüye girecektir. ENF102 Jeoloji 17/47 Çalıştırılması gereken adımların tekrar sayısının bilinmediği problemlerle karşılaşılabilir. Bu tür problemlerde program, kullanıcının dışarıdan belli bir değer ya da değer grubundan birini girdi olarak vermesiyle ya da program içinde üretilen belli bir değere göre sonlandırılır. ENF102 Jeoloji 18/47 ENF-102 Jeoloji 2011 3
ÖRNEK Klavyeden not değeri olarak -1 girilinceye kadar verilen notların ortalamasını ekrana yazan programı yazınız. Burada kaç adet not girileceği belirtilmemiştir. Kullanıcı isterse 4 nottan sonra -1, isterse de 100 nottan sonra -1 girebilir. Bu amaçla bir kontrol değeri (sentinel value) kullanılır. Bu çözümde sınav notu olamayacak bir değer olan - 1, kontrol değeri olarak seçilmiştir. Klavyeden normal olarak sınav notlarını girerken, en son değer olarak bu kontrol değeri girildiğinde; döngü çalışmasını durdurmalıdır. ENF102 Jeoloji 19/47 /*Not olarak -1 girilene kadarki notların ortalamasını bulur * / long toplam =0; /* Notların toplamı.đlk değer mutlaka sıfırlanmalı */ Đnt ogrencisayisi= 0, not; /* Öğrenci sayısı.đlk değer sıfırlanmalı */ float ortalama; printf ("Notu giriniz (sonlandırmak için -1) ); scanf ("%d", ¬); /* not -1 den farkli olduğu surece işlemlere devam et */ while (not!= -1) toplam = toplam + not; /* notu toplama ekle */ ogrencisayisi = ogrencisayisi + 1; /* Öğrenci Sayısını bir artır */ /* Diğer notu oku. Bu ifade tekrar yazılmazsa başka not okunamaz */ printf("notu giriniz (sonlandırmak için -1) "); scanf("%d",¬); if(ogrencisayisi!=0 ) /*Đlk çalıştığı anda -1 girilirse 0'a bölme hatası olmaması için kontrol */ ortalama= toplam / ogrencisayisi; printf("\n\nortalama %5.2f \n, ortalama); ENF102 Jeoloji 20/47 ÖRNEK Klavyeden girilen pozitif tamsayının faktöriyelini bulan programı yazınız. /*Bu program klavyeden girilen bir pozitif tamsayının faktoriyel degerini hesaplar, ve sonucu ekrana yazar.*/ int sayi, /* okunan tamsayı */ sayac=2; /* sayacdegiskeni */ long sonuc=1; /* sayinin faktoryel degeri */ printf("bir pozitif tamsayıgiriniz "); scanf("%d",&sayi); /* Tamsayiyioku */ while (sayi <= 0) /* Pozitif girilmesini sağlıyoruz */ printf("yanlış!!lütfenpozitif sayı giriniz "); scanf("%d",&sayi); /* Sayınınfaktöriyeldeğerini bulankısım */ while (sayac<= sayi) sonuc= sonuc * sayac; sayac= sayac+ 1; /* sonucu yaz */ printf("\ngirilen tamsayı %d \n",sayi); printf("faktöriyeli %d",sonuc); ENF102 Jeoloji 21/47 for Döngüsü for Döngüsü Döngü Koşulu for döngüsü özellikle tekrar edilen işlemlerin sayısı belli olduğunda kullanılan başka bir döngü yapısıdır. Bu tür durumlarda while deyiminden daha uygundur. for (DöngüDeğişkeni=ĐlkDeğer; DöngüKoşulu; AdımMiktarı) komut 1; komut N; ENF102 Jeoloji 23/47 Değeri her seferinde döngüye girmeden önce sorgulanır ve bu değer doğru ise döngü içine girilir ve komut ya da komutlar çalıştırılır. Döngü koşulunu yanlış (0) olması halinde döngüden çıkılır. Bu mantıksal deyimin değeri genelde döngü değişkeninin değerine bağlı olacak şekilde yazılır. ENF102 Jeoloji 24/47 ENF-102 Jeoloji 2011 4
Adım Miktarı Bir for ifadesi, her zaman bir while ifadesi olarak aşağıdaki gibi yeniden yazılabilir Döngünün gövdesini oluşturan komut ya da komutların işletilmesinden sonra çalıştırılacaktır. Görevi döngü değişkeninin değerini güncellemektir. Bu değişken üzerinde arttırma ya da azaltma yapılmak sureti ile bu işlem gerçekleştirilir. ENF102 Jeoloji 25/47 döngü değişkeni = ilk değer; while (döngü koşulu ) komut komutlar; AdımMiktarı; ENF102 Jeoloji 26/47 Birbirine denk döngü ifadeleri ÖRNEK for (i=1; i<=10; i++) Burada döngünün gövdesi olan komut, i değişkeninin 1'den 10'a kadar olan değerleri için 10 kere tekrar edilir. Döngü içine ilk girildiğinde i değişkenin değeri 1, ikinci girildiğinde 2 ve en son girildiğinde ise 10 olacaktır. ENF102 Jeoloji 27/47 ENF102 Jeoloji 28/47 ÖRNEK for (i=10; i>=1; i- =1) ÖRNEK Burada döngünün gövdesi olan komut, i değişkeninin 10'dan 1'e kadar olan değerleri için 10 kere tekrar edilir. Gövdeye ilk girildiğinde i değişkenin değeri 10, ikinci girildiğinde 9,... ve en son girildiğinde ise 1 olacaktır. Klavyeden girilen pozitif bir tamsayının asal olup olmadığını ekrana yazdıran c programını kodlayınız. (Bir ve kendisinden başka tam böleni olmayan sayıya asal denir. Yalnız 1 asal değildir. Asal sayılar 2,3,5,7,11,13,17, 19, 23,29, 31,...) ENF102 Jeoloji 29/47 ENF102 Jeoloji 30/47 ENF-102 Jeoloji 2011 5
/*Bu program klavyeden girilen sayının asal olup olmadığını bulur*/ int sayi, i, test=1; /*test sayi asal ise 1 değilse 0 değerini alacak*/ /*ilk değer olarak 1 almış ve sayı asal kabul edilmiştir*/ printf("sayıyı giriniz "); scanf("%d",&sayi); if(sayi==1) /*Klavyeden girilen sayı 1 ise */ test=0; /*test değişkenine 0 atanacak */ else /*sayi 1 değilse */ for(i = sayi-1; i>1 && test==1; i--) /*sayi-1 ile 2 arasındaki bütün sayıları elde et*/ if( sayi % i == 0 ) test=0; if(test) printf("sayı asaldır"); else sayılardır. printf("sayı asal değildir"); ENF102 Jeoloji 31/47 ENF102 Jeoloji 32/47 PROBLEM Sorunun açıklamasında asal sayı tanımı verilmiştir. Bir sayının asal olduğunu ispatlamak yerine olmadığını ispatlamak daha kolaydır. Çünkü kendisinden ve birden başka bir tane bile böleni varsa o sayı asal değildir. Bakılması gereken sayı aralığı; klavyeden girilen sayı dan bire kadar olan bütün do-while Döngüsü do-while Döngüsü while ifadesinde döngünün devam edip etmeyeceğini kontrol eden mantıksal deyimin değeri, döngü gövdesine girmeden kontrol edilir. Eğer değer hemen yanlış olur ise, while ifadesinin gövdesi hiç çalıştırılmadan döngüden çıkılır. do-while yapısında ise döngü koşulu döngü gövdesi çalıştırıldıktan sonra sorgulanır. Bu da, do-while döngüsü içindeki komut ya da komutların koşula doğruda olsa yanlış da olsa en az bir kere çalıştırılacak olması demektir. Bu yüzden, do-while ifadesi gövdesi en azından bir kere çalıştırılması gereken döngü yapılarının tasarımında kullanılabilir. ENF102 Jeoloji 34/47 Genel Kullanımı do komut while (koşul durum); do komut 1; komut N; while (koşul durum); while ( koşul ) ENF102 Jeoloji 35/47 Đç-Đçe Döngüler (Nested Loops) ENF-102 Jeoloji 2011 6
Đç-Đçe Döngüler (Nested Loops) Kod parçası adım adım çalıştırıldığında Bir döngü içerisinde başka bir döngü bulunuyorsa, bu tür yapılara iç-içe döngüler denir. Bu durumda içteki döngü dıştaki döngünün her adımında yeniden çalıştırılacaktır. Örneğin n = 0; for (i=1; i<=3; i++) /*dıştaki döngü*/ for (j=1; j<=3; j++) /içteki döngü*/ n=n+1; ENF102 Jeoloji 37/47 9 kerelik bir döngü ENF102 Jeoloji 38/47 ÖRNEK Aşağıdaki gibi bir piramit oluşturan program parçasını yazmak için iç-içe döngü kullanılabilir. Kod parçası adım adım çalıştırıldığında * ** *** **** ***** for (i=1; i<=5; i++) /*dıştaki döngü*/ for (j=1; j<=i; j++) /*içteki döngü*/ printf"* ); printf("\n"); ENF102 Jeoloji 39/47 ENF102 Jeoloji 40/47 break Deyimi break Deyimi Bu komut daha önceki switch case yapısında kullanılmıştı. Döngü içinde kullanılan break komutunun amacı, çalıştığı anda döngüyü sonlandırarak döngü dışına çıkılmasını sağlamaktır. Programın işleyişi, döngünün dışındaki ilk komuttan itibaren devam eder. ENF102 Jeoloji 42/47 ENF-102 Jeoloji 2011 7
Örnek /* break deyiminin uygulaması */ int i; for (i=0; i<=5; i++) if(i == 3) /*i'nin değeri 3 ise */ break; /*döngü dışına çık*/ printf( i= %d \n",i); ÇIKTI i=0 i=1 i=2 continue Deyimi ENF102 Jeoloji 43/47 continue Deyimi Örnek Döngü içinde kullanılan bu komutun amacı çalıştığı anda döngü içindeki geri kalan komutları işletmeden döngü başı yapılmasını sağlamaktır. Programın işleyişi döngü içindeki bu komuttan sonra verilen tüm ifadeler atlanarak döngü başına yönlendirilir. /* continue deyiminin uygulaması */ int i; for (i=0; i<=5; i++) if(i==3) /*i'nin değeri 3 ise */ continue; /* döngü başı yap*/ printf ( i = %d \n",i); ÇIKTI i=0 i=1 i=2 i= 4 i= 5 ENF102 Jeoloji 45/47 ENF102 Jeoloji 46/47 Kaynakça Programlamayı C ile öğreniyorum (2. Baskı), M. Yorulmaz, S. Yorulmaz, 2005, Ankara ENF102 Jeoloji 47/47 ENF-102 Jeoloji 2011 8