Yazan : Şadi Evren ŞEKER

Bu yazıyı dersimi alan C ile programlamaya giriş öğrencileri için yayınlıyorum. Yazıyı okuyabilmek için sitemdeki C giriş dersinin sayfasında bulunan şifreyi giriniz.

[password]

Bu yazının amacı, bir programlama dili olan C dilinde yazılabilecek temel döngülere misaller vermek ve öneme haiz noktalarını izah etmektir. Aşağıda basitten başlanarak muhtelif programlama melekesi gerektiren döngüler izahatları ile birlikte verilecektir. En basit döngü örneğini aşağıdaki şekilde verebiliriz:

Kodun çıktısı aşağıdaki şekildedir:

Görüldüğü üzere kod, 10 kere ekrana “sadievrenseker” yazısını tekrarlamıştır. Kodda, for döngüsünün içerisinde i değişkeni 1’den başlatılmış ve 10’dan küçük olduğu sürece her dönüşte birer artması söylenmiştir (kodun 4. Satırı)

Döngünün içini belirten küme parantezleri ile başlayıp biten blokta ise sadece ekrana “sadievrenseker” yazan basit bir printf komutu bulunmaktadır (kodun 5. Satırı). Bu komut döngünün içerisinde tam 10 kere tekrarlanır çünkü i değişkeni ancak 10 dönüş sonra döngü (loop) koşulunun dışına çıkarak 10’dan küçük olmamakta ve döngü bitmektedir.

Bir döngüde unutulmaması gereken 3 unsur bulunur. Bunlar döngü değişkeninin başlangıç değeri, bitiş değeri ve adım değeridir. Yukarıdaki örnekte döngü değişkeni olan “i” 1’den başlamış, 10da bitmiş ve her adımda 1 kere artmıştır.

Farklı bir örnek olarak ekrana 1’den 10’a kadar olan sayıları bastırmak isteyelim:

Yukarıdaki bu yeni kodda, sadece kodun 5. Satırında bulunan printf fonksiyonunun parametresi değiştirilmiştir. Bu yeni haliyle ekrana i değişkeninin değerini basmaktadır. Bir önceki temsili kodda, ekrana on kere “sadievrenseker” basarken zaten i değişkeninin 1’den 10’a kadar değerler aldığından bahsetmiştik. Bu yeni kodda ise bu değişkenin değeri ekrana basılmıştır. Kodun çalışan hali aşağıdadır:

Bir kere daha döngülerde, değişkenin başlangıç , bitiş ve adım değerlerinin önemli olduğunu hatırlatalım. Bu önemi anlatmak için aşağıdaki şekilde bir kod yazıldığını varsayalım:

Bu kodun ekran çıktısı aşağıdaki şekildedir:

Görüldüğü üzere ekrana hiçbir sonuç çıkartmamış çünkü döngü hiç dönememiş ve printf fonksiyonu hiç çağrılmamıştır. Bunun sebebi döngüdeki koşulda, i’nin 10’dan büyük olmasıdır (kodun 4. Satırındaki for içerisinde i>=10 olduğuna dikkat ediniz). Döngü başlangıcından i’nin değeri 1 olarak atandığı için bu koşul sağlanmaz ve döngü hiç dönmez. Bu örneğin tersi bir durumda fasid dairedir.

Yukarıdaki yeni kod, 1’den başlamakta ve 10’da bitmektedir. Ancak her adımda (dönüşte) i=i/2 işlemi yapılmaktadır. Bu işlem i’nin yarısının alınması anlamına gelir. Bilindiği üzere tam sayı matematiğinde (integer arithmetic) ½ = 0 olmakta ayrıca 0/2 de 0 olmaktadır. Dolayısıyla 1’den başlayan i değeri önce 2’ye bölünecek, sonuç 0 bulunacak ve bundan sonraki döngülerde sürekli olarak 0/2 = 0 sonucu bulunacaktır. Dolayısıyla i değeri hiçbir zaman 10’dan büyük olmayacaktır. Neticede döngü sonsuza kadar dönecek ve bir fasid daire (kısır döngü) oluşacaktır.

Ekranda görüldüğü üzere kod sonsuza kadar 0 basacaktır.

Döngüler ile oynamaya devam edelim ve farklı bir problem ortaya atalım. Örneğin 100’den 50’ye kadar 3’e tam bölünen sayıları gören kodu yazmak isteyelim.

Problem şimdiye kadar yazdığımız klasik döngülerden farklı olarak sayıların tersten işlenmesini gerektirmektedir. Kodu aşağıdaki şekilde yazabiliriz:

Görüldüğü üzere i değişkeni şimdiye kadar olan örneklerden farklı olarak 100’den başlamış, 50’den büyük olma koşulu ile her adımda 1 azaltılmıştır. Ayrıca kodda, ekrana i’nin değerini basan satır (6. Satır), bir if koşulu ile şarta bağlanmış ve bu şartta, i’nin 3’e bölümünden kalanın 0 olması söylenmiştir.

Kodun çıktısı aşağıdaki şekildedir:

Yukarıdaki kodu, while döngüsü olarak yazmak istersek aşağıdaki şekilde değiştirmemiz yeterlidir:

Kodun yeni halinde, bir döngünün üç unsuru olan başlangıç (4. Satır), bitiş (5. Satır) ve adım değeri (9. Satır); for döngüsünden farklı olarak, kodda 3 ayrı satıra dağıtılmıştır. Kod yukarıdaki for döngüsü ile aynı şekilde çalışır ve ekran çıktısı aynıdır.

Döngüler ile ilgili kavranması gereken konulardan birisi de, aynı anda birden fazla serinin tek bir döngü ile takibidir. Örneğin ekrana 3 ayrı kolonda, 5’den 50’ye kadar 5’er 5’er artan sayıları, 99’dan 9’a kadar 10’ar azalan sayıları ve 1’den 10’a kadar ardışık sayıları basan kodu istesek. Yani aşağıdaki program çıktısını hedeflesek, kodu nasıl yazmamız gerekir beraberce inceleyelim:

Yukarıdaki çıktıda 3 ayrı kolon bulunmaktadır. Demek ki kodumuzda da 3 ayrı sayı döngünün her dönüşünde hesaplanarak basılmalıdır. Bunun çok basit bir sebebi vardır, C dilinde bir satıra bir değer basıldıktan ve alt satıra geçildikten sonra geri dönüp yeni sayı yazamıyoruz (yazılıyor olsa da bu konu dışındadır ve döngüleri öğrenmek için yazılamadığını kabul edelim).

Döngünün içerisinde tek bir printf ile üç değeri her satır için doğru veren bir formüle ihtiyacımız var. Bu tip bir problemle karşılaşıldığında mümkünse döngü değişkenini en basit halde tutmak ve döngü değişkenine bağlı olarak bütün değerleri formüllemek etmek en iyi çözümdür. Yani şimdiye kadar alıştığımız üzere bir döngü ve bu döngüde 1’den 10’a kadar dönen bir döngü değişkeni tanımlayalım sonra üç değeri de bu değişkene bağlı formüllendirelim:

Yukarıdaki kodda, 5. Satırda bulunan printf fonksiyonu ile her kolon değeri ayrı ayrı hesaplanmıştır. İlk kolonda döngü değişkeninin 5 misli alınmış, ikinci kolonda döngü değişkeninin 1 eksiğinin 10 katına 1 ilave edilmiştir. Son olarak son kolonda döngü değişkeni doğrudan ekrana basılmıştır çünkü 3. Kolonda istenen değer zaten döngü değişkenidir.

Burada örneğin ortadaki kolonu hesaplamakta zorluk çekilebilir. Bu tip sayı serilerini ardışık sayılara indirgememiz gereken problemlerde, sistemi tersten düşünmekte yarar vardır. Örneğin yukarıdaki 99’dan 9’a kadar olan serideki değerleri 100’den çıkarırsak aşağıdaki sayıları buluruz:

1

11

21

31

91

Bu serideki sayılar dikkat edilirse 10’ar 10’ar artan sayılardır. Dolayısıyla sayıların 1 eksiği 0’dan 90’a kadar olan seriyi verir

0

10

20

30

90

Yukarıdaki yeni seride ise her sayı döngü değişkeninin 1 eksiğinin 10 mislidir.

Örneklerimize bu defa gerçek hayatta işe yarayabilecek bir soru ile devam edelim. Amacımız kullanıcıdan bir sayı okumak ve girilen sayının faktöriyelini hesaplayan kodu yazmak olsun. Bu tip döngü içerisindeki değerlerin bir değişkende biriktirildiği döngü tiplerine biriktirici tip döngüler (accumulator style) denilir. Aşağıdaki faktöriyel hesabı yapan kodu inceleyelim:

Yukarıdaki kodda 5. Ve 6. Satırlar, kullanıcı ile iletişim için yazılmış olup kullanıcıdan girilen sayı “num” isimli değişkenin içerisine okunmaktadır. Ardından 7. Ve 10. Satırlar arasında girilen bu değerin faktöriyeli hesaplanmaktadır. Bu hesap sırasında döngü değişkeni olan “i”, değer olarak 1’den “num” değişkenine kullanıcı tarafından girilen değere kadar birer birer artarak dönmektedir. Örneğin num değeri 5 girildiyse, i değişkeni her dönüşten bir artarak sırasıyla 1,2,3,4 ve 5 değerlerini almaktadır.

Döngümüzün içerisinde bu i değerleri çağrılarak fact değişkeni içerisinde biriktirilmektedir. Kodun 9. Satırında “fact=fact*i” yazılarak i değişkenindeki ve fact değişkenindeki değerler çarpılmış ve ardından yine fact değişkeninin içerisine yerleştirilmiştir. Yukarıdaki kodun çalışan hali aşağıda verilmiştir:

Yukarıdaki kod daha iyi anlayabilmek için, num değişkenine 6 girildiğini kabul edelim ve değişkenlerin aldığı değerleri her dönüşte inceleyelim.

num i fact
6 1 1
6 2 2
6 3 6
6 4 24
6 5 120
6 6 720

Tabloda görüldüğü üzere num değişkeni ilk girilen değer olan 6’da sabit kalmaktadır. Zaten kodda num değişkenini değiştiren bir değer de bulunmamaktadır. Ayrıca i değişkeni 1’den num değerine yani 6’ya kadar dönmektedir. Son olarak fact değişkeni her dönüşte, o andaki i değişkeninin değeri ile çarpılmakta ve sonuç yine fact değişkeninin içerisine yerleştirilmektedir.

Sonuçta i değişkeni döngü koşulu olan 6 değerine ulaştığında döngü durmakta ve ekrana fact değişkeninin değeri olan 720 basılmaktadır.

Yukarıdaki örnekte olan biriktirici tip (accumulator style) döngülere klasik bir örnek olarak klavyeden girilen 10 sayının toplamını veren kodu yazalım:

Yukarıdaki kodda bu defa içerisinde değer biriktirilen değişken “top” ismindedir ve ilk değer olarak toplamada etkisiz eleman olan 0 değeri atanmıştır. Döngünün her dönüşünde yeni bir sayı kullanıcıdan istenmekte (6. Ve 7. Satırlarda) ve girilen bu değer (sayi değişkeni içerisinde) top değişkeninin içerisine ilave edilmektedir.

Sonuçta döngü 10 kere dönmekte ve her dönüşte top değişkenine ilave ettiği bu değerleri döngü sonunda ekrana basmaktadır. Ayrıca sayıların ortalamasını da bu değişkenin içindeki değerleri 10’a bölerek bulabiliriz.

Kodun çalışması aşağıda verilmiştir.

Yukarıdaki örnekte sayılar rast gele olarak kullanıcı tarafından girilmiştir ve kod, farklı sayı girişleri için de doğru çalışmaktadır. Ayrıca ortalama hesabının tam sayı sonucu çıkması, bölme işleminin tam sayıl aritmetiğine göre yapılmasından kaynaklanmaktadır.

Yukarıdaki soruyu biraz daha ilerletelim ve kullanıcın kaç sayı gireceğimizi bilmediğimizi farz edelim. Bu durumda kullanıcının sayı girişini bitirdiğini belirten bir işarete ihtiyaç duyarız. Bu örnekte kullanıcının -1 girmesi durumunda sayı girişini bitirdiğini ve o ana kadar olan sayıların toplamını ve ortalamasını görmek istediğini kabul edelim. Kodumuzu aşağıdaki şekilde değiştirebiliriz:

Yukarıdaki yeni kodda, kullanıcının kaç sayı gireceği bilinmediği için girilen sayıların sayısını tutan “say” isminde ilave bir değişkene ihtiyaç duyulmuştur. Ayrıca kullanıcının -1 girince döngünün bitmesi için girilen değerleri tutan sayi değişkeni bir while döngüsü içerisinde kontrol edilmekte ve şayet -1 değeri görülürse döngü bitmektedir.

Kodumuz, bir öncekine benzer şekilde döngü içerisinde kullanıcıdan bir sayı okumakta ve “sayi” değişkeni içerisinde bu değeri saklamaktadır. (kodun 8-10. Satırları)

Ayrıca girilen bu sayı yine top isimli değişkene ilave edilmektedir (15. Satır)

Yeni olan bir satır ile (16. Satır) her sayı girilişinde (ve dolayısıyla her döngü dönüşünde) say değişkeni bir arttırılmaktadır. Bu sayede kaç sayı girildiği tutulabilmektedir.

Yukarıdaki kodda, 13. Satırda bulunan if koşulu ve buna bağlı olarak çalışan 14. Satırdaki break komutu olmasaydı, kullanıcının çıkmak için girdiği -1 değeri de toplama ilave edilir ve bu değer içinde sayacımız bir arttırılarak işleme dahil edilirdi. Oysaki biz -1 sayısının sadece sayı girişini belirtmesini ve işleme dahil edilmemesini istiyoruz. Dolayısıyla -1 girilince break yaparak döngüden çıkıyoruz ve toplama ilave edilmeden ve sayaç arttırılmadan döngüden çıkılmış oluyor.

Benzer bir uygulama olarak 0 değeri girildiğinde ortalamaya dahil edilmesini istemezsek, sayının 0 olduğunda continue komutunu çağırabiliriz. (kodun 11 ve 12. Satırları) Buradaki amaç kullanıcı 0 girerse, döngü toplama ve saymaya dahil etmeden bir sonraki sayıyı alsın böylelikle ortalamaya 0 değeri dahil edilmesindir. Yukarıdaki bu kod bulunmadığında 0 değeri ortalamaya dahil edilir.

C dilinde sıkça kullanılan bir döngü tipi de iç içe döngülerdir (nested loops).

Yine basit bir uygulama ile başlayalım. Örneğin ekrana çarpım tablosunu basan bir kod yazmak isteyelim. Amacımız, satır ve sütunlarda 1’den 10’a kadar olan sayıları yazmak sonrada iki boyutlu tablomuzu bu sayıların çarpımı ile doldurmak olsun. Bu sorunun çözümüne geçmeden önce bir hatırlatma olarak iki boyutlu döngülerde istisanî bir durum olmadıkça iç içe iki döngü gerekeceğini hatırlatalım.

Yukarıdaki kodun çıktısı aşağıdaki şekildedir:

Görüldüğü üzere ekrana 1’den 10′ kadar olan sayılardan oluşan satır ve sütunları basmış ayrıca tabloyu bu sayıların çarpımıyla doldurmuştur.

Yukarıdaki kodda iki for döngüsünün iç içe olduğunu görüyoruz. Dışarıdaki for döngüsü yani i değişkeni ile dönen döngünün her bir dönüşünde içerideki döngü yani j değişkeni üzerinden dönen döngü 10 dönüş yapar. Dolayısıyla yukarıdaki ekran çıktısındaki her satırın tamamlanması için içteki döngü 10 kere döner. İçteki döngü 10 kere dönüp işini bitirdikten sonra ekrana bir alt satıra geçilmesini sağlayan n değeri basılır ve dışarıdaki döngü bir sonraki adıma geçer.

Bu tip iki boyutlu döngülerin anlaşılması açısından aşağıdaki tablonun iyi anlaşılması gerekir. Aşağıda i ve j değerlerinin her hücrede aldığı değer ayrı ayrı verilmiştir. Buradan amaç sayısal olarak iki boyutlu döngülere bağlantı kurabilme yeteneğini geliştirmektir.

i,j 1 2 3 4 5
1 1,1 1,2 1,3 1,4 1,5
2 2,1 2,2 2,3 2,4 2,5
3 3,1 3,2 3,3 3,4 3,5
4 4,1 4,2 4,3 4,4 4,5
5 5,1 5,2 5,3 5,4 5,5

Yukarıdaki tabloda i ve j değerleri sırasıyla yazılmıştır. Belki de çok kolay ve basit bulunan ve herkesin çok iyi bildiği bu tablo, iki boyutlu döngülerin temelini oluşturur. Yani iki boyutlu yapılan bütün işlemler bir şekilde yukarıdaki tabloda bulunan sayılarla ilişkilidir.

Örneğin bir önceki soruda çarpım tablosu bulunurken yukarıdaki tabloyu ekrana basan for döngüleri kodlanmış ve her hücre için i*j formülü kullanılmıştır.

Farklı bir uygulama olarak ekrana satranç tahtası çizdirmek isteyelim:

* * *

* *

* * *

* *

* * *

Yukarıdaki desen basit bir satranç tahtası görüntüsü oluşturmaktadır. Bu deseni çizerken tablomuzdan istifade edelim. Acaba satranç tahtamızda bulunan * ve boşlukları birbirinden ayıran bir sayısal bağlantı bulabilir miyiz?

İşe tablodaki sayıları toplayarak başlayalım:

i,j 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
4 5 6 7 8 9
5 6 7 8 9 10

Yukarıdaki tabloda * olan değerlere dikkat edilirse hepsinin çift sayı ve boşluk olan yerlerin ise hepsinin tek sayı olduğu görülebilir. Öyleyse tablonun bize sağladığı bu fark ile aşağıdaki kodu yazabiliriz:

Yukarıdaki kodun çıktısı aşağıda verilmiştir:

Görüldüğü üzere kodumuzda iç içe iki döngü kodlanmış ve bu döngülerin değişkeni olan i ve j değerlerinin toplamının çift olduğu yerlere * ve tek olduğu yerlere boşluk karakteri basılmıştır. Sonuçta elde edilen ekran çıktısı istenen çıktıdır.

İndis değerlerinden oluşan yukarıdaki iki boyutlu sayı tablomuzu daha iyi anlamak için bir örnek daha yapalım ve bu sefer 5×5 boyutlarında bir kare içerisine * karakterlerinden büyük bir X çizdirmek isteyelim. Kodu ve ekran çıktısını verdikten sonra nasıl yaptığımızı anlatalım:

Kodun çıktısı aşağıdaki şekildedir:

Görüldüğü üzere ekranda 5×5 boyutlarında bir alanda iki köşegen (diagon) * sembolü ile belirlenmiştir. Bu kodu anlayabilmek ve yazabilmek için tablomuza dönüp sayıların üzerinden bir kere daha geçmemiz gerekiyor:

i,j 1 2 3 4 5
1 1,1 1,2 1,3 1,4 1,5
2 2,1 2,2 2,3 2,4 2,5
3 3,1 3,2 3,3 3,4 3,5
4 4,1 4,2 4,3 4,4 4,5
5 5,1 5,2 5,3 5,4 5,5

Yukarıdaki bu tabloda sol üst köşeden sağ alt köşeye bağlayan köşegenin özelliği i ve j değerlerinin eşit olmasıdır. Ters köşegen olan sağ üst köşeden sol alt köşeye bağlayan köşegeni oluşturan hücrelerin özelliği ise i+j = 6 olmasıdır.

İşte yukarıdaki kodda bu iki özellikten birini taşıyan hücrelere * konulmuş diğerlerine ise boşluk konulmuştur ve ekranda x harfi basılmıştır.

İki boyutlu tablolara güzel bir örnek de binom üçgenidir (veya paskal üçgeni (binom , pascal triangle)). Lisedeki matematik derslerinden hatırlanacağı üzere bir paskal üçgeni aşağıdaki şekildedir:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

Ve bu şekilde devam etmektedir. Lisede genelde bu üçgen anlatılırken her hücrede bulunan değerin, kendi üstünde bulunan iki değerin toplamından oluştuğu söylenir. Örneğin 5. Satırın 3 elemanı 6’dır ve kendi üstünde iki 3’ün toplamından oluşur gibi.

Bu bilgi doğru olmakla birlikte bizim kodumuz için kullanışlı değildir. Çünkü ekrana yazdığımız değerleri geri dönüp okumamız veya hafızada tutmamız mümkün olmaz. (Aslında diziler (array) ile tutulabilir ancak okuyucunun bu seviyede dizileri bilmediğini veya bilse bile hafızayı daha verimli kullanan kod yazmak adına kullanmayacağını kabul edelim.)

Çözüm için yukarıdaki üçgeni veren kombinasyon (combination) formülünü kullanalım. Yani yukarıdaki her satır için nCk formülünü yani açık haliyle:

Formülünü kullanabiliriz. Örneğin yukarıdaki üçgende 6. Satırın 3. Terimini bulurken 6C3 değeri hesaplanır ve 6! / (3! (6-3)!) formülünden:

Olarak bulunur. Gerçekten de yukarıdaki üçgende bu değer 20’dir. Tabi yukarıdaki üçgende elemanların 0 değerinden başladığına dikkat edilmelidir. Yani her satırın başındaki 1 ve ilk satırı oluşturan 1 indislerin 0 olduğu değerdir. Diğer bir değişle nC0 = 1 olduğu için bütün satırlar 1 ile başlar.

Şimdi yukarıdaki kodu kombinasyon formülü ışığında kodlayabiliriz. Yapacağımız iş aslında çok basit bir şekilde 2 boyutlu tabloda ilgili indis değerlerinin kombinasyonunu almaktır:

Yukarıdaki kodun çıktısı aşağıdaki şekildedir:

Görüldüğü üzere kodumuz ekrana binom üçgenini başarılı bir şekilde basmaktadır. Kodda bize yeni olan hiçbir şey olmamakla birlikte kodun üzerinden bir kere geçerek inceleyelim.

Kodda klasik bir şekilde iç içe iki döngü kullanılmıştır (4. Ve 5. Satırlar).

Döngülerden dıştaki olan satır bazlı olarak satırdaki kombinasyonun n değerini vermektedir. Ayrıca satır sonlarında bir alt satıra geçilmesini sağlayan n karakterini koymaktadır.

Döngülerden içte olanı ise her satıdaki terimlerin teker teker basılmasından sorumludur. Yani daha basit bir anlatımla ekrana aşağıdaki tabloda verilen değerlerin kombinasyonları basılmıştır:

0,0 0,1 0,2 0,3 0,4 0,5
1,0 1,1 1,2 1,3 1,4 1,5
2,0 2,1 2,2 2,3 2,4 2,5
3,0 3,1 3,2 3,3 3,4 3,5
4,0 4,1 4,2 4,3 4,4 4,5
5,0 5,1 5,2 5,3 5,4 5,5

Yukarıdaki tabloda verilen kombinasyon değerlerinden diyagon üstü üçgen anlamsızdır. Yani örneğin 0C3 anlamsız bir değerdir ve zaten binom üçgeninde de yer almaz. Bu değerlerin basılmaması için sadece alt diyagonu basan kodun 5. Satırında j<=i koşulu getirilmiştir.

Bu sayede sadece aşağıdaki üçgen basılmış olur:

0,0
1,0 1,1
2,0 2,1 2,2
3,0 3,1 3,2 3,3
4,0 4,1 4,2 4,3 4,4
5,0 5,1 5,2 5,3 5,4 5,5

Yukarıdaki sayı değerlerinin kombinasyonu da hesaplanırsa binom üçgeni bulunmuş olur.

Şimdi farklı bir uygulama olarak 0 ile 100 arasındaki asal sayıları ekrana basan ve hatta bu sayıların toplamını bulan bir kod yazmak isteyelim. Bu kod yine klasik iç içe döngü (nested loop) örneklerinden birisidir. Sebebi bir sayının asal olup olmadığını anlamak için sayının kareköküne kadar olan sayılarla bölünüp bölünmediğinin sınanması gerektiğidir. Ayrıca bu işlem tek bir sayı için değil 0 ile 100 arasındaki bütün sayılar için yapılacaktır. Yani önce bir sayının asal olup olmadığını bulan döngüyü (loop) yazarsak sonra bu döngüyü 0 ile 100 arasındaki bütün sayılar için çalıştırabilir ve soruyu çözebiliriz.

Aşağıdaki kodu ve çıktısını incelemeye çalışalım:

Yukarıdaki kodun çıktısı aşağıdaki şekildedir:

Yukarıdaki kodun dıştaki döngüsü 0 ile 100 arasındaki sayıları içteki döngüde denemektedir ve sayının asal olup olmadığını bulmaya çalışmaktadır. (kodun 5. Satırındaki döngü)

İçteki döngü ise sayının asal olup olmadığını, sayının bir eksiğine kadar olan sayılarla bölünüp bölünmediğine bakarak sınar. (aslında fermat teoremine göre sayının kareköküne kadar olan sayıları sınamak yeterlidir ancak bu seviyedeki bir okuyucunun performans kaygısı olmadığını ve hatta karekök almayı bilmediğini kabul ederek bu şekilde çözebiliriz. Sonuç değişmeyecek döngümüz fazladan gereksiz yere dönecektir).

Kodun içteki döngüsü, anlık olarak asallığı sınanan sayının bir eksiğine kadar dönmektedir (kodun 7. Satırı). Ayrıca bu dönüş sırasında 2’den bu değere kadar olan bütün sayıları, asallığı sınanan sayı ile tam bölünüyor mu diye kontrol etmektedir ( kodun 8. Satırı).

Şayet tek bir sayı bile bu asallığı sınanan sayıyı tam bölüyorsa, bu sayı asal değil demektir. Ancak bir sayının asal olduğunu söyleyebilmek için sınadığımız hiçbir sayının tam bölmemesi gerekmektedir. Bu durumu kontrol etmenin bir yolu, döngülerde klasik olarak kullanılan stratejilerden birisi olan bayrak kullanımıdır. (flag)

Bu yaklaşımda döngüye girmeden önce bir değişkene ilk değer atanır. Döngüde olup olmadığını kontrol ettiğimiz durumda bu bayrak değişkeninin değeri değiştirilir.

Döngü bittiğinde değişken hiç değişmeden çıktıysa, bu koşul hiç gerçekleşmemiş demektir. Şayet değeri değişerek çıktıysa o zaman bu koşul gerçekleşmiş demektir.

Yukarıdaki kodda bulunan p değişkeni de bu tarzda bir bayrak değişkenidir. Yani değeri ilk başta 0 atanan ve istemediğimiz koşul olduğunda 1 olan bir değişkendir (kodun 9. Satırı).

Şayet döngüden hiçbir sınanan değere bölünmeden çıkılıyorsa bu durumda sayı asal ve p değeri 0 demektir.

Şayet en az bir tane tam bölen bulunuyorsa bu durumda if koşuluna girilecek ( kodun 8. Satırı) ve değişken değeri artık 1 olacak demektir..

Değişkenin döngüden nasıl çıktığı döngü sonundaki if koşulu ile kontrol edilmektedir. (kodun 13. Satırı)

Ve şayet değişmeden çıktıysa sayı asal, değişerek çıktıysa sayı asal değil demektir.

Soruda sadece asal sayıları ekrana yazmamız ve toplamını almamız istendiği için, sayının asal olup olmadığı kontrol edildikten ve asal olduğu anlaşıldıktan sonra ekrana basılmakta ve toplamlarını alan sum değişkeninin içerisine eklenmektedir.

[/password]

Yorumlar

  1. Şadi Evren ŞEKER Article Author

    Şifrenizi yazdıktan sonra, yazdığınız kutu içerisinde klavyeden enter tuşuna basın. Submit düğmesinde sanırım bir hata var düzeltene kadar bu şekilde girebilirsiniz.

    başarılar

  2. pusat

    hocam benim bi sorum var acaba yardımcı olurmusunuz?. While döngüsü ile alakalı bir sorum var soru şöyle: bir mağazada 1-pantolon,2-ceket ,3-gömlek vs 6 numaraya kadar eşya bulunuyor. while döngüsü ile hazırlanacak programda mesela 3’e basıldığında ekrana sırasıyla 3-gömlek,4-ayakkabı,5- aksesuar,6-eşofman gelecek şekilde bir döngü kurmam istendi hocam bi yardımcı olurmusunuz komutları nasıl kullanacam karıştırmışım while döngüsünde yardımcı olsanız çok makbule geçer hocam iyi akşamlar.(burada 1-2-3… numaradır yani mesela 1 numarada Pantolon Var gibi düşünülecek)

  3. çiğdem

    1. 1 den 1000 e kadar 5’in katı olup 2 nin katı olmayan sayıların toplamını ekrana yazan program,
    2. 1 den klavyeden girilen sayıya kadar 2 katının 3 fazlası 3’ün katı olan bütün sayıları ekrana yazan program,
    3. Klavyeden girilen iki sayı arasındaki çift sayıların karelerinin toplamını ekrana yazan program, (1.sayının
    2.sayıdan küçük olduğunu düşünün)
    4. Klavyeden 100 girilene kadar girilen pozitif sayıların âdetini ekrana yazan program
    hocam bu soruları for ve if ile dnedim olmadı yardımcı olabilir misiniz

Banshee için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir