BLM-112 PROGRAMLAMA DİLLERİ II Ders-1 Kapsama Kuralları &
Rasgele Sayı Üretimi &
Rekürsif (Özyinelemeli) Fonksiyonlar
Yrd. Doç. Dr. Ümit ATİLA umitatila@karabuk.edu.tr
http://web.karabuk.edu.tr/umitatilla/
Saklama Sınıfları
• Nesne kendi bloğu içinde oluşturulur ve yok edilir
• auto: yerel değişkenler için ön tanımlıdır
• auto double x, y;
• register: değişkeni yüksek hızlı kaydedicilere yerleştirmeye çalışır
• register int counter= 1;
Saklama Sınıfları
• Statik Saklama
• Değişken tüm programın çalışması sürecinde var olur.
• Ön tanımlı değeri sıfırdır.
• static: fonksiyonlar içinde tanımlanan yerel değişkenlerdir.
• Fonksiyon sonlandıktan sonra değişken değeri saklanır
• Sadece tanımlandıkları fonksiyonda geçerlidirler
Saklama Sınıfları
• Dosya kapsama alanı
• Bir fonksiyon dışında tanımlanan bir tanımlayıcı dosya kapsama alanına sahiptir.
• Böyle bir tanımlayıcı tanımlandıkları noktadan itibaren dosya sonuna kadar tüm fonksiyonlar içinde geçerlidir
• Global değişkenler, fonksiyon tanımlamaları hep dosya kapsama alanına sahiptir.
Saklama Sınıfları
• Blok Alanı
• Blok içinde tanımlanan tanımlayıcılar
• Blok alanı tanımlandığı noktadan başlar sağ kırlangıç paranteze kadar devam eder.
• Değişkenler, yerel değişkenler ve fonksiyonlar için kullanılır.
• Dış bloklar eğer iç blokta aynı isimle değişken varsa iç bloktan gizlenirler.
Saklama Sınıfları
Saklama Sınıfları
Rasgele Sayı Üretimi
• rand fonksiyonu
• <stdlib.h> kütüphanesi yüklenmelidir
• 0 ile RAND_MAX (en düşük 32767- maks değeri 16 bit tamsayı)
• RAND_MAX <stdlib.h> içinde tanımlanmış sembolik sabittir.
• 0 ve RAND_MAX arasındaki her sayı seçilmek için eşit olasılığa sahiptir.
• Rand ile üretilecek rasgele sayı aralığı uygulama ihtiyacına göre değişir.
Rasgele Sayı Üretimi
• Yazı tura programı sadece yazı için 1 tura için 0’a ihtiyaç duyar.
• Zar kullanan bir program 1 ile 6 arasında rasgele sayı üretmelidir.
• ölçekleme
• Rand tarafından üretilen değerler daima 0 ile RAND_MAX arasındadır.
• 0 ≤ rand ( ) ≤ RAND_MAX
• 0 ile 5 arasında sayı üretmek için rand fonksiyonu ile
% kalan operatorü kullanılır. Buna ölçekleme denir.
• rand( ) % 6
Rasgele Sayı Üretimi
• 6 sayısı ölçekleme faktörüdür.
• Aralığı kaydırmak için sonuca 1 eklenir.
• randNumber = 1 + rand ( ) % 6
• 1 ≤ randNumber ≤ 6 aralığında sayılar üretir.
• Genel kural:
• n = a + rand ( ) % b ;
• a kaydırma değeridir.
• b ölçekleme faktörüdür
Rasgele Sayı Üretimi
Rasgele Sayı Üretimi
• Örnek Program: 6000 kere zar atma
• 1’den 6’ya kadar tamsayılar yaklaşık olarak 1000 defa seçilmelidir.
Rasgele Sayı Üretimi
Rasgele Sayı Üretimi
Rasgele Sayı Üretimi
• Rand fonksiyonu gerçekte sahte rasgelelik üretir.
• rand fonksiyonunu defalarca çağırmak rasgleymiş gibi görünen bir sayı dizisi oluşturur.
• Ancak, bu sayı dizisi her program çalıştırıldığında kendi kendini tekrarlar.
• Her program çalışmasında farklı dizilimde gerçek rasgele sayılar üretebilmek için srand fonksiyonu kullanılır.
• srand argüman olarak bir tamsayı alır.
• srand rand fonksiyonunun programın her çalışmasında farklı dizilimde sayılar üretilmesini sağlar.
Rasgele Sayı Üretimi
Rasgele Sayı Üretimi
Rasgele Sayı Üretimi
• Her seferinde seed değeri girmeden rasgele sayı üretmek için
• srand ( time (NULL));
• Sistem saati otomatik olarak seed değeri elde etmek için kullanılır.
• time fonksiyonu 1970 Ocak ayı gece yarısından itibaren kaç saniye geçtiğini döndürür.
• time fonksiyonu için <time.h> kütüphanesi kullanılır.
Şans Oyunu: Craps
• Kurallar:
• İki zar atılır
• Zarların toplamı hesaplanır
• İlk atışta 7 veya 11 gelirse oyuncu kazanır
• İlk atışta 2, 3 veya 12 gelirse oyuncu kaybeder
• İlk atışta 4,5,6,8,9,10 gelirse bu oyuncunun puanı oluyor.
• Oyuncu 7 atmadan önce kendi puanını tutturmalıdır.
Özyineleme (Rekürsif)
• Özyinelemeli fonksiyonlar
• Kendi kendini çağıran fonksiyonlar
• Eğer fonksiyon temel durum ile çağırılırsa bir sonuç döndürür.
• Eğer fonksiyon daha karışık bir problem ile çağırılırsa
fonksiyon fonksiyon problemi iki kavramsal parçaya böler;
• Birincisi: fonksiyonun işi nasıl yapacağını bildiği kısım
• İkincisi: fonksiyonun işi nasıl yapacağını bilmediği kısım
• İkinci kısım orijinal probleme benzemelidir.
• Fonksiyonun bilmediği kısmı çözebilmek için kendisinin bir kopyasını çalıştırır
• Sonunda temel durum çözülür
Özyineleme (Rekürsif)
Özyineleme (Rekürsif)
Özyineleme (Rekürsif)
• Faktöriyel probleminin rekürsif tanımlaması aşağıdaki tanımlamayla yapılır.
• n! = n. (n-1)!
• Örneğin: faktöriyel
• 5! = 5. 4. 3. 2. 1
• Dikkat edin
• 5! = 5. 4!
• 4! = 4. 3!...
• Faktöriyel hesabı rekürsif olarak hesaplanabilir.
• Temel durumu çöz ( 1! = 0! =1) daha sonra
• 2! = 2. 1! = 2*1 = 2
• 3! = 3. 2! = 3*2 = 6
Özyineleme (Rekürsif)
Özyinelemeli Faktöriyel Hesabı
Özyinelemeli Faktöriyel Hesabı
Özyinelemeli Fibonacci Sayıları
• Fibonacci serisi: 0, 1, 1, 2, 3, 5, 8...
• Her bir sayı kendinden önceki iki sayının toplamıdır
• Temel durum:
• Fib(0) = 0
• Fib(1) = 1
• Rekürsif olarak çözülebilir :
• Fib (n) = Fib(n-1) + Fib(n-2)
Özyinelemeli Fibonacci Sayıları
Özyinelemeli Fibonacci Sayıları
• n. Fibonacci sayısını bulma
Özyinelemeli Fibonacci Sayıları
Kaynaklar
•
Paul J. Deitel, “C How to Program”, Harvey Deitel.
•