2010-12-03 47 views
6

C++'da bir ödevim var ve başlamakta sorun yaşıyorum. Amaç, karmaşık sayılar için aşağıdaki aşırı yüklenen operatörleri kullanan bir sınıfı tasarlamaktır: >>C++ karmaşık sayı işlemleri için operatör aşırı yükleme

Sorum, bunun sözdizimi hakkında değil, mantıkla ilgili. Biraz beyin fırtınası yapabilirim.

giriş Örnek:
2,5 -2,2
1,0 1,0

çıkış örneği:
A = (2.5) + (-2.2) i
B = (1.0) + (1.0) i

A + B = (3.5) + (-1.2) i
A - B = ..............
A * B = ........ ......
A/B = ..............

Peki bunu nasıl başlarım? "Kompleks" sınıfı bu operatörleri aşırı yükler, yani bu operatörleri sadece sınıftaki (yani kamu fonksiyonlarının içinde) kullanabileceğim anlamına mı geliyor? Öyleyse bunu böyle yapmak ister miydim? Yoksa müşteri/sürücü kodumda yapmak ister miydim?

İkincisi, her satırın ikinci değerine i ekliyor mu? Bu çok kolay görünüyor. Herhangi bir yön çok takdir edilecektir. (Sadece kayıt için, benim için ödevimi yapmak için kimseyi aramıyorum ... sadece bazı girdiler kullanabilirsin)

cevap

7

Bana göre, buradaki nokta, sınıfın aşırı yüklenmesini göstermektir, bu yüzden sanırım fikir, gerçek sayı ve hayali sayı hakkında bilgi barındıran bir sınıf Kompleksi oluşturmanızdır (yani, onun hayali olduğu anlamına gelir). Operatördeki karmaşık sayılar arasındaki çeşitli işlemleri kendiniz yapın.

Bunu yaptıktan sonra çalıştığını görüyorsanız (çeşitli işlemleri yapan ve sonuçları ekrana basan statik bir test yöntemi hazırlayın), daha sonra ayrıştırma girdisi başka bir görev olacağından, girdiyle çalışmak için bu sınıfı kullanma konusunda endişelenin. kendi içinde. Bazen problemleri daha küçük problemlere ayırmak, hem aynı anda hem de yapmaya çalışmaktan daha kolaydır.

Bu yardımcı olur umarım. İyi şanslar!

+0

O emin yapar, sayesinde, bir çok. Çok takdir edildi. –

2

Onlar değerlerin çiftleri gibi:

A = N1 + I1i 
B = N2 + I2i 


A + B = (N1 + I1i) + (N2 + I2i) 
     = N1 + I1i + N2 + I2i 
     = (N1 + N2) + (I1i + I2i) 
     = (N1 + N2) + (I1 + I2)i 
A - B = (N1 + I1i) - (N2 + I2i) 
     = N1 + I1i - N2 - I2i 
     = (N1 - N2) + (I1i - I2i) 
     = (N1 - N2) + (I1 - I2)i 

// N1, N2, I1, I2 are all just normal numbers. 
// You can multiply them like normal. You just have to keep track of the `i` 
// Also not that i = sqrt(-1) 
// Therefore i * i = sqrt(-1) * sqrt(-1) 
//     = sqrt(-1)^2 
//     = -1 
A * B = (N1 + I1i) * (N2 + I2i) 
     = (N1 * N2) + (N1 * I2i) + (I1i * N2) + (I1i * I2i) 
     = (N1 * N2) + (N1 * I2)i + (N2 * I1)i + (i * i * I1 * I2) 
     = (N1 * N2) + i((N1 * I2) + (N2 * I1)) + (-1 * I1 * I2) 

     // Simplest form 
     = ((N1 * N2) - (I1 * I2)) + ((N1 * I2) + (N2 * I1))i 


A/B = Repeat as above. 
2

Sen içeren bir sınıf olarak adlandırılan Kompleksi'ne tasarlamak gerekir en azından:

  • gerçek ve hayali bir kompleks nesne yapılandırılmasını sağlayan bir yapıcı bileşen değerleri Karmaşık (1, 5)

  • + operatörünü geçersiz kılar, böylece iki Karmaşık nesne ekleyebilir ve yeni bir Karmaşık nesneyi döndürerek ör.Kompleks (1, 5) + Kompleks (3, 7) Kompleksi (4, 12) diğer operatörler

Ama önce karmaşık sayılar arkasındaki temel matematik anlamamız gerekir için benzer

  • böylece Operatör aşırı yükleme yöntemlerini yazabilirsiniz.

    (örneğin Kompleks) bir sınıf tanımlayın karmaşık sayının gerçek ve sanal kısmına ilişkin verileri tutabilir:

  • 1

    bu görevi başarmak için yapmanız gereken bir kaç şey vardır.

    Aşırı ilgili operatör (örneğin):

    class Complex 
    { 
    public: 
        // other declarations here 
        Complex operator+ (const Complex& rhs) const; 
        // other stuff here 
    }; 
    

    aslında matematik işlemi gerçekleştirmek için (örneğin), ilgili operatörleri uygulanması:

    Complex Complex::operator+ (const Complex& rhs) const 
    { 
        Complex result = *this; 
        result.Real += rhs.Real; 
        result.Imaginary += rhs.Imaginary; 
        return result; 
    } 
    
    İlgili konular