C++ ile Karmaşık Sayılarda Dört İşlem

C++‘da “Operator Overloading” konusuna çalışırken karmaşık sayılarda toplama, çıkarma, çarpma ve bölme işlemlerini yapabilecek basit bir sınıf yazmıştım.

Toplama Metodu

kompleks kompleks::operator+(kompleks ikinci){
    kompleks sonuc;
    sonuc.a=a+ikinci.a;
    sonuc.b=b+ikinci.b;
    return sonuc;
}

Toplama işleminin sonucu sonuc değişkeninde saklanır. sonuc.a, toplamın reel, sonuc.b ise sanal kısmını ifade eder. sonuc.a‘yı bulmak için birinci sayının reel kısmı (a) ile ikinci sayının reel kısmı (ikinci.a) toplanır ve sonuc.a‘ya atanır. Aynı işlem sanal kısım için de geçerlidir.

Çıkarma Metodu

kompleks kompleks::operator-(kompleks ikinci){
    kompleks sonuc;

    sonuc.a=a-ikinci.a;
    sonuc.b=b-ikinci.b;

    return sonuc;
}

Aynı toplama işlemi gibidir. Tek fark, toplama yerine çıkarma işlemleri yapılır.

Çarpma Metodu

kompleks kompleks::operator*(kompleks ikinci){
    kompleks sonuc;

    sonuc.a=(a*ikinci.a)-(b*ikinci.b);
    sonuc.b=(a*ikinci.b)+(b*ikinci.a);

    return sonuc;
}

Çarpma işlemi yaparken birinci sayının reel ve sanal kısmı, ikinci sayının hem reel hem de sanal kısmıyla çarpılır. Yine sonuc değişkeniyle çarpım sonucu tutulur. sonuc.a çarpım sonucunun reel, sonuc.b ise sanal kısmını gösterir.

Bölme Metodu

kompleks kompleks::operator/(kompleks ikinci){
    kompleks sonuc;
    kompleks pay;
    float payda;

    pay.a=(a*ikinci.a)+(b*ikinci.b);
    pay.b=(a*(-ikinci.b))+(b*ikinci.a);

    payda=(ikinci.a*ikinci.a)+(ikinci.b*ikinci.b);

    sonuc.a=pay.a/payda;
    sonuc.b=pay.b/payda;

    return sonuc;
}

Bölme işleminde birinci ve ikinci karmaşık sayı, ikinci sayının (bölen) eşleniği ile çarpılır. Çarpma işleminin ardından ortaya payı karmaşık, paydası reel (float) olan bir sayı çıkar. paydaki karmaşık sayının reel kısmı pay.a, sanal kısmı pay.b ile gösterilir. paydadaki reel sayı ise payda ile gösterilir. Bu işlemi gösteren bir resim:

Karmaşık Sayılarda Bölme

Uygulamanın Tam Kodu:

#include <iostream>
using namespace std;

class kompleks{
private:
    double a;
    double b;
public:
    kompleks(){}
    kompleks(double x,double y);
    kompleks operator+(kompleks ikinci);
    kompleks operator-(kompleks ikinci);
    kompleks operator*(kompleks ikinci);
    kompleks operator/(kompleks ikinci);
    void goster();
};

kompleks::kompleks(double x, double y){
    a=x;
    b=y;
}
kompleks kompleks::operator+(kompleks ikinci){
    kompleks sonuc;
    sonuc.a=a+ikinci.a;
    sonuc.b=b+ikinci.b;
    return sonuc;
}

kompleks kompleks::operator-(kompleks ikinci){
    kompleks sonuc;
    sonuc.a=a-ikinci.a;
    sonuc.b=b-ikinci.b;
    return sonuc;
}

kompleks kompleks::operator*(kompleks ikinci){
    kompleks sonuc;
    sonuc.a=(a*ikinci.a)-(b*ikinci.b);
    sonuc.b=(a*ikinci.b)+(b*ikinci.a);
    return sonuc;
}

kompleks kompleks::operator/(kompleks ikinci){
    kompleks sonuc;
    kompleks pay;
    float payda;

    pay.a=(a*ikinci.a)+(b*ikinci.b); //reel

    pay.b=(a*(-ikinci.b))+(b*ikinci.a);

    payda=(ikinci.a*ikinci.a)+(ikinci.b*ikinci.b);

    sonuc.a=pay.a/payda;
    sonuc.b=pay.b/payda;

    return sonuc;
}

/*işlem sonuçlarını ekrana basan fonksiyon. Aslında ekrana yazdırma konusunda
sadece cout<<a; cout<<b; ile sonucu almak mümkün ama bu goster
fonksiyonunda 0 olan değerin ekrana yazılmaması sağlanıyor. Ör: 0+9i yerine
9i yazılması gibi. Biraz uzun ama ayrıntılı.*/

void kompleks::goster(){

    if(b>0){
        if(a>0) {
            cout<<a<<"+";
            cout<<b<<"i";

        }
        else if(a==0)
            cout<<b<<"i";

        else if(a<0){
            cout<<a<<"+";
            cout<<b<<"i";
            }
    }

    else if(b==0)
        cout<<a;

    else if(b<0){
        if(a>0){
            cout<<a;
            cout<<b<<"i";
        }

        else if(a==0)
            cout<<b<<"i";

        else if(a<0){
            cout<<a;
            cout<<b<<"i";
            }
    }

}

int main(){

// kullanıcıdan sayılar alınıyor

    double reel1, sanal1, reel2, sanal2;
    cout<<"Birinci karmasik sayinin reel kismi: ";
    cin>>reel1;
    cout<<"Birinci karmasik sayinin sanal kismi: ";
    cin>>sanal1;
    cout<<"Ikinci karmasik sayinin reel kismi: ";
    cin>>reel2;
    cout<<"Ikinci karmasik sayinin sanal kismi: ";
    cin>>sanal2;

//nesneler oluşturulup işleme sokuluyor

    kompleks sayi1(reel1,sanal1);
    kompleks sayi2(reel2,sanal2);
    kompleks toplam, fark, carpim, bolum;
    toplam = sayi1+sayi2;
    fark = sayi1-sayi2;
    carpim = sayi1*sayi2;
    bolum = sayi1/sayi2;

//ekrana yazdırma işlemleri

    cout<<"\nIki karmasik sayinin toplami: ";
    toplam.goster();
    cout<<"\nIki karmasik sayinin farki: ";
    fark.goster();
    cout<<"\nIki karmasik sayinin carpimi: ";
    carpim.goster();
    cout<<"\nIki karmasik sayinin bolumu: ";
    bolum.goster();

    return 0;
}
  • http://www.atasoyweb.net Hüseyin

    ‘Operator Overloading’ mi? Bunun mümkün olduğunu bilmiyordum…

  • .

    Sade ve başarılı bir anlatım.
    Güzel.İyi.

Yukarı