Professional Documents
Culture Documents
Algoritma 5
Algoritma 5
ve Algoritmalar
e-mail: yasemin.poyraz@iuc.edu.tr
DÖNGÜ DEYİMLERİ
Bir program parçasının yinelemeli olarak çalıştırılmasını sağlayan
kontrol deyimlerine "döngü deyimi" denir. 3 ayrı döngü deyimi vardır:
• while
• do while
• for
while Döngü Deyimi
while döngü deyiminin genel sözdizimi aşağıdaki gibidir:
while (ifade)
deyim;
• while anahtar sözcüğünü izleyen ayraç içindeki ifadeye kontrol ifadesi denir.
• Döngü gövdesini bir basit deyim, bos deyim, bileşik deyim ya da bir kontrol deyimi
oluşturabilir.
1. Önce kontrol ifadesinin sayısal değeri hesaplanır. Bu ifade mantıksal olarak değerlendirilir.
2. İfade 0 değerine sahipse, yanlış olarak yorumlanır. Bu durumda döngü gövdesindeki deyim
yürütülmez, programın akışı döngü deyimini izleyen ilk deyimle sürer.
3. Kontrol ifadesi sıfırdan farklı bir değere sahipse, doğru olarak yorumlanır bu durumda döngü
gövdesindeki deyim yürütülür.
int main()
{
int i = 0;
while (i < 100) {
printf("%d ", i);
++i;
}
return 0;
}
int main ()
{
char ch = 'A';
while (ch <= 'Z')
printf("%c ", ch++);
return 0;
}
Kontrol İfadeleri
• Herhangi bir ifade while döngüsünün kontrol ifadesi olabilir. Kontrol ifadesi bir işlev çağrısı içerebilir:
• Aşağıdaki while döngüsü, buyukharf fonksiyonu sıfır dışı bir değere geri döndüğü sürece, yani ch büyük
harf karakteri olduğu sürece döner.
while (buyukharf(ch)) {
/***/
}
• Aşağıdaki while döngüsü, buyukharf fonksiyonu 0 değerine geri döndüğü sürece, yani ch büyük harf
karakteri olmadigi sürece döner.
while (!buyukharf(ch)) {
/***/
}
• Kontrol ifadesini bir değişken de oluşturabilir. • Kontrol ifadesi bir değişmez de olabilir:
break;
• break deyimi bir döngü deyiminin gövdesinde kullanılabilir. Bir döngü deyiminin yürütülmesi sırasında break
deyimi ile karşılaşıldığında, döngüden çıkılır.
int main ()
{
int sayi;
while (1) {
printf("bir sayi girin : ");
scanf("%d", &sayi);
if (sayi < 0)
break;
printf("karekok %d = %lf\n", val, sqrt(sayi));
}
printf("donguden çikildi program sonlaniyor!\n");
return 0;
}
continue Deyimi
• continue anahtar sözcüğünü de doğrudan sonlandırıcı atom izler:
continue;
• Programın akışı bir döngü deyimi içinde continue deyimine geldiğinde döngünün bir sonraki turuna geçilir.
int sayial();
int asal(int);
while (1) {
sayi = sayial();
if (sayi < 0)
break;
/* deyimler */
if (asal(sayi))
continue;
/* deyimler */
}
• Bazı programcılar da continue deyimini döngü gövdesinde yer alacak bir bos deyime seçenek olarak kullanır.
int main()
{
int i = 10;
while (--i > 0); /* burada bir bos deyim var */
printf("%d\n", i);
return 0;
}
• Döngü gövdesini bloklamayı unutmaktır. Yani döngü gövdesindeki deyimin bir bileşik deyim
olması gerekirken, yanlışlıkla bir yalın deyim kullanılır.
int main()
{
int i = 1;
while (i <= 100)
printf("%d ", i);
i++;
return 0;
}
• if deyiminde olduğu gibi while ayracı içinde de karşılaştırma işleci olan "==" yerine
yanlışlıkla atama işleci "=" kullanılması.
while (x = 5) {
/***/
}
int main()
{
int i = 0;
while (i++ < 100)
;
printf("\n %d \n", i); /* ekrana 101 degerini basar. */
return 0;
}
n Kez Dönen while Döngüsü
• n bir pozitif tamsayı olmak üzere, n defa dönen bir while döngüsü oluşturmak için kod
kalıpları kullanılabilir.
• Aşağıda, bir tamsayının belirli bir üssünü hesaplayan ushesapla isimli bir işlev yazılıyor.
İşlev içinde yazılan while döngüsü, us değişkeninin değeri kadar döner, değil mi?
Bu durumda taban değişkeni, us kez kendisiyle çarpılmış olur.
1- Sayı, sıfır elde edilinceye kadar sürekli 10'a bölünüyor. basamakhesapla işlevinde, önce sayinin 0 olup olmadığı
sınanıyor. Eğer sayi 0 ise, 1 değeri ile geri dönülüyor. 0 sayısı da 1 basamaklıdır. Daha sonra oluşturulan while döngüsü
sayi!= 0 koşuluyla döner. Döngünün her turunda gövde içinde basamaksayisi değişkeninin değeri 1 artırılıyor. Daha
sonra sayi/= 10; deyimiyle sayi değişkeni onda birine eşitleniyor.
int main()
{
int x,sonuc;
printf("bir tamsayi girin :");
scanf("%d", &x);
sonuc = basamakhesapla(x);
printf("%d sayisi %d basamakli!\n", x, sonuc);
return 0;
}
2- Kendisine gönderilen bir tamsayının basamak değerlerinin toplamı ile geri
dönen toplambul isimli bir işlev tanımlanıyor:
int main()
{
int sayi;
printf("bir tamsayi girin :");
scanf("%d", &sayi);
printf("%d sayisinin basamaklari toplami = %d\n",sayi, toplambul(sayi));
return 0;
}
3- Kullanıcıdan istenilen bir sayının tersini ekrana yazdıran bir program.
int main()
{
int sayi;
printf("bir tamsayi girin :");
scanf("%d", &sayi);
printf("%d sayisinin tersi = %d\n", sayi, sayininTersi(sayi));
return 0;
}
4- Kullanıcıdan alınan bir sayının tam bölenlerini ekrana yazdıran bir program.
while (sayi != 1) {
while (sayi % k == 0) {
printf("%d ", k);
sayi /= k;
}
++k;
}
printf("\n");
}
int main()
{
int sayi;
printf("bir tamsayi girin :");
scanf("%d", &sayi);
tambolen(sayi);
return 0;
}
5- Aşağıdaki programda 3 basamaklı sayılardan
#include <stdio.h>
int main()
{
int k = 100;
if (y * y * y + o * o * o + b * b * b == k)
printf("%d\n", k);
++k;
}
return 0;
}
do while Döngü Deyimi
• do while döngü deyiminin genel sözdizimi aşağıdaki gibidir:
do
deyim;
while (ifade);
• while ayracından sonra sonlandırıcı atom bulunmalıdır. Yani buradaki sonlandırıcı atom, döngü
deyiminin sözdiziminin bir parçasıdır.
#include <stdio.h>
int main()
{
int sayi;
do {
printf("0 - 100 arasi bir deger girin : ");
scanf("%d", &sayi);
} while (sayi < 0 || sayi> 100);
1. İfade2: for ayracının ikinci kısmını oluşturan ifadeye kontrol ifadesi denir. Tıpkı while ayracı içindeki
ifade gibi, döngünün sürdürülmesi konusunda bu ifade söz sahibidir. Bu ifadenin değeri sıfırdan
farklı ise, yani "doğru" olarak yorumlanırsa, döngü sürer. Döngü gövdesindeki deyim yürütülür.
Kontrol ifadesinin değeri 0 ise, yani ifade yanlış olarak yorumlanırsa programın akışı for döngü
deyimini izleyen ilk deyimin yürütülmesiyle sürer.
2. İfade1: Birinci kısımdaki ifade genellikle döngü değişkenine ilk değer verme amacıyla kullanılır.
Ancak böyle bir zorunluluk yoktur.
3. İfade3: for ayracının üçüncü kısmındaki ifade, döngü gövdesindeki deyim ya da deyimler
yürütüldükten sonra, kontrol ifadesi yeniden sınanmadan önce ele alınır. Bu kısım çoğunlukla, bir
döngü değişkeninin artırılması ya da azaltılması amacıyla kullanılır.
Aşağıdaki programı inceleyin:
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 2; ++i)
printf("%d ", i);
printf("\nson deger = %d\n", i);
return 0;
}
Döngü değişkeninin tamsayı türlerinden birinden olması gibi bir zorunluluk yoktur. Döngü değişkeni,
gerçek sayı türlerinden de olabilir:
#include <stdio.h>
int main()
{
double i;
for (i = 0.1; i < 6.28; i += 0.01)
printf("%lf ", i);
return 0;
}
for Ayracı İçinde Virgül İşlecinin
Kullanılması
• Virgül işleci ile birleştirilmiş ifadelerin, soldan sağa doğru sırayla ele alındığını anımsayın.
• for döngülerinin birinci ve üçüncü kısmında virgül işlecinin kullanılmasına sık rastlanır.
#include <stdio.h>
int main()
{
int i, k;
for (i = 1, k = 3; i * k < 12500; i += 2, k += 3)
printf("(%d %d)", i, k);
return 0;
}
for Ayracı İçindeki ifadelerin Olmaması
• for döngü deyimi ayracının birinci kısmında bir ifade bulunmayabilir.
• 1'den 100'e olan kadar sayıların ekrana yazdırılmak istendiğini düşünelim. Döngü
değişkenine ilkdeğer verme işlemi, for ayracının birinci kısmından, for döngüsü dışına
alınabilir:
#include <stdio.h>
int main()
{
int i = 0;
for (; i < 100; ++i)
printf("%d ", i);
return 0;
}
• for döngü ayracının üçüncü kısmında da bir ifade bulunmayabilir.
#include <stdio.h>
int main()
{
int i = 0;
for (; i < 100;) {
printf("%d ", i);
i++;
}
return 0;
}
n 0'dan büyük bir tamsayı olmak üzere, aşağıdaki döngülerden hepsi n kez
döner.
• for döngüsü gövdesi içinde continue deyimi ile karşılaşıldığında, programın akışı for
ayracının üçüncü ifadesine gelir ve bu ifade ele alınır.
İç İçe Döngüler
• Bir döngünün gövdesini başka bir döngü deyimi oluşturabilir. Böyle yaratılan döngülere iç içe döngüler denir.
#include <stdio.h>
int main()
{
int i, k;
for (i = 0; i < 5; ++i)
for (k = 0; k < 10; ++k)
printf("(%d %d) ", i, k);
printf("\n\n(%d %d) ", i, k);
return 0;
}
i < 5 ifadesi doğru olduğu sürece içteki for döngü deyimi yürütülür.
Son yapılan printf çağrısı ekrana hangi değerleri yazdırır? Dıştaki döngü i < 5 koşuluyla döndüğüne göre
dıştaki döngüden çıktıktan sonra i değişkeninin değeri 5 olur.
İçteki for döngü deyiminin son kez yapılmasından sonra da k değişkeninin değeri 10 olur. Bu durumda en son
printf çağrısı ekrana (5 10) yazdırır.
İç İçe Döngülerde break Kullanılması
• İçteki bir döngünün gövdesinde break deyiminin kullanılması ile, yalnızca içteki
döngüden çıkılır:
while (1) {
while (1) {
if (ifade)
break;
/***/
}
/*iç döngüden break ile çıkıldığında akış bu noktaya gelir */
}
• Burada ikinci while döngüsü tek bir kontrol deyimi olarak ele alınacağı için bloklamaya
gerek yoktur.
Döngülerden Çıkış
1. Kontrol ifadesinin yanlış olmasıyla:
Bir işlev içinde yer alan return deyimi işlevi sonlandırdığına göre, bir döngü deyimi içinde return
deyimi ile karşılaşıldığında döngüden çıkılır.
break deyiminin kullanılması ile, programın akışı döngü deyimini izleyen ilk deyimle sürer.
goto deyimi ile bir programın akışı aynı işlev içinde döngünün dışında bir başka noktaya
yönlendirilebilir. Böylece döngüden çıkılabilir.