Döngüler, belirli bir işlemi belirli bir sayıda ya da sonsuza dek tekrarlamak için kullanılmaktadır. Örneğin programımızda sıfırdan 1000’e kadar olan sayıları yazdırmamız gerektiğini düşünelim. Bunun için her sayı için bir satır kod yazmamız gerekir. Ancak döngü kullanırsak, bir satır kodu programımıza 1000 kez tekrarlatabiliriz.
Bu güne kadar yaptığımız örneklerin hepsinde kullandığımız while sonsuz döngüsünü fark etmişsinizdir. Bu sonsuz döngü programı sürekli başa sarıp taramak için kullanılmıştır.
1 2 3 4 5 |
void main(){ while(true){ // burada sonsuz döngümüz başlar // Bu alana yazılan kodlar sonsuz defa tekrarlanır } // burada döngümüz sona erer ve başa döner } |
Döngüler, belirlenen şartlar doğru olduğu müddetçe tekrarlanan kod bloklarıdır.
CCS C dilinde 3 adet döngümüz bulunmaktadır. Bunlar;
Şimdi bu döngüleri teker teker ele alalım.
Dersimiz boyunca aşağıdaki devre üzerinde deneme yapacağız. Programılarımızı 4MHz kristal osilatör bağladığımızı varsayarak yazdık. Siz farklı kristal osilatör kullanabilirsiniz ancak kristal osilatör değerini program üzerinden değiştirmeyi unutmayınız.
Yapısı en basit olan döngümüzdür. While döngüsünde while(şart) komutumuz ile döngümüz başlar. Döngümüzün devam etme şartı while parantezleri arasına yazılır. Bu parantezler arasındaki değer TRUE sonuç döndürdüğü mütletçe döngümüzün küme parantezleri içerisindeki kodlar tekrar tekrar çalışır. Taki while parantezleri arasına yazdığımız şart FALSE sonuç döndürünceye kadar.
Şimdi wihile döngümüzü bir örnek ile anlatmaya çalışalım;
Örneğin bir ledi bir saniye aralıklarla yakıp söndürelim ve bu işlemi 7 kez tekrarlatacağımız kodlarımızı yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <16f877a.h> // kullanacağımız denetleyicinin başlık dosyasını dahil ettik #use delay(crystal=20000000) // osilatör frekansımız void main(){ // ana fonksiyonumuzun başlangıcı output_b(0); // b portu tüm pinlerini sıfırladık int sayi = 0; // sayi adında integer değişken tanımlayıp 0 değerini atadık while(sayi <= 7){ // While döngüsü oluşturduk ve sayi değişkeni değeri 7'den küçük ya da 7'ye eşit olduğu mühletçe döngü devam etsin dedik output_high(pin_B1); // output_toggle komutu ile B1 pinine bağlı ledin konumunu değiştirdik delay_ms(1000); // 1 saniye bekleme verdik output_high(pin_B1); delay_ms(1000); sayi++; // sayi değişkeni değerini bir artırdık } // döngü sonu parantezi } // main fonksiyonu sonu |
Yukarıda gördüğünüz üzere döngü şart değişkeni olan integer türü sayi değişkenini döngüden önce tanımladık;
int sayi = 0
Döngü şartını döngünün başında while parantezleri arasında belirledik;
while(sayi <= 7) ; Bu demek oluyor ki sayi değişkeni değeri 7 den küçük ya da 7’ye eşit olduğu yani şartın true değer döndürdüğü mühletçe döngü devam etsin.
Programımız B1 pinine bağlı ledimizi 7 kez yakıp söndürdü. Her bir döngüde, döngü değişkeni olan sayi++ komutu ile sayi değişkenimizin değerini bir artırdık. Sayi değişkeni değeri 7’den büyük olunca ise döngü sona erdi ve programımız sona erdi.
For döngüsünde döngü değişkeni ve döngü şartı for parantezi içerisinde tanımlanır. Yine döngü değişkeni aynı şekilde döngü for parantezi içerisinde işleme tabi tutulur.
For döngüsü sözdizimi aşğıdaki gibidir;
1 2 3 |
for(döngü değşkeni tanımlama; döngü şartı; döngü değişken işlemi){ // döngüde çalışacak kodlar buraya yazılır } |
Örnek olarak yukarıda while döngüsüyle yaptığımız işlemi bir de for döngüsü ile yapalım. Yani B1 pinine bağlı ledi 7 kez yakıp söndürelim;
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <16f877a.h> // kullanacağımız denetleyicinin başlık dosyasını dahil ettik #use delay(crystal=4000000) // osilatör frekansımız void main(){ // ana fonksiyonumuzun başlangıcı output_b(0); // b portu tüm pinlerini sıfırladık for(int sayi = 0; sayi <= 7; sayi++){ // for döngüsü başlangıcı output_high(pin_b1); // B1 pinindeki ledi yak delay_ms(1000); // 1000 ms yani 1 saniye beklet output_low(pin_b1); // B1 pinindeki ledi söndür delay_ms(1000); // 1000 ms yani 1 saniye beklet } // for döngüsü sonu } // main fonksiyonu sonu |
Yukarıdaki programın 6. satırında for(int sayi = 0; sayi <= 7; sayi++){ komutuyla for döngümüzü başlattık. Buradaki kodları ele alırsak;
for() bizim döngü deyimimizdir
int sayi = 0; komutumuz ile döngüde kullanacağımız değişkenimizi tanımlıyoruz. Döngümüz integer türünden tanımladığımız sayi değişkenine göre çalışacağını birdiriyoruz.
sayi <= 7; komutumuz ile döngü şartımızı belirliyoruz. sayi değişkenimizin değeri 7’den küçük ya da 7’ye eşit olduğu yani şartın true değer döndürdüğü mühletçe döngümüzün devam edeceğini söylüyoruz.
sayi++ komutumuz ile her döngü sonunda sayi değişkenimizi 1 artıracağız.
Döngü küme parantezleri içerisine yazdığımız kodlar 7 kez çalışacaktır.
Do-While döngüsünde döngü do komutu ile başlar ve ardından döngü parantezine girilir. Döngü parantezi içerisindeki kodlar çalıştırılır ve while komutu ile döngü şartı kontrol edilir. Şartlar sağlanıyorsa döngü tekrar başa döner ve çalışmaya devam eder. Şartlar sağlanmıyorsa döngü sona erer. Anlaşıldığı üzere do-while döngüsünde şartlar sağlansa da, sağlanmasa da döngü bir defa mutlaka çalışır.
Do-While döngüsünde While döngüsünde olduğu gibi döngü değişkeni döngü dışında tanımlanır, şart while parantezi içerisinde yazılır ve döngü değişkeni döngü parantezi içerisinde işleme tabii tutulur.
Sözdizimi aşağıdaki gibidir;
1 2 3 4 |
do{ // do-while döngüsü başlangıcı //buraya dongü süresince çalışacak kodlar yazılır // döngü değişkeni burada işleme tabii tutulur }while(sart); // döngü sonu, while komutu ile döngü şartı yazılır |
Şimdi yine yukarıdaki döngülerde verdiğimiz örneği do-while döngüsü ile yapalım;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <16f877a.h> // kullanacağımız denetleyicinin başlık dosyasını dahil ettik #use delay(crystal=4000000) // osilatör frekansımız void main(){ // ana fonksiyonumuzun başlangıcı output_b(0); // b portu tüm pinlerini sıfırladık int sayi = 0; // döngü değişkeni do{ // do-while döngüsü başlangıcı output_high(pin_b1); // B1 pinindeki ledi yak delay_ms(1000); // 1000 ms yani 1 saniye beklet output_low(pin_b1); // B1 pinindeki ledi söndür delay_ms(1000); // 1000 ms yani 1 saniye beklet sayi++; }while(sayi <=7); // do-while döngüsü sonu } // main fonksiyonu sonu |
Yukarıdaki örnekte görüldüğü üzere döngü dışında integer türü sayi adında bir değişken tanımladık. Bu değişkene göre döngüyü çalıştıracağız.
Ardından do{ komutu ile döngüye girdik. Döngü parantezi içerisindeki kodlar çalıştı. Döngü sonunda }while(sayi <= 7); komutu ile döngümüzün sayi değişkeni 7’den küçük ve 7’ye eşit olduğu yani şartın true değer döndürdüğü mühletçe çalışacağını programımıza bildirdik.
Görüldüğü üzere döngülerimiz çok basit ve kullanışlı yapılardır. Ancak şartlar doğru yazılmadığında döngümüz sonsuz döngüye girebilir ve programımızın yanlış çalışmasına neden olabilir.