Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Liczby zespolone, mnożenie.

Ostatnio zmodyfikowano 2015-06-04 20:03
Autor Wiadomość
Pan_Gołąb
Temat założony przez niniejszego użytkownika
[c++] Liczby zespolone, mnożenie.
» 2015-06-04 15:18:39
Witam !

Programik do ćwiczenia klas w c++, problem z niedziałającym mnożeniem.


header klasy:

C/C++
#pragma once
#include <iostream>
using namespace std;

class CComplex
{
public:
    CComplex( double = 0, double = 0 ); //konstruktor z parametrami domyslnymi
    CComplex( const CComplex & c ); // konstruktor kopiujacy
   
public:
    CComplex & operator =( const CComplex & c ); //operator podstawienia
   
    friend istream & operator >>( istream & in, CComplex & c ); // operator wejscia
    friend ostream & operator <<( ostream & out, const CComplex & c ); // operator wyjscia
   
    friend CComplex operator +( const CComplex & c1, const CComplex & c2 );
    friend CComplex operator -( const CComplex & c1, const CComplex & c2 );
   
    friend CComplex operator *( const CComplex & c1, const CComplex & c2 );
    friend CComplex operator *( const CComplex & c, int x );
    friend CComplex operator *( int x, const CComplex & c );
   
    CComplex & operator +=( const CComplex & c );
    CComplex & operator *=( const CComplex & c );
    CComplex & operator *=( int x );
   
   
private:
    double m_re;
    double m_im;
   
public:
    double GetRe() const;
    double GetIm() const;
    void SetRe( double re );
    void SetIm( double im );
    void SetComplex( double re, double im );
    double modul() const;
   
};

inline void CComplex::SetComplex( double re, double im )
{
    SetRe( re );
    SetIm( im );
}

inline double CComplex::GetRe() const
{
    return m_re;
}
inline double CComplex::GetIm() const
{
    return m_im;
}

inline void CComplex::SetIm( double im )
{
    m_im = im;
}

inline void CComplex::SetRe( double re )
{
    m_re = re;
}

C/C++
#include "StdAfx.h"
#include "Complex.h"

CComplex::CComplex( double m_re, double m_im )
{
    SetComplex( m_re, m_im );
}

CComplex::CComplex( const CComplex & c )
{
    * this = c;
}

CComplex & CComplex::operator =( const CComplex & c )
{
    m_re = c.m_re;
    m_im = c.m_im;
    return * this;
}

istream & operator >>( istream & in, CComplex & c )
{
    in >> c.m_re;
    in >> c.m_im;
    return in;
}
ostream & operator <<( ostream & out, const CComplex & c )
{
    out << '(';
    out << c.GetRe();
    out << ',';
    out << c.GetIm();
    out << ')';
    return out;
}

CComplex operator +( const CComplex & c1, const CComplex & c2 )
{
    CComplex res( c1 );
    res += c2;
    return res;
}

CComplex operator *( const CComplex & c1, const CComplex & c2 )
{
    CComplex c;
    c *= c2;
    return c;
   
    //return 0;
}

CComplex & CComplex::operator +=( const CComplex & c )
{
    m_re += c.m_re;
    m_im += c.m_im;
    return * this;
}

CComplex operator *( const CComplex & c, int x )
{
    CComplex res;
    res *= x;
    return res;
    // return 0;
}

CComplex operator *( int x, const CComplex & c )
{
    return c * x;
   
}



CComplex & CComplex::operator *=( int x )
{
    m_re *= x;
    m_im *= x;
    return * this;
}
CComplex & CComplex::operator *=( const CComplex & c )
{
    m_re = m_re * c.m_re - m_im * c.m_im;
    m_im = m_re * c.m_im + m_im * c.m_re;
    return * this;
   
   
}

/*double modul() const
{
return 0;
}
*/

main:

C/C++
// zespolone.cpp: Określa punkt wejścia dla aplikacji konsoli.
//

#include "stdafx.h"
#include "Complex.h"


int _tmain( int argc, _TCHAR * argv[] )
{
   
    //testy
   
    CComplex c1;
    CComplex c2( 5, 6 );
    CComplex c3( c2 );
    CComplex c4 = c2;
   
    cout << "podaj liczbe zespolona (re, im): ";
    cin >> c1;
   
    cout << "z1 = " << c1 << endl;
    cout << "z2 = " << c2 << endl;
    cout << "z3 = " << c3 << endl;
    cout << "z4 = " << c4 << endl;
   
    cout << "\n\n";
   
    cout << "z5 = " << c1 * c2 << endl;
   
    cout << "\n\n";
   
   
    return 0;
}


Jakieś pomysły ? Jakie błędy ?
P-133164
Monika90
» 2015-06-04 15:32:29
C/C++
CComplex operator *( const CComplex & c1, const CComplex & c2 )
{
    CComplex c;
    c *= c2;
    return c;
   
    //return 0;
}
c powinno być kopią c1, a nie jest.
P-133165
Pan_Gołąb
Temat założony przez niniejszego użytkownika
» 2015-06-04 15:46:29
dziękuje Pani Moniko, działa choć nie wiem czy wynik jest poprawny (wzór na mnożenie l. zesp.) Jak zdefiniować moduł liczby zespolonej.. Jako tablicę ?
P-133167
Monika90
» 2015-06-04 15:59:42
C/C++
CComplex & CComplex::operator *=( const CComplex & c )
{
    m_re = m_re * c.m_re - m_im * c.m_im;
    m_im = m_re * c.m_im + m_im * c.m_re;
    return * this;
   
   
}

Wzór masz dobry, ale źle go używasz, najpierw modyfikujesz składową m_re, a potem używasz tej zmodyfikowanej zamiast oryginału przy obliczaniu m_im. Powinieneś utworzyć tymczasową kopię m_re.
P-133169
Kaikso
» 2015-06-04 17:42:08
Można też użyć typów wbudowanych
double imaginary
 i
double complex
:
http://en.cppreference.com/w/c​/language​/arithmetic_types#Imaginary_floating_types
P-133177
Monika90
» 2015-06-04 18:11:54
Ale tych typów nie ma w C++.
P-133180
Kaikso
» 2015-06-04 20:03:26
Tą zdefiniowane w bibliotece standardowej C++11
#include <complex>
 - http://www.cplusplus.com​/reference/complex/
P-133186
« 1 »
  Strona 1 z 1