25 Nisan 2013 Perşembe

Pisagor Teoremi - Algoritma


Dim Genişlik As Double
Dim Yükseklik As Double
Dim Birim As Double
Dim Hipotenüs As Double

Birim = 1
Hipotenüs = 5

Genişlik = 0
Do
    Genişlik = Genişlik + Birim
    Yükseklik = 0
    Do
        Yükseklik = Yükseklik + Birim
        txtÖlçülen.Text = Genişlik & " " & Yükseklik
        If Genişlik ^ 2 + Yükseklik ^ 2 = Hipotenüs ^ 2 Then
            txtGUyanlar.Text = txtGUyanlar.Text & " " & CStr(Genişlik)
            txtYUyanlar.Text = txtYUyanlar.Text & " " & CStr(Yükseklik)
        End If
        DoEvents
    Loop Until Yükseklik >= Hipotenüs
Loop Until Genişlik >= Hipotenüs



Bir şeyin ölçümünü yapmak Pisagor teorimini kullanmıştım. Başlangıçta Hipotenüs değişkenine 5, Birim değişkenine 1 verdiğimizde algoritma gayet güzel işliyor. Genişlik'i 4, Yükseklik'i 3 buluyor – ve tam tersini. Birim'e 0.01 değerini de versek aynı sonuca ulaşacağını düşünebiliriz. Sadece daha çok sayıyı ölçeceğinden daha uzun sürecektir. Ama iş burada ilginçleşiyor. Garip bir şekilde Genişlik'in değeri virgülden sonra en fazla 2 haneli sayılar olması gerekirken “2,1234...” diye gidebiliyor. Bağıntıyı sağlayan 3,4 rakamlarını da bulamıyor. Birim'e 0.01 yerine 0.5 verirsek algoritma yine beklendiği gibi çalışıp doğru sonuçlara ulaşabiliyor.

Visual Basic'i yıllardır kullanırım. Daha önce Visual Basic'in mantık hatası yaptığını hatırlamıyorum.:-) Bu algoritma daha büyük bir yazılımın parçası olabilirdi. O yazılım bu algoritmadan dolayı yanlış hesap yapabilirdi. Gerektiği gibi çalışmamasına neden olabilirdi. Yazılımcıları sorunun nereden kaynaklandığını uzun süre fark edemeyebilirlerdi. Çünkü bu basit algoritma ilk bakışta gayet normal görünmektedir. Hatalı çalışacağına dair bir şey belli etmemektedir. Dolayısıyla sorunun aranacağı ilk yer olmayacaktır. :-)

Visual Basic yazılımcıları algoritmayı denemek isterlerse diye buraya aldım. Visual Basic'in bu mantık hatasını yapmasına neyin neden olduğu merak konusudur. Ne tür bir iç işleyişin sonucunda mantık hatası yapıyormuş gibi görünüyor! :-)

Hiç yorum yok:

Yorum Gönder