Download as pdf or txt
Download as pdf or txt
You are on page 1of 26

Programlamaya Giriş

ve Algoritmalar

Araş. Gör. Dr. Yasemin POYRAZ KOÇAK

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.

• while ayracını izleyen ilk deyime döngü gövdesi denir.

• Döngü gövdesini bir basit deyim, bos deyim, bileşik deyim ya da bir kontrol deyimi
oluşturabilir.

• while döngü deyiminin yürütülmesi söyle olur:

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:

while (x) { while (1) {


/***/ /***/
} }
break Deyimi
• break anahtar sözcüğünü doğrudan sonlandırıcı atom izler:

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.

Aşağıdaki programı inceleyin:

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.

while (i++ < 100)


continue;
Sık Yapılan Hatalar
• while döngü deyiminin gövdesinin yanlışlıkla boş deyim yapılması

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) {
/***/
}

• Kontrol İfadesinde Sonek Konumundaki ++ ya da – İşlecinin Kullanılması

Böyle bir durumda, önce ifadenin değerine bakılarak döngünün sürdürülüp


sürdürülmeyeceği kararı verilir, sonra artırma ya da eksiltme işlecinin yan etkisi kendisini
gösterir.

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.

while (n-- > 0) ya da while (n--)

• Aşağıda, bir tamsayının belirli bir üssünü hesaplayan ushesapla isimli bir işlev yazılıyor.

int ushesapla(int taban, int us)


{
int sonuc = 1;
while (us--)
sonuc *= taban;
return sonuc;
}

İş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 basamakhesapla(int sayi)


{
int basamaksayisi = 0;
if (sayi == 0)
return 1;
while (sayi != 0) {
basamaksayisi++;
sayi /= 10;
}
return basamaksayisi;
}

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 toplambul(int sayi)


{
int toplam = 0;
while (sayi) {
toplam += sayi % 10;
sayi /= 10;
}
return toplam;
}

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 sayininTersi(int sayi)


{
int ters_sayi = 0;
while (sayi) {
ters_sayi = ters_sayi * 10 + sayi % 10;
sayi /= 10;
}
return ters_sayi ;
}

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.

void tambolen(int sayi)


{
int k = 2;

printf("(%d) -> ",sayi);

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

abc == a ^ 3 + b ^ 3 + c ^ 3 eşitliğini sağlayanlar ekrana yazdırılıyor:

#include <stdio.h>

int main()
{
int k = 100;

while (k < 1000) {


int y = k / 100;
int o = k % 100 / 10;
int b = k % 10;

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);

• do while döngüsünde kontrol ifadesi sondadır.

• 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.

do while döngüsünün yürütülmesi aşağıdaki gibi olur:


1. do anahtar sözcüğünü izleyen deyim döngüye girişte bir kez yapılır,
2. while ayracı içindeki kontrol ifadesine bakılır.
3. Kontrol ifadesi doğru olduğu sürece döngü gövdesini oluşturan deyim yapılır.

do while döngüsünün while döngüsünden farkı nedir?


while döngüsünde döngü gövdesindeki deyimin en az bir kez yapılması güvence altında değildir. Ancak
do while döngüsünde kontrol sonda yapıldığı için gövdedeki deyim en az bir kez yapılır.
main işlevinde do while döngüsü ile kullanıcı, 0 – 100 aralığında bir değer girmeye
zorlanıyor. Eğer girilen değer 0'dan küçük ya da 100'den büyükse, kullanıcıdan yeni bir
değer isteniyor.

Aşağıdaki programı derleyerek çalıştırın:

#include <stdio.h>

int main()
{
int sayi;

do {
printf("0 - 100 arasi bir deger girin : ");
scanf("%d", &sayi);
} while (sayi < 0 || sayi> 100);

printf(«sayi = %d\n", sayi);


return 0;
}
for Döngü Deyimi
for döngü deyiminin genel sözdizimi aşağıdaki gibidir:

for (ifade1; ifade2; ifade3)


deyim;

for ayracı içindeki her üç ifadenin de ayrı ayrı işlevi vardır.

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.

Aşağıdaki döngü deyimini inceleyin:

#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.

• Bu tamamen kurallara uygun bir durumdur.

• 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.

• Döngü değişkeninin artırılması ya da eksiltilmesi, for ayracı içi yerine, döngü


gövdesinde gerçekleştirilebilir.

#include <stdio.h>

int main()
{
int i = 0;
for (; i < 100;) {
printf("%d ", i);
i++;
}
return 0;
}

• Birinci ve üçüncü ifadesi olmayan for döngüleri, while döngüleriyle tamamen


eşdeğerdir.

• while döngüleriyle yazılabilen her kod, bir for döngüsüyle de yazılabilir.

• while döngüsü, birinci ve üçüncü kısmı olmayan for döngülerine okunabilirlik


açısından daha iyi bir seçenek olur.
n Kez Dönen for Döngüleri

n 0'dan büyük bir tamsayı olmak üzere, aşağıdaki döngülerden hepsi n kez
döner.

1. for (i = 0; i < n; ++i)


2. for (i = 1; i <= n; ++i)
3. for (i = n - 1; i >= 0; --i)
4. for (i = n; i > 0; --i)

for Döngülerinde continue Deyiminin Kullanımı


• Bir döngünün gövdesi içinde continue deyiminin kullanılması ile, gövde içinde
geriye kalan deyimlerin atlanarak döngünün bir sonraki turuna geçilir.

• 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;
}

Dıştaki for döngüsünün gövdesindeki deyim, bir başka for döngüsüdür.

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:

Aşağıdaki örneği inceleyin:

while (1) {
while (1) {
if (ifade)
break;
/***/
}
/*iç döngüden break ile çıkıldığında akış bu noktaya gelir */
}

• Eğer iç içe döngülerden yalnızca içtekinden değil de döngülerin hepsinden birden


çıkmak istenirse bu durumda goto kontrol deyimi kullanılmalıdır.

• 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:

Döngü deyimlerinin, kontrol ifadelerinin doğru olduğu sürece döndüğünü biliyorsunuz.

2. return deyimi ile:

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.

3. break deyimi ile:

break deyiminin kullanılması ile, programın akışı döngü deyimini izleyen ilk deyimle sürer.

4. goto deyimi ile:

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.

5. Programı sonlandıran bir işlev çağrısı ile:

Standart exit ya da abort işlevleri ile programın kendisi sonlandırılabilir.


Bir döngüden çıkmak amacıyla, kontrol ifadesinin yanlış olmasını sağlamak için döngü değişkenine
doğal olmayacak bir biçimde değer atanması, programın okunabilirliğini bozar. Böyle kodlardan
kaçınmak gerekir.

You might also like