Temel C Programlama -16- For Döngüsü

C dilinde döngüler aslında birbirine benzer yapıda olup döngü blokları içerisinde belli bir şarta bağlı olarak program akışını döndüren yapılardır. Yapı olarak döngü bakımından değil yöntem bakımından farklılıkları vardır. Çoğu zaman bu döngüleri birbiri yerine kullanma imkanımız olur. Yine de “yazılı olmayan” belli başlı kurallara göre bu döngüleri kullanırsak daha kaliteli program ortaya çıkarırız. C dilindeki döngüler for, while ve do..while döngüleridir.

for döngüsü

C dilinde for döngüsü anlaması en kolay döngüdür. O yüzden bu döngüyü en başta anlatma kararı aldık. for döngüsünün bütün kontrol elemanları tek bir yerde toplanır ve buradan bütün döngüyle alakalı işler yürütülür. Bu yüzden hazır yazılmış bir programa baktığınızda döngünün kaç kere çalışacağını, hangi şarta bağlı olduğu gibi durumları rahatça görebilirsiniz. Siz de program yazarken tek satırda bütün döngü işini bitirdiğinizden kafanız rahat eder. Acaba döngüden çıkamayacak mıyım?, Döngü şartlarını sağladım mı? gibi sorularla kafanızı yormazsınız. Fakat for döngüsünün biz dezavantajı (kullanımından dolayı olan dezavantajı) döngü blokunu belli bir miktar çalıştırmasıdır. Hemen bir for örneğin yapalım ve bunun nasıl işlediğini görelim. Siz de ne demek istediğimizi böylelikle anlayacaksınız.

#include <stdio.h>
#include <stdlib.h>
int main() {

	for (int i = 0; i <= 20; i++)
	{
		printf("%i ", i);
	}
 printf("\n");
 system("PAUSE");
 } // Main Sonu

Programı derleyip çalıştırdığımızda şu şekilde bir ekran görüntüsü alırız.

Burada biz yazmasak da 0’dan itibaren saymaya başlandığını ve 20 ye kadar bu sayma işleminin devam ettiğini görüyoruz. Bizim yazdığımız komut sadece printf(“%i “, i); komutuydu ve bu komut da i değişkenini ekrana yazdırıyordu. O halde bu yazdırma işini 0’dan 20’ye kadar tekrar tekrar yürüten ve her yürütmede i değişkenini bir artıran bir program yapısı olmalıdır.

for (int i = 0; i <= 20; i++) yapısı ile bütün döngü işlemlerini bir arada topluyoruz. for anahtar kelimesinin ardından parantez içerisine noktalı virgüller ile üç ayrı komut yazılıyor. Bunlardan birincisi tanımlama komutu, ikincisi şart komutu, üçüncüsü ise artırma komutudur. Bundan sonra noktalı virgül gelmediğine dikkat ediniz. for yapısını sınırlandırmak için ise süslü parantezleri kullanmaktayız. Şimdi örnek bir for yapısını inceleyelim ve anlattıklarımızı söz diziminde toplayalım.

for ( ilk_tanim; şart; artırma)
{  // for başlangıcı
    komutlar;
    komutlar;
    komutlar;
} // For bitişi

for ( ilk_tanim; şart; artırma)
komut; // tek komut yapısı

Öncelikle for iskeletini üç ana unsurun oluşturduğunu görüyoruz. İstersek bunları esgeçebiliriz artırmayı blok içinde yapabiliriz veya ilk tanım değerini önceden tanımladığımız bir değişken olarak alabiliriz. Bu yönde bir esneklik bize verilse de olması gereken for yapısını başlangıçta biz inceleyelim. for döngüsü bir değişkenin değerine göre alt tarafta süslü parantez ile sınırlandırdığımız kod blokunu çalıştırmaya devam eden döngü yapısıdır. Biz ilk tanımda döngü değişkenini tanımlarız ve buna ilk değeri veririz. Örneğin burada int i = 0 değerini verdik. Artık döngü değişkeninin adını da değerini de biliyoruz. Değeri 0 olan bir değişken üzerinde çalışıyorsak bu değişkenin bir değere ulaşması bizim ilk tercihimiz olmalıdır. O halde i <= 20 diyoruz. Şart yapısındaki ilişki operatörleri 1 sonucunu verdikçe bizim döngümüz dönmeye devam edecektir. Bu döngünün sonsuza kadar dönmemesi için şartın bir şekilde bozulması gereklidir değil mi?, o halde biz şartı bir süre sonra bozma adına i değişkenini i++ diyerek her döngü döndükçe birer birer artırıyoruz. Sonuçta önceden hesapladığımız gibi döngümüz 21 kere dönüyor ve döngü değişkeni her döngü dönünce ekrana değerini yazdırıyor. Sonrasında 21 olunca ise program döngüden çıkıyor ve akışına devam ediyor.

Biz şimdi programı sonsuz döngüye sokarak biraz eğlenelim. Bunun için döngü şartına devam etmesi için gereken rakamı yani 0’dan farklı bir rakamı yazmamız yeterlidir. Bu ilişki operatörleri olmadan döngünün nasıl çalıştığını görmeniz adına güzel bir örnek olacaktır.

#include <stdio.h>
#include <stdlib.h>
int main() {

	for (int i = 0; 20; i++)
	{
		printf("%i ", i);
	}
 printf("\n");
 system("PAUSE");
 } // Main Sonu

Biz burada for (int i = 0; 20; i++) diyerek for döngüsünün şart kısmına 20 yazdık. Mantıksal olarak 0’dan farklı her değerin DOĞRU anlamında olduğunu düşünürsek bu döngüyü durdurmamız mümkün değildir. Programı çalıştırdığımızda ise program ileriye doğru bütün hızıyla saymaya başlayacaktır. Bilgisayarı biraz daha açık bırakırsanız milyarları bulduğunu görebilirsiniz.

Böyle kontrolden çıkmış bir programı yazmayı kimse istemez. O yüzden döngü şartlarına dikkat etmemiz gereklidir. Şimdi ise döngü şartını değişken değeri ile elde edelim. Döngüden çıkmak için 0 değerinin elde edilmesi gerektiğini biliyoruz. Bunun için ilişki operatörlerine çok daha ihtiyaç yoktur. Önemli olan döngü değişkeninin bir şekilde 0 olması gereklidir. Şimdi bunu ilişki operatörleri olmadan yapalım.

#include <stdio.h>
#include <stdlib.h>
int main() {

	for (int i = 20; i; i--)
	{
		printf("%i ", i);
	}
 printf("\n");
 system("PAUSE");
 } // Main Sonu

Burada programa dokunmadık ama sadece tek satırlık döngü yapısını yani for (int i = 20; i; i–) komutunda değişiklik yaptık. Ne kadar literatürde artırım dense de i++ yazmamız şart değildir. Burada şimdi biz i– yazdık ve i değişkenine ilk değeri 20 olarak verdik. Programda döngü dönecek fakat bir noktaya kadar bu sürecektir. Bu nokta da i değerinin 0 olmasıdır. Bunu sağlamak için her döngü başında i– ifadesiyle i değerini bir azaltıyoruz. Program her döngüde printf(“%i “, i); komutu ile döngü değişkenini yazdıracaktır. Şimdi programın nasıl çalıştığına bir bakalım.

Görüldüğü gibi aslında ilişki operatörlerine de gerek yokmuş. Ama ilişki operatörlerini kullanmak mantıksal işlemleri ve günlük hayattaki olayları programa aktarmada işimizi kolaylaştırmaktadır. Assembly dilinde programlama yaparken döngülerde kullandığımız dallanma komutlarını denetleyen ALU durum bitleri bulunur. Döngüler bu durum bitlerine göre çalışmaktadır. En sık kullanılan durum biti de sıfır değeri bayrağıdır. Yani makine komutlarıyla bir program yazdığımızda sıfır elde edilene kadar döngü çalışsın şeklinde bir komutu kullanırız. Burada da buna benzer bir kullanımda bulunduk. Fakat yüksek seviye programlamada bu ilişki operatörleri bizim program akışını daha iyi anlayabilmemizi sağlar. Biz burada for döngüsünün esnekliğini ve döngü mantığını anlatmak için böyle kod yazıyoruz.

Şimdi ise döngüyü biraz daha esnetelim ve döngü yapısını programın farklı yerlerine taşıyalım.

#include <stdio.h>
#include <stdlib.h>
int main() {
	int i = 1;
	for ( ; i <= 20 ; )
	{
		printf("%i ", i);
		i++;
	}
 printf("\n");
 system("PAUSE");
 } // Main Sonu

Görüldüğü gibi burada nasrettin hoca ve leylek fıkrasında olduğu gibi ortada for döngüsüne benzer bir şey kalmadı. Ama bu halde bir sonraki anlatacağımız döngüye oldukça benzedi. Artık for döngüsü sadece i değerinin 20’den küçük veya 20’ye eşit olup olmadığına bakıyor ve aradığı şartı sağlıyorsa döngüyü çalıştırmaya devam ediyor. i değişkenini de yukarıda yani döngüye girmeden önce main fonksiyonu içerisinde tanımladık. Bu i’yi artırma işlemini de döngünün içerisinde yaptık. Sonuçta aynı işi yapan bir programı yazmış olduk.

Genelde eğitimlerde for döngüsü belli bir sayıda komutu çalıştırmaya yönelik döngü olarak anlatılsa da aslında sadece bir döngüdür. Farklı diğer döngülerden daha derli toplu olmasıdır ve belli bir amaca yönelik kullanılmasıdır. Bu amaç da döngü blokunu belli bir sayıda çalıştırmak üzeredir. Fakat bu alışkanlığa bağlı bir durumdur. for döngüsünde artırma ya da azaltma işleminin birer birer yapıldığını gördünüz. Aslında bu nokta ne artırma ne de azaltma noktasıdır. İstediğiniz karmaşıklıkta matematiksel işlemi yapabilirsiniz.

#include <stdio.h>
#include <stdlib.h>
int main() {

	for (int i = 1; i <= 1000000; i = i + i )
	{
		printf("%i \n", i);
	}
 printf("\n");
 system("PAUSE");
 } // Main Sonu

Bu program 1 milyona kadar ikinin kartlarını döngü değişkeninde hesaplar ve bize bildirir. Programın çıktısı şu şekildedir.

Siz de artık for döngüsü üzerinde oynamalar yaparak pek çok şeyi yazdırabilirsiniz. Görüldüğü gibi for döngüsü oldukça esnek ve pek çok işlemi döngüler sayesinde zaman kaybetmeden yapabiliyoruz. Döngülerin kullanım alanına dair daha işe yarar bir örnek olarak sizlere faktöriyel hesaplama programını gösterebiliriz. Bu program kullanıcının girdiği sayının faktöriyelini for döngüsüyle hesaplamakta ve ekrana yazdırmaktadır.

#include <stdio.h>
#include <stdlib.h>
int main() {
	 int c, n;
	 long long faktoriyel = 1;

	  printf("Faktoriyel Alinacak Sayiyi Giriniz\n");
	  scanf("%d", &n);

	  for (c = 1; c <= n; c++)
	    faktoriyel = faktoriyel * c;

	  printf("%d Faktoriyeli = %I64d \n", n, faktoriyel);
 printf("\n");
 system("PAUSE");
 } // Main Sonu

Bu program gerçekten işe yarar bir programdır çünkü faktöriyel değerini long long olarak tanımladık. Bilindiği üzere 20’nin faktöriyeli bile kentrilyonları geçtiği için çok uzun değerleri taşıyabilecek bir değişken lazımdır. Diğer faktöriyel hesaplama programlarında int olarak tanımlanmakta ve hemen taşma yapmaktadır. Şimdi programın çıktısını verelim ve sonrasında bu hesaplamayı nasıl yaptığını inceleyelim.

Görüldüğü gibi faktöriyelimiz hesaplanıyor ve ekrana yazdırılıyor. Şimdi fonksiyonda önemli olan hesaplama kısmını inceleyelim.

for (c = 1; c <= n; c++)
faktoriyel = faktoriyel * c;

Görüldüğü gibi bir for döngüsünden ibaret olan fonksiyon bütün işi yapmakta. Öncelikle c değeri 1’e eşitlenmekte ve c değeri n değerinden küçük ya da n değerine eşit oldukça birer birer adım döngü komutu yürütülmektedir. Döngü komutu ise faktoriyel değerine sürekli faktöriyel ve c’nin çarpımlarını ekler. Burada c değerlerini ve faktöriyel değerini daha iyi görüp anlamanız için bu değerleri ekrana yazdırarak komutu düzenleyelim.

#include <stdio.h>
#include <stdlib.h>
int main() {
	 int c, n;
	 long long faktoriyel = 1;

	  printf("Faktoriyel Alinacak Sayiyi Giriniz\n");
	  scanf("%d", &n);

	  for (c = 1; c <= n; c++)
	  {
	    printf("\n Faktoriyel: %I64d \n C: %i \n", faktoriyel, c);
	    faktoriyel = faktoriyel * c;
	  }

	  printf("\n %d Faktoriyeli = %I64d \n", n, faktoriyel);
 printf("\n");
 system("PAUSE");
 } // Main Sonu

Şimdi bütün program aşamalarını ekranda görebiliriz.

Görüldüğü gibi faktoriyel değeri her defasında C değeri ile çarpılıyor ve katlanarak devam ediyor. faktoriyel = faktoriyel * c; komutu faktoriyel değerini c ile çarpıp bunu faktöriyel içerisine tekrar atmaktadır. Görüldüğü gibi döngüler olmadan bizim girdiğimiz değerin kaç defa çarpıma uğrayacağı bilinemezdi. O yüzden döngüler ve şartlar programlamanın olmazsa olmaz parçalarındandır. Şimdi for döngüsünü bu matematik işlemleri ile değil basit işleri yapmak için kullanalım. Bir konsol ekranına “Hoş Geldiniz” mesajı yazmak istiyoruz fakat bunu süslemeye ihtiyacımız var. Bunun için şöyle bir program yazalım.

#include <stdio.h>
#include <stdlib.h>
int main() {
 for (int i = 0; i < 50; i++)
 {
	 printf("*");
 }
 puts("\nHos Geldiniz!!!!");
 for (int i = 0; i < 50; i++)
 {
	 printf("*");
 }
 printf("\n");
 system("PAUSE");
 } // Main Sonu

Şimdi programın nasıl bir çıkış verdiğine bakalım.

Burada yeni bir fonksiyon kullandığımızı görebilirsiniz. O da puts(“\nHos Geldiniz!!!!”); komutunda gördüğünüz üzere puts() fonksiyonudur. Bu aslında printf fonksiyonuna benzer bir fonksiyon olup “Put String” yani karakter dizisi koy anlamına gelmektedir. printf fonksiyonuna göre karakter dizisi yazdırmada daha güvenli olduğu söylenen bu fonksiyonu kullanarak da karakter dizisi yazdırabilirsiniz. Bu fonksiyon printf’den farklı olarak satır atlama ifadesini otomatik olarak koyar. Bu fonksiyonu kullanmaya alışmanızı tavsiye ediyoruz.

for döngüsünü kullanırken genellikle yeni başlayan programcılar döngü şartını yanlış yazmaktan dolayı döngüyü bir eksik veya bir fazla çalıştırırlar. for döngüsünü kullanırken bunun farkında olmanız lazımdır. Örneğin şöyle bir ifade 10 kere değil 9 kere çalışacaktır.

for (int i = 1; i < 10; i++)
 {
	komutlar;
 }

Bunu 10 kere çalıştırmak için küçük eşittir ifadesini kullanmanız gereklidir. Döngünün şart kısmına i <= 10 yazıldığı zaman 1’den 10’a kadar ve 10 dahil anlamı taşımaktadır.

for döngüsü hakkında yeterli anlatımı ve örneği verdiğimize inanıyoruz. Bir sonraki yazıda while döngüsünü anlatarak döngüler konusuna devam edeceğiz.

Last updated