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

Kompleks sayılar bir gerçel ve bir sanal kısımdan oluşan sayılardır. Sanal sayı gerçek dünyada karşılığı olmayan ancak matematiksel ifadelerde sıklıkla karşımıza çıkan bir sayıdır. Sanal sayılar bir gerçel sayı ile i(sqrt(-1)) sayısının çarpımı ile elde edilir. Burada sqrt(-1) gerçek dünyada var olmayan bir sayıdır ve i veya j harfi ile gösterilir. Kompleks sayılarla işlem yapmak gerçel sayılardan biraz farklıdır. Elimizde a+ib ve c+id şeklinde iki kompleks sayı olsun;
Toplama: Gerçel kısımlar kendi aralarında,sanal kısımlar kendi aralarında toplanır.
Çıkarma: Gerçel kısımdan gerçel kısım,sanal kısımdan sanal kısım çıkarılır.


Çarpma: (a+ib)(c+id) işlemi yapılacak olursa a.c+a.id+ib.c+ib.id=ac-bd+i(ad+bc) elde edilir.
Bölme: Bölme işlemi kompleks sayılar üzerinde doğrudan yapılamaz.Bölme işlemi yapabilmek için bölenin gerçel bir sayı olması gereklidir.Bunun için önce bölen ve bölünen bir kompleks sayı ile çarpılarak genişletilir.Çarpılan sayı böleni gerçel sayı yapacak bir kompleks sayı olmalıdır.Bu sayıya eşlenik adı verilir.c+id sayısının eşleniği c-id sayısıdır.Görüleceği üzere sayının kendisi ile
eşleniğini çarparsak, (c+id)(c-id)=c.c-c.id+c.id+id.id=c.c-d.d (gerçel) sayısı elde edilir. Şimdi kodlamaya geçelim. C++ üzerinde sanal sayılar tanımlı olmadığından kendi sınıfımızı oluşturmak zorundayız. Oluşturduğumuz bu sınıf tipi ile tanımladığımız her değişkenin bir gerçel ve bir de sanal kısmı olmalıdır. Önce sınıfımızı tanımlayalım;

class cfloat {
      public:
             float reel,sanal;
             cfloat() {
                      reel=0;
                      sanal=0; }
              cfloat(float,float);
              cfloat operator+(cfloat);
              cfloat operator-(cfloat);
              cfloat operator+=(cfloat);
              cfloat operator*(cfloat);
              cfloat operator/(cfloat);
              };
cfloat sınıfımızı oluşturduktan sonra main() içerisinde cfloat a; dediğmiz zaman a.reel ve a.sanal adında 2 float(ondalıklı) değişkene sahip olacağız. Kod içerisinde yeşil renkte gördüğünüz kısım işlemimizin en önemli noktası. Operator Overload diye isimlendirilen bir aşırı yükleme işlemi. Yani dediğimiz üzere kompleks sayılarda işlem yapmak gerçel sayılar gibi değil bu yüzden gerçel sayılarda kullandığımız operatörleri(+,-,*,/) yukarıda yazdığımız kurallara göre uygulamalıyız. cfloat operator+(cfloat); tanımını yaparak programa 2 tane cfloat türünde değiken geldiğinde + işaretinin yeni anlamını tanımlıyoruz. Bu tanımları inceleyecek olursak,

cfloat cfloat::operator+(cfloat sayi) {
       cfloat sonuc;
       sonuc.reel=reel+sayi.reel;
       sonuc.sanal=sanal+sayi.sanal;
       return sonuc; }
cfloat cfloat::operator-(cfloat sayi) {
       cfloat sonuc;  
       sonuc.reel=reel-sayi.reel; 
       sonuc.sanal=sanal-sayi.sanal;
       return sonuc; }
cfloat cfloat::operator+=(cfloat sayi) {
       reel=reel+sayi.reel;
       sanal=sanal+sayi.sanal;
       return *this;  }

cfloat cfloat::operator*(cfloat sayi) {
       cfloat sonuc;
       sonuc.reel=reel*sayi.reel-sanal*sayi.sanal;
       sonuc.sanal=reel*sayi.sanal+sanal*sayi.reel;
       return sonuc; }
cfloat cfloat::operator/(cfloat sayi) {
       cfloat sonuc;
       float reelsayi=sayi.reel*sayi.reel+sayi.sanal*sayi.sanal;
       sonuc.reel=(reel*sayi.reel-sanal*(-1*sayi.sanal))/reelsayi;
       sonuc.sanal=(reel*(-1*sayi.sanal)+sanal*sayi.reel)/reelsayi;
       return sonuc; }
Kodlar incelenecek olursa her bir operator için cfloat(operator)cfloat değişkenleri ile kullanıldığında hesaplaması gereken değerler tanımlanmıştır. Dört işleme ek olarak kompleks sayılarda bir += işlemide tanımlanmıştır. Bu işlem ile gerçel sayılarda kullandığımız += işlemi sanal sayılarda da uygulanabilir hale getirilmiştir (int a=a+5 ifadesi int a+=5 ifadesine eşittir). Kod içerisinde kırmızı ile yazdığım kısım diğer overload işlemlerinden biraz farklı görünebilir ancak return *this ifadesi burada = anlamı yerine geçerek işlemin sonucundaki iki değerin çağrıldığı iki değere atandığını(yani atandığı değeri) döndürür. Bu işlemlere ek olarak bir karmaşık sayılarda genlik bulma hesabı da yapalım. Genlik, koordinat ekseninde x-eksenini gerçel sayılar,y-eksenini sanal sayılar diye düşünürsek a+ib sayısı için (a,b) noktasının orijine olan uzaklığıdır. Bu da x=sqrt(a.a+b.b) (Pisagor Teoremi) orijine olan uzaklıktır ve gerçel bir pozitif sayıdır.

float cabs(cfloat a) {
       return sqrt(a.reel*a.reel+a.sanal*a.sanal); }
Son olarak yazımızı bir örnekle bitirelim. main() içerisine aşağıdaki kodları yazarsak programın ekran çıktısı aşağıdaki gibi olacaktır.

cfloat a(3,4);
cfloat b(3,-4);
cfloat c(1,1);
cfloat d;
d=a*b/c;

printf("Sonuc: %2.1f+%2.1fi\nABS: %2.4f\n",d.reel, d.sanal, cabs(d));
  • Sonuc: 12.5+-12.5i
  • ABS: 17.6777

1 yorum:

Görüntü işleme ile ilgili yeni yazıları ve bu sitede yer alan yazıların güncellenmiş sürümlerini www.imlab.io veya cescript.github.io adreslerinden takip edebilirsiniz.

X