Döngüler – C Programlama Dili

in #tr5 years ago (edited)


C Dilinin yapısal bir programlama dili olduğundan önceki derslerimizde bahsetmiştik. Yapısal programlama dillerinde bloğun tekrarlanabilir olmasını sağlayan döngü yapıları bulunur.

Bugün bu dersimizde kodların tekrar tekrar işlenmesini sağlayan döngülerden bahsedeceğiz. C dilinde 3 adet döngü bulunmaktadır. Bunlar :

  • for döngüsü
  • while döngüsü
  • do while döngüsü

for döngüsü

En çok tercih edilen döngülerden biridir, for döngüsü. Programlama yaparken sık sık kullanacak ve sağladığı kolaylıklardan faydalanacaksınız.

for döngüsü yapısı itibariyle tek satırdan oluşmaktadır. Ancak bu tek işlem satırı ile istediğiniz bir kod bloğunu istediğiniz kadar tekrar etmesini sağlayabilirsiniz.

for döngüsünün genel yapısı aşağıdaki gibidir :

for döngüsü içerisinde bulunan ilk değer ve ataması kısmında döngüyü kontrol eden değişkene ilk değer ataması yaparsınız. Bu ilk değer atama bölümü döngüye girerken bir defaya mahsus olarak işlenir.

kosul bölümünde ise ilk bölümde verdiğimiz döngü kontrol değişkeni, buradaki değer ile karşılaştırılır ve eğer koşul doğru ise döngünün devam etmesine karar verilir. Yani kosul ile belirttiğimiz bölüm doğru olduğu sürece döngü bloğundaki kodlar sürekli çalıştırılacaktır.

Ne zaman koşul sağlanmaz, işte o zaman döngüden çıkılacaktır. Duruma göre bazen bir kere çalıştırılmadan da şart sağlanmadığından döngüye girmeden de çıkabilir.

Gelelim artirma bölümüne. Bu bölüm döngü her tekrar ettiğinde çalıştırılacak olan bölümdür. Döngü kontrol değişkeni, döngü her tekrar ettiğinde buraya gelir ve buradaki değer kadar artırılır veya azaltılır.

artirma bölümü for bloğu çalıştırıldıktan sonra ve kosul bölümünden önce çalıştırılır.

Bu kadar açıklamadan sonra biraz uygulama yapalım. Ekrana 4 kere "A" yazan bir uygulamayı inceleyelim :

Bu uygulamada döngü kontrol değişkenimiz integer tipinde olan i değişkenidir ve ilk değer olarak 1 değeri atanmıştır. sart adındaki integer değişken ise uygulamada koşul değişkeni olarak geçmektedir ve ilk değeri 5 dir. Bu değer önemli değil 500 de yapabilirsiniz.

Döngünün devam etme şartı ise " i < sart " yani "i < 5" olduğu sürece döngü devam edecektir. Döngüye ilk girildiğinde i değişkenimizin değeri 1 dir. 1 < 5 ifadesi doğru olduğundan döngüye girilir. Ekrana printf() fonksiyonu ile 1 kez "A" yazılır. Sonra i++ ifadesinin olduğu artırma bölümüne gelinerek i değişkeninin değeri 1 artırılarak 2 yapılır. Sonrasında şart kısmına gelinir ve kontrol edilir 2 < 5 mi? Şart sağlandığından tekrar döngüye girilir ve ekrana 1 kez daha "A" yazılır. Bu şekilde devam eder.

En son i değişkenin değeri 4 olduğunda 4 < 5 olduğundan şart sağlanır döngüye girilir ve 4.kez ekrana "A" yazılır. Sonrasında i++ kısmına gelinerek i değişkeninin değeri bir artırılarak 5 yapılır 5 < 5 ifadesi bu sefer yanlış olacağından döngüden çıkılır.

Basit ya da komplex her for döngüsü bu şekilde çalışır. Biz mantığını anlamak için basit bir örnek yaptık ve ekrana 4 adet A harfi yazdırdık. Bu sayı yüz de olabilirdi. Ya da for döngüsü içerisinde bir satırlık kod değil 100 satırlık kod da olabilirdi. Bu şekilde düşündüğümüzde döngülerin ne kadar işlevsel yapılar olduğu ortaya çıkıyor.

Şimdi de ekrana 1'den 9'a kadar olan sayıları yazan bir uygulama yapalım:

Uygulamada for döngüsüne gelmeden önce sart adında integer bir değişken tanımlayıp ilk değer olarak 10 değerini atadık. Sonrasında ekrana printf() fonksiyonu ile "SAYILAR" yazdırdık.

Sonra for döngüsüne girdik. Kontrol değişkenimiz olan i ' ye, başlangıç değeri olarak 1 atadık. Şartımız ise i < sart durumudur.

İlk olarak i=1 dir. 1 < 10 şartı doğru olduğundan for döngüsüne girecektir. Ekrana değeri yazdıktan sonra i++ artirma kısmına gelecek ve i değişkeninin değerini 1 artırarak 2 yapacaktır. 2 <10 şartı sağlandığından tekrar döngüye girecek ve ekrana 2 yazdıracaktır. Bu şekilde en son i değişkeninin değeri 9 olduktan sonra artirma kısmına gelecek i++ ile değeri 10 olacaktır. 10 < 10 şartı sağlanmadığından döngüden çıkılacaktır.

Çıktımız aşağıdaki gibidir :

for döngülerindeki ilk değer atama, şart ve artirma kısımları tek bir ifadeden oluşabileceği gibi daha kompleks yapılardan da oluşabilir. Ancak mantık aynıdır.

Ayrıca if clause larda olduğu gibi for döngüleri de iç içe kullanılabilir. Buna da basit bir örnek verebiliriz:

En içteki for döngüsünde 'A' dan 'Z' ye karakterleri yazdırırken, dıştaki for döngüsünde ise satırları saydırıyoruz. Böylelikle 4 satır A'dan Z'ye karakterleri yazdırmış oluyoruz. Çıktımız aşağıdaki gibidir :

for döngülerinin içinde if clause yapıları olabileceği gibi if yapıları içinde for döngüleri de olabilir. Yani bu tür yapıları duruma göre iç içe ya da birlikte kullanabilirsiniz.

while döngüsü

While döngüsü de C dilinde sıkça kullanılan döngülerdendir. Kullanım yeri olarak fark olmasa da yapısal olarak for döngüsünden biraz farklıdır. Yapısı aşağıdaki gibidir :

for döngüsünde kontrol değişkenine ilk değer ataması, şart kısmı ve artırma kısmı tek satırda ifade edilebiliyordu.

while döngüsünde durum öyle değil. For döngüsünde bahsettiğimiz 3 kısım gene while döngüsü için de geçerli. Ancak while döngüsünde kullanacağımız kontrol değişkenini döngüye girmeden önce tanımlayıp ilk değer ataması yapmalıyız. Sonrasında sart kısmı zaten while anahtar kelimesi ile birlikte veriliyor. Geriye kalan artırma kısmı ise while blog yapısı içerisinde yapılacaktır.

Olur da artirma kısmını blog içerisinde yapmayıp unutursak, program burada sonsuz bir döngüye girecektir, dikkatli olmakta yarar var.

Şimdi de uygulamasını görelim. Biraz önce for döngüsü ile yaptığımız saydırma olayının aynısını while ile yapalım ki farkı görebilelim:

Programda görüldüğü gibi for döngüsünden farklı olarak kontrol değişkenini ve ilk değer atamasını while ifadesinden önce, artirma ifadesini de while blogunda yapmış olduk. Çıktımız aşağıdaki gibidir :

Mantık tamamen döngü mantığı olup sart sağlandığı sürece ifade dönmeye devam edecek, şart sağlanmadığında ise döngüden çıkılacaktır.

Eğer ki şart başlangıçta sağlamıyorsa da o zaman hiç döngüye girilmeyecektir.

Şimdi de kullanıcıdan input alan ve input değerine göre programdan çıkıp çıkmayacağına karar veren basit bir uygulamayı while döngüsü kullanarak yapalım :

Sonucu ise aşağıdaki gibidir :

Bu uygulamada kontrol değişkenimiz ch isimli char değişkendir. Başlangıçta boşluk karakteri atadık. Sonrasında while döngüsüne geliyor ve ch değerinin 'e' olup olmadığı sorgulanıyor. 'e' olmadığından şartı sağlıyor ve döngüye giriyor.

Döngüde kullanıcıya "Uygulamadan çıkmak istediğinize emin misiniz" sorusu soruluyor ve kullanıcıdan E veya H karakterlerini girmesi isteniyor. Kullanıcı e haricinde hangi değeri girerse girsin şart sağlandığından hep döngüde kalacak ve aynı mesajla karşılaşacak. Son olarak e veya E girerse döngüdeki şart sağlanmadığından döngüden çıkılıp program sonlanacaktır.

Döngülerin bir kullanım alanını da böylece görmüş olduk.

do while döngüsü

Bu döngü for ve while döngülerinden mantık olarak biraz farklıdır. for ve while döngüsü her ne kadar yapısal olarak farklı olsa da ikisi de aynı şekilde çalışmaktadır. Yani şart sağlandığı sürece döngüye girer sağlanmazsa girmez. Genel mantık böyledir.

Ancak do while döngüsünde şart sağlansın ya da sağlanmasın döngüye 1 kere girilir. Bunun sebebi de döngü sorgusunun döngünün sonunda yapılıyor olmasıdır.

Genel taslak aşağıdaki gibidir :

Bu yapıda do terimine gelen program normal bir şekilde döngünün içine girer. Buradaki kodları çalıştırır ve while(sart) ifadesine geçer.

Burada şart sağlanmıyorsa yoluna devam eder while dan sonraki kodları işler. Yani şart sağlanmasa dahi blogdaki kodlar 1 kere çalıştırılır.

Eğer şart sağlanıyorsa döngünün başı olan do kısmına gider tekrar aynı kodları çalıştırır, ta ki şart sağlanmayana kadar bu şekilde devam eder.

do while döngüsünün mantığı öğrenildiğinde ilk akla gelen herhalde neden böyle bir döngüye ihtiyaç duyulacağıdır. Evet düşünüldüğü gibi oldukça spesifik bir kullanım alanı var. Mesela şifre işlemlerinde kullanılabilir. Uygulamasını yapalım:

Programı anlatalım.

C dilinde daha önce de String tipinde bir veri tipi olmadığından bahsetmiştik. Ancak bunu karakter dizileri ile yapıyorduk. Bu sebeple sifre[4] adında 4 elemanlı bir dizi tanımladık char tipinde.

Sonrasında do while döngüsüne giriliyor ve kullanıcıya "Lütfen şifrenizi giriniz : " şeklinde bir mesaj veriliyor. gets() fonksiyonu ile girilen değer sifre değişkenine atanıyor. Sonra while sorgu kısmına geliniyor.

Burada kullanılan strcmp() fonksiyonu iki stringi karşılaştırıp eşitse 0 değerini döndüren bir fonksiyondur. #define ile tanımladığımız pass değeri ile sifre değeri karşılaştırılıp 0 değerini döndürmezse demek ki "1234" değeri girilmemiş demektir, yani şifre yanlıştır. Kullanıcı döngünün başına atılıyor ve tekrardan şifresini girmesi isteniyor.

Ne zaman kullanıcı "1234" değerini girerse şart sağlanmadığından döngüden çıkılıyor programın ilerlemesine izin veriliyor.

Çıktımız ise aşağıdaki gibidir.

strcmp() Fonksiyonu

Bu uygulamada önceki derslerde görmediğimiz bir fonksiyon kullandık. Bu fonksiyon strcmp() fonksiyonudur. Tanımı aşağıdaki gibidir:

int strcmp(const char *s1, const char *s2);

Bu fonksiyon s1 ve s2 şeklindeki iki stringi karşılaştırır. Eğer s1 stringi s2 stringinden büyükse 0’dan büyük bir değere, küçükse 0’dan küçük bir değere, eşitse 0 ile geri döner. Özetle :

            // s1 > s2 pozitif bir değer

            // s1 < s2 negatif bir değer

            // s1 = s2 sıfır değeri döndürüyor

Bildirimi string.h dosyasında yapıldığından projemize eklememiz gerekti.

Bugünlük bu kadar, umarım faydalı bir çalışma olmuştur.

Uygulama noktasında herhangi bir sorun yaşarsanız aşağıdaki yorum panelini kullanarak iletişime geçmekten çekinmeyin lütfen. Teşekkürler.

Kaynak belirtilmeyen görseller @etasarim a aittir. / Pictures that don’t have any source belongs to @etasarim.



Posted from my blog with SteemPress : http://etasarim.cloudaccess.host/15/03/2019/donguler-c-programlama-dili/
Sort:  

Döngüler konusu dersini hazırlarken aklıma gelmediği için belirtmediğim bir durum var. Döngülerde bazen kişi duruma göre sonsuz bir döngü kurmak isteyebilir, duruma göre değişse de niye böyle bir şey yapmak istesin diyebilirsiniz. Atıyorum bir portu dinleyebilir ya da kullanıcıdan veri almaya odaklanmıştır sistem ona göre karar verecektir. Böyle bir durumda sonsuz döngü kullanılabilir.
for(;;)
{
//statements
}

Ya da
while(1)
{
//statements
}

Yapıları sonsuz döngü yapılarıdır.

You got a 11.31% upvote from @minnowvotes courtesy of @etasarim!

Ya bize zamanında okulda progranlama dili olarak fortranı itelemişlerdi. Tabii yıllar oldu. Sonrasında onunla da ilgilenmediğim için unuttum. Programlama dilleriyle tüm ilişkim bu oldu. Ha bir de küçükken 40 mb hafızalı ve ram i 1 mb bile olmayan ibm ps2 bilgisayarım vardı, onda basic - ms dos birşeyler takılıyordum.

Neyse tüm cehaletimle soracağım ya da diyeceğim şudur ki; for ve while döngüsü aynı çalışmayı yapıyorsa birinden birine gerek yokmuş aslında diye düşündürttü beni.

Posted using Partiko Android

Yok hocam estagfrullah ne cehaleti, bence çok güzel bir noktaya değindiniz. Ben birçok dilde olduğunu farz ederek olaya gelenekse alternatif anlayışıyla yaklaşmıştım. Yani kim hangisine aşina ise onu kullanabilir diye düşünüyordum. Hatta iteration durumlarında for daha mentıklı da geliyordu ama sizin sorunuzu görünce araştırayım dedim. Birçok kişi benim gb fark olmadığını söylemiş. Ama bir kişi performans olarak test etmiş, ortalama 0.2 ms kadar farkla for loop daha hızlı çıkmış. Ama günümüz hızları düşünüldüğünde insanlar böyle rakamları ihmal edip daha çok okunabilirliğe dikkat ediyorlar. Teşekkür ederim yorumunuz sayesinde bir şeyi daha öğrenmiş oldum :)

This post has received a 11.74 % upvote from @boomerang.


Bu yazı Curation Collective Discord Sunucusunda küratörlere önerilmiş ve manuel inceleme sonrasında @c-squared topluluk hesabından oy ve resteem almıştır.
This post was shared in the #turkish-curation channel in the Curation Collective Discord community for curators, and upvoted and resteemed by the @c-squared community account after manual review.
@c-squared runs a community witness. Please consider using one of your witness votes on us here

Teşekkür ederim.

Congratulations! This post has been upvoted from the communal account, @minnowsupport, by etasarim from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.

If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.

Coin Marketplace

STEEM 0.36
TRX 0.12
JST 0.039
BTC 70181.59
ETH 3549.53
USDT 1.00
SBD 4.74