FİZ219 - Bilgisayar Programlama I | 08/11/2020

Ödev: 1

Döngü ve Karar Cümleleri (I)

Son gönderim tarihi: 15 Kasım Pazar, 23:59

Asal sayı bulucu

1 ile 300 arasındaki asal sayıları bulan program yazınız. (Derste de belirttiğim üzere: burada marifet hazır kod kullanmak değil, for ve if yeteneklerinizi sergilemek. Kodunuzun doğruluğunu primes(300) komutunun sonucuyla kıyaslayarak kontrol edebilirsiniz).

Çözüm

Asal sayıları bulurken tekrardan kaçınmak için asal sayı buldukça bunları asallar dizisinin içinde topluyor, kontrol edeceğimiz sayıyı bu dizimizdeki ("heybemizdeki") mevcut asal sayılara bölünüyor mu diye bakıyoruz. Yani örneğin 35'in asallığını kontrol etmek için 2'ye bölünüyor mu, 3'e bölünüyor mu diye sırayla bakıyoruz ama 4'e bölünüyor mu diye bakmıyoruz. O ana kadar bulduğumuz elimizdeki asal sayılardan birine bölündüğünü gördüğümüz anda da break ile kesip daha fazla kontrol etmiyoruz (örneğin 35'in 5'e bölündüğünü görünce, 7'ye, 11'e de, ... bölünüyor mu diye bakmıyoruz).

Programın detaylı anlatımı ve adım adım gelişimi için geçen senenin ilgili ders notlarına bakabilirsiniz.

Kök söktürücü

Dersin başında incelediğimiz ve hazır formülle köklerini bulduğumuz $3x^2-7x+4=0$ denklemini tekrardan ele alalım. Kök bulmak için kullanılan metotların biri, kökün, tanım itibarı ile, fonksiyonun 0 değerini aldığı $x$ değeri olduğu gerçeğidir. Eğer fonksiyon kök değerinde 0'a eşitse, bu, fonksiyonun kök değerinde x-eksenini ya yukarıdan aşağıya, ya da aşağıdan yukarıya kesmesi anlamına gelir ("çoğu zaman" ;). O halde belli bir $x_0$ değerinden başlayıp, ufak ufak ilerleyerek şu şekilde (ve istenen hassasiyette) kökü bulacak bir algoritma kurabiliriz:

  1. x0 = 0, adim_boyu = 1E-4 olarak tanımla.
  2. a = 3x0^2-7x0+4 olarak hesaplayıp tanımla.
  3. x1 = x0 + adim_boyu olarak tanımla.
  4. b = 3x1^2-7x1+4 olarak hesaplayıp tanımla.
  5. (a): a ile b'nin işaretleri birbirinden farklı ise aralarında kök var demektir.
    kok = (a+b)/2 kok = (x0 + x1)/2 olarak yazdırıp programı bitir.
    (b): a ile b'nin işareti aynı ise, arasında kök olmadığını varsayıp,
    x0'a x1'in, a'ya b'nin değerini atayıp, 3. adıma git.

Bu algoritmayı anlayıp, program haline getirin.

(Bu vesileyle, bu algoritma işimizi görse de aslında epey hantal bir algoritma; ileride çok daha etkin metotlar göreceğiz kök bulma için)

Bonuslar

  1. Katsayıları verilen herhangi bir ikinci dereceden polinomun köklerini bulsun, bulamıyorsa da bir süre sonra farkına varıp, pes etsin (örneğin $3x^2-7x+4=0$ için aramaya 2'den başlasaydık, sonsuza kadar gidecektik).
  2. Tek (/dejenere) kökü olan 2. dereceden polinomun kökünü bulabilsin (örn. $x^2-4x+4=0$ denkleminin).
  3. Gerçek kökü olmayan polinomun kökünün olmadığını anlasın (/pes etsin) (örn. $x^2-4x+5=0$)

Bonusları çözerken de yukarıdaki algoritmayı geliştireceksiniz: if(b^2-4*a*c == 0) => "tek kök var", if(b^2-4*a*c < 0) => "gerçek kök yok" gibisinden cinlikler yapmaya izin yok. ;)

Ödev Kuralları

(Değerlendirmenin matematiksel detayları dersin sayfasında bilahare (birkaç güne) açıklanacaktır)